-
        

Ergebnis 1 bis 6 von 6

Thema: Text-Eingabe mit scanf

  1. #1

    Text-Eingabe mit scanf

    Anzeige

    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]

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    29.08.2006
    Ort
    Marktrodach
    Alter
    51
    Beiträge
    24
    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.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    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

    雅思特史特芬
    开发及研究

  4. #4
    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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    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

    雅思特史特芬
    开发及研究

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    29.08.2006
    Ort
    Marktrodach
    Alter
    51
    Beiträge
    24
    Was mir noch eingefallen ist, zum C lernen ist das hier nicht schlecht: http://download.galileo-press.de/ope...on_a_bis_z.zip

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •