Удалить слова содержащие больше чем N символов с помощью указателей - C (СИ)

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

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

Задание:

Удалить слова содержащие больше чем N символов с помощью указателей.

уже дня 4 пытаю указатели, ничерта не получается. тут мне выдало какую-то ошибку вдруг: непредвиденное обнаружение конца файла. где он обнаружил не понимаю. и вообще правильно ли я написал программу, помогите пожалуйста
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define n 1000
  4. #define max 5
  5. void process_line(char line);
  6. {
  7. char *p1,*p2,*p3,dl;
  8. p1=&line[0]; //находится в начале слова, для удаления длинного слова
  9. p2=&line[0]; //ищет конец слова, так же для удаления длинного слова
  10. p3=&line[0]; //ищет начало нового слова, для указателя p1
  11. for (;*p2!='\0';p2++)
  12. {
  13. if (*p2==' ')
  14. {
  15. dl=p2-p1;
  16. if (dl>max)
  17. for (;*p2!='\0';p1++,p2++)
  18. *p1=*p2;
  19. for (;*p3!='\0';p3++)
  20. {
  21. if (*p3==' ')
  22. {
  23. p1=p3;
  24. goto exit1;
  25. }
  26. }
  27. exit1:;
  28. }
  29. void main (void)
  30. {
  31. char line[n];
  32. gets(line);
  33. process_line(line);
  34. puts(line);
  35. getchar();
  36. }

Решение задачи: «Удалить слова содержащие больше чем N символов с помощью указателей»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. //-----------------------------------------------------------------------------
  5. char* RemoveWords(char* text, size_t length)
  6. {
  7.    char* begin = text;
  8.    char* end = text;
  9.    int offset = 1;
  10.  
  11.    while (offset > 0)
  12.    {
  13.       for (begin = end; *begin && !isalpha(*begin); ++begin) { ; }
  14.  
  15.       for (end = begin; *end && isalpha(*end); ++end) { ; }
  16.  
  17.       offset = end - begin;
  18.  
  19.       if (offset > length)
  20.       {
  21.          for (; *end; ++end)
  22.          {
  23.             *(end - offset) = *end;
  24.          }
  25.          *(end - offset) = 0;
  26.          end = begin;
  27.       }
  28.    }
  29.  
  30.    return text;
  31. }
  32. //-----------------------------------------------------------------------------
  33.  
  34. int main()
  35. {
  36.    char text[256] = {'\0'};
  37.  
  38.    printf("text: ");
  39.    fgets(text, sizeof(text) - 1, stdin);
  40.  
  41.    size_t length;
  42.    printf("length: ");
  43.    scanf("%u", &length);
  44.  
  45.    printf("result: %s\n", RemoveWords(text, length));
  46.  
  47.    return 0;
  48. }

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

В этом коде реализована функция RemoveWords, которая удаляет из текста слова, содержащие больше length символов. Список изменений, которые происходят в коде:

  1. Ввод текста и его длины с помощью fgets и scanf.
  2. Инициализация указателей begin и end на начало текста.
  3. Пропуск символов, не являющихся буквами, с помощью цикла while и for.
  4. Определение длины слова с помощью end - begin.
  5. Если длина слова больше length, то слово удаляется с помощью цикла for и указателей end и begin.
  6. В конце функции возвращается исходный текст. Список переменных и их значений:
  7. text - исходный текст.
  8. length - длина слова, которое необходимо удалить.
  9. begin - указатель на начало слова.
  10. end - указатель на конец слова.
  11. offset - смещение указателя end относительно указателя begin.

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


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

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

9   голосов , оценка 4.222 из 5

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

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

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