2015-08-20 21 views
0

我有这样的代码在我的程序:分段故障用于fgets() - 用C

char* tok = NULL; 
char move[100]; 

if (fgets(move, 100, stdin) != NULL) 
{ 
    /* then split into tokens using strtok */ 
    tok = strtok(move, " "); 

    while (tok != NULL) 
    { 
     printf("Element: %s\n", tok); 
     tok = strtok(NULL, " "); 
    } 
} 

我已经尝试过,并与fgets后加入printf语句,和前一个被打印出来,但一前一后才不是。 我不明白为什么这与fgets调用导致分割失败。

如果有人有任何想法,我将非常感激。

感谢 科瑞

+2

难道你还可以使用适当的调试器旁边线前后分别增加打印?它是在系统库中的某处显示调用堆栈,还是仅在程序功能中的最后一个位置?什么平台/编译器? – Yirkha

+4

您可能在程序的其他地方有一个错误。它破坏了堆,并且'fgets()'中的错误只是一个副作用。 – Barmar

+0

嘿,我还是很新的C,所以我不知道该怎么做(我是一个Java程序员)。我在Ubuntu上使用GNU编译器,并使用C99。 – Fishingfon

回答

-2

的strtok的运行时函数是这样的

第一次调用strtok的你提供你想要来标记

char s[] = "this is a string"; 

在上面的字符串空间似乎是一个字符串是单词之间的良好的分隔符所以让我们使用:

char* p = strtok(s, " "); 

现在发生的事情是“S”进行搜索,直到空格字符被发现,则返回第一个令牌(“本”),并为了得到下一个标记和p指向该标记(串)

现在
p = strtok(NULL," "); 

p指向“是”

依此类推,直到没有更多的空间可以是:继续使用相同字符串NULL作为第一个参数,因为strtok的维持一个静态指针到以前通过字符串传递找到,那么最后一个字符串作为最后一个标记'string'返回。

更方便,你可以把它写这样的而不是打印出所有的记号:

for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " ")) 
{ 
    puts(p); 
} 

EDITED位置:

如果你想存储从strtok的返回值,你需要复制令牌到另一个缓冲区例如的strdup(P);因为原始字符串(由strtok内的静态指针指向)在迭代之间被修改以便返回令牌。

+0

这是真的,但OP已经正确使用了strtok –