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);
}

最新文章

  1. 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像
  2. iOS 导航栏返回的相关跳转
  3. c# 如何隐藏TabControl控件的标签
  4. 数字信号处理--FFT与蝶形算法
  5. openstack-kilo--issue(九) heat stacks topology中图形无法正常显示
  6. luogu10125回文数[noip1999 Day1 T1]
  7. setObject()用法
  8. UNTIY3D接入91SDK的办法
  9. 解决:未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”
  10. 解决VMware“该虚拟机似乎正在使用中”问题
  11. C# 中的多线程
  12. Sublime的快捷键的使用
  13. Python3基础 用三个双引号 print输出多行文本
  14. 280. Wiggle Sort
  15. 转】Spark DataFrame小试牛刀
  16. 为你下一个项目准备的 50 个 Bootstrap 插件
  17. 判断iOS设备是否越狱
  18. eclipse安装PyDev插件出错No software site found at jar:file:[离线包路径]!/. Do you wish to edit the location?
  19. linux shell 远程执行命令
  20. JS基础(三)构造函数

热门文章

  1. Water Buying
  2. 主流框架的搭建(VUE,React)
  3. PM2.5环境检测系统的设计与分析
  4. JavaScript基础知识(数组的方法)
  5. git fork代码并修改胡提交到自己的git仓库
  6. HDU 2612 - Find a way - [BFS]
  7. LeetCode 19 - 删除链表的倒数第N个节点 - [链表]
  8. Luogu4451 [国家集训队]整数的lqp拆分
  9. es6合并数组...
  10. 九、使用多线程——NSThread,GCD和NSOperation