前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当后面有 fgets()\u002Fgets()\u002Fscanf() 时 scanf() 出现问题

当后面有 fgets()\u002Fgets()\u002Fscanf() 时 scanf() 出现问题

作者头像
鲸落c
发布2022-11-14 16:43:06
5380
发布2022-11-14 16:43:06
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记

theme: channing-cyan highlight: a11y-dark


「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

  • 难度级别: [简单]

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

代码语言:javascript
复制
// C程序演示scanf()后使用fgets()/gets()时出现的问题
#include<stdio.h>

int main()
{
int x;
char str[100];
scanf("%d", &amp;x);
fgets(str, 100, stdin);
printf("x = %d, str = %s", x, str);
return 0;
}

输入

代码语言:javascript
复制
10
test

输出如下:

代码语言:javascript
复制
x = 10,str =  

上面代码的问题是使用 scanf() 读取一个整数并在缓冲区中留下一个换行符。所以 fgets() 只会读取换行符,在程序中忽略了字符串“test”。

在循环中使用 scanf() 时也会出现相类似的问题。

代码语言:javascript
复制
// 循环使用scanf()时的C程序演示问题
#include<stdio.h>

int main()
{
    char c;
    printf("......你可以输入 q 退出......\n");
    do
    {
        printf("请你输入一个字符\n");
        scanf("%c", &amp;c);
        printf("%c\n", c);
    }
    while (c != 'q');
    return 0;
}

输入:

代码语言:javascript
复制
a
b
q

输出如下:

代码语言:javascript
复制
......你可以输入 q 退出......
请你输入一个字符
a
请你输入一个字符


请你输入一个字符
b
请你输入一个字符


请你输入一个字符
q

我们可以注意到使用上面的程序打印了一个额外的“请你输入一个字符”,然后是一个额外的新行。发生这种情况是因为每个 scanf() 在缓冲区中留下一个换行符,由下一个 scanf 读取。

如何解决以上问题?

  1. 我们可以使用额外的“\n”让 scanf() 读取新行,即scanf(“%d\n”, &x) 。事实上scanf("%d ", &x) 也可以工作(注意额外的空格)。
  2. 我们可以在 scanf() 之后添加一个 getchar() 来读取额外的换行符。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档