strcmp混乱

时间:2012-05-30 15:25:31

标签: c++ string char strcmp

据我所知,标准strcmp函数看起来像这样:

int strcmp(const char* string1, const char* string2)
{
    while(*pString1++ == *pString2++)
    {
        if(*pString1 == 0) return 0;
    }
    return *pString1 - pString2;
}

我的问题是这不会增加传递给strcmp的指针吗?在下面的示例中,它似乎会丢弃指针并导致无效的事情发生。

const char* string1 = "blah";
const char* string2 = "blah";
const char* string3 = "blah";
if(strcmp(string1, string2) {doSomething();} 
// Won't this make string1 = "" because it incremented the pointer to the end?
else if (strcmp(string1, string3) {doSomethingElse();}

对不起,我只是感到困惑,因为看起来如果我将指针传递给strcmp,我不应该指望突然持有空字符串的指针。似乎strcmp应该采用const char * const。我完全误解了什么吗?

7 个答案:

答案 0 :(得分:8)

你的误解是这样的:参数是通过值(副本)传递的,但你似乎认为它们是通过引用传递的。

您可以通过将参数声明为strcmp作为参考来获得预期的行为,如下所示:

int strcmp(const char*& string1, const char*& string2)

答案 1 :(得分:4)

不,指针string1string2是函数的本地(通过值传递)。调用者看不到对它们所做的任何更改。

答案 2 :(得分:1)

指针本身是按值传递的,所以虽然它是指向某个东西的指针,但改变它确实只会改变本地声明。

为了能够从函数的内部范围修改指针本身,您需要一个指向char的指针。

答案 3 :(得分:1)

指针按值传递,strcmp使用您发送的指针的副本,因此不会触及原始指针。

答案 4 :(得分:0)

首先,strcmp的经典混淆实现是偶数 更简单:

int
strcmp(char const* s1, char const* s2)
{
    while ( *s1 ++ == *s2 ++ )
        ;
    return *s1 - *s2;
}

(我希望没有人会真正编写这样的代码 做法。)

至于你的实际问题:C ++(和C,因为这真的是C 问题)按值传递参数,因此strcmp得到的任何指针都是 复印件;它不可能修改调用中的任何指针 码。所有制作参数char const* const都意味着 strcmp无法修改其指针的本地副本。

答案 5 :(得分:0)

C ++将参数传递给“按值”的函数。请考虑以下代码:

void f(int i) { i = 7; }
...
    int j = 0;
    f(j);
    assert(j == 0);

变量j与变量i无关。实际上,i是函数f的本地。它使用j的副本进行初始化。对i的更改永远不会传达给j

现在考虑以下代码:

void f(char *i) { i = i + 1; }
...
    char *j = "Hello";
    f(j);
    assert(*j == 'H');

同样,i初始化为j的副本。对i的更改永远不会传回j

<小时/> 注意:可以强制参数“通过引用”进行初始化:

void f(int& i) { i = 7; }
...
   int j = 3;
   f(j);
   assert(j==7);

在这种情况下,不是使用j的副本初始化,i 绑定j。但这仅适用于声明中有&的情况。

答案 6 :(得分:0)

试试这个,你会发现它们是完全不同的指针。 你误解的原因是他们指向同一个区域

#include <iostream>

using namespace std;

int strcmp2(char const *s1, char const *s2)
{
    cout << "In strcmp" << endl;
    cout << &s1 << " " << &s2 << endl;
    cout << endl;
}

int main()
{
    char a[100];
    char b[100];

    cout << "In main function" << endl;
    cout << &a << " " << &b << endl;
    cout << endl;

    strcmp2(a, b);
}