【问题标题】:Strings in C - print is the same strcmp says they are notC 中的字符串 - 打印是相同的 strcmp 说它们不是
【发布时间】:2014-12-04 21:02:04
【问题描述】:

大家好,我的服务器客户端项目有问题。我使用命令./server www.google.com 运行我的代理服务器,所以我有argv[1]=www.google.com。在此之后,我运行我的客户端并将值GET www.google.com 发送到服务器。现在从服务器端我使用strtok_r(buffer," ",&string1),所以我有buffer=GETstring1=www.google.com(我确定这些值是因为我打印它们)。问题是当我使用

if((strcmp(string1,argv[1]) == 0))
        {       
            printf(" SAME VALUES \n");
        }

我没有得到 printf,所以这两个变量没有相同的值。有什么想法吗?

【问题讨论】:

  • 检查原始数据(使用十六进制打印、调试器等)。可能还有一些前导/尾随空格或换行符。
  • 最有可能 string1 在末尾有空格。考虑修剪它,或者编写一个也停止在换行符处的自定义比较函数。
  • 按字节打印 string1 和 argv[1] 的值并检查差异
  • 显示一些重现问题的代码。
  • 在比较前添加printf("string1 = [[%s]], arg 1 = [[%s]]\n", string1, argv[1]);。方括号用于分隔字符串。如果右方括号靠近行首,则怀疑字符串中有 CR '\r' 字符。如果它们在下一行,则假定字符串中有 LF '\n' 个字符。

标签: c strtok strcmp


【解决方案1】:

strtok_r(buffer," ",&string1) 中,string1 不是找到的令牌的指针。您似乎在比较 string1 但函数返回值是令牌指针。所以代码应该是

char * tok = strtok_r(buffer," ",&string1);
if ((strcmp (tok,argv[1]) == 0))
    {       
        printf(" SAME VALUES \n");
    }

【讨论】:

  • 这是正确的。我可以建议您稍微扩展一下答案。也许,添加如下内容:char* p; char* tok; tok = strtok_r(buffer, " ", &p);...
  • @Brad S. 谢谢,但 OP 似乎以某种方式解决了他的问题。我在猜测,因为正确发布的唯一代码是有效的代码。
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 2010-10-22
  • 2011-02-11
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多