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; }
Объяснение кода листинга программы
- Ввод строки с помощью функции
gets()
. - Вызов функции
Press()
с переданным в нее указателем на введенную строку. - Внутри функции
Press()
инициализированы следующие переменные:l
- длина строки.i_from
- индекс начального символа в строке.i_to
- индекс следующего символа в строке.p
- текущий символ.
- В цикле
while (1)
происходит копирование строки с пробелами и без них в новую строку. - Если текущий символ не пробел, то он добавляется в новую строку, индекс новой строки увеличивается, а индекс старой строки увеличивается на 1.
- Если текущий символ пробел, то если предыдущий символ не пробел, то он также добавляется в новую строку, индекс новой строки увеличивается, а индекс старой строки увеличивается на 1.
- Если текущий символ пробел и предыдущий символ пробел, то ничего не добавляется в новую строку, индекс новой строки увеличивается, а индекс старой строки увеличивается на 1.
- Индекс
p
обновляется с каждым новым символом. - Если индекс
i_from
больше длины строки, то цикл прерывается. - Если новая строка пуста (так как все символы были пробелами), то она очищается.
- Вывод новой строки с помощью функции
printf()
. - Вызов функции
system(
PAUSE)
, чтобы программа не закрылась сразу после вывода строки. - Возврат 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д