首页 > 解决方案 > 实现一个 reverse 函数来反转一个整数,但这里的输出总是 0

问题描述

我不明白为什么退货....不起作用。不知何故,输出总是 0。这里的返回调用atoi总是输出 0。

#include <stdio.h>  //INCLUDES
#include <stdlib.h>

int reverse (int x); //Func Decls

int
main ()
{
  printf ("%d", reverse (123)); //123=321, -123=-321, 120=21, 0=0
  return 0;
}

int
reverse (int x)
{

  int i, rem = 0;
  char arr[15];

  while (x % 10 != 0)
    {
      rem = x % 10;
      arr[i] = ((char)rem);
      x /= 10;
      i++;
    }

  return atoi(arr); //OUTPUT = 0, does not return actual output
} 

标签: cinteger

解决方案


问题是atoi()函数的使用。该atoi()函数基本上将带有以 ASCII 编码的数字字符的字符串转换为整数。如果您查看ASCII表,数字 1、2 和 3分别编码字符'^A'和。这意味着,在函数循环之后,作为参数传递给的字符串不是数字字符串,因此将零作为错误返回。此外,字符和分别编码为数字 49、50 和 51。'^B''^C'whilereverse()atoi()'1''2''3'

现在,我建议您更改整个实现,因为接收整数作为输入进行操作并在操作期间将其转换为字符串以再次使用返回整数是没有意义的atoi()。所以,忘记字符串、ASCIIatoi(). 让我们开始创建一个循环来操作数字的每个数字,使用模块运算符,就像你做的那样。

int reverse (int x) {
    int result = 0;
    while ( x != 0 ) {
        result = x%10;
    }
    return result;
}

然后,要在 中插入另一个数字result,请执行相反的操作:将其乘以 10。

int reverse (int x) {
    int result = 0;
    while ( x != 0 ) {
        result = result*10 + x%10;
    }
    return result;
}

现在,从 中删除目标数字x,将其除以十。

int reverse (int x) {
    int result = 0;
    while ( x != 0 ) {
        result = result*10 + x%10;
        x /= 10;
    }
    return result;
}

最后,整个代码。

#include <stdio.h>
#include <stdlib.h>

int reverse (int x);

int main () {
    printf ("%d\n", reverse(123));
    printf ("%d\n", reverse(-123));
    printf ("%d\n", reverse(120));
    printf ("%d\n", reverse(0));
    return 0;
}

int reverse (int x) {
    int result = 0;
    while ( x != 0 ) {
        result = result*10 + x%10;
        x /= 10;
    }
    return result;
}

结果,正如预期的那样:

$ gcc -Wall -std=c99 -o program program.c
$ ./program
321
-321
21
0
$

推荐阅读