Как мне отсканировать последние две цифры в C? - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь выяснить, есть ли в C более простой способ scanf() определенной части введенного пользователем числа.

После кода:

printf("Enter opcode:\n");
scanf("%1d", &opcode);

Если пользователь вводит число 240, scanf("%1d", &opcode); сохранит первую цифру только в opcode

Есть ли способ выбрать только последние две цифры?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Самый простой способ справиться с задачей - прочитать входные данные в виде строки.Затем выполните проверки, например, количество введенных символов, последние два символа являются действительными шестнадцатеричными цифрами и т. Д., А затем используйте выбранное преобразование, чтобы преобразовать последние две цифры в значение без знака.

При получении вводаРекомендуется использовать строчно-ориентированную функцию , чтобы прочитать всю строку и затем проанализировать то, что вам нужно, из строки.Преимущества в три раза (1) вы получаете независимую проверку прочитанного;(2) вы получаете независимую проверку конверсии;и (3) то, что остается во входном буфере, не зависит от используемого scanf спецификатора преобразования .

Краткий пример:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAXC 1024   /* if you need a constant #define one (or more) */

int main (void) {

    char buf[MAXC];     /* buffer to hold line (don't skimp on size) */

    printf ("Enter opcode: ");          /* prompt */
    if (fgets (buf, MAXC, stdin)) {     /* read entire line */
        char *p;            /* pointer - to set to last 2 digits */
        size_t len;         /* length of the string entered */
        buf[(len = strcspn (buf, "\r\n"))] = 0; /* get length/trim '\n' */
        if (len < 2) {      /* validate at least 2 characters entered */
            fputs ("error: minimum 2-characters required.\n", stderr);
            return 1;
        }
        p = buf + len - 2;  /* set p to point to next to last char */
        if (!isxdigit(*p) || !isxdigit(*(p+1))) {   /* validate hex digits */
            fputs ("error: last 2 chars are not hex-digits.\n", stderr);
            return 1;
        }
        printf ("last 2 digits: %s\n", p);  /* output last 2 digits */
        /* perform conversion of choice here 
        * (suggest strtoul or sscanf) 
        */
    }

    return 0;
}

( примечание: выбор преобразования остается за вами. Также обратите внимание, как вы обрабатываете '\n', включенный в буфер с помощью fgets, также зависит от вас. Выше его просто перезаписывают с помощью nul-terminating символ)

Пример использования / Вывод

$ ./bin/opcodelast2
Enter opcode: 240
last 2 digits: 40

Другие результаты:

Enter opcode: 40
last 2 digits: 40

Enter opcode: 3240
last 2 digits: 40

Enter opcode: 324a
last 2 digits: 4a

Enter opcode: 4g
error: last 2 chars are not hex-digits.

Enter opcode: 4
error: minimum 2-characters required.

Вы можете настроить тесты(например, isdigit или isxdigit) для удовлетворения ваших конкретных потребностей.Вы можете (и должны) включить тест, который len < MAXC - 1, чтобы убедиться, что вся строка была прочитана, и что дополнительные символы не остаются непрочитанными (например, кошка заснула на клавиатуре).Дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 18 ноября 2018

Код @Craig Estey может быть взломан, если вы введете большое число.

int main()
{
    char str[100];
    do {
        scanf("%99s", str);
    } while (strlen(str) < 2);
    int opcode = atoi(str + strlen(str) - 2);
}

Да, он не идеален, потому что разрывается, когда вы вводите строку с более чем 100 символами.
Но вы можете заменить scanf другой функцией, которая может принимать бесконечную строку len.

...