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, чтобы указать, что программа успешно завершилась.