【问题标题】:Why is control going inside IF?为什么控制在 IF 内部?
【发布时间】:2009-10-02 11:56:51
【问题描述】:
          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???
           }

【问题讨论】:

  • 没有“解决方案”,@Ankit 因为没有问题。有一个问题,所以我们提供答案 :-) 控制在 IF 内部,因为这就是它的设计目的。

标签: c controls


【解决方案1】:

您将获得 first 标记,它是整个字符串。第二次调用将返回 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.
}

【讨论】:

    【解决方案2】:

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

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

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

    如果您只想在字符串包含至少一个分隔符的情况下对字符串进行标记,那么您需要同时使用 strchr() 和 strtok():

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

    【讨论】:

      【解决方案3】:

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

      如果你尝试打印broken,我想你会看到这种情况。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          上述代码可能出错的地方:

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

          正如其他人指出的那样, strtok() 似乎表现正常。

          【讨论】:

          • @Calyth:这里讨论了第一点:stackoverflow.com/questions/1508838/…。第二点:sizeof(c) 返回 90,其中 strlen 返回 char* 中的字符数(在其他线程中也讨论)
          • 是的,我看到了类似的帖子。我从不喜欢 c 是 char[] 语法的 sizeof(c) 。有人根据它写了一个数组长度的宏,如果你不小心传递了一个 char* ,它会变得非常混乱。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 1970-01-01
          • 2021-07-31
          • 1970-01-01
          • 2011-12-18
          • 2012-08-11
          相关资源
          最近更新 更多