zoukankan      html  css  js  c++  java
  • Scanf连续调用多次并且存在%c的问题

    问题现象:

    当程序中存在多个scanf时,针对第一个scanf的输入,一般用户会以空白字符(空格、换行、tab、换页符)等结束。但若后面有一个scanf(“%c”,&ch),则刚才输入的空白字符会被此次的scanf读入,因此空白字符也是一个字符,此将导致ch为空。

    原因解释:

    scanf的工作原理:(一般情况,即格式串中没有其它字符)用户的任何输入将被保存在缓冲之中,当有scanf时,scanf则从此缓冲队列中读取字符,直至遇到空白字符或者是此字符不可能是本次的输入为止,并把此字符放回原队列,此字符成为队列的第一个字符。当下一次scanf被调用时,将从第一个字符读取,若此时为%d,%f,%g,%e等数据格式串,则可跳过空白字符,直至出现数字为止;若此时为%c等字符(串)格式串,则会把空白字符读入,并给此变量赋值。

    另外,若读取到不可能是本格式串所代表的字符时,程序将异常退出。如scanf(“%d”,&num)时,输入kk。

    解决方法:

    处理格式串中的普通字符,scanf采取的动作依赖于这个字符是否为空白字符。

    l 空白字符:当在格式串中遇到一个或多个连续的空白字符时,scanf从输入中重复读取空白字符直至遇到一个非空白字符(把该字符放回原处)为止。格式串中的空白字符的数量无关紧要,格式串中的一个空白字符可以与输入中任意数量(包括0个)的空白字符相匹配。

    l 其它字符:当在格式串中遇到非空白字符时,scanf将把它与下一个输入字符进行比较。如果两个字符相匹配,那么scanf会放弃输入字符而继续处理格式串。如果两个字符不匹配,那么scanf会把不匹配的字符放回输入中,然后异常退出。例如,scanf(“%d/%d,&a,&b),输入是5/96,则a=5,b=96。

    归纳总结:

    (1)若格式串中没有其它字符,则读入可能是本变量的所有输入,直至明显不是本变量的输入。且非字符类型的格式串(如%d,%f,%g,%e)会跳过所有空白字符寻找第一个字符输入,但字符类型的格式串(如%c)不会跳过空白字符。

    (2)若格式串中有其它字符,则分为空白字符与非空白字符讨论。

    因此,上述问题可以使用scanf(“ %c”,&ch)解决。

     

    #include <stdio.h>
    int main(void){
    int cmd;
    char ch;
    float balance=0.0f, credit, debit;
    for(;;){
    printf("What do you want to do? 1:credit 2:debit 3:balance 4:exitn");
    scanf(" %d",&cmd);
    switch(cmd){
    case 1:
    printf("Enter amount of credit: ");
    scanf("%f",&credit);
    balance+=credit;
    credit=0.0f;
    break;
    case 2:
    printf("Enter amount of debit: ");
    scanf("%f",&debit);
    balance-=debit;
    debit=0.0f;
    break;
    case 3:
    printf("The banlance of your acoount is: %fn", balance);
    break;
    case 4:
    printf("Exit confirm:(y/n)");
    scanf(" %c",&ch);//若没有空格,则将会读入上次输入的回车键。
    if(ch=='y')return 0;
    else if(ch=='n')break;
    else {
    printf("Error command.n");
    break;
    }
    break;
    default:
    printf("Error command.n");
    break;
    }
    }
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    session
    CSS3盒子模型
    由“从按下回车到网页显示”粗谈网页优化
    springMVC之拦截器
    设置Webdriver启动chrome为默认用户的配置信息
    [Swift]LeetCode498. 对角线遍历 | Diagonal Traverse
    [Swift]LeetCode497. 非重叠矩形中的随机点 | Random Point in Non-overlapping Rectangles
    [Swift]通天遁地Swift
    [Swift]LeetCode996. 正方形数组的数目 | Number of Squareful Arrays
    [Swift]LeetCode995. K 连续位的最小翻转次数 | Minimum Number of K Consecutive Bit Flips
  • 原文地址:https://www.cnblogs.com/lujinhong2/p/4637441.html
Copyright © 2011-2022 走看看