C语言扫描输入函数 c语言扫描器

C语言中的键盘输入函数。。。

k=k0xff?0x00ff:k8;其实就是

创新互联是一家集网站建设,凤冈企业网站建设,凤冈品牌网站建设,网站定制,凤冈网站建设报价,网络营销,网络优化,凤冈网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

if(k0xff) {

k=0x00ff;

}else {

k=k8;

}的简写。

其实0xff和0x00ff是一样的,都表示同一个十六进制的值。

书上这么写,没有错;至于为什么,就不好说了。

可能是让你多学点知识,也可能是现在很多书其实在编写时并不是很认真的。毕竟尽信书不如无书!

后面的k8是把0xff的值右移8位,达到计算的目的(具体什么目的要看具体内容)

C语言:关于scanf函数输入问题

你首先要明白,从键盘读入键盘缓冲区(buffer)的数据都是以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;i2;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;i2;i++)

scanf(" %c",j);/*注意这里%前有一个空格*/

printf("%d",j);

}

1回车2enter的情况:

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里面已经没有数据了,要求键盘输入:2enter.

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");

}

C语言的scanf语句格式

例:使用scanf函数输入数据。

#include stdio.h

int main(void)

{

int a,b,c;

printf("Give me the value of a,b,c seperated with whitespaces:\n");

scanf("%d%d%d",a,b,c);

printf("a=%d,b=%d,c=%d\n",a,b,c);

return 0;

}

a,b,c中的是寻址操作符,a表示对象a在内存中的地址 [3]  ,是一个右值。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。

这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔。

只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。

(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include stdio.h。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反。

扩展资料:

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


本文名称:C语言扫描输入函数 c语言扫描器
标题路径:http://scyanting.com/article/dojedsd.html