课后作业的一道题,动动手第0题,话说为什么打印不出来?
本帖最后由 超凡天赐 于 2017-2-20 20:59 编辑S1E29:参数和指针 | 课后测试题及答案
http://bbs.fishc.com/thread-77360-1-1.html
(出处: 鱼C论坛)
#include <stdio.h>
char *myitoa(int num,char *p)
{
int a;
int i=0;
if(num<0)
{
num=-num;
*p='-';
}
while(num!=0)
{
a=num%10;
num/=10;
i++;
}
i--;
while(i>=0)
{
*(p+1)=a+48;
i--;
p++;
}
*(++p)='\0';
return p;
}
int main()
{
char str;
printf("%s\n",myitoa(-520, str));
return 0;
}
@人造人 @zealstar
#include <stdio.h>
char *myitoa(int num, char *p)
{
int a;
int i = 0;
char *ret = p; //这里
if(num<0)
{
num = -num;
*p = '-';
}
while(num != 0)
{
a = num % 10;
num /= 10;
i++;
}
i--;
while(i >= 0)
{
*(p + 1) = a + 48;
i--;
p++;
}
*(++p) = '\0';
return ret; //这里
}
int main(void)
{
char str;
printf("%s\n", myitoa(-520, str));
return 0;
}
人造人 发表于 2017-2-7 21:15
为什么形参不能做返回值? 超凡天赐 发表于 2017-2-7 22:14
为什么形参不能做返回值?
本帖最后由 zealstar 于 2017-2-8 10:04 编辑
超凡天赐 发表于 2017-2-7 22:14
为什么形参不能做返回值?
#include <stdio.h>
void myitoa(int num,char *p) //改成void,不需要返回值,因为你本来就是对str的地址进行修改
{
int a;
int i=0;
if(num<0)
{
num=-num;
*p='-';
}
while(num!=0)
{
a=num%10;
num/=10;
i++;
}
i--;
while(i>=0)
{
*(p+1)=a+48;
i--;
p++;
}
*(++p)='\0';
}
int main()
{
char str;
myitoa(-520, str); //然后这里调用函数改变str里的内容
printf("%s\n",str); //这就没问题了
return 0;
}
对于形参不能作返回值,我的理解就是p是临时变量,调用函数后就会被释放。除非返回的时候赋值给相应的实参,否则相当于没有。这里的你函数已经引入了实参str(在函数中实际操作也是对应了str的地址),所以没必要再次返回这个地址。
也可以理解为p的作用范围就是myitoa函数内,出去就没了,而str的作用范围是main函数内。 zealstar 发表于 2017-2-8 09:39
对于形参不能作返回值,我的理解就是p是临时变量,调用函数后就会被释放。除非返回的时候赋值给相 ...
#include <stdio.h>
char *myitoa(int num,char *p)
{
int a;
int i=0;
if(num<0)
{
num=-num;
*p='-';
}
while(num!=0)
{
a=num%10;
num/=10;
i++;
}
i--;
while(i>=0)
{
*(p+1)=a+48;
i--;
p++;
}
*(++p)='\0';
return p;
}
int main()
{
char str;
myitoa(-520, str);
printf("%s\n",str);
return 0;
}
这样也可以 zealstar 发表于 2017-2-8 09:39
对于形参不能作返回值,我的理解就是p是临时变量,调用函数后就会被释放。除非返回的时候赋值给相 ...
#include <stdio.h>
char *myitoa(int num, char *str);
char *myitoa(int num, char *str)
{
int dec = 1;
int i = 0;
int temp;
if (num < 0)
{
str = '-';
num = -num;
}
temp = num;
while (temp > 9)
{
dec *= 10;
temp /= 10;
}
while (dec != 0)
{
str = num / dec + '0';
num = num % dec;
dec /= 10;
}
str = '\0';
return str;
}
int main(void)
{
char str;
printf("%s\n", myitoa(520, str));
printf("%s\n", myitoa(-1234, str));
return 0;
}
为什么小甲鱼老师写的答案返回了一个地址,却能打印出来 超凡天赐 发表于 2017-2-8 21:27
为什么小甲鱼老师写的答案返回了一个地址,却能打印出来
之前说错了{:10_266:}!
我又仔细看了下你的程序,返回形参的值是可行的,只是不要在main里面引用形参!{:10_285:}
算是我误导了一下你,实际上你之前的代码问题是:
你的之前的那个函数,p++了很多次,此时p指向的地址在哪?字符串末尾吧?!返回值是这个地址!这个地址指向str末位,自然打印不出东西!{:10_284:}
zealstar 发表于 2017-2-9 00:41
之前说错了!
我又仔细看了下你的程序,返回形参的值是可行的,只是不要在main里面引用形参! ...
对的 顶一下!
页:
[1]