【问题标题】:trouble with strcmp() in CC 中 strcmp() 的问题
【发布时间】:2013-10-17 06:04:15
【问题描述】:
char* mystr = calloc(25, sizeof(char));
fgets(mystr, 25, stdin); // I enter "6 7 *" in here, without the quotes

char* tok;
tok = strtok(mystr, " ");
while (tok != NULL) {
    if(strcmp(tok, "*") == 0)
        //It never meets this condition, but I don't understand why
    else
        //do something else here
    tok = strtok(NULL, " ");
}

问题是strcmp(tok, "*") 永远不会返回相等,即使tok 从原始字符串中读取星号。我不明白为什么它从来不满足这个条件。

【问题讨论】:

  • sizeof(char)1
  • 了解如何使用调试器(如gdb)。也许试试strncmp(tok, "*", 1)
  • 在调试器中逐行检查代码,看看strtok返回什么。
  • 不仅是sizeof(char) 1,最好不要不必要地重复charTYPE *ptr = calloc(N, sizeof *ptr)

标签: c strtok strcmp


【解决方案1】:

您的* 令牌可能还包含您为完成输入而键入的\n 字符。将单个字符与以下之一进行比较:

  if(tok[0] == '*')

  if(strncmp(tok, "*", 1) == 0)

或将\n 添加到您的分隔符列表中:

  tok = strtok(NULL, " \n");

【讨论】:

  • 我刚刚使用了您的确切程序,并且这两个更改都很好地修复了它。你不能向我们展示重要的东西。
【解决方案2】:

因为 fgets 将换行符嵌入到变量 mystr 中。这是抛弃比较。尝试从变量中删除“\n”。

【讨论】:

    【解决方案3】:

    strcmp() 比较两个字符串。您必须提供 * 作为带有终止字符 "*\n" 的字符串。

    if(strcmp(tok, "*\n") == 0)
    

    【讨论】:

      【解决方案4】:

      你的另一个输入。 strtok() 不是线程安全的。使用时要小心。如果您有多个线程(出于某种目的都调用 strtok()),请使用 strtok_r()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 2014-08-12
        相关资源
        最近更新 更多