Смотрите, когда вы проверяете свой второй код
if (last != c) {
Вы проверяете не все условия. last
может быть равно пробелу, табуляции или новой строке.Во всех таких случаях он не должен печатать новую строку.Давайте назовем набор этих трех специальных символов как X
.
. Теперь при печати новой строки необходимо убедиться, что напечатанный символ last
не приводит к установке X
.Но вы проверяете это last!=current
.Теперь текущим может быть пробел, табуляция или новая строка.Но это только одна ценность.Он не отвечает нашим потребностям, нашей цели.
Так что вместо этого замените его на
if (last != ' ' && last != '\n' && last != '\t' ) {
Вы можете увидеть код здесь:
#include <stdio.h>
#define IN 1 // inside a word
#define OUT 0 // outside a word
// program to print input one word per line, corrected bug if there was
// more than one space between words to only print one \n
int main(void)
{
int c, last, state;
last = 0; // We need it to make sure that a newline is not printed in case first
// char is space, tab or new line.
state = OUT;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c == '\t') {
// if (last != c)
if (last != ' ' && last != '\n' && last != '\t' && last != 0 )
{
state = OUT;
printf("\n");
}
} else if (state == OUT) {
state = IN;
}
if (state == IN) {
putchar(c);
}
last = c;
}
return 0;
}
РедактироватьИсправлена ошибка, указанная в комментариях paxdiablo.