为什么循环里的gets()和fgets()在前面有一个scanf时,会跳过第一个的输出
2017-03-09 23:43
816 查看
今天在刷郑州轻工业oj上的题是碰到了一个关于字符串的,本来是水题一道十分钟就搞定的,结果卡了我一个小时。
有这样一段代码
当我给n赋值3的时候我却只能输入两个字符串,我百思不得其解啊。
后来才想明白当我给n赋值后摁下的回车符scanf是不会读取的,也就是会留在缓冲区,当进入第一次循环是gets会直接读取这个
换行符,也就是会直接结束读取,进入下一次循环,所以造成了少读取一次的错觉。只要再scanf后面加一个getchar()把换行符读取走即可,
或者是在%c前加一个空格 望大家引以为戒。
如果可以请关注下我的公众号(目前还在搭建,以后会不定时更新)
有这样一段代码
int main(void) { int n; char s[100] [100]; scanf("%d",&n); for(i=0;i<n;i++) gets(s[i]);//for循环会少进行一次 return 0; }
当我给n赋值3的时候我却只能输入两个字符串,我百思不得其解啊。
后来才想明白当我给n赋值后摁下的回车符scanf是不会读取的,也就是会留在缓冲区,当进入第一次循环是gets会直接读取这个
换行符,也就是会直接结束读取,进入下一次循环,所以造成了少读取一次的错觉。只要再scanf后面加一个getchar()把换行符读取走即可,
或者是在%c前加一个空格 望大家引以为戒。
如果可以请关注下我的公众号(目前还在搭建,以后会不定时更新)
相关文章推荐
- 为什么循环里的gets()和fgets()在前面有一个scanf时,会跳过第一个的输出
- 字符串的输入和输出(认识gets()fgets()scanf()和puts()fputs()printf()) ---CCS常用STDIO
- C语言技巧【枚举作为函数变量类型】【数据输入与输出】【do while循环体内scanf函数被跳过,循环结束】【用const修饰函数的参数】
- scanf输入、printf输出缓冲区 & gets/fgets
- 一个for循环输出二维数组
- 使用scanf和fgets需要注意的一个小问题
- sprintf为什么只输出第一个字符
- 区别 scanf gets fgets
- 面试题-一个for循环输出一个棱形
- Problem Description 青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。 Input 输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。 O
- scanf gets 和 fgets的区别
- C#,输出时,为什么前面有的要写{0}{1},但是有的就不用写呢?
- gets()fgets()scanf()和puts()fputs()printf()
- 一个简单java小学数学循环输出,两次显示文框
- 将一个文件的输出作为grep第一个参数的输入
- 字符串输入函数gets( ) fgets( ) scanf( )
- 第17 题:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- HtmlTestCode:循环遍历当前文档中的元素,将子元素的Name及个数输出到一个空白文档中
- 第一个java小程序 applet 画一个圆 获取网页自定义的参数来输出