蛋蛋的问题(二)--错误--用%d输入英文字母

蛋蛋的问题(二)

时间限制: 100 ms  |  内存限制: 65535 KB
难度: 2
描述

教新生的时候,也是学长们最兴奋的时候,但是只局限于讲课的那位帅帅的学长,在最后一排坐着听课的学长确实无比的苦闷啊,为了让小学弟知道,你们的二进制转换学的很烂,学长为你们创造了这道很难的题,没看错,是很难。。。

二进制的转换很简单,下面是搜搜里面的介绍:

这个题可不是求二进制这么简单的,说过了,是很难的。。

下面说问题:对于给出的N个数,求出他们的8进制数或者16进制数,每组数据最前面有标示符,是‘X’,那么就要转换成16进制的书,如果是‘0’,呢么就要转换成8进制,是不是很难啊,还有更难得:注意(输出长度规定为4),可别输错了欧。。。。

输入
有多组数据。
每组数据第一个是一个字符,'0'或者'X',然后是一个整数N(0<N<=100),接下来是N个整数,每个整数都为小于100的非负整数。
输出
对应每组输入,输出所要求的数据,输出数据为单独一行
样例输入
0 5 2 3 4 5 6
X 5 2 3 4 5 6
0 2 99 98
X 2 99 98
X 2 10 11
样例输出
   2    3    4    5    6 
   2    3    4    5    6 
 143  142 
  63   62 
   A   B

下面是错误代码:

#include<stdio.h> 
int main()
{ 
    int n,i=0,array[110];
    int c;
    while(scanf("%d %d",&c,&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&array[i]);
            printf("%d",array[i]);
        }
        for(i=0;i<n;i++)
            printf("%d",array[i]);
        if(c=='0')
            for(i=0;i<n;i++)
            printf("%4o",array[i]);
              if(c=='X')
            for(i=0;i<n;i++)
                printf("%4X",array[i]);
        printf("\n");
    }
    return 0; 
} 

当scanf("%d",&n)要求输入整数时输入了字符,那么scanf("%d",&n)是什么也不接收的,它要跳过非数字的所有字符寻找整数,
找不到就结束了。加while(1)后,若输入、输出语句在这个循环中,第一次由于输入缓冲区中无数据,scanf("%d",&n)要等待输入,
一旦输入个字符,输入缓冲区中就有“数据”了,但scanf("%d",&n)不接收字符,要跳过去寻找整数,没有找到则结束;可是while(1)循环
回去又要让scanf("%d",&n)接收数据,这次不需要从键盘输入了,因为它发现输入缓冲区中有“数据”(其实是第一次输入的字符),
它就又重复上述动作。所以输出语句就无休止地输出同一个数。
比如程序:
#include<stdio.h>
int main()
{
    int y=88;
    while(1)
    {
        scanf("%d",&y);
    printf("%d\n",y);
    }
    return 0;

}

正确代码:
 
#include<stdio.h> 
#include<string.h>
int main()
{ 
    int n,i=0,array[110];
    char c;
    while(scanf("%c %d",&c,&n)!=EOF)
    {
        memset(array,0,sizeof(int)*110);
        for(i=0;i<n;i++)
            scanf("%d",&array[i]);
        getchar();
        // for(i=0;i<n;i++)
        //     printf("%d",array[i]);
        if(c=='0')
            for(i=0;i<n;i++)
            printf("%4o",array[i]);
              if(c=='X')
            for(i=0;i<n;i++)
                printf("%4X",array[i]);
        printf("\n");
    }
    return 0; 
} 
        




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值