
C语言如何获得键盘输入字符串:使用scanf函数、使用gets函数、使用fgets函数、使用自定义函数。 在C语言中,我们可以通过多种方法来获取键盘输入的字符串,其中使用fgets函数是最常用且安全的一种方法。fgets函数可以读取包含空格的字符串,并且可以防止缓冲区溢出,这是其他方法如scanf和gets所无法做到的。接下来,我们将详细介绍这几种方法以及如何使用fgets函数来安全地获取键盘输入的字符串。
一、使用scanf函数
scanf函数是C语言中常用的输入函数之一。它从标准输入(通常是键盘)读取格式化的数据,并将其存储在指定的变量中。然而,scanf函数在读取字符串时有一些限制和缺陷。
1.1 基本用法
scanf函数的基本用法如下:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
scanf("%s", str);
printf("你输入的字符串是:%sn", str);
return 0;
}
在上面的代码中,scanf函数读取一个字符串并将其存储在str数组中。然而,这种方法有两个主要问题:
- 不能读取空格:
scanf函数在遇到空格、制表符或换行符时会停止读取。 - 可能导致缓冲区溢出:如果输入的字符串长度超过了数组的大小,就会导致缓冲区溢出,从而引发潜在的安全问题。
1.2 解决方法
为了避免缓冲区溢出,可以使用格式说明符限制输入的长度。例如:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
scanf("%99s", str); // 限制输入长度为99个字符
printf("你输入的字符串是:%sn", str);
return 0;
}
尽管这种方法可以防止缓冲区溢出,但仍无法处理包含空格的字符串。
二、使用gets函数
gets函数也是C语言中用于读取字符串的函数之一。与scanf不同,gets函数可以读取包含空格的字符串。然而,gets函数存在严重的安全问题,因此在实际开发中不推荐使用。
2.1 基本用法
gets函数的基本用法如下:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
gets(str);
printf("你输入的字符串是:%sn", str);
return 0;
}
在上面的代码中,gets函数读取一行输入并将其存储在str数组中。尽管gets函数可以读取包含空格的字符串,但它没有办法限制输入的长度,因此容易导致缓冲区溢出。
2.2 安全问题
由于gets函数存在缓冲区溢出的安全隐患,C11标准已经将其移除。因此,不推荐使用gets函数。相反,可以使用更安全的fgets函数。
三、使用fgets函数
fgets函数是C标准库中用于读取字符串的安全函数之一。它可以读取包含空格的字符串,并且允许我们指定读取的最大字符数,从而防止缓冲区溢出。
3.1 基本用法
fgets函数的基本用法如下:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
printf("你输入的字符串是:%sn", str);
return 0;
}
在上面的代码中,fgets函数读取输入并将其存储在str数组中。sizeof(str)返回数组的大小,确保读取的字符不会超过数组的容量。
3.2 处理换行符
fgets函数在读取输入时会包括换行符,因此需要手动去除换行符。可以使用以下代码去除换行符:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("请输入一个字符串:");
if (fgets(str, sizeof(str), stdin)) {
size_t len = strlen(str);
if (len > 0 && str[len-1] == 'n') {
str[len-1] = '