gets() 与 scanf() 的小尴尬
gets() 与 scanf() 函数相处呢有点小尴尬的,就是 gets() 在 scanf() 后边就爱捣乱。为什么呢,先了解它们两者之间的异同:
同: 都是可以接受连续的字符数据 并在字符结束后自动加上 '\0',标志结束接受
异:
scanf 不能接受空格、制表符Tab、回车等,遇空格时就结束接受
gets 则能够接受空格、制表符Tab和回车等,遇回车或EOF(end of file)时都会结束接受
当 gets() 在 scanf() 后,结束输入 scanf() 后回车时,gets()就把回车这个键给接收了。这关键就在于二者使用的结束标记不同。输入字符串时,scanf()遇到空格、回车、Tab结束,但在缓冲区中还留着这些结束符,此后如果使用gets()想去获取下一行字符串,它碰到的却是前面遗留下来的回车(或者回车之前还有空格等空白符),那么这次gets()就直接失效了。所以就出现了常碰到的第一个字符串变成空白字符串的现象。之前总是遇到,于是笔者本人就绕了个弯来解决这个问题。
本人所用的是 sscanf() 这个函数(是C语言中从一个字符串中读进与指定格式相符的数据的函数)来解决这个回车被吃掉的问题,关于 sscanf() 这个函数格式头文件 stdio.h 中这么描述:
_Check_return_ _CRT_INSECURE_DEPRECATE(sscanf_s)
_CRT_STDIO_INLINE int __CRTDECL sscanf(
_In_z_ char const* const _Buffer,
_In_z_ _Scanf_format_string_ char const* const _Format,
...)
sscanf(待读进字符串,指定与字符串相符的格式,变量数据列表)
举个粟子吧
#include<stdio.h>
int main(void)
{
int d;
char c, a[] = "365hello", b[];
sscanf(a, "%d%c%s", &d, &c, b);
printf("%d %c %s", d, c, b);
}
运行打印出结果 365 h ello ,这些都是符合指定的格式。也正是通过这样,我就同时用了两个 gets 第一个用来读取本就在 scanf()获取的字符信息,再通过 sscanf() 提取出可用的数据,这就有点麻烦了,不过对于特殊的输入还是有大用处的,因为 sscanf() 支持正则表达式。比如要求输入 m:4 而需要的数据是 4 ,那么就可以通过 sscanf() 正则表达式来将 : 忽略掉获取我们可用的数据。(关于强大的正则表达式可以参阅此文章 https://www.cnblogs.com/lanjianhappy/p/7171341.html)
后来,偶然的机会对尝试了将 scanf() 和 gets() 混用,不同的是用了 getchar() 在 scanf() 后,发现竟然可以,大概的原因是 getchar() 阻止了 gets() 吃掉 scanf() 的回车。(好像是废话。。。)再后者上网查阅了一下,原来还可以这样的,还有个方法就是在 scanf() 后加上个 scanf("\n") 算是再加上一个回车符来补充被 gets() 吃掉的回车吧。
像这样就对了,简单的可以用 scanf() 解决的就这样咯,同时也可适用 C++ 的 cin 不用像笔者那样来个 双gets() 来加上个 sscanf() 当然用用也无妨,特殊情况也是有的嘛。
#include<stdio.h>
int main(void)
{
int n;
char a[];
scanf("%d", &n); //或这样 不用下一条的 scanf("\n"); 直接这样 scanf("%d\n", &n);
scanf("\n");
gets_s(a);
puts(a);
}
gets() 与 scanf() 的小尴尬的更多相关文章
- setTimeout的小尴尬
我们都知道,alert这种内置弹框会阻塞后续代码执行: 之所以如此,就是因为JavaScript代码在浏览器中是单线程执行的.换句话说,浏览器中只有一个主线程负责运行所有JavaScript代码(不考 ...
- POJ1251 Jungle Roads Kruskal+scanf输入小技巧
Jungle Roads The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ai ...
- 解决npm install卡住不动的小尴尬
npm install卡顿问题记录 遇到的问题 npm install -g @angular/cli 安装angular cli工具时,发现进度条一直卡住不动,相信很多朋友也遇到过.原因应该是国内的 ...
- jzyz 题库 题目选做
题库中也有很多我想不出来的模拟赛的题目.做还是必要的.做自己的题目 时间很紧 想想自己的文化课 我又没有那么强 我必须得刷. LINK:水题一道 发现是一道计数题 计数题拿高分的才是王者,但是 计数题 ...
- 【原】HTML5 新增的结构元素——能用并不代表对了
做移动端有一段时间,今天有同事问了我 article 和 section 标签的使用,模模糊糊的解释了下,他似懂非懂,有点小尴尬.忽然间觉得自己有必要再翻翻书籍,重温下 html5 的新元素.html ...
- HDU 5045 Contest
pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...
- MY WAY程序(十八) 团队开发
1.通信知识 要了解的强哥的移动通信先验知识布局.我和另外一个毕业生有自己的学习,但我真的没有认真看.了解了一下,其余大部分时间在搞nodejs.另外一个应届毕业生则是按着一本电子书 ...
- ASP.NET Core MVC压缩样式、脚本及总是复制文件到输出目录
前言 在.NET Core之前对于压缩样式文件和脚本我们可能需要借助第三方工具来进行压缩,但在ASP.NET MVC Core中则无需借助第三方工具来完成,本节我们来看看ASP.NET Core MV ...
- 关于使用git和github的一点点感想
第二篇博客 首先附上我的第一个java程序github地址: https://github.com/KingsC123456/FirstJavaHello 其次是关于我的github介绍,因为一直使用 ...
随机推荐
- 【Java线程安全】 — 常用数据结构及原理(未完结)
本文主要记录自己对于多线程安全的学习,先来记几个线程安全模型. 首先最重要的当然是volatile和AQS了: 我们知道,整个java.cuncurrent包的核心就是volatile,CAS加自旋悲 ...
- C++ 中文拼音排序方法。
参考文档:http://zisxks.com/2013/10/25/sort-Chinese-characters-in-cpp/ 采用locate.注意事项:排序的名字,如果出现某一个人,出现在顶上 ...
- 补充:ajax post 方式请求
1. 什么是ajax Ajax: asynchronous javascript and xml (异步js和xml) 其是可以与服务器进行(异步/同步)交互的技术之一. ajax的语言载体是j ...
- VS开发入门一:VS常用快捷键大全,工欲善其事必先利其器 只看标红的吧
1.快速using(这个的快捷键是ctrl+.)2.快速回到之前编辑的代码页面现在的项目动不动就几十个代码页面,经常需要在几个页面之间跳来跳去,这时就需要这两个快捷键:CTRL + - 向后定位,回到 ...
- [redis] redis
redis是什么? wiki redis官方介绍:introduction to redis 安装: install 拉到最下面的install小节 wget http://download.redi ...
- 【Python全栈-后端开发】Django进阶1-分页
Django[进阶篇-1 ]分页 分页 一.Django内置分页 from django.core.paginator import Paginator, EmptyPage, PageNotAnIn ...
- php 与mysql 数据库
新手上路,php刚学,数据库刚学,花了两天终于读到数据库的数据了. 一路上的坎坷我在这里吐槽吐槽: <?php $mysql_server_name='localhost'; //改成自己的my ...
- Django中一个项目使用多个数据库
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...
- MongoDB 备份(mongodump)与恢复(mongorestore)
MongoDB 备份(mongodump)与恢复(mongorestore) 备份:使用mongodump命令导出所有数据库到指定目录 参数说明: --host:MongoDB所在服务器IP. -- ...
- C#基础加强(1)之索引器
索引器 介绍 索引器,初学者可能听起来有些陌生,但其实我们经常会用到它,例如: // 字符串的索引器 string str = "hello world"; ]; // 获取到字符 ...