UVa 355 - The Bases Are Loaded

本文记录了一段关于进制转换程序的调试经历,通过详细分析和逐步排查,最终解决了因数组越界导致的问题,并分享了使用标准库函数进行进制转换的经验及调试技巧。


#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<cstdio>

#include<iostream>

#include<math.h>

using namespace std;

int ifover(char c[],int a){

int statue = 0;

for(int i = 0; i < strlen(c); i++) {

if(c[i] >= '0' && c[i] <= '9'){

if(c[i] - '0' >= a)

statue = 1;

}else{

if(c[i] - 'A' + 10 >= a)

statue = 1;

}

}

return statue;

};//判断是否超出范围



int main(){

char c[11] = {0};

int a,b;

a = b = 0;

while(~scanf("%d %d %s",&a,&b,c)){

   //     if((a < 2 || a > 16) || (b < 2 || b > 16))

   //         printf("%s is an illegal base %d number\n",c,a);

if(ifover(c,a))

  printf("%s is an illegal base %d number\n",c,a);

else{

char m[42] = {0};

    char * pEnd;

        long long decimal = strtol(c, &pEnd , a);//十进制

/*long long decimal= 0LL;

for ( int i = 0 ; c[i] ; ++ i ) {

decimal *= a;

decimal += ctoi(c[i]);

}*/

for(int i = 0;i < 42;i++) {

int temp = decimal % b;

if(temp <= 9) m[42 - 1 - i] = temp + '0'; /////////////罪魁祸首

else m[42 - 1 - i] = temp - 10 + 'A';

decimal /= b;

if(decimal == 0) break;

}

printf("%s base %d = ",c,a);

int i = 0;

while(m[i] == '\0')  i++;

for(; i < 42; i++) printf("%c",m[i]);

printf(" base %d\n",b);

}

}

return 0;

}


1 这道题卡了我两天,不知道wa了多少次,最后错在标注了罪魁祸首的那一句,我把判断条件写成了小于42,真的不知道自己脑子怎么这么短路,气死爸爸了

2 最后证明,虽然并不明确strtol的函数中,中间参数的功能,但一般用起来还是没有问题的

3 把具体功能抽象成函数,有利于寻找错误

4 还发现了一中查错比较好的方法。把别人和自己的代码都放在coderunner的一个屏幕上,一个一个的实验数据,要相信一定会有问题的

5 关于极端情况的思考,这里面最长的一个数就是把16进制的十个F转换成2进制,会用40位,刚开始没有考虑周全


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值