我尝试使用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个! 如果我想阅读未知数量的输入,我该怎么办呢?
答案 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 )