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如果您总是传递一个以空值结尾的字符串,则使用。

注意:sizeof(char)总是一个。

于 2012-09-21T11:58:20.127 回答
4

findme不是数组,它是char *,并且您在 64 位机器上,所以:

sizeof(findme) = 8
大小(字符)= 1

您将需要strlen(findme)改用。

于 2012-09-21T11:58:33.983 回答
3

arr和˛findme函数内部strstr2是指向 的指针char,而不是数组。sizeof正在返回该指针的大小,在您的平台上恰好是 8。与有些常见的误解相反,数组不是指针。您可以strlen改用或通过另一个参数将数组的大小传递给函数。

阅读这个很棒的问题和答案,了解有关数组的更多信息。

于 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 回答