所以我做了这个程序,目的是从stdin中存储一个字符串,然后存储在一个字符串数组中。然后,我想打印所有存储在数组中的字符串,但顺序相反。
例子:
输入:
abc def hij klm nop
输出:
nop
klm
hij
def
abc
程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1001
int main(){
char buffer[MAXLEN];
char** strings;
int i = 0;
int j = MAXLEN;
strings = (char**)malloc(sizeof(char*)*MAXLEN);
while(scanf("%s",buffer) == 3)
{
strings[i]=(char*)malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(strings[i],buffer);
i++;
}
printf("%s",strings[0]);
}
好吧,我只是把第1个字符串,只是为了检查它是否打印任何字符串 问题是,如果在例子中键入,它打印的是: (null)
而不是单词,我想知道的是为什么它指向NULL而不是指向我给的字符串。
真的任何帮助将被感激。
成功转换的测试从 stdin
是不正确的。scanf()
返回的是转换次数,而不是字符数。你应该将返回值与 1
. 按照编码,循环测试立即失败,所以 strings[0]
没有被修改,代码就会出现未定义的行为,因为由 malloc
是未初始化的。这个数组的开头恰好包含一个空指针(因为它的第一个字节恰好是零),而 printf
印花 (null)
的空指针,虽然C标准不保证这一点,但有时也是一个有用的指示。
此外,你应该告诉 scanf()
关于要存储到目标数组中的字的最大长度。scanf("%1000s", buf)
.
你还应该限制你撕入指针数组的字数,并测试内存分配错误。
最后,你需要一个循环来按照输入的相反顺序输出字符串。
下面是一个修改后的版本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1001
int main() {
char buffer[MAXLEN];
int i, j;
char **strings = malloc(sizeof(char *) * MAXLEN);
if (strings == NULL)
return 1;
for (i = 0; i < MAXLEN && scanf("%1000s", buffer) == 1; i++) {
strings[i] = strdup(buffer);
if (strings[i] == NULL)
return 1;
}
for (j = i; j-- > 0;) {
printf("%s\n", strings[j]);
free(strings[j]);
}
free(strings);
return 0;
}