首页 > 编程笔记 > C语言笔记 阅读:525

C语言输入函数汇总(scanf、getchar、gets和fgets)

在 C语言中,输入函数是程序获取用户数据的重要工具,用于从标准输入(通常是键盘)读取数据并存储到程序变量中。


C语言程序中,常用的输入函数有以下几个:


这些函数主要定义在标准库<stdio.h>中,每种函数都有特定的用途和特性,有的适合格式化输入,有的专注于字符或字符串读取。

本节我们将逐一深入探讨这些输入函数的用法、特点以及适用场景,读完本文,你就能掌握如何高效地读取用户输入。

C语言scanf()格式化输入函数

scanf() 是 C语言中最常用的输入函数,全称是“scan formatted”。它通过格式说明符读取用户输入,并将数据存储到指定变量中,支持整数、浮点数、字符等多种类型。


函数原型(定义在 <stdio.h> 中):

int scanf(const char *format, ...);

格式说明符

格式说明符以 % 开头,与 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);

【实例】基本用法。
#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);

【实例】基本用法。
#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);

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

相关文章