为什么控制进入IF?

时间:2009-10-02 11:56:52

标签: c controls

          char *token = "gkjsdhvcxvcvbcbcv"            
          char c[90];  
          strcpy( c, token);
          c[sizeof(c)-1] = '\0';
          char *broken = strtok(c, " ");                 
          if ( broken != NULL)
          {  
            //Should not come here as there is no white space???
           }

5 个答案:

答案 0 :(得分:14)

您正在获取第一个标记,这是整个字符串。第二次调用将返回NULL,因为没有更多令牌:

char *token = "gkjsdhvcxvcvbcbcv"            
char c[90];  
strcpy( c, token);
c[sizeof(c)-1] = '\0';
char *broken = strtok(c, " ");                 
if ( broken != NULL) {  
    // Will come in here, broken == c.
}
broken = strtok(NULL, " ");                 
if ( broken != NULL) {  
    // Won't come in here.
}

答案 1 :(得分:3)

在没有分隔符的情况下,字符串本身是第一个标记。

如果您尝试打印broken,我认为您会看到这种情况。

如果您希望在字符串缺少特定字符时未执行某段代码,则应使用strstrstrchr进行测试。

答案 2 :(得分:3)

strtok将输入字符串分成由输入分隔符分割的较小字符串。由于没有空格,因此返回整个字符串。

答案 3 :(得分:3)

您是否正在尝试确定字符串中是否包含空格?

如果是这样,那么解决方案是使用strchr()而不是strtok()。 e.g。

if (strchr(c, ' ') == NULL) {
    // string has no spaces
} else {
    // string has at least one space
}

如果只想在字符串包含至少一个分隔符时对字符串进行标记,则需要同时使用strchr()和amp;的strtok():

char *broken = NULL;
if (strchr(c, ' ') != NULL)
    broken = strtok(c, " ");

答案 4 :(得分:0)

上述代码可能出错:

  • 至少不使用strncpy就是问 对于问题,最终
  • 是什么 sizeof(c)返回?我忘记了 那一刻,但我的猜测是1, 或90.(可能是90)

正如其他人所指出的那样,strtok()似乎行为正常。