PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Text-Eingabe mit scanf



faert89
29.09.2009, 08:48
Hallo,

bin gerade dabei, die Programmiersprache C zu lernen. Bin noch Anfänger, deswegen wäre ich für eure Tipps dankbar ;-)

Habe folgendes Problem: Ich weiß, wie man mit scanf() eingegebene Zahlen mit printf wieder ausgeben kann (int als "zahl" definieren und bei der Ausgabe %d). Das gleiche würde ich nun gerne mit Text machen, also z.B. einem Namen. Leider funktioniert es bei mir nicht, wenn ich es über einen string versuche (char* als "name" definieren und bei der Ausgabe mit %s).

Was mache ich falsch? Hier mein Code:



#include <stdio.h>
int main(void)
{
char* n1, n2;
int a, b;

printf("Bitte erstes Wort eingeben: ");
scanf("%s", &n1);

printf("Bitte erste Zahl eingeben: ");
scanf("%d", &a);

printf("Bitte zweite Zahl eingeben: ");
scanf("%d", &b);

printf("Bitte zweites Wort eingeben: ");
scanf("%s", &n2);

printf("\n\nDies waren Ihre beiden Zahlen:\n");
printf("%d und %d", a, b);

printf("\n\nDies waren Ihre beiden Woerter:\n");
printf("%s und %s", n1, n2);
return 0;
}


Die Eingaben klappen einwandfrei, die Ausgabe der Zahlen auch, dann stürzt meine *.exe ab und das Programm wird automatisch beendet. Kann mir jemand weiterhelfen?

Außerdem habe ich öfter mal das Problem, dass meine CMD wieder verschwindet, wenn ich mein EXE-Programm aufgerufen habe. Habe gelesen, dass man das mit system ("PAUSE"); verhindern kann. Leider kommt bei meinem Programm (CodeBlocks) dann immer folgende Meldung: "error: `system' was not declared in this scope." Was soll das heißen? Warum wird der Befehl nicht erkannt?

Hier nochmal der ganze Code, als Beispiel an der Hello-World-Datei:


#include <stdio.h>
int main ()
{
printf("Hello, World!\n");
system ("PAUSE");
return 0;
}


Vielen Dank für Eure Hilfe.[/quote]

michl78
29.09.2009, 10:38
Du reservierst nur einen Pointer für Deine n1 und n2, nicht den eigentlichen Speicher, den die Zeichenketten brauchen.

Probier mal statt char *n1,n2,
char n1[80];
char n2[80];

Ausserdem nicht
scanf("%s", &n1);
sondern
scanf("%s", n1);


Dann darfst Du aber maximal 79 Zeichen eingeben, sonst wird irgendwo undefiniert in den Speicher geschrieben.

Zum "Pause-Problem": Du darfst das Pause nicht im C-Code schreiben.
Du könntest aber eine Batch-Datei schreiben, die zuerst Dein kompiliertes C-Programm aufruft, und danach eine Zeile mit pause.

Oder Du startest Dein Prg nicht durch doppelklick, sondern in einer DOS-Box.

sast
29.09.2009, 10:38
Um in C Strings zu speichern, musst du die einzelnen Zeichen im Speicher ablegen. Dazu muss aber vorher ein Bereich dafür reserviert werden, da sonst einfach in den Speicher geschrieben wird und dadurch andere wichtige Teile deines Speichers überschrieben werden.
Es gibt da wie so oft in C mehrere Möglichkeiten um das Problem zu lösen. Die einfachste ist, ein Array von chars anzulegen. zB char string_array[10]
Hier musst du aber darauf achten, dass Strings immer mit einem '\0' abgeschlossen (terminiert) sein müssen. Dafür muss also immer noch Platz in deinem Array sein. Dh du kannst einen String der maximalen Länge 9 in string_array schreiben. In C wird üblicherweiser nicht auf eine Bereichsüberschreitung geprüft (der Programmierer weiß ja was er will).

Zum anderen ist ein stringname wie zB string_array oder dein n1 bereits ein Pointer. Deshalb musst du auch nicht die Adresse von n1 in scanf als 2. Parameter nehmen, sondern einfach den Namen scanf("%s", string_array);

Für dein verschwinden der Eingabeaufforderung gibts einen ganz einfachen Trick. Öffne dein Programm einfach in einem Dosfenster, das du vorher geöffnet hast mit zB Start->Ausführen->cmd. Dann bleibt es danach auch da, außer dein Programm stürzt ab ;)

sast

faert89
29.09.2009, 10:55
Erstmal danke für Eure Hilfe!! :) Und dann auch noch zur gleichen Zeit, nicht schlecht!! ;-)

Habe in einem anderen Forum gesagt bekommen, dass ich anstatt scanf("%s", n1); auch einfach gets (n1); verwenden kann. - Es hat funktioniert. Aber wo ist der Unterschied zwischen "scanf" und "gets"??

Der Trick mit dem Dos-Fenster funktioniert zwar, ist aber recht unpraktisch. Habt ihr eine Ahnung, woran meine Fehlermeldung liegen könnte?

Danke schonmal. Matthias

sast
29.09.2009, 11:58
Während du mit gets einen String einlesen kannst, bietet scanf eine Vielzahl von Möglichkeiten zur Formatierung und kann auch gleich die Eingaben den Variablen in der richtigen Konvertierung zuweisen.

sast

michl78
30.09.2009, 07:04
Was mir noch eingefallen ist, zum C lernen ist das hier nicht schlecht: http://download.galileo-press.de/openbook/c_von_a_bis_z/galileocomputing_c_von_a_bis_z.zip