欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于scanf的探索

程序员文章站 2024-03-20 18:20:10
...

为什么探究scanf(),因为水题的时候出了点差错。。。

HDU2008数值统计

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 125294    Accepted Submission(s): 60151

Problem Description

统计给定的n个数中,负数、零和正数的个数。

 

 

Input

输入数据有多组,每组占一行,每行的第一个数是整数nn<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。

 

 

Output

对于每组输入数据,输出一行a,bc,分别表示给定的数据中负数、零和正数的个数。

 

 

Sample Input

6 0 1 2 3 -1 0

5 1 2 3 4 0.5

0

 

 

Sample Output

1 2 3

0 0 5

 

 

Time Limit Exceeded的代码:

#include<stdio.h>
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
	//if(n==0)break;
        int f=0,l=0,z=0;
        while(n--){
            float x;
            scanf("%f",&x);
            if(x<0)f++;
            else if(x>0)z++;
            else l++;
        }
        printf("%d %d %d\n",f,l,z);
    }
    return 0;
}


错误原因在哪里:while(scanf("%d",&n)!=0)中的scanf()在遇到表示数据结束的0输入时,它的返回值时1,循环还能继续下去,但没有输入就死循环了。加一句if(n==0)break;

 



scanf()探究:

1.整数输入:

int m;

int k=scanf(%d,&m);

输入一个负数,0或整数,scanf()的返回值k=1.

 

int m,n;

int k=scanf(%d %d,&m,&n);

输入两个负数,0或整数,scanf()的返回值k=2

 

 

2.浮点数输入:同理



3.字符输入:char m;



int k=scanf(%c,&m);

输入一个字符(如果输入数字5,也是这样,因为5也算是一个字符),scanf()的返回值k=1.

 

char m,n;

int k=scanf(%c %c,&m,&n);

输入一个字符(如果输入数字5,也是这样,因为5也算是一个字符),scanf()的返回值k=2.

 

 4.混合输入A


int m,n;

int k=scanf(%d %d,&m,&n);

输入1dscanf()的返回值k=1

 

int m,n,p;

int k=scanf(%d %d %d,&m,&n,&p);

输入1d1scanf()的返回值k=1

 

这里,当scanf检测到输入d发生错误,立即结束退出,只统计前面正确的数据。

5.混合输入B

char m,n;

int k=scanf(%c %c,&m,&n);

输入d1还是1dscanf()的返回值k=2

 

其实,数字1也算是一个字符。