Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » strncpy kleines Problem

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 < [ 2 ]
000
19.08.2004, 09:30 Uhr
pin



Wenn ich 2 char arrays habe z.B. char test[8],test2[8],

und will den inhalt von test2 in test rein kopieren also die zeichen 0-7 (sind ja 8 Zeichen)

Strncpy 1. Version:

strncpy(test,test2,8); //werden hier die Zeichen 0-7 kopiert und '\0' automatisch gesetzt ?


Strncpy 2.Version

strncpy(test,test2,7); //oder werden hier die Zeichen 0-7 kopiert und '\0' automatisch gesetzt ?

Villeicht kann mir jemand das erklären. Danke im voraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.08.2004, 09:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein, strncpy ist eine ganz dicke Falle, weil es den String nicht immer null terminiert:

C++:
char x[8]; // Platz für 7+1 Zeichen.
strncpy(x, "01234567", sizeof(x)); // Terminiert nicht!



Ich empfehle folgendes:

C++:
char x[8]; // Platz für 7+1 Zeichen.
strcpy(x, ""); // alternativ: x[0] = 0;
strncat(x, "01234567", sizeof(x)); // Terminiert: String nun "0123456"+NullByte


strncat Terminiert den String nämlich jedenfalls.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.08.2004, 09:59 Uhr
pin



würde das auch gehen wenn ich direkt nur strcpy nehme oder terminiert das auch nicht.

also

char x[8];
strcpy(x,"01234567");
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.08.2004, 10:04 Uhr
virtual
Sexiest Bit alive
(Operator)


@pin
Der Witz von strncpy wäre ja gewesen, daß es die Länge des Zielbuffers berücksichtigt. Das ist bei strcpy nicht der Fall: Dein Biepiel schreibt um ein Byte zuviel in x.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.08.2004, 10:16 Uhr
pin



int laenge; char x[8];

strcpy(x,"01234567");

laenge =strlen(x);
x[laenge+1] = '\0';

also wäre dies dann eine sichere alternative zu der strcpy und strcat kombination oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2004, 10:17 Uhr
pin



dann würden doch nur die zahlen 0-6 reinkopiert oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2004, 10:23 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein!!!!

das strcpy braucht in diesem Beispiel 9 Byte platz (Ziffern 0-7 und noch ein 0 Byte).
X hat aber nur für 8 Byte Platz, daher hats Du hier ein Byte zuviel geschrieben.
Wwnn Du danach das hier machst:

C++:
laenge =strlen(x);
x[laenge+1] = '\0';


Dann schreibst du sogar noch ein zweites Byte ins Nirvana.
Eine alternative zum strcat Ansatz ist:

C++:
strncpy(x, "01234567", sizeof(x));
x[sizeof(x)-1] = 0;




C++:
char x[8];


Bedeutet, daß x ein Array von chars ist, wobei diese von 0-7 Durchnummeriert sind. Dh wenn man einen 0 Terminierten String reinschreiben will, kann dieser nur 7 Zeichen haben, damit da dann noch platz für das nullbyte ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.08.2004, 10:34 Uhr
0xdeadbeef
Gott
(Operator)


Was du willst, ist

C++:
char x[9]; /* <-- 0-7 = 8 Zeichen, plus ein Sentinel sind 9*/

strncpy(x, "01234567", sizeof(x));


Aus der manpage:

man strncpy:

STRCPY(3)                    Bibliotheksfunktionen                   STRCPY(3)

BEZEICHNUNG
       strcpy, strncpy - kopiert eine Zeichenkette

ÜBERSICHT
       #include <string.h>

       char *strcpy(char *dest, const char *src);

       char *strncpy(char *dest, const char *src, size_t n);

BESCHREIBUNG
       Die  Funktion  strcpy()  kopiert die Zeichenkette, auf die der Zeiger src
       zeigt, inklusive des Endezeichens `\0' an die Stelle, auf die dest
       zeigt.  Die Zeichenketten dürfen sich nicht überlappen und dest muß groß
       genug sein.

       Die Funktion strncpy() tut dasselbe mit dem Unterschied, daß nur die
       ersten n Byte von src kopiert werden.  Ist kein `\0' innerhalb der
       ersten n Bytes,so  wird  das  Ergebnis  nicht  durch  `\0' abgeschlossen.

       Ist die Länge von src kleiner als n Bytes, so wird dest mit Nullen
       aufgefüllt.

RÜCKGABEWERT
       Die Funktionen strcpy() und strncpy() geben einen Zeiger auf dest
       zurück.

KONFORM ZU
       SVID 3, POSIX, BSD 4.3, ISO 9899

SIEHE AUCH
       bcopy(3), memccpy(3), memcpy(3), memmove(3).

                               1. Septemper 1996                     STRCPY(3)


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.08.2004 um 10:41 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.08.2004, 11:35 Uhr
pin



laenge =strlen(x);
x[laenge+1] = '\0';

hier das würde genau das letzte byte 7 überschreiben und nicht irgendwas wohin....
da bin ich mir ziemlich sicher


C++:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
    char x[8];
    int laenge;
    strcpy(x,"1234567");
    laenge = strlen(x);
    printf("%i\n",laenge);
    x[laenge+1]='\0';
    
    printf("%s",x);
    
    getch();
    return 0;
}


Dieser Post wurde am 19.08.2004 um 11:53 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.08.2004, 11:41 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von pin:
laenge =strlen(x);
x[laenge+1] = '\0';

hier das würde genau das letzte byte 7 überschreiben und nicht irgendwas wohin....
da bin ich mir ziemlich sicher


Ist noch immer Driß. Siehe Posts zuvor. Du hast zwar den String im einen verkürzt, dh strlen gibt Dir nun nur noch 7 anstelle von 8 (wie im Beispiel wieter oben) zurück. Dh x[laenge+1] versucht auf x[8] zu schreiben, welcehs es nicht gibt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: