我正在尝试找出C中是否存在一种更简单的方法来由用户scanf()
来输入数字的特定部分。
printf("Enter opcode:\n");
scanf("%1d", &opcode);
如果用户输入数字240,则scanf("%1d", &opcode);
仅将第一个数字保存在opcode
有没有办法只选择最后两位数字?
答案 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.
您可以调整测试(例如isdigit
或isxdigit
)以满足您的特定需求。您可以(并且应该)进行一项测试,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的另一个函数。