На этом шаге мы рассмотрим особенности создания такой функции.
Приведем текст функции 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.
На следующем шаге мы продолжим изучение этого вопроса.