zoukankan      html  css  js  c++  java
  • 关于scanf输入数据时要注意的一些地方

    例:使用scanf函数输入数据。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<stdio.h>
    int main(void)
    {
    inta,b,c;
    printf("输入a,b,c ");
    scanf("%d,%d,%d",&a,&b,&c);
    printf("a=%d b=%d c=%d ",a,b,c);
    fflush(stdin);
    return 0;
    }
    注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之间有逗号,输入数据时就必须用逗号将各个数据隔开
    &a,&b,&c中的&是地址运算符,&a指a在内存中的地址。scanf的作用是:按照a,b,c的内存地址将a,b,c的值存进去。变量a,b,c的地址是在编译连续阶段分配的。
    这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据是,数据之间不可以加逗号,只能是空格或tab键或者回车键——
    空格的输入方式:“2 3 4”
    TAB键的输入方式:“2(按tab)3(按tab)4(按tab)”。
    回车键的输入方式:“2(按ENTER)3(按ENTER)4(按ENTER)”。
    若是“%d,%d,%d”,则在输入数据时需要加“,”——“2,3,4”.
     
     

    问题一

    如何让scanf()函数正确接受有空格的字符串?如: I love you!
    1
    2
    3
    4
    5
    6
    7
    8
    #include<stdio.h>
    intmain(void)
    {
    charstr[80];
    scanf("%s",str);
    printf("%s",str);
    return0;
    }
    输入:
    1
    Iloveyou!
    输入只有 : I
    上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区。我们改动一下上面的程序来验证一下:
    #include<stdio.h>
    #include<windows.h>
    int main(void)
    {
    char str[80],str1[80],str2[80];
    scanf("%s",str);/*此处输入:Iloveyou!*/
    printf("%s ",str);
    Sleep(1000);/*这里等待5秒,告诉你程序运行到什么地方*/
    /*
    不是sleep(5)
    1,函数名是Sleep不是sleep。
    2,C/C++中,unsignedSleep(unsigned)应该是毫秒ms.
    */
    scanf("%s",str1);/*这两句无需你再输入,是对stdin流再扫描*/
    scanf("%s",str2);/*这两句无需你再输入,是对stdin流再扫描*/
    printf("%s ",str1);
    printf("%s ",str2);
    return 0;
    }
    以上程序就能解决问题~~~(额外加了3句)
     
    好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:
    1
    2
    3
    4
    5
    6
    7
    8
    #include<stdio.h>
    intmain(void)
    {
    charstr[50];
    scanf("%49[^ ]",str);/*scanf("%s",string);不能接收空格符*/
    printf("%s ",str);
    return0;
    }
    ******************************************************************************************************************************************************************
    在scanf的用法中,不能出现一下情况
    scanf("%.2f",&array[i]);
    scanf里面不能有%.2f这样的格式,因为是键盘输入,不是计算机操作所以很难得到标准格式长度多少,有效是多少,
    但是,printf可以用 %.2f 控制输出小数点的位数    (scanf("%lf",&array[i]);也是允许的~~)
    在这里解释一下小数点前面是代表长度(超过了长度的话原样输出),小数点后面代表是有效位个数(有效位后面的四舍五入),
  • 相关阅读:
    UVa 839 -- Not so Mobile(树的递归输入)
    UVa 548 -- Tree
    UVA 122 -- Trees on the level (二叉树 BFS)
    UVa679 小球下落(树)
    POJ 2255 -- Tree Recovery
    POJ 1451 -- T9
    POJ 2513 -- Colored Sticks
    STL -- heap结构及算法
    nginx利用try_files实现多个源
    nginx location的优先级
  • 原文地址:https://www.cnblogs.com/phix/p/7118459.html
Copyright © 2011-2022 走看看