INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bin ich zu blöd für c-Strings?
08.12.2020, 13:23
Beitrag #1
Bin ich zu blöd für c-Strings?
Hallo zusammen,

ich habe verstanden, dass ich bei der C++-Programmierung insbesondere für µC lieber auf c-Strings als auf die String-Klasse setzen soll. Ich bin einverstanden!

Leider scheine ich damit die einfachsten Dinge nicht hinzubekommen. Ich plage mich heute mit folgender Problematik:

Ich habe ein Array von char* in der Form:

Code:
char *myarray[50] = {"abc", "xyz", ........ "123"};

An einer bestimmten Programmstelle möchte ich beispielsweise den Eintrag an Position 47 ändern. Der neue c-String heißt pathStr und liegt mir dabei als Ergebnis der c_str()-Funktion und damit als const char* vor.

Wie kriege ich diesen String in das Array an Position 47?

In meinem Code wollte ich strcpy verwenden ... führt aber leider zu einer Core Panic

Code:
const char *pathStr = myStringVariable.c_str();
char *pathstr;
strcpy(pathstr, pathStr);
myarray[47] = pathstr;

Er lässt sich kompilieren ... aber zur Laufzeit macht's BANG

Ich mache sicherlich ein bis zwei grauenhafte Fehler. Aber welche?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 13:59 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2020 14:09 von MicroBahner.)
Beitrag #2
RE: Bin ich zu blöd für c-Strings?
(08.12.2020 13:23)devnull69 schrieb:  
Code:
char *pathstr;
strcpy(pathstr, pathStr);
Du definierst dir einen Pointer pathstr. Damit hast Du aber noch keinen Ram-Speicher für einen c-string reserviert. Nach dem Anlegen des Pointer steht da erstmal NULL drin. Und da willst Du dann etwas hinkopieren. Das kann nur krachen. Du must auch Platz für den string reservieren, z.B.
Code:
char pathstr[20];
Du musst natürlich dabei auch sicherstellen, dass der Platz groß genug ist für deine Zeichenkette.
N.B Mischen von String und c-string ist auch keine gute Idee. Wenn dann auch konsequent.


Ausserdem schaufelst Du dir schon jetzt deine Fallgruben für die Zukunft, wenn Du verschiedene Variablen definierst, die sich nur durch Groß/Kleinschreibung eines Buchstaben unterscheiden. Damit sind Verwechslungen/Tippfehler und nur extrem schwierig zu findende Fehler vorprogrammiert. Der Compiler wird dir dabei nicht helfen, denn der ist immer mit beiden Varianten zufrieden.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 14:08
Beitrag #3
RE: Bin ich zu blöd für c-Strings?
Ah na klar ... jetzt weiß ich wieder, warum ich schon zu Studentenzeiten mit dem "Pointer-Kram" auf Kriegsfuß war. Mittlerweile lobe ich mir Java und C# ... aber gut, dass ich da mal wieder durchsteigen muss.

So geht's dann natürlich:

Code:
const char *pathStr = myStringVariable.c_str();
char *pathstr = (char*) malloc(pathStr.length());
strcpy(pathstr, pathStr);
myarray[47] = pathstr;

Ja, das mit den Variablennamen ist nur ein Übergangszustand zum Testen (jaja ... daraus werden oft Dauerzustände, ich weiß)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 14:13 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2020 14:16 von MicroBahner.)
Beitrag #4
RE: Bin ich zu blöd für c-Strings?
Ok, so ist sichergestellt, dass der String auch reinpasst ( berücksichtigt pathStr.length() das \0 am Ende? ).
Aber mit malloc/free solltest Du auf den kleinen Arduinos vorsichtig sein. Das ist ja auch das Problem der String-Klasse, weil die da großzügig mit umgeht. Solange Du nur mit malloc was reservierst, dass Du dann nie wieder freigibst - ok.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 14:24
Beitrag #5
RE: Bin ich zu blöd für c-Strings?
(08.12.2020 14:13)MicroBahner schrieb:  ( berücksichtigt pathStr.length() das \0 am Ende? ).
Nö, macht es nicht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 15:32
Beitrag #6
RE: Bin ich zu blöd für c-Strings?
(08.12.2020 14:24)Tommy56 schrieb:  Nö, macht es nicht.
Also im Prinzip noch schlimmer als vorher - da hat's wenigstens gleich geknallt.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 15:36
Beitrag #7
RE: Bin ich zu blöd für c-Strings?
Wie Du schon richtig angemerkt hast, die Vermischgung von Strimg und c-Strimg führt irhendwann ins Chaos, wenn man das dann noch mit malloc paart, kann es nur noch schief gehen.

Klare Festlegung der zu erwartenden Längen, daraus resultierend genau definierte char-Arrays und Begrenzung von Eingaben auf Länge dieser Arrays ('\0' berücksichtigen) ist der zu empfehlende Weg.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 16:30
Beitrag #8
RE: Bin ich zu blöd für c-Strings?
Jo ... würde so lange gutgehen, bis die Stringlänge unvorhersehbar flexibel ist (dynamisch generierte URLs in meinem Fall). Da könnte ich evtl. eine Maximallänge herausfinden, vielleicht gehe ich in diese Richtung.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Strings verketten TGL 7 527 28.11.2020 16:13
Letzter Beitrag: TGL
  Splitten von Strings reinhard-adam 4 495 06.10.2020 17:13
Letzter Beitrag: Tommy56
  Umwandlung eines Strings in ein time_t-Objekt jalu4601 1 865 02.01.2020 10:56
Letzter Beitrag: RolandF
  Strings erstellen und vergleichen BennIY 4 4.877 22.06.2016 10:37
Letzter Beitrag: SkobyMobil
  viele Strings in "Datenbank" - wie am besten?? DL1AKP 2 2.284 30.03.2015 11:49
Letzter Beitrag: DL1AKP

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste