В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв - 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. Если строка не пустая, то код начинает обработку:

  1. Создаётся новый элемент списка (wrd_t * current).
  2. В current->txt копируется текст слова.
  3. current->len устанавливается равным длине слова.
  4. В current->next записывается адрес следующего элемента списка (в данном случае — NULL, так как это последнее слово в строке).
  5. Если список пустой, то первый элемент списка (first) устанавливается равным current.
  6. В else, последний элемент списка (last) устанавливается равным current.
  7. Для каждого элемента списка выводится его текст (кроме последнего, так как его длина вычисляется позже).
  8. Выводится количество символов в каждом слове.
  9. Все элементы списка, кроме последнего, удаляются с помощью функции free(). Код завершается, когда пользователь вводит пустую строку.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы