精华内容
下载资源
问答
  • 通过scanf函数从键盘输入数据1)调用scanf函数从键盘输入数据时,最后一定要按下回车键,scanf函数才能接受键盘输入的数据。2)输入数据值键盘输入数据时,输入的数值数据之间间隔符隔开。列<间隔符>10<...

    通过

    scanf

    函数从键盘输入数据

    1

    )当调用

    scanf

    函数从键盘输入数据时,最后一定要按下回车键,

    scanf

    函数才能接受键盘

    输入的数据。

    2

    )输入数据值

    当键盘输入数据时,输入的数值数据之间用间隔符隔开。列

    <

    间隔符

    >10<

    间隔符

    >20

    <

    间隔符

    >

    此处间隔符可以是空格符、制表符(

    Tab

    )

    、回车符。

    3

    )跳过输入数据的方法

    可以在格式字符和

    %

    之间加上一个

    *

    ,它的作用是跳过对应的输入数据。列

    Int

    a1,a2, a3;

    Scanf("%d%d*%d%d%d",&a1,&a2,&a3);

    当输入如下数据时:

    10

    20

    30

    40

    将把

    10

    赋给

    a1

    ,跳过

    20

    ,把

    30

    赋给

    a2

    ,把

    10

    赋给

    a3

    4

    )在格式字符串中插入其他字符

    如果想在屏幕上输入字符串来提示,应该使用

    printf

    函数,如果在

    scanf

    的格式控制字符串

    中插入其他字符,则在输入时要求按一对一的位置原样输入这些字符

    1

    Int a1,a2,a3;

    Scanf

    (

    inpat a1,a2,a3:%d%d%d

    ,&a1,&a2,&a3

    )

    ;

    要求按以下形式进行输入

    Input a1,a2,a3:102030

    1

    以下程序由终端出入两个整数给变量

    x

    y

    ,在交换

    x

    y

    的值后,在输出

    x

    y

    ,验证两

    个变量中的数是否正确的进行了交换。

    #inclube

    "stdio.h"

    Main()

    {int x,y,t;

    Printf("enter x&y:\n");

    Scanf("%d %d",&x,&y);

    Printf9("x=%d y=%d\n",x,y);

    T=x;x=y;y=t;

    Printf("x=%d y=%d\n",x,y);

    }

    2

    输入一个

    doulbe

    类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入后处理,

    然后输出此数,以便验证处理是否正确。

    展开全文
  • C语言scanf输入时缓冲区问题

    千次阅读 多人点赞 2018-11-04 00:26:35
    首先来对scanf为什么会出现这类问题进行分析,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格、回车这类字符,%d接收是不会影响的,但是%c就会产生...

    许多同学可能在写代码时都遇到了关于scanf输入时缓冲区读取问题。
    首先来对scanf为什么会出现这类问题进行分析,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格、回车这类字符,当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均作为有效字符会被%c接收。
    例如:

    #include<stdio.h>
    int main()
    {
    	char a, b, c;
    	scanf("%c%c%c", &a, &b, &c);
    	printf("%c,%c,%c\n", a, b, c);
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    解决这类问题的方法:

    1.在接收第二个数之前清空缓冲区,fflush(stdin);getch();getchar();随便一个都可以,fflush(stdin)是全部清空,getchar()是清空一个字符,如果缓冲区还有多余的字符则会被正常使用,
    2.在%c之前加入空格,空格可以吸收回车符、空格。

    如果是在循环中多个scanf输入多个字符,建议使用",“进行隔开,并且在键盘输入的时候也要使用”,"

    展开全文
  • 作者:阿巴卡 ...首先来对scanf为什么会出现这类问题进行分析,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格、回车这类字符,%d接收...

    作者:阿巴卡
    来源:CSDN
    原文:https://blog.csdn.net/qq_39032310/article/details/83692746

    许多同学可能在写代码时都遇到了关于scanf输入时缓冲区读取问题。
    首先来对scanf为什么会出现这类问题进行分析,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格、回车这类字符,当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均作为有效字符会被%c接收。
    例如:

    #include<stdio.h>
    int main()
    {
    	char a, b, c;
    	scanf("%c%c%c", &a, &b, &c);
    	printf("%c,%c,%c\n", a, b, c);
    	system("pause");
    	return 0;
    }
    

    解决这类问题的方法:

    1. 在接收第二个数之前清空缓冲区,fflush(stdin);getch();getchar();随便一个都可以,fflush(stdin)是全部清空,getchar()是清空一个字符,如果缓冲区还有多余的字符则会被正常使用,
    2. 在%c之前加入空格,空格可以吸收回车符、空格。

    如果是在循环中多个scanf输入多个字符,建议使用",“进行隔开,并且在键盘输入的时候也要使用”,"

    展开全文
  • 问题:运行结果是输入0并不会结束循环,而是还可以一直输入数据。 求各路大佬帮忙看看哪里错了?。。 我改了一下:但是运行出来还是错的。。。。。 for(i=0;i;i++) { scanf("%d",&a[i]); if(a...
  • C的输入整理(gets、getchar、scanf的异同)

    千次阅读 多人点赞 2018-05-01 21:33:50
    整理gets、getchar、scanf的异同前,一个很重要的概念是输入流缓冲区及...getchar和scanf就是从输入流缓冲区中读取数据的。这就意味着,它们读东西的时候别忘了"\n"的存在。先说说getchar()getchar()就...

    整理gets、getchar、scanf的异同前,一个很重要的概念是输入流缓冲区及键盘缓冲区。

    键盘缓冲区就是当你键盘键入内容时,内容存储的地方。

    而当里面的内容遇到回车的时候,它们就会被存入输入流缓冲区。

    注意,回车的"\n"也会被存入输入流缓冲区。

    getchar和scanf就是从输入流缓冲区中读取数据的。这就意味着,用它们读东西的时候别忘了"\n"的存在。


    先说说getchar()

    getchar()就是从输入流缓冲区一位一位地取内容。当输入流缓冲区还没有内容的时候,getchar()处于待命状态。

    看个例子:

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	
    	s1 = getchar();
    	s2 = getchar();
    	printf("%d %d\n", s1, s2);
     
    }

    我们会发现s2取的值其实是空格。因为"\n"也会存在输入流缓冲区,所以同理,会出现如下情况:


    解决的办法很简单,在两次getchar()中间调用清除缓冲区数据的函数就可以了,例如fflush(stdin)

    或者,因为getchar()是把第一位取走,我们可以在两次getchar()中间在写一个getchar(),问题同样可以得到解决(无视字体)

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	
    	s1 = getchar();
    	getchar();
    	s2 = getchar();
    	
    	printf("%d %d\n", s1, s2);
    
    }


    再说说scanf()

    其实scanf里面的过程可以看作是多个getchar()组合而成的

    先举一个在别的文章里看到的小例子:

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	
    	scanf("%c %c", &s1, &s2);
    	printf("%d %d\n", s1, s2);
    	
    	scanf("%c %c", &s1, &s2);
    	printf("%d %d\n", s1, s2); 
    }

    可以看到,第二次输出的第一个数并不是a的ascii码值,而是\n的。这是因为第一次读入时回车产生的\n被保存在了输入流缓冲区中,在"%c %c"的后面。

    再举个例子:

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	
    	scanf("%c%c", &s1, &s2);
    	printf("%d %d\n", s1, s2);
    	
    	scanf("%c %c", &s1, &s2);
    	printf("%d %d\n", s1, s2); 
    }

    可以看到第二个输出是空格的ascii码值。

    所以总的来说就是:

    scanf()内的""从左往右一位一位getchar(),遇到空格则表示跳过所有空格和回车,准备getchar()下一个非空格(或回车)位

    显然当读完"%c %c"最后一个%c,输入流缓冲区为空,又没有空格,则退出。(我是这么理解的,至于底层是否真的是这样实现的还得看源代码)

    所以当出现"%c %c "的时候,读完最后一个%c,它往后找第一个非空格的字符(不包括回车),找不到,则不会退出,看个例子:

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	
    	scanf("%c %c ", &s1, &s2);
    	printf("%d %d\n", s1, s2);
    	
    	scanf("%c %c", &s1, &s2);
    	printf("%d %d\n", s1, s2); 
    }

    同时通过这个例子我们发现,未退出状态下,回车是不会被保存在输入流缓冲区里面的。

    同样的代码,我们再看另一个例子:


    把第二个scanf()里面的空格去掉看看:

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	
    	scanf("%c %c ", &s1, &s2);
    	printf("%d %d\n", s1, s2);
    	
    	scanf("%c%c", &s1, &s2);
    	printf("%d %d\n", s1, s2); 
    }


    我们发现,输入完三个字符后整个程序就已经执行完了。所以其实可以把两段scanf()放在一起看就是

    "%c %c %c%c"

    如此看我们可以把scanf()理解为一个扩展的getchar(),新增了一个识别空格的功能。

    举最后一个例子结束scanf()部分:

    #include<stdio.h>
    int main()
    {
    	char s1, s2, s3;
    	
    	scanf("%c%c%c", &s1, &s2, &s3);
    	printf("%d %d %d\n", s1, s2, s3);
    
    }

    这个例子我认为更加说明了getchar()在scanf()中的体现。

    当我键入a+回车,输入并没有退出,并不是输出"97 10 0"(0是null),而当我再输入一个a才结束。

    我们可以理解为每个占位符都会引发一个getchar(),没有退出则是在等待缓冲区中新内容的读入。

    当然以上所谓getchar()在scanf()中的体现只是我借来更好理解scanf()的方式,至于是否真的是这样还有待查证,不过任何读取肯定是建立在输入流的基础之上的,这点毋庸置疑。(如果这句有错也请斧正qwq)

    下面来说说gets()

    gets()相对来说就比较好理解了,可以读取空格,不限长度,不会影响到输入流缓冲区,即读完后缓冲区内不会有"\n"

    最后看个例子:

    #include<stdio.h>
    int main()
    {
    	char s1, s2;
    	char s[2];
    	
    	gets(s);
    	printf("%s", s);
    	
    	scanf("%c %c", &s1, &s2);
    	printf("%d %d\n", s1, s2);
    
    }

    就是这样。

    如果有不对的地方

    请记得告诉我

    merci

    展开全文
  • 了解scanf缓冲区

    2021-03-30 20:42:21
    我们从键盘输入时数据会先存入缓冲区。但是!我们输入一个整型数字,会回车来结束,那么回车这个按键也会留在缓冲区,对应的 ‘\n’ 。了解这一点,然后我们来看一个栗子。 #include <stdio.h> #...
  •  字符数据的输出putchar(),但是使用该函数头文件要添加stdio.h,且,putchar函数自能输出一个字符,输出字符串完毕后要putchar('\n')换行。  字符数据输入getchar();  字符串输出函数:int puts(char...
  • 简单I/O操作 在程序中经常需要将数据输出到屏幕、打印机、存储器等。...当数据从键盘、硬盘流向内存称为输入。C++两个对象cin和cout实现标准的输入输出。 cin:它是istream类的对象,用来处理
  • 知识点14:关于输入

    2021-01-30 22:41:43
    scanf从缓冲区中第一个非空白字符开始读取,即无论输入多少空格、回车、制表都没有。 %c前没有空格scanf("%c", &b);则键盘输入的都能被scanf读取(包括换行、空格、制表) 最后输入的回车也存在于缓冲区中。 ...
  • 简单I/O操作 在程序中经常需要将数据输出到屏幕、打印机、存储器等。...当数据从键盘、硬盘流向内存称为输入。C++两个对象cin和cout实现标准的输入输出。 cin:它是istream类的对象,用来处理
  •  首先他们都是从stdin里读取数据,并不是直接从键盘读取,实际上,我们从键盘输入数据时,他们会保存到缓冲区内,并与相应的ascii对应,所以空格,换行符等也会保存到缓冲区中,若getchar(),则直接读取一个...
  • scanf() 函数用于标准输入(键盘)读取并格式化。下面是数据类型的基本分类图:先介绍说明,解释1byte=8位变量名 对变量的命名。命名的名字的特别要求:由字母,数字,下划线( _ ),但是第一个字符必须是字母且分大...
  • scanf() 函数用于标准输入(键盘)读取并格式化。下面是数据类型的基本分类图:先介绍说明,解释1byte=8位变量名 对变量的命名。命名的名字的特别要求:由字母,数字,下划线( _ ),但是第一个字符必须是字母且分大...
  • curses--图形函数库

    2016-11-18 20:54:44
    百度的时候终于知道这个问题的主要就是要关闭回显,一般我们从键盘用scanf输入数据时,终端会把这个数据显示在频幕上,很明显我们要输入密码时,这种功能是有必要去除的,所以就要关闭回显,只要输出一个*就好了。...
  • C语言实验03_判断语句

    2021-01-16 16:56:06
    C语言实验03_判断语句 ... scanf 函数从键盘输入 x 的值,求 y 的值。 输入描述 从键盘输入一个 x 的值 输出描述 根据函数关系,输出 y 的值 输入样例 //以下为多数组测试数据 0 0.5 1 6 输出样例 //以下为多组数据
  • 数据结构实验

    2012-04-13 09:55:47
    编写程序构造一个有序表La,从键盘接收一个关键字key,二分查找法在La 中查找key,若找到则提示查找成功并输出key所在的位置,否则提示没有找到信息。 2.编写程序实现Hash表的建立、删除、插入以及查找操作。 ...
  • 2.定义整型变量之后,使用scanf为这个变量赋值的时候,不能使用键盘输入字符,如果字符的话,相当于没有接收到任何数据 3.C语言中对文件的读写都是库函数来实现的。对二进制文件和文本文件都采用缓冲文件系统。--...
  • 选择结构程序设计.zip

    2021-03-07 10:45:46
    1. 编写程序,输入三角形三边a、b、c,判断a、b、c能否构成三角形,若不能则输出相应的...修改程序,使得当输入数据大于100或小于0,通知用户“输入数据错误”,程序结束。 配套课本:C程序设计(第五版)谭浩强著
  • 本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。 赋值语句 赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为: 变量=表达式; 赋值语句的功能和特点都与赋值...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    6.21 数组是函数的参数,为什么sizeof不能正确报告数组的大小? 6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小...
  • 程序的功能是从键盘输入一个数x,求x的正弦值,然后输出结果。在main()之前的两行称为预处理命令(详见后面)。预处理命令还有其它几种,这里的include 称为文件包含命令,其意义是把尖括号或引号""内指定的文件包含...
  •  程序的功能是从键盘输入一个数x,求x的正弦值,然后输出结果。在main()之前的两行称为预处理命令(详见后面)。预处理命令还有其它几种,这里的include 称为文件包含命令,其意义是把尖括号""或引号内指定的文件包含...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    2.16 怎样在运行时用名字访问结构中的域? 29 2.17 C语言中有和Pascal的with等价的语句吗? 29 2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 29 2.19 程序运行正确,但退出却“core dump ...
  • 2.16 怎样在运行时用名字访问结构中的域? 29 2.17 C语言中有和Pascal的with等价的语句吗? 29 2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 29 2.19 程序运行正确,但退出却“core dump ...
  • o 7.18 数组是函数的参数, 为什么 sizeof 不能正确报告数组的大小 ? * 8. 内存分配 o 8.1 为什么这段代码不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", ...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

当用scanf从键盘输入数据时