Дополнить слова пробелами, чтобы длина была равна длине самого длинного слова - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дополнить каждое слово предложения пробелами так , что бы длина была равна длине самого длинного слова. Распечатать получившееся предложение. Помогите пожалуйста с этой лабой. Сделать надо на языке Си.

Решение задачи: «Дополнить слова пробелами, чтобы длина была равна длине самого длинного слова»

textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
 
/* указатель на следующее слово в строке, или 0, если слова кончились */
 
char *nextWord(char *str);
 
/* 
*   возвращает одно слово из строки str в буфере wrd. динна wrd = len - 1
*   в случае неудачи вернёт NULL
*/
char *getWord(const char *str, char *wrd, size_t len);
 
 
/*
    Дополнить каждое слово предложения пробелами так , что бы длина была равна длине самого длинного слова. 
    Распечатать получившееся предложение.
*/
int main(void){
    char buf[BUFSIZ], wrd[BUFSIZ];
    char *pBuf, *pOut;
    size_t max_len, cur_len;
    
    printf("Put some string: ");
    fgets(buf, BUFSIZ, stdin);
    buf[strlen(buf) - 1] = '\0';
    
    max_len = 0;
    
    for ( pBuf = buf; pBuf != NULL; pBuf = nextWord(pBuf) ){
        getWord(pBuf, wrd, BUFSIZ);
        cur_len = strlen(wrd);
        if ( cur_len > max_len )
            max_len = cur_len;
    }
    
    if ( (pOut = (char*)malloc(max_len + 1)) == NULL ){
        printf("Memory error!\n");
        exit(1);
    }
    pOut[max_len] = '\0';
    
    for ( pBuf = buf; pBuf != NULL; pBuf = nextWord(pBuf) ){
        getWord(pBuf, wrd, BUFSIZ);
        memset(pOut, ' ', max_len);
        memcpy(pOut, wrd, strlen(wrd));
        printf("|%s|\n", pOut);
    }
    
    free(pOut);
    pOut = NULL;
        
    exit(0);
}
 
/* указатель на следующее слово в строке, или 0, если слова кончились */
 
char *nextWord(char *str){
 
        char *p;
 
        for ( p = str; *p != '\0' && !isspace(*p) && !ispunct(*p); p++ )
                ;
 
        if ( *p == '\0' )
                return NULL;
 
        while ( isspace(*p) || ispunct(*p) )
                p++;
 
        return ( *p == '\0' ) ? NULL : p;
}
 
/* 
*   возвращает одно слово из строки str в буфере wrd. динна wrd = len - 1
*   в случае неудачи вернёт NULL
*/
char *getWord(const char *str, char *wrd, size_t len){
 
    char *p;
    char *w;
 
    for ( p = (char *)str, w = wrd;  *p != '\0' && !isspace(*p) && !ispunct(*p) && --len > 0; p++, w++ )
        *w = *p;
    *w = '\0';
 
    return wrd;
}

Объяснение кода листинга программы

  1. Программа получает строку от пользователя и сохраняет её в буфере buf.
  2. Затем программа разбивает эту строку на слова и сохраняет их в отдельные буферы wrd.
  3. В цикле проходит по каждому слову и добавляет пробелы в начало и в конец слова, пока длина слова не станет равной длине самого длинного слова.
  4. Выводит получившееся предложение на экран.
  5. После этого программа выводит на экран самое длинное слово.

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


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

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

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