
C语言如何从键盘上输入字符串:使用scanf函数、使用gets函数、使用fgets函数。使用fgets函数是其中最安全和推荐的方法,因为它可以防止缓冲区溢出。
展开描述: fgets函数不仅安全性高,还能指定读取的最大字符数,避免输入过长导致的缓冲区溢出。它的使用格式为fgets(buffer, size, stdin),其中buffer是存储输入数据的数组,size是要读取的最大字符数,stdin表示从标准输入(键盘)读取。
一、使用scanf函数
scanf函数是C语言中最基本的输入函数之一,可以用于从键盘输入字符串。其基本使用格式为scanf("%s", str),其中str是一个字符数组,用于存储输入的字符串。然而,使用scanf函数存在一些局限性和风险。
1、局限性
scanf函数在读取字符串时,以空白字符(如空格、换行符、制表符等)为分隔符,这意味着它无法读取包含空白字符的字符串。此外,scanf函数不检查输入的长度,这可能导致缓冲区溢出,进而引发严重的安全漏洞。
2、使用示例
#include <stdio.h>
int main() {
char str[100];
printf("请输入字符串:");
scanf("%s", str);
printf("你输入的字符串是:%sn", str);
return 0;
}
在这个例子中,如果用户输入的字符串超过100个字符,则可能导致缓冲区溢出,从而覆盖相邻的内存区域,导致程序崩溃或产生意外行为。
二、使用gets函数
gets函数也是C语言中用于从键盘输入字符串的函数之一。其基本使用格式为gets(str),其中str是一个字符数组,用于存储输入的字符串。然而,使用gets函数存在严重的安全隐患。
1、安全隐患
gets函数读取输入直到遇到换行符,但它不会检查输入的长度,也不会限制读取的字符数。这意味着用户可以输入任意长度的字符串,从而导致缓冲区溢出,覆盖相邻的内存区域。因此,gets函数在现代C标准中已被弃用,强烈不推荐使用。
2、使用示例
#include <stdio.h>
int main() {
char str[100];
printf("请输入字符串:");
gets(str);
printf("你输入的字符串是:%sn", str);
return 0;
}
尽管这个例子与scanf类似,但gets函数更容易导致缓冲区溢出,因为它不受任何输入长度的限制。
三、使用fgets函数
fgets函数是C语言中推荐用于从键盘输入字符串的函数。其基本使用格式为fgets(str, size, stdin),其中str是一个字符数组,用于存储输入的字符串,size是要读取的最大字符数,stdin表示从标准输入读取。
1、优势
安全性高:fgets函数允许指定读取的最大字符数,有效防止缓冲区溢出。
支持空白字符:fgets函数读取整行输入,包括空白字符,直到读取到换行符或达到指定的最大字符数。
通用性强:fgets函数不仅可以从标准输入读取,还可以从文件等其他输入流读取。
2、使用示例
#include <stdio.h>
int main() {
char str[100];
printf("请输入字符串:");
fgets(str, sizeof(str), stdin);
printf("你输入的字符串是:%sn", str);
return 0;
}
在这个例子中,fgets函数读取输入并存储在字符数组str中,最多读取sizeof(str)个字符。即使用户输入超过了数组的大小,fgets函数也会自动截断输入,防止缓冲区溢出。
四、比较不同方法的优缺点
1、scanf函数
优点:
- 简单易用,适合初学者。
- 可以读取基本的数据类型,如整数、浮点数等。
缺点:
- 不能读取包含空白字符的字符串。
- 不检查输入长度,容易导致缓冲区溢出。
2、gets函数
优点:
- 读取整行输入,包括空白字符。
缺点:
- 不安全,容易导致缓冲区溢出。
- 已被现代C标准弃用,不推荐使用。
3、fgets函数
优点:
- 安全性高,有效防止缓冲区溢出。
- 支持读取包含空白字符的字符串。
- 通用性强,可用于不同输入流。
缺点:
- 相对复杂,需要指定输入的最大长度。
- 读取到的字符串可能包含换行符,需要额外处理。
五、推荐的最佳实践
在实际编程中,建议优先使用fgets函数从键盘输入字符串。尽管它的使用稍微复杂一些,但其安全性和通用性远胜于scanf和gets函数。以下是一些使用fgets函数的最佳实践:
1、处理换行符
fgets函数读取到的字符串可能包含换行符,建议在处理输入时去除换行符:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("请输入字符串:");
fgets(str, sizeof(str), stdin);
// 去除换行符
size_t len = strlen(str);
if (len > 0 && str[len - 1] == 'n') {
str[len - 1] = '