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]);也是允许的~~)
    在这里解释一下小数点前面是代表长度(超过了长度的话原样输出),小数点后面代表是有效位个数(有效位后面的四舍五入),
  • 相关阅读:
    笔记一 Redis基础
    (转载)你一定要努力,但千万别着急
    (转载)[jQuery]使用Uploadify(UploadiFive)多文件上传控件遇到的坑
    Redis学习笔记~StackExchange.Redis实现分布式Session
    转载 mvc中 将session保存到redis中 实现共享session
    webconfig配置信息转发
    2019.9.25-二分查找代码(递归和非递归方法)
    2019.9.24-常见排序算法效率比较【图】
    2019.9.24-归并排序(代码)
    2019.9.24-快速排序实现(完整代码)
  • 原文地址:https://www.cnblogs.com/phix/p/7118459.html
Copyright © 2011-2022 走看看