Проблема с strchr - PullRequest
       3

Проблема с strchr

1 голос
/ 12 декабря 2010

Я не могу понять, почему следующий бит кода C не работает:

int obtainStringLength(char* str, char c1, char c2) {
    char* firstOcurrence = strchr(str, c1);
    char* endOcurrence = strchr(str, c2);
    return 2+(endOcurrence - firstOcurrence) / sizeof(char*);
}

Идея состоит в том, чтобы найти, сколько символов находится между c1 и c2:

printf("%d\n", obtainStringLength("abc def ghi", 'a', 'i')); //should yield 11

К сожалению, это всегда печать 1. В чем проблема?Разве strchr не должен работать как C # string.IndexOf()?

Ответы [ 4 ]

6 голосов
/ 12 декабря 2010

Деление на sizeof(char*)?Это неверно - результатом вычитания двух указателей является числовое значение (ptrdiff_t), соответствующее количеству значений, а не указателю или разнице адресов.

Существует также ошибка при вычислениидлина.Так что последняя строка должна выглядеть так:

return 1 + (endOcurrence - firstOcurrence);
2 голосов
/ 12 декабря 2010

В вашем операторе возврата есть несколько проблем из-за непонимания арифметики с указателем.

Вычитание указателя уже делится на размер элемента, и char* в любом случае был неправильным типом.

И выследует добавить 1, а не 2.

1 голос
/ 12 декабря 2010

Поскольку каждый символ занимает ровно sizeof (char) байта; не sizeof (char*) байтов.

И sizeof (char) по определению 1, так что вы можете его опустить:

return 1 + (endOcurrence - firstOcurrence);

0 голосов
/ 12 декабря 2010

Нет, strchr () возвращает указатель (адрес) искомого символа или NULL, если символ не был найден.

Это очень отличается от IndexOf ().

...