我有一个2D数组的字符
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
我没有任何警告或编译错误。我想我的问题可能是我试图打印出一个内存地址而不是实际的char,或者我的malloc没有按照我的预期去做。
这是我在C中的第一个程序,到目前为止,这种语言让我感到非常不舒服。
这就是我为单词数组
分配内存的方法words = (char**) malloc(sizeof(char*)*NUMWORDS);
然后我用文件输入中的单词填充它。当我得到输入时,我为每个单词malloc,将每个单词存储在单词数组地址,然后删除\ n。我打印出每个单词,这样就可以了。
答案 0 :(得分:1)
您将单词的内存分配为
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]!='\0'; j++)
{
printf("%c", words[k][j]);
}
printf("\n");
}
对于良好练习,您可以声明二维数组,如
char words[NUMWORDS][MAX_WORD];
或者
char *words[NUMWORDS];
通过循环为所有单词分配内存。由于您的NUMWORDS
和MAX_WORD
不变。
答案 1 :(得分:0)
根据您的信息,这可能就是您想要的
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");
}
类似的东西。
答案 2 :(得分:-1)
//print array
int k;
for (k = 0; k < MAX_WORD ; k++) {
printf("%s", words[k]);
printf("\n");
}