Разбиение строки на слова - C (СИ)

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

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

Хочу разбить сроку на отдельные слова. Вроде разбивается, но когда вывожу, слова которые меньше или равны 3 символам выводятся хорошо, а вот которые больше с какой-то плохой штукой. Перед тем как использовать буфер чищу, но все равно ничего хорошего не дает.
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #define n 100
  6. struct words
  7. {
  8. char *wrd;
  9. };
  10. words slova[n];
  11. int main()
  12. {
  13. char string[255],*pos_point;
  14. printf("Enter a string ");
  15. gets(string);
  16. strcat(string," ");
  17. int number=0,i,to=0,from=0;
  18. for (i=0;i<strlen(string);i++) //Поиск количество пробелов в строке.
  19. {
  20. if (string[i]==' ') number++;
  21. }
  22. for (i=0;i<number;i++)
  23. {
  24. slova[i].wrd = (char*)malloc( sizeof(100) );
  25. memset (slova[i].wrd, 0, sizeof (slova[i].wrd));
  26. pos_point=strchr (string,' ');
  27. strncpy (slova[i].wrd,string,pos_point-string);
  28. to=pos_point-string;
  29. memmove(string + from, string + from + (to+1), strlen(string + from + to) + 1);
  30. }
  31. for (i=0;i<number;i++)
  32. {
  33. printf("\n%s %d ",slova[i].wrd,strlen(slova[i].wrd));
  34. }
  35. getch();
  36. }

Решение задачи: «Разбиение строки на слова»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. char *duplicate_string(const char *str)
  7. {
  8.     char *result = malloc(strlen(str) + 1);
  9.     if(result != NULL)
  10.         strcpy(result, str);
  11.     return result;
  12. }
  13.  
  14. #define ENSURE(TEST, LABEL, FMT, ...)           \
  15.     do                                          \
  16.     {                                           \
  17.         if(!(TEST))                             \
  18.         {                                       \
  19.             fprintf(stderr, "%s:" FMT,          \
  20.                     errno, #__VA_ARGS__);       \
  21.             goto LABEL;                         \
  22.         }                                       \
  23.     }    while(0)
  24.    
  25.  
  26. int main(void)
  27. {
  28.     char buf[BUFSIZ], **words = NULL, *pch;
  29.     const char *delims = " ";
  30.     size_t actual_size = 0, actual_limit = 0, rank = 0, i;
  31.     int ret = EXIT_FAILURE;
  32.    
  33.     printf("Enter words separated by spaces: ");
  34.     fflush(stdout);
  35.    
  36.     fgets(buf, BUFSIZ, stdin);
  37.     ENSURE(buf != NULL, read_err, "%s", "read words");
  38.  
  39.     if((pch = strchr(buf, '\n')) != NULL)
  40.         *pch = '\0';
  41.  
  42.     for(pch = strtok(buf, delims); pch != NULL; pch = strtok(NULL, delims))
  43.     {
  44.         if(actual_size == actual_limit)
  45.         {
  46.             char **temp;
  47.             temp = realloc(words, (actual_limit = 1 << rank++) * sizeof *words);
  48.             ENSURE(temp != NULL, words_err, "%s", "allocate memory for words");
  49.             words = temp;
  50.         }
  51.  
  52.         words[actual_size] = duplicate_string(pch);
  53.         ENSURE(words[actual_size] != NULL, words_err, "%s", "allocate memory for a single word");
  54.         ++actual_size;
  55.     }
  56.  
  57.     for(i = 0; i < actual_size; ++i)
  58.         printf("%s\t%d\n", words[i], strlen(words[i]));
  59.  
  60.     ret = EXIT_SUCCESS;
  61.    
  62. words_err:
  63.     for(i = 0; i < actual_size; ++i)
  64.         free(words[i]);
  65.     free(words);
  66.    
  67. read_err:
  68.     exit(ret);
  69. }

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

  1. Включаем необходимые заголовочные файлы: , , ,
  2. Создаем функцию duplicate_string, которая выделяет память под строку и копирует в нее исходную строку. Если память не может быть выделена, функция возвращает NULL.
  3. В функции main() создаем буфер для чтения строки, указатель на слова (массив указателей на строки), указатель на разделитель (пробел), переменные для отслеживания размеров массива слов и строки, а также переменную для отслеживания статуса чтения строки.
  4. Запрашиваем у пользователя ввод строки, разделяя ее на слова и сохраняя их в массиве words.
  5. Если во время выделения памяти или чтения строки произошла ошибка, выводим сообщение об ошибке и завершаем работу программы.
  6. Выводим на экран список слов и их длину.
  7. Освобождаем память, выделенную под слова, и завершаем работу программы.

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


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

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

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы