LINUX.ORG.RU

Пытаюсь разобраться в Си, криво работает программа


0

0

Читаю K&R, выполняю упражнения. Неожиданное затруднение вызвал
хрестоматийный пример из первой главы - "Напишите программу,
копирующую символы ввода в выходной поток и заменяющую стоящие подряд
пробелы на один пробел." Вот что у меня получилось:

#include <stdio.h>

main()
{
	int c, ign_spc;

	ign_spc = 0;

	while ((c = getchar()) != EOF)
	{
		if (c == ' ')
			if (ign_spc != 1)
			{
				putchar(c);
				ign_spc = 1;
			}
		else
		{
			putchar(c);
			ign_spc = 0;
		}
	}
}

Если на входном потоке встречается пробел и до этого его не было,
печатаем пробел и запоминаем что он был, если же не пробел то
печатаем этот символ и отмечаем что это был не пробел. Работает до
^D. При запуске и вводе с клавы отображается только сам ввод, а не
putchar(). Помогите разобраться пожалуйста.
anonymous

Re: Пытаюсь разобраться в Си, криво работает программа

		if (c == ' ') {
			if (ign_spc != 1)
			{
				putchar(c);
				ign_spc = 1;
			}
		}
		else
		{
			putchar(c);
			ign_spc = 0;
		}

Legioner ★★★★★ ()

Re: Пытаюсь разобраться в Си, криво работает программа

Построчная буферизация stdout?

Или делай fflush после каждого putchar, или не используй stdio (а прямо "write(0, &c, 1);"), либо в начале программы скажи "setbuf(STDOUT, NULL);".

Последний способ - наиболее кошерный, пожалуй.

anonymous ()

Re: Пытаюсь разобраться в Си, криво работает программа

Ой, блин, слона-то я и не приметил.

У тебя да, скобочек не хватает, и else не к тому if прицепляется. Это тебе не питон ;)

anonymous ()

Re: Пытаюсь разобраться в Си, криво работает программа

Хм, действительно работает :) Значит пару {} можно опускать только если инструкция одна и только если при этом нет else у if? Про второй пункт я не знал. Если так, то я разобрался, спасибо :)

anonymous ()

Re: Пытаюсь разобраться в Си, криво работает программа

>Значит пару {} можно опускать только если инструкция одна и только если при этом нет else у if

что значит можно-нельзя? если компилится - значит можно. дело не в возможности, а в семантике.

Pi ★★★★★ ()

Re: Пытаюсь разобраться в Си, криво работает программа

тока не надо из себя строить парсер ;)

для особо вспыльчивых объясняю на пальцах, что имеется в виду: не дано тупи запоминать, что можно, а чего нельзя - это не метод изучения языка. если пр-ма скомпилировалась, значит дерево вывода было построено, оно соответствиет грамматике, так писать можно с точки зрения грамматики. другое дело, на сколько это читаемо и т.п. надо стараться понимать, что пишешь, а забивать голову псевдоправилами "нет else у if"

Pi ★★★★★ ()

Re: Пытаюсь разобраться в Си, криво работает программа

>Значит пару {} можно опускать только если инструкция одна и только если при этом нет else у if?

Не совсем точно. Просто else всегда относится к ближайшему if (а как ещё компилятор может догадаться, что ты от него хочешь?).

Davidov ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.