Strings kopieren mit strcat()
-
bah, C ist doof
es funktioniert jetzt danke
gruss, Schmelly
-
Was ich noch nicht so ganz verstehe,
warum muss die Grösse des to[] Arrays 3 sein?
gruss, Schmelly
-
'c' + 'd' + '\0'
-
Hi,
vielleicht noch etwas ausfuehrlicher
Du hast einen Zeiger, welcher auf die Addresse einer char-Variable zeigt,
die als Inhalt das Zeichen 'c' beinhaltet. Nun hast du aber lediglich Speicher
fuer genau dieses eine Zeichen und nicht fuer mehr reserviert. Der Speicher
an Addresse 'cp + 1' gehoert dir wahrscheinlich gar nicht.Nun rufst du strcat () auf, wobei an das Zeichen 'c' noch 'd' und ein
0-Terminierungszeichen '\0', welches das Ende des Strings kennzeichnet',
angehangen wird. Dabei wird an die Speicheraddresse 'cp + 1' und 'cp + 2'
geschrieben ('cp + 1' = 'd' und 'cp + 2' = '\0'). Da dir der Speicherbereich
jenseits von 'cp' nicht gehoert, gibts eine Speicherzugriffsverletzung.Vielleicht ist es dir jetzt klarer. Deswegen hat king ein Array erstellt,
welches 3 Zeichen aufnehmen kann. Das ist genau soviel Speicher, wie du
benoetigst um 'd' und '\0' an das Zeichen 'c' dranzuhaengen.mfg
v R
-
Hi
ich war immer der MEinung, strcat würde von sich aus speicherplatz für den neuen String alloziieren, also so vorgehen:
- wie lang ist 1. string ? ( ohne '\0')
- wie lang ist zweiter String ? ( mit '\0')
- reserviers speicherplatz für beide längen
- kopiere 1.string an neuen Speicherplatz
- schreibe 2.string in den rest,
- gib 1. und 2. string frei
- liefere die neue speicheradresse zurückSonst müsste kingruedi Beispiel verallgemeinert ja so aussehen :
#include <stdio.h> #include <string.h> int main(void) { const char *from="d"; char to[1 + strlen(from) + 1 ]="c"; // eine "1" für "c", eine für 0x0 printf(strcat(to,from)); return 0;
Hanns
-
Und das ist der Grund, wieso so viele Programme fehlerhaft sind. Das was du machst ist schlicht und einfach falsch.
-
hm...
in meinem eigentlichen Programm hänge ich nun an ein String der Länge 3 (wie in Kingruedis Beispielcode) der nur "d" enthält mit strcat() einen String der Länge 8 an. Dies hat bis jetzt immer funktioniert, dürfte es jedoch nach Virtual Realisticer nicht oder? (mit einem Array der Länge 2 bekomme ich wieder meinen Segmentation fault, daher war ich etwas verwundert warum es mit Länge 3 klappt)
Korrekt wäre es also in meinem Fall einen String der Länge 10 zu initialisieren:
['d',..,..,..,..,..,..,..,..,'\0']
und mit strcat den zweiten String an diesen anzuhängen?
gruss, Schmelly
-
Hi,
also du must dir immer merken:
Das Zielarray muss gross genug sein, um sich selbst + anzuhaengender String +
ein '\0' zu speichern.Beispiel:
char ZielArray[11] = "hallo"; //kann insgesamt 11 zeichen aufnehmen char *Anhaengen[] = " welt"; //anzuhaengender string (5 zeichen) strcat ( ZielArray, Anhaengen ); //es entsteht "hallo welt" == 10 Zeichen + //'\0' == 11 Zeichen
Dass es bei dir mal funktioniert, ohne dass du genug Speicher hast, ist reiner
Zufall und das Programm koennte irgendwann genauso gut abstuerzen.in meinem eigentlichen Programm hänge ich nun an ein String der Länge 3 (wie in
Kingruedis Beispielcode) der nur "d" enthält mit strcat() einen String der Länge
8 an. ...Korrekt wäre es also in meinem Fall einen String der Länge 10 zu initialisieren:
Du musst das Array nicht initialisieren, du musst es lediglich gross genug
machen. 10 waere in deinem Fall korrekt.mfg
v R
-
Original erstellt von virtuell Realisticer:
**
Dass es bei dir mal funktioniert, ohne dass du genug Speicher hast, ist reiner
Zufall und das Programm koennte irgendwann genauso gut abstuerzen.
**na ja... mal ist gut, der Programmteil wurde sicher schon 50000 mal aufgerufen
aber danke euch, hab das nun vernünftig gemacht
gruss, Schmelly
-
Original erstellt von dEUs:
Und das ist der Grund, wieso so viele Programme fehlerhaft sind. Das was du machst ist schlicht und einfach falsch.*g* is schon geil, das forum, ich glaub ich werd hier noch meinen spaß ham *rofl* :p
-
aufschlußreicher nick
-
Original erstellt von Schmelly:
na ja... mal ist gut, der Programmteil wurde sicher schon 50000 mal aufgerufenwenn du ein bisschen mehr Erfahrung sammelst, weisst du, dass du sowas trotzdem vermeiden solltest.
1. kannst du ziemlich dumme Fehler erhalten, wenn du dein Programm erweiterst (ich hatte mal ein Stacküberlauf in einem Programm, der solange gut ging, bis ich irgend wann mal eine weitere Variable auf dem Stack anlegte und ich habe bestimmt eine Woche nach dem Fehler gesucht )
2. wird sich das Verhalten wahrscheinlich ändern, wenn du eine andere Platform (oder Compiler) benutzt
-
also deus, Der bayrische name,
dann sagt mir mal, was ich falsch mache oh Gott ( deus) ??
Hanns
-
Du hast keine Ahnung wie strcat funktioniert oder wie man es benutzt und bist zu träge das abzustellen.
-
Original erstellt von Bashar:
Du hast keine Ahnung wie strcat funktioniert oder wie man es benutzt und bist zu träge das abzustellen.- und 2) scheint zu stimmen; stimmte 3) würde ich mich hier nicht melden !
Was sagst Du denn bitte hierzu ?
http://www.cppreference.com/
strcat
Syntax:
#include <string.h>
char *strcat( char *str1, const char *str2 );The strcat() function concatenates str2 onto the end of str1, and returns str1. For example:
printf( "Enter your name: " );
scanf( "%s", name );
title = strcat( name, " the Great" );
printf( "Hello, %s\n", title );Related topics:
strchr(), strcmp(), and strcpy().Nun wollt ich Dir ein weiteres Zitat gegen Dich bringen , als ich nochmal in nem Symantec-c++-Handbuch nchals, und dieses fand:
Ten application code is responsible for ensuring that there is enaough space in the string to hold the result.
Der Mensch irrt, solang er strebt
Trotzdem, das mit dem bist zu träge war nicht sehr freundlich
Hanns
-
war auch nicht freundlich gemeint, sondern als Antwort auf dein "Oh dEUs, du hast gefälligst mir mein Manual vorzulesen"