验证空行输入(\ n \ n)
问题描述:
我需要编写一个程序,它从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;
}
有什么办法,我可以循环该程序虽然,所以即使输入一个空行,用户仍然可以继续输入?
答
#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;
}
答
这是功课吗?
如果没有,grep的会做你想要什么:
grep --invert-match '^$' yourfile
也就是说,匹配不启动线(^
)的任何行之后紧接着线($
)结束。
答
因此,if
语句是针对一段代码,您需要一个循环语句。你甚至可以使用相同的条件。还有一些你需要的小改动,但是一旦你弄清楚你需要什么类型的循环,你应该主要在那里。
+0
我知道这并不理想,我本应该自己找到答案,但是有什么方法可以让我看到解决方案吗?我已经阅读过K&R书以及可能的在线相关C文章,但对于我的生活,我仍然无法找到正确的方法来完成这件事。 – SeekingCharlie 2012-04-27 03:21:06
答
如果你不是只有在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
我不知道你的程序的说明相匹配(而且由于程序有语法问题,就很难知道,如果你想要的是该程序的样子可能是做或你在问题中所做的)。最令人困惑的是,该程序似乎只读过一行文字,因此没有多少机会可以读入多个'\ n'。 – 2012-04-27 01:09:18
听起来很像作业。如果我的假设是正确的,请继续编辑您的帖子以包含'家庭作业'标签。 – Till 2012-04-27 01:15:09
谢谢 - 我已经包含一个作业标签。 – SeekingCharlie 2012-04-27 01:24:01