Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

10.1.3 Einlesen von Strings

10.1.3 Einlesen von Strings

Bisher habe ich Werte immer mit der Funktion "scanf" bzw. "scanf_s" eingelesen. Dies funktioniert auch mit Strings, allerdings ergeben sich daraus ein paar Fallstricke, was folgendes Beispiel demonstrieren soll.

statische Variante dynamische Variante
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
					
#define DEF_MAX_LENGTH 80

char astrKurzerSatz[DEF_MAX_LENGTH];

printf("Bitte schreiben Sie einen kurzen Satz:\n");
fflush(stdin);
scanf_s("%s", astrKurzerSatz, DEF_MAX_LENGTH);
printf("Sie schrieben:\n%s\n\n", astrKurzerSatz);

printf("Bitte schreiben Sie noch einen kurzen Satz:\n");
fflush(stdin);
gets_s(astrKurzerSatz, DEF_MAX_LENGTH);
printf("Sie schrieben: \n%s", astrKurzerSatz);
					
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
					
#define DEF_MAX_LENGTH 80

char* pstrKurzerSatz = new char[DEF_MAX_LENGTH];

printf("Bitte schreiben Sie einen kurzen Satz:\n");
fflush(stdin);
scanf_s("%s", pstrKurzerSatz, DEF_MAX_LENGTH);
printf("Sie schrieben:\n\"%s\"\n\n", pstrKurzerSatz);

printf("Bitte schreiben Sie noch einen kurzen Satz:\n");
fflush(stdin);
gets_s(pstrKurzerSatz, DEF_MAX_LENGTH);
printf("Sie schrieben: \n\"%s\"", pstrKurzerSatz);

delete [] pstrKurzerSatz;
					

Ausgabe:

Bitte schreiben Sie einen kurzen Satz:
Hallo Welt
Sie schrieben:
"Hallo"

Bitte schreiben Sie noch einen kurzen Satz:
Hallo Welt
Sie schrieben:
"Hallo Welt"
		

Wie Sie sehr schön im ersten Teil sehen können, ließt die Funktion "scanf_s" nur ein Wort ein und keinen ganzen Satz. Genauso kritisch ist es, wenn man so versucht ein einzelnes Leerzeichen einzulesen. Dies leistet diese Funktion nicht, im Gegenteil, es ist von den Entwicklern sogar so gewollt. Um also ein einzelnes Leerzeichen oder einen Satz einlesen zu können, muss man die Funktion "gets" bzw. "gets_s" benutzen.

Besonders auffällig ist, dass beim Einlesen von Strings, die Variable normal übergeben wird und nicht ihre Adresse, also mit einem "&" Operator. Dies liegt daran, dass ein Array ja quasi schon ein Zeiger ist. Streng genommen sind zwar nur dynamische Arrays Zeiger, aber in diesem Fall läuft es auf das Gleiche hinaus.

Ein weiterer bedeutender Fakt ist, dass bei den "_s" Funktionen immer eine Puffergröße mit angegeben werden muss, da es sonst zu Abstürzen kommt (gerade bei "scanf_s"). Dabei bezieht sich der Puffer auf die Variable, welche den Wert bekommen soll, oder im Falle von "strcat_s" oder "strcpy_s", auf die erste Variable, also das Ziel (Target). Wählt man einen kleineren Puffer, so wird die entsprechende Operation abgeschnitten oder es kommt auch zu Abstürzen. Hier ist also höchste Aufmerksamkeit geboten.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012