如何使用scanf()输入未知数量的对象?

时间:2015-09-24 03:26:54

标签: c++

我尝试使用scanf()函数编写一个程序,该程序使用strin读取未知数量的输入(仅限数字)。但似乎并不是很满意这种情况:我输入9,但程序只读了5个。

#include<cstdio>
#include<cstring>
using namespace std;
int top=0,heap[65535];
void add_up(int x){
    int next=x>>1,now=x;
    while(next){
        if(heap[now]<heap[next]){
            heap[now]^=heap[next]^=heap[now]^=heap[next];
            now=next;
            next=now>>1;
        }
        else{
            break;
        }
    }
    return ;
}
void add_down(){
    int now=1,next=now<<1;
    while(next<=top){
        if(next<top&&heap[next]>heap[next+1])next++;
        if(heap[now]<heap[next])break;
        heap[now]^=heap[next]^=heap[now]^=heap[next];
        now=next;
        next=now<<1;
    }
    return ;
}
int main(){
    memset(heap,0,sizeof(heap));
    int i; 
    while(scanf("%d",&i)!=EOF){
//  for(int j=0;j<10;j++){
        scanf("%d",&i);
        printf("%d ",i);
        heap[++top]=i;
        add_up(top);
    }
    printf("\n");
    while(top>0){
        printf("%d ",heap[1]);
        heap[1]=heap[top--];
        add_down();
    }
    printf("\n");
    return 0;
}

很高兴找到这个:

E:\home\Desktop>echo 9 8 7 6 5 4 3 2 1 > try001.txt
E:\home\Desktop>gcc -g try001.cc -o try001
E:\home\Desktop>try001.exe < try001.txt
8 6 4 2 1
1 2 4 6 8
E:\home\Desktop>

输入文件中有9个数字,为​​什么程序只读5个! 如果我想阅读未知数量的输入,我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

问题在于使用scanf两次而不是以下几行:

while(scanf("%d",&i)!=EOF){
    scanf("%d",&i);
    printf("%d ",i);

您在第一次调用scanf时读取的数字会被忽略。

删除第二个scanf并使用:

while(scanf("%d",&i)!=EOF){
    printf("%d ",i);

如果您有一个要尝试阅读的变量,请使用

while(scanf("%d",&i)!=EOF)

没关系。但是,如果有多个变量,则需要使用:

while ( scanf("%d %d", &i, &j) == 2 )

因为如果成功将值分配给1,则返回值可能为i。即使在尝试读取一个变量时,使用相同的编码方式也会更好。因此,最好使用:

while ( scanf("%d", &i) == 1 )