`gets()` 函数在C11标准中被移除了,因此在较新的C编译器中使用可能会遇到未定义标识符的错误。它的移除是由于安全性问题,因为 `gets()` 不能限制输入长度,容易导致缓冲区溢出,带来安全隐患。
对于安全性和现代编程实践,建议使用 `fgets()` 代替 `gets()`。`fgets()` 可以指定最大读取长度,能够防止缓冲区溢出。下面是一个改进后的代码,使用 `fgets()`:
#include <stdio.h>
#include <ctype.h>
int main() {
// 定义一个二维字符数组,每行最多80个字符
char lines[3][81]; // 每行80个字符,最后一个字符为字符串结束符'\0'
int letterCount = 0;
int digitCount = 0;
// 提示用户输入3行文本
printf("请输入三行文字(每行最多80字符):\n");
// 使用 fgets() 函数读取每一行输入
for (int i = 0; i < 3; i++) {
fgets(lines[i], 81, stdin); // 81以包括字符串结束符
}
// 统计字母和数字个数
for (int i = 0; i < 3; i++) {
for (int j = 0; lines[i][j] != '\0'; j++) {
if (isalpha(lines[i][j])) {
letterCount++;
} else if (isdigit(lines[i][j])) {
digitCount++;
}
}
}
// 输出用户输入的文字
printf("\n您输入的三行文字是:\n");
for (int i = 0; i < 3; i++) {
printf("%s", lines[i]);
}
// 输出统计结果
printf("\n其中英文字母的个数是:%d\n", letterCount);
printf("其中数字的个数是:%d\n", digitCount);
return 0;
}
### 代码说明:
1. **`fgets()` 的使用:** `fgets(lines[i], 81, stdin);` 表示从标准输入读取一个最多80个字符的字符串(包括字符串结束符),并将其存储在 `lines[i]` 中。
2. **二维字符数组:** 定义 `char lines[3][81];`,即每行最多80个字符,总共3行。
3. **注意:** `fgets()` 会将输入中的换行符 `\n` 保留在字符串中。可以根据需要在处理时去除换行符,例如使用 `strcspn()` 函数来查找并替换换行符。
这种方式更安全并且兼容现代C标准。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |