一个将八进制转换为十进制的c程序

问题描述 投票:0回答:2

我试图弄清楚我的代码出了什么问题,因为它总是只跳到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);
}
c arrays loops stdout stdin
2个回答
0
投票

您还没有以N结尾的my_strg。这意味着数组的开头包含输入,但其余部分则包含乱码。进行边界检查也可能是一个好主意,以免缓冲区溢出。

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

0
投票

非常简单的功能。需要更多错误检查。

static const char digits[] = "0123456789abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRTSTUWXYZ";
long long ALMOST_anybase(const char *str, int base, int *errCode)
{
    long long result = 0;
    if(str)
    {
        while(*str)
        {
            if(*str == '-') 
            {
                result *= -1;
            }
            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;
}


int main(void)
{
    printf("%lld\n", ALMOST_anybase("4", 8, NULL));
}
© www.soinside.com 2019 - 2024. All rights reserved.