Extended ASCII und Strings



  • Ich möchte ein Sonderzeichen in dem Terminal ausgeben. Ich habe es schon rausgesucht aus der Tabelle, aber geht es überhaupt in einem String zu speichern und falls ja, wie macht man das?

    Dankeschön.


  • Mod

    Bei den meisten Systemen sollte es funktionieren, wenn du das Zeichen direkt im Quellcode nutzt. Ansonsten:
    \ooo für Zeichen Nummer ooo, wobei ooo ein oktale Zahl ist
    \xhhh für Zeichen Nummer hhh, wobei hhh eine hexadezimale Zahl ist
    Dies bezieht sich beides auf den Basiszeichensatz des Systems, was auch immer das genau heißen mag.

    Für universal character set (UCS) nach ISO/IEC 10646:
    \uNNNN für Zeichen Nummer 0000NNNN (wieder hexadezimal)
    \UNNNNNNNN für Zeichen Nummer NNNNNNNN (wieder hexadezimal)



  • Ich habe mich ungenau ausgedrückt... Wie binde ich das in den C++ Code ein, so dass ich das dann im Terminal ausgeben kann. Beim normalen ASCII ist es ja

    string word;
    	word = int(71);
    	cout<<word<<'\n';
    

    Aber wie geht das mit den Sonderzeichen?


  • Mod

    Namal schrieb:

    Beim normalen ASCII ist es ja

    string word;
    	word = int(71);
    	cout<<word<<'\n';
    

    Niemals.

    Aber wie geht das mit den Sonderzeichen?

    Siehe oben, ich habe dich schon verstanden. Google zur Not mal Escapesequenzen. Aber das wichtigste scheinst du sowieso überlesen zu haben:

    SeppJ schrieb:

    Bei den meisten Systemen sollte es funktionieren, wenn du das Zeichen direkt im Quellcode nutzt.

    Du denkst bloß viel zu kompliziert mit deinem ASCII.

    #include <iostream>
    
    int main()
    {
        std::cout << 'G' 
                  << '\x47' 
                  << '\107'
                  << static_cast<char>(71)
                  << '\u0047'
                  << '\U00000047'
                  << '\n';
    }
    


  • SeppJ schrieb:

    Niemals.

    Ok 😃

    Also für mich ist es noch verwirrend, wann ich einfache und wann doppelte Einführungsstriche benutzen soll. Also bei dem Middledot, welches ich gerne hätte, gibt es bei den einfachen diesen Fehler

    warning: overflow in implicit constant conversion [-Woverflow]
    

    Und bei den doppelten, wie es hier steht, kommt zwar kein Fehler, es werden aber dafür nur zwei Fragezeichen ausgegeben.

    Ok ja, scheint so, dass ich es bei Ubuntu vergessen kann ohne zusätzliche Installationen und einstellungen.


  • Mod

    Namal schrieb:

    warning: overflow in implicit constant conversion [-Woverflow]
    

    Du benutzt einen Datentyp, der das Zeichen nicht fassen kann. Du brauchst vermutlich einen wchar.

    Aber:

    Ok ja, scheint so, dass ich es bei Ubuntu vergessen kann ohne zusätzliche Installationen und einstellungen.

    Nimm doch unter einem Linux um himmelswillen UTF-8! Das ist da so üblich. Dann entfallen auch mit einem Schlag alle Probleme, du kannst wieder char benutzen, du brauchst keine komischen Tabellen, nichts.

    Einfach direkt in den Quelltext damit (den Editor natürlich auf UTF-8 stellen, falls er das nicht schon per Default sein sollte, dein Terminal ebenfalls):

    std::cout << "…°´ú´¼€£°’²²¹²£’£ññ²¹¹¹µßä…";
    

    Funktioniert problemlos.



  • SeppJ schrieb:

    Dann entfallen auch mit einem Schlag alle Probleme, du kannst wieder char benutzen, du brauchst keine komischen Tabellen, nichts.

    Danke. Das Problem lag an meinem Terminal und man muss das tatsächlich in doppelte Einführungszeichen setzen.


  • Mod

    Namal schrieb:

    Danke. Das Problem lag an meinem Terminal und man muss das tatsächlich in doppelte Einführungszeichen setzen.

    Lerne den Unterschied!

    'a': Das Zeichen für den ersten Buchstaben im Alphabet. Datentyp char.

    "abc": Eine Zeichenkette aus den chars 'a', 'b' und 'c' und einem Nullzeichen als Abschluss. Datentyp char[4].

    "a": Eine Zeichenkette aus dem char 'a' und einem Nullzeichen als Abschluss. Datentyp char[2].



  • Muss mal wieder was fragen und zwar: Wie kann ich überprüfen, ob in dem String ein Leerzeichen vorkommt. Ich meine:

    for(int k=0; k<st.length();++k){
    		if(st[k]==???)...
    
     }
    


  • if (s[i] == ' ')
    

    Wär jetzt so meine naive Idee.



  • cooky451 schrieb:

    if (s[i] == ' ')
    

    Wär jetzt so meine naive Idee.

    funktioniert nicht, schon ausprobiert.

    Ahja ich darf natürlich kein cin<< verwenden sondern muss getline nehmen, richtig?


  • Mod

    Für welches Problem? Was funktioniert nicht? Was hast du genau gemacht? Wieso muss ich so viele Gegenfragen stellen?

    In einem mit operator>> gelesenen string kommen naturgemäß keine Leerzeichen vor, dies sollte die gezeigte Funktion jedoch korrekt funktionierend feststellen.



  • SeppJ schrieb:

    Für welches Problem?

    Afgabe lautet: Aus einem string soll eine Integerzahl gemacht werden. Die Leerzeichen vor der ersten Zahl sollen ignoriert werden. Falls die Zahlenfolge durch eine Zahl unterbrochen wird, soll ein Fehler ausgegeben werden. Falls ein Leerzeichen die Zahlenfolge unterbricht soll der String dort abgeschnitten werden und die Zahl ist dann gültig. Es darf nur der Elemenzugrif [], die Zuweisung =, Addition usw verwendet werden. Also keine dieser vordefinierten Funktionen.



  • Namal schrieb:

    Falls die Zahlenfolge durch eine Zahl unterbrochen wird, soll ein Fehler ausgegeben werden.

    Hä?



  • cooky451 schrieb:

    Namal schrieb:

    Falls die Zahlenfolge durch eine Zahl unterbrochen wird, soll ein Fehler ausgegeben werden.

    Hä?

    Ich meinte ein Zeichen, das keine Zahl ist. In der Aufgabe steht kein Wort davon, wie die Strings an diese Funktion übergeben werden sollen, ich nehme an, sie sollen aus einem Vektor eingelesen werden.



  • Ich verstehe zwar überhaupt nicht was die Aufgabe mit deiner ursprünglichen Frage zu tun hat, aber das wirkt auf mich als solltest du atoi ohne Overflow-Protection nachbauen, das sind so in etwa 8 Zeilen.



  • cooky451 schrieb:

    Ich verstehe zwar überhaupt nicht was die Aufgabe mit deiner ursprünglichen Frage zu tun hat, aber das wirkt auf mich als solltest du atoi ohne Overflow-Protection nachbauen, das sind so in etwa 8 Zeilen.

    Wie bzw wo kann ich nachschauen wie dieses atoi aussieht?



  • Ehm ja.. bis auf die Ausgabe der Zahlen klappt es.

    #include <iostream> 
    #include <string>
    
    using namespace std;
    
    int Convert (const string &st){
    	/*Anzahl vorderer Leerzeichen bestimmen*/
    	string newstr;	
    	int i=0;
    	for(int k=0; k<st.length();++k){
    		if(st[k]==' ') 
    			++i;
    		else
    			break;		
    	}
    
    /*Ohne vordere Leerzeichen schreiben*/
    	for(int k=0; k<st.length()-i;++k)
    		newstr+=st[k+i];	
    
    /*Abschneiden falls Leerzeichen mitten im String*/
    	int newlength;
    	bool abschneiden = false;
    	for(int k=0; k<newstr.length();++k)
    		if (newstr[k]==' '){ 
    			newlength=k;
    			abschneiden=true;
    		}
    
    	if (abschneiden){
    		string astr;
    		for(int k=0;k<newlength;++k)
    			astr[k]=newstr[k];
    		newstr=astr;
    	}
    
    	int zahl=0,multiplier=1;
    	for(int k=0; k<newstr.length();++k){
    		if((newstr[k]<'0' && newstr[k+1]>='0' )||(newstr[k]>'9' && newstr[k+1]<='9')){
    			return -1;
    			break;
    		}
    		else{
    			zahl+=(newstr[k]-'0')*multiplier;
    			multiplier*=10;
    		}	
    	}
    
    return zahl;
    
    }
    
    int main(){
    
    cout<<"String eingeben: ";
    string st;
    getline(cin,st);
    
    cout<<Convert(st)<<'\n';
    
    }
    

    Ich hab zwei fragen zu Zeile 46 .47: reicht es wenn ich die '0' abziehe und wie kann ich mit der letzten Zahl im String anfangen, da die Zahlen jetzt offensichtlich umgehdreht angezeigt werden.


  • Mod

    Was macht die NASA vorm Raketenstart?



  • Einen Countdown! Einen Countdown! *streberischinderletztenreiherumfuchtel*
    Und bei wichtigen Ereignissen macht das auch eine Frau mit sexy Stimme! *fuchtel*


Anmelden zum Antworten