У меня так просто 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
? Я не могу определить ошибку.
arr
а такжеfindme
внутри функции strstr2
являются указателями на char
, а не массивы. sizeof
возвращает размер этого указателя, который на вашей платформе равен 8. Вопреки распространенному заблуждению, массивы не указатели. Ты можешь использовать strlen
вместо этого или передайте размер массивов функции с помощью другого аргумента.
Читать этот великий вопрос и ответ для получения дополнительной информации о массивах.
sizeof(arr)
это размер указателя, а не размер массива.
Вы можете передать длину массива функции или использовать strlen
если вы всегда передаете строку с нулевым символом в конце.
Замечания: sizeof(char)
всегда один.
findme
это не массив, это char *
и вы на 64-битной машине так:
sizeof (findme) = 8 sizeof (char) = 1
Вам нужно будет использовать strlen(findme)
вместо.
В вашем примере «findme» — это не массив, а указатель. Вы, вероятно, в 64-битной системе, поэтому размер указателя равен 8.
Вы не можете использовать sizeof () для всех видов вопросов «каков размер». Если вы хотите размер C-строки, используйте strlen (). Или передайте длину в качестве дополнительного параметра, так как если вы примените sizeof () к фактическому массиву, вы получите лучший результат 🙂
Почему бы не использовать strlen? Я считаю, что sizeof (findme) может вернуть размер указатель, что будет 8 байтов на 64-битной машине.