K&R задание 1.9 Решение с использованием символьного массива, почему не работает? - C (СИ)

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

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

Здравствуйте! Изучаю язык и азы программирования по книге Ритчи. В ней встречается такое задание. Конечно, его можно просто решить через getchar-putchar, но хотелось мы понять почему именно вот так программа не работает и выдает символы похожие на смайлы и другие кракозябры? Задание.

Напишите программу, которая будет в каждой вводимой строке заменять стоящие подряд символы пробелов на один пробел.

Листинг программы
  1. #include <stdio.h>
  2. main()
  3. {
  4. int sc;
  5. int i;
  6. char s[40];
  7. int c;
  8. sc=0;
  9. for(i=0; (c=getchar() != EOF); ++i) {
  10. if (c != ' ') {
  11. if (sc==0)
  12. s[i]=c;
  13. else
  14. {
  15. s[i]=c;
  16. sc = 0; } }
  17. else if (c = ' ') {
  18. if (sc==0) {
  19. s[i]=c;
  20. sc = 1; }
  21. else
  22. sc=1; } }
  23. printf("%s", s);
  24. }

Решение задачи: «K&R задание 1.9 Решение с использованием символьного массива, почему не работает?»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void Press(char *Stri)
  5. {
  6.      int l,i_from,i_to;
  7.      char c,p;
  8.      l=strlen(Stri);
  9.      i_from=0;
  10.      i_to=0;
  11.      p=0;
  12.      while (1)
  13.      {
  14.        c=Stri[i_from];
  15.        if (c != ' ')
  16.        {
  17.           Stri[i_to++]=c;
  18.           i_from++;
  19.        }      
  20.        else if (p==' ')
  21.                i_from++;
  22.             else
  23.             {
  24.                Stri[i_to++]=c;
  25.                i_from++;
  26.             }
  27.        p=c;
  28.        if (i_from > l) break;
  29.      }            
  30.      for (i_to=i_to; i_to<l; i_to++) Stri[i_to]=0;
  31. }  
  32.      
  33.  
  34. int main(int argc, char *argv[])
  35. {
  36.  
  37.   char Buf[100];
  38.  
  39.   printf("Enter string:\n");
  40.   gets(Buf);
  41.   Press(Buf);
  42.   printf("%s\n",Buf);  
  43.  
  44.   system("PAUSE"); 
  45.   return 0;
  46. }

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

  1. Ввод строки с помощью функции gets().
  2. Вызов функции Press() с переданным в нее указателем на введенную строку.
  3. Внутри функции Press() инициализированы следующие переменные:
    • l - длина строки.
    • i_from - индекс начального символа в строке.
    • i_to - индекс следующего символа в строке.
    • p - текущий символ.
  4. В цикле while (1) происходит копирование строки с пробелами и без них в новую строку.
  5. Если текущий символ не пробел, то он добавляется в новую строку, индекс новой строки увеличивается, а индекс старой строки увеличивается на 1.
  6. Если текущий символ пробел, то если предыдущий символ не пробел, то он также добавляется в новую строку, индекс новой строки увеличивается, а индекс старой строки увеличивается на 1.
  7. Если текущий символ пробел и предыдущий символ пробел, то ничего не добавляется в новую строку, индекс новой строки увеличивается, а индекс старой строки увеличивается на 1.
  8. Индекс p обновляется с каждым новым символом.
  9. Если индекс i_from больше длины строки, то цикл прерывается.
  10. Если новая строка пуста (так как все символы были пробелами), то она очищается.
  11. Вывод новой строки с помощью функции printf().
  12. Вызов функции system(PAUSE), чтобы программа не закрылась сразу после вывода строки.
  13. Возврат 0, чтобы указать, что программа успешно завершилась.

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


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

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

12   голосов , оценка 3.917 из 5

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

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

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