В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв - C (СИ)
Формулировка задачи:
Помогите решить задачу. С клавиатуры вводятся слова через пробел (любой длины и любого количества). на выходе получить следующее: в первой строке выписать все первые буквы всех слов, во второй строке - вторых букв в словах и т. д. Если буквы в слове закончились, то вставлять пробелы. Пример: вводим "Привет как дела", вывести:
п к д р а е и к л в а е т
Решение задачи: «В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct WRD {
char * txt;
int len;
struct WRD * next;
} wrd_t;
#define DELIM " \t\n"
int main(void) {
char buf[BUFSIZ];
while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
wrd_t * first, * current, * last;
int row, longest;
char * ptr;
first = NULL;
for ( ptr = strtok(buf, DELIM); ptr != NULL; ptr = strtok(NULL, DELIM) ) {
if ( ! ( current = malloc(sizeof(wrd_t)) ) ) {
perror("malloc");
exit(1);
}
current->txt = ptr;
current->len = strlen(ptr);
current->next = NULL;
if ( ! first )
first = current;
else
last->next = current;
last = current;
}
if ( ! first ) {
fprintf(stderr, "Empty string!\n");
continue;
}
longest = first->len;
for ( current = first->next; current != NULL; current = current->next )
if ( longest < current->len )
longest = current->len;
for ( row = 0; row < longest; ++row ) {
for ( current = first; current != NULL; current = current->next )
printf("%c", ( current->len <= row ) ? ' ' : current->txt[row]);
printf("\n");
}
while ( first ) {
last = first->next;
free(first);
first = last;
}
}
exit(0);
}
Объяснение кода листинга программы
В данном коде используется структура данных linked list для хранения слов из введённой строки. Каждое слово хранится в отдельном элементе списка. Код начинается с объявления структуры WRD, которая содержит указатель на текст слова (txt), длину этого текста (len) и указатель на следующее слово в списке (next). Затем, в main(), программа запрашивает у пользователя ввод строки и сохраняет её в буфере buf. Если строка не пустая, то код начинает обработку:
- Создаётся новый элемент списка (wrd_t * current).
- В current->txt копируется текст слова.
- current->len устанавливается равным длине слова.
- В current->next записывается адрес следующего элемента списка (в данном случае — NULL, так как это последнее слово в строке).
- Если список пустой, то первый элемент списка (first) устанавливается равным current.
- В else, последний элемент списка (last) устанавливается равным current.
- Для каждого элемента списка выводится его текст (кроме последнего, так как его длина вычисляется позже).
- Выводится количество символов в каждом слове.
- Все элементы списка, кроме последнего, удаляются с помощью функции free(). Код завершается, когда пользователь вводит пустую строку.