Wie Teilstrings aus String bekommen???



  • Hallo!

    Ich bin schon ganz verzweifelt! - Ich möchte einen (numerischen) String, den ich über USART im µC einlese, in Teilstrings zerlegen und diese dann in int umwandeln.

    Prinzip:

    char ganzerstring[10];
    char teilstring1[2]

    scanf("%s",ganzerstring);

    teilstring1=ganzerstring(1-2); // Zeichen 1 und 2
    integer1=atoi(teilstring1);
    usw.

    Trotz intensiver Recherche habe ich jedoch keine Möglichkeit gefunden, Teilstrings aus einem String zu extrahieren.

    Außerdem: Nach diversen Totorial sollte es korrekterweise scanf("%s",&ganzerstring); heißen. Da meldet Codevision jedoch einen Fehler.

    Als Behelfslösung habe ich in Büchern gefunden:

    scanf("%2s %2s %2s %2s %2s",teilstring1,teilstring2,...);

    Dies führt jedoch dazu, dass dem ersten string der gesamte String zugewiesen wird, dem zweiten der gesamte string minus teilstring 1, dem nächste string: alles minus voriger usw.

    Vielen Dank !!!



  • scanf("%s",&ganzerstring); ist falsch.

    Um einen Teilstring zu kopieren, kannst du strncpy verwenden.

    char buffer1[128] = {0}, buffer2[128] = {0};
    char *text = "Hallo";
    
    strncpy(buffer1, text, 3);
    strncpy(buffer2, text + 2, 3);
    

    buffer1 sollte jetzt den String "Hal" beinhalten, buffer2 den String "llo".



  • Wenn die Teilstrings ohnehin zu Integer umgewandelt werden sollen, würde ich auch in Betracht ziehen, den Gesamtstring nach Int zu wandeln, und die (offensichtlich zweistelligen) Teilinteger mittels Schleife, /10 und %10 zu extrahieren. Könnte evtl. schneller sein.



  • beta4881 schrieb:

    teilstring1=ganzerstring(1-2); // Zeichen 1 und 2

    so wird das nicht funktionieren weil

    -du musst 3 byte speicherplatz reservieren (+1 für NUL wenn du die ersten beiden zeichen haben willst) also:

    char teilstring[3];
    

    -mit strncpy musst du diese dann anhängen, also

    strncpy(teilstring,ganzerstring,2);
    

    bzw. teilstring[0]=0; und dann per

    strncat(teilstring,ganzerstring,2);
    

    anhängen.



  • TactX schrieb:

    Wenn die Teilstrings ohnehin zu Integer umgewandelt werden sollen, würde ich auch in Betracht ziehen, den Gesamtstring nach Int zu wandeln, und die (offensichtlich zweistelligen) Teilinteger mittels Schleife, /10 und %10 zu extrahieren. Könnte evtl. schneller sein.

    oder so (für zweistellige zahlen)

    #define GET_NUMBER(p) (10*(*(p)-'0')+*((p)+1)-'0')
    ...
    char *s = "1234567890";
    printf ("%d\n", GET_NUMBER(s+7));  // die 89 extrahieren
    ...
    

    könnte sogar noch schneller sein 😉



  • Stimmt.



  • ten schrieb:

    könnte sogar noch schneller sein 😉

    am schnellsten meinst du wohl, denn jeder *gescheite* compiler evaluiert bei stringkostanten diesen makrocode gleich zur compile time.



  • c.rackwitz schrieb:

    ten schrieb:

    könnte sogar noch schneller sein 😉

    am schnellsten meinst du wohl, denn jeder *gescheite* compiler evaluiert bei stringkostanten diesen makrocode gleich zur compile time.

    richtig, und bei variablen strings wird raketenmässig schneller und kurzer code erzeugt. so ein makro sieht zwar hässlich und unlesbar aus, aber man kann sich dran gewöhnen.
    (jedenfalls wenn man schwachbrüstige microcontroller beharkt und ähnliche makros öfter coden muss) 😉



  • Ich danke euch für die kompetente und rasche Hilfe! Das hat mich eine ganze Ecke weitergebracht!



  • beta4881 schrieb:

    Ich danke euch für die kompetente und rasche Hilfe! Das hat mich eine ganze Ecke weitergebracht!

    kein problem, dafür sind wir ja da 😉



  • Hallo!
    Ich habe folgendes Problem:
    In meinem Programm erhalte ich einen String der so aussieht: "Datum;Nutzer;"
    In einem Unterprogramm wollte ich jetzt mittels While-schleife die einzelnen Daten aus dem String extrahieren.
    In der Schleife habe ich einen String mit result, indem ich die aktuelle Info ablegen wollte. Jedoch erhalte ich folgendes:
    Ist das Datum kürzer als der Nutzername, dann wird beim Schleifendurchlauf (wenn der Nutzer extrahiert wird) an den Nutzernamen einfach die übrigen Zeichen des Datums angehängt.
    Bsp: "01.07;Bene" --> "01.07" , "Ben07"
    Muss ich irgendwas beachten? sollte ich den String löschen? aber wie?
    Wenn ich mit null den string "lösche", dann kann das kopieren nicht gehen, oder?

    Wäre nett, wenn ihr mir helfen könntet.
    mfg Bene



  • die funktion, die in den string result schreibt (oder erst recht wenn du einfach nur zeichen für zeichen einliest) schliesst den string anscheinend nicht mit '\0' ab. da das nächste NUL zeichen im speicher eben hinter "07" folgt wird eben bis dahin ausgegeben. du musst also entweder den string von hand abschliessen

    string[n]=0;
    

    oder du verwendest funktionen wie strncat die das von allein tun. du könntest auch vor jedem einlesen per memset alle zeichen auf '\0' setzen und dann zeichen für zeichen einlesen und (sofern das letzte element nicht überschrieben wird) brauchst du dir um die nullterminierung keine sorgen mehr zu machen.



  • Vielen Dank!

    Habe es gerade ausprobiert, und es hat wunderbar geklappt!

    Danke
    mfg Bene


Anmelden zum Antworten