我一直在尝试测试此代码,但我在power()
函数中一直遇到分段错误。代码应该是由小写字母组成的单词,并将单词更改为base 10
的数字。该单词应采用多个base 20
的形式,其中'a' = 0, 'b' = 1,...., 't' = 19;
int power(int i){
if(i==1){
return 20;
}else{
return 20*power(i--);
}
}
int main(){
int len;
char mayan[6];
int n;
int val;
while(scanf("%s", mayan)){
val = 0;
n = 0;
for(len = 0; mayan[len] != '\0'; len++){
mayan[len] = tolower(mayan[len]);
mayan[len] = mayan[len] - 'a';
}
for(i = 0; len >= 0; len--, i++){
if(mayan[len] <= 19){
n = n + mayan[len] * power(i);
}else{
fprintf(stderr, "Error, not a base 20 input \n");
val = 1;
break;
}
}
if(val==0){
printf("%d \n", n);
}
}
return val;
}
答案 0 :(得分:3)
您的代码中有三个错误。
i==0
功能中没有添加power
的情况,基本上转换为零功率的任意数字,即 x ^ 0 = 1; 。< / LI>
return 20*power(i--);
而不是使用return 20*power(i-1);
进行递归调用。 i--
是后递减运算符,这意味着它将返回i
的值,并将其递减以供进一步使用,这不是您想要的。此外,您甚至不想为此迭代更改i
的值;你想要做的是在下一次迭代中使用一个小于i
的值,这就是通过i-1
的行为。len--
循环的初始化中添加for(i = 0; len >= 0; len--, i++)
,因为len
现在位于输入的最后一个索引上,因为之前的循环。纠正这些错误的最终代码是:
#include<stdio.h>
int power(int i)
{
if(i==0)
{
return 1;
}
if(i==1)
{
return 20;
}
else
{
return 20*power(i-1);
}
}
int main()
{
int len,i;
char mayan[6];
int n;
int val;
while(scanf("%s", mayan))
{
val = 0;
n = 0;
for(len = 0; mayan[len] != '\0'; len++)
{
mayan[len] = tolower(mayan[len]);
mayan[len] = mayan[len] - 'a';
}
for(i = 0, len--; len >= 0; len--, i++)
{
if(mayan[len] <= 19)
{
n = n + mayan[len] * power(i);
}
else
{
fprintf(stderr, "Error, not a base 20 input \n");
val = 1;
break;
}
}
if(val==0)
{
printf("%d \n", n);
}
}
return val;
}
请注意,您的代码基本上只能用于最多五位数的基数20
,因为您用来存储它的数组mayan
的大小为6
,其中,一个字符将用于存储终止字符\0
。我建议您增加数组mayan
的大小,除非您只想支持五位基数20
数字。