Шаг 27.
Microsoft Visual C++ 2010. Язык С/С++.
Создание и использование функций. Функция выделения подстроки из строки

    На этом шаге мы рассмотрим особенности создания такой функции.

    Приведем текст функции substr():

void substr(char v[], char s[], int n, int m)
{
	//n-й элемент находится R массиве на (п-1)-м месте
	int  i,j; 
	for(i=0,j=n-1;j<(n-1+m); i++, j++)
		v[i]=s[j];
	v[i]='\0';
}

    Эта функция с именем substr() ничего не возвращает (тип возвращаемого значения - void), а на свой вход получает строку символов char s[] (вспомним, что строка символов в языке С задается массивом символов), порядковый номер символа, с которого требуется выделить подстроку (int n), количество символов, которое требуется выделить (int m). А выходным параметром будет выделенная подстрока (char v[]).

    Алгоритм очень прост: в цикле участвуют две переменные: i и j. Цикл организован с помощью конструкции for. Здесь мы имеем пример того, что в первом (инициализирующем) выражении конструкции for может быть более одной переменной (или одного выражения). Такие переменные должны отделяться друг от друга запятой, которую в этом случае называют "операция Запятая". Соответственно и в третьем выражении циклической конструкции for, где наращиваются переменные цикла, имеется более одной переменной, которые также разделены запятой.

    Цикл начинается заданием значений переменных цикла: индекс i начинается с нуля, т. к. массив формируется с нулевого элемента. В нашем случае индекс i - это порядковый номер символов, заносимых в массив v[].

    Переменная j начинается с n-i, т. к. с ее помощью станут извлекаться элементы из массива s[] (т. е. из выделяемой строки). Первый элемент (в данном случае - символ) надо извлечь с места n-i, поскольку пользователь этой функции задает нумерацию в естественном порядке, т. е. считает, что строка начинается с первого, а не с нулевого символа.

    Тело for состоит всего из одного оператора v[i]=s[j]. В нем происходит пересылка символа из входной строки с места j в выходную строку на место i. И так будет продолжаться до тех пор, пока условие продолжения/окончания цикла не нарушится, пока значение переменной j, меняясь в третьем выражении от итерации к итерации, не станет равным (n-i+m), т. е. не изменится m раз. Это будет означать, что все необходимые символы из s[] пересланы в v[]. Остается только выполнить требование языка С в отношении признака конца строки символов: добавить в конец символ \0.

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг