cin wird übersprungen

Dieses Thema im Forum "C/C++" wurde erstellt von foexle, 14.01.2008.

  1. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    Sers leute ich bin hier fast am verzeifeln
    Code:
    const int LAENGE=200;
    
    
            char* kette;
            char puffer[LAENGE];
                     cout << "Bitte Zeichenkette angeben :" <<endl;
            	 cin.getline(puffer, LAENGE);
            	 
            	 kette = new char[strlen(puffer)+1];
            	 strncpy(kette, puffer, strlen(puffer)+1);        
                    
                    cout << "Bitte das zu suchende Zeichen angeben: ";
                    cin >> zeichen;  
    
    der überspringt einfach das cin.getline ... hab natürlich dann die länge 0 wenn ich den speicher allokieren will

    aber wiso zur hölle überspringt der das? °°
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 14.01.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    hi,

    ich glaube dass du auch mit dem restlichen code rausruecken musst, ich kann naemlich auch keinen Fehler finden, und bei mir macht es auch das was es soll. Dass das noch nicht alles ist schliesse ich mal aus den komischen Einrueckungen ;)

    Hast du selber mal versucht den code den du gepostet hast in ein eigenes Programm zu stecken, und geguckt ob es funktioniert? ;)

    mfg,
    bytepool
     
  4. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    also das komische an der geschichte ist nicht nur ich bin am rätseln ;)

    aber ich poste mal den gesamten code ... das ist ja sowiso nur ein kleines bsp proggi

    Code:
    #include <iostream>
    #include "suche.cpp"
    
    
    
    using namespace std;
    
    
    const int LAENGE=20;
    
    
    
    
    int main(){
    	//variablen deklaration
            char* kette = new char[LAENGE];
            int auswahl = 0;
            char* wort;
            char zeichen;
            char tmp;
            char * puffer;
    
            cout << "Was wollen sie ?\n 1 = nach Char suchen \n 2 = nach String suchen \n 3 = Strings vergleichen"
    << endl ;
            cin >> auswahl;
    
           
    
            
    
    
    
            if (auswahl == 1){ //Zeichen Suchen in der Zeichenkette
            	
            	 //einlesen der Zeichenkette und allokieren des Rams
            	 cout << "Bitte Zeichenkette angeben :" ;
            	 cin >> kette;
            	 
    
                 cout << "Bitte das zu suchende Zeichen angeben: ";
                 cin >> zeichen;        	 
            	 
            	 
            	 tmp = searchChar(kette,zeichen);
    
            	 printf("%i",tmp);
                    
                  
            } 
            else if(auswahl==2){//Substring in Zeichenkette suchen
            	//einlesen der Zeichenkette und allokieren des Rams
            	cout << "Bitte Zeichenkette angeben :" ;
            	cin >> kette;
           		
            	//Einlesen der 2. Zeichenkette und allokieren des Speichers
                cout <<"Bitte zu suchenden String eingeben: ";
                cin >> puffer;
                wort = new char[strlen(puffer)+1];
                strncpy(wort,puffer,strlen(puffer)+1);
                    
                tmp = searchString(kette, wort);  
                
                printf("%i",tmp);
                    
             }
             else if(auswahl==3){//2 Strings vergleichen
           
            	 //einlesen der Zeichenkette und allokieren des Rams
             	cout << "Bitte Zeichenkette angeben :" ;
             	cin.getline(kette,LAENGE);
          	
             	
             	//Einlesen der 2. Zeichenkette und allokieren des Speichers
                cout <<"Bitte zu suchenden String eingeben: ";
                cin >> puffer;
                wort = new char[strlen(puffer)+1];
                strncpy(wort,puffer,strlen(puffer)+1);
                
                tmp = compateString(kette,wort);
                printf("%i",tmp);
            	 
    
                    
    
             }
    
    
    
    
    }
    
    
    
    bei auswahl 3 überspringt der jegliche eingabe ... wenn ich cin.getline weg mache gehts ....
    aber ich brauch cin.getline :>

    mfg
     
  5. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    1. Dein Code kompiliert nicht, da Du 'suche.cpp' nicht mitgeliefert hast.
    2. Es ist ungewoehnlich, eine cpp-Datei miteinzuschliessen
    3. Was sagt denn gdb an dieser Stelle? Kannst Du das Ergebnis von getline ausgeben, ebenso den Rueckgabewert? Vielleicht ist noch ein Zeichen im stdin-Puffer, den getline einliest.
     
  6. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    huhu doch kompeliert wunderbar :) das proggi funzt auch bis auf menüpunkt 3 in der cin ist ...
    nein der debugger sagt mir ga nix, da der die stelle auch einfach überspringt.
    einen ausgabe wert bekomme ich nicht, weil ich nicht die möglichkeit bekomme etwas einzugeben.

    Und ja es ist ungewöhnliche eine sourcefile einzubinden, das sollte aber nur zur übersichtlichkeit dienen :)

    einen rückgabe wert bekomme ich keinen, da ich keinen wert der function übergeben kann, da ich keine möglichkeit habe auf die standart-eingabe zu gelangen, weil er das alles überspringt so lange ich cin.getline benutze :)
     
  7. #6 bytepool, 15.01.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    hi,

    dass du das kompilieren kannst ist klar, aber wir koennen das nicht. Und solange der Fehler nicht reproduzierbar ist, ist das hier irgendwie brotlose Kunst, jedenfalls in so einem Fall wo kein offensichtlicher Fehler erkennbar ist.

    mfg,
    bytepool
     
  8. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    Code:
    #include <iostream>
    #include <cstring>
    
    
    
    int searchString(const char* kette, char* kette2){
            int posi=-1;
            char * tmp = kette2;
            do{
            	if(*kette==*kette2){
            		posi=0;
            	}
            	else if(*kette!=*kette2){
            		posi = -1;
            	}
            	if (*kette2!=true){
            		return posi;
            	}
            	else if (posi == 0){
            		*kette2++;
            	}
            	else if (posi== -1 && kette2!=tmp){
            		*kette--;
            	}
            	
            	
            }while(*++kette);
            
            return posi;
    }
    
    int compateString(const char* string1,const char* string2){
    		int ackn = 0;
    		do{
    			if(*string1 == ' '){
    				while(*string1==' '){
    					*string1++;
    				}
    			}
    			if(*string2==' '){
    				while(*string2== ' '){
    					*string2++;
    				}
    			}
    			if(*string1!= *string2){
    				ackn=-1;
    			}
    			else if(*string1 == *string2){
    				*string2++;
    			}
    		}while(*++string1);
    	return ackn;
    }
    
    int searchChar(char* kette, char zeichen){
            char* posi = kette;
            int zaehler=0;
    
            do //mit index 0 anfangen
            {
              if (*posi==zeichen){
               return zaehler;
              }
              ++zaehler;
            } while (*++posi); //inkrementieren und überprüfen in einem
            return -1; //not-found
           
    }
    
    dann mal hier die andere cpp :>

    und ich weis das da noch ein fehler drin ist

    Code:
    if (*kette2!=true){
    
    das das hier nicht geht weis ich ... aber mir ist noch nix anderes eingefallen :>

    und bitte keine kommentare wiso ich das so umständlich mit pointern mache wofür es ne menge sehr gute und schnell functions gibt :) das weis ich ... aber ich muss das so machen
     
  9. #8 Mµ*e^13.5_?¿, 15.01.2008
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Man sollte sich schon etwas mehr um Eingaben kümmern.
    Du schreibst einfach "cin >> auswahl;" und hoffst, dass es so klappt .. aber wie soll sich das Programm beispielsweise verhalten, wenn keine Zahl eingegeben wird?

    Naja, wie auch immer, einmal
    Code:
    cin.ignore(INT_MAX, '\n');
    vor dem getline() sollte helfen.
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Das Problem scheint das "cin >> puffer;" zu sein. puffer ist ein nichtinitialisierter Speicher, also produziert diese Zeile einen Zugriffsfehler.
     
  12. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    zur vollständigkeit...

    das cin.ignore hat geholfen ... anscheinend ist das return auch noch auf dem stream

    danke und mfg
     
Thema:

cin wird übersprungen

Die Seite wird geladen...

cin wird übersprungen - Ähnliche Themen

  1. Grub wird nach "suspend to Disk" übersprungen

    Grub wird nach "suspend to Disk" übersprungen: Hallo, ich hab jetzt Suse 10.1 auf meinem System. Um das Ding schneller AN bzw AUS machen zu können, verwende ich "Suspend to Disk". Klappt auch...
  2. PATH wird nicht richtig durchsucht

    PATH wird nicht richtig durchsucht: Hi zusammen, ich nutze das Forum schon seit längerem , allerdings hat mir bis jetzt immer die Suchfunktion weitergeholfen. Bei meinem aktuellen...
  3. Suse: Tomas Di Giacomo wird neuer CTO

    Suse: Tomas Di Giacomo wird neuer CTO: Suse hat seinen Vorstand um Dr. Tomas Di Giacomo erweitert, der als Chief Technology Officer ab sofort dem Unternehmen angehört. In der neu...
  4. Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht

    Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht: Die Bildungs-Distribution Edubuntu, die zum offiziellen Ubuntu-Veröffentlichungszyklus zählt, wird im April keine neue Version herausgeben. Die...
  5. Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht

    Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht: Die Bildungs-Distribution Edubuntu, die zum offiziellen Ubuntu-Veröffentlichungszyklus zählt, wird im April keine neue Version herausgeben. Die...