创建一个字符串数组并打印它

Creating an array of strings and printing it

设置一组以下乐器: 大提琴 吉他 小提琴 低音提琴 循环并删除元音。 我的尝试:

#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] != '[=10=]')
        {
            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就停止工作了

行:

aszMusicalInstruments[0] = "CELLO"

没有将字符串复制到您保留的内存中。相反,它正在更改指针以指向您程序中的常量字符串。

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

而不是

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

你需要:

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

或者更简单:

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

最后一种解决方案的优点是您不必担心字符串的长度。

点 1

  • 你不分配字符串,你复制它们,在malloc()ing之后,需要free() 稍后。

或者,

  • 你不需要 malloc() ,而是 strdup() 字符串文字,稍后需要 free()

或者,

  • 您不需要 malloc() 并将字符串文字分配给指针。不需要 free()

第 2 点:

根据您陈述的逻辑,if 需要一个计数器 else 部分。您需要输入

putchar(aszMusicalInstruments[iii][jjj]);

if检查的else条件下。

没必要为此做动态分配,只会让问题变得更复杂。

只需使用一个数组:

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

这是一个二维字符数组,而不是一维字符指针数组 (char *aszMusicalInstruments[] = { "CELLO", ...),因此您可以自由修改字符。