sizeof(array)在此strstr重新实现中未提供预期值

时间:2012-09-21 11:55:49

标签: c++ arrays pointers sizeof

我已经将这个简单的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)。并且null终止符实际存在于toBeFound数组中。 sizeof有什么问题?我无法发现错误。

5 个答案:

答案 0 :(得分:8)

sizeof(arr)是指针的大小,而不是数组的大小。

您可以将数组的长度传递给函数,或者如果您始终传递以null结尾的字符串,则使用strlen

注意:sizeof(char)始终是一个。

答案 1 :(得分:4)

findme不是一个数组,它是一个char *,而你是64位机器所以:

sizeof(findme) = 8
sizeof(char)   = 1

您需要改为使用strlen(findme)

答案 2 :(得分:3)

函数arr内的

findmestrstr2char的指针,而不是数组。 sizeof返回指针的大小,在您的平台上恰好是8。与一些常见的误解相反,数组不是指针。您可以使用strlen代替,或者通过另一个参数将数组的大小传递给函数。

阅读this great question and answer以获取有关数组的更多信息。

答案 3 :(得分:3)

在你的例子中,“findme”不是一个数组---它是一个指针。你可能在64位系统上,所以指针的大小是8。

你不能将sizeof()用于各种各样的“大小”的问题。如果您想要C字符串的大小,请使用strlen()。或者将长度作为附加参数传递,因为如果将sizeof()应用于实际数组,您将获得更好的结果: - )

答案 4 :(得分:2)

为什么不使用strlen?我相信(找到我)的大小可能会返回指针的大小,这在64位计算机上将是8个字节。