我必须使用以下原型实现一个函数:
int base10(char *n, int b)
目标是作为参数传递的数组在每个索引中包含以 b 为基数的数字的一个数字,该数字必须以 10 为基数返回。到目前为止,我已经编写了以下内容。
int val(char n){
if(n >= '0' && n<='9'){
return (int)n;
}else{
switch (n) {
case 'A': return 10;
case 'B': return 11;
case 'C': return 12;
case 'D': return 13;
case 'E': return 14;
case 'F': return 15;
case 'G': return 16;
}
}
}
int base10(char *n, int b){
int tamano,resultado=0;
tamano = //no se como
printf("%d", tamano);
for(int i=0;i<tamano;i++) resultado += val(n[i])*pow(b,i);
return resultado;
}
要将基数 x 转换为基数 10,我必须将每个数字乘以提高的基数到它在数字中的位置,我的问题是我不知道我必须执行多少次操作,因为它们没有给我位数(或数组的大小)作为信息)。
如果不知道数组的大小,就不可能解决这个问题。直接(它们直接为您提供数字大小)或间接(数组具有类似 的终止符
'\0'
)。我注意到在您的代码中,每个元素不包含以 b 为基数的单个数字,而是一个代表以 b 为基数的数字的 ASCII 字符。
区别很重要,因为它表明它
char *n
肯定是标准的 C 字符串。C 中的标准约定是使用终止符'\0'
。因此解决方案是遍历数组,直到找到一个元素
'\0'
上面的代码会溢出超过容量的数字,
int
也没有错误处理,但这是另一个问题的问题。否则函数
val
不正确。如果参数
char n
为“0”,则结果(int)n
不是 0,而是 48。原因是 n 是一个 char 类型的变量,按照惯例,它包含一个代表ASCII 码表中字符的数字。如上表所示,数字 48 代表字符
'0'
。要将 ASCII 字符转换为其数值,只需减去 48。
虽然使用开关将字母“A”转换为“G”很好,但可以使用相同的技术用更少的代码完成。
尽管
val
上述函数包含一些错误处理,但仍然不够。数字“JJ019A”在基数 10 中无效,在基数 30 中有效,但上面的代码没有检测到这一点。