输入函数--c语言

scanf函数

一:介绍

scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
其调用格式为:      scanf("<格式化字符串>",<地址表>);

 1、  这里主要介绍一个参数,%[ ] ,这个参数的意义是读入一个字符集合. [ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在此集合的字符便停止. 如果集合的第一个字符是" ^ ", 这说明读取不在" ^ " 后面集合的字符,既遇到" ^ " 后面集合的字符便停止.注意此时读入的字符串是可以含有空格的.
Eg. 输入一个字符串, 这个字符串只含有小写字符.遇到第一个不是小写字符时停止.
      scanf("%[a-z],str);
Eg. 想输入一个字符串, 遇到 "." 停止,可设计如下:
     scanf("%[^.]", str);
样例:scanf("%[^:]:%s", s1,s2);如果输入数据为:"Student:Person"; 则s1=“Student”, s2="Person";

2、可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。如规定只能输入10字符给字符串指针p,则scanf() 函数语句变为:scanf("%10s", p);程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始读入。

3、scanf()函数中没有精度控制。如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。

4、在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

5、在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:scanf("%c%c%c",&a,&b,&c);
输入为:
d e f
则把'd'赋予a, ' (空格)'赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '/为下一个字符送给b。
只有当输入为:def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,如 scanf ("%c %c %c",&a,&b,&c);则输入时各数据之间可加空格。
我们用一些例子来说明一些规则:
#include <stdio.h>
void main()
{
       char a,b;
       printf("input character a,b\n");
       scanf("%c%c",&a,&b); /*注意两个%c之间没有任何符号*/
       printf("%c%c\n",a,b);
}
由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符,见下面的输入运行情况: input character a,b
MN    (你输入的值)
MN    (屏幕上显示的值)
#include <stdio.h>
void main()
{
       char a,b;
       printf("input character a,b\n");
       scanf("%c %c",&a,&b); /*注意两个%c之间有个空格*/
       printf("\n%c%c\n",a,b);
}本例表示scanf格式控制串"%c %c"之间有空格时, 输入的数据之间可以有空格间隔。
6、如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
#include <stdio.h>
void main()
{
       int a;
       printf("input a number");
       scanf("%d",&a);
       printf("%ld",a);
}
由于输入数据类型为整型, 而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。输出并不是输入的值。
如将Scanf("%d",&a); 语句改为 scanf("%ld",&a);
输入数据为长整型,输入输出数据才相等。
二:常见错误及对策
我自己编了一个程序,但运行的结果与我预期的不一样。
#include<stdio.h>
void main()
{
       static int a[2][3]={{1,3,4},{7,9,6}};
       int i,j,k;
       for(k=1;k<=2;k++)
       {
            printf("Please input num:");
            scanf("%d %d",&i,&j);
            if(i<2&&j<3) printf("num=%d\n",a[i][j]);
            else printf("Input is error,\n");
       }
       printf("programm is complete.\n");
}
我想将第8行改为
scanf("i=%d j=%d",&i,&j);
则程序运行结果变成
please input num:i=1 j=2
num=6
num=6(我原本希望能重复第一行再让我输入)
Programm is complete.
为什么第二次不能输入?
答复:
我使用Turbo C 2.0证实存在你说的问题。象scanf("i=%d j=%d",&i,&j);这样的输入方式比较特别,TC 2.0显然在第一次输入后没有象正常情况一样清楚输入缓冲区,这样第二次执行scanf时,程序并没有让你输入而是直接读入上次输入的结果。如果你一定要这么做,应该在scanf之前加上:
fflush(stdin);
这样清楚掉键盘缓冲区。
posted on 2011-04-03 22:05  tzc_yujunyong  阅读(1083)  评论(0)    收藏  举报