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, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д