int -> string (char*)
-
char str_name[] = "/home/toolkit/tmp/top_debug"; char* str_day; char* str_month; char str_year[]="2005"; sprintf(str_day,"%s",ptm->tm_mday); sprintf(str_month,"%s",ptm->tm_mon); strcat(str_name,str_day); strcat(str_name,str_month); strcat(str_name,str_year); strcat(str_name,".log"); FILE *f_log; f_log = fopen("/home/norbert/toolkit/tk_reader_exp/tmp/top_debug.log","a+"); fprintf(f_log,"%02d.%02d.%0004d-%2d:%02d:%02d : %s\n",ptm->tm_mday,ptm->tm_mon,ptm->tm_year+1900,ptm->tm_hour+1,ptm->tm_min,ptm->tm_sec,msg); fclose(f_log);
bekomme noch immer folgende fehlermeldung:
ScanDocument.cpp:45: Warnung: Format-Argument ist kein Zeiger (Argument 3)
ScanDocument.cpp:46: Warnung: Format-Argument ist kein Zeiger (Argument 3)gibt es einen anderen c/c++ befehl um einen int in ein char*-feld umzuwandeln
-
Führ dir mal die Grundlagen der C-programmierung zu Gemüte
Mit
char* str_day; char* str_month;
legst du zeiger für ein char an! Es ist nicht garantiert, das dort
freier speicher liegt. Deshalb musst du erst speicher allokieren,
bevor du was an die Stelle schreibst.also
char* str_day=malloc(sizeof(char)*WIEVIELE_ZEICHEN_WILLST_DU+1); . . .
oder einfacher:
char str_year[5]; char str_day[11]; strcpy(str_year,"2005"); strcpy(str_day,"donnerstag"); . . .
-
danke für den hinweis... hab 4 jahre lang c/c++/vc6 in der schule gelernt das ist aber schon etwas länger her und programmiere seit längerem mit delphi und c#, daher kann ich mich nicht mehr an alle (c/c++) einzelheiten erinnern.
char* str="versuch";
kann man sehr wohl verwenden, weil ich einen statischen string zuweise und der kompiler somit weiss, dass er in diesem fall für 7 zeichen platz im speicher reservieren muss.... aber daran scheitert das ganze ja nicht...
mein hauptproblem liegt ganz woanders... nämlich bei der konvertiertung von int (tag,monat,(jahr)) in char* damit ich endlich meinen dateinamen verwenden kann!
also bitte mit zucker oben drauf, mit welcher funktion kann ich einen int in string umwandeln... atoi ist string -> int, wenn ich mich nicht irre...
danke im voraus!
-
Mit der Funktion, die du oben schon mal verwendet hast. sprintf();
int i=2005; char year[5]; sprintf(year,"%d",i);
P.S. In deinem ersten Beispiel hast du zwei pointer definiert und ihnen dynamisch zur Laufzeit einen Inhalt zugewiesen.
char *str_time; sprintf(str_time,"%d",time(NULL)); printf("%s", time);
Das geht doch nicht
.
-
char str_day[2]; char str_month[2]; sprintf(str_day,"%s",ptm->tm_mday); sprintf(str_month,"%s",ptm->tm_mon);
wenn ich es auf diese konvertiere bekomme ich dann bekomme ich aber immer folgende fehlermeldung und mein programm wird beendet:
ScanDocument.cpp:46: Warnung: Format-Argument ist kein Zeiger (Argument 3)
ScanDocument.cpp:47: Warnung: Format-Argument ist kein Zeiger (Argument 3)kompiliere das ganze mit gcc unter linux aber das sollte eigentlich keinen unterschied machen....
-
von welchem datentyp ist denn das 3. Argument.
Wenn´s kein char ist, dann musst du halt sprintf(); anpassen
-
....
-
chris1908 schrieb:
char* str="versuch";
kann man sehr wohl verwenden, weil ich einen statischen string zuweise und der kompiler somit weiss, dass er in diesem fall für 7 zeichen platz im speicher reservieren muss.... aber daran scheitert das ganze ja nicht...
Der compiler muss 7 + '\0' = 8 zeichen reservieren
-
/bin/bash0R schrieb:
Der compiler muss 7 + '\0' = 8 zeichen reservieren
fängt ein array nicht bei 0 an? 0-6 sind die zeichen und es 7 ist für '\0'... kann mich natürlich irren...
/bin/bash0R schrieb:
von welchem datentyp ist denn das 3. Argument.
Wenn´s kein char ist, dann musst du halt sprintf(); anpassen3. Argument ist ein int
wie kann ich sprintf(); anpassen?
-
chris1908 schrieb:
fängt ein array nicht bei 0 an? 0-6 sind die zeichen und es 7 ist für '\0'... kann mich natürlich irren...
das ist korrekt, die indizes gehen von 0-6, doch in deinem beispiel hattest du das wort "versuch", das sind 7 buchstaben und ein '\0', deshalb muss der compiler bei der deklaration 8 zeichen reservieren.
char string[8] geht von string[0]-string[7]!chris1908 schrieb:
wie kann ich sprintf(); anpassen?
sprintf(str_day,"%d",ptm->tm_mday);
-
chris1908 schrieb:
char* str="versuch";
kann man sehr wohl verwenden, weil ich einen statischen string zuweise und der kompiler somit weiss, dass er in diesem fall für 7 zeichen platz im speicher reservieren muss
Du sprichst hier von String-Literal, und wie /bin/bash0R schon sagte, dein Compiler wird hier 8 Zeichen reservieren. 7 Inhalt + 1 abschliessendes Nullzeichen. Zudem solltest du beim Arbeiten mit Literalen aufpassen. Diese sind read-only, deshalb solltest du es besser so machen
const char* str="versuch";
Dann gibts hinterher keine Überraschungen.
chris1908 schrieb:
char str_day[2]; char str_month[2];
Abschliessende Nullzeichen beachten, jeweils 2 Zeichen dürften für str_day und str_month nicht ausreichen.
-
thx, funktioniert!
ja, meine c-kenntnisse sind leider schon ziemlich eingerostet....