Aufteilen bzw. zerteilen von Chars

  • Was noch wichtig ist zu erwähnen:


    strncpy kopiert zwar Stringteile, fügt aber keine abschließende 0 ein, die für eine Stringterminierung notwendig ist.

    Dieses Beispiel beweist es: https://www.onlinegdb.com/M1kqI5s8_

    Wenn das so wäre, würde nicht „Marburg“ sondern „Mar“ ausgegeben.


    Unten gezeigtes strncpy Beispiel funktioniert, weil die Char Arrays vom Compiler mit 0 initialisiert werden.

    Sollten in einer Variable nacheinander Stringabschnitte unterschiedlicher Länge kopiert werden, muss zusätzlich noch eine 0 als Stringabschluss gesetzt werden.


    Wie das geht, ist unter dem geposteten Link im Beitrag #6 nachzulesen.

    Bei dem Setzen des Index für das Array ist immer daran zu denken, dass bei 0 angefangen wird zu zählen.

    Wird ein Zeichen zu viel kopiert und die vorhandene „Terminierungsnull“ wird überschrieben, kommt es auch zu seltsamen Phänomenen bis hin zum Totalabsturz.


    Es ist natürlich auch möglich einen String mit "memset" immer wieder mit Nullen zu füllen. Das dürfte aber länger dauern, als wenn nur ein stadt[7]= "\0" verwendet wird.

  • Genial, warum auch immer tue ich mich mit dem Thema Stringverarbeitung in C etwas schwer.
    Eure beiden Beiträge helfen mir sehr dabei tiefer ins Thema einzusteigen!
    Ich werde damit mal ein wenig spielen


    Vielen HerzlichenDank!

  • Es geht auch so:


    Code
    1. char input[] = "231374139323533413333343833303130303";
    2. char laenderCode[9];
    3. char nId[19];
    4. int offset[2] = { 0, 21 };
    5. strncpy (nId, input + offset[0], 21);
    6. strncpy (laenderCode, input + offset[1], 6);

    Zumindest wenn die Offsets ab dem Stringteile kopiert werden sollen fest und bekannt sind. In diesem Beispiel habe ich die Offsets in einem int Array gespeichert. Der erste Teil wird vom Zeichen 0 bis 20 (=21 Zeichen) kopiert, der zweite Teil ab dem 21. Zeichen mit 6 Zeichen.


    Kannst auch am Onlinecompiler das Beispiel anschauen: Beispiel


    Nicht verwirren lassen. Das ist "richtiges" C. Dort gibt es ein paar Befehle die es in der Arduino Umgebung nicht gibt (wie printf). Aber es geht ja um das Prinzip des Sting zerpflückens. Dort kannst Du auf die Schnelle probieren (auf Fork klicken).


    Eine Seite die noch mehr Stringoperationen beschreibt ist diese hier: https://arduino-projekte.webnode.at/c-funktionen/

  • Hab es so probiert:



    Bekomme leider eine Fehlermeldung:


    Code
    1. Arduino: 1.8.13 (Windows 10), Board: "WiFi Kit 32, Disabled, 240MHz (WiFi/BT), 921600, None"
    2. ascii:8:7: error: expected constructor, destructor, or type conversion before '(' token
    3. memset(laenderCode, 0, sizeof(laenderCode)); // ganzes Array mit 0x00 füllen, klar eigentlich müsste man lediglich das letzte Zeichen mit 0x00 setzen
    4. ^
    5. ascii:9:7: error: expected constructor, destructor, or type conversion before '(' token
    6. memcpy(laenderCode, input + StartPos, Lenlaendercode); // kopieren
    7. exit status 1
    8. expected constructor, destructor, or type conversion before '(' token
  • Hallo Pius,


    vielen lieben Dank für die ausführliche Erklärung!
    Ich versuche mal das umzusetzen. memcpy hatte ich gar nicht auf dem Schirm. Ist immer schwierig die richtigen Suchbegriffe für Google zu finden ☺️

    Werde mein Ergebnis später posten


    Grüße

    Mike

  • Hallo Mi Ke


    leider ist mein PC noch nicht ganz fertig installiert, weshalb ich dir nur eine "theoretische" Antwort liefern kann.


    char input[] = "231374139323533413333343833303130303";Diese Zeile legt ein Array von char's an, am Ende abgeschlossen mit einem 0x00, damit C es als Zeichenkette behandeln kann.Der Zugriff auf ein einzelnes Zeichen im Array kann immer mit dem Index erfolgen (0 - len-1)char n = input[0]; // liefert das erste Zeichen des Arrays hier ein ASCII '2'

    char laenderCode[9]; // anlegen eines neuen Arrays (Länge 7 würde reichen)


    int Lenlaendercode = 6; // Du willst nur 6 Zeichen

    int StartPos = 21; // hoffentlich habe ich richtig gezählt


    Um den Ländercode aus dem input Array zu kopieren musst musst du 6 Zeichen ab der Poistion 21 lesen/kopieren

    und dies müsste etwa so funktionieren:


    memset(laenderCode, 0, sizeof(laenderCode)); // ganzes Array mit 0x00 füllen, klar eigentlich müsste man lediglich das letzte Zeichen mit 0x00 setzen

    memcpy(laenderCode, input + StartPos, Lenlaendercode); // kopieren

    // destination, source, number of byte to copy


    Nun müsstest du den Ländercode im Array laenderCode haben.

    vielleicht hilft dir das, andernfalls melde dich wieder hier.

    Gruss

    Pius

  • Könnt ihr mir erklären wie ich einen Char in mehrere Variablen aufteilen kann?

    Ich möchte dies anhand der Position bzw. Stelle machen. Sprich ab Stelle x bis y wird in Variable Z gespeichert.

    Im Internet finde ich nur Beispiele und Funktionen wo nach einem Zeichen. gesucht wird welches dann als Trenner dient.


    Code
    1. char input[] = "231374139323533413333343833303130303";
    2. char laenderCode[9];
    3. char nId[19];

    231374139323533413333343833303130303


    31374139323533413333 = nID

    343833 = laenderCode