strncpy(char*,char*,int);
-
Hallo an alle,
habe folgende verständnis frage zu strncpy.CodeBeispiel:
char test[8],temp[9];
strncpy(test,temp,8);
/* heist diese Zeile das nur die Pos 0-7 kopiert werden und die 8 stelle als '\0' gesetzt wird oder heist dies das die stellen 0-8 alle in den string kopiert werden und '\0' wird nicht gesetzt */
-
Warum probierst du es nicht aus ?
-
Habe es probiert nur das prob ist das es immer klappt egal wie groß das n ist.
also:
#include <stdio.h>
#include <conio.h>
#include <string.h>int main()
{
char test[8],temp[9];
int i;strcpy(temp,"ABCDEFGH");
strncpy(test,temp,8);
/*Hier klappt es auch wenn ich 8,10,12 oder ähnlcihes schreibe
es wird fehlerfrei mein string in test ausgegeben
da ich nicht weiter kam wollte ich dieses Forum fragen */for(i=0;i<8;i++)
{
printf("%c",test[i]);
}getch();
return 0;
}
-
SYNOPSIS
#include <string.h>char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
DESCRIPTION
The strcpy() function copies the string pointed to be src
(including the terminating `\0' character) to the array
pointed to by dest. The strings may not overlap, and the
destination string dest must be large enough to receive
the copy.The strncpy() function is similar, except that only the
first n bytes of src are copied.In the case where the length of src is less than that of
n, the remainder of dest will be padded with nulls.
-
Danke net aber statt ne reference zu pasten könntest du mir auch in deutsch antworten was mir lieber wäre......
-
pin schrieb:
Danke net aber statt ne reference zu pasten könntest du mir auch in deutsch antworten was mir lieber wäre......
ok...
die strcpy-funktion kopiert den string, auf den src zeigt
(einschliesslich der ende-0) an die adresse(n), worauf dest zeigt.
beide speicherbereiche dürfen sich nicht überschneiden und der speicher
aud den 'dest' zeigt muss gross genug sein, um den src-string aufzunehmen.strncpy() machts genauso aber es werden nur die ersten 'n' bytes
kopiert. wenn die länge des 'src' strings kürzer ist als 'n' wird der
rest mit nullen aufgefüllt.besser so?
-
argh, der dritte Parameter ist nicht vom Typ int, weil int für größen Angaben der total falsche Typ ist! size_t ist der richtige Typ!
Und wenn du dir die Referenz mal durchlesen würdest, wüsstest du, dass wenn n größer als die Länge von src ist, der Rest mit Nullen aufgefüllt wird.
strncpy ist übrigens keine sehr tolle Funktion, da würde ich lieber man: memcpy(3) einsetzen.
-
kingruedi schrieb:
argh, der dritte Parameter ist nicht vom Typ int, weil int für größen Angaben der total falsche Typ ist! size_t ist der richtige Typ!
man kann aber ruhig int nehmen. wird beim aufruf in size_t umgemodelt (was immer das ist, unsigned long oder so)
-
net die antwort hat mir so besser gefallen und geholfen.
Danke dir
-
net schrieb:
kingruedi schrieb:
argh, der dritte Parameter ist nicht vom Typ int, weil int für größen Angaben der total falsche Typ ist! size_t ist der richtige Typ!
man kann aber ruhig int nehmen. wird beim aufruf in size_t umgemodelt (was immer das ist, unsigned long oder so)
nein, int und size_t unterscheiden sich, da nicht für jeden Wert, den int schlucken kann ein entsprechender size_t Wert existiert und umgekehrt.
Durch so Sachen holt man sich dann auch schnell mal ein Sicherheitsloch
-
kingruedi schrieb:
nein, int und size_t unterscheiden sich, da nicht für jeden Wert, den int schlucken kann ein entsprechender size_t Wert existiert und umgekehrt.
naja, man sollte schon keine negativen ints an eine funktion übergeben, die size_t erwartet aber sonst sollte das gehen.
guckst du hier: http://wwweic.eri.u-tokyo.ac.jp/computer/manual/lx/SGI_Developer/books/CLanguageRef/sgi_html/ch02.html#Z30681
unter dem abschnitt "argument types promotion"
-
dass int implizit in size_t gecastet wird, will ich ja auch gar nich bestreiten, immerhin ist eine einfache Zahl im Quellcode ja auch ein integer Literal. Nur bringt das casten eben Probleme, unter anderem auch schnell Sicherheitsprobleme.
-
kingruedi schrieb:
Nur bringt das casten eben Probleme, unter anderem auch schnell Sicherheitsprobleme.
ja deshalb sage ich immer: nehmt java!
-
net schrieb:
...naja, man sollte schon keine negativen ints an eine funktion...
size_t ist doch ein typedef für unsigned int, man kann also gar keine negativen ints übergeben, ausser wenn der Compiler es nicht so eng sieht.
-
net schrieb:
ja deshalb sage ich immer: nehmt java!
och bitte, wir müssen hier keinen Flamewar anfangen
h4xX0r schrieb:
size_t ist doch ein typedef für unsigned int, man kann also gar keine negativen ints übergeben, ausser wenn der Compiler es nicht so eng sieht.
nein, niemand sagt, dass size_t ein typedef für unsigned int ist. size_t ist nur ein unsigned integral type.
und
unsigned int i=-1;
ist auch kein Problem.
-
Das ist ein Problem, zumindest bei meinem Compiler. Der bringt mir eine Warnung...
warning C4245: 'initializing' : conversion from 'int' to 'unsigned int', signed/unsigned mismatch warning C4189: 'i' : local variable is initialized but not referenced
edit: oh, sorry hier arbeiten wir ja mit ANSI-C. Da sollte das vielleicht kein Problem sein...
-
h4xX0r schrieb:
Das ist ein Problem, zumindest bei meinem Compiler. Der bringt mir eine Warnung...
Nett von ihm dass er dich warnt - aber warnung kann man abschalten.
Warnung != Fehler
-
Aber ihr müsst zugeben, dass es nicht ganz sauber ist...