【问题标题】:A c program to convert from octal to decimal一个八进制转十进制的c程序
【发布时间】:2020-05-14 05:33:48
【问题描述】:

我试图找出我的代码有什么问题,因为它总是只跳到printf("not an octal number part"); 并且只输出虽然前面有许多其他计算,但我正在尝试调试它但不能似乎找到了错误。这是下面问题的夏天,我们还不允许使用指针。

一个 C 程序,以一行字符的形式输入一个八进制数并将输入的字符存储在一个数组中。将八进制数转换为十进制整数,并使用 printf 在标准输出上显示十进制整数。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
int main() {

    char my_strg[MAX_SIZE];
    int c;
    int res = 0;
    int i = 0;

    while ( (c = getchar()) != '\n') {

        my_strg[i] = c;

        i++;
    } 
    int k = 0; 
    for(k = strlen(my_strg)-1; k >= 0; k--) {

        if((my_strg[k] >= '0') && (my_strg[k] <= '7')) {

            res +=  (pow(8, k) * (my_strg[k]-'0'));

        } else if(my_strg[k] == '-') {

            res *= -1;

        } else {
            printf("not an octal number");
            break;
        }
        k++;
    }
    printf("%d\n", res);
}

【问题讨论】:

  • 确保以空值终止 my_strg(在最后一个字符后添加 \0)。
  • 不要pow为整数!!
  • 你熟悉strtol系列函数吗?
  • while (i &lt; MAX_SIZE - 1 &amp;&amp; (c = getchar()) != '\n' &amp;&amp; c != EOF)
  • 从不为此目的使用 pow从不。改为使用重复的乘法或位移。

标签: c arrays loops stdout stdin


【解决方案1】:

非常简单的功能。需要更多的错误检查。 注意'a' != 'A'。基数可以与数字表中的字符数一样大

static const char digits[] = "0123456789abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRTSTUWXYZ";
long long ALMOST_anybase(const char *str, int base, int *errCode)
{
    long long result = 0;
    int sign = 1;

    if(errCode) *errCode = 0;
    if(str)
    {   
        if(*str == '-') {sign = -1; str++;}
        while(*str)
        {
            if(*str == '-') 
            {
                if(errCode) *errCode = 3;
                break;
            }
            else
            {
                char *ch;
                if((ch = strchr(digits, *str)))
                {
                    if(ch - digits >= base)
                    {
                        if(errCode) *errCode = 2;
                        break;
                    }
                    result *= base;
                    result += (ch - digits);
                }
                else
                {
                    if(errCode) *errCode = 1;
                    break;
                }
            }
            str++;
        }
    }
    return result * sign;
}


int main(void)
{
    int errCode;
    long long result;

    result = ALMOST_anybase("-4-4", 10, &errCode);
    if(errCode)
    {
        printf("Wrong input string ErrCode = %d\n", errCode);
    }
    else
    {
        printf("result = %lld\n", result);
    }
}

【讨论】:

  • 这个算法会说“56--7--”是一个合法的八进制数。
  • @FredK 如果您能阅读 - 需要更多错误检查。我们不是免费在这里编写程序。这个函数只是展示了这个想法。
【解决方案2】:

您还没有以空值终止 my_strg。这意味着数组的开头包含输入,但其余部分包含乱码。进行边界检查也可能是个好主意,这样您就不会出现缓冲区溢出。

while (((c = getchar()) != '\n') && (i < MAX_SIZE-1)) {
    my_strg[i] = c;
    my_strg[i+1] = '\0';
    i++;
}

【讨论】:

  • 由于某种原因它仍然无法正常工作,它获取输入但不返回输出
  • my_strg[i+1] = '\0'; 为什么不在 while 循环的末尾把它改成my_strg[i] = '\0';?效率?
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多