• C语言易错知识点:scanf函数


    scanf在C语言学习中比较常用,但因为其涉及屏幕缓冲区导致有的时候会调入陷阱,下面分享一下常见的需要注意的事项:

    1.输入末尾带有回车'\n'

    当我们输入数据后,最后按下回车时,屏幕缓冲区的末尾都会含有这个字符

    scanf的返回值是成功读取的变量个数,正常情况下这个数量等于占位符的数量

    2.读取时的匹配规则

    scanf会根据占位符的类型到缓冲区去取相应的数据,其中%c什么都能取,包括空格等符号

    如果在%c前加了空格,就会跳过这些空格读取第一个字符

    其中因为%c前面没有空格,所以a把空格读走了,引发后续错误

    %s跳过空格开始读,遇到空格停止,这里很容易被坑。要读取空格,建议使用gets

    当读到占位符不匹配的类型时会自动停止读取,由下一个继续

    如果当前匹配不成功,会直接中断读取,后续的占位符不会起到作用

    3.回车换行是'\n',回车不换行是'\r'

    我们输入数据后敲的回车都是\n,相当于光标换行并回到起始位置,而\r只是回到起始位置,如果进行后续操作,会进行覆盖

    4.返回值EOF和0的区别

    EOF特指读取错误(不好验证)和文件末尾,一般在读取文件时用它来判定

    在控制台中,如果用EOF来作为循环条件的话,那么程序会被卡住,因为scanf会一直等我们输入,这个时候用0作为返回值的循环条件更好,因为下一个循环如果读不到想要的值,scanf的返回值就是0,这个时候循环就结束了。

    在循环读取时,scanf会跳过每次按的\n(回车),所以这里不会因为\n不匹配%d而中断

    5.用getchar清空缓冲区

    用getchar写一个循环,可以帮助我们清除\n,防止后续程序出错

    这里看到,不清空的话,%c会直接读走\n

  • 相关阅读:
    nodeJs--各种路径
    UDP三种通讯方式
    【Linux篇】第十七篇——信号量
    Ansible之playbooks剧本
    线程池原理解析
    java计算机毕业设计ssm易物小店交换系统-二手咸鱼交易系统
    笔记59:序列到序列学习Seq2seq
    云原生Kubernetes:pod亲和性与反亲和性
    机器人控制——PID参数整定
    VIC模型教程
  • 原文地址:https://blog.csdn.net/SGlow0708/article/details/136680658