scanf rückgabewert bei strings
-
Hey, ich wollte mal fragen wann scanf bei Strings den Rückgabewert 1 hat. Bei der Eingabe "sddgfg" bekomme ich z.B. den Rückgabewert 0.
-
scanf gibt die Anzahl erfolgreich gelesener werte zurück. Das ist im Idealfall die Anzahl der Werte die man einlesen wollte und verhält sich bei Zeichenketten nicht anders als bei allen anderen Datenformen. Wenn du 0 bekommst, obwohl du 1 Wert erwartest und auch 1 pasenden Wert eingibst, dann wirst du etwas falsch gemacht haben. Ich tippe mal auf Anfängerfehler wie
scanf(zeichenkette);
.
-
hier meine funktion
char *eingabe_string(char *aufforderung) { char *string = NULL; int check; do { check = 1; printf("%s\n", aufforderung); check = scanf(" %s", string); if (check == 0) { printf("%d\n",check); while ( getchar() != '\n' ); ; } } while (check == 0); return string; }
-
Sei mal froh, dass
scanf()
nur die 0 zurückgibt und nicht abstürzt.
An der Stelle NULL liegt garantiert kein gültiger Speicher, an demscanf()
deine Eingabe ablegen kann.DU musst den SPeicher zur Verfügung stellen und an
scanf()
übergeben.
Siehe auch: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
-
wie stell ich den speicher zur verfügung ?
-
Z.B. indem du eben ein entsprechend großes Array auf dem Stack oder mit malloc() auf dem Heap anlegst...
-
In dem du an deine Funktion den Speicher übergibst:
char *eingabe_string(char *string, char *aufforderung) { ... }
-
in der main würde es dann so hier aussehen oder wie?
char *string [10]; wort = eingabe_string(string, aufforderung);
-
essential schrieb:
char *string [10];
Versuchs noch einmal:
http://cdecl.ridiculousfish.com/?q=char+*string+[10]%3B+
-
Nein.
Ein char *string [10]; ist ein Array aus 10 Zeigern auf char.
Du brauchst aber nur ein einfaches Array von char.
Außerdem zeigt der Rückgabewert von eingabe_string ja schon auf string.char string[10]; // wenn das in wort gespeichert werden soll. eingabe_string(string, aufforderung);
oder auch
char wort[100]; // wenn 9 Zeichen reichen, ist das ok. eingabe_string(wort, aufforderung);
-
es funktioniert, cool danke !
geht das nur mit dem übergeben?
-
alternativ mit globalen Variablen. Dazu musst Du analog zu Deiner bisherigen Lösung die Variablendeklination außerhalb der main-Funktion bzw. generell außerhalb einer Funktion durchführen. Ist aber nicht sonderlich schön.
-
Du kannst dir mit malloc() Speicher besorgen.
Du darfst aber nicht vergessen den auch wieder freizugeben.
Speicher brauchst du eh beim einlesen. Du musst aber auch aufpassen, das dieser Speicher nicht "überläuft".
Wenn der User zuviel eingibt, wird einfach anderer Speicher überschrieben.