[C++] Buchstabe in einen Char Feld umwandeln

Chakky

Member of Honour
Hallo,

nach dem ihr mit meinen Problem helfen konnten mit den Maxima, hab ich wieder mal ein Problem.... (Klausur vorbereitung mehr oder weniger)

Erstmal die eigentliche Aufgabe:

Umlaute können nicht ausgegeben werden, deshalb ein Variante umlaute so zu schrieben:
ä=“a
ö=“o
ü=“u
Ä=“A
Ö=“O
Ü=“U
ß=“s
beispiel: anstatt ‘müller’ à ‘m”uller’
a) zwei Zeichenfelder mit max. 1000 Zeichen erstellen
b) in ein Zeichenfeld eine Zeichenkette einlesen
c) diese zeichenkeLe in das andere Zeichenfeld kopieren und die Umlaute ersetzen

Ich hab mir jetzt als Lösung folgendes gedacht.

Ich les mir die umzuwandelde Zeichenkette ein, durchsuche jedes einzeln Buchstaben und wandeln den entsprechend um. Bin da auf 2 Problem gestoßen.
a) ü belegt zum Bsp in den Char Feld nur eine "Einheit", aber "u hingegen 2? Da muss ich also alles um 1 verschieben, richtig? Nur wie :/

b) Ich bekomme schon eine Umwandlung von f zu F nicht hin.

Hier mal mein Code den ich erstmal zum laufen bekomme wollte eh ich mich direkt an die Umlaute ranmache.

Code:
#include<iostream>
using namespace std;

char copystring(char string1[],char string2[],int len) //alle sachen übergeben
{

      
   for(int i=0;i<len;i++)
   {
           
       switch(string1[i])
       {
                        case "f":string1[i]="F";break;  //ersetze kleines f mit F
                        default: string1[i]=string1[i]; //wenn nix gefunden dann  behalte string bei
                      }        
       string2[i]=string1[i];
       }               
                  
return string2;
}



int main() 
{
    int len = 100;
    char string1[100];
    char string2[100];
   cin<<string1; 
   cout<<copystring(string1,string2,len);
   
    
system("PAUSE");
return 0;
}

Ich bekomme als Compiler Error:

D:\TU\Info\klausur 1\4.cpp In function `char copystring(char*, char*, int)':
13 D:\TU\Info\klausur 1\4.cpp case label does not reduce to an integer constant
13 D:\TU\Info\klausur 1\4.cpp invalid conversion from `const char*' to `char'
19 D:\TU\Info\klausur 1\4.cpp invalid conversion from `char*' to `char'
D:\TU\Info\klausur 1\4.cpp In function `int main()':
29 D:\TU\Info\klausur 1\4.cpp no match for 'operator<<' in 'std::cin << string1'

Nur kann ich mit der Meldung nicht viel anfangen, außer das meine Umwandlung von Char in Char nicht funktioniert, obwohl ich doch in meinen Augen keine Umwandlung betreibe....


Danke für gute Tips :)
 
Zu Problem a):
Dieses Problem könnte man mit Zeigern lösen, indem du das umzuwandelnde Zeichen auf ein Array mit der 'Größe' 2 zeigen lässt.
Zu Problem b):
Versuche einfach mal statt "F" 'F' zu verwenden(nur ein Anführungszeichen).
Gruß
Open_Geek
 
Zum grundlegenden Problem eine kleine Hilfe: Du erstellst dir zwei Arrays, eines doppelt so groß wie das andere (das ist schließlich der maximale Speicherverbrauch der durch die Umwandlung entstehen kann).
Code:
const unsigned int maxStringLength = 10;
char sourceString[maxStringLength];
char targetString[2 * maxStringLength]

Dann durchläufst du die Arrays mit zwei getrennten Laufvariablen:
(das folgende Beispiel ersetzt f durch 2F)
Code:
unsigned int iteratorSource = 0;
unsigned int iteratorTarget = 0;

while(iteratorSource < maxStringLength)
{
    switch(sourceString[iteratorSource])
    {
        case 'f':
        {
            targetString[iteratorTarget] = '2';
            ++iteratorTarget;
            targetString[iteratorTarget] = 'F';
        } break;
        default:
            targetString[iteratorTarget] = sourceString[iteratorSource];
    }

    ++iteratorSource;
    ++iteratorTarget;
}

Wie du die Sonderzeichen reinbekommst bleibt dir überlassen, aber da gibts einen heißen Tipp: ASCII, Codepage 437

mfg benediktibk
 
Versuche einfach mal statt "F" 'F' zu verwenden(nur ein Anführungszeichen).
Gruß
Open_Geek

ok das geht jetzt :) und den einen fehler habe ich auch gefunden man sollte << nicht mit >> verwechseln und umgedreht.

hab das jetzt noch eine zeile mit
Code:
case 'ü':string1[i]='"u';break;

eingefügt aber das klappt nicht.

Eine Variante mit Pointern wäre ein Lösung, da es aber nicht behandelt worden ist und expliziet ausgenommen wurden ist für die Klausur muss es auch eine lösung ohne der Pointervariante gehen...
//
oops zu lange zum antworten gebraucht
 
Zuletzt bearbeitet:
sry für doppelpost


Wie du die Sonderzeichen reinbekommst bleibt dir überlassen, aber da gibts einen heißen Tipp: ASCII, Codepage 437

mfg benediktibk

Ok ich hab jetzt folgendes Probiert

den aktuellen Wert in String1 auf int casten (damit ich einen Hexawert bekomme, oder ist das schon falsch) und den dann laut Tabelle vergleichen, was mich irritiert ist das man ja im Hex auch Buchstaben hat, aber die variabel von hex bei mir eine integer ist.

hier mein angepasster code
Code:
    int iSource = 0; //start
   int iTarget = 0;
int hex; //hexa wertspeichern
while(iSource < len)
{
      hex = (int)string1[iSource]; //aktuellen string wert auf hex casten
   // switch(string1[iSource])
   switch(hex) //vergleichen
    {
        case '66': //hex wert für f
        {
            string2[iTarget] = '2';
            ++iTarget;
            string2[iTarget] = 'F';
        } break;
        case 'F6':
                {
            string2[iTarget] = 'A';
            ++iTarget;
            string2[iTarget] = 'A';
        } break;
             
        default:
            string2[iTarget] = string1[iSource];
    }

    ++iSource;
    ++iTarget;
    
}
 
Ahm, irgendwie passt da was nicht.

Seit wann kann man denn mit einem Character, der als ASCII Zeichen interpretiert wird ein ü darstellen?!

ASCII-Tabelle

Der Prototyp müsste dann schon eher sowas sein:
Code:
char copystring(char *dest, [B]wchar_t[/B] *source,int len)

den aktuellen Wert in String1 auf int casten (damit ich einen Hexawert bekomme, oder ist das schon falsch) und den dann laut Tabelle vergleichen, was mich irritiert ist das man ja im Hex auch Buchstaben hat, aber die variabel von hex bei mir eine integer ist.

Schau dir mal die ASCII Tabelle an. Dor stehen alle gültigen Zeichen für einen Character (-128; 127). Ein int ist nichts anderes als eine integraler Wert, genauso wie ein Char. Der buchstabe a z.B. ist nichts anderes als 0x61 bzw dezimal 97.

sowas wie
int i = 97;
char c = i; // c ist nun der Buchstabe a

Oh, und der Switch-Case geht nicht. Wenn du auf Hex prüfen willst, mach sowas:
switch(c) {
case 0x61:
break;
}
 
Zuletzt bearbeitet:
Ich hab jetzt auf dezimal geprüft, scheint einfacher zu sein....

wenn ich jetzt folgendes mache
Code:
  dec = (int)string1[iSource]; //aktuellen string wert auf hex casten //mit ü getest
      cout<<dec<<endl;
bekomm ich als ausgabe -127 (steht aber in der ascii tabelle nicht drinne) also für "ü"

teste ich das mit "a" dann bekomm ich Ordnungsgemäß die 97, kann es aber trotzdem nicht in der case ansprechen und dann ändern....bekomme nur die compiler meldung

67 D:\TU\Info\klausur 1\4.cpp case label does not reduce to an integer constant

Zeile:
Code:
case "97": //dezwert für irgendwas

die " hab ich geschrioeben weil ich ja jetzt wieder Zahlen vergleiche....
 
Zuletzt bearbeitet:
Ich hab jetzt auf dez geprüft, scheint einfacher zu.

wenn ich jetzt folgendes mache
Code:
  dec = (int)string1[iSource]; //aktuellen string wert auf hex casten //mit ü getest
      cout<<dec<<endl;
bekomm ich als ausgabe -127 (steht aber in der ascii tabelle nicht drinne)

teste ich das mit "a" dann bekomm ich Ordnungsgemäß die 97, kann es aber trotzdem nicht in der case ansprechen....

Nochmal, du wirst in einer Zeichenkette, bestehend aus ein Byte grossen Charactern kein ü finden, da dieser Buchstabe in ASCII nicht definiert ist.

Außerdem, wenn ein int einen Wert > +127 hat, dann wirst du bei einem Character einen Überlauf bemerken.
int i = 128;
char c = i; // c sollte den Wert -128 haben. Da es ab +127 zu einem Überlauf kommt

Zeile:
Code:
case "97": //dezwert für irgendwas
die " hab ich geschrioeben weil ich ja jetzt wieder Zahlen vergleiche....

Nein, das klappt nicht. "97" ist eine konstante Zeichenkette. Sowas sollte dein Compiler eigentlich nichtmal durchgehen lassen.


Vergleich auf Hex:
case 0x61:
Vergleich auf Dezimal:
case 97:
Vergleich auf äquivalentes Zeichen (ASCII Code!):
case 'a':
In C/C++ unzulänglich ist:
case "97":
 
Zuletzt bearbeitet:
Nochmal, du wirst in einer Zeichenkette, bestehend aus ein Byte grossen Charactern kein ü finden, da dieser Buchstabe in ASCII nicht definiert ist.

aber weiter unten in der Tabelle finde ich das mit entsprechenden dezimal wert, jetzt bin ich verwirrt...

was mich auch stutzig macht bei mir unter Win7 wird das ü entsprechend auf der Console richtig angezeigt, auf einen XP rechner wie in der Uni nicht....

Ok lässt der Compiler garnicht durch, dachte vorhins er lässt mich durch da waren aber noch die '....
//update
ok also muss ich jetzt von den einzelen Buchstaben auf den Hex Wert kommen und den in der case Abfrage behandeln, kümmer ich mich morgen drum :) Danke dir erstmal!
 
Zuletzt bearbeitet:
was mich auch stutzig macht bei mir unter Win7 wird das ü entsprechend auf der Console richtig angezeigt, auf einen XP rechner wie in der Uni nicht....

Weiter unten sind weitere Zeichensätze definiert. Du könntest es mal mit unsigned char versuchen. Könnte sein, dass Windows Latin-1 als Zeichensatz benutzt, da wäre dann 0xfc (252d) der Code für ein ü.

Hab es mal grad probiert. Mac OS nutzt ausschliesslich ASCII:
Code:
#include <stdio.h>

int main() {
        unsigned char uc;
        uc = 252;
        printf("%c; 0x%x\n", uc, uc);
        return 0;
}

Ausgabe:
 
Zuletzt bearbeitet:
Zurück
Oben