c - 实现一个 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
}
解决方案
问题是atoi()
函数的使用。该atoi()
函数基本上将带有以 ASCII 编码的数字字符的字符串转换为整数。如果您查看ASCII表,数字 1、2 和 3分别编码字符'^A'
和。这意味着,在函数循环之后,作为参数传递给的字符串不是数字字符串,因此将零作为错误返回。此外,字符和分别编码为数字 49、50 和 51。'^B'
'^C'
while
reverse()
atoi()
'1'
'2'
'3'
现在,我建议您更改整个实现,因为接收整数作为输入进行操作并在操作期间将其转换为字符串以再次使用返回整数是没有意义的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
$
推荐阅读
- oop - 什么时候可以依赖具体的类?
- apache-kafka - java.lang.NullPointerException:使用 Avro 格式的 Spring Cloud Stream 3 Kafka 函数生产者中的 null
- python - Spacy/Textacy 不从 .txt(文本)文件中读取文件内容
- amazon-web-services - 数据库 RDS 的静态端点
- excel - 选择/取消选择切片器时隐藏/取消隐藏一行
- python-3.x - 如何等待 Recaptcha 在 Pyppeteer 中加载?
- php - Symfony 安装在公司防火墙后面
- python - 使用 tensorflow 定义自定义密集层
- javascript - 在没有任何库或框架的情况下,在节点 js 中为具有动态参数的 URL 提供静态文件
- javascript - 匹配符号的正则表达式以符号开头