C++: как узнать номер символа в строке
Как известно, для определения позиции символа c
в заданной указателем строке s
можно использовать стандартную функцию strchr(s,c)
, которая вернёт указатель на найденное вхождение символа или пустой указатель NULL
, если ничего не найдено. Нетрудно реализовать подобную функцию и самостоятельно:
char *strchr (char *s, int c) { //Pointer to symbol c in string s or NULL if c not found in s while (*s) { if (*s==c) return s; s++; } return NULL; }
А вот для определения номера символа, под которым символ c
находится в строке s
(не забываем, что символы в строках C и C++ нумеруются с нуля)
готовой функции нет. Наверное, она и не нужна - можно, например, вычитать указатели на найденный стандартной функцией strchr
символ и на начало строки. Однако, при сложении-вычитании указателей можно как выйти за сегмент памяти (если используете старенькие DOS-эмуляторы), так и нажить другие трудноуловимые ошибки. Лучше написать собственную реализацию такой функции, назовём её strchrn
. Она вернёт номер найденного символа (начиная с нуля) или -1, если символ c
не встречается в строке s
.
int strchrn (char *s, int c) { //Number of symbol c in string s or -1 if c not found in s int n=-1; while (*s) { n++; if (*s==c) return n; s++; } return -1; }
Задачу нетрудно расширить - например, выяснить номер первого из символов строки t
, который встречается в строке s
. Функция будет называться strchrs
и использует предыдущую функцию:
int strchrs(char *s, char *t) { //Number of first symbol from t in s or -1, if no matches while (*t) { int r=strchrn(s,*t); if (r>-1) return r; t++; } return -1; }
Простейший тест всех трёх функций мог бы быть таким (дополнительно подключается стандартная библиотека ввода-вывода оператором #include <stdio.h>
):
void main () { char *s="Source string",*t="ring"; puts (strchr(s,t[0])); printf ("%d\n",strchrn(s,t[0])); printf ("%d\n",strchrs(s,t)); }
20.04.2013, 12:18 [24567 просмотров]