C语言scanf()函数使用的注意事项

2023-11-11

scanf()函数相信就算刚学C语言的朋友也知道,这是一个标准输入函数,它是从标准输入流stdin中读内容的。它的第一个参数是格式化字符串,后面跟着的存储内容的地址列表。
如果在全段代码中,只调用一次,且只获取一个变量内容的话,一般不会出现什么问题。不过在多次调用或者在一次调用中获取多个变量内容,代码往往会出现不符合预期的结果,下面由我给大家说明一下我自己在调用时出现过的问题,以及解决办法。

1. 多次调用scanf()函数,每次调用都获取一个字符变量内容,但是存储的字符变量内容与实际输入不符。

#include <stdio.h>
int main(int argc,char **argv)
{
    char a = 0, b = 0;
    scanf("%c",&a);
    scanf("%c ",&b);
    printf("a:%d, b:%d \r\n",a,b);
    return 0;
}

在这里插入图片描述
从图中可以看到,b变量输入的字符与实际存储的内容不符,b变量应该输出的值为98,是b对应的ASCII码,但是输出的是10,是转义字符\n对应的ASCII码。说明如果是输入字符变量内容的话,回车键作为转义字符输入也有可能会被识别存储。那要怎么解决呢?

(1)改变第二次调用的格式化字符串,在前面加上\n,以便过滤掉第一次调用后输入的回车键转义字符。

#include <stdio.h>
int main(int argc,char **argv)
{
    char a = 0, b = 0;
    scanf("%c",&a);
    scanf("\n%c",&b);
    printf("a:%d, b:%d \r\n",a,b);
    return 0;
}

(2)在第一次调用和第二次调用之间,多加一个getchar()函数调用。

#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
    char a = 0, b = 0, c = 0;
    scanf("%c",&a);
    getchar();
    scanf("%c",&b);
    printf("a:%d, b:%d \r\n",a,b);
    return 0;
}

在这里插入图片描述
以上两种办法都可以解决这个问题。

2. 一个scanf()函数输入多个整型变量内容,并且连续调用,但是scanf()函数没有起到阻塞的作用。

#include <stdio.h>
int main(int argc,char **argv)
{
    int a = 0, b = 0;
    while(1)
    {
        printf("input two num:\r\n");
        scanf("%d,%d",&a,&b);
        printf("a:%d, b:%d \r\n",a,b);
    }
    return 0;
}

在这里插入图片描述
正常情况下,按照scanf()函数格式化字符串的格式输入整型内容,运行会正常。

在这里插入图片描述
但是如果输入整型内容与格式化字符串的格式不同,或者输入了非整型内容,从第二次调用scanf()函数开始,scanf()函数一直获取的都是这个非整型内容,而又与格式化字符串不符,直接终止这次函数调用,导致scanf()函数没有起到堵塞作用,输入内容与存储内容不符。如果在一个while(1)循环中调用scanf()函数,就可能会出现死循环,导致无法正常执行。

解决这个问题的办法也是增加调用一次getchar()函数。因为很难保证用户会按照要求输格式入,所以如果有更好的选择的话,还是少用scanf()函数吧,其他的非堵塞函数输入,如kbhit()函数与getchar()函数配合使用的设计就挺基础好学的。

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

C语言scanf()函数使用的注意事项 的相关文章

  • IP地址、子网掩码、网关、DNS的关系及sicket的常识

    1 什么是IP地址 32 4 8 255 D 1111 1111 B 28 1 所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址 按照TCP IP协议规定 IP地址用二进制来表示 每个IP地址长32bit 比特换
  • 怎么在java中关闭一个thread

    怎么在java中关闭一个thread 我们经常需要在java中用到thread 我们知道thread有一个start 方法可以开启一个线程 那么怎么关闭这个线程呢 有人会说可以用Thread stop 方法 但是这个方法已经被废弃了 根据O
  • ai画面怎么调大小_AI中怎么把图像等比例扩大或缩小尺寸

    展开全部 AI中么把图像等比例扩大或缩小尺寸步骤如e69da5e6ba903231313335323631343130323136353331333366303830下 1 打开ai的软件 执行菜单栏中文件 新建 或者直接使用快捷键Ctrl
  • 什么是Agent

    一方面 Agent技术为解决新的分布应用问题提供了有效途径 另一方面 Agent技术为全面准确地研究分布计算系统的特点提供了合理的概念模型 在分布计算领域 人们通常把在分布式系统中持续自主发挥作用的 具有以下特征的活着的计算实体称为Agen

随机推荐

  • gh-ost大表DDL工具源码阅读

    gh ost大表DDL工具源码阅读 最终目的 开发环境与测试数据库准备 一个简单的ddl案例 debug分析程序执行过程 vscode debug配置 变量介绍 核心处理逻辑 分析我的需求 最终目的 尝试通过阅读源码 多测试熟悉gh ost
  • 多线程学习

    线程的三种创建方式 1 继承Thread类 创建线程的快捷方式一 继承Thread 重写run方法 调用start开启线程 总结 注意线程开启不一定执行 由cpu调度执行 public class TestThread1 extends T
  • 可迭代对象__iter__(), __next__()

    一 解释 在 Python 中 迭代是指逐个访问容器 如列表 元组 集合 字典等 中的元素 为了实现迭代 我们需要使用可迭代对象和迭代器 可迭代对象 Iterable 具有 iter 方法的对象被称为可迭代对象 这个方法返回一个迭代器 迭代
  • git使用socks5代理提示:Unsupported proxy syntax in 127.0.0.1:1080

    提示说是语法错误 打开 gitconfig文件查看代理 http proxy socks5 127 0 0 1 1080 https proxy socks5 127 0 0 1 1080 去掉前后的单引号 错误消失 http proxy
  • sql server 2008 r2各个版本的区别与选择

    windows server 2012 r2 standard安装sql server 2008 R2 https blog csdn net maoiur article details 78322175https blog csdn n
  • UniCode编码表

    Unicode编码则是采用双字节16位来进行编号 可编65536字符 基本上包含了世界上所有的语言字符 它也就成为了全世界一种通用的编码 而且用十六进制4位表示一个编码 非常简结直观 为大多数开发者所接受 特别是十六进制编码后 可以解决汉字
  • java泛型的简介说明

    转自 java泛型的简介说明 下文笔者讲述java泛型的简介说明 如下所示 在JDK5中 Java语言引入了泛型机制 但是这种泛型机制其实是通过类型擦除来实现 即Java中的泛型只在程序源代码中有效 源代码阶段提供类型检查 在编译后的字节码
  • CentOS7 下的配置FTP服务器增强版~(零基础学会FTP配置)

    ps 原文不知出处 但是原文也不能正常启动 这里做了一些修改 如果能正常配置请在下方留言让更多的人看到 因为之前我本人照着网上的教程安装卸载了十多次也无法正常使用 不希望后面的兄弟继续浪费时间 如果不能使用 也请劳烦贴出相应的错误 参考 h
  • go 环境变量存储在哪里?

    Q golang环境变量存储在哪里 A 保存在go env GOENV所示的文件里 C Users Administrator gt go env GOENV C Users Administrator AppData Roaming go
  • SQL Server 数据库的创建、删除、修改

    1 创建数据库CREATE 创建数据库语句的基本格式 CREATE DATABASE database name ON PRIAMRY
  • 使用Mulesoft建立webservice, simple方式,POJO

    Mulesoft是使用CXF来支持web service 有三种方式 1 JAX WS 2 Simple POJO 3 Proxy pass throught 本文介绍POJO 最简单的方式 1 首先创建接口跟实现类 接口可以不用 pack
  • ORACLE 分组函数COUNT使用

    COUNT 返回表中记录总数 适用于任意数据类型 两种使用方式 1 SELECT COUNT 1 FROM sh mp fksq where create id 50101311 运行效果 2 SELECT COUNT FROM sh mp
  • Python学习 -- 正则表达式(re模块)

    正则表达式是一种强大的模式匹配工具 用于在文本中查找和匹配特定模式的字符串 在Python中 我们可以使用re模块来操作和处理正则表达式 本篇技术博客将介绍正则表达式的基础语法和re模块的详细使用方法 并通过具体的代码案例来帮助初学者快速掌
  • sql server2005的死锁

    select request session id spid OBJECT NAME resource associated entity id tableName from sys dm tran locks where resource
  • 解决cannot resolve symbol “xxxx”的问题(亲测有效)

    今天做项目的时候导入了一个api接口 并且把附带的jar包也拷贝到了Maven项目中 但是有个方法一直报cannot resolve symbol xxxx 百思不得其解 在网上搜了各种各样的方法也没有解决 这个问题其实就是无法解析某方法
  • Java 实现简单邮件发送(带附件)

    目录 前言 一 添加pom依赖 二 完整发邮件代码 前言 最近写发邮件的功能时 需要把excel文件和邮件内容一起发送 简单记录 一 添加pom依赖
  • C# SuperSocket 手把手教你入门 傻瓜教程---3(Telnet服务器和客户端请求处理)

    C SuperSocket 手把手教你入门 傻瓜教程系列教程 C SuperSocket 手把手教你入门 傻瓜教程 1 服务器单向接收客户端发送数据 C SuperSocket 手把手教你入门 傻瓜教程 2 服务器和客户端双向通信 C Su
  • ICP算法(Iterative Closest Point迭代最近点算法)

    最近在做点云匹配 需要用c 实现ICP算法 下面是简单理解 期待高手指正 ICP算法能够使不同的坐标下的点云数据合并到同一个坐标系统中 首先是找到一个可用的变换 配准操作实际是要找到从坐标系1到坐标系2的一个刚性变换 ICP算法本质上是基于
  • JMeter快速入门知识系列(7)----JMeter断言之响应断言

    7 1 断言的定义 断言用于验证取样器请求或对应的响应数据是否返回了期望的结果 可以是看成验证测试是否预期的方法 对于接口测试与性能测试来说 就是测试Request Response 断言即可以针对Request进行 也可以针对Respon
  • C语言scanf()函数使用的注意事项

    scanf 函数相信就算刚学C语言的朋友也知道 这是一个标准输入函数 它是从标准输入流stdin中读内容的 它的第一个参数是格式化字符串 后面跟着的存储内容的地址列表 如果在全段代码中 只调用一次 且只获取一个变量内容的话 一般不会出现什么