1

我需要编写一个从标准输入读取的程序,并且只将非空行写入标准输出(即仅包含 \n 的行)。例如,如果标准输入是:

1

2

\n

3

输出将是:

1

2

3

这是我到目前为止所拥有的:

#include <stdio.h> 
#include <string.h> 

int main()

{
    char buf[BUFSIZ];
    char *p;

    printf ("Please enter some lines of text\n");

    if (fgets(buf, sizeof(buf), stdin) != NULL)
    {
        printf ("%s\n", buf);
        /*
         *  Remove newline character
         */
        if ((p = strchr(buf, '\n')) != NULL)
            *p = '\0';
    }
    return 0;
}

有什么办法可以让我循环程序,这样即使输入了一个空行,用户仍然可以继续输入?

4

4 回答 4

1

这是作业吗?

如果没有,grep 会做你想做的事:

grep --invert-match '^$' yourfile

也就是说,匹配任何不是行首 ( ^) 的行,然后紧跟行尾 ( $)。

于 2012-04-27T01:07:56.730 回答
1

因此,该if语句用于一次性代码块,您需要一个循环语句。您甚至可以使用相同的条件。您还需要进行其他一些小的更改,但是一旦您确定了需要哪种类型的循环,您应该大部分都在那里。

于 2012-04-27T01:29:45.240 回答
0

如果您不必仅在 C 中执行此操作。然后,您可以使用 UNIX 和 Perl 来解决您的问题

输入

1
2
\n
3

UNIX 解决方案

$> grep -v '\n' Input

Perl 解决方案

@text = `cat /home/Input`;
foreach my $no_only (@text)
{
        if ($no_only =~ /\d/)
        {
                print "$no_only\n";
        }
}

输出

1
2
3
于 2012-04-27T11:13:29.783 回答
0
#include <stdio.h>

int main(void){
    char buf[BUFSIZ];

    printf ("Please enter some lines of text\n");

    while(fgets(buf, sizeof(buf), stdin) != NULL){
        if(*buf != '\n')
            printf("%s", buf);
    }
    return 0;
}
于 2012-04-27T13:10:49.270 回答