在做一道海贼oj的C语言题目,我输入n为3

但发现一直少了一次输入机会

后来发现是出现 “吞字符”

#include <stdio.h>
#include <string.h>
int main() {int n,j;char x;char max[100] = " ";scanf("%d",&n);    //  这里的scanf 出现"吞字符"  ,可以在%d后面加/n 变成%d/n// 或者在这里添加一行  getchar();for(int i=0;i<n;++i,j=0){char name[100] = " ";while(scanf("%c",&x)!=EOF){if(x!='\n')  name[j++] = x;else{if(strlen(name)>strlen(max)) strcpy(max,name);  break;  }}}printf("%s\n",max);return 0;
}

“吞字符” 原因分析

为什么 n 为 3,但只能输入两个值  ?

1. 用户输入了什么? 程序实际读取了什么? 输出结果是什么

用户输入

3 // 3'\n'

tom // Tom'\n'

gaofei // Gaofei'\n'

lobs // 如题,lobs这一行输入不了,程序直接出结果了

程序结果:

3

tom

gaofei

gaofei

2. 为什么会吞掉一次输入?

2.1 分析两个scanf

第一个scanf("%d",&n); 希望读入的是一个整数 ;

第二个scanf("%c",&x) 希望读入的是一个字符;

2.2 分析实际读取情况

用户输入数字3 然后 Enter键确认,输入了3'\n'

第一个scanf的格式是%d, 数字3被成功读取并赋值给了变量x

但还有一个换行符'\n' 没有被读取, 它卡在输入流里面

等程序第一次进入for-while循环: i = 0

执行第二个scanf,scanf发现输入流里面已经有一个字符'\n'

就把这个'\n' 读取进来,就是在这里用掉了一次用户输入的机会

后面啥也没干走到break,就结束了第一次for循环

for-while第二次循环 (i 自增变成 1 ; j复位变成0)

scanf再次打开,用户输入Tom'\n',

Tom这三个字符被正确赋值到name[0],name[1],name[2]

后面的'\n' 则被导入else ,结束了本次while循环..........

后面的代码正常跑...

3. 解决“吞字符”的两个方法

第一种方法: scanf里面加个换行符 变成 sacnf("%d\n",&x);

当用户输入 3'\n' ,数字3和换行符'\n'都被读取:

3被赋值给变量x, 换行符'\n'也不会卡在输入流

第二种方法: scanf 下面加 getchar( )

当用户输入 3'\n' ,数字3被成功读取并赋值

换行符'\n'则被getchar()从输入流中取下来

这样就不会影响到后面的scanf("%c",&x)读字符

C语言 “吞字符” 加不加‘\n‘ ---- #145. 最长的名字相关推荐

  1. c语言 转移字符',转义字符

    所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等, ...

  2. c/c++ 结构体前加不加typedef有什么区别?

    结构体前面加不加typedef有什么区别? 为什么c程序中定义结构时经常要用到typedef呢?如: typedef struct _am_win_menutext { int idc int mes ...

  3. C语言中字符型和字符串型的对比

    C语言中字符型和字符串型的对比 字符型:     C语言中字符用单引号括起来,存储方式以ASCII编码二进制形式存储,占用一个字节     如:'a','b','c','A'等     注意:在C语言 ...

  4. C语言中字符数组的初始化与赋值,字符串相关函数

    C语言中字符数组的初始化与赋值,字符串相关函数! 1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. (1)直接逐个初始化字符数组 ...

  5. C语言中字符型(char)的简单使用

    C语言中字符型(char)的简单使用 刚接触C语言不久,在这记录下自己的一些学习心得.今天主要是在敲代码时遇到了一个小问题,如图: 应该是个比较简单的编程题.在我的想法中,应该使用循环逐个读入由A至Z ...

  6. C语言 | 统计字符中英文 空格 数字和其他

    例52:输入一行字符,C语言编程分别统计出其中英文字母.空格.数字和其他字符的个数. 解析:首先要手动录入信息,但是scanf函数不记录空格,所以首先键盘录入要用getchar函数. 源代码演示: # ...

  7. c语言中像y的字符是什么意思,C语言中字符型(char)的简单使用

    C语言中字符型(char)的简单使用 刚接触C语言不久,在这记录下自己的一些学习心得.今天主要是在敲代码时遇到了一个小问题,如图: 应该是个比较简单的编程题.在我的想法中,应该使用循环逐个读入由A至Z ...

  8. JavaScript语句结尾的;加不加

    对于js语言来说,除非一行代码要写两个语句,这种情况下第一个语句后面必须有分号,否则,在行末的分号加不加都可以.原因在于:分号本身不表征逻辑,不是开发者需要考虑的事情. 可将分号";&quo ...

  9. C语言实现AES加解密

    C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...

最新文章

  1. 计算机内部使用什么方法技术,计算机内部使用什么技术
  2. 如何使用Soft-NMS实现目标检测并提升准确率
  3. Java中List和Map接口之间的区别
  4. 在.NET Core 3.0 Preview上使用Windows窗体设计器
  5. matlab计算macd_[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码
  6. 在SharePoint中使用自定义的服务器控件(Web Control)
  7. 怎么在Eclipse中安装WindowsBuilder
  8. bootloader系列二——arm920t--bootloader架构设计
  9. Pencil:开源的GUI原型设计工具
  10. 树莓派3b+开启无线wifi热点
  11. redit高可用持久
  12. 【自动化测试】Selenium IDE脚本编辑与操作(了解)
  13. 微信小程序使用towxml解析md/html
  14. 「视频直播技术详解」系列之六:现代播放器原理
  15. 金蝶K3开发-委外入库批量核销和反核销
  16. 矩阵论 施密特正交化的几何解释_最直观图解法
  17. 一只蝴蝶引发的海啸:垂死的CDN行业风云再起
  18. Xml文件转换成Java对象
  19. Final Cut Pro X for Mac(FCPX专业视频剪辑软件) v10.4.6中文特别版
  20. python27和python36 共存时安装pip方法,解决python27文件夹下没有script文件方法

热门文章

  1. 计算机一级考试大纲(详细版)
  2. 5G NR空口物理层主要参数解读
  3. leetcode877
  4. html表格筛选,js实现表格筛选功能
  5. cml sml区别_资本市场线简介,资本市场线CML与SML的区别
  6. 张亚飞《.Net for Flash FMS》读后笔记一
  7. 推荐丨t.cn/…、dwz.cn/…、url.cn/… 等短网址链接的还原工具
  8. 联邦学习进阶之路升级打怪
  9. SpringBoot后台管理系统框架
  10. 下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换