String nach erlaubten/unerlaubten Zeichen durchsuchen

timo
2025-01-20
2025-01-21
  • timo - 2025-01-20

    Hallo,
    Ich bastele gerade an einer möglichst einfachen Möglichkeit mit der ich prüfen kann ob ein String Sonderzeichen enthält.

    Mein Ansatz ist ein ST FB mit einer Case Schrittkette. Ich vergleiche jedes Zeichen des Strings mit allen Zeichen eines vorher definierten Strings erlaubter Zeichen, der A-Z, a-z und 0-9 enthält und ggf angepasst werden kann, wenn ich weitere Zeichen erlaube.

    Leider wird meine j Zählervariable nicht richtig ausgeführt. Hat da jemand eine Idee? Oder gibt es eine einfachere Lösung/einen fertigen FB den ich mir anschauen kann?

    FUNCTION_BLOCK Sonderzeichen_Check
    VAR_INPUT
        inputString : STRING;  // Zu prüfender String
        startCheck  : BOOL;    // Startsignal
    END_VAR
    
    VAR_OUTPUT
        ok          : BOOL;    // TRUE, wenn keine ungültigen Zeichen
    END_VAR
    
    VAR
        i           : INT := 1; // Input-String Zähler
        j           : INT := 1; // erlaubte Zeichen Zähler
        allowedChars: STRING := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; // Erlaubte Zeichen
        currentChar : STRING[1];  // Aktuelles Zeichen
        step        : INT := 0;  // Schritt
    END_VAR
    
    CASE step OF
    
    0:  // Warten auf Start
        IF startCheck THEN
            step := 10; 
        END_IF
    
    10: // Initialisierungen
        i := 1;
        j := 1;
        ok := TRUE;  // Standard: ok
        step := 20;
    
    20: // Durchgehen des Eingangs-Strings
        IF i <= LEN(inputString) THEN
            currentChar := MID(inputString, i, 1);  // Aktuelles Zeichen
            step := 30;
        ELSE
            step := 70;  // Alle Zeichen ok
        END_IF
    
    30: // Durchgehen der erlaubten Zeichen
        IF j <= LEN(allowedChars) THEN
            step := 40;  // Zu Schritt 40
        ELSE
            step := 60;  // Ungültiges Zeichen
        END_IF
    
    40: // Vergleich
        IF currentChar = MID(allowedChars, j, 1) THEN
            i := i + 1;  // Nächstes Zeichen im Input
            step := 20; 
        ELSE
            j := j + 1;  // Nächstes erlaubtes Zeichen
            step := 30;
        END_IF
    
    60: // Ungültiges Zeichen
        ok := FALSE;  // Setze auf FALSE
        step := 0;
    
    70: // Alle Zeichen ok
        step := 0;
    
    END_CASE
    
     

    Related

    Talk.ru: 1


    Last edit: timo 2025-01-20
  • Ton - 2025-01-20

    Hi Timo,

    FUNCTION Sonderzeichen_Check : bool
    VAR_INPUT
        sInputString : STRING;  // Zu prüfender String
    END_VAR
    VAR
        i: INT;
        iAsc: INT;
    END_VAR
    
    Sonderzeichen_Check:= TRUE;
    FOR i:= 0 TO len(sInputString) - 1 DO
        iAscii:= sInputString[i];   //Get ASCII value
        //Check value between 48('0') and 65('9') or between 65('A') and 90('Z') or between 97('a') and 122('z') or 
        IF iAscii >= 48 AND iAscii <= 57 OR iAscii >= 65 AND iAscii <= 90 OR iAscii >= 97 AND iAscii <= 122 THEN
                //iAscii valit
            ELSE
                Sonderzeichen_Check:= FALSE;
        END_IF
    END_FOR
    

    Diese FUNCTION anrufen:

    VAR
        xTest1: BOOL;
        xTest2: BOOL;
        sCheck: STRING;
    END_VAR
    
    xTest1:= Sonderzeichen_Check(sInputString:= 'abcuharoahse89347KEWDL'); //=TRUE
    xTest2:= Sonderzeichen_Check(sInputString:= 'abcuharoahse89347KEWDL?'); //=FALSE
    IF Sonderzeichen_Check(sInputString:= 'CheckThisSting,') THEN
        sCheck:= 'OK';
    ELSE
        sCheck:= 'NOT OK';
    END_IF
    
     
  • timo - 2025-01-21

    Vielen Dank. Das ist natürlich etwas eleganter zu prüfen ob ein ASCII Wert von meinen Zeichen abweicht. Der INT Zähler ist bei dir in der Deklaration anders benannt als im Code, aber das Konzept in meinem Code integriert funktioniert scheinbar.

     

Log in to post a comment.