基数程序中的分段错误?

时间:2016-02-13 05:09:20

标签: c segmentation-fault

我一直在尝试测试此代码,但我在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;

}

1 个答案:

答案 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数字。