C语言中输入一个字符数组有几种常见的方法:使用scanf、使用gets、使用fgets。本文将详细介绍这几种方法,并对比它们的优缺点,重点阐述fgets的优势。
一、使用scanf
scanf
是C语言中最常用的输入函数之一,通过格式化字符串来读取输入。使用 scanf
输入字符数组的方法如下:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
scanf("%s", str);
printf("You entered: %sn", str);
return 0;
}
优点:
- 简单易用,适合读取简单的字符串。
缺点:
scanf
遇到空格会停止读取,因此不能读取包含空格的字符串。- 容易导致缓冲区溢出,除非使用限定符指定最大输入长度(如
scanf("%99s", str);
)。
二、使用gets
gets
函数可以读取包含空格的字符串,但它存在严重的安全问题,即缓冲区溢出。尽管如此,了解 gets
的用法有助于理解输入函数的演进:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
gets(str); // 不推荐使用,容易导致缓冲区溢出
printf("You entered: %sn", str);
return 0;
}
优点:
- 可以读取包含空格的字符串。
缺点:
- 存在严重的缓冲区溢出风险,容易导致程序崩溃或被恶意利用。
- 已被C11标准弃用,不推荐使用。
三、使用fgets
fgets
是最推荐的读取字符数组的方法,因为它可以安全地读取包含空格的字符串,并防止缓冲区溢出:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
fgets(str, sizeof(str), stdin); // 安全读取字符串
printf("You entered: %sn", str);
return 0;
}
优点:
- 可以读取包含空格的字符串。
- 安全性高,不容易导致缓冲区溢出。
缺点:
- 读取的字符串可能包含换行符,需要手动处理。
四、fgets的详细解析
fgets 是一种既安全又灵活的输入函数,适用于大多数情况下的字符串输入需求。以下是 fgets
的详细解析:
1、基本用法
fgets
的函数原型如下:
char *fgets(char *str, int n, FILE *stream);
str
:字符数组的指针,用于存储读取的字符串。n
:要读取的最大字符数,包括终止符'