2015-04-23 65 views
1

设置以下乐器的数组: CELLO GUITAR VIOLIN DOUBLE BASS 循环并删除元音。 我尝试:创建一个字符串数组并打印它

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char *aszMusicalInstruments[4]; 
    aszMusicalInstruments[0] = malloc(6 * sizeof(char)); 
    aszMusicalInstruments[0] = "CELLO"; 
    aszMusicalInstruments[1] = malloc(7 * sizeof(char)); 
    aszMusicalInstruments[1] = "GUITAR"; 
    aszMusicalInstruments[2] = malloc(12 * sizeof(char)); 
    aszMusicalInstruments[2] = "DOUBLE BASS"; 
    aszMusicalInstruments[3] = malloc(7 * sizeof(char)); 
    aszMusicalInstruments[3] = "VIOlIN"; 
    int iii; 
    for (iii = 0; iii < 4; iii++) 
    { 
     int jjj = 0; 
     while (aszMusicalInstruments[iii][jjj] != '\0') 
     { 
      if (aszMusicalInstruments[iii][jjj] == 'A' || aszMusicalInstruments[iii][jjj] == 'E' || aszMusicalInstruments[iii][jjj] == 'I' || aszMusicalInstruments[iii][jjj] == 'O' || aszMusicalInstruments[iii][jjj] == 'U') 
      { 
       aszMusicalInstruments[iii][jjj] = '_'; 
      } 
      putchar(aszMusicalInstruments[iii][jjj]); 
      jjj++; 
     } 
    } 
    return 0; 
} 

但程序停止打印C.

+2

定义“停止工作”?看看你的代码,我想你有一个只读只读数据错误。您将'malloc(...)'存储在'Instruments [0]'中,并且在您使用strcpy(aszMusicalInstruments [0],“CELLO”)覆盖只读字符串'“CELLO”'' – Eregrith

+0

的地址后,而不是分配操作。 – GingerJack

+0

与您的问题无关,但标识符为'iii'和'jjj'使您的程序无法读取。 –

回答

2

没有必要对此进行动态整合,只是让问题更加复杂。

只需使用一个数组:

char aszMusicalInstruments[][20] = { 
    "CELLO", 
    "GUITAR", 
    "DOUBLE BASS", 
    "VIOLIN" 
}; 

这是字符的2D阵列,而不是字符指针的一维数组(char *aszMusicalInstruments[] = { "CELLO", ...),所以可以自由地修改的字符。

0

行后工作刚:

aszMusicalInstruments[0] = "CELLO" 

是不是复制串入你已经保留的内存。相反,它会将指针更改为指向程序中的常量字符串。

要将其复制到您刚刚预留的内存中,您应使用srtcpy函数。

+0

这是内存泄漏......正确,但在此处出现上下文 –

+0

您也可以使用'strdup(“CELLO”)'而不是malloc + strcpy – Eregrith

0

而不是

aszMusicalInstruments[0] = malloc(6 * sizeof(char)); 
aszMusicalInstruments[0] = "CELLO"; 

你需要:

aszMusicalInstruments[0] = malloc(6 * sizeof(char)); 
strcpy(aszMusicalInstruments[0], "CELLO"); 

或者更简单:

aszMusicalInstruments[0] = strdup("CELLO"); 

最后解决方案的好处是,你闯到大不必担心字符串的长度。

1

1点

  • 你不分配串,你复制他们,之后malloc() ING,需要free()后。

,或者

  • 你不malloc(),而不是strdup()字符串常量,需要free()后。

,或者

  • 你不malloc()并指定字符串文字的指针。不需要free()

点2:

根据你的陈述逻辑,在if需要一个计数器else一部分。你需要把

putchar(aszMusicalInstruments[iii][jjj]); 

if检查else条件下。

相关问题