我正在理解 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/