scanf用法解析
让我们直接看一个简单的例子:
#include<stdio.h>
int main()
{
int x=0;
scanf("%d",&x);
printf("%d",x);
return 0;
}
上面的例子读取一个数字,然后再把这个数字输出。注意,这个程序在开始时没有任何输出,直接等待输入,所以直接输入内容回车就好了。
运行的结果大概是:
12 <- 这是你的输入 12
12 <- 这是printf的输出
发生了什么?
scanf
函数有两个参数:一个是字符串"%d"
,另一个是x的地址&x
。
字符串里只有一个%d
,表示读取一个整数。scanf
做的事情就是把这个整数放进x里。
问题是什么算是一个整数呢?
如果你输入 1.234
会有什么结果?
答:输出会是1,因为 小数点.
并不是整数的一部分。所以只会读取小数点前面的内容。.234
仍然在等待你的读取。
scanf多参数输入
scanf本质上是一种格式化输入。
你输入的内容是否可以被读取取决于你的字符串。
以下面的scanf为例:
scanf("x=%d ",&x);
这次,你的字符串是 x=%d
.
和之前一样%d
表示一个整数,对应的内容会被读取到x中。但这次,%d
的前面多了一个x=
。你必须让你的输入和你的字符串匹配。
如果你输入 x=12
,x的值为12。而如果你直接输入12
,你就寄了,x将无法被正确赋值。
了解了这个,我们就可以开始尝试多参数输入了:
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
同样,这次你的字符串是%d %d %d
就意味着你需要输入三个整数,并以空格分隔。
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
这次你的字符串是%d,%d,%d
就意味着你需要输入三个整数,并以逗号分隔。
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
这次你的字符串是%d,%d,%d
就意味着你需要输入三个整数,这次的分隔符是中文逗号。(笑
新手在使用符号时一定要注意全角和半角。
int a,b,c;
scanf("a=%d,b-%d,c++%d",&a,&b,&c);
这个字符串看起来非常奇怪,但是我们不管那么多就按照格式来输入: a=12,b-1203,c++500
。
试试看吧,完整的代码就在下面了。
#include<stdio.h>
int main()
{
int a,b,c;
scanf("a=%d,b-%d,c++%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
试试其他的输入:
a=12,b--1203,c+++500
a=12,b-+1203,c++-500
上面多出来的加号和减号 实际上是整数的正负号。
各种基础类型的读取
这里只涉及常用的部分,全部内容请参阅 cppreference-scanf
%c
读取一个字符 ,存放类型是char
%s
读取一个字符串,直到遇到空白符 ,存放类型是char
数组%d
读取一个十进制,存放类型是int
%f
读取一个浮点数 , 存放类型是float
%lf
读取一个浮点数 , 存放类型是double
MSVC额外设置
如果你使用Visual Studio或者使用MSVC工具链。请关闭SDL检查。下面两个方法选择一个即可:
- 在文件开头添加
_CRT_SECURE_NO_WARNINGS
宏定义
#define _CRT_SECURE_NO_WARNINGS // 添加一个宏定义
#include<stdio.h>
int main()
...
- 配置vs项目设置:项目-> {项目名} 属性 -> 配置属性 -> C/C++ -> 常规 -> SDL检查 -> 否