我理解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表示两个字符串相等,显然不是这种情况。我在这里错过了什么?
P.S。我为标题中的转义字符道歉,但如果删除它,我无法显示iostream。虽然我发布了这个,但我会弄清楚如何在下次做到正确。 :)
答案 0 :(得分:6)
问题是p
指向字符串文字,因此您尝试使用cin >> p;
修改字符串文字会直接导致未定义的行为。
最可能发生的是编译器将字符串文字视为常量(因为您不应该修改它),因此(在编译时)确定strcmp
的结果应该是什么,并产生。你在运行时修改它的事实被忽略了,因为你不应该这样做。
答案 1 :(得分:3)
不幸的是,对于兼容性,许多编译器都支持这一点:
char *p = "no";
哪个应该无法编译并纠正一个是:
const char *p = "no";
如果你解决了这个问题(至少应该得到警告),你会发现以下编译错误会出现什么问题。
答案 2 :(得分:1)
p
指向const char
数组的第一个元素。尝试修改这些值(就像在cin >> p
中一样)会调用未定义的行为。