mikrocontroller.net

Forum: Compiler & IDEs Strings allgemein


Autor: Martin.. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Sager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Sager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Sager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.