A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

最近圣诞假期,在家陪爸妈,学习投入的时间不是很多,今天下午有空学习进制转换的时候,学习李老师视频里的程序,自己为了循环利用,
就改写成以下:

# include<stdio.h>

void putBinary();

int main()
{
    int num;
    printf("请输入一个整数(系统默认为十进制):\n");
    scanf("%d", &num);
   
    while(num > 0)
    {
        putBinary(num);
        
        printf("请输入一个整数(系统默认为十进制):\n");
        scanf("%d", &num);
        
        if(num == 1)
        {
            break;
        }
        
    }
   
    return 0;
}

void putBinary(int n)
{
    int bits = sizeof(n) * 8;
    while(bits --> 0)
    {
        printf("%d", n>>bits&1);
        
        if(bits%8 == 0)
        {
            printf(" ");
        }
        
    }

    printf("\n");
}

输入整数的时候运行ok,但是在终端使用中,没有退出程序,就输入了字符,如 cc指令,
结果程序出现死循环,
如下图:

当然自己还在基础学习中,这个应该是超出我现在的现有知识吧。
有兴趣的伙伴,有时间的话,求帮助呀。

7 个回复

倒序浏览
专门百度研究了下= =
scanf遇到非法输入会结束当前录入,也就是你在输入数字成功显示二进制后,不小心输入了cc啥的,相对应%d这是非法输入,那么这一次什么也不录入,也就是num值不变。于是将根据上次的num值计算一次二进制,然后又到了scanf,但是上次的非法输入并不是跳过了,也就是scanf从输入缓冲区读取的位置其实还是上次那个位置,自然还是非法的,就这么循环了。

你可以试试把scanf("%d", &num);改成下面这个。
scanf的返回值是成功匹配的参数,例如,输入了数字,成功录入,因为只写了%d一个参数,返回1。
下面这个的意思是,一旦非法输入,返回值就不是1,进入循环体,输入提示信息。
%*[^\n]表示录入除了'\n'之外其他字符,前面的*理解为录入后就丢弃,%*c则是为了录入缓冲区结尾的'\n'然后丢弃,这样一来,缓冲区就被清空了,下次会暂停等待重新输入。如果是微软的编译器,可以试试fflush(stdin);来清空缓冲区。
  1. while (scanf("%d", &num) != 1) {
  2.             printf("输入不是数字,请重新输入:");
  3.             scanf("%*[^\n]%*c");
  4.         }
复制代码
回复 使用道具 举报 1 0
从今以后 发表于 2014-12-27 19:49
专门百度研究了下= =
scanf遇到非法输入会结束当前录入,也就是你在输入数字成功显示二进制后,不小心输入 ...

@从今以后,谢谢呀!
因为这段时间有其他的事情,没有及时回复,抱歉:)。
用你的代码退换了一下,运行完美,可以作为一个小应用了,哈哈。
截图不了,只能复制出来:

请输入一个整数(系统默认为十进制):
34
00000000 00000000 00000000 00100010
请输入一个整数(系统默认为十进制):
43
00000000 00000000 00000000 00101011
请输入一个整数(系统默认为十进制):
56
00000000 00000000 00000000 00111000
请输入一个整数(系统默认为十进制):
cc
输入不是数字,请重新输入:r1
输入不是数字,请重新输入:e
输入不是数字,请重新输入:6
00000000 00000000 00000000 00000110
请输入一个整数(系统默认为十进制):
io
输入不是数字,请重新输入:-1
11111111 11111111 11111111 11111111
请输入一个整数(系统默认为十进制):
[[
输入不是数字,请重新输入:]]
输入不是数字,请重新输入:^C
回复 使用道具 举报
Koyou 发表于 2014-12-31 21:37
@从今以后,谢谢呀!
因为这段时间有其他的事情,没有及时回复,抱歉。
用你的代码退换了一下,运行完美 ...

{:3_60:}挖坟狂魔~
回复 使用道具 举报
楼主,好难的啊
回复 使用道具 举报
小平 来自手机 中级黑马 2015-1-1 00:37:59
地板
可能代码有问题
回复 使用道具 举报
小平 发表于 2015-1-1 00:37
可能代码有问题

主要是 scanf函数的问题,“从今以后”伙伴的解释很清楚哦:)。
回复 使用道具 举报

:D 肿么了,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马