【问题标题】:sizeof(array) does not give the expected value in this strstr reimplementationsizeof(array) 在这个 strstr 重新实现中没有给出预期值
【发布时间】:2012-09-21 11:55:49
【问题描述】:

我有这个简单的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 有什么问题?我无法发现错误。

【问题讨论】:

    标签: c++ arrays pointers sizeof


    【解决方案1】:

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

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

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

    【讨论】:

    • “strstr”函数如何计算它的字符串长度?它使用 strlen 吗?
    • @Johnny Pauling:我不知道它内部到底是做什么的(可以查看C库的源码),但是搜索的时候不需要提前知道长度字符串。
    • strstr 只扫描到终止的 '\0' 字符(假设它没有找到任何东西)。
    【解决方案2】:

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

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

    您需要改用strlen(findme)

    【讨论】:

      【解决方案3】:

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

      阅读this great question and answer 了解有关数组的更多信息。

      【讨论】:

      • strstr 简单地扫描直到终止 '\0' 字符(假设它没有找到任何东西)。奇怪行为的原因是适用于 main 函数但不适用于 strstr2 的正常规则的例外。数组被隐式转换为指向它的第一个元素的指针,除非它被传递给 sizeof 运算符。您遇到了正常规则的例外情况。在 main 中 sizeof(arr) == 17,而在 strstr2 中 sizeof(arr) == 8(64 位指针的大小)。这是因为类型不同:在 main 中调用 sizeof(char[17]),在 strstr2 中调用 sizeof(char*)。
      【解决方案4】:

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

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

      【讨论】:

      • 仅仅从标题,我就知道 4/8 会在某个地方。不过,你似乎是第一个,所以 +1。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2012-08-31
        • 1970-01-01
        相关资源
        最近更新 更多