Zeichenkette mit PicoC aufteilen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • FMR
    Azubi
    • 11.04.2019
    • 7

    #1

    Zeichenkette mit PicoC aufteilen

    Zeichenkette mit PicoC aufteilen

    Ich möchte mit dem Loxone-Baustein Programm eine Zeichenkette «ABCD612345» am Eingang T1 aufteilen in 3 Teile.

    Teil1: «ABCD» Zeichenkette an Ausgang Txt1
    Teil2: «6» Zahl an Ausgang O1
    Teil3: «12345» Zahl an Ausgang O2



    Ich programmiere normalerweise mit VBasic

    Txt1 = Left(T1,4)
    O1 = Mid(T1,5,1)
    O2 = Right(T1,5)

    Wer kann mir helfen in PicoC?
    Vielen Dank!

    (Bin 82 Jahre alt und kann mich nicht mehr, nur für diese Aufgabe, in eine neue Sprache PicoC einarbeiten.)
  • loxGigi
    Dumb Home'r
    • 21.09.2025
    • 29

    #2
    Hier mal ein Rahmen, ungetestet... Viel Spaß damit. :-)

    Code:
    char *myinput = getinputtext();
    
    // Immer ein Zeichen mehr für das terminierende 0-Zeichen vorsehen
    char part1[5], part2[2], part3[6];  
    
    strncpy(part1, myinput,     4);
    strncpy(part2, &myinput[4], 1);
    strncpy(part3, &myinput[5], 5);
    
    free(myinput);
    
    setoutputtext(0, part1);
    setoutput(0, atoi(part2));
    setoutput(1, atoi(part3));
    Zuletzt geändert von loxGigi; vor einer Woche.

    Kommentar

    • FMR
      Azubi
      • 11.04.2019
      • 7

      #3
      Hurra es funktioniert!!!!

      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Screenshot 2026-07-06 144531.png
Ansichten: 106
Größe: 15,4 KB
ID: 487617
      Musste nur mit 0 ergänzen für Ausgang Txt1

      // char *myinput = "ABCD612345";
      char *myinput = getinputtext(0);

      // Immer ein Zeichen mehr für das terminierende 0-Zeichen vorsehen
      char part1[5], part2[2], part3[6];

      strncpy(part1, myinput, 4);
      strncpy(part2, &myinput[4], 1);
      strncpy(part3, &myinput[5], 5);

      //free(myinput);

      setoutputtext(0, part1);
      setoutput(0, atoi(part2));
      setoutput(1, atoi(part3));
      setoutputtext(1, myinput);


      Vielen Dank und alles Gute.

      FMR​

      Kommentar

      • FMR
        Azubi
        • 11.04.2019
        • 7

        #4
        Ich habe meinen Code erweitert, um die Aufteilung nach dem Text zu richten.
        Leider ist es mir nicht gelungen, dies automatisch, ganz ohne Eingriff zu machen.
        In den Varianten 1 und 2 sind Fehler, die ich in mehr als 20 Stunden und tausend Korrekturen, nicht gefunden habe!!


        Am besten wäre die erste Variante:
        if(isalpha(Zeichen)) // letztes Zeichen im String finden "ABCD_6023"

        die 2. wäre auch möglich:

        if(Zeichen = Suchen) // nach einem bestimmten Zeichen suchen "_"

        mit der 3. läuft alles perfekt.

        if(Pos < 5) // Position muss von Hand bestimmt werden "5"


        Ich wäre sehr dankbar, wenn mir jemand weiterhelfen könnte.

        FMR

        Kommentar

        • FMR
          Azubi
          • 11.04.2019
          • 7

          #5
          // char *myinput = "ABCD_6023";

          char Zeichen[2];
          char Suchen[2];
          int iLen;

          while (TRUE)
          {
          float enabled = getinput(0);
          char *myinput = getinputtext(0);
          iLen = strlen(myinput);

          // Zeichenkette durchlaufen
          int Pos = iLen;
          Suchen = "_";

          Kommentar

          • FMR
            Azubi
            • 11.04.2019
            • 7

            #6
            Suchen = "_";

            while(Pos >= 0)
            {
            strncpy(Zeichen, &myinput[Pos], 1);

            //if(isalpha(Zeichen)) // letztes Zeichen im String finden "ABCD_6023"
            //if(Zeichen = Suchen) // nach einem bestimmten Zeichen suchen _
            if(Pos < 5) // Position muss von Hand bestimmt werden 5

            {
            break;
            }
            Pos--;
            }

            // Immer ein Zeichen mehr für das terminierende 0-Zeichen vorsehen
            char part1[Pos+2], part2[2], part3[iLen-Pos];

            strncpy(part1, myinput, Pos+1);
            strncpy(part2, &myinput[Pos+1], 1);
            strncpy(part3, &myinput[Pos+2], iLen-Pos-1);

            free(myinput);

            setoutputtext(0, part1);
            setoutput(0, atoi(part2));
            setoutput(1, atoi(part3));

            Klicke auf die Grafik für eine vergrößerte Ansicht

Name: dataurl675059.png
Ansichten: 46
Größe: 12,0 KB
ID: 487873
            leep(100);

            }

            Kommentar

            • loxGigi
              Dumb Home'r
              • 21.09.2025
              • 29

              #7
              Falls Du es nicht ohnehin schon tust, würde ich Dir empfehlen mit picoC lokal zu entwickeln.
              Die Funktionen, die Du benötigst sind vermutlich strstr(), strstrskip() und/oder index(). Such nach diesen Funktionen in dem von Loxone zur Verfügung gestellten pdf.

              Kommentar

              • FMR
                Azubi
                • 11.04.2019
                • 7

                #8
                Angehängte Dateien

                Kommentar

                • loxGigi
                  Dumb Home'r
                  • 21.09.2025
                  • 29

                  #9
                  Noch als kleine Ergänzung/Hilfestellung für Dich:
                  Code:
                  int isAlpha(char c)
                  {
                      if (c >= 'a' && c <= 'z' ||
                          c >= 'A' && c <= 'Z')
                          return true;
                  
                      return false;
                  }
                  
                  
                  char *myString = "ab2AB";
                  int len = strlen(myString);
                  
                  for (int i=0; i<len; i++)
                  {
                      if (isAlpha(myString[i]))
                          printf("%d-te Stelle ist ein Buchstabe\n", i);
                      else
                          printf("%d-te Stelle ist kein Buchstabe\n", i);
                  }

                  Kommentar

                  • FMR
                    Azubi
                    • 11.04.2019
                    • 7

                    #10
                    Besten Dank für das kleine Script. Dies hilft mir sehr.

                    Der Programmablauf und die Funktionen sind für mich kein Problem, aber die Syntax. "", '',%,++, i++, %d, \n
                    Jeder Leerschlag . ; : ({ ,%\ ist wichtig.

                    Zum Beispiel bei:
                    if(Zeichen = Suchen)) oder if(%cZeichen = Suchen)) oder if(%c Zeichen = Suchen))
                    Suchen = "_"; oder Suchen = '_';
                    printf("%d-te Stelle ist ein Buchstabe\n", i); oder printf(" Stelle ist ein Buchstabe ", i); // habe begriffen: " " für Kette ' ' für 1 Zeichen
                    *myString oder myString
                    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') oder ​​​​​​if (c >= "a" and c <= "z" oder c >= "A" && c <= "Z") // ¦¦ für oder && für and​​

                    Bei Loxone findet man nur die Funktionen ohne genauen Ergänzungen.
                    Fast alle Beiträge die ich finde, sind mit Zahlen. Die sind viel einfacher zum Programmieren. a = b/c


                    Auf https://www.c-howto.de/ habe ich endlich ein Video gefunden, das erklärt, wie die Variablen ergänz werden müssen.

                    Suchen = '_' // Suchen = "_" war falsch, ist nur 1 Zeichen und keine Kette
                    if(Zeichen = Suchen) // nach einem bestimmten Zeichen suchen '_'
                    bei Zeichen oder bei Suchen muss ein Fehler sein! // oben in der Angehängte Dateien ist das Skript


                    ​​​​​​​Vielen Dank.

                    FMR​​

                    Kommentar

                    • loxGigi
                      Dumb Home'r
                      • 21.09.2025
                      • 29

                      #11
                      Hier noch eine kleine syntaktische Hilfestellung. Wenn man aus VisualBasic kommt, dann ist das Ganze doch etwas ungewohnt... :-)

                      Code:
                      ...
                      char c;
                      char Suchen = '_';
                      
                      while(Pos >= 0)
                      {
                         c = myinput[Pos];
                      
                         if (isalpha(c))
                         {
                            ...
                         }
                      
                         if(c == Suchen)
                         {
                            ...
                         }
                      
                         if(Pos < 5)
                             break;
                      
                          Pos--;
                      }

                      Kommentar

                      Lädt...