关于scanf很多人不知道的小秘密

2023-05-16

今天忽然想到一个问题,假如我利用scanf想给变量a输入一个%d的整数,结果不小心输入了一个字符串yf或者是123ff后会怎么样呢?

哈哈,自己测试了一下,结果发现,当你输入的时123ff即前面是整数后面是字符串时,编译器会将前面的123赋值给变量a,而后面的ff字符串仍然会存在于缓冲区内,当你输入的时ff123或者yf时,编译器不会将你输入的任何东西给变量此时变量的值是随机的,如果此时输出变量时,有些编译器会默认给0,而你所输入的会全部储存在缓冲区内。此时就会很危险,甚至会出现死循环!!如何解决呢?,下面通过一个例题帮助大家,话不多说,下面就通过一道简单的例题帮助大家理解吧!


      这个例题就是讨论我想要你输入1-9中的一个数,结果我们输入的数字大了、小了或者错误了怎么办呢?通过代码我们知道,如果输入不正确会有各种方式提示你输入错误,并且要求你重新输入,没有放源代码是想让大家多练习代码,同时图片看起来也舒服,源代码会放在最下面。

       分析:

       1、首先我们定义一个字符串变量c(char c),和整型变量a(int a),a,c不用赋初始值的(那是我调试时赋值的,忘了删除了);

  2、提示让我们输入1-9范围内的整数;

 3、利用getchar检查是否能获取到除了\0以外的字符串,如果没有,说明我们输入的是整数,再检查输入值是否在1-9之间,

不是的话需要返回重新输入,利用了goto(切记goto不要滥用,但有时候又特别方便);

 4、如果检查出缓冲区还有其他字符时怎么办呢?当然要先清零了,不然返回到scanf,本想再次输入,结果就编程了死循环

了,痛苦啊,怎么清空呢?当然是gerchar了,我把你取完了你不就没了吗,是不是?

 5、既然你第一次输入错误了,那这次肯定要提醒重新输入了,同时不忘了警告一次,我让你输入整数你给我整别的东西,

不是故意开玩笑的啊,下次不要了哦。

以上就是说明注意不要让输入缓冲区留下多余的内容,否则很危险的;第二如何去清除输入缓冲区的错误内容。

如果大家有更好的建议,特别欢迎留言,谢谢!

代码奉送如下:

/**************************************************************
 *Title:A little secret about using "scanf"
 *Author:Wenfei6316
 *Date:Jan 28, 2018
 *************************************************************/
#include<stdio.h>
int main(int argc, const char *argv[])
{
char c;
int a;
printf("Please input a number for 1 to 9:\n");
exit:
scanf("%d",&a);
if(c=getchar()=='\n')
{
if(a>0&&a<=9)
{
printf("Congratulations, you input the correct number!\n");
printf("The correct number you inputed is: %d.\n",a);
}
//If you input the number not in 1 to 9, what you want to do?
else 
{
printf("You are wrong! Please input again:\n");
goto exit;
}
}
//If you don't input the digit but the character string, what you want to do?
else
{
printf("Oh my god, you are kidding me! Number not others!\n");
while(c=getchar()!='\n')
{}
printf("Please input again:\n");
goto exit;
}


return 0;





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于scanf很多人不知道的小秘密 的相关文章

  • 基于STM32F103C8T6的USART1串口的中断接收

    一 串口介绍 二 项目所需硬件 1 USB转串口模块 三 项目代码 一 串口介绍 USART Universal Synchronous Asynchronous Receiver Transmitter 通用同步 异步串行接收 发送器 U
  • 第5讲—寄存器编程

    编程方式两种 xff0c 一种是寄存器编程 xff0c 一种是函数库编程 什么是寄存器 stm32芯片 61 ARM内核生产Cortex内核 43 st公司 xff08 在内核基础上 xff09 开发stm32 寄存器是用来地址操作的 寄存
  • C语言运行HTTP代码示例

    include lt iostream gt include lt algorithm gt include lt cstring gt include 34 curl curl h 34 usingnamespace std static
  • 在Linux上实现HTTP请求

    在Linux上实现HTTP请求是一种非常有用的技能 xff0c 有时候我们需要从Web服务器获取数据 xff0c 而不是使用浏览器发起网络调用 HTTP是一种常用的网络协议 xff0c 可以用于在Linux上实现HTTP请求 要在Linux
  • Linux下设置堆栈系统参数

    Linux系统下有几个与堆栈相关的系统参数 xff1a 1 ulimit s xff1a 此参数用于限制进程的堆栈大小 可以使用该命令来查看和更改进程的堆栈大小限制 2 proc sys kernel stack protect xff1a
  • Leetcode每日一题——“消失的数字”

    各位CSDN的uu们你们好呀 xff0c 今天 xff0c 小雅兰又开新专栏了 xff0c 以后会在Leetcode上面进行刷题 xff0c 尽量每天写一道 xff0c 请大家监督我 xff01 xff01 xff01 好啦 xff0c 让
  • Leetcode每日一题——“轮转数组”

    各位CSDN的uu们你们好呀 xff0c 今天 xff0c 小雅兰的内容是轮转数组 xff0c 下面 xff0c 让我们进入轮转数组的世界吧 小雅兰之前其实就已经写过了字符串旋转的问题了 xff1a C语言刷题 xff08 7 xff09
  • Python一行命令搭建HTTP服务器并外网访问【内网穿透】

    文章目录 1 前言2 本地http服务器搭建2 1 Python的安装和设置2 2 Python服务器设置和测试 3 cpolar的安装和注册3 1 Cpolar云端设置3 2 Cpolar本地设置 4 公网访问测试5 结语 转载自远程内网
  • 顺序表(更新版)——“数据结构与算法”

    各位CSDN的uu们你们好呀 xff0c 今天小雅兰又来更新新专栏啦 xff0c 其实之前我就已经写过了顺序表的内容 xff0c 只是之前的内容不是最新版的顺序表 xff0c 现在 xff0c 我来更新一下最新版的顺序表 xff0c 下面
  • Leetcode每日一题——“移除元素”

    各位CSDN的uu们你们好呀 xff0c 小雅兰又来啦 xff0c 今天 xff0c 小雅兰的内容是移除元素 xff0c 下面 xff0c 让我们进入Leetcode的世界吧 说明 为什么返回数值是整数 xff0c 但输出的答案是数组呢 请
  • Leetcode每日一题——“回文数”

    各位CSDN的uu们 xff0c 你们好呀 xff0c 今天小雅兰又来刷力扣啦 xff0c 今天的题目是回文数 xff0c 下面 xff0c 让我们进入回文数的世界吧 示例 1 xff1a 输入 xff1a x 61 121 输出 xff1
  • 【社区图书馆】《新程序员005:开源深度指南 & 新金融背后的科技力量》

    各位CSDN的uu们你们好呀 xff0c 今天 xff0c 小雅兰来给大家推荐一本书 xff0c 此书的书名为新程序员005 xff1a 开源深度指南 amp 新金融背后的科技力量 xff0c 为什么小雅兰今天要给大家推荐这样一本书呢 xf
  • Nodejs快速搭建简单的HTTP服务器,并发布公网远程访问

    文章目录 前言1 安装Node js环境2 创建node js服务3 访问node js 服务4 内网穿透4 1 安装配置cpolar内网穿透4 2 创建隧道映射本地端口 5 固定公网地址 转载自内网穿透工具的文章 xff1a 使用Node
  • Leetcode每日一题——“合并两个有序数组”

    各位CSDN的uu们你们好呀 xff0c 又到小雅兰的愉快题解时候啦 xff0c 今天 xff0c 我们的题目内容是合并两个有序数组 xff0c 下面 xff0c 让我们进入合并两个有序数组的世界吧 示例 1 xff1a 输入 xff1a
  • Leetcode每日一题——“链表的中间结点”

    各位CSDN的uu们你们好呀 xff0c 今天 xff0c 小雅兰愉快的刷题内容是链表的中间结点 嘿嘿 xff0c 小雅兰的单链表还在偷懒ing xff0c 一直没有更新 xff0c 最近应该会更新出来 下面 xff0c 就让我们进入链表的
  • VRPN-体验

    VRPN简介 VRPN提供封装在库里的一套类 xff0c 在VR系统中 xff0c 用来为应用程序和物理外设提供网络传输接口 详细点击这里 VRPN源码获取 git clone https github com vrpn vrpn git
  • 单链表——“数据结构与算法”

    各位CSDN的uu们你们好呀 xff0c 今天 xff0c 小雅兰的内容终于是我们心心念念的单链表啦 xff0c 这一块呢 xff0c 是一个很重要的部分 xff0c 也是一个对目前的我来说 xff0c 比较困难的部分 xff0c 下面 x
  • springboot服务端接口外网远程调试,并实现HTTP服务监听【内网穿透】

    文章目录 前言1 本地环境搭建1 1 环境参数1 2 搭建springboot服务项目 2 内网穿透2 1 安装配置cpolar内网穿透2 1 1 windows系统2 1 2 linux系统 2 2 创建隧道映射本地端口2 3 测试公网地
  • MCSM面板一键搭建我的世界服务器-外网远程联机【内网穿透】

    文章目录 前言1 Mcsmanager安装2 创建Minecraft服务器3 本地测试联机4 内网穿透4 1 安装cpolar内网穿透4 2 创建隧道映射内网端口 5 远程联机测试6 配置固定远程联机端口地址6 1 保留一个固定TCP地址6
  • 初识MySQL数据库——“MySQL数据库”

    各位CSDN的uu们你们好呀 xff0c 小雅兰好久没有更文啦 xff0c 确实是心有余而力不足 xff0c 最近学习的内容太难了 xff0c 这篇博客又是小雅兰的新专栏啦 xff0c 主要介绍的是一些MySQL数据库的知识点 xff0c

随机推荐

  • Windows10本地搭建网站教程【内网穿透】

    文章目录 概述1 搭建一个静态Web站点2 本地浏览测试站点是否正常3 本地站点发布公网可访问3 1 安装cpolar内网穿透3 2 创建隧道映射公网地址3 3 获取公网URL地址 4 公网远程访问内网web站点5 配置固定二级子域名5 1
  • MySQL环境搭建——“MySQL数据库”

    各位CSDN的uu们你们好呀 xff0c 小雅兰又来啦 xff0c 好久没有更文啦 xff0c 今天继续 xff01 xff01 xff01 今天小雅兰的内容是MySQL环境搭建 xff0c 下面 xff0c 让我们进入MySQL数据库的世
  • 在树莓派上搭建WordPress博客网站【内网穿透】

    文章目录 概述安装 PHP安装MySQL数据库安装 Wordpress设置您的 WordPress 数据库设置 MySQL MariaDB创建 WordPress 数据库 WordPress configuration将WordPress站
  • 双链表——“数据结构与算法”

    各位CSDN的uu们你们好呀 xff0c 今天 xff0c 小雅兰又回来了 xff0c 到了好久没有更新的数据结构与算法专栏 xff0c 最近确实发现自己有很多不足 xff0c 需要学习的内容也有很多 xff0c 所以之后更新文章可能不会像
  • Windows在外远程桌面控制macOS【macOS自带VNC远程】

    文章目录 前言1 测试局域网内远程控制1 1 macOS打开屏幕共享1 2 测试局域网内VNC远程控制 2 测试公网远程控制2 1 macOS安装配置cpolar内网穿透2 2 创建tcp隧道 xff0c 指向5900端口 3 测试公网远程
  • 初学正点原子Ministm32板串口实验

    本章将实现如下功能 xff1a STM32 通过串口和上位机的对话 xff0c STM32 在收到上位机发过来的字符串后 xff0c 原原本本的返回给上位机 本章分为如下几个小节 xff1a 1 STM32串口简介 2 硬件设计 3 软件设
  • Qt网络通信实战(聊天室小项目TCP实现)

    一 UDP与TCP的区别 用一个表格来显示这两者的区别 比较项TCPUDP是否连接面向连接无连接传输是否可靠可靠不可靠流量控制提供不提供工作方式全双工可以是全双工应用场合大量数据少量数据速度慢 快 我们这里采用TCP 当有新的连接出现时就会
  • 常用坐标系及坐标系之间的变换

    坐标系统 xff1a 有哪些坐标系 xff0c 他们之间的变换矩阵是怎样的 xff1f xff08 主要是3个坐标系 3 个角 xff09 地理坐标系 xff08 n系 xff09 坐标系原点On取为飞行器质心 Xn轴向指向北 xff0c
  • ulimit命令用法详解

    ulimit用来限制每个用户可使用的资源 xff0c 如CPU 内存 句柄等 一 用法 ulimit SHacdefilmnpqrstuvx 限制 参数详解 S xff1a 表示软限制 超出设定的值会告警 H xff1a 表示硬限制 xff
  • java的数组反转

    Java中数组反转一般有两个思路 xff0c 第一个是新建一个临时数组 xff0c 把原来的数组内各值倒着给放进去 public class ArrayReverse public static void main String args
  • Ardupilot移植经验分享(1)

    目录 前言背景为什么写这篇文章移植Ardupilot的方法有两种底层适配提取应用层代码两种方法对比 准备阅读源码阅读官方开发者wiki选择编译平台下载编译源代码切换版本的正确方式编译老版本手动下载编译器修改PATH配置配置ubuntu以支持
  • 国产UOS系统之——安装wxPython

    安装依赖库 xff1a sudo apt get install libgtk 3 dev sudo apt get install libcanberra gtk module sudo apt get install pkg confi
  • OpenHarmonyllvm交叉编译工具链编译介绍

    一 工具链基础介绍 1 1 工具链下载 repo init u https gitee com OpenHarmony manifest git b master m llvm toolchain xml repo sync c repo
  • 一键配置Ubuntu的OpenHarmony基础编译环境

    一键配置Ubuntu的OpenHarmony基础编译环境 一 配置前说明 该更新源仅适用于Ubuntu以下系列 Ubuntu18 04 Ubuntu20 04 Ubuntu22 04 强烈推荐Ubuntu20 04 xff0c 本人使用的一
  • 卸载Proteus后再次安装出错解决办法

    相信有人和我一样 xff0c 在卸载Proteus后再次安装时会跳过下图这一步 然后安装完了注册时会弹出修改注册 LICENCE失败 xff0c 从而导致破解不成功 xff0c 怎么办呢 xff1f 本人解决方法 xff1a 1 首先正常安
  • STM32cubeMx来对单片机串口1进行初始化

    步骤如下 xff1a 打开STM32CubeMX软件并新建一个工程在Pinout amp Configuration选项卡中选择正确的芯片型号 xff0c 然后在Pinout视图中找到串口1相关的引脚 默认情况下 xff0c 串口1使用PA
  • Keil 头文件源程序代码——Math.h

    MATH H Prototypes for mathematic functions Copyright c 1988 2002 Keil Elektronik GmbH and Keil Software Inc All rights r
  • Keil头文件代码—Absacc

    ABSACC H Direct access to 8051 extended 8051 and NXP 8051MX memory areas Copyright c 1988 2010 Keil Elektronik GmbH and
  • reg52.h中直接定义了P3^4等引脚,但是P1^5引脚没有明确表示出来?

    实际上reg52 h中已经定义了 34 sfr P0 61 0x80 sfr P1 61 0x90 sfr P2 61 0xA0 sfr P3 61 0xB0 34 等引脚的地址 xff0c 如果取P1 5的引脚 xff0c 只需要表示成
  • 关于scanf很多人不知道的小秘密

    今天忽然想到一个问题 xff0c 假如我利用scanf想给变量a输入一个 d的整数 xff0c 结果不小心输入了一个字符串yf或者是123ff后会怎么样呢 xff1f 哈哈 xff0c 自己测试了一下 xff0c 结果发现 xff0c 当你