Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sizeof(array)未给出此strstr重新实现中的预期值_C++_Arrays_Pointers_Sizeof - Fatal编程技术网

C++ sizeof(array)未给出此strstr重新实现中的预期值

C++ sizeof(array)未给出此strstr重新实现中的预期值,c++,arrays,pointers,sizeof,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);

我把这个简单的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);
}
返回
sizefindme=8
,而字符串
“like”
的长度实际上是4(或带有空终止符的5)。空终止符实际上存在于
toBeFound
数组中。
sizeof
有什么问题?我无法发现错误。

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

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

注意:
sizeof(char)
始终为一。

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

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


注意:
sizeof(char)
始终是一个。
arr
和函数
strstrstr2
中的˛
findme
是指向
char
的指针,而不是数组
sizeof
返回该指针的大小,在您的平台上正好是8。与一些常见的误解相反,数组不是指针。您可以使用
strlen
,也可以通过另一个参数将数组的大小传递给函数


有关数组的详细信息,请阅读。

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

有关数组的详细信息,请阅读。

在您的示例中,“findme”不是数组,而是指针。您可能在64位系统上,因此指针的大小为8

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

在您的示例中,“findme”不是数组,而是指针。您可能在64位系统上,因此指针的大小为8


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

findme
不是数组,而是字符*,并且您在64位机器上,因此:

sizeof(findme) = 8 sizeof(char) = 1 sizeof(findme)=8 sizeof(char)=1
您需要改用strlen(findme)。

findme
不是数组,而是字符*,您在64位机器上,因此:

sizeof(findme) = 8 sizeof(char) = 1 sizeof(findme)=8 sizeof(char)=1
您需要使用strlen(findme)。

为什么不使用strlen?我相信sizeof(findme)可能返回指针的大小,在64位机器上是8字节。

为什么不使用strlen?我相信sizeof(findme)可能会返回指针的大小,在64位机器上是8字节。

仅从标题中,我就知道4/8会在那里的某个地方。不过,你似乎是第一个,所以+1。就从标题来看,我知道4/8会在那里的某个地方。但是,您似乎是第一个,所以+1。strstrstr函数如何计算其字符串长度?它使用strlen吗?@Johnny Pauling:我不知道它在内部到底做什么(你可以检查C库的源代码),但是当你搜索字符串时,你不需要事先知道长度。strstrstr只是扫描到终止的“\0”字符(假设它没有找到任何东西)。strstrstr如何函数计算其字符串长度?它使用strlen吗?@Johnny Pauling:我不知道它在内部到底做了什么(你可以检查C库的源代码),但是当你搜索字符串时,你不需要事先知道长度。strstrstr只是扫描到终止的“\0”字符(假设它没有找到任何东西).strstr只需扫描到终止的“\0”字符(假设它没有找到任何内容)。这种奇怪行为的原因是正常规则的例外,该规则适用于main函数,但不适用于strstrstr2。数组被隐式转换为指向其第一个元素的指针,除非它被传递给sizeof运算符。你碰到了正常规则的例外。main中的sizeof(arr)==17,而strstrstr2中的sizeof(arr)==8(64位指针的大小)。这是因为类型不同:主要是调用sizeof(char[17]),在strstrstr2中是调用sizeof(char*)。strstrstr只是扫描到终止的“\0”字符(假设它没有找到任何内容)。这种奇怪行为的原因是正常规则的例外,该规则适用于main函数,但不适用于strstrstr2。数组被隐式转换为指向其第一个元素的指针,除非它被传递给sizeof运算符。你碰到了正常规则的例外。main中的sizeof(arr)==17,而strstrstr2中的sizeof(arr)==8(64位指针的大小)。这是因为类型不同:主要是调用sizeof(char[17]),而在strstrstr2中调用sizeof(char*)。