如何从scanf读取无限数量的变量(由空格或新行分隔)

时间:2016-07-27 04:07:19

标签: c scanf

我想编写一个程序,从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;
}

前两个例子的效果非常好,但是当输入在不同的行中时,第三个怎么办呢?我的程序只在第三个例子中输出“#”,这意味着它只读取输出的第一行。

2 个答案:

答案 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;
}