Selten ist scanf()
die beste Wahl für Benutzereingaben. Besser, fgets()
zu verwenden, um eine Zeile und dann zusätzlichen Code zu lesen, um die Zeichenfolge zu analysieren.
char buf[100];
while (fgets(buf, sizeof buf, stdin)) {
// code read the text input into a string, now do something with it.
-Code sucht acht hexadezimale Ziffern und OP ist auf dem richtigen Weg mit scanf("%08x"...
. 0
wird hier nicht benötigt, nur 8
wird tun, um die Eingabe auf 8 Ziffern zu begrenzen. Verwenden Sie " "
, um alle optionalen Leerzeichen zu überspringen. Verwenden Sie "%n"
, um die Anzahl der analysierten Zeichen aufzuzeichnen.
unsigned number = 0;
int n = 0;
// If any length (up to 8) hex text was found ...
// ... and test if `buf[n]` is the end of the string or maybe that 9 digit?
if (sscanf(buf, "%8x %n", &number, &n) == 1) && buf[n] == '\0') {
printf("Success :%08x\n", number);
} else {
fprintf(stderr, "please insert a valid number\n");
}
}
Wenn Codetext, um sicherzustellen, muss enthalten nicht ein führendes wie "0x123"
, ist mehr Arbeit erforderlich. Verschiedene Ansätze.
Verkleben Sie mit *scanf()
Spezifizierer, verwenden Sie "%*[abcdefABCDEF]"
, um einen String nach Hex-Ziffern zu scannen. Die *
bedeutet nicht speichern, nur scannen.
int n = 0;
// If any length (up to 8) hex text was found ...
// ... and test if `buf[n]` is the end of the string or maybe that 9 digit?
sscanf(buf, "%*8[abcdefABCDEF] %n", &n);
if (n > 0 && buf[n] == '\0') {
unsigned long number = strtoul(buf, NULL, 16);
printf("Success :%08lx\n", number);
} else {
fprintf(stderr, "please insert a valid number\n");
}
}
Eine klug Weise ist *scanf()
alle zusammen zu vermeiden und ein "0x"
auf den String prepend analysiert und strtol()
nur für die Analyse verwenden werden.
char buf[100];
while (fgets(&buf[2], sizeof buf - 2, stdin)) {
char *endptr;
buf[0] = '0';
buf[1] = 'x';
unsigned long number = strtoul(buf, &endptr, 16);
int length = (int) (endptr - buf);
if (length < 3 || length > (2 + 8) || *endptr != '\n') {
fprintf(stderr, "please insert a valid number\n");
} else {
printf("Success :%08lx\n", number);
}
}
Ich würde stattdessen eine Zeichenfolge lesen, überprüfen Sie ihre Länge, dann verwenden Sie 'strtol' mit Basis 16, um es in hex konvertieren. Hinweis: 'strtol' erlaubt einen optionalen vorangestellten' 0x', also sollten Sie sicherstellen, dass der String nicht damit beginnt. Sie können auch überprüfen, dass die Zahl nicht größer als "ffffffff" ist. – Evert
Verwenden Sie 'sprintf', um die Zahl (zurück) in einen String zu konvertieren, füllen Sie ihn bei Bedarf mit Nullen auf. – Evert
'* printf' verwendet'% 0nx', wobei n die Breite (ungleich Null) ist, um Pad mit Nullen anstelle von Leerzeichen zu bezeichnen, aber '* scanf' hat keine spezielle Bedeutung für'% 0nx'; '% 08x' bedeutet Parse _up to_ 8 Zeichen in Hex als' unsigned int' genauso wie '% 8x'. (Beachten Sie auch, dass 'unsigned int' auf einigen Systemen nicht 32 Bit hat, aber Sie wahrscheinlich nicht darauf stoßen werden.) –