Strings zusammenfügen.
-
Ich möchte eine Funktion schreiben die mehrere Strings zusammenfügt. Das Problem ist das die Strings nicht als const char * (wie es anscheinend von strcpy und strcat gefordert wird) übergeben werden.
Könnte mir jemand einen Tip geben wie ich die Sache trotzdem hinkriege?char *makeCSVString(char *strLog1, char *strLog2, char *seperator) { int n; char *retVal; /* Das Newline durch die 0 ersetzen.*/ n = strlen(strLog1); if (strLog1[n - 1] == '\n') strLog1[n - 1] = '\0'; n = strlen(strLog2); if (strLog2[n - 1] == '\n') strLog2[n - 1] = '\0'; strcpy(retVal, strLog1); strcpy(retVal, seperator); strcpy(retVal, strLog2); strcpyt(retVal, seperator); strcpycat(retVal, "\n"); return retVal; } /* makeCSVString() */
PS: Die Signatur kann ich nur mit großem Aufwand ändern.
-
Willst Du sowas :
char *makeCSVString(char *strLog1, char *strLog2, char *seperator) { int n; char *retVal = new char[strlen(strLog1) + strlen(strLog2) +strlen(seperator) +1]; /* Das Newline durch die 0 ersetzen.*/ n = strlen(strLog1); if (strLog1[n - 1] == '\n') strLog1[n - 1] = '\0'; n = strlen(strLog2); if (strLog2[n - 1] == '\n') strLog2[n - 1] = '\0'; strcpy(retVal, strLog1); strcat(retVal, seperator); strcat(retVal, strLog2); strcat(retVal, seperator); strcat(retVal, "\n"); return retVal; } /* makeCSVString() */
-
Hallo fit,
vielen Dank:-) Ich dachte das Problem wäre das fehlende const...
Peter
-
#include <stdio.h> /* printf() */ #include <stdlib.h> /* calloc() free() */ #include <string.h> /* memcpy() */ char * DESCARTES_makeCSVString(const char *str1, const int len1, const char *str2, const int len2, const char *sep, const int seplen); char * makeCSVString(const char *str1, const char *str2, const char *sep); int main(int argc, char **argv) { char *s; // s = DESCARTES_makeCSVString("Hallo",5,"Welt",4,";", 1); s = makeCSVString("Hallo", "Welt", ";"); printf( "%s", s ); free(s); return 0; } char * DESCARTES_makeCSVString(const char *str1, const int len1, const char *str2, const int len2, const char *sep, const int seplen) { char *retStr; retStr = calloc(len1 + len2 + (2 * seplen) + 2, sizeof(char)); /* memcpy(retStr,str1,len1); memcpy(retStr+len1,sep,seplen); memcpy(retStr+len1+1,str2,len2); memcpy(retStr+len1+1+len2,sep,seplen); memcpy(retStr+len1+1+len2+1,"\n",1); */ strncpy(retStr,str1,len1); strncpy(retStr+len1,sep,seplen); strncpy(retStr+len1+1,str2,len2); strncpy(retStr+len1+len2+1,sep,seplen); strncpy(retStr+len1+len2+2,"\n",1); return retStr; } char * makeCSVString(const char *str1, const char *str2, const char *sep) { return DESCARTES_makeCSVString( str1, strlen(str1), str2, strlen(str2), sep, strlen(sep) ); }
-
fit schrieb:
Willst Du sowas :
char *makeCSVString(char *strLog1, char *strLog2, char *seperator) { int n; char *retVal = new char[strlen(strLog1) + strlen(strLog2) +strlen(seperator) +1];
Na na, "new" ist ja wohl C++ und nicht ANSI C. Das sollte wohl malloc() werden
-
Oh, ich habe einen kleinen Fehler noch drinne:
die Zeilechar *retVal = new char[strlen(strLog1) + strlen(strLog2) +strlen(seperator) +1];
durch
char *retVal = new char[strlen(strLog1) + strlen(strLog2) +2*strlen(seperator) +2];
ersetzen, denn den Seperator hast du ja 2 mal drinne und dann noch "\n" am Ende.
Überlege nochmal, wenn Du das "\0" durch "\n" ersetzt, ob Du da die Länge noch anpassen musst, habe jetzt keine Lust mehr darüber noch nachzudenken.
Jo, ist leider C++, habe übersehen, dass ich im C-Forum bin, sorry.
-
Das Problem ist einfach, dass du keinen Speicherplatz reserviert hast, auf den der char-Zeiger zeigen könnte. Das kann ja nicht gehen. Entweder du nimmst hierfür ein char-Array oder du machst es mit malloc().
-
Hallo,
das mit Malloc habe ich schon verstanden bzw. nachgelesen. Da ich normalerweise in Java und VB programmiere war mir das etwas fremd.
Könntet Ihr mir noch einen Gefallen tun?
Ich habe ein Tool programmiert. Könntet Ihr es kurz durchschauen ob ich gegen irgendwelche C Konventionen verstoßen habe? Also keine Fehlersuche sondern nur schauen ob ich mich mit diesem Programm "sehen lassen könnte".Der Link: http://www.redrival.com/peterfarge/BinCom.zip
Antworten entweder an peterfarge@hotmail.com
oder kurze Bemerkungen hier im Forum.Viele Grüße
Peter
-
habs nur ueberflogen...
(!(feof((*log1).ptr_file) || feof((*log2).ptr_file)))
da wuerde ich lieber
!feof((*log1).ptr_file) && !feof((*log2).ptr_file)
nehmenausserdem schreibt man statt
(*p).foo
lieber
p->foostatt
strcpy(line_log1, "\0");
wuerde ich lieber
line_log1[0]=0;
schreibenwas nach
/* Zweite Datei beinhaltet noch Zeilen. */
steht sollte in eine funktion. da der code fuer die erste datei identisch mit diesem istden return wert von malloc castet man nicht
strcat ist lahm, da wuerde ich lieber mit memcpy arbeiten
IMHO ist es nicht schoen wenn eine funktion speicher reserviert und diesen zurueckgibt. da vergisst man das free nur allzuleicht
zeiger auf werte die du nicht aendern willst sollten const sein
\n durch \0 zu ersetzen sollte eine funktion sein
-
Ja, ist ok, denke ich.
Aber wieso programmierst Du in C ?
Wenn Du vorher in Java programmiert hast, dann programmiere doch in C++ (z.B. new ist da gleich...).
Das ist kompfortabler als C, finde ich.
Ausserdem ist das sowieso kein reines C, was Du geschrieben hast (z.B. kommen die str-Funktionen glaube ich von C++).
-
fit schrieb:
Ausserdem ist das sowieso kein reines C, was Du geschrieben hast (z.B. kommen die str-Funktionen glaube ich von C++).
ich habe nix C++ spezifisches gesehen, erklaer mal genauer was du meinst. uU hab ich ja was uebersehen...
die str* funktionen sind aber schon C
-
@Shade: Zweiter Beitrag von oben:
fit schrieb:
... char *retVal = new char[strlen(strLog1) + strlen(strLog2) +strlen(seperator) +1]; ...
-
@Shade Of Mine: Vielen Dank für Deine Anmerkungen.
Das mit free ist aber etwas komplizierter: So wie ich es gelesen habe muß man alles was mit malloc angefordert wurde mit free wieder freigeben. Da ich den String auch außerhalb der Funktion benötige wäre demnach die einzige Möglichkeit den String schon vorher mit malloc anzufordern und ihn dann wenn der Platz nicht reicht mit realloc zu erweitern?
Das mit den zusätzlichen Funktionen und line_log1[0]=0; leuchtet ein und ist gegessen;-)Das ganze Programm gehört zu einer Bewerbung die ich bis Freitag (also vorhin) abgeben mußte/durfte. Mal sehen ob ich bei der Firma eine Zukunft habe... *g*
@fit: Bei vielen kleineren Untenehmen ist man als Generalist gern gesehen. VB, Java, Html und SQL Kenntnisse waren auch gefordert.
Sehr oft muß man den Source aus einer anderen Sprache übertragen. -> Reengineering. Bzw. flexibel sein und als Anfänger an anderen Projekten mitarbeiten. Wenn man dann noch einige Grundkenntnisse in der Sprache hat ist man immer im Vorteil.Peter
-
RTC schrieb:
@Shade: Zweiter Beitrag von oben:
wenn fit bloedsinn schreibt, dann soll er doch.
aber tatsache ist, dass peterfarge keinen bloedsinn geschrieben hat.peterfarge schrieb:
Das mit free ist aber etwas komplizierter: So wie ich es gelesen habe muß man alles was mit malloc angefordert wurde mit free wieder freigeben. Da ich den String auch außerhalb der Funktion benötige wäre demnach die einzige Möglichkeit den String schon vorher mit malloc anzufordern und ihn dann wenn der Platz nicht reicht mit realloc zu erweitern?
es gibt 2 gute moeglichkeiten wie man das loesen kann:
a)
der aufrufer muss dem speicher bereitstellen und die funktion kuemmert sich nicht darum.b)
die funktion allokiert den speicher und gibt semantisch gesehen ein objekt zurueck (welches natuerlich ein einfacher char* auf den speicher sein kann)der caller soll nun nicht free() aufrufen (was aber theoretisch auch klappen wuerde) sondern lieber
FreeCSVString()
verwenden.der sinn ist der:
char* p=foo();
...
free(p);hier faellt es nicht sonderlich auf wenn das free() fehlt, denn niemand sucht ob jedes foo() ein passendes free() hat (das ist unnatuerlich, man sucht nur nach mallc/realloc/callc und free())
wenn man aber
char* p=getResource();
...
freeResource(p);hat, dann faellt das eher auf.
-
Hallo Shade of Mine,
der Ansatz mit dem Selber Allokieren scheint besser in das C Konzept zu passen. ZB. bei den String Funktionen übergibt man ja auch einen Puffer und bekommt ihn verändert zurück.
Aber da das Prog schon abgegeben ist... isses jetzt eh egal;-)Viele Grüße
Peter
-
Ich bin voll der C/C++-Ne*be und habe keinen Plan, für was die Funktion maloc gut ist. Könnte mir das bitte jemand sagen?
Danke
Lutz
-
Mit der Funktion malloc allozierst du Speicher.
EDIT:
http://faql.de/desdfaql2.html schrieb:
»allozieren« hat die Bedeutung »[Mittel] zuweisen, bereitstellen«.
»allokieren« hingegen heißt »jemanden anreden«