C++ sizeof(array)未给出此strstr重新实现中的预期值
我把这个简单的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);
#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*)。