马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
s1e29动动手0,题目如下:
你应该听说过 itoa 函数(函数文档 -> 传送门),它的作用是将一个整数转换成字符串形式存储。现在要求我们自己来实现一个类似功能的函数 myitoa(int num, char *str),该函数的第一个参数是待转换的整型变量,第二参数传入一个字符指针,用于存放转换后的字符串。
给出主程序段:……
int main(void)
{
char str[10];
printf("%s\n", myitoa(520, str));
printf("%s\n", myitoa(-1234, str));
return 0;
}
要求的结果:
我的代码:#include<stdio.h>
char *myitoa(int a,char *array)
{
int i=0,j,flag=0,m; //结果位数i计算
char ch_array[10]; //中间数组。
if(a<<0) //判断正负值。如果是负数,将符号‘-’存入数组array第一个位置
{
array[0]='-';
i++;
a=-a;
}
m=0;
if(a>=10) //每次除10,提取余数存入中间数组ch_array
{
ch_array[m]=a%10;
m++;
}
for(j=m;j<0;j--) //数组存储值反转存储到指定的数组里
{
array[i]=ch_array[j];
i++;
}
}
int main(void)
{
char str[10];
printf("%s\n",myitoa(520,str));
printf("%s\n",myitoa(-1234,str));
return 0;
}
悲惨的运行结果:
仔细分析了代码的各个部分,实在搞不明白哪里出了问题,造成这个“段错误(核心已转存)”。上网查找段错误的原因,是指发生了越界,也就是访问了不应该访问的内存,这个内存要么不存在,要么不允许使用。还有一个可能文件损坏。
那么首先,我尝试编译了好多遍了,应该排除文件损坏的原因。整个代码没有指定内存位置,应该不会被这么多次调用到不允许访问的内存,那么就是越界了。整个代码过程,根据题目要求定义了一个10元素的数组,我又定义了一个10元素组成的中间数组char ch_array[10].外加使用了4个整形变量,都是用了几个数字,根据题目,数组最大用到5个元素,那么变量值最大用到4也就结束了,不可能超出范围呀。还求哪位有耐心帮忙找找这个“段错误”错在了哪里。谢谢。
先说编码问题,其实您的编译器本应该协助您解决这些问题的。看看我使用的编译器是怎么评价您的代码的: test.c:10:13: warning: converting the result of '<<' to a boolean; did you mean '(a << 0) != 0'? [-Wint-in-bool-context]
if(a<<0) //判断正负值。如果是负数,将符号‘-’存入数组array第一个位置
^
test.c:6:19: warning: unused variable 'flag' [-Wunused-variable]
int i=0,j,flag=0,m; //结果位数i计算
^
test.c:30:1: warning: non-void function does not return a value [-Wreturn-type]
}
^
3 warnings generated.
理解和解决了这些问题,就理解和解决了您目前出现的段错误。
当然,您的代码除此之外还有逻辑上的问题,还需要后续的修改才能得到正确的结果,您可以先尝试,遇到无法解决的问题欢迎继续提问。
|