青春有我
scanf()函数的用法scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。其调用格式为: scanf("<格式化字符串>",<地址表>);格式化字符串包括以下三类不同的字符;1、 格式化说明符:格式化说明符与printf()函数中的格式说明符基本相同。但和printf()函数中格式字符串的用法有一些小区别。我们来看下面这个表。格式字符说明%d 从键盘输入十进制整数%o 从键盘输入八进制整数%x 从键盘输入十六进制整数%c 从键盘输入一个字符%s 从键盘输入一个字符串%f 从键盘输入一个实数%e 与%f的作用相同附加格式说明字符表字符说明L 输入"长"数据。 H 输入"短"数据。 M 指定输入数据所占宽度。 * 空读一个数据2、 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。3、 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间同","分开。例如:#include <stdio.h>void main(){int i, j;printf("i, j=?\n");scanf("%d, %d", &i, &j);}上例中的scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。说明:(1) 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。例如:#include <stdio.h>void main(){char *p, str[20];p = new char[20]; scanf("%s", p); /*从健盘输入字符串*/scanf("%s", str);printf("%s\n", p); /*向屏幕输出字符串*/printf("%s\n", str);}(2) 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。如上例中若规定只能输入10字符给字符串指针p,则第一条scanf() 函数语句变为:scanf("%10s", p);程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始读入。(3) scanf()函数中没有精度控制。如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。(4) scanf中要求给出变量地址,如给出变量名则会出错如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。(5) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。(6) 在输入字符数据(%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,bMN (你输入的值)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"之间有空格时, 输入的数据之间可以有空格间隔。(7) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。例如:scanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“ , ”作间隔符,故输入时应为: 5,6,7 (与scanf 双引号之间的格式必须一样)又如: scanf("a=%d,b=%d,c=%d",&a,&b,&c);则输入应为 a=5,b=6,c=7如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。#include <stdio.h>void main(){int a;printf("input a number");scanf("%d",&a);printf("%ld",a);}由于输入数据类型为整型, 而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。输出并不是输入的值。如将Scanf("%d",&a); 语句改为 scanf("%ld",&a);输入数据为长整型,输入输出数据才相等。三、 常见错误及对策问题1:我初学C程序,所以提的问题很浅,希望您不要见笑。我自己编了一个程序,但运行的结果与我预期的不一样。#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=2num=6num=6(我原本希望能重复第一行再让我输入)Programm is complete.为什么第二次不能输入?答复:我使用Turbo C 2.0证实存在你说的问题。象scanf("i=%d j=%d",&i,&j);这样的输入方式比较特别,TC 2.0显然在第一次输入后没有象正常情况一样清楚输入缓冲区,这样第二次执行scanf时,程序并没有让你输入而是直接读入上次输入的结果。如果你一定要这么做,应该在scanf之前加上:fflush(stdin);这样清楚掉键盘缓冲区。