【问题标题】:String Comparison in C strcmpC strcmp中的字符串比较
【发布时间】:2013-12-28 11:24:39
【问题描述】:

我将域名存储在 char 的二维数组中

char domainNames[2][4096]= {"www.yahoo.com","java.sun.com"};

并且我需要检查列表中是否存在存储在另一个数组(char data[4096];)中的给定域名,如果找到该域名,则将在char IP[2][4096]= {"87.248.122.122","192.9.162.55"};中找到的所有IP地址用“#”分隔数组char msg[4096];

我就是这样做的:

  for (i=0; i< 2;i++)
  {
    if(strcmp(domainNames[i], data)==0)
    {
      strcat(msg, IP[i]);
      strcat(msg, "#");
      found = true;
    }
  }

  if(!found)
    strcpy(msg,"IP not found");

  break;
}

问题是即使字符串确实存在,结果总是“找不到IP”。

【问题讨论】:

  • data怎么输入?
  • 您显示的代码包含三个},只有两个{break 退出了哪个循环?
  • 示例不完整,错误消息未记录或显示,示例不工作无法编译,投票关闭
  • 如果您从客户端读取数据,您确定数据中没有多余的字符,如空格或换行符。如果是这样,比较将失败。
  • @user3108337 在这里使用strcmp 没有任何问题。我的猜测是您的data 末尾有\n。我想像printf("data=[%s]\n", data); 这样的简单调试打印会让你看到问题(在正确的情况下,输出中的两个方括号必须在同一行并且没有空格)。

标签: c arrays string comparison multidimensional-array


【解决方案1】:

由于您遇到输入中留下换行符的问题,您可以对换行符应用一个简单的检查并删除它(如果存在):

size_t ln = strlen(data) - 1;
if ((ln > 0) && (data[ln] == '\n'))
    data[ln] = '\0';
for (i=0; i< 2;i++)
{
  if(strcmp(domainNames[i], data)==0)
  {
    strcat(msg, IP[i]);
    strcat(msg, "#");
    found = true;
  }

因为您的输入 (data) 来自外部来源,所以在对它进行任何操作之前彻底验证这一点可能对您很有帮助。创建一个新函数并将数据传递给它,验证您是否删除了换行符,确保没有空格字符,确保它以 ".com" 或其他任何内容结尾......来自外部源的任何内容都应验证为在使用它之前尽你最大的努力,不仅可以帮助调试,还可以避免攻击(有意或无意)。

另外,对你来说只是一个轻微的(可能的)优化,如果msg 在这个函数之前是空的,你总是可以只检查0 的长度并以这种方式删除额外的found 布尔值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多