Stellen herausfinden bei initialisierte chars in einem Array



  • und was für einen wert hast du eingegeben?



  • Ach nein ich wollte ein char eingeben z.B Eingabe: c Ausgabe: 2
    Also muss i ein char sein.



  • Laserstrahl schrieb:

    Achja overflow ist nur eine Variable 🙄
    Aber was ist tolower bei der if anweisung?
    Ist zum Verzweifeln, hab überhaupt keine Ahnung 😞

    Kopf hoch! 👍
    Siehe nochmal meinen ersten Post, ich habe ihn nun versucht zu dokumentieren.

    Caipi 🙂



  • Vielen Dank für deine Bemühung, aber leider hilft das bei mir auch nicht viel weiter, weil ich nur das verwenden darf was in der Vorlesung behandelt worden ist...
    Bleibt wohl nur weiterbüffeln bis ich ein Ergebnis hab.



  • Wollte mal das für ein einzelnes Zeichen versuchen, aber es stürzt sofort ab, weiss nicht wieso...

    #include <iostream.h> 
    
    int main() 
    { 
    
        char n, eingabe[52], ausgabe[52]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; 
        int i,j;
    
    		cin>>eingabe;
    		ausgabe[i]=char(int(eingabe[i])+1);
    
    		cout<<ausgabe[i];
    
    return 0; 
    }
    

    z.B. ich tippe einen Buchstaben 'a' ein und es wird 'b' ausgegeben, geht aber nicht *heul*



  • @Laserstrahl
    Probiers mal so...
    (Wobei wenn du 'z' eingibst '{' ausgegeben wird, da der Ascii-Wert von 'z' + 1 == dem Ascii-Wert von '{')

    #include <iostream>
    using namespace std;
    
    int main()
    {   
            char eingabe, ausgabe; 
    
            cin >> eingabe;
            ausgabe = (int) eingabe + 1;
    
            cout << ausgabe;
    
    return 0;
    }
    

    Caipi



  • Ich versteh das nicht wieso funktioniert das ganz ohne arrays?
    Woher weiss das Programm das Alphabet? 😕



  • Das funktioniert folgendermaßen: Jedem Zeichen auf der Tastatur ist ein Zeichencode zugeordnet. AFAIK ist es hier der ASCII-Code (American Standard Code For Information Interchange). Dem Zeichen a ist der ASCII-Code 97 zugeordnet, dem b der ASCII-Code 98, c == 99, d == 100 usw.
    Dies mache ich mir nun zunutze, indem ich zu dem Zeichen-Code des eingegebenen Zeichens 1 hinzuaddiere, daher, aus a wird b, aus b wird c usw. (Aus z wird {).

    Caipi



  • Danke für die Erklärung, also hat der Tutor also auch so gemeint?
    Da brauch ich also nichts zu initialisieren oder, wenn das für einzelne Zeichen funktioniert?

    Er hat mir diesen Tipp gegeben:
    ausgabe[i]=char(int(eingabe[i])+1);

    Aber es funktioniert trotzdem nicht...
    Es kommen nur komische Symbole raus.

    #include <iostream> 
    using namespace std; 
    
    int main() 
    {   
            char eingabe[50], ausgabe[50]; 
            int i;
            cin >> eingabe; 
    
    		for(i=0; eingabe[i]<50; i++) 
    			ausgabe[i] = char(int (eingabe[i])+1); 
    
            cout << ausgabe; 
    
    return 0; 
    }
    


  • Ich habs fast geschafft, aber woher kommen jetzt die komischen Zeichen her nach der Caesar codierung?
    Kann mir das jemand erklären?
    Was ich auch nicht verstehe ist wieso funktioniert es irgendwie wenn man in der for schleife das <50 in der Schleife weglasse?

    #include <iostream> 
    using namespace std; 
    
    int main() 
    {   
            char eingabe[50], ausgabe[50]; 
            int i;
            cin >> eingabe; 
    
    		for(i=0; eingabe[i]; i++) 
    			ausgabe[i] = char(int (eingabe[i])+1); 
    
            cout << ausgabe; 
    
    return 0; 
    }
    


  • @Laserstrahl
    Du hast das Stringende-Zeichen vergessen, ohne das, werden auch die unbeschriebenen vorreservierten Bytes ausgegeben.

    #include <iostream>
    using namespace std;
    
    int main()
    {  
            char eingabe[50], ausgabe[51];
            int i;
            cin.getline(eingabe, 50, '\n'); // kannst natuerlich auch cin >> eingabe schreiben                   
                                            // cin.getline() hat aber den Vorteil, dass eine ganze Zeile eingelesen werden kann.
    
            for(i=0; eingabe[i] != '\0'; i++)
                ausgabe[i] = char(int (eingabe[i])+1);
    
            ausgabe[i] = '\0'; // Stringende-Zeichen zuweisen.
            cout << ausgabe;
    
    return 0;
    }
    


  • Danke nochmal, du warst echt eine grosse Hilfe für mich! 🙂

    Ich hätte noch eine Frage, das '\0' bewirkt in der Schleife das Stringende, also sobald das Ende der Eingabe erreicht wird.

    Aber wieso muss ich wieder '\0' an ausgabe[i] zuweisen?
    Wenn ich das weglasse wird gar nichts ausgegeben.



  • AFAIK wird, wenn du einem char-Array arr 50 Byte Speicher zuweist, danach z.B. nur 12 Byte Speicher mit Werten (Zeichen) belegst und dann cout << arr; schreibst, der gesammte String ausgegeben und somit auch die von dir nicht belegten Bytes. (Das führt zu den komischen Zeichen am Ende).
    Wenn du aber z.B. ausgabe[12], also dem 13 Byte das Stringende-Zeichen zuweist und dann cout << arr; schreibst, wird das Array nur bis zum Stringende-Zeichen ausgegeben.

    P.S.: Vielleicht fragst du dich, warum z.B. in deinem Array eingabe komische Zeichen stehen (Außer an den Stellen denen du einen Wert zugewiesen hast). Dies liegt daran, dass lokal definierte Variablen - soweit du das nicht änderst - mit gar nichts (und somit mit irgend etwas) initialisiert werden.

    Caipi


Anmelden zum Antworten