ROT 13 Codierung von Zeichen



  • Swordfish schrieb:

    Solange p nicht auf das den String abschließende '\0' zeigt.

    Dann wäre *p = 0 und somit while = false?



  • '\0' == 0 . Null ist immer false , ein von 0 unterschiedlicher wert immer true .



  • C_Newbe schrieb:

    Also so stelle ich mir das vor.

    char [3] {t,e,s,t}
    

    Das ist schon mal ein genialer Ansatz -> 4 + '\0' in ein 3 char großes array zu packen.
    Weiter so, du befindest dich auf einem vielversprechenden Weg.



  • unsigned char CSimpleCryptDlg::EncryptChar( int ch )
    {
    	int ret, diff;
    	if( ch >= 97 && ch <= 122 )
    	{
    		ret = ch + m_diff;
    		if( ret < 97 )
    		{
    			diff = 97 - ret;
    			ret = 123 - diff;
    		}
    		else if( ret > 122 )
    		{
    			diff = ret - 123;
    			ret = 97 + diff;
    		}
    		return( static_cast<unsigned char> (ret) );
    	}
    	else if( ch >= 65 && ch <= 90 )
    	{
    		ret = ch + m_diff;
    		if( ret < 65 )
    		{
    			diff = 65 - ret;
    			ret = 91 - diff;
    		}
    		else if( ret > 90 )
    		{
    			diff = ret - 91;
    			ret = 65 + diff;
    		}
    		return( static_cast<unsigned char> (ret) );
    	}
    	else
    		return( static_cast<unsigned char> (ch) );
    }
    

    So geht das. m_diff ist der Verschiebewert, klappt nicht nur mit ROT13.
    Decrypt funktioniert genauso, du musst nur einen negativen Wert für m_diff benutzen.



  • Ihh, mach das tot, bevor es Eier legt.

    C++ und Magic Numbers. 🙄



  • Würde man char32_t nutzen, würde das integer-gepfriemel auch wegfallen.



  • DirkB schrieb:

    Ihh, mach das tot, bevor es Eier legt.

    C++ und Magic Numbers. 🙄

    Hihihi, das wird wohl niemand mehr aus mir rauskriegen.
    Ich mach das seit 30 Jahren so und es wird schon irgendeinen Grund gehabt haben wieso ich einen int übergebe.
    Bin hier ja schließlich nicht bei einer CastingShow.



  • Hihi.



  • Sind die static_cast<>() s nicht redundant, wenn der Rückgabetyp sowieso unsigned char ist?

    aja, und hier ist doch C?

    #include <ctype.h>
    
    char rotate_char( char ch, int distance )
    {
    	if( !isalpha( ch ) )
    		return ch;
    
    	while( distance < 0 )
    		distance = 'Z' - 'A' + distance + 1;
    
    	char base = isupper( ch ) ? 'A' : 'a';
    	return base + ( ch - base + distance ) % ( 'Z' - 'A' + 1 );
    }
    
    void rotate_string( char * str, int distance )
    {
    	for( ; *str; ++str )
    		*str = rotate_char( *str, distance );
    }
    
    void rot13( char * str )
    {
    	rotate_string( str, 13 );
    }
    


  • EOP schrieb:

    C_Newbe schrieb:

    Also so stelle ich mir das vor.

    char [3] {t,e,s,t}
    

    Das ist schon mal ein genialer Ansatz -> 4 + '\0' in ein 3 char großes array zu packen.
    Weiter so, du befindest dich auf einem vielversprechenden Weg.

    Dieser raue Ton gefällt mir nicht (wenn ich den Sarkasmus richtig verstehe). Ich gebe mir wirklich Mühe mich im Eigenstudium mit den Sachen zu beschäftigen, da ist es nicht hilfreich solche abwertenden und polemischen Kommentare zu lesen.

    Ich habe gelernt man fängt bei 0 an zu zählen, wenn "test" in einem array gespeichert werden soll sind das genau 4 bytes an Inhalt, also ist das array 4 lang, quasi von 0-3.

    Wenn der /0 Byte mit initiiert werden muss (was ich gerade nicht glaube, aber gerne nochmal überprüfe) dann weise mich doch einfach darauf hin als hier so einen Pessimismus an den Mann zu bringen. Mit solchen Kommentaren zerstört man doch eher die Motivation derer, die sich bemühen aus eigener Kraft mit so etwas zu beschäftigen.

    Ich danke allen anderen für die Hinweise, der Trick mit der Pointer Schleife hat es perfekt erledigt. Zusätzlich habe ich noch den encrypter nur auf Buchstaben gestellt und habe einen perfekten Text bekommen.

    Ich freu mich 🙂 😃 👍



  • C_Newbe schrieb:

    Wenn der /0 Byte mit initiiert werden muss (was ich gerade nicht glaube, aber gerne nochmal überprüfe) [...]

    Zeichenketten in C (und C++, "C-Strings") sind per konvention Nullterminiert. Alle Funktionen, die in C mit Strings umgehen, verlassen sich darauf, daß irgendwann ein '\0' das Ende der Zeichenkette anzeigt.

    Der Compiler hängt dir freundlicherweise an "test" die '\0' automatisch an. In Wirklichkeit steht da also 't', 'e', 's', 't', '\0' .

    Initialisierst Du ein char -Array mit einem Zeichenkettenliteral

    char foo[] = "test";

    so ist dieses array also nicht 4 sondern 5 char s lang.

    Gibst Du die Größe des Arrays explizit an

    char foo[4 /* <- zu klein */ ] = "test";

    so ist schlicht kein Platz mehr für das fünfte Zeichen, die '\0' , und das ding ist zwar ein Array of char aber per Konvention kein gültiger C-String, da die Abschließende '\0' fehlt.

    char foo[] = { 't', 'e', 's', 't' };
    und
    char foo[4] = { 't', 'e', 's', 't' };

    fehlt auch die '\0'

    ➡

    char foo[] = { 't', 'e', 's', 't', '\0' };

    😉



  • Swordfish schrieb:

    Sind die static_cast<>() s nicht redundant, wenn der Rückgabetyp sowieso unsigned char ist?

    VisualC hat eben gemeckert, da hab ich halt die Casting Show veranstaltet.
    War sowieso nur ein quicky-Programm um einem Freund ein Lächeln ins Gesicht zu zaubern.
    Deines ist natürlich eleganter.



  • Swordfish schrieb:

    C_Newbe schrieb:

    Wenn der /0 Byte mit initiiert werden muss (was ich gerade nicht glaube, aber gerne nochmal überprüfe) [...]

    Zeichenketten in C (und C++, "C-Strings") sind per konvention Nullterminiert. Alle Funktionen, die in C mit Strings umgehen, verlassen sich darauf, daß irgendwann ein '\0' das Ende der Zeichenkette anzeigt.

    Der Compiler hängt dir freundlicherweise an "test" die '\0' automatisch an. In Wirklichkeit steht da also 't', 'e', 's', 't', '\0' .

    Initialisierst Du ein char -Array mit einem Zeichenkettenliteral

    char foo[] = "test";

    so ist dieses array also nicht 4 sondern 5 char s lang.

    Gibst Du die Größe des Arrays explizit an

    char foo[4 /* <- zu klein */ ] = "test";

    so ist schlicht kein Platz mehr für das fünfte Zeichen, die '\0' , und das ding ist zwar ein Array of char aber per Konvention kein gültiger C-String, da die Abschließende '\0' fehlt.

    char foo[] = { 't', 'e', 's', 't' };
    und
    char foo[4] = { 't', 'e', 's', 't' };
    oder
    char foo[5] = { 't', 'e', 's', 't' };

    fehlt auch die '\0'

    ➡

    char foo[] = { 't', 'e', 's', 't', '\0' };

    😉

    Danke für die super ausführliche Antwort, ich schreibe es mir alles auf! Danke sehr 👍 👍 👍 👍 🙂



  • C_Newbe schrieb:

    Dieser raue Ton gefällt mir nicht (wenn ich den Sarkasmus richtig verstehe).

    Das ist nicht Sarkasmus, höchstens Ironie.
    Warte erstmal bis Wutz dir antwortet - da wird dir der Kopf richtig gewaschen.
    Das Leben ist kein Ponyhof und nicht alle Forummitglieder sind so entspannt wie SeppJ. Sic.



  • C_Newbe schrieb:

    Ich habe gelernt man fängt bei 0 an zu zählen, wenn "test" in einem array gespeichert werden soll sind das genau 4 bytes an Inhalt, also ist das array 4 lang, quasi von 0-3.

    Ja, a_b_e_r bei der Definition des Array wird die Länge/Größe angegeben und nicht der letzte Index.

    C_Newbe schrieb:

    Wenn der /0 Byte mit initiiert werden muss (was ich gerade nicht glaube, aber gerne nochmal überprüfe) dann weise mich doch einfach darauf hin als hier so einen Pessimismus an den Mann zu bringen. Mit solchen Kommentaren zerstört man doch eher die Motivation derer, die sich bemühen aus eigener Kraft mit so etwas zu beschäftigen.

    Glauben nützt dir nichts, du musst es wissen.
    Und diese Dinge (Arrays und C-Strings) gehören zu den absoluten Grundlagen in C. Und diese Grundlagen wird dir hier keiner vermitteln.
    Dazu brauchst du ein Buch (aus Papier) und das musst du durcharbeiten.
    Gute deutsche Online-Tutorials sind hier keinem bekannt. Aber auch bei Büchern gibt es viel Mist.

    C_Newbe schrieb:

    Dieser raue Ton gefällt mir nicht (wenn ich den Sarkasmus richtig verstehe). Ich gebe mir wirklich Mühe mich im Eigenstudium mit den Sachen zu beschäftigen, da ist es nicht hilfreich solche abwertenden und polemischen Kommentare zu lesen.

    Nun, C ist eine einfache Sprache (wenig Befehle, kurz und knapp).
    Das macht sie aber nicht einfach in der Anwendung.
    Und so sind auch die C-Programmierer. Nimm das nicht persönlich.



  • Swordfish schrieb:

    char foo[5] = { 't', 'e', 's', 't' };

    fehlt auch die '\0'

    Das ist falsch.
    Wenn bei der Initialsierung (Zuweisung bei der Definition) von einem Array Element fehlen, so werden diese mit 0 besetzt.



  • Autsch. Natürlich.



  • DirkB schrieb:

    Nun, C ist eine einfache Sprache (wenig Befehle, kurz und knapp).
    Das macht sie aber nicht einfach in der Anwendung.
    Und so sind auch die C-Programmierer. Nimm das nicht persönlich.

    Ich bin nicht kurz und knapp, ich bin eher mittellang und fett (zu meinem Leidwesen).


Anmelden zum Antworten