2022.6.9原代码展示:
(但实际AC未通过,而自己验证时转化结果是正确的,思考无果,先记录代码)
#include <stdio.h>
char *convertToBase7(int num){
//最大数10^7的七进制数为150666343,占9位
char s[11]={'0'},*str,temp;//符号位、结束位各占一位,先得s是反序,要正序
int count=0,i=0,j=0;//count存7进制符号、数字、尾位数数
if(num<0) {
j++;
count++;
s[0]='-';
num=num*(-1);
}
if(num==0){//为0时
s[0]='0';
s[1]='\0';
str=s;
return str;
}
while(num){
s[count]='0'+num%7;//反序
num=num/7;
count++;
}
s[count]='\0';//最后一位
while(j<count){
temp=s[--count];
s[count]=s[j];
s[j]=temp;
j++;
}
str=s;
return str;
}
int main(void) {
char *num;
int i=0;
num=convertToBase7(10000000);
while(num[i])
printf("%c",num[i++]);//150666343
return 0;
}
2022.6.10错因分析:
今天查了一下“函数返回一个整型数组”的形式,发现之前自己忽略了局部变量被销毁的问题!
返回的指针,指向的是已销毁的局部变量,这会出问题的。
而static变量出了作用域也不会销毁内存,形式如下:
int *test()
{
static int a[2];
a[0] = 1;
a[1] = 2;
return a;
}
故将原代码进行如下修改:
#include <stdio.h>
#include <stdio.h>
char *convertToBase7(int num){
//最大数10^7的七进制数为150666343,占9位
static char s[11]={'0'};
char temp;//符号位、结束位各占一位,先得s是反序,要正序
int count=0,i=0,j=0;//count存7进制符号、数字、尾位数数
if(num<0) {
j++;
count++;
s[0]='-';
num=num*(-1);
}
if(num==0){//为0时
s[0]='0';
s[1]='\0';
return s;
}
while(num){
s[count]='0'+num%7;//反序
num=num/7;
count++;
}
s[count]='\0';//最后一位
while(j<count){
temp=s[--count];
s[count]=s[j];
s[j]=temp;
j++;
}
return s;
}
int main(void) {
char *num;
int i=0;
num=convertToBase7(-7);
while(num[i])
printf("%c",num[i++]);//-10
return 0;
}
此时AC通过。
但是我仍不清楚为何原代码即便错误也能输出正确的转换结果,望路过的大佬能够指点一二。