
C语言接收输入字符串的方法主要有:scanf、gets、fgets。其中,scanf 是最基础的用法,但存在缓冲区溢出风险;gets 已被废弃,不建议使用;fgets 是最安全、推荐使用的方法。下面将详细介绍这几种方法及其使用场景。
一、SCANNF接收字符串
1、使用scanf接收字符串
scanf 是C语言中最常用的输入函数之一。它可以读取用户输入的字符串,但在使用时需要注意一些细节:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
scanf("%s", str);
printf("You entered: %sn", str);
return 0;
}
上述代码中,scanf 会读取用户输入的字符串并存储在 str 数组中。然而,scanf 读取字符串时会将空白字符(如空格、换行符等)视为输入结束符,这意味着它无法读取包含空白字符的字符串。
2、缓冲区溢出问题
scanf 在读取字符串时没有限制输入的长度,这可能导致缓冲区溢出问题。例如,如果用户输入的字符串长度超过了 str 数组的容量,就会导致程序崩溃:
#include <stdio.h>
int main() {
char str[10];
printf("Enter a string: ");
scanf("%s", str);
printf("You entered: %sn", str);
return 0;
}
为了解决这个问题,可以指定输入的最大长度:
#include <stdio.h>
int main() {
char str[10];
printf("Enter a string: ");
scanf("%9s", str); // 最多读取9个字符,留一个给终止符
printf("You entered: %sn", str);
return 0;
}
二、GETS接收字符串
1、使用gets函数
gets 是C语言中另一种读取字符串的函数。与 scanf 不同,gets 可以读取包含空白字符的字符串:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
gets(str);
printf("You entered: %sn", str);
return 0;
}
然而,gets 存在安全隐患,因为它无法限制输入的长度,容易导致缓冲区溢出。因此,从C11标准开始,gets 已被废弃,不建议使用。
2、缓冲区溢出问题
由于 gets 不会检查输入的长度,输入长度超过数组容量时会导致缓冲区溢出:
#include <stdio.h>
int main() {
char str[10];
printf("Enter a string: ");
gets(str);
printf("You entered: %sn", str);
return 0;
}
为了避免这种问题,建议使用更安全的输入函数 fgets。
三、FGETS接收字符串
1、使用fgets函数
fgets 是C语言中最安全的读取字符串的函数之一。它不仅可以读取包含空白字符的字符串,还可以限制输入的长度:
#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 会读取用户输入的字符串并存储在 str 数组中,最多读取 sizeof(str) - 1 个字符,并确保字符串以空字符