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
的大小是的!谢谢你的鼓励,我会编辑它。