Эта тема создана на основе вопроса на Stackoverflow -
C- How to find and change a single particular character in a string.
Этот вопрос может быть сведен к вопросу: как найти конкретный символ в строке. Если символ найден через указатель на него в строке, то, очевидно, его будет несложно заменить на другой символ.
Как известно имеется стандартная C-функция
strchr, объявленная в заголовочном файле
<string.h>, которая позволяет найти заданный символ. Но в общем случае задача усложняется, если нужно найти не первое вхождение символа в строку, а некоторое
n-ое его вхождение.
Напрашивается необходимость наличия отдельной функции, которая находит
n-ое вхождение заданного символа в строке. Логично будет, если функция будет определена на основе использования стандартной функции
strchr и будет соблюдать соглашения, принятые для этой стандартной функции.
Важно иметь в виду, что стандартная функция
strchr позволяет находить в строке символ завершающего нуля
'\0'.. Следовательно и новая определяемая функция также должна это делать, но только при условии, что ищется первое вхождения символа завершающего нуля
'\0'.
Ниже в демонстрационной программе показано, как такая C-функция может быть определена.
#include <stdio.h>
#include <string.h>
char * str_nth_chr( const char *s, char c, size_t n )
{
char *p = NULL;
if ( c != '\0' || n == 1 )
{
for ( ; n && ( p = strchr( s, c ) ) != NULL; --n ) s = p + 1;
}
return n == 0 ? p : NULL;
}
int main( void )
{
char *p;
char s1[] = "";
char s2[] = "Hello";
for ( size_t i = 1; ( p = str_nth_chr( s1, '\0', i ) ) != NULL; i++ )
{
printf( "%zu: %d\n", i, *p );
}
putchar( '\n' );
for ( size_t i = 1; ( p = str_nth_chr( s2, 'l', i ) ) != NULL; i++ )
{
printf( "%zu: %zu - %c\n", i, p - s2, *p );
}
putchar( '\n' );
}
Вывод программы на консоль:
1: 0
1: 2 - l
2: 3 - l
Фактически, когда значение параметра
n равно
1, то данная функция эквивалентна вызову функции
strchr.
В случае, когда
n равно
0, или заданное вхождение символа не найдено, то функция возвращает
NULL.