2013-12-21 34 views
-1

代码非常简单。我不明白为什么当我尝试打印出pointok2时,程序崩溃。也许我没有看到问题,因为我累了或什么。一点帮助,将不胜感激。为什么strtok不工作?

Tokmain将始终为格式“单词”。

scanf("%s",&tokmain); 
for(i=0;i<50;i++) { 
    if (tokmain[i]=='\n') { 
     tokmain[i]='\0'; 
     lettercount=i; 
     break; 
    } 
} 
pointok1=strtok(tokmain,delim); 
pointok2=strtok(NULL,delim); 

puts(pointok1); 
puts(pointok2);` 
+2

什么是'delim'的价值? – Hariprasad

+0

同意^,分隔符可能非常重要。 –

回答

1

scanf()在空间截断。因此,当您输入“单词”时,tokmain将只有“单词”。

尝试

scanf("%49[^\n]s",&tokmain); /*Notice the format string*/ 

for(i=0;i<50;i++) { 
    if (tokmain[i]=='\n') { 
     tokmain[i]='\0'; 
     lettercount=i; 
     break; 
    } 
} 
pointok1=strtok(tokmain,delim); 
pointok2=strtok(NULL,delim); 

puts(pointok1); 
puts(pointok2);` 
+2

使用'“%49 [^ \ n]”'可能更容易。使用长度有限的格式字符串很好。如果你测试了'scanf()'的返回值以确保它获得了一些数据,那么也会更令人放心。最后,由于'strtok()'如果不喜欢它,它可以返回'NULL',所以在试图通过'puts()'打印它们之前测试'pointok1'和'pointok2'为null可能是明智的,哪些对象为空指针(即,如果将空指针传递给'puts()'以及可能发生的任何事情(包括崩溃),则调用未定义的行为)。 –

+0

@JonathanLeffler:对,我编辑了格式字符串。 – Hariprasad

+0

谢谢你回复我发布的内容,但是我改变了我发布的这个内容。我用fgets和fgets改变了scanf似乎根本不起作用。当你想出它时,delim是一个空间。我还写了一个请检查你所建议的NULL,即使我总是有一个输入。你可能知道什么导致fgets不起作用? fgets(tokmain,50,stdin)这就是我在开始时要发布的内容,并用它替换换行符fgets。 – user3126084