拆分线并打印它会导致核心转储

时间:2014-02-04 22:03:03

标签: string fgets strtok

当我尝试从标准输入读取一行并将其拆分为单词时,在删除/ 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; 
}

2 个答案:

答案 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下定义良好( 定义此行为),是一种非标准的,非便携式的构造,可能会在其他平台上崩溃。