C语言输入函数汇总(scanf、getchar、gets和fgets)
在 C语言中,输入函数是程序获取用户数据的重要工具,用于从标准输入(通常是键盘)读取数据并存储到程序变量中。
C语言程序中,常用的输入函数有以下几个:
-
scanf():格式化输入,支持多种数据类型; -
getchar():读取单个字符; -
gets():读取一行字符串(不推荐使用); -
fgets():安全读取一行字符串。
这些函数主要定义在标准库<stdio.h>中,每种函数都有特定的用途和特性,有的适合格式化输入,有的专注于字符或字符串读取。
本节我们将逐一深入探讨这些输入函数的用法、特点以及适用场景,读完本文,你就能掌握如何高效地读取用户输入。
C语言scanf()格式化输入函数
scanf() 是 C语言中最常用的输入函数,全称是“scan formatted”。它通过格式说明符读取用户输入,并将数据存储到指定变量中,支持整数、浮点数、字符等多种类型。
函数原型(定义在 <stdio.h> 中):
int scanf(const char *format, ...);
-
format:格式字符串,指定输入数据的类型和格式。 -
...:可变参数,指向要存储数据的变量地址。 -
返回值:成功读取的参数个数,失败或到达输入末尾返回
EOF。
格式说明符
格式说明符以 % 开头,与 printf() 类似,但需要传递变量地址(使用 &)。常见的有:
| 说明符 | 类型 | 示例输入 |
|---|---|---|
%d, %i |
有符号整数 | 123 |
%u |
无符号整数 | 4294967295 |
%f |
浮点数 | 3.14 |
%c |
字符 | A |
%s |
字符串 | Hello |
#include <stdio.h>
int main(void) {
int a;
float b;
char c;
printf("Enter an int, float, and char: ");
scanf("%d %f %c", &a, &b, &c);
printf("You entered: %d, %.2f, %c\n", a, b, c);
return 0;
}
输入示例:123 3.14 X
输出结果:
Enter an int, float, and char: 123 3.14 X You entered: 123, 3.14, X
说明:scanf() 用空格分隔输入,变量前加 & 传递地址。
注意缓冲区问题
scanf() 会忽略前导空白字符,但换行符或多余字符可能留在缓冲区,导致后续输入异常。
#include <stdio.h>
int main(void) {
char c1, c2;
printf("Enter two chars: ");
scanf("%c", &c1);
scanf("%c", &c2);
printf("c1 = %c, c2 = %c\n", c1, c2);
return 0;
}
输入示例:A[回车]
输出结果:
Enter two chars: A c1 = A, c2 =
解决方法:在 %c 前加空格(如 " %c")跳过换行符。
C语言getchar()读取单个字符
getchar() 是一个简单函数,用于从标准输入读取单个字符,返回其 ASCII 值。它轻量且直接,适合处理逐字符输入。
函数原型:
int getchar(void);
- 无参数,直接读取下一个字符。
-
返回值:读取的字符(转为
int),失败或输入末尾返回EOF。
【实例】基本用法。
#include <stdio.h>
int main(void) {
printf("Enter a char: ");
int ch = getchar();
printf("You entered: %c\n", ch);
return 0;
}
输入示例:A
输出结果:
Enter a char: A You entered: A
循环读取
#include <stdio.h>
int main(void) {
int ch;
printf("Enter some chars (Ctrl+D or Ctrl+Z to end):\n");
while ((ch = getchar()) != EOF) {
putchar(ch);
}
return 0;
}
输入示例:ABC[Ctrl+D]
输出结果:
Enter some chars (Ctrl+D or Ctrl+Z to end): ABC ABC
说明:用 EOF(通常 Ctrl+D 或 Ctrl+Z)结束输入。
C语言gets()读取一行字符串(不推荐)
gets() 用于读取一行字符串,直到遇到换行符,但它有严重的安全隐患,不推荐使用。
函数原型:
char *gets(char *s);
-
s:存储输入的字符数组。 -
返回值:成功返回
s,失败或输入末尾返回NULL。
【实例】基本用法。
#include <stdio.h>
int main(void) {
char str[20];
printf("Enter a string: ");
gets(str);
printf("You entered: %s\n", str);
return 0;
}
输入示例:Hello World
输出结果:
Enter a string: Hello World You entered: Hello World
注意,gets() 不检查缓冲区大小,输入过长会导致溢出,建议用 fgets() 替代。
C语言fgets()安全读取一行字符串
fgets() 是 gets() 的安全替代品,可以指定最大读取长度,避免缓冲区溢出。
函数原型:
char *fgets(char *s, int size, FILE *stream);
-
s:存储输入的字符数组。 -
size:最大读取字符数(包括\0)。 -
stream:输入流,通常是stdin。 -
返回值:成功返回
s,失败或输入末尾返回NULL。
【实例】基本用法。
#include <stdio.h>
int main(void) {
char str[20];
printf("Enter a string: ");
fgets(str, 20, stdin);
printf("You entered: %s", str);
return 0;
}
输入示例:Hello World
输出结果:
Enter a string: Hello World You entered: Hello World
说明:fgets 保留换行符 \n,若需去除,可手动处理。
输入函数对比总结
| 函数 | 功能 | 格式化 | 安全性 | 适用场景 |
|---|---|---|---|---|
scanf |
格式化输入多种类型 | 支持 | 需注意缓冲区 | 复杂输入 |
getchar |
读取单个字符 | 不支持 | 安全 | 字符处理 |
gets |
读取一行字符串 | 不支持 | 不安全 | 已废弃 |
fgets |
读取一行字符串 | 不支持 | 安全 | 字符串输入 |
注意事项
1) 缓冲区清理
输入函数可能留下换行符或多余字符,需用 getchar() 或 fflush(stdin)(非标准)清理。
#include <stdio.h>
int main(void) {
char c;
scanf("%c", &c);
while (getchar() != '\n'); // 清理缓冲区
printf("c = %c\n", c);
return 0;
}
2) 输入验证
检查返回值以确保输入成功。例如,scanf 返回读取成功的参数个数。
3) 类型匹配
scanf() 的格式说明符必须与变量类型匹配,否则会导致未定义行为。
总结
C 语言常用的输入函数有 4 个,分别是scanf()、getchar()、gets() 和 fgets() ,它们各有特色:
scanf() 强大但需注意缓冲区;
getchar() 简单适合字符;
gets() 不安全应避免;
fgets() 是字符串输入的最佳选择。
读完本文,你已经掌握了 C 语言程序中常用的所有输入函数,了解了它们各自的特性和注意事项,能够根据实际需求高效读取数据了。
ICP备案:
公安联网备案: