БлогNot. C++: как узнать номер символа в строке

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 [24402 просмотра]


теги: textprocessing c++ алгоритм

К этой статье пока нет комментариев, Ваш будет первым