2017-04-30 4 views
6

Ich möchte eine ganze Zahl analysieren, aber mein folgender Code akzeptiert auch Strings wie "3b", die als eine Zahl beginnen, aber angehängt haben Zeichen. Wie lehne ich solche Strings ab?parse Ganzzahl ohne anhängen char in C

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int n; 
    if(argc==2 && sscanf(argv[1], "%d", &n)==1 && n>0){ 
     f(n); 
     return 0; 
    } 
    else{ 
     exit(EXIT_FAILURE); 
    } 
} 
+4

Sie verwenden nicht 'sscanf()'; Sie verwenden 'strtol()' oder ähnliches und prüfen, wo der Endzeiger zeigt. Oder, wenn Sie 'sscanf()' verwenden müssen, verwenden Sie 'int pos; ... if (... && sscanf (argv [1], "% d% n", & n, & pos) == 1) '- Beachten Sie, dass'% n' nicht als Umrechnung gewertet wird, so dass der Vergleich immer noch 'ist 1', nicht '2'. Sie prüfen dann, ob 'argv [1] [pos]' ein Nullbyte ist oder nicht, und klagt, ob das nicht der Fall ist. –

+0

http://StackOverflow.com/Questions/13199693/what-does-the-n-stand-for-in-in-sscanfs-d-n-i-n –

Antwort

4

Für Ihr Problem können Sie strtol() Funktion aus der #include <stdlib.h> Bibliothek verwenden.

Wie strtol (Sample code from tutorial points)

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char str[30] = "2030300 This is test"; 
    char *ptr; 
    long ret; 

    ret = strtol(str, &ptr, 10); 
    printf("The number(unsigned long integer) is %ld\n", ret); 
    printf("String part is |%s|", ptr); 

    return(0); 
} 

Im Inneren des strtol verwenden, scannt er str, speichert die Wörter in einem Zeiger, dann die Basis der Zahl umgewandelt wird. Wenn die Basis zwischen 2 und 36 liegt, wird sie als Radix der Zahl verwendet. Aber ich empfehle Null, wo die 10 ist, so wird es automatisch die richtige Nummer wählen. Der Rest ist in ret gespeichert.

+0

Sie sollten auch erklären, wie Sie Strings wie "3b" ablehnen. –

0

Die ctype.h Bibliothek bietet Ihnen die Funktion isdigit (char) Funktion, die zurückgibt, ob das Zeichen als Argument angegeben eine Ziffer ist oder nicht.
Sie könnten über argv [1] iterieren und es auf diese Weise überprüfen.

+0

Verwenden von 'isdigit()' ist sinnvoll, wenn nur einstellige Ganzzahlen zulässig sind. Wenn mehrstellige Ganzzahlen zulässig sind, ist 'isdigit()' keine so gute Lösung. Es ist besser, eine String-to-Integer-Conversion-Funktion zu verwenden, die sowohl Conversions als auch Checks (also 'strtol()' et al. Statt 'atoi()') konvertiert. –