避雷 :C语言中 scanf() 函数的错误❌使用!!!

news2025/3/25 21:35:21

1. 返回值说明

scanf函数会返回成功匹配并赋值的输入项个数,而不是返回输入的数据

可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符,就表明输入存在问题。

#include <stdio.h>

int main() {
    int num;
    if (scanf("%d", &num) != 1) {  //1是指scanf 函数返回成功匹配并赋值的输入项个数
        printf("输入无效,请输入一个整数。\n");
        return 1;
    }
    printf("你输入的整数是: %d\n", num);
    return 0;
}
}

2. 地址传递

给 scanf 函数传递变量时,要传递变量的地址(即使用 & 运算符),这样 scanf 才能把输入的值存储到变量所在的内存位置。

#include <stdio.h>

int main() {
    int num;
    // 正确用法
    scanf("%d", &num);
    // 错误用法:scanf("%d", num); 
    return 0;
}

3. 输入缓存区问题

scanf 读取输入后,输入缓冲区可能会残留一些字符(如用户输入了回车->换行符 \n),这可能会对后续的输入操作产生影响。

#include <stdio.h>

int main() {
    int num;
    char ch;
    scanf("%d", &num);  //这里模拟用户输入整数后还按了回车
    getchar();   // 消耗掉输入缓冲区的换行符
    /*
当用户输入整数并按下回车键时,回车键产生的换行符 \n 会留在输入缓冲区里。
若不把这个换行符消耗掉,后续的 scanf("%c", &ch); 就会读取到这个换行符,而非用户输入的字符。
getchar() 函数的作用就是从输入缓冲区读取一个字符,这里它读取的就是换行符。
    */
   
    scanf("%c", &ch);  //&ch 表示把用户输入的字符存到 ch 变量的内存地址中。
    return 0;
}

4. 格式控制字符串

(1)匹配输入

格式控制字符串要和输入的数据类型相匹配。例如,读取整数用 %d,读取浮点数用 %f 等。

#include <stdio.h>

int main() {
    int num;
    float f;
    scanf("%d", &num);
    scanf("%f", &f);
    return 0;
}
(2)空格和特殊字符

格式控制字符串里的空格、制表符和换行符会匹配输入中的任意空白字符序列。其他非格式说明符的字符必须和输入中的字符精确匹配。

#include <stdio.h>

int main() {
    int a, b;
    // 输入时需要输入 a=1 b=2 这样的格式
    scanf("a=%d b=%d", &a, &b); 
/*
注意如果平时只需要输入一个值,则后面不要加空格。
即:scanf("%d ", &a);  这种写法是❌错误的
*/
    return 0;
}

5. 防止缓冲区溢出

使用 scanf 读取字符串时(%s),要留意防止缓冲区溢出。可以使用宽度限定符来限制读取的字符数量。

#include <stdio.h>

#define MAX_LENGTH 10

int main() {
    char str[MAX_LENGTH];
    // 最多读取 MAX_LENGTH - 1 个字符,为字符串结束符 '\0' 留位置
    scanf("%9s", str); 
    return 0;
}

6. 不同类型的混合使用

要注意输入格式和顺序,防止出现意外结果。

#include <stdio.h>

int main() {
    int num;
    char str[10];
    // 先输入整数,再输入字符串
    scanf("%d %s", &num, str); 
    return 0;
}

7. 错误处理

scanf 函数可能会因为输入不匹配、文件结束等原因失败,要对这些情况进行适当的错误处理。

#include <stdio.h>

int main() {
    int num;
    if (scanf("%d", &num) != 1) {
        if (feof(stdin)) {
            printf("输入结束。\n");
        } else {
            printf("输入错误。\n");
        }
        return 1;
    }
    return 0;
}

 因为今天又在scanf函数上栽了跟头,所以今天终于决定将scanf容易踩的抗自我做一个总结。以上是自己结合AI还有自己的一些理解写的一些总结。如果有不足处,欢迎评论区指出,如果对你有帮助,那可以给我一个👍赞吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯高频考点——并查集(心血之作)

并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1&#xff08;50分&#xff09;solution 2&#xff08;100分&#xff09; 按秩(树高)合并按大小合并 TA Can Do What & why learning 从字面意思上来理解就是&#xff0c;合并&a…

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

Redisson 分布式锁原理

加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey&#xff0c;itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…

【STM32】SPI通信外设硬件SPI读写W25Q64

SPI通信协议和W25Q64存储器芯片解读笔记&#xff1a; 【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&…

Spring JDBC Template与事务管理:基于XML与注解的实战指南

摘要 本文深入解析Spring JDBC Template与事务管理的核心技术&#xff0c;结合XML配置与注解方式两种主流方案&#xff0c;通过转账案例完整演示数据库操作与事务管理的最佳实践。文章涵盖JDBC Template的核心用法、事务配置语法、常见问题及性能优化建议&#xff0c;帮助开发…

【Keil5-开发技巧】

Keil5-开发技巧 ■ Keil5利用AStyle插件格式化代码第一步:下载AStyle插件第二步:添加AStyle插件第三步:AStyle插件介绍■ 一键转UTF-8编码■ Keil5利用AStyle插件格式化代码 第一步:下载AStyle插件 AStyle下载 第二步:添加AStyle插件 解压后 astyle-3.6.7-x64 在重命…

电脑上不了网普通用户排除方法

1&#xff1a;首先通过电脑的运行/CMD/ipconfig /all 命令查看电脑的ip地址是否正常如图&#xff1a; 2&#xff1a;在命令行中运行&#xff1a;ping 127.0.0.1 如图则正常&#xff0c;否则要重新安装网卡驱动 程序。 3&#xff1a;用ping命令&#xff0c;ping一下同网段的电…

【C#】WinForm自定义控件及窗体

前言 WinForm&#xff08;Windows Forms&#xff09;是Microsoft.NET框架中的技术&#xff0c;用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…

基于虚拟知识图谱的语义化决策引擎

在数字化转型浪潮中&#xff0c;企业数据资产的价值释放面临两大挑战&#xff1a;海量异构数据的整合困局与业务-技术语义鸿沟。本文解析飞速创软灵燕智能体平台的创新解决方案——通过构建业务语义驱动的虚拟知识图谱系统&#xff0c;实现企业数据的智能认知与决策赋能。 一、…

HarmonyOS:@AnimatableExtend 装饰器自学指南

在最近的项目开发中&#xff0c;我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中&#xff0c;我发现了 AnimatableExtend 装饰器&#xff0c;它为实现动画效果提供了一种非常灵活且强大的方式。然而&#xff0c;在学习这个装饰器的过程中&#xff0c;我发现相关的…

kubernetes|云原生|kubeadm-1.25.7集群单master+外部etcd集群+kubeadm-init+cri-docker文件形式快速部署

一、 前言和写作原因 本文做一个kubernetes集群部署记录&#xff0c;实在是部署的东西太多了&#xff0c;害怕忘记&#xff0c;kubernetes集群的部署又细节比较多&#xff0c;因此&#xff0c;在这里做一个尽量详细的记录 三个VMware虚拟机&#xff0c;IP分别为192.168.123.…

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器&#xff0c;需要解析mp3文件&#xff0c;于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…

新能源汽车充换站如何实现光储充一体化管理?

长三角某换电站光伏板晒到发烫&#xff0c;却因电网限电被迫切机&#xff1b;北京五环充电站每月多缴6万超容费&#xff1b;深圳物流车充电高峰排队3小时...当95%的充换站深陷“用不起绿电、扛不住扩容、算不清碳账”困局&#xff0c;安科瑞用一组真实数据撕开行业潜规则&#…

【数据分享】2000—2024年我国省市县三级逐年归一化植被指数(NDVI)数据(年平均值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年平均值。&#xff01;该数据来源于NASA定期发布的MOD13A3数据集&#xff01;很多小伙伴拿到数据后…

【leetcode题解】链表

目录 链表 两数相加 两两交换链表中的节点 重排链表 合并 K 个升序链表&#xff08;困难&#xff09; K 个一组翻转链表 链表 1. 常用技巧 画图&#xff01;&#xff01;&#xff01;&#xff08;直观形象&#xff0c;便于我们理解&#xff09;引入虚拟“头”节点&#xf…

Windows打开ftp局域网共享

前提是windows已经设置好开机账号密码了&#xff0c;否则教程不适用 第一先打开电脑ftp共享配置 点击保存即可 2.设置要共享到其他电脑的文件路径&#xff08;如果你要共享整个盘你就设置整个盘&#xff0c;如果是共享盘中某文件就设置某文件&#xff0c;这里是某文件&#x…

我爱学算法之——滑动窗口攻克子数组和子串难题(中)

学习算法&#xff0c;继续加油&#xff01;&#xff01;&#xff01; 一、将 x 减到 0 的最小操作数 题目解析 来看这一道题&#xff0c;题目给定一个数组nums和一个整数x&#xff1b;我们可以在数组nums的左边或者右边进行操作&#xff08;x减去该位置的值&#xff09;&#…

从零开始上手huggingface

1. 环境配置 # git 安装&#xff1a;https://git-scm.com/ # git lfs安装&#xff1a;https://git-lfs.com git lfs install # huggingface-cli 安装&#xff1a;https://huggingface.co/docs/hub/index pip install huggingface_hub2. 网站直接下载模型 可能会中断&#xff…

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型&#xff08;六&#xff09;&#xff1a;对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…