c++ - Strcmp 未按预期运行,比较两个不相等的字符串时返回 0

标签 c++ cstring strcmp char-pointer

我正在理解 strcmp 函数的奇怪行为,将通过以下代码说明:

#include <iostream> 
#include <cstring>

using namespace std;

int main()
{
    char *p = "no";

    cout << p << endl;                      //Output: no
    cout << &p << endl;                     //Output: 0x28ac64
    cout << strlen(p) << endl;              //Output: 2
    cout << strcmp(p, "no") << endl;        //Output: 0

    cin >> p;                               //Input: bo

    cout << p << endl;                      //Output: bo
    cout << &p << endl;                     //Output: 0x28ac64
    cout << strlen(p) << endl;              //Output: 2

    cout << strcmp(p, "no") << endl;        //Output: 0
    return 0;
}

我无法理解的是为什么第15行的输出是0。0表示两个字符串相等,显然不是这样。我在这里错过了什么?

附言对于标题中的转义字符,我深表歉意,但如果删除它,我将无法显示 iostream。虽然我发布了这个,但我会弄清楚下次如何正确处理它。 :)

最佳答案

问题在于 p 指向字符串文字,因此您尝试使用 cin >> p; 修改字符串文字会直接导致未定义的行为。

最有可能发生的是编译器将字符串文字视为常量(因为您不应该修改它),因此(在编译时)确定 strcmp 的结果应该是,并生产那个。您在运行时修改它的事实将被忽略,因为无论如何您都不应该这样做。

关于c++ - Strcmp 未按预期运行,比较两个不相等的字符串时返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182492/

相关文章:

string - 如何创建我自己的 strcpy 函数?

c++ - Opencv MPEG7 描述符

c++ - 使用 operator new 进行内存分配并使用数据进行初始化

c++ - 关于C++对象序列化技术的建议

c - 如何比较c中的字符

c - 末尾带有垃圾字符的字符串数组

c++ - std::pair 的这个 const 引用是如何工作的?

c++ - MFC:std::string vs CString?

c - 在用户定义的函数内的 if() 语句中使用 strcmp 不会返回预期的输出

c - 在执行 strcmp 之前检查第一个字符有用吗?