scanf函数可以说是我们一开始就会接触的函数了,但在最近复习时我又找到而来一些之前不甚了解或是块要遗忘的知识,特作此篇。
我们之前提到了scanf返回值被忽略的问题:
那么scanf的返回值到底是什么呢
翻译:
scanf返回成功转换和分配的字段数;返回值不包括已读取但未分配的字段。返回值为0表示没有分配任何字段。如果在第一次尝试读取字符时发生错误,或者遇到文件结束字符或字符串结束字符,返回值为EOF。
由此我们可以知道,他返回的就是实际读取并成功赋值的变量数量,举个例子
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a;
char b;
char* c[5];
printf("%d",scanf("%d %c %s", &a, &b, c));
return 0;
}
可以看到,返回值是3
没有读取任何项:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a;
printf("%d",scanf("%d", &a));
return 0;
}
输入a,%d占位符不会读取进去,并且程序会立即终止,所以返回值是1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a;
printf("%d",scanf("%d", &a));
return 0;
}
我们只需要连着按三次ctrl+z即可,至于为什么是三次,这是vs的一个小问题,搬来正常情况是按一次就行的。,EOF是个宏定义,它就是-1
ok,解决了返回值的问题之后我们再来看看占位符,
1.%d? ?对应整形? ? ? ? ? ? %c对应字符? ? ? ? ? ? ? ?%s对应字符串? ? ? ? ? ? ? ? ? ? ?%f单精度浮点数? ? ? ? ?%lf双精度浮点数
2.%hd? 对应十进制的short?int? ? ? ? ? ?%ho对应八进制的short?int? ? ? ? %hx对应十六进制的short?int
%hu? 对应unsigned?short int
3.%ld?十进制long int? ? %lo? 八进制long?int? ? ? %lx? ?十六进制long?int? ? ? ?%lu? unsigned?long?int
4.%lld十进制的long?long?int? ? ? ? ?%llo八进制的long?long?int? ? ? ? ? ? %llx?十六进制的long long? int
%llu? long?long?unsigned?int
5.%o?八进制int? ? ? ? ?%x十六进制int? ? ? ? ? ? %zd? ? size_t
%g:6个有效数字的浮点数,整数部分超过刘伟后就会自定转化为科学计数法,且指数部分为小写e
%G:与%g相同,但指数部分为大写G。
%e:使用科学计数法的附带念书,指数部分e小写,
%E:与%e一样,但指数部分E大写。
%le?科学计数法表示的long?double
他是一个赋值忽略符,该占位符不会将解析而后的值放入对应变量中,而是直接丢弃
举例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a;
scanf("%*d%d", &a);
printf("%d", a);
return 0;
}
可以发现,我们先输入的3不见了,而后输入的2则被用于给a赋值
[]内指定一组字符,遇到不在集合中的字符时读取结束,这里就要引入“^”了,在这里^表示”非“,
举例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
char a[10];
scanf("%[^\n]", a);
printf("%s", a);
return 0;
}
可以发现,此次读取是到回车才停下来的,[^\n]表示的也正是非回车,基于此我们可以更为便捷的调用scanf函数。
ok今天关于scanf函数的分享就到这里了,觉得有用的话就点个免费的赞支持一下吧。