0

我正在理解一个奇怪的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 表示两个字符串相等,显然不是这样。我在这里想念什么?

PS 我为标题中的转义字符道歉,但如果我删除它,我无法显示 iostream。虽然我发布了这个,但我会弄清楚下次如何让它正确。:)

4

3 回答 3

6

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

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

于 2013-03-03T04:43:36.387 回答
3

不幸的是,为了兼容性,许多编译器都支持这一点:

char *p = "no";

哪个应该无法编译和更正的是:

const char *p = "no";

如果你解决了这个问题(你至少应该得到警告),你会看到下面的编译错误有什么问题。

于 2013-03-03T04:45:20.880 回答
1

p指向数组的第一个元素const char。尝试修改这些值(就像您在 中所做的那样cin >> p)会调用未定义的行为。

于 2013-03-03T04:43:38.237 回答