while-Schleife mit einem Character (j,n) steuern



  • Hallo,

    ich versuche mittels einer Ja/Nein Abfrage die while-Schleife erneut zu durchlaufen, bzw. diese zu beenden. Wie man am Code sieht, habe ich schon alles mögliche versucht - und es leider nicht geschafft.

    Problem (1/999) 🙂
    Nach der ersten Abfrage, die auch korrekt funktioniert, wird nach Eingabe von einem j die while-Schleife wie gewünscht erneut durchlaufen. Jedoch wird nun die Abfrage nach dem Namen ignoriert und gleich im Anschluß daran die Telefonnummer angefragt.

    Kann mir da bitte jemand weiterhelfen?

    #include<stdio.h>
    
    char name[30];
    FILE *datei;
    
    void anlegen(void){
        datei = fopen("TELEFON","w");
        if(!datei){
            printf("Datei konnte nicht angelegt werden!");
        }else{
            fclose(datei);
    	}
    }
    
    void eintragen(void){
    	char name[31];
    	int c=106, telefonnummer;
        //int telefonnummer;
    	datei = fopen("TELEFON","a");
    	if(!datei){
    		printf("Datei konnte nicht geoeffnet werden.");
    	}else{
    		//while(*c == 'j'){
            while(c == 106){ // 106 = 'j'
    			printf("Vor- und Nachnamen eingeben: ");
    			gets(name);
    			//fgets(name,31,stdin);
    			//size_t p=strlen(name);
                /* '\n' mit '\0' überschreiben */
                //name[p-1]='\0';
    			printf("Telefonnummer eingeben: ");
    			scanf("%30i",&telefonnummer);
    			fprintf(datei,"%s\t%i",name, telefonnummer);
    			printf("Weiteren Datensatz erfassen? Nein=0, Ja= beliebige Taste\n\n");
    			//c = getchar();	
    			//printf("Ausgabe von c: %i\n\n",c);
    			//scanf("%s",c); // Wenn ein Zahlenwert geprüft werden soll...
    			//gets(c);
    			scanf("%i",&c);
    			printf("%i",c);
    
    		}
    	}				       
    }
    
    int main(void){
    
    	anlegen();
    	eintragen();
    	getchar();
    	return 0;
    
    }
    


  • - fclose vergessen
    - statt des laienhaftes gets besser scanf("%29[^\n]"...)
    - Feldlänge für int bei scanf ist ziemlich sinnlos
    - do-while ist hier besser als while
    - "while(c == 106){ // 106 = 'j'" -> warum nicht while(c == 'j'), so wie du es selbst kommentiert hast und somit sollte c vom Typ char sein und erfordert dann "%c"
    - nach jedem scanf: stdin leeren, und zwar komplett z.B. mit while(!ferror(stdin)&&!feof(stdin)&&getchar()!='\n');
    das spart dann auch dein hässliches getchar() in main



  • ... und: Eine Telephonnummer ist kein Integer!!!
    ... und: Warum globale Variablen? Benutze Parameter und Rückgabewerte!


Log in to reply