使用strcmp比较字符数组中的字符

5
我已经将一个XML文件读入char []中,并尝试将该数组中的每个元素与特定字符进行比较,如“<”和“>”。char数组“test”只是一个元素的数组,包含要比较的字符(我必须这样做,否则strcmp方法会给我关于将char转换为cons char*的错误)。但是,有些问题出现了,我无法解决。这是我得到的:
<正在被比较:< strcmp值:44

您有什么想法发生了什么?

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;
    }

}

1
你应该理解 charconst char* 这样的错误,并根据自己的理解来修复它,而不是通过 hack 的方式绕过去。此外,向我们展示你得到的输出并不能解决错误,因为我们不知道它实际上应该说什么。:) 最后,这是 C++! 使用 std::string 让你的生活更轻松。 - GManNickG
4
逐个比较元素时,您不需要比较字符串。相反,应该比较字符。例如,使用 '<' == str[i] - Anycorn
我本可以使用字符串类,但我正在读取一个潜在没有空格的 xml 文件(即 <blah>asdfsaf</blah><weird>asdfsaf</weird>),所以我觉得最好的方法是逐个字符处理。无论如何,"'<' == str[i]" 最终起作用了(尽管我发誓我已经试过了)。谢谢。 - Isawpalmetto
3个回答

4

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

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;
    }
}

1
呃,要么不使用strcmp。 :P 那就是在黑客的基础上进行黑客攻击了。 - GManNickG
同意,if (str[i] == '<' 比当前代码更有意义,但如果计划稍后比较更大的部分,则 strcmp 更有意义。 - John Knoeller
为什么要复制呢,当你可以使用strncmp呢? - R Samuel Klatchko
是的,现在使用“==”对我来说是有效的。 我只是觉得应该有一种更有效的方法从文本文件中读取和比较。 在Java中,我肯定可以做得更好,但这是我在c++中的第一个文本解析程序。 - Isawpalmetto
@lsawpalmetto:是的,标准C字符串例程在解析时存在真正的缺陷,因为它们都期望传递以null结尾的输入,但是当分段解析大型字符串时,这很麻烦。看一下strstr(),对于你想要做的事情比strcmp更好。 - John Knoeller

1

strcmp函数要求两个字符串都以0结尾。

当你有非0结尾的字符串时,请使用strncmp

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

你需要确保这两个字符串的长度都至少为N个字符(其中N是第三个参数的值)。strncmp是一个很好的函数,可以加入到你的工具箱中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接