Extended ASCII und Strings


  • 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*



  • Decimad schrieb:

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

    Den hat von Braun erfunden ! :xmas2:


Anmelden zum Antworten