Dynamischer String
-
Hallo,
ich würde gerne einen String anlegen, der dynamischer in seiner Speichergröße vom Benutzer gewählt werden kann.char *satz; int length; printf("Wie lang soll Ihr Satz sein?"); scanf("%d", &length); satz = (char *) malloc(sizeof(*satz) * length); printf("Bitte geben Sie den unverschluesselten Satz ein:\n"); fgets(satz,length,stdin);
er überspringt jedoch das fgets jedes mal und ich kann den satz nich eingeben. wieso das?
-
Weil beim scanf zwar die von dir eingegebene Länge lesen und somit vom Eingabepuffer entfernt wird, aber das '\n' im Puffer bleibt. Das darauffolgende (f)gets konsumiert es bevor du noch etwas eingeben kannst. Also ein eventuelles Newline vor (f)gets aus dem Puffer lesen und verwerfen.
// deutsche Sprache ...
-
Die Frage wäre ein Grund, die Möglichkeiten der string-Klasse von C++ anzusehen. Es muss ja nicht alles strikt native-C bleiben, was man so benutzt!
-
berniebutt schrieb:
Die Frage wäre ein Grund, die Möglichkeiten der string-Klasse von C++ anzusehen. Es muss ja nicht alles strikt native-C bleiben, was man so benutzt!
C forum
-
hazZ22121 schrieb:
er überspringt jedoch das fgets jedes mal und ich kann den satz nich eingeben. wieso das?
Der Code sieht OK aus, aber besser noch bei malloc +2 spendieren, für '\0' und '\n'.
fgets "übergeht" nichts, evtl. schließt dein Konsolenfenster beim Testlauf am Programmende automatisch und du glaubst, fgets "übergeht" hier was.
-
hazZ22121 schrieb:
er überspringt jedoch das fgets jedes mal und ich kann den satz nich eingeben. wieso das?
Swordfish schrieb:
[...]
.
-
sizeof(*satz)
muss meiner Meinung
sizeof(char)
heißen.
char *satz
ist ein unvollständiger Datentyp, d. h., seine Länge ist undefiniert.satz
ist ein undefinierter Zeiger der prozessorabhängigen Länge.Das
malloc
muss mindestens mitsizeof(char)*length+1
aufgerufen werden. In einer ASCII-Umgebung kannsizeof(char)
entfallen, da es 1 ist.Stimmt es wirklich, dass
scanf
die Zeilenschaltung in einem String mit abspeichert? Ich dachte immer, es entfernt die Zeilenschaltung aus dem Eingabestrom und schreibt stattdessen ein Abschlusszeichen '\0' in den Empfangspuffer. Dabei überfährt es durchaus locker den tatsächlichen Puffer, wenn man nicht das sicherescanf_s
benutzt.Ist der Empfänger eine Zahl und die Eingabe fehlerhaft, dann werden alle numerischen Zeichen entfernt, während das falsche und alle folgenden Zeichen im Eingabestrom verbleiben.
-
Waldschrat schrieb:
sizeof(*satz)
muss meiner Meinung
sizeof(char)
heißen.
Ist völlig gleich. Wenn der Operand von sizeof ein Ausdruck ist, wird er nicht ausgewertet.
Waldschrat schrieb:
char *satz
ist ein unvollständiger Datentyp, d. h., seine Länge ist undefiniert.Falsch. Die Größe des Zeigers steht zur Compilezeit fest.
Waldschrat schrieb:
satz
ist ein undefinierter Zeiger der prozessorabhängigen Länge.Für sizeof ist nur der Typ des Operanden interessant.
Waldschrat schrieb:
In einer ASCII-Umgebung kann
sizeof(char)
entfallen, da es 1 ist.sizeof(char) ist immer 1. Was bitte ist eine "ASCII-Umgebung"?