【问题标题】:strcmp fails when comparing two words that are supposed to be the same比较两个应该相同的单词时,strcmp 失败
【发布时间】:2018-04-02 00:56:44
【问题描述】:

所以我有一个单词列表,我们称它们为

words = {"red", "blue", "yellow", "green", "orange"}

然后我有一个从stdin 读取的字符串,我使用以下代码解析该字符串

char *token; 
token = strtok(string," ");

然后我使用 for 循环将新标记与单词列表进行比较

strcmp(token,words[i]);

现在这仅在我的输入后至少有一个空格时才有效,例如,

"blue hello""blue ",将评估匹配的单词,因为令牌将等于 "blue",但如果我的输入只是 "blue",则令牌是 "",我无法比较两者。

现在我的解决方法包括在字符串上运行isblank(),并且仅在字符串中有空格并且没有空格时才使用笔划,然后我只比较字符串本身,因为我知道它只有一个词使用以下

strcmp(string, words[I])

但这也会导致strcmp 失败并且无法将两个字符串比较在一起。我真的不知道还有什么地方可以解决这个问题,但如果有人可以在我的解释中看到我的错误,那么我将非常感谢得到纠正并展示我的错误。我很想发布更多代码,但这与学校有关,所以我不能在可能遇到麻烦的情况下发布更多代码。如果您想要更多解释,我很乐意解释更多。

【问题讨论】:

  • 不要用“然后我有一个从标准输入读取的字符串”来描述代码,而是发布代码。
  • @chux 正如我提到的,我不能发布太多代码,因为这是给学校的,我可以保证我没看错,因为这是我做过很多次的事情。
  • 请阅读tour 然后How to Ask 然后minimal reproducible example。然后将您的问题编辑为 mcve。
  • ... 或者使用你的调试器看看为什么 string != words[i]。这可能类似于在字符串中包含 \r \n 字符。
  • 我怀疑你的字符串中有换行符。

标签: c string compare


【解决方案1】:

如果您正在阅读 stdinfgets,那么很可能是换行 in 存储在您的 string 变量中。

您可以使用清除换行符

string[strcspn(string, "\n")] = 0;

fgets之后或者你可以在使用时将\n添加到分隔符列表中 strtok:

char *token; 
token = strtok(string, " \n");

strtok 在这种情况下将使用一个空格新行作为 分隔符,因此换行符不会出现在 token 中。

【讨论】:

  • 这就是我忘记的,非常感谢。一旦我考虑到\n,我的代码就开始工作得很好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多