鱼C论坛

 找回密码
 立即注册
查看: 2570|回复: 4

[已解决]scanf吸收回车符的问题

[复制链接]
发表于 2019-2-19 23:06:45 | 显示全部楼层 |阅读模式
30鱼币
#include <stdio.h>

int main()
{
最佳答案
2019-2-19 23:06:46
本帖最后由 jackz007 于 2019-2-20 11:49 编辑

      本人的见解与楼主相反,scanf() 并不是吸收,而是拒收了回车符,正因为这样,才会导致本应属于 a 的回车符却被派给了 b1[],本应属于 b1[] 的字符串却被派给了 b2[],b1[] 为空串的结果。

      有了这个见解就好办了,只要在 scanf() 与 fgets() 之间插入一个 fflush(stdin) 指令清空键盘缓冲区便可解决此问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
        // 先读入一个整数,再读入2个串 
        int a                          ;
        char b1[100]                   ;
        char b2[100]                   ;
        
        scanf("%d" , & a)              ; // 由于 scanf() 拒收回车符,会造成回车符在键盘缓冲区滞留
        fflush(stdin)                  ; // 所以,新增此句,清空键盘缓冲区
        fgets(b1 , sizeof(b1) , stdin) ;
        fgets(b2 , sizeof(b2) , stdin) ;
        printf(" a = %d\n" , a)        ;
        printf("b1 = %s\n" , b1)       ;
        printf("b2 = %s\n" , b2)       ;
                
        return 0                       ;
}

    楼主不妨一试。

最佳答案

查看完整内容

本人的见解与楼主相反,scanf() 并不是吸收,而是拒收了回车符,正因为这样,才会导致本应属于 a 的回车符却被派给了 b1[],本应属于 b1[] 的字符串却被派给了 b2[],b1[] 为空串的结果。 有了这个见解就好办了,只要在 scanf() 与 fgets() 之间插入一个 fflush(stdin) 指令清空键盘缓冲区便可解决此问题: 楼主不妨一试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-19 23:06:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-2-20 11:49 编辑

      本人的见解与楼主相反,scanf() 并不是吸收,而是拒收了回车符,正因为这样,才会导致本应属于 a 的回车符却被派给了 b1[],本应属于 b1[] 的字符串却被派给了 b2[],b1[] 为空串的结果。

      有了这个见解就好办了,只要在 scanf() 与 fgets() 之间插入一个 fflush(stdin) 指令清空键盘缓冲区便可解决此问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
        // 先读入一个整数,再读入2个串 
        int a                          ;
        char b1[100]                   ;
        char b2[100]                   ;
        
        scanf("%d" , & a)              ; // 由于 scanf() 拒收回车符,会造成回车符在键盘缓冲区滞留
        fflush(stdin)                  ; // 所以,新增此句,清空键盘缓冲区
        fgets(b1 , sizeof(b1) , stdin) ;
        fgets(b2 , sizeof(b2) , stdin) ;
        printf(" a = %d\n" , a)        ;
        printf("b1 = %s\n" , b1)       ;
        printf("b2 = %s\n" , b2)       ;
                
        return 0                       ;
}

    楼主不妨一试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-19 23:09:39 | 显示全部楼层
#include <stdio.h>

int main()
{
        // 先读入一个整数,再读入2个串
        int a;
        char b1[100];
        char b2[100];
       
        scanf("%d", &a);
        fgets(b1, sizeof(b1), stdin);
        fgets(b2, sizeof(b2), stdin);
       
        printf("a = %d\n", a);
        printf("b1 = %s\n", b1);
        printf("b2 = %s\n", b2);
               
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-19 23:36:54 | 显示全部楼层
额,你在scanf("%d",&a);后面加一句getchar();//把回车换行吸收掉就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-20 01:13:49 | 显示全部楼层
具体没太懂楼主的意思呀,你想达到什么样的效果呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 08:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表