- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: String initialisieren ohne 0 ?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    char s3[5] = {'H','a','l','l','o'}; ist doch bis auf die Schreibweise genau das gleiche, wie

    char s2[5] = "Hallo";

    und beides ist nicht empfehlenswert. Alle stringverarbeitenden Funktionen erwarten eine Nullterminierung. Falls du so eine Funktion benutzt, kann das in unerwartetem/unvorhersehbarem Verhaten enden, was auf einem µC besonders schlimm ist, da er entweder einen Reset macht oder du ihn evtl. zerschießen könntest.

    EDIT: Erster Post im neuen Forum
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    42
    Beiträge
    1.780
    Zitat Zitat von _R2D2 Beitrag anzeigen
    char s3[5] = {'H','a','l','l','o'}; ist doch bis auf die Schreibweise genau das gleiche, wie

    char s2[5] = "Hallo";
    Nein.
    Bei meiner Variante wird keine \0 angehängt, bei der anderen schon.

    {'H','a','l','l','o'} sind für den Compiler einfach nur 5 einzelne Zeichen, "Hallo" hingegen ist ein nullterminierter String.
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Zitat Zitat von Felix G Beitrag anzeigen
    Nein.
    Bei meiner Variante wird keine \0 angehängt, bei der anderen schon.

    {'H','a','l','l','o'} sind für den Compiler einfach nur 5 einzelne Zeichen, "Hallo" hingegen ist ein nullterminierter String.
    exakt, denn char s[n] ist nur ein array und kein string im eigentlichen sinn, bei der variante mit den anführungszeichen jedoch interpretiert er nur den anfang des arrays und wird VERMUTLICH das nachfolgende byte mit einer 0 versehen ... die problematik die ich angesprochen habe bezog sich auch eher auf die spätere verwendung, wobei die terminierende 0 zufällig erhalten werden KÖNNTE aber auch durch eine andere variable verändert werden KÖNNTE ... und das wie oben schon gesagt zum controller absturz füren kann
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    18.03.2011
    Beiträge
    8
    naja.... ob er jetzt Strings nutzt oder nicht, ist ihm überlassen - wenn er weiß, dass es x Zeichen sind, kommt er auch ohne \0 aus...
    statt vergleiche solange bis \0 in einem String erreicht kann man auch irgendwie sowas machen...

    //a sei die Eingabe, b sei das fest gespeicherte, x sei die bekannte Länge von b
    for (i = 0; i < x; i++) {if (a[i] != b[i]) || (a[i] == '\0') return false;}
    if (a[x] != '\0') return false;
    return true;

    AAAAABäääääär für die Eingabe der Daten:
    pass bei C-Code auf, man weiß nie, ob alle Compiler (Windows/Linux/..., offiziell/alternative/...) die Spezifikationen perfekt einhalten...
    nicht dass ein Compiler meckert, weil es für ihn 6 Zeichen sind, einer das einfach richtig abarbeitet (\0 wegschmeißen) und ein anderer es verbockt es (hängt \0 an und verschiebt alles)
    (letztens erst nen Compiler geschrieben, man glaubt nicht was eine Umstellung an der Spezifikation bewirken kann)

    also lieber statt "Hallo", was zurechtgeschnitten werden müsste,
    ein sauberes {'H',...,'o'}, das Char[] einfach als Byte[] interpretiert...

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Naja, dann kann man das Programmieren auch gleich sein lassen, wenn man sich nicht auf die Sprachspezifikation stützen (kann). Der Standard sagt klar aus, dass nur der Speicher des Arrays beschrieben wird, alles andere ist ein Fehler im Compiler.

    mfG
    Markus

    PS: http://www.dclc-faq.de/kap5.htm#5.20

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests