在C语言中,从键盘获得字符串可以使用scanf、gets和fgets函数。其中,fgets 是更安全和推荐的选择,因为它可以有效地防止缓冲区溢出。接下来,我们将详细探讨这三种方法,并深入剖析它们的优缺点及适用场景。
一、使用scanf函数
1、基本用法
scanf
函数是C语言中最常用的输入函数之一。它可以从标准输入(即键盘)读取格式化数据。对于读取字符串,常用的形式是:
char str[100];
scanf("%s", str);
这种方式会读取输入的字符串并存储在str
数组中。
2、优缺点分析
优点:
- 简单易用,适合初学者。
缺点:
- 无法读取带空格的字符串:
scanf
函数在遇到空格、换行符或制表符时会停止读取。 - 安全性问题:如果输入的字符串长度超过了数组的大小,会导致缓冲区溢出,从而引发严重的安全问题。
3、实际应用示例
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
scanf("%s", str);
printf("你输入的字符串是:%sn", str);
return 0;
}
二、使用gets函数
1、基本用法
gets
函数可以读取一行输入并存储在字符串数组中,直到遇到换行符为止。基本用法如下:
char str[100];
gets(str);
2、优缺点分析
优点:
- 可以读取带空格的字符串:
gets
函数会读取整行输入,包括空格和制表符,直到遇到换行符。
缺点:
- 严重的安全问题:
gets
函数不检查缓冲区大小,因此如果输入的字符串长度超过了数组的大小,依然会导致缓冲区溢出。
3、实际应用示例
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
gets(str);
printf("你输入的字符串是:%sn", str);
return 0;
}
注意:由于gets
函数存在严重的安全隐患,现代C标准(C11)已经将其废弃,建议使用fgets
函数代替。
三、使用fgets函数
1、基本用法
fgets
函数是从标准输入读取字符串的更安全的选择。它允许指定最大读取字符数,从而有效避免缓冲区溢出。基本用法如下:
char str[100];
fgets(str, sizeof(str), stdin);
2、优缺点分析
优点:
- 安全性高:
fgets
函数会检查数组的大小,确保不会发生缓冲区溢出。 - 可以读取带空格的字符串:
fgets
函数会读取整行输入,包括空格和制表符,直到遇到换行符或达到指定的最大字符数。
缺点:
- 需要处理换行符:
fgets
函数会将换行符也读取到字符串中,因此在某些情况下可能需要额外处理。
3、实际应用示例
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
// 移除字符串中的换行符
str[strcspn(str, "n")] = '