c программа для преобразования из восьмеричного в десятичное - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь выяснить, что не так с моим кодом, так как он всегда пропускает только к printf("not an octal number part"); и выводит только те данные, которые имеют много других вычислений перед ним, я пытаюсь отладить его, но не могу кажется, найти ошибку. это лето проблемы, описанной ниже, также мы пока не можем использовать указатели.

A 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);
}

Ответы [ 2 ]

0 голосов
/ 28 января 2020

очень простая функция. Нужна дополнительная проверка ошибок. Примечание '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);
    }
}
0 голосов
/ 28 января 2020

Вы не завершили нулем my_strg. Это означает, что начало массива содержит входные данные, а остальная часть содержит gibberi sh. Также может быть полезно выполнить проверку границ, чтобы избежать переполнения буфера.

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