C 基数程序中的分段错误?

C 基数程序中的分段错误?,c,segmentation-fault,C,Segmentation Fault,我一直试图测试这段代码,但我的power()函数中不断出现分段错误。代码应该采用一个由小写字母组成的单词,并将该单词改为以10为基数的数字。这个词应该是以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(sc

我一直试图测试这段代码,但我的
power()
函数中不断出现分段错误。代码应该采用一个由小写字母组成的单词,并将该单词改为以10为基数的数字。这个词应该是以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;
intpower(inti){
如果(i==1){
返回20;
}否则{
返回20倍功率(i-);
}
}
int main(){
内伦;
查玛雅人[6];
int n;
int-val;
而(scanf(“%s”,玛雅)){
val=0;
n=0;
对于(len=0;玛雅[len]!='\0';len++){
玛雅人=托洛尔(玛雅人);
玛雅人[len]=玛雅人[len]-“a”;
}
对于(i=0;len>=0;len--,i++){

如果(玛雅[len]代码中有三个错误

  • i==0
    的情况没有添加到
    power
    函数中,该函数基本上转换为任何数字,零的幂为1,即x^0=1;
  • 对于递归调用,不要使用
    return 20*power(i--);
    而要使用
    return 20*power(i-1);
    i--
    后减量运算符,这意味着,它将返回
    i
    的值,并将其减量以供进一步使用,这不是您想要的。此外,您甚至不想为本次迭代更改
    i
    的值;您想要做的是在e小于下一次迭代的
    i
    ,这就是传递
    i-1
    所要做的
  • 在(i=0;len>=0;len--,i++)
循环的
初始化中添加
len--
,因为
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;
}
#包括
整数幂(整数i)
{
如果(i==0)
{
返回1;
}
如果(i==1)
{
返回20;
}
其他的
{
返回20*功率(i-1);
}
}
int main()
{
内伦,我;
查玛雅人[6];
int n;
int-val;
而(scanf(“%s”,玛雅))
{
val=0;
n=0;
对于(len=0;玛雅[len]!='\0';len++)
{
玛雅人=托洛尔(玛雅人);
玛雅人[len]=玛雅人[len]-“a”;
}
对于(i=0,len--;len>=0;len--,i++)
{

如果(玛雅[len]代码中有三个错误

  • i==0
    的情况没有添加到
    power
    函数中,该函数基本上转换为任何数字,零的幂为1,即x^0=1;
  • 对于递归调用,不要使用
    return 20*power(i--);
    而要使用
    return 20*power(i-1);
    i--
    后减量运算符,这意味着,它将返回
    i
    的值,并将其减量以供进一步使用,这不是您想要的。此外,您甚至不想为本次迭代更改
    i
    的值;您想要做的是在e小于下一次迭代的
    i
    ,这就是传递
    i-1
    所要做的
  • 在(i=0;len>=0;len--,i++)
循环的
初始化中添加
len--
,因为
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;
}
#包括
整数幂(整数i)
{
如果(i==0)
{
返回1;
}
如果(i==1)
{
返回20;
}
其他的
{
返回20*功率(i-1);
}
}
int main()
{
内伦,我;
查玛雅人[6];
int n;
int-val;
而(scanf(“%s”,玛雅))
{
val=0;
n=0;
对于(len=0;玛雅[len]!='\0';len++)
{
玛雅人=托洛尔(玛雅人);
玛雅人[len]=玛雅人[len]-“a”;
}
对于(i=0,len--;len>=0;len--,i++)
{

如果(玛雅[len]
20*power(i--)
它不会停止函数调用。
20*power(i--)
它不会停止函数调用。“代码中只有三个错误”.嗯,三个错误并不是更少,而是很多。在一个大规模的程序调试中,三个错误需要几天的时间。而且,你永远不应该对初学者说如果你犯了三个错误,没关系。你不是直接说,而是间接说。那么程序员的写作风格就会很差,当他要做大规模的程序时,就会出现h引起的问题。@AshishAhuja哦!对了,先生……我只是想鼓励和乐观;)是的,鼓励是好的,但这会导致程序员编写代码的风格出现错误。因此,下次只需说:“你的代码中有三个错误”,这不会使程序员气馁,但甚至不会损害程序员的风格。有时,说只有一个错误是可以的,但三个错误不是。更正的代码将溢出
int
的大小是的!谢谢你的鼓励,我会编辑它。“你的代码中只有三个错误”.嗯,三个错误并不是更少,而是很多。在一个大规模的程序调试中,三个错误需要几天的时间。而且,你永远不应该对初学者说如果你犯了三个错误,没关系。你不是直接说,而是间接说。那么程序员的写作风格就会很差,当他要做大规模的程序时,就会出现h引起的问题。@AshishAhuja哦!对了,先生……我只是想鼓励和乐观;)是的,鼓励是好的,但这会导致程序员编写代码的风格出现错误。因此,下次只需说:“你的代码中有三个错误”,这不会使程序员气馁,但甚至不会损害程序员的风格。有时,说只有一个错误是可以的,但三个错误不是。更正的代码将溢出
int
的大小是的!谢谢你的鼓励,我会编辑它。