«Перевернуть» каждое четное слово, сохранив неизменным их порядок в строке - C (СИ)
Формулировка задачи:
Решение задачи: ««Перевернуть» каждое четное слово, сохранив неизменным их порядок в строке»
#include <stdio.h>
#include <string.h>
char * reverse(char * str) {
char * head = str, * tail = str + strlen(str) - 1, tmp;
while ( head < tail ) {
tmp = *head;
*head = *tail;
*tail = tmp;
++head;
--tail;
}
return str;
}
#define DELIM " \t\n"
int main(void) {
char buf[BUFSIZ], * p, cnt;
while ( printf("\nString: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' && printf("Result: ") )
for ( cnt = 0, p = strtok(buf, DELIM); p && ++cnt; p = strtok(NULL, DELIM) )
printf("%s ", ( cnt & 1 ) ? p : reverse(p));
return 0;
}
Объяснение кода листинга программы
В этом коде реализована функция переворота строк. Сначала определяется указатель на начало строки (head) и на конец строки (tail). Затем в цикле, пока head меньше tail, выполняется следующая операция: значения head и tail меняются местами с помощью временной переменной tmp. После этого head инкрементируется, а tail декрементируется. По завершении цикла, функция возвращает исходную строку. В функции main, буфер buf инициализируется символом новой строки '\n'. Затем пользователю предлагается ввести строку. После ввода строки и ее разбиения на слова с помощью функции strtok, каждое слово выводится на экран в обратном порядке (если слово нечетное) или в прямом порядке (если слово четное). С помощью макроса DELIM определяются разделители: пробел, табуляция и символ новой строки.