【问题标题】:Comparing chars in a character array with strcmp将字符数组中的字符与 strcmp 进行比较
【发布时间】:2010-02-07 06:10:28
【问题描述】:

我已将 xml 文件读入 char [] 并尝试将该数组中的每个元素与某些字符进行比较,例如“”。 char 数组“test”只是一个元素的数组,包含要比较的字符(我必须这样做,否则 strcmp 方法会给我一个关于将 char 转换为 cons char* 的错误)。但是,出了点问题,我无法弄清楚。这是我得到的:

知道发生了什么吗?

char test[1];   
for (int i=0; i<amountRead; ++i)
{
    test[0] = str[i];
    if( strcmp(test, "<") == 0)
        cout<<"They are equal"<<endl;
    else
    {
        cout<<test[0]<< " is being compare to: "<<str[i]<<" strcmp value= "<<strcmp(test, "<") <<endl;
    }

}

【问题讨论】:

  • 您应该理解charconst char* 之类的错误,并根据您的理解进行修复,而不是绕开它。此外,向我们展示你得到的输出对我们来说不是错误,我们不知道它实际上想说什么。 :) 最后,这是 C++!使用std::string,让您的生活更轻松。
  • 一次比较一个元素,不需要比较字符串。比较 char,'&lt;' == str[i]
  • 我会使用字符串类,但我正在读取一个可能没有空格的 xml 文件(即 asdfsafasdfsaf 所以我想最好的方法是逐个字符。无论如何,“'

标签: c++ compare chars


【解决方案1】:

strcmp() 期望它的两个参数都是以空字符结尾的字符串,而不是简单的字符。如果要比较字符是否相等,不需要调用函数,只需比较字符即可:

if (test[0] == '<') ...

【讨论】:

    【解决方案2】:

    您需要 0 终止您的测试字符串。

    char test[2];   
    for (int i=0; i<amountRead; ++i)
    {
        test[0] = str[i];
        test[1] = '\0'; //you could do this before the loop instead.
        ...
    

    但是,如果您总是打算一次比较一个字符,则根本不需要临时缓冲区。你可以这样做

    for (int i=0; i<amountRead; ++i)
    {
        if (str[i] == "<")
           cout<<"They are equal"<<endl;
        else
        {
            cout << str[i] << " is being compare to: <" << endl;
        }
    }
    

    【讨论】:

    • 糟糕,或者根本不使用strcmp。 :P 那会是黑客攻击。
    • 同意,if (str[i] == '&lt;' 比当前代码更有意义,但如果计划稍后比较更大的部分,strcmp 更有意义。
    • 既然可以使用strncmp,为什么还要复制?
    • 是的,现在使用 == 对我有用。我只是觉得应该有一种更有效的方式来读取和比较文本文件。在 java 中,我绝对可以做得更好,但这是我的第一个 c++ 文本解析程序。
    • @lsawpalmetto:是的,标准 C 字符串例程在解析时存在一个真正的缺陷,因为它们都希望传递以空值结尾的输入,但是在分段解析大字符串时这很尴尬.看看 strstr(),它比 strcmp 更好。
    【解决方案3】:

    strcmp 希望两个字符串都以 0 结尾。

    当你有非 0 终止的字符串时,使用strncmp:

    if( strncmp(test, "<", 1) == 0 )
    

    您可以确保两个字符串的长度至少为 N 个字符(其中 N 是第三个参数的值)。 strncmp 是您的心理工具包中的一个很好的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多