Step 7 String Zeichen ändern tauschen und ersetzen

T.B.

Level-2
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
1500er CPU
TIA V16
ich habe folgende Aufgabe
In einem String sollen Zeichen gelöscht und ausgetauscht werden. Der String lautet: „Max Mustermann – Telefon: +49 421 626758-0“ . Alle Kleinbuchstaben sind in Großbuchstaben umzuwandeln. 2. Alle Leerzeichen werden durch Unterstriche ersetzt. 3. Alle weiteren Zeichen, die keine Buchstaben sind, sind zu entfernen. Das Ergebnis sollte so aussehen: MAX_MUSTERMANN_TELEFON__
Ich habe es folgendermaßen versuch zu lösen:


#sourceString := 'Max Mustermann – Telefon: +49 421 626758-0';
#resultString:= '';


FOR #i := 1 TO LEN(#sourceString) DO
IF ('a' <= #sourceString[#i]) AND (#sourceString[#i] <= 'z') THEN
// Umwandlung von Kleinbuchstaben in Großbuchstaben und dann in BYTE
#resultString := CONCAT(IN1 := #resultString, IN2 := STRING_TO_CHAR(CHAR_TO_BYTE(#sourceString[#i])) - 'a' + 'A');
IF #sourceString[#i] = ' ' THEN
// Ersetzen von Leerzeichen durch Unterstriche
#resultString := CONCAT(IN1 := #resultString, IN2 := '_');
ELSIF ('A' <= #sourceString[#i]) AND (#sourceString[#i] <= 'Z') THEN
// Hinzufügen von Großbuchstaben
#resultString := CONCAT(IN1 := #resultString, IN2 := #sourceString[#i]);
ELSE
;
// Entfernen aller anderen Zeichen
END_IF;
END_IF;
END_FOR;

Mit dieser Zeile habe ich Schwierigkeiten: #resultString := CONCAT(IN1 := #resultString, IN2 := STRING_TO_CHAR(CHAR_TO_BYTE(#sourceString[#i])) - 'a' + 'A');

Das Char_to_Byte wird nicht akzeptiert. Folgender Fehltertext wird ausgegeben: Parameter der Funktion oder des Funktionsbausteins stimmen nicht.
Bitte keine komplett neuen Lösungsansätze. Würde gerne diese Programm zum laufen bringen.
 
Zuletzt bearbeitet:
Du kannst ja auch nicht einen Buchstaben subtrahieren ...
Der Char-Wert von "A" ist 65 und der von "a" ist 97 - wenn dann bräuchtest du also nur 32 aufaddieren.
Was ich jetzt so gar nicht weiß ist ob du auf die von dir gewählte Methode (als sourceString[#i]) and die einzelnen Zeichen des Strings kommst - nach meiner Meinung nicht. Der richtige Ansatz hier wäre die Funktion MID.

Nun willst du ja keinen neuen Ansatz (warum auch immer) - ich hätte dir jetzt vorgeschlagen, auf deinen String eine AT-Sicht zu machen und dann darin die Zeichen zu manipulieren. Das wäre sehr viel einfacher und auch eleganter. Na ... vielleicjht änderst du deine Meinung ja noch ...
 
Zuletzt bearbeitet:
Parameter der Funktion oder des Funktionsbausteins stimmen nicht
Der Fehler wird angezeigt, da du STRING_TO_CHAR verwendest.
Richtig wäre an dieser Stelle aber CHAR_TO_STRING.

Was du mit - 'a' + 'A' bezweckst, verstehe ich nicht.
Wenn du aus den Großbuchstaben Kleinbuchstaben machen möchtest, musst du eigentlich nur:
bräuchtest du also nur 32 aufaddieren
Also so:
Code:
#resultString:=CONCAT(IN1 := #resultString, IN2 := CHAR_TO_STRING(CHAR_TO_BYTE(#sourceString[#i])+32));

Edit:
Gerade gesehen. Du möchtest aus allen Kleinbuchstaben Großbuchstaben machen. Also:
Code:
#resultString:=CONCAT(IN1 := #resultString, IN2 := CHAR_TO_STRING(CHAR_TO_BYTE(#sourceString[#i])-32));
 
Zugriff auf die einzelnen Zeichen mit Array-Syntax ist kein Problem bei Strings.
Du kannst auch einzelne Zeichen überschreiben also z.B.:
Code:
FOR #i := 1 TO LEN(#sourceString) DO
    IF (#sourceString[#i] = ' ') THEN
        #sourceString[#i] := '_';
    END_IF;
END_FOR;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was du mit - 'a' + 'A' bezweckst, verstehe ich nicht.
...
Edit:
Gerade gesehen. Du möchtest aus allen Kleinbuchstaben Großbuchstaben machen. Also:
Code:
#resultString:=CONCAT(IN1 := #resultString, IN2 := CHAR_TO_STRING(CHAR_TO_BYTE(#sourceString[#i])-32));
-CHAR_TO_BYTE('a') + CHAR_TO_BYTE('A') bzw. -97 + 65 ist doch -32, da 'a' = 'A' + 32.

Aber:
Wo wird aus 'ß' denn "SS", aus 'ä' 'Ä', aus 'ö' 'Ö' oder aus 'ü' 'Ü' gemacht? Oder aus 'Ä' oder 'ä' "AE", aus 'Ö' oder 'ö' "OE" oder aus 'Ü' oder 'ü' "UE"? Kommen diese Zeichen denn mit Sicherheit nicht vor?

Stelle es mir so ähnlich vor - wie immer ungetestet:
Code:
#resultString := "" ;
FOR #i := 1 TO LEN(#sourceString) DO
    #C := #sourceString[#i]) ;
    IF #C = ' ' THEN
        #X := "_" ;
    ELSIF #C >= 'a' AND #C <= 'z' THEN
        #X := BYTE_TO_STRING(CHAR_TO_BYTE(#C) - 32) ;
    ELSIF #C >= 'A' AND #C <= 'Z' THEN
        #X := BYTE_TO_STRING(CHAR_TO_BYTE(#C)) ; // ?
    ELSIF #C = 'ß' THEN
        #X := "SS" ;
    ELSIF #C = 'Ä' OR #C = 'ä' THEN
        #X := "AE" ; 
    ELSIF #C = 'Ö' OR #C = 'ö' THEN
        #X := "OE" ; 
    ELSIF #C = 'Ü' OR #C = 'ü' THEN
        #X := "UE" ;
    ELSE
        #X := "" ;     
    END_IF ; 
// IF #X <> "" THEN //
    #resultString := CONCAT(IN1 := #resultString, IN2 := #X) ;
// END_IF // 
END_FOR ;
Ich würde vermutlich noch die Aufgabenstellung ein wenig verändern:
alle NichtBuchstaben zunächst in '_' wandeln und dann abschliessend alle direkt aufeinanderfolgende '_' zu einem einzelnen '_' zusammenschrumpfen.
 
Zuletzt bearbeitet:
Zurück
Oben