scanf 函数 —— 基本的输入函数

一、概述

scanf 函数和 printf函数 一样,用途广泛,其功能用一句话概括就是 “ 通过键盘给程序中的变量赋值 ” 。

二、用法(格式)

scanf 函数的两种用法,或者说两种格式如下:

1、 scanf( " 输入控制符 " ,输入参数);      /* -----  英文输入法输入  -----*/    简单、常用用法      

例如:scanf("%d", &i);                       /* &i 表示变量 i 的地址,&是取地址符 */                                 

功能:将从键盘输入的字符转化为“ 输入控制符 ” 所规定格式的数据,然后存入以输入参数的值为地址的变量中。

“ 输入控制符 ” 和 “ 输出控制符 ” 是一模一样的。例如:一个整型数据,通过 printf 输出用 %d 输出,通过 scanf 输入时同样是用 %d 输入。

&是一个取地址运算符,&后面加变量名表示“该变量的地址”,所以&i就表示变量 i 的地址。&i又称为“ 取地址i ”,就相当于将数据存入以变量 i 的地址为地址的变量中,也就是将数据存入变量i中。

 综上所述:假如从键盘上输入字符 123,然后  %d 将这三个字符转化成十进制数 123,通过 “ 取地址 i ” 找到变量 i 的地址,再将数字 123 放到以变量 i 的地址为地址的变量中,即将数字 123 放到变量 i 中,所以最终的输出结果就是 i=123

或例如:scanf("%d%d", &i, &j);        /*一次给多个变量赋值*/

注意:       

        1)、键盘输入数据给多个变量赋值时,赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分是给不同变量赋的值。其中空格、回车或 Tab 键的数量不限,只要有就行。一般都使用一个空格。

         2)、scanf函数双引号内的多个 “ 输入控制符 ” 之间,千万不要加逗号。原因其一是:键盘输入时,逗号的数目容易出错;原因其二是:键盘输入时,中/英输入法容易混淆,会极大可能增加代码的出错率。

2、scanf( " 输入控制符非输入控制符 " , 输入参数);    /* -----  英文输入法输入  -----*/   不建议使用 

例如:scanf("i = %d", &i);         /* &i 表示变量 i 的地址,&是取地址符 */

“ 非输入控制符 ” 就是除了“ 输入控制符 ” 的其他符号,例如: i= 

综上所述:所有的 “ 非输入控制符 ” 在键盘上输入时都要原样输入,即键盘输入的时候 i= 必须要原样输入。例如:如果需要键盘输入给变量 i 赋值 123,那么必须在键盘上输入i=123才正确,否则就是错误。

不建议使用原因:scanf函数中的“ 非输入控制符 ” 在键盘输入过程中,既累赘又麻烦,没必要多此一举。 

所以在使用scanf函数时,务必记住 < 双引号内永远都不要加 “ 非输入控制符 ” >,只用 “ 输入控制符 ” ,即采纳用法(格式)1。

三、小结

1、scanf 的使用看似细节繁杂,但使用起来非常简单。就目前而言,只要掌握以下五点:

    1)、在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记。       

    2)、scanf 函数 双引号内,除了“ 输入控制符 ”外什么都不要写,尤其是不要用 \n 。         

    3)、“ 输出控制符 ” 和 “ 输出参数 ” 无论在 “ 顺序上 ” 还是在 “ 个数上 ” 一定要一一对应。 

    4)、“ 输入控制符 ” 的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理。       

    5)、使用 scanf 函数之前先用 printf 函数提示输入。

2、关于缓冲区的理解: 

        在 scanf 函数中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab 等字符,都会被当作数据存入缓冲区。存储的顺序是先输入的排前面,后输入的依次往后排。按下回车键的时候 scanf 开始进入缓冲区取数据,从前往后依次取。   

        如果 scanf 函数中仅有 %d ,则 scanf 函数只识别“十进制整数”。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。当 scanf 函数进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,那么它并不取用,而是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。未被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。但是如果 %d 遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。   

        如果将 %d 换成 %c,那么任何数据都会被当作一个字符,不管是数字还是空格、回车、Tab 键它都会取回。

四、实践问题总结 

1、判断“等不等于”是“==”,赋值是“=”。   

2、采用用法(格式)1的代码,其中 scanf 函数的“ 输入控制符 ”(%d)加没加空格隔开,当键盘输入字符时,都必须用空格、回车或者 Tab 键隔开。 

3、采用用法(格式)2的代码,其中 scanf 函数的“ 非输入控制符 ”(a/b/c)前面必须加一个空格隔开,否则会出现刷屏结果。而当键盘输入字符时,都可以或不用空格、回车或者 Tab 键隔开。

  • 20
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,没有直接的scanf()函数scanf()函数C语言中用于格式输入函数。在C++中,我们通常使用cin来进行输入操作。cin是C++中的标准输入流对象,可以用于从键盘读取用户输入的数据。与scanf()函数相比,cin更加安全和易于使用,因为它会自动处理输入错误和类型转换。所以在C++中,我们通常使用cin来替代scanf()函数进行输入操作。 #### 引用[.reference_title] - *1* [C++知识精讲7——scanf函数基本用法及实战运用(外加一点点比赛经验,非常实用)](https://blog.csdn.net/djfihhfs/article/details/126328224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [scanf函数特定格式输入操作](https://blog.csdn.net/m0_65129892/article/details/127516550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [devc++中scanf无报错的出错点 —— &的遗漏](https://blog.csdn.net/qq_42748120/article/details/83305316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值