C语言 “吞字符” 加不加‘\n‘ ---- #145. 最长的名字
在做一道海贼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. 最长的名字相关推荐
- c语言 转移字符',转义字符
所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等, ...
- c/c++ 结构体前加不加typedef有什么区别?
结构体前面加不加typedef有什么区别? 为什么c程序中定义结构时经常要用到typedef呢?如: typedef struct _am_win_menutext { int idc int mes ...
- C语言中字符型和字符串型的对比
C语言中字符型和字符串型的对比 字符型: C语言中字符用单引号括起来,存储方式以ASCII编码二进制形式存储,占用一个字节 如:'a','b','c','A'等 注意:在C语言 ...
- C语言中字符数组的初始化与赋值,字符串相关函数
C语言中字符数组的初始化与赋值,字符串相关函数! 1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. (1)直接逐个初始化字符数组 ...
- C语言中字符型(char)的简单使用
C语言中字符型(char)的简单使用 刚接触C语言不久,在这记录下自己的一些学习心得.今天主要是在敲代码时遇到了一个小问题,如图: 应该是个比较简单的编程题.在我的想法中,应该使用循环逐个读入由A至Z ...
- C语言 | 统计字符中英文 空格 数字和其他
例52:输入一行字符,C语言编程分别统计出其中英文字母.空格.数字和其他字符的个数. 解析:首先要手动录入信息,但是scanf函数不记录空格,所以首先键盘录入要用getchar函数. 源代码演示: # ...
- c语言中像y的字符是什么意思,C语言中字符型(char)的简单使用
C语言中字符型(char)的简单使用 刚接触C语言不久,在这记录下自己的一些学习心得.今天主要是在敲代码时遇到了一个小问题,如图: 应该是个比较简单的编程题.在我的想法中,应该使用循环逐个读入由A至Z ...
- JavaScript语句结尾的;加不加
对于js语言来说,除非一行代码要写两个语句,这种情况下第一个语句后面必须有分号,否则,在行末的分号加不加都可以.原因在于:分号本身不表征逻辑,不是开发者需要考虑的事情. 可将分号";&quo ...
- C语言实现AES加解密
C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...
最新文章
- 计算机内部使用什么方法技术,计算机内部使用什么技术
- 如何使用Soft-NMS实现目标检测并提升准确率
- Java中List和Map接口之间的区别
- 在.NET Core 3.0 Preview上使用Windows窗体设计器
- matlab计算macd_[原创]基于MATLAB的一个简单的交易策略(基于MACD)的Matlab代码
- 在SharePoint中使用自定义的服务器控件(Web Control)
- 怎么在Eclipse中安装WindowsBuilder
- bootloader系列二——arm920t--bootloader架构设计
- Pencil:开源的GUI原型设计工具
- 树莓派3b+开启无线wifi热点
- redit高可用持久
- 【自动化测试】Selenium IDE脚本编辑与操作(了解)
- 微信小程序使用towxml解析md/html
- 「视频直播技术详解」系列之六:现代播放器原理
- 金蝶K3开发-委外入库批量核销和反核销
- 矩阵论 施密特正交化的几何解释_最直观图解法
- 一只蝴蝶引发的海啸:垂死的CDN行业风云再起
- Xml文件转换成Java对象
- Final Cut Pro X for Mac(FCPX专业视频剪辑软件) v10.4.6中文特别版
- python27和python36 共存时安装pip方法,解决python27文件夹下没有script文件方法