
C语言编程如何输入文字:使用scanf函数、使用gets函数、使用fgets函数。其中,使用fgets函数是较为推荐的方式,因为它相对安全,不容易引起缓冲区溢出。fgets函数从指定的输入流读取字符,并存储在一个字符串中,直到读取到换行符或达到指定的字符数为止。以下是一段代码示例:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("You entered: %s", str);
} else {
printf("Error reading input.n");
}
return 0;
}
一、使用scanf函数
scanf函数是C语言中最常用的输入函数之一。它可以从标准输入(通常是键盘)读取格式化输入。这使得它非常适合简单的字符串输入,但也有一些缺点。
scanf函数的基本用法如下:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
scanf("%99s", str); // 这里使用 %99s 是为了避免缓冲区溢出
printf("You entered: %sn", str);
return 0;
}
优点:
- 简单:使用
scanf非常简单,特别是对于基本输入需求。 - 格式化:可以使用格式说明符来读取不同类型的数据。
缺点:
- 不安全:
scanf不检查输入的长度,容易导致缓冲区溢出。 - 停止读取:
scanf在遇到空格或换行符时会停止读取,这使得它不适合多词字符串的输入。
二、使用gets函数
gets函数也是一个用于读取字符串输入的函数,但由于其存在严重的安全问题,已经被不推荐使用,并在C11标准中被移除了。
基本用法:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
gets(str); // 强烈不推荐使用
printf("You entered: %sn", str);
return 0;
}
优点:
- 简单:
gets函数使用非常简单,可以读取包含空格的完整行。
缺点:
- 不安全:
gets函数不检查输入长度,极易导致缓冲区溢出。 - 已废弃:由于其安全性问题,
gets已被废弃,应该使用更安全的替代函数。
三、使用fgets函数
fgets函数是一种更安全的读取字符串输入的方式。它允许我们指定要读取的最大字符数,并且可以处理包含空格的字符串。
基本用法:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("You entered: %s", str);
} else {
printf("Error reading input.n");
}
return 0;
}
优点:
- 安全性:
fgets函数允许我们指定要读取的最大字符数,从而避免缓冲区溢出。 - 完整行读取:可以读取包含空格的完整行。
缺点:
- 换行符处理:
fgets会将输入的换行符包括在字符串中,需要额外处理以去除换行符。
四、如何选择合适的输入方式
在选择输入方式时,安全性是一个非常重要的考虑因素。fgets函数由于其安全性和灵活性,是最推荐的输入方法。虽然scanf函数使用简单,但其安全性问题需要特别注意。gets函数由于其安全性问题,已经被废弃,不应再使用。
五、处理换行符
使用fgets函数时,输入的换行符会包含在字符串中,这可能会影响后续处理。我们需要对其进行处理。
处理换行符的代码示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("Enter a string: ");
if (fgets(str, sizeof(str), stdin) != NULL) {
size_t len = strlen(str);
if (len > 0 && str[len-1] == 'n') {
str[len-1] = '