Разрешение только восьмеричных чисел

#c #octal

#c #восьмеричные

Вопрос:

Что делает мой код, так это:

  • Пользователь выбирает либо преобразование из десятичного числа в восьмеричное, либо из восьмеричного числа в десятичное.
  • Пользователь вводит число
  • Пользователь получает результат преобразования

Теперь я хочу разрешить только числа otcal при преобразовании из восьмеричного числа в десятичное и выдавать сообщение об ошибке, если число не является восьмеричным. Как этого можно достичь?

 #include <stdio.h>
#include <math.h>

int UmrechnungDezimalZuOktal(int dezimalzahl), UmrechnungOktalZuDezimal(int oktalzahl);
int main()
{
    char auswahl;
    int dezimalzahl, oktalzahl, nichtBeendet = 1, c;
    

    while (nichtBeendet) {
            printf("nn  ##################  AUSWAHL  ##################n"
                "  #                                             #n"
                "  #     1) Konvertierung Dezimal -> Oktal       #n"
                "  #     2) Konvertierung Oktal -> Dezimal       #n"
                "  #     3) Abbruch                              #n"
                "  #                                             #n"
                "  ###############################################nn");

            printf("Auswahl: ");
            scanf("%c", amp;auswahl);

            switch (auswahl) {
            case '1': {                                                                                      /* Konvertierung Dezimal -> Oktal */
                printf("Geben Sie eine positive, ganze Dezimalzahl ein: ");
                scanf("%d", amp;dezimalzahl);

                if (dezimalzahl >= 0)
                {
                printf("Die Dezimalzahl %d entspricht der Oktalzahl %d", dezimalzahl, UmrechnungDezimalZuOktal(dezimalzahl));
                }
                else
                {
                printf("Bitte nur positive Zahlen eingeben!");
                }
                break;
            }
            case '2': {                                                                                      /* Konvertierung Oktal-> Dezimal */
                printf("Geben Sie eine positive, ganze Oktalzahl ein: ");
                scanf("%d", amp;oktalzahl);

                if (oktalzahl >= 0)
                {
                printf("Die Oktalzahl %d entspricht der Dezimalzahl %d", oktalzahl, UmrechnungOktalZuDezimal(oktalzahl));
                 }
                else
                {
                    printf("Bitte nur positive Zahlen eingeben!");
                }
                break;

            }
            case '3': {                                                                                      /* Abbruch */
                nichtBeendet = 0;
                break;
            }
            default: {                                                                                       /* Ungültige Eingabe*/
                printf("Ungueltige Eingabe!");
                break;
            }
            }
            while ((c = getchar()) != 'n' amp;amp; c != EOF) {};
        }
}

int UmrechnungDezimalZuOktal(int dezimalzahl)                                                               /* Rechnung Dezimal -> Oktal */                                                         
{
    int oktalzahl = 0, i = 1;

    while (dezimalzahl != 0)
    {
        oktalzahl  = (dezimalzahl % 8) * i;
        dezimalzahl /= 8;
        i *= 10;
    }

    return oktalzahl;
} 

int UmrechnungOktalZuDezimal(int oktalzahl)                                                                 /* Rechnung Oktal -> Dezimal*/
{
    int dezimalzahl = 0, i = 0;

    while (oktalzahl != 0)
    {
        dezimalzahl  = (oktalzahl % 10) * pow(8, i);
          i;
        oktalzahl /= 10;
    }

    i = 1;

    return dezimalzahl;
}
 

Комментарии:

1. Вы можете принять восьмеричное значение в виде строки, а затем извлечь из него числовую часть. Например, попросите пользователя ввести восьмеричное значение с добавлением 0c в начале (скажем 0c12 ). Затем проверьте, содержит ли ввод 0c , если он содержит эти два символа, продолжайте дальше, в противном случае завершите.

2. Также вы можете проверить входные данные, если таковые digit > 7 имеются, то это не восьмеричное число.

3. не используйте pow или другие математические функции при использовании целых чисел

Ответ №1:

Я бы заменил все функции scanf and, закодированные в формате harcoded , на fgets and strtol :

 enum {oct = 8, dec = 10, hex = 16};

int to_number(int base, bool *match)
{
    char str[32];
    long num = 0;

    *match = false;
    if (fgets(str, sizeof str, stdin))
    {
        char *ptr;

        num = strtol(str, amp;ptr, base);
        *match = (*ptr == 'n'); // match is true if strtol stops scanning
                                 // at the newline left by fgets
    }
    return (int)num;
}

...

bool match;
int num = to_number(oct, amp;match);

printf("%d %s an octaln", num, match ? "is" : "is not");
 

Редактировать:

Как указано @klutt в комментариях, поскольку strtol возвращает a long , в идеале функция также должна возвращаться long , чтобы избежать приведения, тогда, если вам действительно нужно int , вы можете привести возврат функции:

 long to_number(int base, bool *match);

int num = (int)to_number(oct, amp;match);
 

Комментарии:

1. Я бы поставил круглые скобки *ptr == 'n' просто для ясности.

2. Но с какой стати вы объявляете num как long, а затем приводите результат вместо изменения возвращаемого типа?

3. @klutt хорошая мысль, я предпочитаю избегать их, но я согласен, так понятнее

4. @klutt OP работает с int s в своем примере, зачем возвращать a long , если OP хочет an int ?

5. Хорошо, я понимаю вашу точку зрения, но я бы все равно вернулся надолго. И я склонен видеть красный цвет, когда вижу ненужные броски. 🙂