当后面有 fgets()/gets()/scanf() 时 scanf() 出现问题

简介: 首先让我们来考虑下面用 C 编写的简单程序。该程序使用 scanf() 读取一个整数,然后使用 fgets() 读取一个字符串。

「这是我参与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 读取。


如何解决以上问题?



  1. 我们可以使用额外的“\n”让 scanf() 读取新行,即scanf(“%d\n”, &x) 。事实上scanf("%d ", &x) 也可以工作(注意额外的空格)。

  2. 我们可以在 scanf() 之后添加一个 getchar() 来读取额外的换行符。


文章到这里就结束了,感谢各位的阅读,如有不正确的地方欢迎大家批评指正!



目录
相关文章
|
6月前
|
C语言
你真的学会了printf和scanf函数吗?
你真的学会了printf和scanf函数吗?
|
6月前
|
编译器 C语言 C++
scanf函数
该文介绍了C语言中`scanf`函数用于输入变量值,而`printf`函数用于输出变量值。`scanf`在读取数值时会自动过滤空白字符,允许数据间有空格或换行,不影响解析。`scanf`返回值表示成功读取的变量数,0表示未读取或匹配失败,EOF表示读取错误或文件结尾。常见占位符包括 `%c`(字符)、`%d`(整数)、`%f`(浮点数)、`%s`(字符串)和`%[]`(指定字符集)。对于`%c`,不会忽略空白字符,但可加空格跳过前导空白。文章还提及在VS2022中,`scanf`被认为是不安全的,推荐使用`scanf_s`,并提供了如何在VS中使用`scanf`的解决方法。
117 1
|
6月前
|
C语言
1.printf()2.scanf()
1.printf()2.scanf()
33 0
scanf和getchar区别
scanf和getchar区别
170 0
|
11月前
c中scanf函数注意点
c中scanf函数注意点
77 0
|
11月前
|
缓存
scanf和printf函数
scanf和printf函数
138 0
|
存储 Serverless C语言
printf()和scanf() (详解)
printf()和scanf() (详解)
153 0
|
C语言
论Scanf、Gets、Getchar的区别
论Scanf、Gets、Getchar的区别
163 0
C 中的 scanf() 和 fscanf() – 简单而强大
如何只读取我们需要的一部分输入?例如,考虑一些仅包含字符后跟整数或浮点数的输入流。我们只需要扫描那个整数或浮点数。
83 0
|
存储 安全 前端开发
用于用户输入|的内置库函数scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
scanf() : C 库函数 int scanf (const char *format, ...) 从 stdin 读取格式化的输入。
193 0