Дополнить слова пробелами, чтобы длина была равна длине самого длинного слова - 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;
}
Объяснение кода листинга программы
- Программа получает строку от пользователя и сохраняет её в буфере buf.
- Затем программа разбивает эту строку на слова и сохраняет их в отдельные буферы wrd.
- В цикле проходит по каждому слову и добавляет пробелы в начало и в конец слова, пока длина слова не станет равной длине самого длинного слова.
- Выводит получившееся предложение на экран.
- После этого программа выводит на экран самое длинное слово.