【问题标题】:How to convert string representation of octal number to decimal?如何将八进制数的字符串表示形式转换为十进制?
【发布时间】:2021-04-22 02:59:09
【问题描述】:

我想制作一个将二进制数转换为十进制、八进制和十六进制的程序。 在接受输入时,我正在考虑他们的标准表示。例如:八进制是“o10” 所以我将 10 转换为十进制,得到 8。

这是我输入字符串并将其转换为十进制的代码:


int main()
{
    int ch=0;
    char str[1000];
    printf("Enter the number\n");
    scanf(" %s",str);
    l=strlen(str);

    for(int j=0;j<l;j++)
    {
        if(str[j]>=48 && str[j]<=57)
            n=n*10+(str[j]-48);
    }
}

但问题是它不适用于八进制。如何正确输入?

【问题讨论】:

  • 请提供比“它不起作用”更多的细节。
  • 您可以检查像 o 这样的开始字符,在这种情况下,在将字符转换为 int 时使用 *8 而不是 *10(使用变量来保存 8 或 10)
  • 库函数strtol() 可以做你想做的事:不需要实现你自己的版本。

标签: c string input


【解决方案1】:

在您正在撰写的有关创建二进制/八进制/十六进制到十进制转换器的帖子中,但您的代码仅针对八进制,我的答案将尝试通用,因此您可以使用它来实现其他情况,但将重点关注八进制。

首先,你的代码有一些与算法本身无关的小问题:

  1. 您调用 printfstrlen 函数,它们不是 C 内置的,需要包含在各自的库中:
#include <stdio.h>
#include <string.h>
  1. 您将l 分配给字符串的长度,但您从未声明它的类型,因此需要这样做:
l = strlen(str);
  1. n 的同样问题,从未声明过。不仅如此,你说n=n*10 ... 所以只是不声明它,你使用它的价值.. 你认为n*10 会返回什么?我的猜测是垃圾。既然你在循环中使用它,你应该在循环本身之外声明它,所以我建议:
int l = strlen(str), n = 0;

好吧,不是我们解决了这个问题,您的八进制转换代码实际上几乎完成了。 算法的唯一问题是n*10 ... 部分。如果你将n 乘以10,你实际上得到了十进制转换。所以十进制到十进制转换,如果你输入例如48,你将得到48 作为输出。我们需要什么来修复它?将其更改为2 用于二进制转换,8 用于八进制,16 用于六进制。您的代码只涉及八进制,因此如果您将此行更改为:

n = n * 8 + (str[j] - 48);

您将得到一个有效的八进制转换。例如,如果运行程序并输入10,您将得到8,这就是我们想要的。

现在正如我之前提到的,如果你想让它更通用,你应该有一个名为 int base = 10; 的变量,你可以根据第一个字符设置它,例如:

int base = 10; // default value
if (str[0] == 'o')
{
    base = 8;
}

当然,您也可以对其他基地做同样的事情,而且它的工作原理几乎相同。最后,在计算之后,您实际上从未使用过 n 的值,所以类似的方法可以检查我们得到的答案:

printf("In Decimal => %d\n", n);

这有点工作,但我们仍然需要检查数字边界。例如,八进制数不能有大于 7 的数字,而十六进制数可以有 A 作为数字。在 for 循环中,我们不检查类似的东西。例如,如果您在代码中输入o48,它将打印出答案40,这是不正确的,因为48 不是八进制数。

所以你为了完成程序,你需要检查是否边界,并执行其余的碱基检查(h 用于六进制,b 用于二进制),这个我将留给你。 祝你好运~!

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2014-12-05
    • 2016-04-13
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多