实现一个反转函数来反转一个整数,但这里的输出总是 0
Implement a reverse function to reverse an integer but the output here is always 0
我不明白为什么 return .... 不起作用。不知何故,输出总是 0。这里 return 对 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
}
问题出在atoi()
函数的使用上。 atoi()
函数基本上将带有以 ASCII 编码的数字字符的字符串转换为整数。
如果您查看 ASCII table,数字 1、2 和 3 分别编码字符 '^A'
、'^B'
和 '^C'
。这意味着,在 reverse()
函数中的 while
循环之后,作为参数传递给 atoi()
的字符串不是数字字符串,因此零被 return 编辑为错误。此外,字符 '1'
、'2'
和 '3'
分别编码为数字 49、50 和 51。
现在,我建议您更改整个实现,因为接收整数作为输入进行运算并在运算期间将其转换为字符串再次 return 整数是没有意义的使用 atoi()
。所以,忘记字符串、ASCII 和 atoi()
。
让我们开始创建一个循环来操作数字的每个数字,使用模块运算符,就像您所做的那样。
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
$
这个任务不需要数组,也不需要atoi
函数,while
循环的逻辑不正确。一个正确而简单的可能是这样的(前提是没有发生整数溢出):
#include <stdio.h>
int reverse (int x)
{
int r = 0;
while (x != 0) {
r = 10 * r + x % 10;
x /= 10;
}
return r;
}
int main (void)
{
printf("%d\n", reverse(1234));
return 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;
int arr[15];
while (x != 0)
{
rem = x % 10;
arr[i] = rem;
x /= 10;
i++;
}
int result = 0;
for (int j = 0; j < i; j++) {
result = 10 * result + arr[j];
}
return result;
}
关于:
int i, rem = 0;
和
arr[i] = ((char)rem);
局部变量i
未初始化!。在我的系统上,结果是段错误事件。
我不明白为什么 return .... 不起作用。不知何故,输出总是 0。这里 return 对 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
}
问题出在atoi()
函数的使用上。 atoi()
函数基本上将带有以 ASCII 编码的数字字符的字符串转换为整数。
如果您查看 ASCII table,数字 1、2 和 3 分别编码字符 '^A'
、'^B'
和 '^C'
。这意味着,在 reverse()
函数中的 while
循环之后,作为参数传递给 atoi()
的字符串不是数字字符串,因此零被 return 编辑为错误。此外,字符 '1'
、'2'
和 '3'
分别编码为数字 49、50 和 51。
现在,我建议您更改整个实现,因为接收整数作为输入进行运算并在运算期间将其转换为字符串再次 return 整数是没有意义的使用 atoi()
。所以,忘记字符串、ASCII 和 atoi()
。
让我们开始创建一个循环来操作数字的每个数字,使用模块运算符,就像您所做的那样。
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
$
这个任务不需要数组,也不需要atoi
函数,while
循环的逻辑不正确。一个正确而简单的可能是这样的(前提是没有发生整数溢出):
#include <stdio.h>
int reverse (int x)
{
int r = 0;
while (x != 0) {
r = 10 * r + x % 10;
x /= 10;
}
return r;
}
int main (void)
{
printf("%d\n", reverse(1234));
return 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;
int arr[15];
while (x != 0)
{
rem = x % 10;
arr[i] = rem;
x /= 10;
i++;
}
int result = 0;
for (int j = 0; j < i; j++) {
result = 10 * result + arr[j];
}
return result;
}
关于:
int i, rem = 0;
和
arr[i] = ((char)rem);
局部变量i
未初始化!。在我的系统上,结果是段错误事件。