最简单的示例:读取一个整数
这是最常见的入门场景,程序提示用户输入一个数字,然后读取并打印它。

(图片来源网络,侵删)
示例输入:
10
(用户在键盘上输入数字 10,然后按回车键)
C语言代码:
#include <stdio.h>
int main() {
int number; // 1. 声明一个整型变量来存储输入
printf("请输入一个整数: "); // 2. 提示用户输入
// 3. 读取用户输入的整数
// scanf 是一个格式化输入函数,"%d" 表示读取一个十进制整数
// &number 是变量的地址,scanf需要将读取到的值存放到这个地址
scanf("%d", &number);
// 4. 打印读取到的值
printf("你输入的整数是: %d\n", number);
return 0;
}
代码解释:
#include <stdio.h>: 包含标准输入输出库,这样我们才能使用printf和scanf。int number;: 声明一个整型变量number,用来存放我们即将读取的数字。printf("请输入一个整数: ");: 在屏幕上打印一条提示信息,告诉用户该做什么。scanf("%d", &number);: 这是核心部分。scanf函数用于从标准输入(通常是键盘)读取数据。"%d"是一个格式说明符,它告诉scanf我们期望读取的是一个十进制整数。&number是number变量的内存地址。scanf函数需要这个地址,以便将读取到的值存放到number变量中。忘记&是一个非常常见的初学者错误!
printf("你输入的整数是: %d\n", number);: 打印一条确认信息,%d会被number变量的实际值替换。
读取多个不同类型的数据
一个程序通常需要不止一个输入,我们可以连续使用 scanf 来读取多个数据。
示例输入:
张三 20 85.5
(一个字符串,一个整数,一个浮点数)
C语言代码:
#include <stdio.h>
int main() {
char name[50]; // 用于存储字符串(名字)
int age; // 用于存储整数(年龄)
float score; // 用于存储浮点数(分数)
printf("请输入姓名、年龄和分数(用空格隔开): ");
// 读取一个字符串,一个整数,一个浮点数
// 注意:scanf 默认会跳过空白字符(空格、Tab、回车)
scanf("%s %d %f", name, &age, &score);
printf("姓名: %s, 年龄: %d, 分数: %.2f\n", name, age, score);
return 0;
}
代码解释:
char name[50];: 声明一个字符数组(也就是C语言中的字符串),最多可以存放49个字符 + 1个字符串结束符\0。scanf("%s %d %f", name, &age, &score);:"%s %d %f": 这三个格式说明符分别对应一个字符串、一个整数和一个浮点数,它们之间的空格表示scanf在读取时会跳过任意数量的空白字符。name: 对于数组,name本身会“衰变”为其首元素的地址,所以不需要写&name,这是C语言的一个特例。&age,&score: 对于普通变量,仍然需要使用&来获取地址。
处理一行输入(包含空格)
scanf 使用 %s 读取字符串时,遇到空格就会停止,如果我们想读取一整行("John Doe" 这样的带空格的名字),scanf 就不合适了,这时应该使用 fgets。

(图片来源网络,侵删)
示例输入:
John Doe
25
(第一行是一个带空格的名字,第二行是年龄)
C语言代码:
#include <stdio.h>
#include <string.h> // 用于 strlen 函数
int main() {
char name[100]; // 足够大的缓冲区来存储一行
int age;
// 读取一整行输入,包括空格
// stdin 表示标准输入(键盘)
// sizeof(name) 确保 fgets 不会读取超过数组容量的字符,防止缓冲区溢出
fgets(name, sizeof(name), stdin);
// fgets 会读取换行符 \n,所以我们需要手动去掉它
name[strcspn(name, "\n")] = 0;
printf("请输入年龄: ");
scanf("%d", &age);
printf("姓名: %s, 年龄: %d\n", name, age);
return 0;
}
代码解释:
fgets(name, sizeof(name), stdin);:fgets从指定的流(这里是stdin,键盘)读取一行。- 它会读取最多
size-1个字符,或者遇到换行符\n为止。 - 关键区别:
fgets会把换行符\n也当作一个普通字符读取并存入字符串中,而scanf不会。
name[strcspn(name, "\n")] = 0;: 这是去掉字符串末尾换行符的标准方法。strcspn(name, "\n")会找到\n在字符串中的位置(索引)。- 然后我们使用这个索引,将该位置的字符替换为字符串结束符
\0,从而截断字符串。
- 注意:在
fgets之后使用scanf时要小心,因为fgets读取了用户按下的回车,这个回车会留在输入缓冲区中。scanf可能会直接读取这个回车而跳过等待,上面的例子中,由于scanf读取的是整数,所以没有这个问题,但如果后面是fgets,就需要先清空输入缓冲区。
从文件中读取示例输入
在实际开发或编程竞赛中,输入数据通常来自一个文件,而不是手动键盘输入,这可以自动化测试流程。
假设我们有一个名为 input.txt 的文件,内容如下:
input.txt:
5
10 20 30 40 50
C语言代码:
#include <stdio.h>
int main() {
int n, i;
int numbers[100];
// 以只读模式 ("r") 打开文件 "input.txt"
FILE *file = fopen("input.txt", "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件 input.txt\n");
return 1; // 返回非零值表示错误
}
// 从文件中读取第一个整数 n
fscanf(file, "%d", &n);
// 从文件中读取 n 个整数到数组中
for (i = 0; i < n; i++) {
fscanf(file, "%d", &numbers[i]);
}
// 打印读取到的数据以供验证
printf("从文件读取到的数据:\n");
printf("n = %d\n", n);
printf("数组元素: ");
for (i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
// 关闭文件,这是一个好习惯
fclose(file);
return 0;
}
代码解释:
- *`FILE file = fopen("input.txt", "r");fopen` 函数用于打开文件。
- 第一个参数是文件名。
- 第二个参数是打开模式,
"r"表示 "read"(只读)。 - 它返回一个指向
FILE结构体的指针,后续所有文件操作都通过这个指针进行。
if (file == NULL): 如果文件不存在或无法打开,fopen会返回NULL,检查NULL是一个至关重要的安全步骤。fscanf(file, ...):fscanf和scanf用法几乎完全一样,只是第一个参数指定了从哪里读取数据(这里是file指针指向的文件)。fclose(file);: 操作完成后,必须关闭文件,释放系统资源。
| 场景 | 推荐函数 | 关键点 |
|---|---|---|
| 读取单个整数/浮点数 | scanf("%d", &var); |
必须使用 & 获取变量地址。 |
| 读取多个数据(无空格) | scanf("%d %s", &a, b); |
格式说明符之间用空格隔开,自动跳过空白字符。 |
| 读取一行(可能含空格) | fgets(buffer, size, stdin); |
会读取换行符 \n,需要手动去除。 |
| 从文件读取 | fscanf(file, "%d", &var); |
先用 fopen 打开文件,得到 FILE* 指针,最后用 fclose 关闭。 |
理解并掌握这些基本的输入方法,是学习C语言编程的重要基石。

(图片来源网络,侵删)
