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