scanfil,Scanfil code是什么意思( 二 )

scanf是C语言中的一个输入函数 , 与printf函数一样 , 都被声明在头文件stdio.h里 , 因此在使用scanf函数时要加上#include。(在有一些实现中 , printf函数与scanf函数在使用时可以不使用预编译命令#include。)它是格式输入函数 , 即按用户指定的格式从键盘上把数据输入到指定的变量之中 。scanf函数返回成功读入的数据项数 , 读入数据时遇到了“文件结束”则返回EOF 。scanf是一个输入函数 。例如int a;scanf("%d",&a);你在console输入:5那么a=5了8 , scanf函数的用法 scanf()是C语言中的一个输入函数 。scanf函数的用法与printf函数一样 , 都被声明在头文件stdio.h里 , 因此在使用scanf函数时要加上#include <stdio.h> 。(在有一些实现中 , printf函数与scanf函数在使用时可以不使用预编译命令#include <stdio.h> 。)它是格式输入函数 , 即按用户指定的格式从键盘上把数据输入到指定的变量之中 。扩展资料:使用scanf函数的注意问题:1、在高版本的 Visual Studio 编译器中 , scanf 被认为是不安全的 , 被弃用 , 应当使用scanf_s代替 scanf 。2、对于字符串数组或字符串指针变量 , 由于数组名可以转换为数组和指针变量名本身就是地址 , 因此使用scanf()函数时 , 不需要在它们前面加上"&"操作符 。3、 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数 , 表示任何读操作中的最大位数 。4、scanf函数中没有类似printf的精度控制 。如: scanf("%5.2f",&a); 是非法的 。不能企图用此语句输入小数为2位的实数 。5、scanf中要求给出变量地址 , 如给出变量名则会出错如 scanf("%d",a);是非法的 , 应改为scanf("%d",&a);才是合法的 。6、 在输入多个数值数据时 , 若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格 , TAB或回车作间隔 。C编译在碰到空格 , TAB , 回车或非法数据(如对“%d”输入“12A”时 , A即为非法数据)时即认为该数据结束 。7、在输入字符数据(%c)时 , 若格式控制串中无非格式字符 , 则认为所有输入的字符均为有效字符 。参考资料来源:搜狗百科-scanf (计算机语言函数)#include <stdio.h>void main(){ char c1,c2,c3,c4,c5,c6; scanf("%c%c%c%c",&c1,&c2,&c3,&c4); c5=getchar(); c6=getchar(); putchar(c1); putchar(c2); printf("%c%c\n",c5,c6);}/*作为一位编程人员 , 指出你所写的程序中的一个问题 。在书写代码时 , 要在半角字符下书写 。不要在全角字符下写 , 虽然调试时可以改正 , 但显得自己资历浅 。首先 , 了解下putchar,getchar表示的意思和作用 。putchar函数(字符输出函数)的作用是向终端输出一个字符 。一般格式为:putchar(c)getchar函数(字符输入函数)的作用是从终端(或系统隐含指定的输入设备)输入一个字符 。****getchar函数没有参数****一般格式为:getchar()当你从键盘输入123回车时 , 回车符也算入了字符的范围 , 就是c4为回车符 , 由于c5和c6还各自等待接受从键盘输入的一个字符 。所以在输入123回车时不会直接输出12 , 一直等到接受了c5和c6就依次打印出1245注意putchar只能向终端输出一个字符 , getchar只能接受一个字符,虽然第一次输入了123和回车符 , 但是:putchar(c1); putchar(c2);只能输出12两个字符 。虽然第二次输出了45678和回车符 ,  但是:c5=getchar(); c6=getchar(); 只能接受45.所以输出1245了 。*/1.scanf函数的一般形式 scanf(格式控制 , 地址表列) int scanf(char *format[,argument,...]); “格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列 , 可以是变量的地址 , 或字符串首地址 。scanf()函数返回成功赋值的数据项数 , 出错时则返回eof 。例题 scanf函数输入数据 。#include<stdio.h> void main(){ int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); } 格式字符 说明 %a 读入一个浮点值(仅c99有效) %a 同上 %c 读入一个字符 %d 读入十进制整数 %i 读入十进制 , 八进制 , 十六进制整数 %o 读入八进制整数 %x 读入十六进制整数 %x 同上 %c 读入一个字符 %s 读入一个字符串 %f 读入一个浮点数 %f 同上 %e 同上 %e 同上 %g 同上 %g 同上 %p 读入一个指针 %u 读入一个无符号十进制整数 %n 至此已读入值的等价字符数 %[] 扫描字符集合 %% 读%符号 附加格式说明字符表修饰符 说明l/l 长度修饰符 输入"长"数据 h 长度修饰符 输入"短"数据 w 整型常数 指定输入数据所占宽度 * 星号 空读一个数据 hh,ll同上h,l但仅对c99有效 。(b) 空白字符空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符 , 空白符可以是space,tab,newline等等 , 直到第一个非空白符出现为止 。(c) 非空白字符一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符 。其他关于scanf的应用可以到下地址看, <a href="http://wenwen.soso.com/z/urlalertpage.e?sp=shttp%3a%2f%2fbaike.baidu.com%2fview%2f1390039.htm" target="_blank">http://baike.baidu.com/view/1390039.htm</a>功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数 , 它从标准输入设备(键盘) 读取输入的信息 。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式 。其调用格式为:scanf("<格式化字符串>" , <地址表>);scanf()函数返回成功赋值的数据项数 , 出错时则返回EOF 。其控制串由三类字符构成:1 。格式化说明符; 2 。空白符; 3 。非空白符;(A)格式化说明符格式字符说明%a读入一个浮点值(仅C99有效) %A同上 %c读入一个字符 %d读入十进制整数 %i读入十进制 , 八进制 , 十六进制整数 %o读入八进制整数 %x读入十六进制整数 %X同上 %c读入一个字符 %s读入一个字符串 %f读入一个浮点数 %F同上 %e同上 %E同上 %g同上 %G同上 %p读入一个指针 %u读入一个无符号十进制整数 %n至此已读入值的等价字符数 %[]扫描字符集合 %%读%符号D123<回车> 后c1==1,c2==2,c3==3,c4==10(回车)之后c5=getchar();会把输入缓冲区的一个字符赋值给C5,所以c5=4c6=getchar();由于输入缓冲区不为空 , 所以会自动取一个字符赋值给C6 , 所以c6=5Dputchar(c1);输出1putchar(c2);输出2c5=getchar();输入4c6=getchar();输入5printf("%c%c\n" , c5 , c6);输出4 59 , scanf中的格式字符i的用法 )的数据都是以ASCII码存储的(包括回车) 。程序1#include "stdio.h"void main(){ char a; char b; scanf("%d",&a); scanf("%d",&b); printf("%d %d",a,b);}键盘输入97<回车>第一次回车后 , buffer中的ASCII:39h,37h,0AH(0A是换行的ASCII) ,  scanf会根据格式字符串中的第一个%d对buffer按字节顺序读取 , 当读取到0A时 , 认为%d型的数据结束 , 此时把已经读取到的39h,37h依据%d转为整型数据97存储在字符型变量a中 。(这里是除去了扫描截止点0AH)此时buffer中已经无任何数据了 。96<回车>第二次回车后 , 按同样的流程 , scanf会根据格式字符串中的第二个%d对buffer按字节顺序读取 。最终b得到96.此时buffer中已经无任何数据了 。输出97 96程序2#include "stdio.h"void main(){ char a; char b; scanf("%c",&a); scanf("%c",&b); printf("%d %d",a,b);}键盘输入9<回车>buffer:39H , 0AH因为scanf会按照第一个%c格式扫描buffer(只扫描一个字节就结束) , 然后把扫描到的39H直接送到变量a(当以%d格式读出来时 , 39H就是57)此时 , buffer中只有:0AH 。然后 , scanft又遇到第二个%c , 继续扫描buffer , 得到0aH并送入变量b.此时buffer中已经无任何数据了输出57 10程序3#include "stdio.h"void main(){ char a[100]; char b[100]; scanf("%s",a); scanf("%s",b); printf("%s %s",a,b);}键盘输入abc<回车>第一次回车后 , buffer:61H , 62H , 63H , 0AH 。scanf会按照%s的格式对buffer按字节顺序扫描 , 当扫描到0AH时 , 结束扫描(按照%s的要求 , 空格20H也是扫描结束点) 。然后把扫描到的(除去最后一个判断扫描截至的字节0AH)数据直接送入以a为起始地址的字符串 。此时 , buffer无任何数据了 。def<回车>第二次回车后 , buffer:65H,66H,67H,0AH.扫描的流程与上面的完全一致 。输出abc def程序4#include <stdio.h>void main(){ int i; char j; for(i=0;i<2;i++)scanf("%c",&j);/*注意这里%前没有空格*/ printf("%d",j);}键盘输入1<回车> , 这里scanf执行了两次(i==0时 , 与i==1时) , 而且每次都是想对j赋值 。第一次scanf,按%c的要求 , 只扫描buffer中的一个字节,但是buffer中并不数据 , 于是要求键盘输入数据到buffer , 此时的1<回车>代表向buffer中输入了:31H,0AH 。然后按%c的要求 , 只扫描buffer中的一个字节:31h,并将它直接送入变量j.此时 , buffer中还留下:0AH 。第二次scanf要求键盘输入数据 , 按%c的要求 , 只扫描buffer中的一个字节:0Ah,并将它直接送入变量j.此时 , buffer无数据了 。最后 , 你用%d格式输出j的值(0AH换成整型就是10)输出10程序5#include <stdio.h>void main(){ int i; char j; for(i=0;i<2;i++)scanf(" %c",&j);/*注意这里%前有一个空格*/ printf("%d",j);}1<回车>2<enter>的情况:scanf会按照格式控制字符串的要求 , 顺序扫描buffer.但是你其中有一个空格 , 这个很特殊 , 我也是第一次发现这个问题(一般我都不会在scanf中加入任何常量字符)我测试了一下:我发现这个空格有吸收回车(0AH)和空格(20H)的“神奇功效” , 吸收之后再要求buffer给一个字节 , 直到这个字节不是0AH或者 20H , 此时把这个字节交给下一个格式字串 。第一次循环时遇到格式字串空格 , 就扫描buffer中的一个字节 , 但是buffer中无数据 , 要求从键盘输入数据:1〈回车〉 , buffer中有数据了——31H , 0AH 。再读取到字节31H , scanf发现这个并不是0AH/20H , 就把这个字节31H交给格式字符%c处理 。循环结束 , 此时buffer里面还有:0AH.第二次循环时遇到格式字串空格 , 就扫描buffer中的一个字节——0AH , 发现是0AH/20H , 于是就要求buffer再来一个字节 。此时buffer里面已经没有数据了 , 要求键盘输入:2<enter>.buffer中有数据了——32H , 0AH 。于是再读一个字节31H , scanf发现这个并不是0AH/20H , 就把这个字节32H交给格式字符%c处理(j最终得到32H) 。循环结束 , 此时buffer里面还有:0AH.这里有一篇关于Printf的帖子:程序6#include "stdio.h"void main(){ int a; int b; scanf("%c",&a); scanf("%c",&b); printf("%d %d",a,b);}键盘输入1<回车>问题5:你的编译器VC认为%d数据应该是4个字节 , 但是你采用的是%c读数据 ,  scanf("%c",&a);此句读到的是1的ascii码:31h.然后把31H直接送入地址&a(而并没有改写a的三个高字节地址) 。scanf("%c",&b);同理 。你可以用printf("a=%x,b=%x\n",a,b);来验证我说的 。它们的最低字节肯定是31H , 0AH 。PS1:当你把 int a;int b;放在main()外进行定义时 , a,b的初值就是0 。此时你会得到正确的结果 。当你把 int a;int b;放在main()内进行定义时 , a,b不会被初始化(它们的三个三个高字节地址的内容是不确定的) , 你就会得到上面错误的结果 。(定义的动态变量都不会被初始化 , 静态变量会被初始化为0)PS2:以下也是不正确的用法 。char c;scanf("%d",&c);/当你用%d给c赋值时 , 会对从&c开始的连续4个字节进行赋值 。当从buffer得到的值是在一个字节范围内(-128~127) , 下面是可以正常输出的 。但是不管怎样 , 这样做是很危险的——越界 。printf("%d",c);=================请你测试下这个程序========================#include "stdio.h"void main(){char c[4],i=4;scanf("%d",c);/*请输入258<回车>*/while(i-->0)printf("%02x ",c[i]);printf("\n");}/*如果得到的结果是00 00 00 01 02就说明我的结论是正确的(258的转为16进制数就是00 00 01 02H , 然后scanf会把这个数放入以c为起始地址的) ================以下程序也是======================#include "stdio.h"void main(){char c,i=4;char *p=&c;scanf("%d",&c);/*请输入258<回车>*/while(i-->0)printf("%02x ",p[i]);printf("\n");}输出表列) 例如:printf("i=%d,ch=%c\n",i,ch);说明:(1)“格式控制”是用双撇号括起来的字符串 , 也称“转换控制字符串” , 它包括两种信息:①格式说明:由“%”和格式字符组成 , 它的作用是将输出的数据转换为指定的格式输出 。②普通字符 , 即需要原样输出的字符 。(2)“输出表列”是需要输出的一些数据 , 可以是表达式(3)printf函数的一般形式可以表示为printf(参数1 , 参数2 , …… , 参数n)功能是将参数2~参数n按参数1给定的格式输出2.格式字符(9种)(1)d(或i)格式符 。用来输出十进制整数 , 有以下几种用法:①%d , 按整型数据的实际长度输出 。②%md , m为指定的输出字段的宽度 。如果数据的位数小于m , 则左端补以空格 , 若大于m , 则按实际位数输出 。③%ld(%mld 也可) , 输出长整型数据 。例如:long a=123456;printf("%ld",a);(2)o格式符 , 以八进制数形式输出整数 。格式:%o , %mo,%lo , %mlo都可 。(3)x(或X)格式符 , 以十六进制数形式输出整数 。格式:%x , %mx,%lx , %mlx都可 。(4)u格式符 , 用来输出unsigned型数据 , 即无符号数 , 以十进制数形式输出 。格式:%u , %mu,%lu都可 。参见:li4-3.c/*无符号数据的输出*/(5)c格式符 , 用来输出一个字符 。格式:%c , %mc都可 。(6)s格式符 , 用来输出一个字符串 。格式:%s , %ms,%-ms , %m.ns , %-m.ns都可 。参见:li4-5.c/*字符串的输出*/(7)f格式符 , 用来输出实数(包括单、双精度) , 以小数形式输出 。格式:%f , %m.nf , %-m.nf都可 。注意:单精度实数的有效位数一般为7位 , 双精度为16位 。参见:li4-6.c/*输出单精度实数时的有效位数*/li4-7.c/*输出双精度实数时的有效位数*/li4-8.c/*输出实数时指定小数位数*/(8)e(或E)格式符 , 以指数形式输出实数 。格式:%e , %m.ne , %-m.ne都可 。(9)g(或G)格式符 , 用来输出实数 , 它根据数值的大小 , 自动选f格式或e格式(选择输出时占宽度较小的一种) 。3.说明(1)除了X、E、G(用大写字母表示)外 , 其他格式字符必须用小写字母;(2)“格式控制”字符串内可以包含转义字符;(3)如果想输出字符“%” , 则应该在“格式控制”字符串中用连续两个%表示 , 如:printf("%f%%",1.0/3);scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Dennis M.Ritchie的“hello,world”程序基本上是所有的C语言学习者第一个范例) , 所以scanf()函数应当是C学习者能熟练运用的一个函数 , 但有很多初学者对此函数不能很好的运用 , 在实际编程中错误使用scanf()函数 , 导至程序产生某种错误不能正常运行 , 以至产生“scanf()函数有BUG” , “scanf()函数无用论”等等错误观点 。本文结合笔者在编程实践中及论坛上网友所遇到的问题作一释疑 , 但笔者水平有限(菜鸟级) , 难免有谬误之处 , 还望达人指点一二 。(Email:knocker.k@126.com)本文分上 , 下两篇讲述了C语言中的scanf()函数的用法 , 重点阐述使用scanf()函数过程中出现的常见错误及对策 。当然 , 文中某些解决方法 , 均可以采用其他函数和方法来更好地解决 , 但本文仅限讨论scanf()函数本身 。上篇 , 详细介绍了scanf()函数控制串的构成 。下篇 , 用实际例程介绍scanf()函数控制串运用出现的常见错误及对策技巧 。二、scanf()函数的控制串函数名: scanf 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数 , 它从标准输入设备(键盘) 读取输入的信息 。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式 。其调用格式为:scanf("<格式化字符串>" , <地址表>);scanf()函数返回成功赋值的数据项数 , 出错时则返回EOF 。其控制串由三类字符构成:1 。格式化说明符;2 。空白符;3 。非空白符;(A)格式化说明符格式字符说明%a读入一个浮点值(仅C99有效) %A同上%c读入一个字符%d读入十进制整数%i读入十进制 , 八进制 , 十六进制整数%o读入八进制整数%x读入十六进制整数%X同上%c读入一个字符%s读入一个字符串%f读入一个浮点数%F同上%e同上%E同上%g同上%G同上%p读入一个指针%u读入一个无符号十进制整数%n至此已读入值的等价字符数%[]扫描字符集合%%读%符号附加格式说明字符表修饰符说明L/l 长度修饰符输入"长"数据h 长度修饰符输入"短"数据W 整型常数指定输入数据所占宽度* 星号空读一个数据 hh,ll同上h,l但仅对C99有效 。(B)空白字符 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符 , 空白符可以是space,tab,newline等等 , 直到第一个非空白符出现为止 。(C)非空白字符 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符 。ctrl+z可以使scanf返回eof楼上胡扯 , 楼上的楼上胡扯 。cout<<"输出个字符串有什么问题??"<

推荐阅读