我有一个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
没有任何警告或编译错误。我想我的问题可能是我试图打印出一个内存地址而不是实际的字符,或者我的malloc没有做我期望它做的事情。
这是我用C编写的第一个程序,到目前为止,这种语言让我感到最不舒服。
这就是我为words array
分配内存的方式words = (char**) malloc(sizeof(char*)*NUMWORDS);
然后用从文件输入中得到的单词填充它。我在获取输入时对每个单词进行malloc,将每个单词存储在单词数组地址中,然后删除n。我把每个单词都打印出来,所以它可以工作。
为单词分配内存
词= (char * *) malloc (sizeof (char *) * NUMWORDS);
你所做的是为每个单词指针分配内存,但没有分配字符所在的地址。你可以用loop
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]!=' '; j++)
{
printf("%c", words[k][j]);
}
printf("n");
}
为了更好的实践,你可以声明像
这样的二维数组 char words[NUMWORDS][MAX_WORD];
或
char *words[NUMWORDS];
并通过循环为所有单词分配内存。因为你的NUMWORDS
和MAX_WORD
是恒定的
从你的信息来看,可能这就是你想要的
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");
}
差不多。
//print array
int k;
for (k = 0; k < MAX_WORD ; k++) {
printf("%s", words[k]);
printf("n");
}