所以我需要在函数中使用指针计算数字的反转。当我运行它时,我得到的是垃圾内存。这是我尝试过的。(当我删除p时,它可以工作,我没有得到任何垃圾内存,但我只能计算余数,我不知道为什么?)
我很抱歉之前的帖子。我读了堆栈溢出的规则。
代码如下:
int Invers(int x , int *Calculinvers ){
int rem = 0;
int p = 1
while(x!=0){
rem = x % 10 ;
*Calculinvers = p*10 + rem;
x = x / 10;
}
return *Calculinvers;
}
int main(){
int a;
printf("Introduceti numarul caruia vreti sa-i calculati inversul : n");
scanf("%d" , &a);
int Calcul;
Invers(a , &Calcul);
printf("Inversul numarului este : %dn" , Calcul);
return 0;
}
两个问题和修复:
(1)*Calculinvers
需要初始化为0,否则系统会给你意想不到的值。
(2)将*Calculinvers = p*10 + rem;
替换为*Calculinvers = *Calculinvers*10 + rem;
,因为您没有添加之前的值。
我把这个扔在一起,它似乎工作:
#include <stdio.h>
int reverse(int x)
{
out = 0;
while (x != 0)
{
const int ones = x % 10;
out *= 10;
out += ones;
x /= 10;
}
return out;
}
int main(void) {
const int num[] = { 0, 1, 10, 47, 109, 4711, 1234, 98765432 };
printf("I got:n");
for (int i = 0; i < sizeof num / sizeof *num; ++i)
{
printf(" %d -> %dn", num[i], reverse(num[i]));
}
return 0;
}
It prints:
I got:
0 -> 0
1 -> 1
10 -> 1
47 -> 74
109 -> 901
4711 -> 1174
显然,当我们处理实际的整数时,后面的零变成了前导零,除非我们在打印时存储原始数字的长度和填充,否则前导零实际上不存在。例如,这就是为什么10
变成1
。
这更适合作为纯字符串空间操作,因为这样每个数字都是作为字符串的一部分而不是作为数字表示的一部分(有其他约定)。
更新:
如果你真的想使用指针,你当然可以把上面的代码用一个更有指针意味的包裹起来:
void reverse_at(int *x)
{
const int rev = reverse(*x);
*x = rev;
}
,但正如注释中所述(并希望通过我的代码说明),一种更实用的方法,其中返回值对函数的结果进行计算,通常更容易理解,更安全,而且更好。