String einlesen ??? funktioniert nicht



  • Hallo ich versuche ein kleines Programm zu schreiben mit dem man mehrere deutsche Sätze lernt jedoch ließt er den string nicht ein. Danach würde ich den eingeebnet string gerne mit einem anderen vergleichen. Es wird einfach übersprungen daher habe ich noch nicht weiter gemacht.

    [code="c"]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(int argc, const char * argv[]) {

    char satz1[100]={"Hallo wie geht es dir"};
    char satz1neu[30];
    int repeat;
    int i,input;

    printf("This is a programm to learn the first German sentences \n");
    printf("Please pay attention to small and capital letters \n");

    printf("The first sentence is\n");
    printf("Hello how are you doing ? \n");
    puts(satz1);

    printf("Could you repeat the sentence? \n Press 1 for Yes and 2 for No: \n ");
    scanf("%d",&repeat);

    if(repeat<2)
    {
    printf("Okay please enter the complete sentence: \n");

    for (i = 0; i < 30; i++)
    {
    input = getchar();
    if (input == '\n')
    {
    satz1neu[i] = '\0';
    break;
    }
    satz1neu[i] = input;
    }

    //oder ich hatte auch fgets(satzneu,30,stdin); funktionierte auch nicht

    if((strcmp(satz1,satz1neu))==0)
    {
    printf("Perfect!!!\n");
    }

    }

    Vielen Dank Leute


  • Mod

    Warum liest du von Hand zeichenweise ein, wenn du doch einen ganzen Satz lesen willst? Du machst dabei prompt den Fehler, anzunehmen, dass nach der zuvor eingelesenen Zahl kein newline steht. Dabei ist das doch sogar das zu erwartende Trennzeichen! Daher bricht deine Leseschleife sofort ab, da sie als erstes Zeichen nämlich gleich ein solche newline vorfindet. Gleiches passiert beim fgets, welches ebenfalls sofort abbricht, da es als allererstes gleich auf ein newline trifft.

    Ersetze die ganze Leseschleife durch scanf(" %29[^\n]", satz1neu); ! Beachte auch das führende Leerzeichen im Formatstring! Dieses extrahiert sämtlichen eventuell im Eingabestream vorhandenen Whitespace, bevor die eigentliche Zeichenkette extrahiert wird. Theoretisch hätte man auch zuvor beim Einlesen der Zahl ein Leerzeichen im Formatstring folgen lassen können (dann würden auch deine eigene Leseschleife oder fgets funktionieren), aber so herum ist es robuster, weil das Verhalten der Leseaktion nicht davon abhängt, was vorher irgendwo im Programmablauf geschehen ist.

    Nebenbemerkung: Wie du an deinem Beitrag siehst, ist es gerade als unregistrierter Forenutzer wichtig, die Vorschau für deine Beiträge zu benutzen, damit du eventuelle Fehler in der Formatierung deines Beitrags sofort erkennen kannst. Wenn du dich registrierst, hättest du auch die Möglichkeit, deine Beiträge im Nachhinein zu korrigieren.

    PS:

    char satz1[100]={"Hallo wie geht es dir"};
    

    Besser:

    const char *satz1 = "Hallo wie geht es dir";
    

    Vorausgesetzt, du möchtest den Satz nicht bearbeiten, was ich vom Kontext her mal annehme. Weiterhin ist der Compiler auch in der Lage, selber die Anzahl der Elemente in einem Array zu zählen:

    char satz1[]="Hallo wie geht es dir";
    


  • Top danke!!!

    weißt du auch wie ich die main funktion nun als unterfunktion deklarieren kann.

    Sodass ich nicht alles in die Main Funktion kopieren muss.

    Da ich jetzt eig nur noch die Sätze tausche.

    [code="c"]



  • oh hier mein Code. Mit int funktion2() wollte ich die unterfunktion dann aufrufen, die das selbe beinhaltet nur andere Sätze
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int funktion2();
    int main(int argc, const char * argv[]) {

    const char *satz1 = "Hallo wie geht es dir";
    char satz1neu[30];
    int repeat,k,a,b,abfrage;

    printf("This is a programm to learn the some German sentences \n\n");
    printf("Please pay attention to small and capital letters \n\n");

    printf("The first sentence is\n\n");

    printf("Hello how are you doing ? \n\n");
    printf("On German: ");
    puts(satz1);
    printf("\n");

    for(a=0;a<b;a++)
    {
    b=1;

    printf("Could you repeat the sentence? \nPress 1 for Yes and 2 for No: \n ");
    scanf("%d",&repeat);
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

    if(repeat<2)
    {
    printf("Okay please enter the complete sentence: \n");

    scanf(" %29[^\n]", satz1neu);

    if((strcmp(satz1,satz1neu))==0)
    {

    printf("Perfect!!!\n");
    }

    else
    {
    while(k!=1)
    {
    printf("That is wrong.\n");
    printf("Try it again!\n\n");

    scanf(" %29[^\n]", satz1neu);

    if((strcmp(satz1,satz1neu))==0)
    {
    printf("Perfect!!!\n");

    k=1;
    }
    }
    }

    }

    else

    {
    printf("The sentence is: ");
    puts(satz1);

    }

    printf("Press 1 to repeat the sentence and 2 to try the next sentence: \n");
    scanf("%d",&abfrage);

    if(abfrage==2)
    {
    a++;
    }

    b++;

    }

    int funktion2();

    return 0;
    }


Anmelden zum Antworten