Bestimmten Bereich aus einem String auslesen in C

OP #5740086
Hallo,
ich habe mich hier gerade neu angemeldet. Hoffe, dass ich hier richtig 
mit meinem Thema bin :)
habe schon alle möglichen Seiten im Internet durchsucht, bin aber leider 
nicht fündig geworden.
Habe vor kurzem angefangen mich mit der Programmiersprache C zu 
befassen.

Ich habe folgendes vor.

Ich habe einen UDP Server gebastelt und möchte den ankommenden String

String = "aaabbbcccdddeeefff"

in Einzelteile zerlegen.

Es sollen...

String1 = "aaa"
String2 = "bbb"
String3 = "ccc" usw. zugeordnet werden.

Ich kriege das einfach nicht gebacken. Hoffe mir kann hier jemand 
helfen.
OP
Danke für die Antworten!

habe das jetzt folgendermaßen gelöst.

    char String[100]="abc:def:ghi:jkl";
    char delm[5]=":";

    char *s1;
    char *s2;
    char *s3;
    char *s4;

    s1 = strtok(String, delm);
    s2 = strtok(NULL, delm);
    s3 = strtok(NULL, delm);
    s4 = strtok(NULL, delm);

    printf("%s\n", s1);
    printf("%s\n", s2);
    printf("%s\n", s3);
    printf("%s\n", s4);

ist vielleicht nicht die eleganteste Lösung, aber funktioniert.
Ich weiß nicht wie genau du die Doku gelesen hast, aber folgende Dinge 
sollten dir bewusst sein.

strtok ändert String und fügt \0 Zeichen ein. Wenn du am Ende ein printf 
von String machst könnte das Ergebnis überraschend sein.

Gibt es weniger als 3 Trennzeichen, dann sind die sX Pointer zum Teil 
Null. Für printf ist das Verhalten dann undefiniert, es darf also jeder 
Compiler machen was er will.
OP
Folgeadermassen funktioniert es auch...

    char stt[100]="abcdefghijkl";
    char st1[5]="";
    char st2[5]="";
    char st3[5]="";
    char st4[5]="";

    strncpy(st1, stt, 3);
    strncpy(st2, stt+3, 3);
    strncpy(st3, stt+6, 3);
    strncpy(st4, stt+9, 3);

    printf("%s\n", st1);
    printf("%s\n", st2);
    printf("%s\n", st3);
    printf("%s\n", st4);

Ich sehe mich eher als Programmieranfänger, deswegen habe ich mich auch 
hier angemeldet ;)

Wenn jemand eine bessere Idee hat, dann möge er sie bitte mitteilen.
OP
ist das so richtig?

    char stt[100]="abcdefghijkl";
    char st1[5]="";
    char st2[5]="";
    char st3[5]="";
    char st4[5]="";

    strncpy(st1, stt, 3);
    strncpy(st2, stt+3, 3);
    strncpy(st3, stt+6, 3);
    strncpy(st4, stt+9, 3);

    st1[3] = '\0';
    st2[3] = '\0';
    st3[3] = '\0';
    st4[3] = '\0';

    printf("%s\n", st1);
    printf("%s\n", st2);
    printf("%s\n", st3);
    printf("%s\n", st4);
Gast
1
     char str[]="aaabbbcccddd";
2
     
3

4
     char substr[3][4];
5
 
6
     for(size_t i=0; i<3; i++)
7
         snprintf(substr[i], 4, "%.3s", str+i*3);
8
 
9
     for(size_t i=0; i<3; i++)
10
        printf("%s\n", substr[i]);
Gast
Wilhelm V. schrieb:
> Bis jetzt habe ich mit Pascal und python programmiert, aber C ist echt
> eine andere Hausnummer muss ich sagen

Warum tust Du Dir denn das an? Mit C kannst Du nicht mehr, nur 
komplizierter! Ist es beruflich und hast keine andere Wahl? C wurde 
damals erfunden um:

- wenig Speicher zu benötigen
- absichtlich kompliziert zu sein

Und es gibt heute keinen Grund mehr, sich damit zu quälen. Hier im Forum 
ist es sogar sehr gefährlich eine Frage bezüglich C zu stellen, oder die 
Programmiersprache auch nur in Frage zu stellen!

Glaubst Du mir nicht? Schau Dir die Bewertungen zu diesem Beitrag in 
einer Stunde an!

Hier wollen sich ein paar Leute nur profilieren, wie gut sie denn C 
können!

Gruss Chregu
Gast
Nimm doch C++. Dort gibt es std::string mit nützlichen Funktionen. Auch 
die Allozierung ist einfacher, weil sich der String dynamisch anpasst.

Statt gcc einfach g++ nehmen, und gut ist es.
Gast
Christian M. schrieb:
> Und es gibt heute keinen Grund mehr, sich damit zu quälen.

Da möchte ich doch darauf hinweisen das dieser Kommentar sowohl off 
topic als auch redundant ist da dieses Thema in vielen Diskussionen im 
Forum erschöpfend behandelt wurde.
Gast
HyperMario schrieb:
> PittyJ schrieb:
>> Nimm doch
>
> irgendwas anderes was null mit der Frage zu tun hat. Z.B. verschieden
> lange Mikadostäbchen. Die sortieren in Echtzeit ohne Strom Tastatur,
> Bildschirm oder Prozessor.

Wer C hat der hat auch C++. Warum also nicht die verbesserten C++ 
Bibliotheken benutzen. Das erspart Zeit und Ärger.
M.K. B. schrieb:
> strtok ändert String und fügt \0 Zeichen ein.

Ja, das ist sehr elegant und Speicher sparend. In der Regel braucht man 
den Empfangsstring nach dem Parsen ja nicht mehr.
Vorteilhaft ist auch, daß weitere Parserschritte ohne Pointerübergabe 
erfolgen können. strtok() merkt sich intern den letzen Pointer.
OP
Christian M. schrieb:
> Warum tust Du Dir denn das an? Mit C kannst Du nicht mehr, nur
> komplizierter! Ist es beruflich und hast keine andere Wahl? C wurde
> damals erfunden um:
>
> - wenig Speicher zu benötigen
> - absichtlich kompliziert zu sein

Ich mache das Hobbymäßig und ich liebe Herausforderungen ;)
Mein Projekt zur Zeit ist ein Raspberry Pi Roboter, den ich per UDP 
Client (Handy App), den ich mit Android Studio gebastelt habe steuere.

Warum habe ich mich für C entschieden?

Nun ja, ich habe mir mit C einen UDP Server gebastelt und im Vergleich 
zu dem Server gestellt, den ich mit Python programmiert habe. Beim 
testen habe ich festgestellt, dass der Server den ich mit C programmiert 
habe deutlich schneller läuft als der mit Python programmierte. 
Seltsamerweise ist es so, dass je mehr Nachrichten an den UDP Server 
(Python) ankommen, desto langsamer wir er.

Kann auch sein, dass ich vielleicht auch was nicht 100%ig beim Python 
Server optimiert habe, obwohl ich es eigentlich in allen möglichen 
Variationen getestet habe.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.