Zeichen umwandeln



  • Hallo,

    ich möchte eine Reihe von Zeichen umwandeln (Zeichen in Zahlen, Zahlen in Buchstaben).

    Ich denke am Besten wird es sein, wenn ich die MV in einen Array einlese und dann in einer Schleife umwandel.

    1. Wie mach ich aus der MV den Array?
    2. Die Umwandlung mach ich dann wohl am Besten in einer Schleife, dadrin eine CASE-Abfrage die dann den jeweiligen "Code" setzt, oder?

    Ich bin in C++ nicht fitt, bitte entschuldigt deshalb diese simple Frage!

    MfG
    Nicolai
    www.nicokr.de



  • Ich verstehe nicht genau, was du vorhast; wenn du chars als zahlen ausdrücken willst, kannst du doch einfach explizit casten, also:

    char zeichen='a';
         int zahl=(int)zeichen;
    

    Dann hast du die ASCII-Ziffer von deinem Zeichen und somit auch ne Zahl...
    Hab übrigens gerad festgestellt, dass du nicht mal explizit casten musst.
    Also, stell deine Frage mal etwas deutlicher !
    Gruß
    E-the-Real



  • Hallo,

    da ist meine Problematik wohl komplett falsch rüberkommen,
    ich bitte meine unpräzise Beschreibung zu entschuldigen.

    So wird es deutlicher sein:
    In einem Eingabefeld (also CString) gibt man eine beliebig
    lange Reihe von Zahlen ODER Buchstaben an. Ganz simpel sollen
    nun diese Zahlen ODER Buchstaben jeweils in die ANDERE FORM
    (also Buchstaben in Zahlen, Zahlen nach Buchstaben) nach einer
    ganz bestimmten Verslüsselungsart umgewandelt werden.

    Mein Problem ist jetzt einmal, wie ich aus der Membervariable
    des CStrings mit der Eingabe einen Array mache um dann in einer
    Schleife jeden Buchstabe zu durchlaufen (auch da brauch ich Hilfe!)
    und zum Anderen wie ich die "Umwandlung" dann konkret vornehme.
    Ich denke "Umwandlung" könnte man so verstehen, dass man sich in


    Dann den jeweiligen Typ der dazugehört mit case ermitteln und in einen

    Und wie würde ich diesen Array dann wieder in einem Textfeld ausgeben?

    Sind also mehrere Fragen, ich hoffe klar gestellt...

    Danke euch!
    Nicolai
    [url]www.nicokr.de



  • Achso, ja da hab ich dich wohl wirklich falsch verstanden.
    Also, bin zwar kein MFC-Crack, aber im Prinzip ist das glaub ich rel. einfach:
    Du musst IMHO nicht mal den String in ein char-array umwandeln, da von der Klasse CString bereits Memberfunktionen bereitgestellt werden, die eine "Auseinandernahme und Bearbeitung" eines ganzen Strings eigentlich perfekt ermöglichen.
    Für dich relevant sind dabei die Funktionen
    "GetAt(int Position)" und
    "SetAt(int Position,char zeichen)"
    Das ganze kannst du dann so realisieren:

    void CAppDlg::OnButton1() 
    {
    	// TODO: Code für die Behandlungsroutine ...
    	UpdateData(TRUE);  /*Einlesen des Eingabefeldes in die CString- Variable des Feldes;vorher mit dem Klassenassistenten erstellen !*/
     //m_s sei eine solche CString-Variable
    	char Zeichen=m_s.GetAt(0); /*damit speicherst du das erste Zeichen (nicht vergessen: Index beginnt bei 0) in einer char-Variablen*/ 
    	m_s.SetAt(1,'h'); /*damit ersetzt du das (Position+1)-te Zeichen des Strings mit dem char (in diesem Fall ein 'h') */
    	UpdateData(FALSE); //Damit wird dann das Dlg-Feld aktualisiert
    }
    

    Um herauszufinden, ob nun in 'Zeichen' ein Buchstabe oder eine Zahl ist, kannst du isdigit und isalpha nehmen.
    Bei deiner "Verschlüsselung" kann ich dir aber nicht helfen, da ich nicht weiss, was du da genau vorhast - der Sinn dieses Programmes bleibt mir immer noch verborgen.
    Hoffe aber trotzdem, dass ich dir weiterhelfen konnte !
    Gruß
    E-the-Real



  • Hallo,
    danke für die Antwort damit konnte ich schon ganz schön was anfangen.

    Mein aktueller Stand bereitet mir fogelende Probleme:

    1. wie kann ich bei einem weiteren Verlauf der Schleife an den String nZeichen anhängen, sodass nZeichen nicht geändert, sondern erweitert wird?
    2. warum gibt mir die Switch-Verzweigung immer den Wert "1" für nZeichen zurück?
    void CMajorsystem_RechnerDlg::OnButton1() 
    {
    
        UpdateData(TRUE);  
    
    	int l=m_code.GetLength(), loop;
    
    	for(loop = 0; loop<l; loop++)
        {
    	char Zeichen=m_code.GetAt(loop);
    	CString nZeichen;
    
    	if(isalpha(Zeichen))
    	{
    	switch(Zeichen)
    	{
    	case 'a': nZeichen='_';
    	case 'b': nZeichen='9';
        case 'c': nZeichen='7';
    	case 'd': nZeichen='1';
    	case 'e': nZeichen='_';
    	case 'f': nZeichen='8';
    	case 'g': nZeichen='7';
    	case 'h': nZeichen='_';
    	case 'i': nZeichen='_';
    	case 'j': nZeichen='6';
    	case 'k': nZeichen='7';
    	case 'l': nZeichen='5';
    	case 'm': nZeichen='3';
    	case 'n': nZeichen='2';
    	case 'o': nZeichen='_';
    	case 'p': nZeichen='9';
    	case 'q': nZeichen='7';
    	case 'r': nZeichen='4';
    	case 's': nZeichen='0';
    	case 't': nZeichen='1';
    	case 'u': nZeichen='_';
    	case 'v': nZeichen='8';
    	case 'w': nZeichen='_';
    	case 'x': nZeichen='7';
    	case 'y': nZeichen='_';
    	case 'z': nZeichen='1';
    
    	}
    	} else
    	{
    	MessageBox("Es ist eine Zahl");
    	}
    
    	SetDlgItemText(IDC_decode, nZeichen);	
    	}
    }
    

    Danke euch.
    Nicolai



  • hi netrider,
    also die 1 bei der ausgabe, das könnte daran liegen, dass du kein "break" in deiner switch-abfrage hast. das müsste IMHO so ausschauen:

    switch(Zeichen) 
        { 
        case 'a': 
        {
          nZeichen='_';
          break;
        } 
        case 'b':
        {
          nZeichen='9'; 
          break;
        }
        //usw....
    

    Zu deiner ersten Frage: Ich kenn mich mit der String-Klasse net so gut aus, aber ich hab mal ein bissl im MSDN gesucht und folgendes gefunden:

    MSDN schrieb:

    CString::GetBufferSetLength
    Call this member function to retrieve a pointer to the internal character buffer for the CString object, truncating or growing its length if necessary to exactly match the length specified in nNewLength. The returned LPTSTR pointer is not const and thus allows direct modification of CString contents.

    Syntax
    LPTSTR GetBufferSetLength( int nNewLength );
    throw( CMemoryException );

    At a Glance
    Header File Afx.h

    Ich bin mir nicht so sicher, ob's das ist, was du brauchst, aber von den Memberfunktionen der CString-Klasse würde mir da nichts anderes einfallen.
    Wenn's so nicht funzen sollte, musst du es wahrscheinlich "manuell" machen mit dynamischer Speicherallokierung, aber probier's halt erstmal mit der o.g. Funktion.
    Schönen Abend noch
    Gruß
    E-the-Real



  • Zeichen anhängen: oprator+.

    CCString temp;

    temp += "Test";

    Versuch mal ob das geht.



  • Hallo,
    alles klasse Hilfen. Ich komme vorwärts.
    Das Programm ist soweit fertig.

    Danke sehr!
    Bald zu sehen auf www.nicokr.de



  • @netrider:
    Ich geh mal davon aus , dass du Nicolai Krüger bist, oder ???
    Wenn ja, spielst du Klavier ???Zumindest ist auf diesem Portrait im Hintergrund ne Tastatur...Würde mich ja echt interessieren, ob's hier ausser mir noch andere Pianisten-Progger gibt 🙂
    Gruß
    E-the-Real



  • ethereal schrieb:

    @netrider:
    Ich geh mal davon aus , dass du Nicolai Krüger bist, oder ???
    Wenn ja, spielst du Klavier ???Zumindest ist auf diesem Portrait im Hintergrund ne Tastatur...Würde mich ja echt interessieren, ob's hier ausser mir noch andere Pianisten-Progger gibt 🙂
    Gruß
    E-the-Real

    *hehe* ja, genau der bin ich! In der Tat spiele ich Klavier. Dann sind wir also schonmal zu Zweit. Du warst mir doch von Anfang an symathisch 🙂

    Nicolai



  • Wie lange progst du denn schon und wie lange spielst du Klavier ? Und was ? Würde mich mal echt interessieren! 😉
    Schönen Abend noch
    E-the-Real
    P.S: Sehe gerade, du kommst aus Krefeld...is das net das Heimatdorf von Blind Guardian, falls du die kennst ?? 😕


Anmelden zum Antworten