fragen zu strcpy() und strcat()
-
gut und wie kann ich das "sauber" machen?
-
Siehe mein Edit oben: strlen()
-
neomic schrieb:
gut und wie kann ich das "sauber" machen?
nimm strncpy und strncat (mit 'nem N in der mitte). damit kannste buffer overflows vermeiden, weil du die länge des buffers angeben kannst...
:xmas2:
-
ten schrieb:
neomic schrieb:
gut und wie kann ich das "sauber" machen?
nimm strncpy und strncat (mit 'nem N in der mitte). damit kannste buffer overflows vermeiden, weil du die länge des buffers angeben kannst...
:xmas2:heist dann da wird der rest dann einfach abgeschnitten oder reserviert der dann den neuen speicher?
-
neomic schrieb:
heist dann da wird der rest dann einfach abgeschnitten oder reserviert der dann den neuen speicher?
wird abgeschnitten wenn's nicht passt. es wird nicht willkürlich speicher alloziert, hast also volle kontrolle drüber

-
Alternativ kannst du auch std::string verwenden - der kümmert sich selber darum, wieviel Speicher er benötigt.
-
ten schrieb:
neomic schrieb:
gut und wie kann ich das "sauber" machen?
nimm strncpy und strncat (mit 'nem N in der mitte). damit kannste buffer overflows vermeiden, weil du die länge des buffers angeben kannst...
:xmas2:Was spricht gegen 'std::copy'?
-
neomic schrieb:
habe ich bei strcpy() und strcat() eventuelle speicherleaks zu befürchten bzw muss ich mich um die genug großen speicherbereiche selber kümmern oder machen die funktionen das von selbst?
Bei strcpy() und strcat() musst Du Dich selbst um den benötigten Arbeitsspeicher kümmern. Genauso bei strncpy() und strncat()!
neomic schrieb:
wenn ja wie kann ich das sauber machen?
In Standard-C++ nur mit std::string (bzw. std::wstring). Etwa so:
#include <string> // ... std::string quelle = "Hello "; std::string ziel; // .. ziel = quelle; // statt strcpy() ziel += "World"; // statt strcat();Gruß
Werner
-
Werner Salomon schrieb:
neomic schrieb:
wenn ja wie kann ich das sauber machen?
In Standard-C++ nur mit std::string (bzw. std::wstring).
Der Vollständigkeit halber möchte ich nochmal auf den Weg mit boost::array<char> und std::copy hinweisen (ist natürlich nicht für Strings geeignet aber char-Arrays können ja prinzipiell auch etwas anderes ausdrücken als Strings):
std::size_t const len = 10; // Die Länge der Daten. boost::array<char, len> ch_arr; char const* data = "Die Daten"; // Irgendwelche Binärdaten. std::copy(data, data + len, ch_arr.begin());
-
ich hab ein programm das mit <string> klappt... jedoch erhöhen die streams (z.b. <iostream> oder <string>) die größe meiner .exe ungemein (und ich wollte ein nur knapp 20kb großes programm schreiben).
zudem hab ich mich dabei gefragt, wie die leute das noch zu c zeiten gemacht haben, weil es ist ja anscheinend nicht das leichteste an der sprache
mfg
-
neomic schrieb:
zudem hab ich mich dabei gefragt, wie die leute das noch zu c zeiten gemacht haben...
na mit den 'strnXXX()' funktionen oder was ähnliches selbtgebasteltes...
:xmas2:
-
ten schrieb:
na mit den 'strnXXX()' funktionen oder was ähnliches selbtgebasteltes...
:xmas2:hab ich mir auch schon iwie gedacht...^^
folgenes soll ein kleiner hex parser werden:
char input[]="test"; int h=strlen(input); int i=h*3+2; char str[i]; memset(str,'\0',i); for(int i=0;i<h;i++){ char out[3]; sprintf(out,"%02x",static_cast<unsigned char>(input[i])); strcat(out,","); strcat(str,out); } strcat(str,"00"); cout<<str<<endl;muss ich hier mit irgendwelchen problemen rechnen? kann man das auch eleganter (-ohne <string>-) lösen?
-
neomic schrieb:
ich hab ein programm das mit <string> klappt... jedoch erhöhen die streams (z.b. <iostream> oder <string>) die größe meiner .exe ungemein
Solange Du nur mit std::string arbeitest benötigst Du kein #include <iostream>.
neomic schrieb:
(und ich wollte ein nur knapp 20kb großes programm schreiben).
Warum?
-
neomic schrieb:
zudem hab ich mich dabei gefragt, wie die leute das noch zu c zeiten gemacht haben, weil es ist ja anscheinend nicht das leichteste an der sprache

Aso, du willst was lernen. Dann machs doch mal ganz ohne die Funktionen aus <cstring>. So richtig übel Handgestrickt mit netten Schlaufen und bösen Ösen

-
Werner Salomon schrieb:
Solange Du nur mit std::string arbeitest benötigst Du kein #include <iostream>.
ja aber #include <string> ist 70 kb groß..
Werner Salomon schrieb:
Warum?
wieso denn nicht? es ist ein kleines projekt...
THX 1138 schrieb:
Aso, du willst was lernen. Dann machs doch mal ganz ohne die Funktionen aus <cstring>. So richtig übel Handgestrickt mit netten Schlaufen und bösen Ösen

hab ich auch schon und es klappt...
int GetLength(char *pchar){ int i=0; while(pchar[i])i++; return i; } int Find(char *pchar,char *pcharsearch){ bool done=false; int i=0; while(!done){ int j=0,k; if(pchar[i]==pcharsearch[0]){ k=i; while(pchar[i]==pcharsearch[j]){ j++; if(j==GetLength(pcharsearch))done=true; if(!done)i++; } if(pchar[i]!=pcharsearch[j])i=k; } if(!done)i++; if(i==GetLength(pchar)){ done=true; i=-1; } } return i; } void Replace(char *pchar,char *pcharreplace,char *pcharout,int entrypoint,int replacewidth=0){ int length_pcharreplace=GetLength(pcharreplace); for(int i=0;i<entrypoint;i++){ pcharout[i]=pchar[i]; } for(int i=0;i<length_pcharreplace;i++){ pcharout[i+entrypoint]=pcharreplace[i]; } for(int i=entrypoint;i<GetLength(pchar)-replacewidth+1;i++){ pcharout[i+length_pcharreplace]=pchar[i+replacewidth]; } } void Add(char *pchar,char *pcharreplace,char *pcharout){ Replace(pchar,pcharreplace,pcharout,GetLength(pchar)); }
-
neomic schrieb:
wieso denn nicht? es ist ein kleines projekt...
Weil die Zeiten mit 64kB RAM vorbei sind?
-
THX 1138 schrieb:
Weil die Zeiten mit 64kB RAM vorbei sind?
jetzt sag mir doch wieso denn nicht?
-
Weil die Zeiten mit 64kB RAM vorbei sind!
Ne sorry, es gibt bei PC Anwendungen eigentlich keinen Grund, auf Grösse zu optimieren. Mach das ruhig so, um zu lernen. Aber benutz dann lieber die std::strings und ihre Methoden, die sind sicherer und einfacher zu nutzen weil du dich nicht ums Speichermanagment kümmern brauchst.
-
Es ist ziemlich egal, ob du nun 20 KB oder 200 KB benutzt.
Darüber gibts einen ganzen Wust an Diskussionen hier im Forum. Hast du schonmal versucht die Binärdatei zu strippen? Dann bleibt meist auch nicht mehr viel übrig. Außerdem hat (scheinbar) das PE-Format mit MinGW auch einen (in diesem Bereich) nicht unerheblichen Einfluss auf die Größe.
Wenn du C++ lernen willst, dann benutz auch die C++ Möglichkeiten (hier wären imho Stringstreams angebracht), erst recht jetzt, da du das ganze schon einmal von Hand implementiert hast.
-
THX 1138 schrieb:
Weil die Zeiten mit 64kB RAM vorbei sind!
Ne sorry, es gibt bei PC Anwendungen eigentlich keinen Grund, auf Grösse zu optimieren. Mach das ruhig so, um zu lernen. Aber benutz dann lieber die std::strings und ihre Methoden, die sind sicherer und einfacher zu nutzen weil du dich nicht ums Speichermanagment kümmern brauchst.
1. meine <string> version klappt 100% ist mir aber bei großen datenmengen zu langsam da immer der shic copy-constructor aufgerufen wird
2. ich will auch was über dynamische speicherverwaltung lernen, rate mal warum ich c++ lerne und nicht delphi