scanf vs gets



  • hey ich hab hier mal nen code, den ich auch soweit verstehe, aber nicht weiß, warum man scanf... nicht benutzen kann. MFG lucbossman

    #include <cstdlib>
    #include <iostream>
    
    main() {
    	char satz[80];
    	int i=0,l=0;
    	printf("\nBitte einen Satz eingeben\n>");
    	gets(satz);
    	while(satz[i]) {
    		if(satz[i++] == ' ') l++;
    	}
    	printf("\ny = %i",l);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    ALTERNATIVE:

    #include <cstdlib>
    #include <iostream>
    
    main() {
    	char satz[80];
    	int i=0,l=0;
    	printf("\nBitte einen Satz eingeben\n>");
    	scanf("%s",&satz[80]);
    	while(satz[i]) {
    		if(satz[i++] == ' ') l++;
    	}
    	printf("\ny = %i",l);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    bei dem unteren code geht das irgendwie nicht, nen fehler zeigt er net an... 😢



  • Also irgendwie geht das schon. Ansonsten vielleicht mal hier

    http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

    nachlesen?

    Edit:
    scanf("%s",&satz[80]);
    geht natürlich nicht, sorry. Wenn schon, dann:
    scanf("%s",satz);



  • Ein Satz hat i.A auch Leerzeichen. Und das ist ein Trennzeichen für scanf.
    Mit scanf("%s", satz) kannst du also nur Wörter einlesen.

    Wo hast du eigentlich das &satz[80] her?
    Das gibt dir die Adresse vom 81 Element vom Array satz.
    Das existiert aber nicht, da satz nur 80 Elemente hat.

    BTW. Du hast da ein C/C++ Mix.



  • In Deinem anderen Thread hast Du offensichtlich nicht alle Hinweise gelesen/verstanden:

    PrettyP schrieb:

    Deshalb

    DirkB schrieb:

    Lass mal das & und die [40] bei scanf weg.

    Vielleicht wäre ja auch eine Zeile mit

    printf ("\n%s\n", satz);
    

    aufschlussreich und würde Dir andeuten, dass die Eingabefunktion möglicherweise ab dem ersten Leerzeichen nichts mehr haben will.



  • Damit das Programm macht, was es soll, würde es helfen, wenn Du keine Syntaxfehler einbaust.

    char satz[5] = "xyz!";
    
    printf ("\n%s\n", satz); // in diesem Falle gleichbedeutend: satz == &satz[0] -> 1. char im Array satz == 'x'
    
    printf ("\n%s\n", &satz[5]); // logischerweise steht &satz[5] dann für die Adresse des 6.(!!) chars ...
    

    Vielleicht ist das deutlich.

    Ansonsten ist scanf bei Dir wohl heiß auf die Leerzeichen. Wie bei so manchem Unix-Programm üblich ist der sogenannte "Whitespace-Übergang" sozusagen der Feldseparator und da Du nur 1 Feld (1 Char array bzw 1 String) auslesen wills, meint scanf, das reicht Dir.

    Wenn Du das anders siehst, sag scanf einfach, dass Du Deine Leerzeichen selbst behalten willst:

    scanf (" %s", satz);
    

    `man scanf` unter linux:
    Matches a sequence of characters whose length is specified by
    the maximum field width (default 1); the next pointer must be a
    pointer to char, and there must be enough room for all the char‐
    acters (no terminating null byte is added). The usual skip of
    leading white space is suppressed. To skip white space first,
    use an explicit space in the format.


Log in to reply