scanf() 留下换行符在缓冲区问题
当使用 scanf()
读取输入时,像 %d
、%f
这样的格式说明符会跳过空白字符(包括空格、制表符和换行符)来读取数据。然而,scanf()
并不会从缓冲区中移除多余的换行符,这就导致后续输入函数会读取到这个换行符,而不是用户的实际输入。
#include <stdio.h> int main() { int number; char str[20]; printf("Enter a number: "); scanf("%d", &number); // 读取字符数组 printf("Enter a string: "); gets(str); // 这里将直接读取到换行符 printf("Number: %d\n", number); printf("String: %s\n", str); return 0; }
解决方法
1、使用 getchar() 清除换行符
在 scanf()
之后调用 getchar(
) 来手动读取并丢弃缓冲区中的换行符。
#include <stdio.h> int main() { int number; char str[20]; printf("Enter a number: "); scanf("%d", &number); // 使用 getchar() 清除缓冲区中的换行符 getchar(); printf("Enter a string: "); gets(str); printf("Number: %d\n", number); printf("String: %s\n", str); return 0; }
2、使用 fgets() 代替 gets()
fgets()
是一个更安全的读取字符串的方法,它可以防止缓冲区溢出并正确处理换行符。fgets()
不会忽略换行符,但会将它作为输入的一部分存储在字符串中。可以手动移除换行符,如不希望它出现在字符串的末尾。
#include <stdio.h> int main() { int number; char str[20]; printf("Enter a number: "); scanf("%d", &number); // 使用 getchar() 清除缓冲区中的换行符 getchar(); // 使用 fgets() 读取字符串 printf("Enter a string: "); fgets(str, sizeof(str), stdin); // 移除换行符 //str[strcspn(str, "\n")] = 0; printf("Number: %d\n", number); printf("String: %s\n", str); return 0; }
3、使用 scanf(" %c") 格式符
通过在 scanf()
格式符之前添加一个空格,可以强制跳过所有空白字符(包括换行符)。
#include <stdio.h> int main() { int number; char str[20]; printf("Enter a number: "); scanf("%d", &number); // 使用 " %[^\n]" 读取字符串,跳过换行符 printf("Enter a string: "); scanf(" %[^\n]", str); printf("Number: %d\n", number); printf("String: %s\n", str); return 0; }