use*_*105 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;
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么第15行的输出为0. 0意味着两个字符串相等,显然不是这种情况.我在这里错过了什么?
PS我为标题中的转义字符道歉,但如果删除它,我无法显示iostream.虽然我发布了这个,但我会弄清楚如何在下次做到正确.:)
问题是p指向字符串文字,因此您尝试修改字符串文字cin >> p;会直接导致未定义的行为.
最可能发生的是编译器将字符串文字视为常量(因为你不应该修改它),因此(在编译时)确定结果strcmp应该是什么,并产生它.您在运行时修改它的事实将被忽略,因为您无论如何都不应该这样做.