1

この簡単なstrstr作り直しを練習問題として持っていますが、理解できないエラーがあります

#include <iostream>
#include "windows.h"

using namespace std;

int strstr2(char *arr, char *findme)
{
    const int sizearr = sizeof(arr) / sizeof(char);
    const int sizefindme = sizeof(findme) / sizeof(char);

    int j=0;
    for(int i=0; i<sizearr; i++)
    {
        if(arr[i] == findme[j])
        {
            // Match
            if(j == sizefindme-1)
                return i;
            else
                j++;
        }
        else
        {
            j = 0;
        }
    }
    return -1;
}


int main (int argc, char **argv) 
{
    char arr[] = "I'd like 2% milk";
    char toBeFound[] = "like";

    int pos = strstr2(arr, toBeFound);
    Sleep(3000);
}

どういうわけかライン

const int sizefindme = sizeof(findme) / sizeof(char);

sizefindme = 8文字列の長さ"like"が実際には4(またはヌルターミネータの場合は5)であるときに戻ります。そして、ヌルターミネータは実際にはtoBeFound配列に存在します。何が問題なのsizeofですか?エラーを見つけることができません。

4

5 に答える 5

8

sizeof(arr)配列のサイズではなく、ポインターのサイズです。

配列の長さを関数にstrlen渡すか、常に null で終わる文字列を渡す場合に使用できます。

注:sizeof(char)は常に 1 です。

于 2012-09-21T11:58:20.127 に答える
4

findmeは配列ではなく、でchar *あり、64ビットマシンを使用しているため、次のようになります。

sizeof(findme) = 8
sizeof(文字) = 1

strlen(findme)代わりに使用する必要があります。

于 2012-09-21T11:58:33.983 に答える
3

arrfindme関数内のand˛は、配列ではなくstrstr2へのポインタです。そのポインターのサイズを返しています。これは、プラットフォームではたまたま 8 です。やや一般的な誤解に反して、配列ポインターではありません。代わりに使用するか、別の引数で配列のサイズを関数に渡すことができます。charsizeofstrlen

配列の詳細については、この素晴らしい質問と回答をお読みください。

于 2012-09-21T11:58:21.097 に答える
3

あなたの例では、「findme」は配列ではありません---ポインターです。おそらく 64 ビット システムを使用しているので、ポインタのサイズは 8 です。

すべての種類の「サイズは?」質問に sizeof() を使用することはできません。C 文字列のサイズが必要な場合は、strlen() を使用します。または、 sizeof() を実際の配列に適用すると、より良い結果が得られるため、長さを追加のパラメーターとして渡します:-)

于 2012-09-21T11:58:33.717 に答える
2

なぜstrlenを使わないのですか?sizeof(findme) はポインターのサイズを返す可能性があると思います。これは、64ビットマシンでは8バイトになります。

于 2012-09-21T11:58:42.220 に答える