C语言萌新如何使用scanf函数?
🐎作者的话
如果你搜索输入输出函数,那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的,作为一个萌新,哪懂这些?
本文介绍萌新在前期的学习中,常用的输入输出函数及其功能~
跳跃式目录
- 输入函数scanf介绍
- scanf的作用
- scanf参数解释
- 宽度参数
- 星号忽略符
- 输入格式问题
- scanf的返回值
- VS中如何使用scanf
输入函数scanf介绍
函数原型:int scanf(const char * str,地址1,地址2,地址3,地址…)
没错,这就是对于我们C语言新手来说的scanf函数原型,其第一个参数是一个const修饰的字符串,其他参数都是地址。
scanf的作用
scanf是用来输入数据的,你固然可以在代码的编辑器上输入数据,但是如果你在程序运行以后想要输入一个数据,那就需要用到scanf。
scanf参数解释
对于第一个参数字符串str,你既可以直接用双引号引着放到scanf里面,也可以用字符数组存储后放入数组的首地址,像这样:
int main()
{
char str[] = "12345";
scanf(str);
scanf("12345");
return 0;
}
这两种存放方法都是可以的。
但是,若想要输入数据,就要在str中加入控制符,其格式是一个%号加上1个或2个字母,比如说:%d,%u,%c等等;
每种字母都对应着你要输入不同类型的数据,详细请看下表:
%字母 | 类型 |
---|---|
%d | signed int |
%u | unsigned int |
%c | char |
%o | 八进制unsigned int |
%x(%X) | 十六进制unsigned int |
%s | 字符串 |
%p | 地址(指针) |
%hd | short |
%ld | long |
每多加一个控制符,就代表着你需要多一个变量来储存你输入的数据,而scanf后面的参数就是用来存储数据的变量的地址,像这样:
int main()
{
int a = 0;
char b = 0;
scanf("%d %c", &a, &b);
printf("%d %c", a, b);
return 0;
}
效果图:
可以看到,我把21和A分别放到a和b里面。
注意:不同类型的控制符是不同存储数据方式,比如说:如果你用%s读取一个int型的数据,那么计算机会把你输入的这个数据当成字符串来存储,像这样:
int main()
{
int a = 0;
scanf("%s", &a);
return 0;
}
效果图:
可以看到,我输入了123,而计算机把这一串当成字符串来处理,其中31,32,33分别是字符‘1’,字符‘2’,字符‘3’的ASCII码十六进制表示形式。
宽度参数
如果你在控制符的%和字母之间输入一个数字,这个数字决定了在读入数据时被允许读入的最大宽度,像这样:
int main()
{
int a = 0;
scanf("%5d", &a);
printf("%d", a);
return 0;
}
效果图:
可以看到,a里面只存储了12345。
星号忽略符
星号省略符(博主顾义思名起的名字),其作用是加上这个星号可以忽略一个字符的读入,像这样:
int main()
{
int a = 0;
int b = 0;
scanf("%*d %d", &a, &b);
return 0;
}
可以看到,第一个控制符里面加了星号,那么你在输入数据时第一个输入的数据就会被忽略。
效果图及详解:
我们输入12和13,其分别对对应第一个控制符和第二个控制符,第一个控制符读入了12,但是它被忽略了,于是下一个数据13就被读入了a里面,b因为没有被读入数据,所以还是原来的值。
输入格式问题
在输入时,除了把控制符换成数据以外,必须严格按照str的格式输入,像这样:
int main()
{
int age = 0;
scanf("my age is %d", &age);
return 0;
}
look,我在控制符之前加了一串字符串,那么在输入时,必须严格按照这一串来输入,即你必须把这一串在打一遍。
效果图:
- 上图是我们直接输入13,age的值并没有发生变化。
- 上图我们按照格式输入,age才有了变化。
这固然是有利有弊的,而且很明显弊大于利。
利: 比如有一堆同学,他们的学号都是2023开头的,那么读入数据的时候就可以在控制符前面加上一个2023,这样如果有2022级的学生输入学号时,就可以提示输入错误;亦或者你单纯地想让用户多打一点字,让小学生练习打字也许很不错。
弊: 这样加格式会让用户的输入更加繁琐,输入会变得不简洁。
scanf的返回值
开门见山,scanf的返回值就是正确读入数据的个数,像之前的代码:
int main()
{
int a = 0;
int b = 0;
int tmp=scanf("%*d %d", &a, &b);
printf("%d", tmp);
}
这里的第一个控制符读入的数据被我们忽略了,所以如果打印tmp,正确输入的数据应该只有一个。
其次,如果输入错误或输入文件结束符(Ctrl+z),则返回EOF(-1)。
VS中如何使用scanf
你在VS中使用scanf时可能会遇到这一串错误。
你可以使用scanf_s来替换scanf,不过要多加一个参数,表示数据占用的字节数。
这两者的区别仅仅在于安全性。
如果你想在VS中使用scanf,只需要在源文件第一行加入这一串:
#define _CRT_SECURE_NO_WARNINGS 1
这样就可以消除报错了。