C 输入

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”。

VSCode等待输入内容

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() 添加提示之后,效果就直观很多了,如下图所示。

C输入时添加提示内容

示例 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 语言中,输入输出格式符有非常多,常用的如下表所示。

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() 输入时,格式符一定要和变量类型必须相同

C输入内容就像往箱子塞东西

示例 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(),我们在后续章节会详细介绍。

上一篇: C 输出

下一篇: C if 语句

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号