Это явно нарушает ваше состояние, но оно неуместно, и я думаю, что читателю стоит посмотреть, как это сделать без него. Основным преимуществом этого подхода является то, что вы не накладываете произвольные ограничения на длину ввода. (В исходном коде ввод не должен превышать 100 байт.) Я предполагаю, что ваша задача состоит в том, чтобы просто реализовать tr -s '[[:space:]]' \\n
, и в этом случае вы можете сделать:
#include <stdio.h>
#include <ctype.h>
/* Simple implementation of tr -s '[[:space:]]' \\n */
int
main(void)
{
int in_space = 0;
int c;
while( (c = getchar()) != EOF ) {
if(isspace(c)) {
if( !in_space )
putchar('\n');
in_space = 1;
} else {
in_space = 0;
putchar(c);
}
}
if(!in_space)
putchar('\n');
return 0;
}
Что может быть упрощено в некоторой степени (ИМО, вышеизложенное чрезмерно избыточно):
#include <stdio.h>
#include <ctype.h>
/* Simple implementation of tr -s '[[:space:]]' \\n */
int
main(void)
{
int c;
int last = '\n';
while( (c = getchar()) != EOF ) {
c = isspace(c) ? '\n' : c;
if( c != '\n' || last != '\n' )
putchar(c);
last = c;
}
if( last != '\n' )
putchar(c);
return 0;
}
или даже:
#include <stdio.h>
#include <ctype.h>
/* Simple implementation of tr -s '[[:space:]]' \\n */
void
dedup(int c)
{
static int last = '\n';
if( c != '\n' || last != '\n' )
putchar(c);
last = c;
}
int
main(void)
{
int c;
while( (c = getchar()) != EOF ) {
dedup( isspace(c) ? '\n' : c);
}
dedup('\n');
return 0;
}