Problem mit ä,ö und ü



  • Hallo,
    ich habe folgendes Problem:

    Dieses Programm wertet mir a,e,i,o und u aus, jedoch nicht ä,ö und ü.

    Wie kann ich das realisieren das auch diese Buchstaben ausgewertet werden?

    gruss Michael

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <string>
    
    void fktSatzanalyse()
    {
       /* Variablendeklaration */
      char satz[2000];
      int  laenge_satz;
      int  anz_vokale = 0;
    
      /* Einlesen des Satzes */
      cout<<"Bitte geben Sie einen Satz ein: "<<endl;
      gets(satz);                                       //Einlesen des Satzes (mit Leerzeichen)
    
      /* Auslesen der Länge des Satzes */
      laenge_satz = strlen(satz);                       //auslesen der Stringlänge
      strlwr(satz);                                     //Konvertiert alle Zeichen eines Strings in Kleinbuchstaben
    
      /* Auswertung des Strings */
      for(int i=0;i < laenge_satz;i++)
      {
    
         switch(satz[i])
         {
            case 'a':
                 anz_vokale++;
                 break;
            case 'ä': 
                 anz_vokale++;
                 break;
            case 'e': 
                 anz_vokale++;
                 break;
            case 'i':
                 anz_vokale++;
                 break;
            case 'o': 
                 anz_vokale++;
                 break;              
            case 'ö': 
                 anz_vokale++;
                 break;
            case 'u': 
                 anz_vokale++;
                 break;
            case 'ü': 
                 anz_vokale++;
                 break;                    
            case 'y': 
                 anz_vokale++;
                 break;
         }        
      } 
    
      cout<<anz_vokale<<endl; 
    
    }
    
    int main()
    {
    
      fktSatzanalyse();
    
      system("PAUSE");
      return 0;
    
    }
    


  • dE_MaStEr schrieb:

    Wie kann ich das realisieren das auch diese Buchstaben ausgewertet werden?

    Bearbeite den Code mit einem Editor, der ASCII kann.



  • Ich habs mir jetzt nich durchgelesen, aber ich denke du solltest dir

    wchar_t
    

    angucken.



  • entweder unsigned char oder:

    switch(satz[i])
         { 
            case 'a': 
            case -124: //ä
            case 'e': 
            case 'i': 
            case 'o': 
            case -108: //ö
            case 'u': 
            case -127: //ü
            case 'y':
                 anz_vokale++; 
                 break; 
         }
    


  • Cpt.Tanga schrieb:

    entweder unsigned char oder:

    switch(satz[i])
         { 
            case 'a': 
            case -124: //ä
            case 'e': 
            case 'i': 
            case 'o': 
            case -108: //ö
            case 'u': 
            case -127: //ü
            case 'y':
                 anz_vokale++; 
                 break; 
         }
    

    Was ist der technische Grund warum man ein unsigned benutzen muss?



  • switch((unsigned)satz[i])
    

    switch nimmt nur ein int-argument. wenns kein int ist, gehts je nach compiler entweder garnicht, oder es wird nach int konvertiert. wenn du signed char nimmst, dann sind buchstaben mit ascii-code >127 negativ! und dann macht dir die vorzeichenbehaftet erweiterung bei dem cast auf int einen strich durch die rechnung. also erst nach unsigned casten. da findet keine vorzeichenbehaftete erweiterung statt.

    oder eben unsigned char verwenden.



  • MFK schrieb:

    dE_MaStEr schrieb:

    Wie kann ich das realisieren das auch diese Buchstaben ausgewertet werden?

    Bearbeite den Code mit einem Editor, der ASCII kann.

    ASCII kennt keine Umlaute.



  • Ok danke, ich schreib das dann so in meine Dokumentation zu der Methode

    Gruss Michael



  • DrGreenthumb schrieb:

    ASCII kennt keine Umlaute.

    Hab nie etwas anderes behauptet 😉



  • dann hat dein Tipp noch weniger Sinn gemacht :p



  • DrGreenthumb schrieb:

    dann hat dein Tipp noch weniger Sinn gemacht :p

    Wieso? Ein Editor, der ASCII benutzt, wird für die Umlaute mit hoher Wahrscheinlichkeit die passenden Codes einsetzen. Ich habe nicht geschrieben, dass der Editor nur ASCII beherrschen soll.



  • MFK schrieb:

    Ein Editor, der ASCII benutzt, wird für die Umlaute mit hoher Wahrscheinlichkeit die passenden Codes einsetzen.

    nein, das hat überhaupt gar nichts mit ASCII zu tun. Er verwendet selbstverständlich längst einen Editor mit ASCII-kompatiblen Zeichensatz. Sonst hätte er vermutlich noch ganz andere Probleme...

    Das Problem sind gerade die Zeichen, die nicht von ASCII abgedeckt werden. Da hat sein Editor nämlich einen anderen Zeichensatz als die Dos-Box von Windows.



  • DrGreenthumb schrieb:

    Das Problem sind gerade die Zeichen, die nicht von ASCII abgedeckt werden. Da hat sein Editor nämlich einen anderen Zeichensatz als die Dos-Box von Windows.

    Du hast Recht. War ein Formulierungsfehler meinerseits. Was ich meinte, war: Er soll einen Editor benutzen, der die gleichen Zeichencodierung wie seine Konsole verwendet.



  • Jetzt erkennt das Programm ä, ö, ü jedoch erkennt es keine Großbuchstaben von Ä,Ö und Ü. 😞

    Gibt es da eine Möglichkeit diese einzubinden das diese auch abgefragt werden?

    void fktSatzanalyse()
    {
       /* Variablendeklaration */
       char satz[2000];
       int  laenge_satz;
       int  anz_vokale = 0;
    
       /* Einlesen des Satzes */
       cout<<"Bitte geben Sie einen Satz ein: "<<endl;
       gets(satz);                                       //Einlesen des Satzes (mit Leerzeichen)
    
       /* Auslesen der Länge des Satzes */
       laenge_satz = strlen(satz);                       //auslesen der Stringlänge
       strlwr(satz);                                     //Konvertiert alle Zeichen eines Strings in Kleinbuchstaben
    
       /* Auswertung des Strings */
       for(int i=0;i < laenge_satz;i++)
       {
    
          switch((unsigned)satz[i])
          {
             case 'a':
                  anz_vokale++;
                  break;
             case -124:           //ä
                  anz_vokale++;
                  break;
             case 'e':
                  anz_vokale++;
                  break;
             case 'i':
                  anz_vokale++;
                  break;
             case 'o':
                  anz_vokale++;
                  break;
             case -108:          //ö
                  anz_vokale++;
                  break;
             case 'u':
                  anz_vokale++;
                  break;
             case -127:          //ü
                  anz_vokale++;
                  break;
             case 'y':
                  anz_vokale++;
                  break;
          }
       }
    
       cout<<anz_vokale<<endl;
    
    }
    




  • Hab das genze geändert, jedoch werden groß geschriebene Ä,Ö und Ü nicht erkannt. Jeodch warum nicht?

    void fktSatzanalyse()
    {
       /* Variablendeklaration */
       char satz[2000];
       int  laenge_satz;
       int  anz_vokale = 0;
    
       /* Einlesen des Satzes */
       cout<<"Bitte geben Sie einen Satz ein: "<<endl;
       gets(satz);                                       //Einlesen des Satzes (mit Leerzeichen)
    
       /* Auslesen der Länge des Satzes */
       laenge_satz = strlen(satz);                       //auslesen der Stringlänge
       strlwr(satz);                                     //Konvertiert alle Zeichen eines Strings in Kleinbuchstaben
    
       /* Auswertung des Strings */
       for(int i=0;i < laenge_satz;i++)
       {
    
          switch((unsigned)satz[i])
          {
             case 'a':
                  anz_vokale++;
                  break;
             case -124:             //ä
                  anz_vokale++;
                  break;
             case -196:             //Ä
                  anz_vokale++;
                  break;
             case 'e':
                  anz_vokale++;
                  break;
             case 'i':
                  anz_vokale++;
                  break;
             case 'o':
                  anz_vokale++;
                  break;
             case -108:              //ö
                  anz_vokale++;
                  break;
             case -214:              //Ö
                  anz_vokale++;
                  break;
             case 'u':
                  anz_vokale++;
                  break;
             case -127:              //ü
                  anz_vokale++;
                  break;
             case -220:              //Ü
                  anz_vokale++;
                  break;
             case 'y':
                  anz_vokale++;
                  break;
          }
       }
    
       cout<<anz_vokale<<endl;
    
    }
    


  • Dann wandle den satz zuerst einfach in Kleinbuchstaben um. (LowerCase in Delphi... es gibt in C++ soetwas ähnliches, fällt mir aber gerade nicht ein)



  • @dE_MaStEr: vielleicht weil es

    case 'a':
    	case 'o':
    	case 'u':
    	case -124:	//ä
    	case -108:	//ö
    	case -127:	//ü
    	case -114:	//Ä
    	case -103:	//Ö
    	case -102:	//Ü
    	case 'e': 
    	case 'i': 
    	case 'y': 
    		anz_vokale++;
    

    heissen muss?

    ps.: lass dieses

    anz_vokale++;break;
    

    hinter jedem case weg-es reicht wenn du es 1 mal am ende schreibst



  • user... schrieb:

    Dann wandle den satz zuerst einfach in Kleinbuchstaben um. (LowerCase in Delphi... es gibt in C++ soetwas ähnliches, fällt mir aber gerade nicht ein)

    Mach ich doch: strlwr(satz); //Konvertiert alle Zeichen eines Strings in Kleinbuchstaben



  • Cpt.Tanga schrieb:

    @dE_MaStEr: vielleicht weil es

    case 'a':
    	case 'o':
    	case 'u':
    	case -124:	//ä
    	case -108:	//ö
    	case -127:	//ü
    	case -114:	//Ä
    	case -103:	//Ö
    	case -102:	//Ü
    	case 'e': 
    	case 'i': 
    	case 'y': 
    		anz_vokale++;
    

    heissen muss?

    ps.: lass dieses

    anz_vokale++;break;
    

    hinter jedem case weg-es reicht wenn du es 1 mal am ende schreibst

    Danke nun gehts, hab irgendwie warum auch immer die falschen ASCI Zahlen verwendet 😞


Anmelden zum Antworten