C语言学习笔记(六)输入函数scanf
前言:
由于对C语言的理解不够深刻,且距离上次学习C语言的时间过于“久远”,所以本人准备重新开始学习C语言。
那么刚好借这个机会,既向大家分享我的学习笔记,同时又能监督我自己去努力学习这门语言,为将来从事嵌入式行业打下基础!!
学习C语言是很漫长的,要重新整理一遍学习的内容更是反复且枯燥的。但不积跬步,无以至千里,没有什么事情是一蹴而就的,我们要学会沉下心来,一起努力,一起期待未来!!
今天的笔记主要是围绕认识与运用输入函数:认识输入函数scanf的结构,函数scanf的转换规范,使用函数scanf注意事项,函数scanf的运用。
目录
输入函数scanf
输入函数scanf的格式
scanf函数的一般格式为:scanf(“格式化字符串”,需要输入的变量)
函数原型:
#include <stdio.h> int scanf(const char *format, ...);format 参数:
format 参数是一个格式化字符串,由格式化占位符和普通字符组成。
格式化占位符(以 % 开头)用于指明输出的参数值如何格式化。... 附加参数:
附加参数的个数由格式化字符串决定。
每个参数均为一个存储空间,并与面格式化字符串中占位符的类型和位置一一对应。
如果是一个普通的变量名,应在其变量名前边加上 & 符号。
函数scanf的转换规范
按照字符串形式输入
当我们使用输入函数scanf在对不同数据类型进行输入时,需要按照第一个字符串的形式进行输入,否则字符串找不到第一个参数进行匹配,找不到需要转换的部分,也就无法得到正确结果:
当字符串中格式占位符用空格隔开时,输入时需要加入空格进行分割
#include "stdio.h" char c; short hd; int d; long ld; long long lld; void main() { scanf("%c %hd %d %ld %lld", &c, &hd, &d, &ld, &lld); printf("%c %hd %d %ld %lld", c, hd, d, ld, lld); }
当字符串中格式占位符用逗号隔开时,输入时需要加入逗号进行分割
一般不建议这么分割,逗号分半角和全角,这会加大程序结果运行错误的可能。
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include "stdio.h" char c; short hd; int d; long ld; long long lld; void main() { printf("输入的值 "); scanf("%c,%hd,%d,%ld,%lld", &c, &hd, &d, &ld, &lld); printf("返回的值 "); printf("%c %hd %d %ld %lld", c, hd, d, ld, lld); }
按照转换类型与数量输入
当我们使用输入函数scanf在对不同数据类型进行输入时,需要注意前后的对应关系,不仅是转换类型的写法,其数量也需要与后续的参数类型和数量一一对应。
char c; short hd; int d; long ld; long long lld; scanf("%c %hd %d %ld %lld", &c, &hd, &d, &ld, &lld); printf("%c %hd %d %ld %lld", c, hd, d, ld, lld);在示例代码中,%c对应字符型c、%hd对应短整型hd、%d对应整型d、%ld对应长整型ld、%lld对应加长整型lld。
判断不同类型是否加&
当我们使用输入函数scanf在对不同数据类型进行输入时,函数scanf首先会将输入的字符串按照对应的转换类型进行转换,转换完成后的二进制,将依次存放到后续参数所输入的变量地址当中。
变量:函数scanf将转换后的二进制存储到基本变量当中,直接在变量名前加&。
字符数组:函数scanf将字符串逐一存储到字符数组中,就不用加&。
#include "stdio.h" char c; char str[8]; void main() { printf("输入的值 "); scanf("%c %s", &c, str); printf("返回的值 "); printf("%c %s\n", c, str); }
使用函数scanf注意事项
避免输出与转换类型不匹配
#include "stdio.h" float f; void main() { printf("输入的值 "); scanf("%f", &f); printf("返回的值 "); printf("%lld\n", f); printf("返回的值 "); printf("%f\n", f); }
在示例代码中,该字符串与格式占位符%f进行匹配,将转换后的值保持在变量f中,使用不匹配的格式占位符%lld输出格式输出了错误的值,使用匹配的格式占位符%f输出格式输出了正确的值。
避免输入大于转换类型取值范围
#include "stdio.h" char c; void main() { printf("输入的值 "); scanf("%c", &c); printf("返回的值 "); printf("%d\n", c); }
在示例代码中,该字符串与格式占位符%c进行匹配,将转换后的值保持在变量c中,然后我们输入了超出%c转换类型的取值范围(-127~128)的300时,就输出了错误的值。
避免后置参数取值范围小于转换结果
#include "stdio.h" short hd; void main() { printf("输入的值 "); scanf("%d", &hd); printf("返回的值 "); printf("%d\n", hd); }
在示例代码中,该字符串与格式占位符%d进行匹配,将转换后的值保持在变量hd中,然后我们输入了超出了后置参数short的取值范围(-32767~32768)的65535时,就输出了错误的值。
函数scanf的运用
当我们了解了输入函数scanf的基本原理,以及其函数的转换规范和使用的注意事项,就可以运用该函数完成以下功能:
输入两个字符对比,输出对应ASCII码表序号,并判断是否互为大小写字母
#include "stdio.h" char a; char b; void main() { printf("请输入第一个字母 "); scanf("%c",&a); printf("字母 %c 对应ASCII码表序号为%d\n",a,a); printf("请输入第二个字母 "); scanf("%c", &b); printf("字母 %c 对应ASCII码表序号为%d\n", b, b); }
在示例代码中,当我们输入第一个字母后,能正确输出第一个字母的ASCII码表序号。然而想继续输入第二个字母时,却自动的弹出没有经过操作的字母。
原因:编译器会自动认为回车字符作为你第二个字母,而在ASCII码表中值为10的字符正是回车字符\n。
解决方法:我们可以利用getchar()函数,函数的功能是读取一个字符。当缓冲区中没有字符可以读取时,getchar()会等待我们输入一个字符,然后在缓冲区中进行读取。
修改后的代码就可以进行正常输入
#include "stdio.h" char a; char b; void main() { printf("请输入第一个字母 "); scanf("%c",&a); printf("字母 %c 对应ASCII码表序号为%d\n",a,a); getchar(); printf("请输入第二个字母 "); scanf("%c", &b); printf("字母 %c 对应ASCII码表序号为%d\n", b, b); }
再加入简单的if判断语句
#include "stdio.h" char a; char b; void main() { printf("请输入第一个字母 "); scanf("%c",&a); printf("字母 %c 对应ASCII码表序号为%d\n",a,a); getchar(); printf("请输入第二个字母 "); scanf("%c", &b); printf("字母 %c 对应ASCII码表序号为%d\n", b, b); if (a >= 97 && a <= 122) { if(b == a - 32) printf("第二个字母 %c 为第一个字母 %c 的大写字母\n", b, a); else if (b == a) printf("第二个字母 %c 与第一个字母 %c 相同且都为小写字母\n", b, a); else printf("第二个字母 %c 不为第一个字母 %c 的大写字母\n", b, a); } else if (a >= 65 && a <= 90) { if (b == a + 32) printf("第二个字母 %c 为第一个字母 %c 的小写字母\n", b, a); else if (b == a) printf("第二个字母 %c 与第一个字母 %c 相同且都为大写字母\n", b, a); else printf("第二个字母 %c 不为第一个字母 %c 的小写字母\n", b, a); } }
更多推荐










所有评论(0)