sizeof (массив) не дает ожидаемого значения в этом переопределении strstr

У меня так просто 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? Я не могу определить ошибку.

1

Решение

arr а такжеfindme внутри функции strstr2 являются указателями на char, а не массивы. sizeof возвращает размер этого указателя, который на вашей платформе равен 8. Вопреки распространенному заблуждению, массивы не указатели. Ты можешь использовать strlen вместо этого или передайте размер массивов функции с помощью другого аргумента.

Читать этот великий вопрос и ответ для получения дополнительной информации о массивах.

3

Другие решения

sizeof(arr) это размер указателя, а не размер массива.

Вы можете передать длину массива функции или использовать strlen если вы всегда передаете строку с нулевым символом в конце.

Замечания: sizeof(char) всегда один.

8

findme это не массив, это char *и вы на 64-битной машине так:

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

Вам нужно будет использовать strlen(findme) вместо.

4

В вашем примере «findme» — это не массив, а указатель. Вы, вероятно, в 64-битной системе, поэтому размер указателя равен 8.

Вы не можете использовать sizeof () для всех видов вопросов «каков размер». Если вы хотите размер C-строки, используйте strlen (). Или передайте длину в качестве дополнительного параметра, так как если вы примените sizeof () к фактическому массиву, вы получите лучший результат 🙂

3

Почему бы не использовать strlen? Я считаю, что sizeof (findme) может вернуть размер указатель, что будет 8 байтов на 64-битной машине.

2
По вопросам рекламы [email protected]