Forum: Compiler & IDEs Bestimmten Bereich aus einem String auslesen in C


von Wilhelm V. (unixx1)


Lesenswert?

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.

von jemand (Gast)


Lesenswert?

In C gibt es keine Strings, nur char arrays.

Auf die kannst du zugreifen, wie auf alle Arrays.

https://stackoverflow.com/questions/6679204/how-to-get-substring-in-c/6679254

von M.K. B. (mkbit)


Lesenswert?

jemand schrieb:
> Auf die kannst du zugreifen, wie auf alle Arrays.

Oder die entsprechenden Hilfsfunktionen für Strings verwenden. Diese 
gehen aber davon aus, dass ein String mit \0 terminiert ist.

https://en.cppreference.com/w/c/string/byte

von Wilhelm V. (unixx1)


Lesenswert?

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.

von M.K. B. (mkbit)


Lesenswert?

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.

von Wilhelm V. (unixx1)


Lesenswert?

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.

von leo (Gast)


Lesenswert?

Wilhelm V. schrieb:
> strncpy(st1, stt, 3);

Die "Strings" st[1..4] sind dann aber nicht null-terminated.

leo

von Wilhelm V. (unixx1)


Lesenswert?

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);

von leo (Gast)


Lesenswert?

Wilhelm V. schrieb:
> st1[3] = '\0';

Yep, das brauchts.

leo

von leo (Gast)


Lesenswert?

leo schrieb:
> Wilhelm V. schrieb:
>> st1[3] = '\0';
>

BTW: bessere Varianten:
1
     n = strlcpy(dst, src, len);
2
     n = snprintf(dst, len, "%s",  src);

leo

von zitter_ned_aso (Gast)


Lesenswert?

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]);

von zitter_ned_aso (Gast)


Lesenswert?

zitter_ned_aso schrieb:
> char substr[3][4];


ddd habe ich übersehen ;-)

von Wilhelm V. (unixx1)


Lesenswert?

Cool, danke für die Antworten!

Bis jetzt habe ich mit Pascal und python programmiert, aber C ist echt 
eine andere Hausnummer muss ich sagen XD

Werde weiter mit C rumexperimentieren.

LG

von Christian M. (Gast)


Lesenswert?

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

von PittyJ (Gast)


Lesenswert?

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.

von HyperMario (Gast)


Lesenswert?

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.

von HyperMario (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Wilhelm V. schrieb:
> strncpy(st1, stt, 3);

Die Variante mit Delimiter und strtok() ist eindeutig vorzuziehen. Damit 
ist die Länge der Teilstrings variabel. Natürlich muß man den 
Rückgabewert von strtok() testen, ob es Erfolg hatte.

von PittyJ (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Wilhelm V. (unixx1)


Lesenswert?

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.

von Jemand (Gast)


Lesenswert?

Peter D. schrieb:
> Vorteilhaft ist auch, daß weitere Parserschritte ohne Pointerübergabe
> erfolgen können. strtok() merkt sich intern den letzen Pointer.

In anderen Kreisen wird das als grottiges Softwaredesign bezeichnet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.