zoukankan      html  css  js  c++  java
  • 哦这。。!C语言scanf输入的坑爹之处

    一、

    今天闲来无事,跑去A题,本想3sA了poj1004,结果搞了10分钟,最令人困惑的问题就是为什么定义了double类型的变量,但是用scanf输入的时候标识符用%f的话,输入并不能完成,也就是说输入不会起作用,后来查找资料,才知道,原来用double 输入的时候标识符是%lf,注意这里是L和F,不是1和f

    经过修正终于搞定,分分钟A了这个水题。

    然而后来再想 A 就A不过去了,,,,并不知道为什么。好吧,忽略这种细节,没什么难度的水题没必要太在意,代码如下:

    1 #include<cstdio>
    2 int main(){
    3     double t,d;
    4     for(int i=0;i<12;i++){
    5         scanf("%lf",&t);
    6         d+=t;
    7     }
    8     printf("$%.2f",d/12);
    9 } 

     二、除了上面的坑之外,scanf输入还有一些坑爹的小细节:

    在用scanf输入的时候,如果输入的是字符%c,则scanf会将空白符(空格,回车,tab)一并读入,所以一般要加一个getchar来获取空白符。

    1 scanf("%c",&t);//这种写法,t中存储的也可以有空白符

    解决空白字符被当作char读入的问题

    在做题的时候,有时会碰到输入数据给的不规范的情况,比如一行结束后不只有一个回车而是多个,再比如很多个空白符之后才是回车,由于空白符(Tab,回车,空格)会被当作char ,所以今天我们来解决这个问题

    1、如果输入不存在不规范:getchar()或%*c

    但是毕竟在后面加一个getchar实在是很麻烦的做法,所以,我们可以用scanf的另一种写法来“吃掉”回车符:

    1 char a,b;
    2 int num;
    3 scanf("%c%c%*c%d",&a,&b,&num);//注意这里的%*c

    这里我给大家演示另外一种方法,就是%*这表示这个输入读取之后我们是不给他变量来存储的,这样就相当于“吃掉了”中间的字符,前两个字符以及最后的数字都会正确读取。

    如果我们把这一点用在scanf的format串的末尾,就可以做到“吃掉”回车了,为了怕我忘,我还是写下来吧:

    这种带星号的用法,叫做“赋值禁止字符”.,在scanf的返回值中,是不会计算%*的这量的,也就是说,scanf返回的值是成功存入的变量的个数。

    1 //赋值禁止字符的使用
    2 char a,b,c;
    3 scanf("%c%c%c%*c",&a,&b,&c);//回车就会被吃掉

    但是如果输入的是字符串%s,则scanf会忽略空白符。

    并且,%s其实也可以存储在字符中,不过%s的缺点是,如果要把值存储在字符中,则只存储第一个字符,其余字符就会被舍弃,这样就会造成字符的丢失

    1 scanf("%s",&t);//可能造成字符丢失

    2.如果数据不规范,不能保证一定符合格式,更稳妥的方法如下:

    scanf会跳过%c之前所有的空白符,同理,如果不是空格而是 或 ,则会跳过所有Tab和所有回车。

    1 scanf(" %c",&t);//注意这里在%c之前有空格!!!

    这次有个题就因为这个wa了两天,坑死我了。。。5555555555

  • 相关阅读:
    返回一个一维整数数组中最大子数组的和02
    软工作业04四则运算网页版
    所有子数组的和的最大值
    学习进度表(第五,六周)
    学习进度表(第四周)
    四则运算2的单元测试
    《构建之法》阅读笔记02
    软工作业03
    单元测试练习
    学习进度表(第三周)
  • 原文地址:https://www.cnblogs.com/luruiyuan/p/5488262.html
Copyright © 2011-2022 走看看