2012-04-27 81 views
1

我需要编写一个程序,它从stdin读取并且只写入非空行到标准输出(即只包含\ n的行)。例如,如果标准输入是:验证空行输入( n 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; 
} 

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

+2

我不知道你的程序的说明相匹配(而且由于程序有语法问题,就很难知道,如果你想要的是该程序的样子可能是做或你在问题中所做的)。最令人困惑的是,该程序似乎只读过一行文字,因此没有多少机会可以读入多个'\ n'。 – 2012-04-27 01:09:18

+0

听起来很像作业。如果我的假设是正确的,请继续编辑您的帖子以包含'家庭作业'标签。 – Till 2012-04-27 01:15:09

+0

谢谢 - 我已经包含一个作业标签。 – SeekingCharlie 2012-04-27 01:24:01

回答

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; 
} 
1

这是功课吗?

如果没有,grep的会做你想要什么:

grep --invert-match '^$' yourfile 

也就是说,匹配不启动线(^)的任何行之后紧接着线($)结束。

1

因此,if语句是针对一段代码,您需要一个循环语句。你甚至可以使用相同的条件。还有一些你需要的小改动,但是一旦你弄清楚你需要什么类型的循环,你应该主要在那里。

+0

我知道这并不理想,我本应该自己找到答案,但是有什么方法可以让我看到解决方案吗?我已经阅读过K&R书以及可能的在线相关C文章,但对于我的生活,我仍然无法找到正确的方法来完成这件事。 – SeekingCharlie 2012-04-27 03:21:06

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