Самый простой способ справиться с задачей - прочитать входные данные в виде строки.Затем выполните проверки, например, количество введенных символов, последние два символа являются действительными шестнадцатеричными цифрами и т. Д., А затем используйте выбранное преобразование, чтобы преобразовать последние две цифры в значение без знака.
При получении вводаРекомендуется использовать строчно-ориентированную функцию , чтобы прочитать всю строку и затем проанализировать то, что вам нужно, из строки.Преимущества в три раза (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
, чтобы убедиться, что вся строка была прочитана, и что дополнительные символы не остаются непрочитанными (например, кошка заснула на клавиатуре).Дайте мне знать, если у вас есть дополнительные вопросы.