C 输入语法
在 C 语言中,我们可以使用 scanf() 函数来输入一个内容。scanf() 的作用非常简单,用一句话来说就是:通过键盘输入内容,来给某一个变量赋值。
语法:
scanf(格式符, &变量名)说明:
scanf() 接收 2 个参数,第 1 个参数是 “格式控制字符串”,用于指定输入数据的格式。第 2 个参数是 “变量的地址”。“&” 是取地址符,比如 “&a” 就表示取变量 a 的地址。
提示: scanf 是 “scan format(格式化输入)” 的缩写。
示例 1:C 输入一个值
#include <stdio.h>
int main(void)
{
int a = 100;
int b;
scanf("%d", &b);
int sum = a + b;
printf("%d", sum);
return 0;
}分析:
当我们编译代码之后去运行代码,此时会发现 VSCode 终端窗口会卡顿(如下图所示)。为什么会停顿呢?这是为了等待我们输入内容。当我们输入 “10”,再按下 Enter 键之后,控制台会输出 “110”。

scanf("%d", &b); 这句代码表示将输入的内容赋值给 b 这个变量,如果输入的是 10,那么 b 的值就是 10,如果输入的是 20,那么 b 的值就是 20。
此时我们要特别注意 scanf() 的写法,变量名的前面一定要加上 “&”(这里只针对基本类型的变量),如果没有加上就是错误的。对于这一点,小伙伴们不用纠结太多,你可以理解成一种语法规定。在后面章节中,我们会详细给大家介绍为什么。
// 正确写法
scanf("%d", &b);
// 错误写法
scanf("%d", b);示例 2:C 输入多个值
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
int sum = a + b;
printf("%d", sum);
return 0;
}分析:
当我们编译之后去运行代码,此时控制台会停顿 2 次。我们首先输入 “10”,按下 Enter 键之后,再输入一个 “20”,然后再按下 Enter 键,此时控制台会输出结果 “30”。
需要注意的是,有多少个 scanf(),我们就要输入多少个内容。每次输入内容之后,必须按下 Enter 键,才会进行下一步。
对于连续输入,其实我们可以将多个 scanf() 合并成一个 scanf() 来处理。下面 2 种方式是等价的。
// 分开方式
scanf("%d", &a);
scanf("%d", &b);
// 合并方式
scanf("%d%d", &a, &b);最后大家思考一个问题:“上面这个例子有什么不足的地方呢?”细心的小伙伴应该都发现了,编译运行之后,控制台只有一个光标在闪,却没有提示我们输入什么内容。所以在使用 scanf() 之前,最好先使用 printf() 输出一个提示内容,这是一个非常好的代码习惯。
示例 3:C 输入时添加提示内容
#include <stdio.h>
int main(void)
{
int a, b;
printf("输出第1个整数:");
scanf("%d", &a);
printf("输出第2个整数:");
scanf("%d", &b);
int sum = a + b;
printf("%d", sum);
return 0;
}分析:
使用 printf() 添加提示之后,效果就直观很多了,如下图所示。

示例 4:求出 3 位整数的每一位数字
#include <stdio.h>
int main(void)
{
int n;
printf("请输入一个3位整数:");
scanf("%d", &n);
int a = n % 10; // 提取个位数
int b = (n %100) / 10; // 提取十位数
int c = n / 100; // 提取百位数
printf("个位是:%d\n十位是:%d\n百位是:%d", a, b, c);
return 0;
}运行之后,当我们输入 “184”,其输出结果如下。
个位是:4
十位是:8
百位是:1分析:
% 是求余运算,比如 10 % 4 的结果是 2,10 % 3 的结果是 1。需要注意的是,求余运算要求两个数都是整数。
对于加减乘除运算,如果两个数都是整数,那么它们的结果也是一个整数,如果有小数部分,由于前面加上了 “int” 限制,此时就会直接把小数抹去。比如 5 / 2 的结果是 2 而不是 2.5,但是 5/2.0 的结果就是 2.5 而不是 2 了。
C 输入输出格式符
在 C 语言中,输入输出格式符有非常多,常用的如下表所示。
| 格式符 | 类型 | 说明 |
|---|---|---|
| %d | 整型 | d 指的是 “decimal” |
| %u | 无符号整型 | u 指的是 “unsigned” |
| %f | 单精度(float) | f 指的是 “float” |
| %lf | 双精度(double) | lf 指的是 “long float” |
| %c | 字符 | c 指的是 “char” |
| %s | 字符串 | s 指的是 “string” |
| %p | 指针 | p 指的是 “pointer” |
对于输入输出格式符,我们有以下 2 点需要特别注意的。
1. 如果是 printf() 输出,我们不需要严格区分格式符
一般来说,%d 既可以输出有符号整型,也可以输出无符号整型。然后 %f 既可以输出单精度类型(float),也可以输出双精度类型(double)。
也就是说。如果是整型,我们直接统一使用 printf("%d", xxx) 即可。如果是浮点型,我们直接统一使用 printf("%f", xxx) 即可。
2. 如果是 scanf() 输入,我们需要严格区分格式符
虽然有些情况我们不严格区分格式符也能正常输入,但是并不推荐这样去做。原因很简单,因为你输入的值是涉及分配内存的,而输出的值是不涉及分配内存的。
就像有一个箱子,如果你往里面塞东西,得合理分配才能装更多东西。但是你从里面拿东西出来就不需要考虑那么多了,想怎么拿就怎么拿。所以大家一定要记住:当使用 scanf() 输入时,格式符一定要和变量类型必须相同。

示例 5:C 输出整型
#include <stdio.h>
int main(void)
{
int a = 2025;
int b = -2025;
printf("%d\n", a);
printf("%d", b);
return 0;
}运行结果如下。
2025
-2025分析:
从结果可以看出来,不管是有符号整型,还是无符号整型,都可以使用 “%d” 格式输出。如果将上面例子的 “%d” 改为 “%u”,此时运行结果如下。
2025
4294965274也就是说,“%u” 只能输出无符号整型,而不能输出有符号整型。总而言之,在实际开发中,不管是有符号整型,还是无符号整型,我们直接统一使用 “%d” 就肯定没有问题了。
示例 6:C 输出浮点型
#include <stdio.h>
int main(void)
{
float a = 3.1415;
double b = 3.1415;
printf("%f\n", a);
printf("%f", b);
return 0;
}运行结果如下。
3.141500
3.141500分析:
虽然 a 和 b 的值都是 3.1415,但是因为类型不同,它们在所占存储空间大小也是不同的。从结果可以看出来,不管是 float 类型,还是 double 类型。如果是使用 printf() 输出,我们也是直接统一使用 “%f” 即可。
可能钻牛角尖的小伙伴会问:“为什么 printf() 就不需要严格区分数据类型啊?” 还是那个原因,printf() 只是从内存拿东西出来,只要拿得出来就可以了,你不用管人家怎么拿的。但 scanf() 就不同了,它是往内存里塞东西,我们必须合理进行分配才行。
示例 7:C 输入浮点型
#include <stdio.h>
int main(void)
{
float a;
scanf("%f", &a);
printf("%f", a);
return 0;
}运行之后,我们输入 10 之后,输出结果如下。
10.000000分析:
在这个例子中,我们定义了一个 float 类型的变量 a,所以在使用 scanf() 输入值时,就应该使用 “%f”,而不能使用 “%lf”。如果使用 “%lf” 输入,那么结果是有问题的,此时输出结果为:0.000000。
下面 2 种方式都是有问题的,小伙伴们可以思考一下为什么。
// 方式 1
float a;
scanf("%lf", &a);
// 方式 2
double a;
scanf("%f", &a);C 输入字符
在 C 语言中,我们可以使用 getchar() 函数来快速输入一个字符。getchar() 可以看成是 scanf() 的一种简写方式。
语法:
char 变量名 = getchar();示例 8:C 输入一个字符
#include <stdio.h>
int main(void)
{
printf("请输入字符:");
char a = getchar();
printf("%c", a);
return 0;
}运行之后,我们输入一个字符 'A',然后输出结果如下。
A分析:
getchar() 本质上是 scanf() 的一种简写方式,下面 2 种方式是等价的。
// 方式 1
char a = getchar();
// 方式 2
char a;
scanf("%c", &a);从上面可以看出来,如 getchar() 这种方式更加简单方便。在实际开发中,如果想要输入一个字符,我们也推荐使用 getchar() 来实现。
提示: C 语言共有 3 个常用的输入函数:scanf()、getchar()、gets()。对于 getchar() 和 gets(),我们在后续章节会详细介绍。
