【问题标题】:Why strtok isn't working?为什么 strtok 不起作用?
【发布时间】:2014-01-10 11:49:19
【问题描述】:

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

Tokmain 将始终采用“word word”格式。

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);`

【问题讨论】:

  • delim的值是多少?
  • 同意^,分隔符是什么很重要。

标签: c arrays string substring strtok


【解决方案1】:

scanf() 在空格处截断。所以tokmain在输入“word word”时只会有“word”。

试试

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);`

【讨论】:

  • 使用"%49[^\n]" 可能更容易。使用长度有限的格式字符串做得很好。如果您测试来自scanf() 的返回值以确保它得到一些数据,那也会更令人放心。最后,由于strtok() 可以返回NULL,如果它不喜欢它所得到的,那么在尝试通过puts() 打印它们之前测试pointok1pointok2 是否为空可能是明智的,这反对空指针(也就是说,如果将空指针传递给 puts() 并且任何事情都可能发生,包括崩溃,则会调用未定义的行为。
  • 感谢您回答我发布的内容,但我已经更改了我发布此内容的那一刻。我用 fgets 更改了 scanf,而 fgets 似乎根本不起作用。delim 是一个空间,正如你所想它出来了。我还按照您对 NULL 的建议写了一张支票,即使我总是有输入。您可能知道是什么导致 fgets 无法工作吗? fgets(tokmain,50,stdin) 这就是我要在开始时发布的内容,并用它替换换行符 fgets。
  • 是的,我想通了。这是一个剩余的字符,因为它位于开关盒中。使用 getchar();。一切正常。再次感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
相关资源
最近更新 更多