scanf
来源:互联网 发布:洛阳广电网络客服电话 编辑:程序博客网 时间:2024/05/17 06:07
素月的博客
scanf
(2012-05-03 15:31:24)c语言学习
分类: 零碎笔记转换说明
意义
%c
把输入解释成一个字符
%d
解释成一个有符号十进制数
%e,%f,%g,%a
浮点数(%a是C99的标准)
%E,%F,%G,%A
浮点数(%A是C99的标准)
%i
有符号十进制数
%o
有符号八进制数
%x,%X
有符号十六进制整数
%p
一个指针
%s
一个字符串:输入内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u
无符号十进制整数
示例1:
char name[5];
scanf("%s",name);
printf("%s\r\n",name);
printf("sizeof(name)=%d, strlen(name)=%d\r\n",sizeof(name),strlen(name));
1、scanf把一个字符串读到一个字符数组时,不要用&(也可以加)。格式如下:
char name[5];
scanf("%s",name]);
注意,如果使用数组下标输入单个字符,则必须使用地址符号,如
char name[5];
scanf("%c",&name[1]);
2、scanf使用空格、制表符和换行符来判断是否结束输入,而不是以数组长度来判断,例如我们输入的abcdefg,会被全部读入。
3、scanf用%s输入时,会自动在后面加上'\0',使其成为一个字符串,即使输入的字符数超过数组大小。strlen(name)是从第一个字符开始,到'\0'结束,strlen统计字符数(不含'\0')。
附注:用%s读入字符串时,有两种方法停止输入:第一种就是空白符,遇到空白符,就会停止输入;第二种就是使用字段宽度,例如s,那么就最多读入10个字符,当然,如果还未够10个字符就已经遇到了空白符,那也要结束读入,10只是一个最大值。
示例2:
char name[5];
char name2[5];
char ps;
scanf("%s",name);
//if(scanf("%c",&ps)) //标记1
if(scanf("%s",name2))
printf("Hee\n");
注释掉标记1,保留标记2,运行时,输入aa,按回车键,系统会显示要我们继续输入;
注释掉标记2,保留标记1,运行时,输入aa,按回车键,系统不会要我们输入,而是会打印出Hee
程序说明:
4、scanf输入时,会从第一个非空白字符开始读入(唯一的例外就是%c),直到再次遇到空白字符时结束,前面的空白字符被丢弃,但后面的空白字符不会丢弃(也就是说%s实际上读入的是一个单词)。
所以,保留标记2运行时,先是对name进行输入,这时回车键会留在输入流。执行语句if(scanf("%s",name2))时,会忽略掉这个回车符,要求我们重新输入。
5、scanf按%c输入时,所有输入字符都是平等的,即使是空白字符,也会读入,且只读取一个,剩余的仍然留在输入流。也正是因为它什么字符都能读入,所以它的用途很多。
6、scanf如果遇到错误的输入,不会将它丢弃,而是将它留在输入队列,因此,如果下次再有一个读入操作时,就会从它们开始。
示例3:
int age1,age2;
scanf("%d",&age1);
printf("age1=%d\n",age1);
scanf("%d",&age2);
printf("age2=%d\n",age2);
输入-+12-3,输出
age1=2
age2=12
程序说明:
7、用%d,它会从第一个非空白字符开始读入,
1)如果是数字,直接读入即可。
2)如果是符号,则保存该符号,继续读取下一个字符:
Ø
Ø
3)如果是其它字符(既不是空白,也不是数字或+、-符号),将不会读入任何信息,且该字符会被返回到输入流。在本示例中,如果第一个非空白字符输入的是A,则两个scanf语句都不会读入任何信息,且A仍留在输入流中。
现在来看本示例:
(1)两个变量因为是自动变量,所以不会初始化,但由于已经分配内存,所以当前值就是原先存在该内存中的值。
(2)执行scanf("%d",&age1);时,首先读入的是-,系统会暂时保存这个符号,接着读取下一个符号,+,因为不是数字符号,所以-会被丢掉,+被返回输入流。
printf("age1=%d\n",age1);此时打印的是一个垃圾值(上面是2)。
(3)执行scanf("%d",&age2);时,首先读取的是原先留在输入流中的+,然后读取下一个字符,是12,所以age2就被赋予了12.
printf("age1=%d\n",age1);打印出age2=12
8、使用其它数字说明符与使用%d的情况相同,主要区别就是scanf也许会把更多的字符看做数字符号。例如,使用%x,要求输入十六进制数字,那么a到f和A到F都会被当成数字符号。而浮点说明符则要求scanf识别小数点、指数计数法、新的p计数法。
scanf连续输入
示例4:
char age1,age2;
scanf("%c, %c",&age1,&age2);
如果逗号(或任何非空格字符)和第一个%c之间没有间隔,则输入时,第一个字符与逗号之间也不能有间隔;如果有空格,则输入时,第一个字符和逗号之间可以有任意多个字符,也可以是0个。
如果逗号和第二个%c之间没有间隔,则逗号和第二个输入字符间也不能有间隔。如果有空格,则输入时,第二个字符和逗号之间可以有任意多个字符,也可以是0个。
示例5:
int age1,age2;
scanf("%d ,%d",&age1,&age2);
如果逗号和第一个%d之间有空格,则输入的第一个数字和逗号之间可以有任意(含0)个空格;
如果逗号和第一个%d之间没有空格,则输入的第一个数字和逗号之间不能有空格;
逗号和第二个%d之间无论是否有空格,输入时,逗号和第二个数字之间都可以有任意(含0)个空格。这点和%c不同。
示例6
int age1;
char pet1;
scanf("%c ,%d",&pet1,&age1);
根据示例4和示例5可以推出来:
Ø
Ø
示例7
int age1;
char pet1;
scanf("%d , %c ",&age1,&pet1);
根据示例4和示例5可以推出来:
因为%d在逗号前面,所以,如果它们之间有空格,则输入时可含任意(含0)个空格;如果没有空格,则输入时也不能含空格;
逗号和%c之间,如有空格,则逗号和字符之间可以有任意(含0)个空格,如果没有空格,则不能含空格;
总结:
1)当格式符是%c时,不管逗号是在前还是在后,都遵循一条规则:如果彼此之间有空格,则输入时可含任意(含0)个空格,否则不能含空格;
2)如果是其它格式符(不限于%d),则:
Ø
Ø
补注:
scanf("%c%d",&pet1,&age1);
不管%c和%d之间是否有空格,第一个字符(注意,%c什么字符都能读入)和第一个数字之间都可以含任意(含0)个空格。
scanf("%d%c",&age1,&pet1);
如果%d和%c之间有空格,则第一个数字输完之后,中间可以有任意个字符,然后再是数字;
如果没有空格,则数字输完之后必须马上输入字符,如果有空格的话,第一个空格将被作为输入赋给pet1。
(注意,第一个数字之前可以有任意个空白,都不会被读入。)
其实%c之所以特别,就是因为%c对待所有字符都平等。所以在%c之前,如果没有空格,那么在输入时,如果输入空格,空格就会作为输入被读取;如果%c之前有空格,那就是告诉系统,我们只读取非空白字符(不限于空格),所以,所有非空白字符都被跳过丢弃。
注意,这跟%c前面有没有其它格式符或其它符号都无关,例如
scanf("%c%d",&pet1,&age1);
如果我们在%c前面留空格scanf("
对于其它格式符,因为它会自动跳过空白字符,所以,不管前面是否有空格,输入时,都可有空白字符。
对于这一块就要记住两点:
1、%c的非%c的规则;
2、格式说明符里所有非空格的字符,如果是在格式说明符前面,遵循第一条;如果是在格式说明符后面,则,不管格式说明符是不是%c,规则都一样:如果有空格,就可以输入任意多个空白字符,否则,不能含空白字符。
补充:
scanf连续输入字符时,可能出错,因为第一个scanf需要按下回车键才能读入,但是读入后,这个回车键还在输入流里,所以,如果下一个scanf还是读入字符,就会把这个回车键读进去。
但是如果第二个scanf是读入其它类型,就不用担心,因为除了%c外,用其它格式读取输入,都会跳过前面所有空白字符,所以第一个scanf留下的回车键会被丢弃。
登录名: 密码: 找回密码 注册
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
- scanf
- scanf()
- scanf
- scanf
- scanf
- scanf
- scanf
- scanf
- scanf()
- scanf
- scanf
- scanf
- scanf
- scanf
- scanf
- scanf
- scanf()
- scanf
- Linux内核同步机制之(七):RCU基础
- cannot verify client.(3000)
- java设计模式(五)--策略模式
- badusb(一)环境配置
- IOS C语言 函数
- scanf
- noip2015pj t4
- Mybatis判断int类型是否为空
- badusb_payload(一)添加管理员用户
- PHP基础--变量
- 同步集合
- C#图像设计practice
- MStar之公司简介
- 南大软院大神养成计划--网站