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 语言程序中常用的所有输入函数,了解了它们各自的特性和注意事项,能够根据实际需求高效读取数据了。