Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Verständnisproblem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.04.2007, 15:51 Uhr
~newbo
Gast


Servus,

ich habe ein Verständnisproblem:

- ich lese zeilenweise eine Datei ein:

C++:
getline(ifl, tmp1);



diese soll mittels

C++:
std::strncpy(p, tmp1.c_str(), tmp1.size());



nach p kopiert werden.
Die längste Zeile der Datei ist 38 Zeichen lang.

Mittels:

C++:
char p[38];


funktioniert das auch.

Nehme ich jetzt:

C++:
char *p = new char[38];
//oder
char *p = new char[tmp1.size()];


dann hängt er ans Ende noch einige Zeichen ran.

Bin leider noch nicht hinter des Rätsels Lösung gekommen und dachte, ich frage hier mal an.

Danke und Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.04.2007, 16:57 Uhr
Blubber2063



Du vergisst das C Strings 0 terminierend sind, also immer Zeichenlänge+1;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.04.2007, 11:20 Uhr
~newbo
Gast


Hi,

sorry hatte ich vergessen zu schreiben, habe es auch mit +1, -1, +10, -10 mal probiert, aber der kopierte String ist immer Müll.

char *p = new char[38] scheint sinngemäß nicht gleich char p[38] zu sein und meine Frage wäre, warum dies so ist.

Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.04.2007, 12:15 Uhr
ao

(Operator)


Wo wird das char p[38] deklariert, als lokale Variable in einer Funktion oder global außerhalb?

Globale Variablen werden beim Programmstart mit Nullen initialisiert, und wenn sie dann teilweise mit String-Daten gefüllt werden, bleibt am Ende immer mindestens ein 0-Zeichen übrig -> sauber terminierter String.

Lokale Variablen werden nicht automatisch initialisiert, enthalten also zufällige Daten.

Das Problem liegt im Verhalten von strncpy, siehe hier: www.cppreference.com/stdstring/strncpy.html


Zitat von C++-Referenz:

The strncpy() function copies at most count characters of from to the string to. If from has less than count characters, the remainder is padded with '\0' characters.


... und wenn nicht, dann nicht. Dann werden count Zeichen kopiert und kein Terminator eingefügt. D.h. du musst dich selbst drum kümmern.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.04.2007, 23:25 Uhr
~newbo
Gast


Hallo,

danke für die Anregungen. Ich habs jetzt mal ohne initiale Größe probiert. Also wie folgt:

C++:
char *p = new char[];
std::strncpy(p, tmp1.c_str(), tmp1.size());
p[tmp1.size()] = '\0';



Das hat auf jeden Fall den gewünschten Erfolg gebracht.

Zitat von ao:

Lokale Variablen werden nicht automatisch initialisiert, enthalten also zufällige Daten.



Danke und Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.05.2007, 01:55 Uhr
Blubber2063



Also du solltest das mit dem nicht initialisieren der Größe besser lassen, selbst wenn der Compiler das schluckt hast du hier trotzdem nur einen begrenzten Speicherbereich, ist dein String größer schreibst du in Speicher der dir nicht gehört, das kann unberechenbare Folgen haben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.05.2007, 03:08 Uhr
0xdeadbeef
Gott
(Operator)



C++:
char *p = new char[];


Das kauft dein Compiler dir ab? Völliger Unfug, sowas.

Sinnvollerweise würd ich hier im Zweifel char* garnicht benutzen, aber wenns denn unbedingt sein muss,

C++:
char *p = new char[tmp1.size() + 1]; // Sentinel nicht vergessen
std::strcpy(p, tmp1.c_str());


...denn du weißt ja schon, dass genug Speicher da ist. Ansonsten,

C++:
std::strncpy(p, tmp1.c_str(), tmp1.size() + 1); // Sentinel auch hier nicht vergessen


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.05.2007, 20:49 Uhr
~newbo
Gast


Servus,


Zitat von 0xdeadbeef:

Das kauft dein Compiler dir ab? Völliger Unfug, sowas.


Ja, das macht er leider.

Die strcpy - Variante ist super. Ich war mit der vorigen Lösung auch nicht so zufrieden.

Danke und Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: