当前位置: 首页 > article >正文

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

1. 返回值说明

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

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

#include <stdio.h>

int main() {
    int num;
    if (scanf("%d", &num) != 1) {  //1是指输入的数据个数
        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.kler.cn/a/597543.html

相关文章:

  • Axios 和 跨域 这两个概念
  • IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法
  • 自用基于 TypeScript 的 WebSocket 客户端封装
  • 数据结构--顺序查找
  • 【C语言】深入理解指针(一):从基础到高级应用
  • 【第19节】windows sdk编程:文件I/O
  • 麒麟操作系统作为服务器,并且需要在浏览器上调试 MATLAB
  • Linux 内核源码阅读——ipv4
  • Linux系统管理与编程10:任务驱动综合应用
  • Github 2025-03-19 C开源项目日报 Top4
  • GPT-5 将免费向所有用户开放?
  • 雷池SafeLine-自定义URL规则拦截非法请求
  • 计算机网络——通信基础和传输介质
  • 深入理解 Collections.emptyList():优雅处理空列表的利器!!!
  • 【Nodejs】2024 汇总现状
  • SAP SD学习笔记33 - 预詑品(寄售物料),预詑品引渡(KB),预詑品出库(KE)
  • Nginx基于SSL的TCP代理
  • 数据结构-----哈希表和内核链表
  • Unity热更新方案HybridCLR+YooAsset,从零开始,保姆级教程,纯c#开发热更
  • 2024年十大开源SLAM算法整理