当我尝试从标准输入读取一行并将其拆分为单词时,在删除/ n字符后,我得到一个核心转储错误。谁有人解释我的原因?这样做的正确方法是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_LEN 50
#define MAX_PARTS 50
int main ()
{
char* token;
char *str;
char* arr[MAX_PARTS];
int i,j;
printf("Write a line: \n $:");
fgets(str, LINE_LEN, stdin);
str = strncpy(str, str, strlen(str)-1);
fflush(stdin);
i=0;
token = strtok(str, " ");
while( token != NULL )
{
arr[i] = token;
printf("%s",arr[i]);
i++;
token = strtok(NULL," ");
}
return 0;
}
答案 0 :(得分:1)
您正在通过while()循环最后一次传递时打印NULL指针。您可能需要反转printf()和strtok()调用,如下所示:
while( token != NULL )
{
arr[i] = token;
printf("%s",arr[i]); # Must come first to avoid printing a NULL on final loop
i++;
token = strtok(NULL," ");
}
答案 1 :(得分:1)
您正在阅读未分配的内存。
char *str;
这声明了一个指针str
,它指向哪里。 (事实上,它指向一个随机位置,但是&#34;无处可以阻止那些试图猜测未定义行为的人。)
fgets(str, LINE_LEN, stdin);
写入str
指向的位置,这是无处可见的(见上文)。这是未定义的行为。如果你的程序碰巧存在(而不是SEGFAULTing就在那里),那么从现在开始你就不能依赖它以任何理智的方式行事。
我们正在努力:
fflush(stdin);
请注意,C标准在输入流上调用时没有定义fflush()
的行为,即在Linux下定义良好( 定义此行为),是一种非标准的,非便携式的构造,可能会在其他平台上崩溃。