В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв - 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(). Код завершается, когда пользователь вводит пустую строку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д