Zwei Strings mit sscanf?



  • Hallo,

    ich habe folgendes Problem:

    Ein Benutzer gibt eine Strasse (+Hausnummer) an, es wird aber nur die Strasse gelesen, da sscanf nur einen string nimmt (Die Strasse) und den anderen nicht benutzt.

    printf("Bitte Strasse und Hausnummer eingeben: ");
    fgets(puffer,80,stdin);
    sscanf(puffer,"%s",&strasse);
    

    Eigentlich könnte ich das sscanf ja weg lassen, aber die Strasse+Hausnummer soll in eine Textdatei geschrieben werden, und wenn ich ohne sscanf arbeite schreib er das "\0" Zeichen ja auch in die Datei 😞



  • #include <cstdio>
    
    int main()
    {
    	char strasse[80];
    	printf("Bitte Strasse und Hausnummer eingeben: "); 
    	scanf("%[^\n]s", strasse); 
    
    	return 0;
    }
    

    Aber Achtung ⚠ ⚠ ⚠
    Der width Operator ist nicht ANSI-C Standard, sondern von Microsoft definiert

    Microsoft schrieb:

    ...
    To read strings not delimited by space characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. The corresponding input field is read up to the first character that does not appear in the bracketed character set. If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.

    Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.
    ...



  • Hya ! 🕶

    Pred22 schrieb:

    ...
    es wird aber nur die Strasse gelesen, da sscanf nur einen string nimmt (Die Strasse) und den anderen nicht benutzt.
    ...

    Du kannst sscanf auch Parameter für Zahlen mitgeben.

    Pred22 schrieb:

    Eigentlich könnte ich das sscanf ja weg lassen, aber die Strasse+Hausnummer soll in eine Textdatei geschrieben werden, und wenn ich ohne sscanf arbeite schreib er das "\0" Zeichen ja auch in die Datei 😞

    Das lässt sich verhindern. 😉

    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {    
    	char buf[81]="";
    	char str[81]="";
    	char abc[81]="";
    	int nr = -1;
    
    	printf("Bitte Strasse und Hausnummer eingeben: "); // Waldweg 13A
    
    	fgets( buf, 80, stdin );
    	sscanf( buf, "%s %d %s", str, &nr, abc );
    	printf( "%s %d %s", str, nr, abc );
    
    	return 0;
    }
    

    Gruß, p. 🙂



  • @Zeiger: die Formatkennung [ gehört afaik zum offiziellen Umfang von man: scanf(3) - und dahinter brauchst du kein s mehr:

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

    @pred22: Du hast doch Straße und Hausnummer schon zusammen in buf stehen - warum mußt du die jetzt noch gesondert zerlegen (besonders wenn du sie doch wieder am Stück ausgeben willst)?



  • CStoll schrieb:

    @Zeiger: die Formatkennung [ gehört afaik zum offiziellen Umfang von man: scanf(3) - und dahinter brauchst du kein s mehr:

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

    ...

    Da schau her, das wusste ich noch nicht... Dann bezieht sich der Satz aus der MSDN

    Microsoft schrieb:

    Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.

    wohl nur auf

    %[a-z] %[z-a] %[abcde...z]
    

    .

    Danke für den Hinweis 👍
    Gruß
    zeigerzeiger


Anmelden zum Antworten