scanf输入字符数组并丢弃超出部分并清除缓存
时间: 2024-12-22 07:11:54 浏览: 67
当你使用 `scanf` 函数从标准输入读取字符到字符数组时,如果不小心输入了超过数组长度的数据,通常的做法是先检查输入的长度,然后根据实际读取的字符数更新数组。为了清除可能剩余的缓冲区内容,你可以调用 `fflush(stdin)` 或 `getchar()` 直到遇到换行符。
这里有一个简单的示例:
```c
#include <stdio.h>
#define MAX_CHARACTERS 20
int main() {
char input[MAX_CHARACTERS];
int read;
printf("Enter some characters (up to %d): ", MAX_CHARACTERS - 1); // 不要包含空格,因为 scanf 会把它当作一个字符
while ((read = getchar()) != '\n' && read != EOF) { // 使用 getchar 进行逐个字符读取,直到遇到换行或文件结束
if (read == '\b') { // 如果读到退格(backspace),考虑删除最近的一个字符
if (input != '\0') {
memmove(input + 1, input, strlen(input)); // 移动数组中的元素
input[strlen(input)] = '\0'; // 更新字符串尾部的终止符
}
} else if (read < ' ' || read > '~') { // 忽略非打印字符
continue;
} else if (strlen(input) < MAX_CHARACTERS) { // 只写入合法字符且未满数组
input[strlen(input)] = (char) read; // 将字符写入数组
input[strlen(input) + 1] = '\0'; // 添加终止符
}
// 清理缓冲区(如果有的话)
while (getchar() != '\n'); // 读取直至换行
}
printf("Input: %s\n", input);
return 0;
}
```
这个程序首先提示用户输入字符,然后逐个读取,处理掉退格键,忽略非打印字符,并限制在指定的最大字符数量内。当达到换行符或者文件结束符时停止。
需要注意的是,在某些情况下,如使用控制台应用程序,`getchar` 和 `fflush` 的组合可能会产生意外效果,所以直接清空缓冲区可能会更可靠些。但是现代 C 标准库提供了 `ungetc` 函数,可以在需要时回推字符,这取决于具体的应用场景。
阅读全文
相关推荐


















