Forum: Compiler & IDEs Strings allgemein


von Martin.. (Gast)


Lesenswert?

Hallo,
aus Delphi bin ich gewohnt, einen String so zu erstellen un zu
verwenden:

var test: string;
...
test := 'hallo';
test := 'welt';
...

Final steht also 'welt' in test. Wenn ich das jetzt in C machen will,
ist mir nicht ganz klar, wie ich das am effektivsten lösen soll.

char test[10] = 'hallo';
char test[10] = 'welt';

char *p_test = test;

Muss ich da, wenn ich test verändern will, immer das char
davorschreiben?
Gruß
Martin

von Peter Sager (Gast)


Lesenswert?

// Initialisierung:
// Double "Quotes" für Strings
// Single 'Quotes' für einzelne Chars
char test[10] = "hallo";

// String kopieren (zuweisen)
// normalerweise in ANSI-C:
strcpy(test, "welt");

// Für AVR-GCC, damit "welt" direkt aus dem FLASH
// geladen wird und kein RAM verschwendet wird
strcpy_P(test,PSTR("welt"));

MfG  Peter

von Peter Sager (Gast)


Lesenswert?

Noch was:

Wenn Du char davorschreibst, wird glaub stets ein neuer String
deklariert.

Mit single 'Quotes' wird soviel ich weiss, kein Stringend 0x00 am
Schluss angehängt, mit double "Quotes" schon.

Bin mir aber in beiden Punkten nicht ganz sicher, da ich auch noch kein
C-Experte bin, wer es genauer weiss, soll mich doch bitte korrigieren
falls ich einen Mist angegben habe!

Gruss

von Simon K. (simon) Benutzerseite


Lesenswert?

Schon ganz gut.

Soweit stimmt das. "..." bezeichnet immer einen String mit einer 0 am
Ende. d.h. "Hallo" benötigt 6 bytes im flash. mit 'x' wird einem
byte ein Wert zugewiesen, und zwar der ASCII-Code von x. Lässt sich mit
der Funktion ASC(yyy) aus Basic vergleichen.

PS: Es gibt noch die Fkt. strcat(*p1,*p2); womit man hinter den ersten
string einen zweiten anhängt.

von Simon K. (simon) Benutzerseite


Lesenswert?

Gerade noch was aufgefallen.
Bei der Anweisung
char temp[5] = "Hallo";
sorgt der Compiler dafür, dass der String nicht länger als 5 Zeichen
ist. Leider fehlt dann die Null.. Bis ich den Fehler mal lokalisiert
habe. hehe

Naja, die zweite, von mir vermutete, Variante wäre gewesen, wenn er
einfach weiter geschrieben hätte im Speicher. Aber ich glaube das hätte
die gleichen unvorhersehbaren Fehler verursacht.

von Peter Sager (Gast)


Lesenswert?

Hmmmm....

Ich vermute, dass der Compiler die Null trotzdem beifügt, und einfach
über den Speicher hinausschreibt! Gut möglich dass die nächste Variable
im RAM undefiniert deklariert wird, und somit vom Compiler ebenfalls mit
Null initialisiert wird....


Kann ganz schön Tricky werden, solche Fehler beim debuggen zu
lokalisieren...   ;o))

Gruss von mir!

von Simon K. (simon) Benutzerseite


Lesenswert?

Hm stimmt!
Der Compiler schreibt sie über das Feld hinaus, aber der erste
Buchstabe der nächsten String Konstante überschreibt die 0 wieder.

Auch einleuchtend.

Joo, schade eigentlich. Wenigstens HIER könnte der Compiler doch ma
meckern, bezüglich überschrittene Feldgrössen :D

von Karl H. (kbuchegg)


Lesenswert?

Ratet nicht.

Wenn Du machst:

char temp[5] = "Hallo";

Dann wird ein char Array der Laenge 5 angelegt, dass
mit den Charactern 'H', 'a', 'l', 'l', 'o'  gefuellt
wird. Die abschliessende '\0' unterbleibt. Steht so
im Standard und muss so sein.

Wenn Du machst:

char temp[5] = "Hallo World";

Dann meckert der Compiler, dass die Inititalisierung
groesser ist als das Array. Also genau das was Du haben
moechtest.

von Simon K. (simon) Benutzerseite


Lesenswert?

Danke für die Info!

von Simon K. (simon) Benutzerseite


Lesenswert?

Würde auch bestätigen dass bei
char temp[5]="Hallo"

folgendes in der .lst datei stand:
.ascii "Hallo"

und bei char temp[6]="Hallo"

stand dort
.string "Hallo"

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.