栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

scanf奇淫巧计二 吃掉缓冲区回车空格问题分析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

scanf奇淫巧计二 吃掉缓冲区回车空格问题分析

目录

一:问题描述:

1.1:Scanf的解释

1.1.1scanf 作用:

1.1.2 scanf的读取方式:

二:问题解释

2.1解决方案

2.2 解决实例:

三 总结


引:scanf中出现的吃回车 吃空格 跳格 的问题 怎么解决?直接结论和方法请看三 总结 ,详细分析过程请看全文

案例引:

要求输入

02
03
04
13
15
23
25
45
56

输出:
020304131523254556

正常思路:

#include
int main(){
    int num =9;
    char i[num],j[num];
    for(int a=0;a
        scanf("%c%c",&i[a],&j[a]);
    }
    for(int b=0;b
        printf("%c%c",i[b],j[b]);    
    }
}

why? 1:回车怎么出现的 2:只读到了23? 25 45 56呢?

一:问题描述:

我们经常在C语言输入的时候,会发现scanf把空格或者回车“吃掉”了,导致程序的运行结果与预期不一致。出现了回车和字符消失的情况

1.1:Scanf的解释

1.1.1scanf 作用:

scanf()函数是格式输入函数,即按用户指定的格式从标准输入设备(键盘) 上把数据输入到指定地址的变量中。

1.1.2 scanf的读取方式:

一般格式为:scanf(格式控制,地址列表) 也就是scanf("%?",&?); 可以读取相对于类型的数值并且存储到制定变量,并且可以读取多个数值,如数字,字符,字符串等 ,每次用到scanf‘时,他都会从数据缓存区读取一个或多个字符,并存入相对应的变量中

scanf对于输入而言:

scanf 遇到 回车(enter),空格,TAB 就会结束一次输入,空格不会接收       

scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在数据缓冲区中)

%c会读回车 把他视为一个字符

%d不会读

所以%c会出现吃回车现象

二:问题解释

!出现了%c而不是%d,所以以上程序 scanf结束一次输入后 有一个回车留在了缓冲区,后面的scanf 都读了回车 打印时才出现了 跨行回车的情况,读的回车占一个字符,所以部分字符 没有被输入。

2.1解决方案

!怎么解决%c 中scanf读缓冲区的回车问题呢?

1 getchar() 吃掉 回车

2 空格+% scanf(" %c",&c)前面这个空格(换成n或者t也可以),这样就把缓冲区中的回车当成第一个字符,读取后丢掉,空格读回车,然后继续读下一个

2.2 解决实例:

#include
int main(){
    int num =9;
    char i[num],j[num];
    for(int a=0;a
        scanf(" %c%c",&i[a],&j[a]);
    }
    for(int b=0;b
        printf("%c%c",i[b],j[b]);    
    }
}

三 总结

1:实际上针对%c的输入而言:%c遇到空格、回车、跳格等结束符都是会读取的。读

所以需要用空格或者getchar()可以解决缓冲里的回车。

2:针对%d scanf()在读取数字时会跳过空格、制表符和换行符!不读

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955161.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号