scanf problem und andere möglichkeit



  • Morgääähn...

    Ich habe da mal eine Frage zu scanf();

    und zwar setze ich scanf ein um eine eingabe in eine Variable zu speichern ... klar soweit... ist die Eingabe jedoch so: Herr der Ringe wird nur Herr berücksichtigt... doof nicht wahr?

    Ich habe mal einen Zeilenrechner geschrieben wo ich mit verschiedenen selbstgestrickten Parametern gearbeitet habe dort habe ich ein 2D-Array genutzt.

    -Meine Frage ist ob ich wieder so Fuckelig mit einem 2D Array arbeiten muss um in meine kleine Bibliothek Büchereingaben zu speichern die Leerzeichen enthalten oder gibt es einen anderen Weg? Wenn ja welchen?

    Gruß und Danke



  • gets?



  • Ein wenig code wäre nicht schlecht!



  • oneill5000 schrieb:

    Ein wenig code wäre nicht schlecht!

    JO Ok:

    for(i=0; i<10; i++)
    	{
    		if (neuesbuch[i].name[0] == '\0')
    		{
    			printf("Bitte Buchnummer angeben:\n");//Buchnummer
    			scanf("%d",&neuesbuch[i].buchnummer);
    
    			printf("Bitte Buchnamen eingeben:\n");//Buchname
    			gets(neuesbuch[i].name);
    
    			printf("Bitte Buchautor angeben:\n");//Buchautor
    			scanf("%s",neuesbuch[i].autor);
    

    also ich hatte davor schon gets in nutzung... ich weiß nur leider nicht mehr warum ich auf scanf gegangen bin... jedenfals habe ich jetzt mal bei Buchautor scanf gelassen und bei Buchname gets (Wie ihr sehen könnt) und den Buchnamen lässt er mich nicht eingeben ...

    soviel dazu



  • Minimal-Beispiel:

    int main (){ 
    	char name[128];
    	printf("Bitte Buchnamen eingeben:\n");
    	gets(name);
    	getchar();
    }
    

    Eingabe: "hallo welt"

    => name enthält: "hallo welt"

    Funktionert also schon.

    und den Buchnamen lässt er mich nicht eingeben ...

    Was heißt das genau?



  • also:

    printf("Bitte Buchnamen eingeben:\n");//Buchname
    			gets(neuesbuch[i].name);
    

    geht bei mir nicht... neuesbuch[i].name ist wie ihr sicher wisst teil einer Struktur und char buch::name[64] nur so nebenbei...

    printf("Bitte Buchautor angeben:\n");//Buchautor
    			scanf("%s",neuesbuch[i].autor);
    

    geht... also er lässt mich etwas eingeben.

    total komisch



  • Virokams schrieb:

    printf("Bitte Buchnamen eingeben:\n");//Buchname
    			gets(neuesbuch[i].name);
    

    geht bei mir nicht...

    Ja aber was genau heißt "geht nicht"?? Lässt er dich keine Eingabe machen? Wird die Eingabe nicht gespeichert? Oder nur teilweise? Oder wie oder was?

    "Geht nicht" ist keine Fehlerbeschreibung...



  • "Geht nicht" habe ich geschrieben weil ich in meiner 1. Antwort geschrieben habe das geht nicht = lässt mich keine Eingabe machen.

    also ich kann den Buchnamen nicht eingeben demnach springt er zu punkt 3 da steht scanf bei Buchautor dort kann ich eine eingabe machen... der Buchname bleibt also leer...

    Allgemein gesagt wenn ich gets nutze lässt er mich keine Eingabe tätigen 😉

    sry wenn es undeutlich rüber kam nicht streiten bitte



  • Virokams schrieb:

    "Geht nicht" habe ich geschrieben weil ich in meiner 1. Antwort geschrieben habe das geht nicht = lässt mich keine Eingabe machen.

    Ok, hab ich wohl übersehen.

    Könnte das so eine Geschichte sein, bei der du zwischendurch mal den Eingabepuffer leeren musst? Vielleicht holt gets noch Reste aus dem Puffer, so dass eine Usereingabe quasi unnötig ist. Probier das vielleicht mal.

    Virokams schrieb:

    sry wenn es undeutlich rüber kam nicht streiten bitte

    Ach, wir streiten doch nicht. 🙂



  • ähm wie leere ich denn den EIngabebuffer? 😕 ^^

    also ich habe die Buchnamen Eingabe mal ganz an erste Stelle geschoben und trotzdem lässt der Compiler mich keine EIngabe tätigen... erst dann wieder bei scanf()...



  • Zum Beispiel so:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-202625-and-highlight-is-eingabepuffer+leeren.html

    Aber wenn das die erste Eingabe ist, wird das wohl kaum das Problem sein. Zeig bitte mal den ganzen relevanten Code (mit Deklaration deines struct usw.).



  • Meine Structs:

    #pragma once
    
    #include <stdio.h>
    #include <tchar.h>
    #include "stdafx.h"
    
    struct verleih;
    
    struct buch{
    int buchnummer;
    char name[64];
    char autor[64];
    verleih *letzteAusleihe;
    //...
    };
    
    struct kunde{
    int kundennummer;
    char name[64];
    //...
    };
    
    struct verleih{
    buch *vbuch[10];
    kunde *vkunde;
    //...
    };
    

    Der Casebefehl:

    printf("1 Buecher anzeigen\n2 Buch anlegen\n3 Kunden anzeigen\n4 Kunde anlegen\n5 verleih Historie\n6 verleihen\n7 Quit\n"); 
    		scanf("%d",&auswahl);
    
    		switch(auswahl)
    		{
    			case 1: buch_anzeigen();
    			break;
    
    			case 2: buch_anlegen();
    			break;
    //...
    

    durch einen Case befehl wird dann buch_anlegen aufgerufen:

    void buch_anlegen() 
    {
    	int i;
    	int z = 0;
    	char *buch[1024] = { 0 };
    	char *autor = { 0 };
    	char *artikel[10] = { 0 };		
    
    	for(i=0; i<10; i++)
    	{
    		if (neuesbuch[i].name[0] == '\0')
    		{
    			printf("Bitte Buchnamen eingeben:\n");//Buchname
    			gets(neuesbuch[i].name);
    
    			printf("Bitte Buchnummer angeben:\n");//Buchnummer
    			scanf("%d",&neuesbuch[i].buchnummer);
    
    			printf("Bitte Buchautor angeben:\n");//Buchautor
    			scanf("%s",neuesbuch[i].autor);
    
    			for(int j=0; j<i; j++)
    			{
    				if(neuesbuch[i].buchnummer = neuesbuch[j].buchnummer)
    				{
    					printf("Die Buchnummer ist schon in verwendung. ");
    					neuesbuch[i].autor[j] = '\0';
    					neuesbuch[i].name[j] = '\0';
    					neuesbuch[i].buchnummer = '\0';
    					z=1;
    					break;
    				}
    			}
    			if(z>0)
    			{
    				printf("Es wurde kein Buch hinzugefuegt!\n");
    				break;
    			}
    			else
    			{
    				printf("BNr:%d Name:'%s' von '%s' wurde angelegt!\n",neuesbuch[i].buchnummer, neuesbuch[i].name, neuesbuch[i].autor); 
    				getchar();
    				break;
    			}
    		}
    	}
    }
    

    soweit



  • Ok, ich hab's grad ausprobiert. Es liegt definitiv am Eingabepuffer. Du hast sicher vor der ersten Verwendung von gets schon mal eine Eingabe gemacht. Nimm die Funktion clearbuf aus dem Link, den ich gepostet habe, und rufe die Funktion einfach jedesmal vor gets auf. Dann sollte alles klappen. scanf wird vermutlich selbst den Puffer leeren, daher klappt es damit...



  • genial... so gehts wirklich XD

    komische Sache...

    aber das clearbuf machts!

    Danke!


Log in to reply