2016-12-05 6 views
3

Ich bin ziemlich neu in der Welt der Programmierung, also bitte vergib mir, wenn das ein häufiger Fehler ist.sscanf() double & string

Ich versuche, 3 doppelte Werte und 3 Strings aus einer Eingabezeichenfolge zu scannen, aber es geht nicht nach dem zweiten Wert weiter.

double total_weight_kg(char *s, int Length) { 
    double weights[3]; 
    char units[3]; 
    int test = sscanf(s, "%lf, %s, %lf, %s, %lf, %s", 
         &weights[0], &units[0], 
         &weights[1], &units[1], 
         &weights[2], &units[2]); 
    printf("%i\n", test); 
    printf("%s\n", &units[0]); 

int main(void) { 
    total_weight_kg("5, g, 1, t, 175, kg", 3); 
    return 0; 

der erste Druck druckt 2 und die zweite ist die g.

Außerdem würde ich gerne Einheiten [i] in einer Schleife vergleichen, aber das scheint auch nicht funktionieren zu können.

for (int i = 0; i < Length; i++) { 
    w = weights[i]; 
    if (strcmp(units[i], "kg") == 0) { 
     weight += w; 
    } 
} 

Ich hoffe, dass Sie mir eine Lösung für dieses Problem finden helfen können,

edit: Every wird nun wie vorgesehen arbeiten. Vielen Dank für Ihre Hilfe. (19 [^] war ein großes Problem)

+3

Das 'scanf' Format' "% s" 'ist für das Lesen nullterminierten Strings. Ihr Array 'units' ist ein Array von drei einzelnen' char' Elementen, keine Strings. Der Compiler hätte Warnungen an Sie rufen sollen (sowohl für diesen als auch für den Aufruf "strcmp"). –

+1

'char Einheiten [3];' wird nicht g und kg halten. Du hast hier einen Pufferüberlauf. Sie müssen ein char [] -Array wie zum Beispiel 'char units [3] [10]' erstellen. –

+2

Wir verzeihen dir: C Saiten sind die Hölle. –

Antwort

2

Es gibt einige Probleme in Ihrem Code:

  • Um die Saiten in units zu scannen, müssen Sie sie als 2D-Array von char definieren:

    char units[3][20]; 
    
  • Sie sollten das scanf Format ändern, das Wort auf , und Räume Parsen zu stoppen, wie user3386109 vorgeschlagen.

  • Ändern Sie auch die printf, um das Array anstelle seiner Adresse zu übergeben.

Hier wird der modifizierte Code ist:

double total_weight_kg(char *s, int Length) { 
    double weights[3]; 
    char units[3][20]; 
    int test = sscanf(s, "%lf, %19[^, \n], %lf, %19[^, \n], %lf, %19[^, \n]", 
         &weights[0], units[0], 
         &weights[1], units[1], 
         &weights[2], units[2]); 
    printf("%i\n", test); 
    printf("%s\n", units[0]); 
    ... 
} 

int main(void) { 
    total_weight_kg("5, g, 1, t, 175, kg", 3); 
    return 0; 
} 
+0

Ich änderte es in Char-Einheiten [3] [20]; aber wenn ich den Code kompiliere, sagt er mir einfach "% s erwartet ein Argument vom Typ 'char *', aber Argument 4 hat den Typ 'char (*) [20]" Was muss ich tun, um das zu ändern? – mejasper

+0

@mejasper: poste den Code für die ganze Funktion und was für ein minimales kompilierbares Beispiel notwendig ist. – chqrlie

+0

@mejasper: Entferne auch die überflüssigen '&' from 'units [0]' Argumente zu 'scanf()'. – chqrlie