Разделить массив на слова и вывести на экран самое длинное - C (СИ)
Формулировка задачи:
Здравствуйте.
Нужно написать программу.
1) в которую посимвольно (enter не прерывает ввод, символ прерывания ввода задаётся отдельно) вводишь некий текст.
2) Текст разбивается на слова (концом слова считается пробел + нужно отдельно для последнего слова дописать функцию так как у него нет пробела в конце).
3) Выбирается самое длинное слово и выводится на экран.
Я завис на этом
#include <stdio.h>
#include <stdlib.h>
// функция для разделения массива на слова//
void split (char *a)
{
int i=0;
int w=-1;
while(a[i]){
if(a[i]=' '){
if(w>=0){
printf(a,w,i-w);
}
w=-1;
}
i++;
}
//так и не понял как для последнего слова дописать//
}
int main (){
char a[100];
gets(a);
//посимвольный ввод через getchar и while выдавал ошибку//
puts(a);
split(a);
scanf(%s, a);
getchar();
}Решение задачи: «Разделить массив на слова и вывести на экран самое длинное»
textual
Листинг программы
/* ANSI C 99 */
#include <stdio.h>
#include <string.h>
#include <glib.h>
/* Принимает указатели на строку и на символы-разделители,
* возвращает указатель на первое слово максимальной длины.
* После использования указатель отправить в g_free() */
char * longest_word(const char * str, const char * delim) {
char ** words = g_strsplit_set(str, delim, -1);
char * choose_longest(char ** allWords) {
char * current = *allWords;
if ( ! current )
return NULL;
char * next = choose_longest(allWords + 1);
return ( next && strlen(next) > strlen(current) ) ? next : current;
}
char * longest = g_strdup(choose_longest(words));
g_strfreev(words);
return longest;
}
#define DELIM " \t\n"
int main(void) {
char buf[BUFSIZ];
GSList * strings = NULL;
printf("Enter some strings and empty one when done...\n");
while ( printf("> ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
strings = g_slist_append(strings, g_strdup(buf));
char * longestWord = NULL;
void test_longest(char * str, char ** longest) {
char * current = longest_word(str, DELIM);
if ( *longest == NULL )
*longest = current;
else if ( strlen(current) > strlen(*longest) ) {
g_free(*longest);
*longest = current;
}
else
g_free(current);
}
g_slist_foreach(strings, (GFunc)test_longest, (gpointer)&longestWord);
printf("First longest word: %s\n", longestWord);
g_slist_foreach(strings, (GFunc)g_free, NULL);
g_slist_free(strings);
g_free(longestWord);
return 0;
}
Объяснение кода листинга программы
Выше представлен код на языке C, который разделяет введённую пользователем строку на слова и выводит на экран самое длинное из них. Список действий, которые выполняются в этом коде:
- Включаются необходимые заголовочные файлы.
- В функции
longest_wordвыделяется память под массив указателей на слова. - В функции
mainсоздаётся пустой список для хранения введённых пользователем строк. - У пользователя запрашивается ввод строк до тех пор, пока он не введёт пустую строку.
- Для каждой введённой строки вызывается функция
test_longest, которая с помощью рекурсии находит самое длинное слово и добавляет его в списокlongestWord. - В функции
test_longestпроверяется, является ли текущее слово самым длинным. Если да, то оно добавляется в списокlongestWord. Если нет, то оно удаляется. - После того как все строки были обработаны, выводится на экран самое длинное слово.
- Все добавленные в список
longestWordстроки освобождаются с помощью функцииg_free. - Список
longestWordи указатель на ввод строкbufосвобождаются. - Возвращается 0, что означает успешный конец работы программы.