关于scanf("%c",&ch)直接跳过的问题

有时候scanf("%c",&ch)本应该阻塞等待用户输入一个char型数据的,但为什么会跳过呢?

例:在该程序段中,

int year;
    printf("请输入一个年份:\n");
    scanf("%d",&year);
   // setbuf(stdin,NULL);//或者直接用getchar();
    //在键盘输入一字符,显示其类型(数字、大写字母、小写字母、其他)
    char ch;
    printf("请输入一个字符:\n");
    scanf("%c",&ch);
    if(ch>=‘1‘&&ch<=‘9‘)
        printf("this is digital\n");
    else if (ch>=‘A‘&&ch<=‘B‘)
        printf("this is capital letter\n");
    else if (ch>=‘a‘&&ch<=‘z‘)
        printf("this is letter\n");
    else
        printf("other!\n”);

会输出:

请输入一个年份:
2000
请输入一个字符:
other!

 

例2:

以下程序段:

while (n<=0)
    {
        printf("请输入字符串长度:\n");
        scanf("%d",&n);
    }
   setbuf(stdin,NULL); //<1>
    char a[n],b[n];
    printf("输入字符串:\n");
    for (int i=0; i<n; i++)
    {
        scanf("%c",&a[i]);
    }
    printf("输出字符串为:\n");
    for (int i=0; i<n; i++)
    {
        b[i]=a[n-1-i];
        printf("%c",b[i]);
    }

如果将<1>语句去除,会使结果错误例:

请输入字符串长度:
5
输入字符串:
hello
输出字符串为:
lleh

纠其根源,我们先来了解一下scanf()是怎么接受数据的。

首先,当我们的pc指向scanf这句时,系统并不是等待用户输入,而是判断输入缓冲区有没有符合格式的内容,如果有,则直接读取。

知道了这个,我就应该明白,scanf("%c",&ch);不是没有读到数据,而是读到了我们不知道的数据。

那问题又来了,它读到了什么??

好吧,这就要说到行缓存;

我们用scanf()的时候都要按下enter键,那enter键按了之后去哪儿了??

好吧,问题基本应该知道了,enter键也进入了输入缓存区,也就是scanf("%c",&ch);

读到了‘\n‘;

解决办法,很简单,既然缓存区有东西,那我们就清空它呗~~

setbuf(stdin,NULL);(这个windows和linux下都可以)

fflush(stdin);(这个只能windows);

时间: 2024-11-04 07:57:32

关于scanf("%c",&ch)直接跳过的问题的相关文章

scanf,sscanf利用format跳过干扰的空格

scanf,sscanf利用format跳过干扰的空格 用了一点时间做读取配置部分的代码,希望一次记录上读取N个数据, 希望读取的格式就是一个IP地址加上端口号,希望把IP地址读取到4个短整数里面,端口号读取到另外的一个短整数.文字格式类似“192.120.1.120#8080”,但结果发现因为为了对齐,中间的空格干扰了读取. 读取的输入可能是这样“192.120.1.120   #     8080”,甚至可能是 " 192 .168 . 1 .120 # 8080 " 郁闷.goo

scanf(&quot;%c&quot;, &amp;ch)和scanf(&quot; %c&quot;, &amp;ch)和scanf(&quot;%s&quot;, str)的注意事项

scanf("%c", &ch)和scanf(" %c", &ch): %c会读取回车和空格,所以一定要使用后者,即在%c前面加一个空格. %s用于读取char[]时,会忽略空格和回车,所以不会有这些问题. 原文地址:https://www.cnblogs.com/FengZeng666/p/11448043.html

C语言scanf执行时被跳过

运行到第二次开始游戏时,发现GameJudge函数中的scanf无法从键盘中输入数据 这种情况的出现是因为用户在输入结束时都会敲一下回车键才能让程序继续执行, 但是,每次printf会从用户输入缓冲区取出用户输入的内容,这样就会在缓冲区留下回车键, 下一次输入如果是获取一个字符,就会将缓冲区剩余的回车键取出. #include<stdio.h> #include<ctype.h> #include <stdlib.h> #include <time.h> #

c语言scanf被跳过的问题

在运行scanf函数时,scanf常常会被跳过.这是因为当你进行过了scanf函数后, 在第二次scanf函数时, 由于缓存区里依然存着第一次结束时送入的回车符,在第二次时没有读入就直接把回车符送入了,所以没有真正起到读入数据的作用.这个时候我们清除缓冲区就可以了,这里可以使用fflush函数.先来看一下fflush函数: 图中的流就是把计算机中的数据传输(数据的读写,网络连接的数据传输)抽象的表示为流,数据的传输就像流水一样,从一个容器流到另一个容器.流一般分为3种,标准输入(stdin),标

青蛙跳台阶(C、Python)

C语言: 1 /* 2 ----------------------------------- 3 当n = 1, 只有1中跳法:当n = 2时,有两种跳法:当n = 3 时,有3种跳法:当n = 4时,有5种跳法:当n = 5时,有8种跳法 4 所以:tiaofa(n) 5 n=1时,tiaofa(1) = 1 6 n=2时,tiaofa(2) = 2 7 n>2时,tiaofa(n) = tiaofa(n-1) + tiaofa(n-2) 8 ------------------------

C语言笔记之scanf函数

直接摘抄<C Primer Plus>算求,太经典了,我再偷把懒,就当复习了- 一.概述 从键盘输入的是文本,因为那些键生成文本字符: 字母.数字和标点.比如说,当您想输入整数2004时,您键入字符2. 0. 0和 4 ,如果想把它们存储成4个数值而非字符串,那么您的程序必须把这个字符串逐个字符地转换成数值,这就是scanf()所做的工作!它把输入的字符串转换成各种形式:整数.浮点数.字符和 C的字符串.它是 printf()的逆操作,后者把整数.浮点数.字符和 C的字符串转换成要在屏幕上显示

格式说明符对scanf的作用

<!--scanf printf 不负责--> 这里重申格式说明符的作用以及重要性  可以跳过 考虑如下代码 int n;scanf("%c", &n);printf("%c\n", n); 在这里我们将n当做了char型变量  而不是int  但是你会发现编译通过了  并且运行结果也没有问题 再做一个改变int n;scanf("%d", &n);   // %c -> %dprintf("%c\n&

printf与scanf的返回值、注意点

printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数.即在下面程序中scanf的返回值为1.如果没有读取任何项目(如它期望一个数字但是出入了一个非数字字符),它会返回值0.当它检测到“文件结尾”时,它返回EOF(EOF是文件stdio.h中定义的特殊值.一般,#define 指令把EOF 的值定义为 -1).    int n; float  p; 

C控制语句:分支与跳转

1.前导程序 //统计字符.单词和行 #include<stdio.h> #include<ctype.h> //为isspace()提供函数原型 #include<stdbool.h> //为bool.true和flase提供定义 #define STOP '|' int main(void) { char c; //读入字符 char prev; //前一个读入字符 long n_chars=0L; //字符数 int n_lines=0; //行数 int n_w