Probleme mit getchar!



  • Hallo, folgendes Problem bei folgenden Code:
    1. Wenn ich 1,2 oder 3 eingebe wird kein elseif Ausgewählt warum?
    2. Und falls ein elseif ausgewählt wird mache ich das richtig mit den einlesen von mehreren Zeichen?

    Ich hoffe Ihr könnt mir weiterhelfen!
    Danke in voraus!

    mfg pid

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
    	char sign;
    	char string[80];
    	int value = 0;
    	int i =0;
    
    	while(1)
    	{
    	printf("Eingabe: \n");
    	value = getchar();
    
    	if(value== 1)
    	{
    	    i=0;
                printf("Eingabe bei 1: \n");
    	    do {
    	      sign = getchar();
    	      ort[i] = sign;
    	      i++;
    	    } while (sign != '\n');
    		ort[i]= '\0';
    	    printf("Es wurde %s eingegeben in 1", ort);
    	}
    	else if(value== 2)
    	{
                i=0;
    	    printf("Eingabe bei 2: \n");
    	    do {
    	      sign = getchar();
    	      ort[i] = sign;
    	      i++;
    	    } while (sign != '\n');
    		ort[i]= '\0';
    	    printf("Es wurde %s eingegeben in 2", ort);
    	}
    	else if(value== 3)
    	{
                i=0;
    	    printf("Eingabe bei 3: \n");
    	    do {
    	      sign = getchar();
    	      ort[i] = sign;
    	      i++;
    	    } while (sign != '\n');
    		ort[i]= '\0';
    	    printf("Es wurde %s eingegeben in 3", ort);
    	}
    }
    
    	return EXIT_SUCCESS;
    }
    


  • Vielleicht liegt das daran, dass du einen char einließt ihn in einen int konvertierst und somit '2' nicht 2 ist sondern dem Wert der ASCII entspricht!!!



  • Punkt 2. fgets würde auch reichen!

    fgets(ort ,max_count ,stdin);



  • Nur mal so, ohne Fragestellung bzw. Problem angesehen zu haben:

    Meiner als gering einzuschätzenden Erfahrung nach riskierst Du mit 2 im Verlauf aufeinander folgenden getchar()-Aufrufen, dass der zweite getchar() das im Buffer befindliche CR bzw. Newline frisst...

    Eine wahrscheinlich nicht besonders galante aber zumeist gut funktionierende Lösungsmöglichkeit (für den Fall, dass die Eingabetaste ein '\n' erzeugt!!) könnte folgendes Schnipselchen sein:

    void _pbc() 
    {   
       setvbuf (stdin, NULL, _IONBF, 0); 
       setvbuf (stdin, NULL, _IOFBF, BUFSIZ); 
    }
    
    int _pgets (char *inp, int lim)
    {
       int i = 0;
       char input;
       _pbc();
       while ( (input = getchar()) != '\n' && i < lim )
       {
          inp[i] = input;
          i++;
       }
       inp[i] = 0;
       _pbc();
       return i;
    }
    

    auf fflush() solltest Du in diesem Zusammenhang nicht vertrauen und ich hatte noch keinen Fall, in dem es auf diese Art nicht zu meiner Zufriedenheit funktioniert hätte.



  • Achja, ganz abgesehen von der int != (int) char Problematik.

    In vielen Fällen entsprich eine auf der Tastatur eingegebene '8' dem char '8'.
    Als Integer ausgedrückt hast Du laut üblicher ASCII-Tabelle mit einer 56 zu rechnen (0 == 48; 48 + 8 == 56).
    Entweder - dazu würde man Dir wohl hier raten - fragst Du nicht ab, ob der value 1 / 2 / 3 entspricht, sondern ob er '1' / '2' / '3' entspricht oder Du verwendest eine Funktion, die die Umrechnung für Dich übernimmt, oder Du rechnest einfach selbst um.

    char eingabe = '\0';
    int value = 0;
    
    //nach entsprechendem getchar() ...
    value = eingabe - 48;
    
    //Dann kannst Du mit value arbeiten wie erwartet.
    


  • Wenn dann schon

    value = eingabe - '0'; // Ist doch egal ob '0' == 48 ist
    


  • also dirks lösung ist sogar portabel falls du was anderes als ascii verwendest =b



  • void _pbc() 
    {   
       setvbuf (stdin, NULL, _IONBF, 0); 
       setvbuf (stdin, NULL, _IOFBF, BUFSIZ); 
    }
    

    Undefiniertes Verhalten, da der Standard vorschreibt, dass diese Verwendung direkt vor jeder anderen FILE Operation zu geschehen hat, was impliziert, dass setvbuf nur bei einmaligem Gebrauch definiertes Verhalten garantiert.
    Aussagen wie "hat bei mir bisher immer funktioniert" sind prinzipiell und auch für diesen Fall gelinde gesagt wenig hilfreich.



  • Mir gefällt der Code überhaupt nicht und kann ihn in C schwer nallvollziehen.
    Die while-Schleife mit while(1) sieht stark nach einer Endlosscheife aus. Sage erst einmal, was du überhaupt mit welchen Eingaben zu sehen bekommst.


Anmelden zum Antworten