String "zurück" übergeben
-
Hallo zusammen!
Seit einigen Wochen werd ich im Studium etwas mit ANSI C gequält und an einer Stelle hakts nun leider ein wenig... Programmiererfahrung hab ich, aber eben nicht in C (Delphi, Java, diverse Web-Geschichten)
Folgendes Problem:
Es wird eine Zeile aus der Konsole eingelesen (als String). Soweit kein Problem. Aus diesem String sollten dann die enthaltenen numerischen Werte extrahiert werden (falls vorhanden)... so mein Plan sieht momentan so aus:
Eine Funktion bekommt den eingegeben String übergeben, sucht den ersten numerischen Wert raus und gibt diesen sowie den übrigen Teil des Strings zurück (um sie eventuell mit dem übrigen Teil erneut aufzurufen um einen 2ten, 3ten etc Wert zu erhalten, falls vorhanden. Dafür Rückgabewert 0 = keine Ziffer im String, 1 = sonst.
Funktioniert wunderbar, nur bekomme ich keinen Rest mehr zurück in die aufrufende Funktion... mal ein paar Schnipsel Code zur Veranschaulichung:Das der Aufruf der Funktion (irgendwo in main() ) und die dabei verwendeten Variablen
char input_string[100]; char rest_string[100]; long value1 = 0; int found_numeric = 0; (..) found_numeric = extract_numeric_value(input_string, rest_string, &value1);
Und hier die Funktion, die verwendet wird:
int extract_numeric_value(const char *str, char *str_rest, long *numeric_value) { char *str_first_digit = NULL; str_first_digit = strpbrk(str, "0123456789"); if (str_first_digit == NULL) return 0; *numeric_value = strtol(str_first_digit, &str_rest, 10); str_rest = "test2"; return 1; }
Der Wert kommt richtig in der Variablen value1 zurück, aber die Variable rest_string, die als 2ter Parameter übergeben wird, enthält nach Ende der Funktion nicht den Rest der ihr in der Funktion bei strtol zugewiesen wird, sondern nach wie vor das, was ihr als letztes vor dem Funktionsaufruf innerhalb von main zugewiesen wird (also nichts, ich habs nur getestet indem ich einen Text eine Zeile vor dem Funktionsaufruf zugewiesen habe, der steht danach immer noch/wieder drin...)
Okay ich hoffe das war einigermaßen verständlich, jetzt die Frage -- Warum?
bzw wie krieg ich den string-rest korrekt aus der Funktion wieder raus?
Danke schonma,
Gruß Shade
-
Wenn du wirklich ein zweites char-Array für den Zweck verwenden willst, kannst du das per strcpy() befüllen (die Zuweisung biegt nur die lokale Kopie des Zeigers auf ein neues Ziel - davon bemerkt das Hauptprogramm nichts). Aber in deinem Anwendungsbeispiel kannst du dir das Kopieren auch sparen und einen Zeiger in das übergebene Array zurückgeben:
int extract_numeric_value(const char *str, char **str_rest, long *numeric_value) { char *str_first_digit = NULL; str_first_digit = strpbrk(str, "0123456789"); if (str_first_digit == NULL) return 0; *numeric_value = strtol(str_first_digit, str_rest, 10); return 1; } ... char input[100],*pos; long value=0; int found=0; found = extract_numeric_value(input,&pos,&value); //und um an der letzten gefundenen Stelle weiterzumachen: found = extract_numeric_value(pos,&pos,&value);
-
Hey danke für die schnelle Antwort, das mit dem Zeiger funktioniert super! Ich hab eben ne Weile gebraucht bis ich das Prinzip verstanden hab, aber gute Idee