我想编写一个程序,从stdin读取任意数量的正整数值(由新行或空格分隔),并在新行中输出相应数量的#。例如:
Input:
5 4 3 2 1
Output:
#####
####
###
##
#
Input:
16
0
4
12
Output:
################
####
############
Input:
1 1 3
2 1
Output:
#
#
###
##
#
我的代码:
#include <stdio.h>
int main(){
char buffer[1000];
if (fgets(buffer, sizeof(buffer), stdin) != 0){
int i,j,a;
for(i=0; sscanf(buffer+i,"%d%n",&a,&j)!=EOF; i+=j){
while(a-->0){
printf("*");
}
printf("\n");
}
}
return 0;
}
前两个例子的效果非常好,但是当输入在不同的行中时,第三个怎么办呢?我的程序只在第三个例子中输出“#”,这意味着它只读取输出的第一行。
答案 0 :(得分:1)
您的代码是读取行输入数字,然后是printf
#
的数量。您只需调用fgets
一次,因此它只读取输入的第一行。您可以使用while
:
#include <stdio.h>
int main(){
char buffer[1000];
while (fgets(buffer, sizeof(buffer), stdin) != 0){
int i,j,a;
for(i=0; sscanf(buffer+i,"%d%n",&a,&j)!=EOF; i+=j){
while(a-->0){
printf("#");
}
printf("\n");
}
}
return 0;
}
顺便说一下,scanf
只是为了学习,它在实际程序中几乎没用,所以不要花太多时间在它上面。
答案 1 :(得分:0)
您可以在fgets
循环中使用sscanf
,而不是fscanf/scanf
再使用while
。
int main(){
int a;
while ( fscanf(stdin, "%d", &a) == 1 )
{
while(a-- > 0){
printf("*");
}
printf("\n");
}
return 0;
}