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