Вы не прерываете цикл, даже когда целевой символ находится в строке. Таким образом, длина строки будет возвращена как индекс целевого символа.
Также лучше, когда функция возвращает объект типа size_t
вместо int
.
И объявление функции должно выглядеть так:
size_t char_index( const char *s, char c );
то есть указатель должен иметь квалификатор const
, потому что строка не изменяется внутри функции.
Примите во внимание, что стандарт C включает в себя почти аналогичную функцию strchr
, которая объявлена как
char * strchr( const char *s, char c );
Вот демонстрационная программа, которая показывает, как эта функция может быть реализована.
#include <stdio.h>
#define NOT_IN_STRING ( size_t )-1
size_t char_index( const char *s, char c )
{
size_t i = 0;
while ( s[i] != '\0' && s[i] != c ) ++i;
return s[i] != '\0' ? i : NOT_IN_STRING;
}
int main( void )
{
const char *s = "Betty";
for ( size_t i = 0; s[i] != '\0'; i++ )
{
printf( "%c: %zu\n", s[i], char_index( s, s[i] ) );
}
}
Вывод программы
B: 0
e: 1
t: 2
t: 2
y: 4
Показанная функция исключает завершающий ноль из поиска. Если вы хотите включить завершающий ноль в поиск, просто измените оператор возврата функции следующим образом
return s[i] == c ? i : NOT_IN_STRING;