2012-04-14 11 views
2

Ich versuche, sscanf in C zu verwenden, um einige Werte aus einer Zeichenfolge zu erhalten. Wenn die Zeichenfolge jedoch mehr Werte hat, als ich möchte, muss ich einen Fehler ausgeben. dh. Wenn ich eine Ganzzahl haben möchte, sollte "2" ok sein, aber "2 5" sollte abstürzen.C: sscanf Zuweisung Unterdrückung und der Rückgabewert

nun mit dem Rückgabewert auf sscanf wie so:

if (sscanf(mystring, "%d %*s", &num) == 1) 

nicht funktioniert, weil es 1 auch wenn der String länger zurückkehren würde ist. Ich kann dies tun:

char tmpString [100]; 
if (sscanf(mystring, "%d %s", &num, tmpString) == 1) 

was gut funktioniert, aber es ist nicht besonders schön. Gibt es eine andere Art und Weise? Kann ich die Zuordnungsunterdrückung verwenden und trotzdem den gewünschten Rückgabewert erhalten? Diese

bearbeiten ist der Code, den ich verwendet habe:

char c; // This is a global variable, just gets used over and over. 
sscanf(mystring, "%d%c", &num, &c); 
    if (c == '\n') { 
+1

Normalerweise mache ich: 'char c; if (sscanf (meinstring, "% d% c", & num, & char) == 1) ' –

+0

Nun, wenn Sie nur wollen, dass es abstürzt, können Sie verwenden: ' sscanf (mystring, "% d% d", & num1 , &num2); '(= – dcow

+0

Dank Jared. Der gleiche Code wie ich, aber effizienter mit nur einem Char. Funktioniert gut. – morgoe

Antwort

1

Eine Möglichkeit ist:

int pos; 
if (sscanf(mystring, "%d %n", &num, &pos) == 1) 
{ 
    if (mystring[pos] != '\0') 
     ...oops...extra data... 
    else 
     ...only number... 
} 
else 
    ...not even one number... 

Der %n Teil C89 ist. Es ist keine besonders häufig verwendete (oder allgemein bekannte) Konversionsspezifikation. Es wird nicht als Umwandlung gezählt (daher der Test für 1).

+0

Danke.Dies scheint viel komplexer als Words Like Jared Code oben: 'char c; if (sscanf (mystring,"% d% c ", & num, & char) == 1)'. Gibt es einen Vorteil? – morgoe

+0

Ihre Wahl, es ist nicht so komplex und beschwert sich nicht, wenn nur Leerzeichen (Leerraum) hinter der Zahl stehen, während Word wie Jareds Code Ihnen einen Fehler anzeigt, wenn hinter der Zahl sogar ein Leerzeichen oder ein Zeilenumbruch steht Natürlich hängt es davon ab, was Sie wollen .. Das '% n' erlaubt Ihnen auch sc zu starten anning nach dem Ende der Nummer, wenn es das ist, was Sie wollen (wahrscheinlich nicht in diesem Zusammenhang). –

+0

Ok danke. Ich habe eine Mischung aus Code und Jareds verwendet, um einen Fehler zu erzeugen, wenn hinter der Zahl Leerzeichen stehen, aber nicht, wenn Zeilenumbrüche vorhanden sind. Ich habe den Code am Ende meines OPs eingefügt. – morgoe