如何扫描C中的最后两位数字?

时间:2018-11-17 23:28:34

标签: c scanf

我正在尝试找出C中是否存在一种更简单的方法来由用户scanf()来输入数字的特定部分。

遵循以下代码:

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

如果用户输入数字240,则scanf("%1d", &opcode);仅将第一个数字保存在opcode

有没有办法只选择最后两位数字?

2 个答案:

答案 0 :(得分:1)

处理任务的最简单方法是将输入读取为字符串。然后执行验证,例如输入的字符数,最后两个字符是有效的十六进制数字,等等。然后使用您选择的转换将最后两位数字转换为无符号值。

在进行输入时,建议您使用面向 line 的功能来读取整行,然后从该行中解析所需的内容。好处是三方面的:(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-termination 字符覆盖)

使用/输出示例

$ ./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.

您可以调整测试(例如isdigitisxdigit)以满足您的特定需求。您可以(并且应该)进行一项测试,len < MAXC - 1以确保整个行都已被读取,并且其他字符不会保持未读取状态(例如,一只猫在键盘上睡觉)。如果您还有其他问题,请告诉我。

答案 1 :(得分:-2)

如果输入大数字,@ 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的另一个函数。