「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
- 难度级别: [简单]
首先让我们来考虑下面用 C 编写的简单程序。该程序使用 scanf() 读取一个整数,然后使用 fgets() 读取一个字符串。
// C程序演示scanf()后使用fgets()/gets()时出现的问题 #include<stdio.h> int main() { int x; char str[100]; scanf("%d", &x); fgets(str, 100, stdin); printf("x = %d, str = %s", x, str); return 0; } 复制代码
输入
10 test 复制代码
输出如下:
x = 10,str = 复制代码
上面代码的问题是使用 scanf() 读取一个整数并在缓冲区中留下一个换行符。所以 fgets() 只会读取换行符,在程序中忽略了字符串“test”。
在循环中使用 scanf() 时也会出现相类似的问题。
// 循环使用scanf()时的C程序演示问题 #include<stdio.h> int main() { char c; printf("......你可以输入 q 退出......\n"); do { printf("请你输入一个字符\n"); scanf("%c", &c); printf("%c\n", c); } while (c != 'q'); return 0; } 复制代码
输入:
a b q 复制代码
输出如下:
......你可以输入 q 退出...... 请你输入一个字符 a 请你输入一个字符 请你输入一个字符 b 请你输入一个字符 请你输入一个字符 q 复制代码
我们可以注意到使用上面的程序打印了一个额外的“请你输入一个字符”,然后是一个额外的新行。发生这种情况是因为每个 scanf() 在缓冲区中留下一个换行符,由下一个 scanf 读取。
如何解决以上问题?
- 我们可以使用额外的“\n”让 scanf() 读取新行,即scanf(“%d\n”, &x) 。事实上scanf("%d ", &x) 也可以工作(注意额外的空格)。
- 我们可以在 scanf() 之后添加一个 getchar() 来读取额外的换行符。
文章到这里就结束了,感谢各位的阅读,如有不正确的地方欢迎大家批评指正!