zoukankan      html  css  js  c++  java
  • 关于C语言得非法输入

    关于C语言得非法输入

    • 首先我们来看看什么是非法输入
    # include<stdio.h>
    int main(void)
    {	
    	int i,j,k;
    	char ch;
    
    	printf("请进行第一次输入...
    ");
    	scanf("%d",&i);
    	printf("i=%d
    ",i);
    
    	printf("----------------
    ");
    
    	printf("请进行第二次输入....
    ");
    	scanf("%d",&j);
    	printf("j=%d
    ",j);
    
    	printf("----------------
    ");
    	
    	printf("请进行第三次输入....
    ");
    	scanf("%d",&k);
    	printf("k=%d
    ",k);
    	
    	return 0;
    
    /*
    ----------------vc++6.0中输出得结果-----------------------
    	
    请进行第一次输入...
    123
    i=123
    ----------------
    请进行第二次输入....
    456
    j=456
    ----------------
    请进行第三次输入....
    789
    k=789
    -------------------------------------------------------------
    请进行第一次输入...
    123.。。。。
    i=123
    ----------------
    请进行第二次输入....
    j=-858993460
    ----------------
    请进行第三次输入....
    k=-858993460
    -------------------------------------------------------------
    请进行第一次输入...
    mmmmm
    i=-858993460
    ----------------
    请进行第二次输入....
    j=-858993460
    ----------------
    请进行第三次输入....
    k=-858993460
    -----------------------------------------------------------
    
    	心得:
    	
    	我们看到只有第一次的输入是正确的。我们先来说说为什么要使用输出控制符。
    
            我们从终端中输入的都是字符或者字符串,例如我们输入123,在我们看来是数字,但是在计算机看来就是字符,我们在python中也是的,使用的时候需要将字符转换成为相应的数据类型。
            
            所以我们就是需要使用输出控制符将字符转化成为我们需要的数据类型进行输入。搞懂了为什么要使用输出控制符,我们再来回答上面的问题。
    
            scanf函数在进行输入的时候,先对字符串进行读取,例如"123mmmm",读取的123符合%d的输入形式,所以就赋值给了i。但是后面的mmmm不符合%d的输入形式,继续的留在输入的字符串中,等待
            
            下一次的读取。结果在下面使用scanf函数的时候,率先从上面没有读完的地方继续进行读写,mmmm显然不符合%d所以初始化变量j失败,系统自动为变量j赋值为垃圾值。这就是为什么出现上面现象    
        
            的原因。如果输出控制符改为%c那就一点问题都没有了,因为mmmm是满足这个控制符的。
    ----------------------------------------------------------
    */
    }
    

    我们看到用户的非法输入给后面造成了严重的影响

    • 控制非法输入
    # include<stdio.h>
    int main(void)
    {	
    	int i,j,k;
    	char ch;
    
    	printf("请进行第一次输入...
    ");
    	scanf("%d",&i);
    	printf("i=%d
    ",i);
    
    	while(ch=getchar()!='
    ')
    		continue;
    
    	printf("----------------
    ");
    
    	printf("请进行第二次输入....
    ");
    	scanf("%d",&j);
    	printf("j=%d
    ",j);
    
    	while(ch=getchar()!='
    ')
    		continue;
    
    	printf("----------------
    ");
    	
    	printf("请进行第三次输入....
    ");
    	scanf("%d",&k);
    	printf("k=%d
    ",k);
    	
    	return 0;
    
    /*
    ----------------vc++6.0中输出得结果-----------------------
    	
    请进行第一次输入...
    23mmmmm
    i=23
    ----------------
    请进行第二次输入....
    45mmmmmmmmmm
    j=45
    ----------------
    请进行第三次输入....
    78mmmmmmmmmmm
    k=78
    -----------------------------------------------------------
    
    心得:
    	
    我们看到加入一个while循环后就解决了这个问题。实际上也是比较好理解的就不细讲了。
    
    */
    }
    

    本文来自博客园,作者:江湖混子,转载请注明原文链接:https://www.cnblogs.com/huao990928/p/12491986.html

  • 相关阅读:
    CF741C.Arpa’s overnight party and Mehrdad’s silent entering [构造 二分图染色]
    CF719E. Sasha and Array [线段树维护矩阵]
    洛谷7月月赛
    CF666B. World Tour
    BZOJ4668: 冷战 [并查集 按秩合并]
    水题练习 2
    CF715B. Complete The Graph
    关于最短路、负环、差分约束系统的一点笔记
    关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记
    hdu1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/huao990928/p/12491986.html
Copyright © 2011-2022 走看看