0

私の知る限り、標準の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はconstchar*constを取る必要があるようです。私は完全に何かを誤解していますか?

4

7 に答える 7

8

あなたの誤解はこれです:引数は値(コピー)によって渡されますが、あなたはそれらが参照によって渡されると思っているようです。

strcmp次のように、パラメータを参照として宣言することで、期待される動作を得ることができます。

int strcmp(const char*& string1, const char*& string2)
于 2012-05-30T15:29:27.563 に答える
4

いいえ、ポインタstring1string2は関数に対してローカルです(値によって渡されます)。それらに加えられた変更は、呼び出し元には表示されません。

于 2012-05-30T15:27:58.783 に答える
1

ポインタ自体は値によって渡されるため、何かへのポインタですが、それを変更すると、ローカル宣言のみが変更されます。

関数の内部スコープからポインター自体を変更できるようにするには、charへのポインターへのポインターが必要です。

于 2012-05-30T15:28:11.707 に答える
1

ポインタは値で渡されます。strcmpは送信されたもののコピーを使用しているため、元のポインタには影響がありません。

于 2012-05-30T15:28:13.737 に答える
0

まず、の古典的な難読化された実装strcmpはさらに単純です。

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

(実際には、このようなコードを実際に作成する人がいないことを願っています。)

実際の質問については、C ++(およびC、これは実際にはCの質問であるため)は引数を値で渡すため、strcmp取得するポインターはすべてコピーです。呼び出し元のコードのポインタを変更することはできません。パラメータを作成するということは、ポインタのローカルコピーを変更できなかっchar const* constたことを意味 します。strcmp

于 2012-05-30T15:32:59.050 に答える
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&ただし、これは宣言にある場合にのみ適用されます。

于 2012-05-30T15:33:31.533 に答える
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);
}
于 2012-05-30T15:43:36.973 に答える