2016-04-07 2 views

Antwort

3

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); 
} 
... 
+0

Warum ein komplettes Arbeitsprogramm? Es könnte eine Funktion sein. – haccks

+0

Richtig, es war nur ein Top-Down-Beispiel, das ich nicht in eine Funktion umformatiert habe: (' –

+1

@hacks - Faulheit korrigiert - Funktion vorausgesetzt':) ' –

14

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.

+0

Das ist eine gute Idee! Danke werde ich das tun – Dizzzyp

Verwandte Themen