使用C语言将输入语句放到数组中的主要方法包括使用scanf
函数、gets
函数、以及fgets
函数。 这三种方法各有优缺点,本文将详细介绍这些方法以及它们的使用场景和注意事项。
一、使用scanf
函数
scanf
函数是C语言中最常用的输入函数之一。它可以从标准输入设备中读取格式化的数据,并将其存储在指定的变量中。下面是一个简单的例子:
#include <stdio.h>
int main() {
char input[100];
printf("请输入一段文字: ");
scanf("%99s", input);
printf("你输入的文字是: %sn", input);
return 0;
}
在这个例子中,scanf
函数读取输入并将其存储在字符数组input
中。但需要注意的是,scanf
函数遇到空格或换行符时会终止读取,因此它不适用于读取包含空格的整行输入。
优点与缺点
优点:
- 简单易用,适合读取单词或无空格的输入。
缺点:
- 无法读取包含空格的整行输入。
- 容易导致缓冲区溢出,如果输入长度超过数组大小,会引发严重的错误。
二、使用gets
函数
gets
函数是C语言中用于读取整行输入的函数。它读取一行数据,直到遇到换行符或文件结束符(EOF)。但是,由于gets
函数没有进行边界检查,容易导致缓冲区溢出。因此,它在现代C标准(C11)中被标记为不安全并被弃用。
#include <stdio.h>
int main() {
char input[100];
printf("请输入一段文字: ");
gets(input);
printf("你输入的文字是: %sn", input);
return 0;
}
优点与缺点
优点:
- 可以读取包含空格的整行输入。
缺点:
- 没有边界检查,容易导致缓冲区溢出。
- 被现代C标准弃用,不推荐使用。
三、使用fgets
函数
fgets
函数是C语言中推荐的用于读取整行输入的函数。它可以指定读取的最大字符数,从而避免缓冲区溢出问题。
#include <stdio.h>
int main() {
char input[100];
printf("请输入一段文字: ");
fgets(input, sizeof(input), stdin);
printf("你输入的文字是: %sn", input);
return 0;
}
在这个例子中,fgets
函数读取输入并将其存储在字符数组input
中,最多读取sizeof(input) - 1
个字符,并在最后一个位置添加一个空字符。
优点与缺点
优点:
- 可以读取包含空格的整行输入。
- 具有边界检查,避免缓冲区溢出。
缺点:
- 读取的字符串可能包含换行符,需要手动去除。
四、比较与选择
在实际应用中,选择合适的输入函数非常重要。以下是对上述三种方法的比较和建议:
使用场景
- 单词输入:如果只需要读取单词或无空格的输入,可以使用
scanf
函数。 - 整行输入:如果需要读取包含空格的整行输入,推荐使用
fgets
函数。 - 安全性:考虑到安全性问题,应尽量避免使用
gets
函数,使用fgets
函数代替。
实际应用
假设我们要编写一个程序,读取用户输入的多行文本并存储在数组中。我们可以使用fgets
函数实现这个功能:
#include <stdio.h>
#define MAX_LINES 5
#define MAX_LENGTH 100
int main() {
char input[MAX_LINES][MAX_LENGTH];
int i;
printf("请输入最多 %d 行文字,每行最多 %d 个字符:n", MAX_LINES, MAX_LENGTH - 1);
for (i = 0; i < MAX_LINES; i++) {
printf("请输入第 %d 行: ", i + 1);
if (fgets(input[i], sizeof(input[i]), stdin) == NULL) {
break;
}
// 去除换行符
size_t len = strlen(input[i]);
if (len > 0 && input[i][len - 1] == 'n') {
input[i][len - 1] = '