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

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

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

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

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

#include <stdio.h>
 
main()
{
  int sc;
  int i;
  char s[40];
  int c;
 
sc=0;
for(i=0; (c=getchar() != EOF); ++i) {
    if (c != ' ') {
    if (sc==0)
    s[i]=c;
    else
    {
    s[i]=c;
    sc = 0; } }
 
    else if (c = ' ') {
    if (sc==0) {
    s[i]=c;
    sc = 1; }
    else
    sc=1; } }
 
    printf("%s", s);
}

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
void Press(char *Stri)
{
     int l,i_from,i_to;
     char c,p;
     l=strlen(Stri);
     i_from=0;
     i_to=0;
     p=0;
     while (1)
     {
       c=Stri[i_from];
       if (c != ' ') 
       {
          Stri[i_to++]=c;
          i_from++;
       }       
       else if (p==' ')
               i_from++;
            else
            {
               Stri[i_to++]=c;
               i_from++;
            }
       p=c;
       if (i_from > l) break;
     }            
     for (i_to=i_to; i_to<l; i_to++) Stri[i_to]=0;
}  
     
 
int main(int argc, char *argv[])
{
 
  char Buf[100];
  
  printf("Enter string:\n");
  gets(Buf);
  Press(Buf);
  printf("%s\n",Buf);  
  
  system("PAUSE");  
  return 0;
}

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

  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
Похожие ответы