C语言中scanf函数的原样输入的坑及解决

目录
  • scanf函数的原样输入的坑及解决
    • 1、scanf函数格式控制后面输入
    • 2、scanf函数的输入是有顺序的
    • 3、最重要的一点就是scanf切记要原样输入
    • 4、还有一个
  • scanf输入多个数据出现的问题
    • 问题引出
    • 执行原理
    • 程序分析
    • 解决方案

scanf函数的原样输入的坑及解决

scanf函数是C语言里一个输入函数,但其有很多地方需要注意:

1、scanf函数格式控制后面输入

的应该是变量的地址而不是变量本身(即变量名)

例,输入a,b 两个整型变量的值的时候,很多初学者会写成

scanf("%d %d",a,b)

这样写是错的,应该写成

scanf("%d %d",&a,&b)

2、scanf函数的输入是有顺序的

例如:

scanf(“%d %d”,&a,&b)

第一个%d是属于a的,第二个%d是属于b的

3、最重要的一点就是scanf切记要原样输入

即:

scanf(“a = %d,b = %d”,&a,&b);

输入的是时候应该写成“a = 1,b = 2”,记住逗号都要原样输入。

若是这样的话;

scanf(“a = %d b = %d”,&a,&b);

这样的话就要写成“a = 1 b =2”就连空格都要原样输入

总之一句话,除了占位符%d,%f,%lf等之类外的其他所有东西都要原样输入,包括空格,逗号

4、还有一个

如果scanf("%d %d %d",&a,&b,&c);,那么这时候可以在输入界面输入一个再按回车再输入下一个这样也是可以的,也可以按照这个格式在一行中进行原样输入。

总之中间有空格的就用空格隔开,如果是逗号的就用逗号来隔开,如果什么都没,即连在一块的话就按照输入格式输入即可。

scanf输入多个数据出现的问题

问题引出

如果使用scanf函数一次输入多个数据,只能是整型和浮点型,如果有char字符型混合输入,就会出现问题:

图中可以看到:num3的值并没有打印出来,出现这种情况的原因是什么呢???

执行原理

让我们先大概的过一下里面的执行原理:

  • 在执行scanf函数的时候,会让用户输入一个数据,数据输入完毕之后,并不是将这个数据直接赋值给变量,而是先将数据存储在缓冲区,输入的任何数据都会存储在缓冲区中
  • 在执行scanf函数的时候,会先检查缓冲区中是否有数据,如果缓冲区中没有数据,那么就会让用户从键盘输入,如果缓冲区中有数据,直接从缓冲区中将数据拿出来,不会让用户输入数据
  • 当从缓冲区中拿数据的时候,如果要拿的数据的类型是整型或者实型,如果拿到的数据的类型是空格、回车、Tab键,就会被自动忽略,继续往下拿;如果要拿的数据是字符型,不会忽略任何数据

程序分析

我们来分析下面的一段程序:程序中要求用户输入一个整型数据num1,但是这个时候我们偏偏输入两个整型数据10、20,这个时候缓冲区其实有四个数据:10、空格、20、换行,执行第一个printf后结果为10,这是我们事先预料好的;当第二个scanf执行的时候,程序根本就不会让用户输入数据,因为缓冲区中已经有整型数据20了【当从缓冲区中拿数据的时候,如果要拿的数据的类型是整型或者实型,如果拿到的数据的类型是空格、回车、Tab键,就会被自动忽略,继续往下拿】,所以最终程序会直接打印出num2=20

让我们再回头看第一个程序:为什么num3的值打印出来的结果为空???

执行完第11行程序以后,缓冲区中的数据为10、空格、2.5、空格、a、换行;打印num1、num2的值的时候,因为是整型或者浮点型,程序会自动忽略空格和换行,所以输出结果为num1=10,num2=2.500000;但是num3是一个字符型的数据,程序并不会忽略任何的数据,最后打印出来的结果为num3= ;【这里打印出来了一个空格,并不是空】

解决方案

那这个时候就有问题了,如果scanf输入多个数据中包含字符型数据时,我就是想要输出来字符型数据,该怎么做呢???

解决方案:通过rewind(stdin);这行代码把缓冲区中的数据全部清空,这个时候缓冲区中没有任何数据了

写C代码时,如果遇到整型、浮点型、字符型同时出现在scanf函数中的时候,要十分注意缓冲区中数据的情况!!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言中scanf与scanf_s函数的使用详解

    目录 1.scanf_s(是vs提供的函数) 2.scanf(标准的库函数) 3.总结 1.scanf_s(是vs提供的函数) a.代码1 int main() { char a = 0; //scanf_s("%c", &a, 1); scanf_s("%c", &a, sizeof(a)); return 0; } scanf_s有三个参数,最后一个是变量a所占据空间的大小(单位为字节),这里可以写1,也可以写sizeof(a).如果a为整型的话

  • C语言使用scanf连续输入字符串出现的问题

    #include<stdio.h> int main() { char a,b; scanf("%c",&a): scanf("%c",&b); printf("%c,%c",a,b); } 一段看上去很简单的代码,即使是C语言初学者也能看懂. 可是在运行的时候却出现了问题: ①输入a后按下回车 ②用空格隔开之后再按下回车 相信和我一样的大部分初学者,看着自己天衣无缝的代码,百思不得其解. 让我们先来看看,在百度百科中

  • c语言中scanf的基本用法

    前言 scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单: 1 int a; 2 scanf("%d",&a);//程序执行到这里时,就等待用户输入:它接收的是变量的地址 //所以一般情况下除了指针型变量和数组名要给变量加上取地址符& 下面主要介绍了C语言中scanf的用法和注意事项,下面来一起看看详细的介绍吧 scanf概念 scanf是格式输入函数,功能是在屏幕上输入指定的信息.简单的来说和printf相似

  • C语言中scanf函数的原样输入的坑及解决

    目录 scanf函数的原样输入的坑及解决 1.scanf函数格式控制后面输入 2.scanf函数的输入是有顺序的 3.最重要的一点就是scanf切记要原样输入 4.还有一个 scanf输入多个数据出现的问题 问题引出 执行原理 程序分析 解决方案 scanf函数的原样输入的坑及解决 scanf函数是C语言里一个输入函数,但其有很多地方需要注意: 1.scanf函数格式控制后面输入 的应该是变量的地址而不是变量本身(即变量名) 例,输入a,b 两个整型变量的值的时候,很多初学者会写成 scanf(

  • C语言中scanf函数与空格回车的用法说明

    众所周知,C语言中的scanf函数的作用是从标准输入设备(通常是键盘)读取输入值,并存储到参数列表中指针所指向的内存单元. 下面从几个方面说一下一些稍微细节的东西.下面的实验都在vc6.0中通过. 1.scanf的返回值 scanf通常返回的是成功赋值(从标准输入设备赋值到参数列表所指定的内存区域)的数据项数,如果出错或是遇到end of file(注意,如果想从键盘输入EOF,在windows的DOS窗口用Ctrl+Z 或F6:在UNIX系统上,用CTRL+D.),则返回EOF,比如: sca

  • 详解C语言中scanf函数使用的一些注意点

     (一)基本介绍 Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#include<stdio.h>头文件.当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名.是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕.敲回车键告知计算机键入完毕. (二)使用注意 ①. 使用scanf函数输入一个字符变量.Char a; scanf("%c",&a); ②. 同时输入多

  • C语言中scanf与scnaf_s函数详解

    目录 scanf_s 使用scanf_s scanf 使用scanf 总结 scanf_s scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s().在调用该函数时,可以提供一个数字以表明最多读取多少位字符. MSDN上scanf_s的简单模型:int scanf_s( const char *format [, argument]...);一般我们常用的格式:scanf_s(输入格式,输入流 [,输

  • C语言中pow函数使用方法、注意事项以及常见报错原因

    目录 1.首先使用pow函数必须要加头文件 : 2.pow()用来计算以x 为底的 y 次方值,然后将结果返回. 3.注意可能引起报错的原因 可能导致错误的情况: 总结 1.首先使用pow函数必须要加头文件 : #include<math.h> pow() 函数用来求 x 的 y 次幂(次方),x.y及函数值实际上为double型 ,其在使用中的原型为:double pow(double x, double y); 注意,在某些特定的情况之下,pow函数的double类型可能会引起输出结果的错

  • C语言中main函数与命令行参数详细讲解

    目录 一.main 函数的概念 二.main 函数的本质 命令行 三.main 函数的参数 四.main 函数一定是程序执行的第一个函数吗 五.小结 一.main 函数的概念 C语言中 main 函数称之为主函数 一个C程序是从 main 函数开始执行的 二.main 函数的本质 main 函数是操作系统调用的函数 操作系统总是将 main 函数作为应用程序的开始 操作系统将 main 函数的返回值作为程序的退出状态 下面看一下 main 函数的返回值: A.c: #include <stdio

  • Go语言中append函数用法分析

    本文实例分析了Go语言中append函数用法.分享给大家供大家参考.具体如下: Go语言中append的功能十分强大,使用它可以使很多功能的实现变得更加简洁.以下为简单对比: .将一个slice插入到另一个slice的指定位置: 不使用append: 复制代码 代码如下: func insertSliceAtIndex(slice_origin []int, slice_to_insert []int,      insertIndex int) (result []int, err error

  • 详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数,生成的也是伪随机数. c语言之rand函数的使用 1.写入头文件 #include <stdlib.h> #include <stdio.h> #include <time.h> 2.变量的定义 void main( void ) { int i,k; 3.sran

随机推荐