strncpy < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:14 Di 08.12.2009 | Autor: | tommy987 |
Aufgabe | Die strncpy kopiert nicht den angegebene char*, den ich mitgegeben habe.
text = char**
str = char*
linCounter = int
text= (char **) realloc(text, (lineCounter+1) * sizeof (char*));
text[lineCounter]= malloc((strlen(str) +1 )*sizeof (char));
strncpy(text[lineCounter],str, strlen(str)); |
Es werden zu wenige Zeichen kopiert.
strlen gibt die richtige Anzahl zurück.
Was kann da falsch sein?
lg
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 05:21 Mi 09.12.2009 | Autor: | felixf |
Hallo!
> Die strncpy kopiert nicht den angegebene char*, den ich
> mitgegeben habe.
Na, das ist aber mal eine praezise Problembeschreibung.
> text = char**
> str = char*
> linCounter = int
>
> text= (char **) realloc(text, (lineCounter+1) * sizeof
> (char*));
>
> text[lineCounter]= malloc((strlen(str) +1 )*sizeof
> (char));
>
> strncpy(text[lineCounter],str, strlen(str));
>
> Es werden zu wenige Zeichen kopiert.
>
> strlen gibt die richtige Anzahl zurück.
Das sind jetzt nicht genug Informationen, um dein Problem wirklich zu verstehen. Aber eine Idee hab ich trotzdem...
> Was kann da falsch sein?
1. Warum benutzt du strncpy anstelle strcpy?
2. Warum gibst du bei strncpy die Laenge strlen(str) an, und nicht strlen(str)+1? Willst du die terminierende 0 nicht mitkopieren? (Siehe auch hier, insb. bei Description und bei Application Usage.)
LG Felix
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 17:21 Mi 09.12.2009 | Autor: | tommy987 |
Es geht um Sicherheitsaspekte und dafür sollen wir strncpy verwenden und nicht strcpy.
Ich lese aus einem char* aus, welcher alle möglichen char beinhaltet. Meine Aufgabe besteht darin, ein 2 dimensionales Array daraus zu erzeugen, sprich char**
Somit ersetze ich [mm] \n [/mm] durch ein Leerzeichen und [mm] \r [/mm] durch [mm] \0.
[/mm]
Bei der Ausgabe durch fprintf(stderr, str) wird genau der string (char*) ausgegebn, den ich gerne ins array einhängen würde.
Bsp.
einzulesen:
GET http://blabla.htm Http 1.1
Bla Bla
Bla
fprintf(sterr, str) -> GET http://blabla.htm Http 1.1
nach dem einhängen
fprintf(sterr, str) -> GET http://blabla.h
Wieso?
lg
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:45 Mi 09.12.2009 | Autor: | felixf |
Hallo!
> Es geht um Sicherheitsaspekte und dafür sollen wir strncpy
> verwenden und nicht strcpy.
Nicht dass das hier etwas sicherer macht, aber meinetwegen.
Falls du dir allerdings mal den Link angeschaut haettest, wuerdest du sehen dass du strncpy falsch verwendest. Zumindest offenbar nicht so, wie du es beabsichtigst.
> Ich lese aus einem char* aus, welcher alle möglichen char
> beinhaltet.
Auch 0?
> Meine Aufgabe besteht darin, ein 2
> dimensionales Array daraus zu erzeugen, sprich char**
>
> Somit ersetze ich [mm]\n[/mm] durch ein Leerzeichen und [mm]\r[/mm] durch
> [mm]\0.[/mm]
Warum ersetzt du \r durch \0?
> Bei der Ausgabe durch fprintf(stderr, str) wird genau der
> string (char*) ausgegebn, den ich gerne ins array
> einhängen würde.
>
> Bsp.
>
> einzulesen:
>
> GET http://blabla.htm Http 1.1
> Bla Bla
> Bla
>
> fprintf(sterr, str) -> GET http://blabla.htm Http 1.1
>
> nach dem einhängen
>
> fprintf(sterr, str) -> GET http://blabla.h
>
>
> Wieso?
Wie waer's mal mit einem Minimalbeispiel in Codeform? Alles andere ist wildes herumstochern im Nebel.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:17 Mi 09.12.2009 | Autor: | tommy987 |
Hier wäre meine appendline funktion:
char** appendLine(const char* str, char** lines, int lineCounter)
{
fprintf(stderr, "%s%d%s", "Count Lines- ", lineCounter, " Append [mm] Line\n");
[/mm]
fprintf(stderr, "Laenge der Zeile ist: %d [mm] <--\n", [/mm] strlen(str));
if ( !( lines= (char **) realloc(lines, (lineCounter+1) * sizeof (char*)) ) )
{
fprintf(stderr,"wsort: einlesen");
exit( EXIT_FAILURE );
}
lines[lineCounter]= malloc((strlen(str) +1 )*sizeof (char));
if(lines[lineCounter]==NULL) fprintf(stderr, "Fehler:calloc, liste[counter]");
strncpy(lines[lineCounter],str, strlen(str)+1);
fprintf(stderr, "%s%s", "In der Line steht: ", lines[lineCounter]);
return lines;
}
[mm] \0 [/mm] um den char* zu terminieren.
Den Link hab ich mir angeschaut und wie du siehst ist lines[lineCounter] ein pointer auf einen char*, also müsste es passen.
strncpydeshalb, um einen buffer overflow zu verhindern.
lg
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:45 Mi 09.12.2009 | Autor: | felixf |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo!
> Hier wäre meine appendline funktion:
Ein Minimalbeispiel besteht aus einem kompilierbaren Programm inkl. Eingabedaten, so dass man ohne grossen Aufwand das Problem reproduzieren kann.
> char** appendLine(const char* str, char** lines, int
> lineCounter)
> {
> fprintf(stderr, "%s%d%s", "Count Lines- ",
> lineCounter, " Append [mm]Line\n");[/mm]
> fprintf(stderr, "Laenge der Zeile ist: %d [mm]<--\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
> strlen(str));
>
>
>
> if ( !( lines= (char **) realloc(lines, (lineCounter+1) *
> sizeof (char*)) ) )
> {
> fprintf(stderr,"wsort: einlesen");
> exit( EXIT_FAILURE );
>
>
> }
>
>
> lines[lineCounter]= malloc((strlen(str) +1 )*sizeof
> (char));
>
> if(lines[lineCounter]==NULL) fprintf(stderr,
> "Fehler:calloc, liste[counter]");
Hier solltest du auch ein exit() oder return einbauen. Ansonsten ueberschreibst du gleich darauf etwas Falsches im Speicher:
> strncpy(lines[lineCounter],str, strlen(str)+1);
>
> fprintf(stderr, "%s%s", "In der Line steht: ",
> lines[lineCounter]);
Wieso hast du hier kein newline drinnen stehen?
> return lines;
>
> }
>
> [mm]\0[/mm] um den char* zu terminieren.
Also alles was in der Zeile nach \r kommt wird weggeworfen?
> Den Link hab ich mir angeschaut und wie du siehst ist
> lines[lineCounter] ein pointer auf einen char*, also
> müsste es passen.
Mittlerweile hast du den Laengenparameter bei strncpy auch angepasst.
LG Felix
PS: Sagt dir [code]...[/code] etwas?
|
|
|
|