在 C 中打印二维字符数组

Printing 2D char array in C

我有一个二维字符数组

char** words;//2D array where each slot holds a word.
char word [ MAX_WORD ]; 

我正在尝试做一件非常简单的事情。 我需要打印数组 所以我看到我正确分配了内存并删除了所有换行符。

这是我正在尝试做的事情

//print array
int k, j;
for (k = 0; k < MAX_WORD ; k++) {
    for (j = 0; j < NUMWORDS; j++) {
        printf("%s%s", words[k],words[j]);
    }
    printf("\n");
}

这就是我得到的

����������������=�������������������=�������������������=���  
Segmentation fault: 11

我没有任何警告或编译错误。我想我的问题可能是我试图打印出一个内存地址而不是实际的字符,或者我的 malloc 没有按照我的预期去做。

这是我用 C 编写的第一个程序,到目前为止,这种语言让我感到最不舒服。

这就是我为单词数组分配内存的方式

words = (char**) malloc(sizeof(char*)*NUMWORDS);

然后我用从文件输入中得到的单词填充它。我在获取输入时为每个单词 malloc,将每个单词存储在一个单词数组地址中,然后删除 \n。我把每个字都打印出来了,这样就可以了。

//print array
int k;
for (k = 0; k < MAX_WORD ; k++) {
    printf("%s", words[k]);
    printf("\n");
}

根据你的信息,这可能就是你想要的

char **words; 
char word[MAX_WORD]; // this is unnecessary
int k, j;

while (NOT_EOF) { // NOT_EOF is not c, fix this to work
    // allocate a column. remember, this might always fail.
    words[wordscount] = (char *)malloc(sizeof(char) * MAX_WORD);
    // get your word from a file
    fscanf(filestream, "%s", words[wordscount]);
    // increment wordscount 
    wordscount++;
}

// print all characters, one row each line (one string each line)
for (k = 0; k < wordscount ; k++) {
   for (j = 0; j < MAX_WORD; j++) {
      printf("%c", words[k][j]);
   }
   printf("\n");
}

类似的东西。

您为单词分配内存为

words = (char**) malloc(sizeof(char*)*NUMWORDS);

你所做的是为每个单词指针分配内存,但没有分配字符所在的地址。所以你可以通过一个循环来完成这个

for(int i=0; i<NUMWORDS; i++)
{
    words[i] = (char*)malloc(sizeof(char)*MAX_WORD);
}

你的打印段也有问题,这里的代码我已经试过了,可能是你想要的。

    char **words;
    words = (char**)malloc(sizeof(char*)*NUMWORDS);
    for(int i=0; i<NUMWORDS; i++)
    {
        words[i] = (char*)malloc(sizeof(char)*MAX_WORD);
    }
    strcpy(words[0], "Hello world");
    strcpy(words[1], "Hi how are you?");
    char word[MAX_WORD];
    int k, j;
    for (k = 0; k < NUMWORDS ; k++)
    {
        for (j = 0; words[k][j]!='[=11=]'; j++)
        {
            printf("%c", words[k][j]);
        }
        printf("\n");
    }

作为良好实践,您可以像

一样声明二维数组
 char words[NUMWORDS][MAX_WORD];

或者

char *words[NUMWORDS];

并通过循环为所有单词分配内存。因为你的 NUMWORDSMAX_WORD 是常数。