顶聪明的芥子 发表于 2024-1-13 22:47:10

S1E13里面动动手的第2题

题目要求写一个类似于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;
}

FishC 发表于 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;
    printf("请输入带转换的字符:");
    fgets(str, sizeof(str), stdin);
   
    int result = myAtoi(str);
    printf("转换结果:%d\n", result);
   
    return 0;
}

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

顶聪明的芥子 发表于 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;
}

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

顶聪明的芥子 发表于 2024-1-13 22:58:16

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

我和你写的一样,都是num = num * 10 + (ch - '0');

FishC 发表于 2024-1-13 22:58:26

顶聪明的芥子 发表于 2024-01-13 22:58
我和你写的一样,都是num = num * 10 + (ch - '0');

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

顶聪明的芥子 发表于 2024-1-13 23:10:22

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

是个好方法

FishC 发表于 2024-1-13 23:10:39

顶聪明的芥子 发表于 2024-01-13 23:10
是个好方法

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: S1E13里面动动手的第2题