In C, was ist der beste Weg, die Kommas zu ignorieren, wenn Sie scanf
auf einer Zahl wie 1.000.000 verwenden?In C, Wie scanf zu verwenden, um in 1.000.000 zu scannen, die Kommas ignorierend
Antwort
Es gibt eine Reihe von Möglichkeiten zum Entfernen der Kommas (oder eines anderen Zeichens, das Sie überspringen möchten). Eine der einfachsten (und flexibelsten) Möglichkeiten besteht darin, einfach zwei Zeiger in der Eingabefolge nach unten zu bewegen, wobei alle Ziffern zusammen verschoben werden, wobei die Kommata ignoriert werden. (Sie müssen sicher sein, nul-terminate nach der letzten Ziffer).
wäre ein Beispiel:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#define MAXC 25
long xstrtol (char *p, char **ep, int base);
int main (void) {
char string[MAXC] = "";
char *rp, *wp; /* a read pointer and write pointer */
int c;
long n = 0;
rp = wp = string;
printf ("enter number with ',': ");
if (!fgets (string, MAXC, stdin)) {
fprintf (stderr, "error: insufficient input.\n");
return 1;
}
/* work down each char in string, shifting number together */
while (*rp && (('0' <= *rp && *rp <= '9') || *rp == ',')) {
if (*rp == ',') { rp++; continue; } /* skip commas */
*wp++ = *rp; /* shift digits together */
rp++;
}
*wp = 0; /* nul-terminate */
if (*rp != '\n') /* flush input buffer */
while ((c = getchar()) != '\n' && c != EOF) {}
printf ("\n string : %s\n", string);
n = xstrtol (string, &rp, 10); /* convert string to long */
printf(" n : %ld\n\n", n);
return 0;
}
/** a simple strtol implementation with error checking.
* any failed conversion will cause program exit. Adjust
* response to failed conversion as required.
*/
long xstrtol (char *p, char **ep, int base)
{
errno = 0;
long tmp = strtol (p, ep, base);
/* Check for various possible errors */
if ((errno == ERANGE && (tmp == LONG_MIN || tmp == LONG_MAX)) ||
(errno != 0 && tmp == 0)) {
perror ("strtol");
exit (EXIT_FAILURE);
}
if (*ep == p) {
fprintf (stderr, "No digits were found\n");
exit (EXIT_FAILURE);
}
return tmp;
}
(Anmerkung:xstrtol
bietet einfach auf die Umwandlung von string
-long
Fehlerprüfung)
Verwendung/Output
$ ./bin/nwithcomma
enter number with ',': 1,234,567
string : 1234567
n : 1234567
Schau es dir an und lass mich k jetzt, wenn Sie irgendwelche Fragen haben. Sie können gegen INT_MIN
und INT_MAX
überprüfen, wenn Sie das Ergebnis zu int
umwandeln möchten, aber es ist genauso einfach, die Antwort als long
zu verlassen.
als Funktion
Wie erwähnt, wäre es viel nützlicher als eine Funktion sein. Sie können den Code auf eine einfache Umwandlungsfunktion, bewegen und den Hauptcode wie folgt anpassen:
...
#define MAXC 25
long fmtstrtol (char *s);
long xstrtol (char *p, char **ep, int base);
int main (void) {
char string[MAXC] = "";
printf ("enter number with ',': ");
if (!fgets (string, MAXC, stdin)) {
fprintf (stderr, "error: insufficient input.\n");
return 1;
}
printf(" number : %ld\n\n", fmtstrtol (string));
return 0;
}
/* convert comma formatted string to long */
long fmtstrtol (char *s)
{
if (!s || !*s) {
fprintf (stderr, "fmtstrtol() error: invalid string.\n");
exit (EXIT_FAILURE);
}
char *rp, *wp; /* read pointer, write pointer */
int c;
rp = wp = s;
while (*rp && (('0' <= *rp && *rp <= '9') || *rp == ',')) {
if (*rp == ',') { rp++; continue; }
*wp++ = *rp;
rp++;
}
*wp = 0;
if (*rp != '\n') /* flush input buffer */
while ((c = getchar()) != '\n' && c != EOF) {}
return xstrtol (s, &rp, 10);
}
...
Warum ein komplettes Arbeitsprogramm? Es könnte eine Funktion sein. – haccks
Richtig, es war nur ein Top-Down-Beispiel, das ich nicht in eine Funktion umformatiert habe: (' –
@hacks - Faulheit korrigiert - Funktion vorausgesetzt':) ' –
Ich würde sagen, der beste Weg ist nicht Verwendung scanf
für diese. Zumindest keine Zahlenformate verwenden.
Stattdessen lesen Sie es als eine Zeichenfolge, entfernen Sie dann die Kommas und schließlich convert to a number.
Das ist eine gute Idee! Danke werde ich das tun – Dizzzyp
- 1. Wie scanf in OCaml verwenden
- 2. Wie scanf() ohne stdio.h zu verwenden ist
- 3. nicht in der Lage, die Zeichenfolge mit Leerzeichen zu scannen
- 4. scanf() zu 1D-Array in C
- 5. Wie verwende ich scanf, um Werte in NSString zu akzeptieren?
- 6. Wie Scanf zwei ganzen Zahlen in c
- 7. Wie funktioniert die scanf-Funktion in C?
- 8. scanf eine Struktur von einer Funktion, Aufruf von derselben Funktion, um andere Strukturen zu scannen
- 9. Spring definiere Bean, um automatisch zu scannen
- 10. mit scanf in C/C++
- 11. Schnellste Möglichkeit, 1.000.000+ Zufallszahlen in Python zu generieren
- 12. Json-Parser, um nachkommende Kommas in Java zu fangen?
- 13. Wie EOF verwenden, um eine Textdatei in C zu durchlaufen?
- 14. Wie C-Erweiterungen in Python verwenden, um GIL zu umgehen
- 15. Konsolenausgabe stoppt auf scanf() Methode in C++
- 16. Wie bekomme ich alle 0 von scanf Eingabe in C
- 17. Wie würde ich alle Kommas, die nicht in Klammern stehen, aus einer Zeichenfolge in C# entfernen?
- 18. C# - Force String.Format, um Dezimalstellen und NIEMALS Kommata zu verwenden
- 19. Erhalten scanf, um zu beenden, wenn es einen Zeilenumbruch liest?
- 20. wie scanf verwendet wird, um doppelt und char gleichzeitig in ein Doppel-Array in C
- 21. Wie sed verwenden, um die Variable einer Konfigurationsdatei zu ersetzen?
- 22. Verwendung von scanf() in C
- 23. Array zu Zeichenkette, die Kommas enthält - JavaScript
- 24. C Scanf äquivalent in NodeJS
- 25. C# -Website erstellen, um Webservice zu verwenden
- 26. Differenz zwischen scanf ("% c", & c) und scanf ("% c", & c)
- 27. Warum c() verwenden, um Vektor zu definieren?
- 28. Wie ermittelt scanf, ob zu blockieren?
- 29. scanf ohne zusätzliche Argumente in C
- 30. Warum versuchen, in den Namen zu scannen, erzeugt Segmentierungsfehler?
while (scanf ("% 4 [^],% 4 [^],% 79 [^,] ,% d ", sem, type, title, & value) == 4) probiere das aus – Jois
Ich weiß es nicht, aber vielleicht chnage das [locale] (http://www.gnu.org/software/libc/manual /html_node/Locales.html#Locales)? –