鱼C论坛

 找回密码
 立即注册
查看: 845|回复: 7

[已解决]S1E13里面动动手的第2题

[复制链接]
发表于 2024-1-13 22:47:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目要求写一个类似于atoi函数的代码。写完之后得出的结果却差强人意。能帮我看一下逻辑上错在哪里了吗?

代码如下
#include<stdio.h>

int main()
{
        int ch,num=0; 
        
        printf("请输入带转换的字符:");
        
        while((ch=getchar())!='\n')
        {
                if('0'<=ch<='1')
                {
                        num = 10*num+(ch-'0');   //这个式子很重要 
                }
                else if(num)  //巧思 
                {
                        break;
                }
        }
        
        printf("结果是:%d",num);
        
        return 0;
}
最佳答案
2024-1-13 22:58:26
顶聪明的芥子 发表于 2024-01-13 22:58
我和你写的一样,都是num = num * 10 + (ch - '0');


非常抱歉,我之前的回答有误。你的代码逻辑上是正确的,通过将字符转换为数字并累加计算,将字符串转换为整数。可能导致结果输出错误的原因可能是其他部分的问题。可以尝试在代码中加入一些调试输出语句,例如打印每个字符和转换后的数字,以帮助你找到问题所在。如果还有其他问题,请随时提问,我会尽力帮助你解决。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-13 22:47:19 | 显示全部楼层
你好!你的代码逻辑上有一些问题。首先,你需要声明一个字符串来存储输入的字符,而不是使用int类型的变量来存储每个字符。其次,在处理字符时,你需要判断字符是否为数字,并将其转换为对应的整数值。最后,你需要考虑正负数的情况。

下面是修改后的代码:
#include <stdio.h>

int myAtoi(char *str) {
    int num = 0;
    int sign = 1;

    // 处理空格
    while (*str == ' ') {
        str++;
    }

    // 处理正负号
    if (*str == '-') {
        sign = -1;
        str++;
    } else if (*str == '+') {
        str++;
    }

    // 处理数字
    while (*str >= '0' && *str <= '9') {
        num = num * 10 + (*str - '0');
        str++;
    }

    return num * sign;
}

int main() {
    char str[100];
    printf("请输入带转换的字符:");
    fgets(str, sizeof(str), stdin);
    
    int result = myAtoi(str);
    printf("转换结果:%d\n", result);
    
    return 0;
}

这段代码通过`myAtoi`函数实现了类似于`atoi`函数的功能。它接受一个字符串作为参数,并将其转换为对应的整数值。在`myAtoi`函数中,我们首先处理空格,然后处理正负号,最后处理数字部分。在处理数字时,我们使用了一个循环,将每个字符转换为对应的整数值,并乘以相应的权重。最后,返回转换后的整数值。

希望能帮助到你!如果有任何问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-13 22:53:11 | 显示全部楼层
FishC 发表于 2024-1-13 22:47
你好!你的代码逻辑上有一些问题。首先,你需要声明一个字符串来存储输入的字符,而不是使用int类型的变量 ...

小甲鱼给的代码没有那么复杂,你能帮我看看我们两个的区别吗?是什么原因导致我的代码结果输出错误的
#include <stdio.h>

int main()
{
        int ch;
        int num = 0;

        printf("请输入待转换的字符串:");

        do
        {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        num = 10 * num + (ch - '0');
                }
                else
                {
                        if (num)
                        {
                                break; // 如果已有数字,则退出循环
                        }
                }

        }
        while (ch != '\n');

        printf("结果是:%d\n", num);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-13 22:53:22 | 显示全部楼层
顶聪明的芥子 发表于 2024-01-13 22:53
小甲鱼给的代码没有那么复杂,你能帮我看看我们两个的 ...


非常抱歉,我的回答可能给你带来了困惑。你的代码和小甲鱼的代码在功能上是类似的,都是实现字符串转换为整数的功能。问题可能出在你循环处理字符的部分。你在判断字符是否为数字时使用的条件是`ch >= '0' && ch <='9'`,这个条件是正确的。但是,在将字符转换为整数时,你使用的是`num = num * 10 + ch - '0'`,这种写法是不正确的。

正确的写法应该是将字符转换为整数值,然后再进行累加操作。可以使用如下代码:
#include <stdio.h>

int main() {
    int ch;
    int num = 0;
    int sign = 1;

    printf("请输入待转换的字符串:");
    do {
        ch = getchar();
        if (ch >= '0' && ch <= '9') {
            num = num * 10 + (ch - '0');
        } else if (ch == '-') {
            sign = -1;
        }
    } while (ch != '\n');

    num *= sign;
    printf("转换后的整数为:%d\n", num);

    return 0;
}

这样修改之后,你的代码就能正确地将字符串转换为整数了。希望能帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-13 22:58:16 | 显示全部楼层
FishC 发表于 2024-1-13 22:53
非常抱歉,我的回答可能给你带来了困惑。你的代码和小甲鱼的代码在功能上是类似的,都是实现字符串转换 ...

我和你写的一样,都是num = num * 10 + (ch - '0');
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-13 22:58:26 | 显示全部楼层    本楼为最佳答案   
顶聪明的芥子 发表于 2024-01-13 22:58
我和你写的一样,都是num = num * 10 + (ch - '0');


非常抱歉,我之前的回答有误。你的代码逻辑上是正确的,通过将字符转换为数字并累加计算,将字符串转换为整数。可能导致结果输出错误的原因可能是其他部分的问题。可以尝试在代码中加入一些调试输出语句,例如打印每个字符和转换后的数字,以帮助你找到问题所在。如果还有其他问题,请随时提问,我会尽力帮助你解决。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-13 23:10:22 | 显示全部楼层
FishC 发表于 2024-1-13 22:58
非常抱歉,我之前的回答有误。你的代码逻辑上是正确的,通过将字符转换为数字并累加计算,将字符串转换 ...

是个好方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-13 23:10:39 | 显示全部楼层


很高兴能帮到你!调试输出语句是调试代码的一个有效方法,在找出问题所在时非常有帮助。通过打印关键变量的值,你可以跟踪代码执行的过程,并查看是否符合你的预期结果。这样可以更容易地发现逻辑错误或者不正确的计算结果。祝你调试顺利,如果还有其他问题,请随时向我提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表