int -> string (char*)



  • versuche schon seit 1 stunde einen int in einen char* bzw. string umzuwandenlen...
    ich möchte eine datei erstellen, wo der dateiname sich aus top_debug und heutigem datum (tag+monat+jahr) zusammensetz. leider funktioniert meine umwandlung von int in char* bzw. string nicht.

    char* msg="txt";
    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);
    

    danke im voraus!



  • mach das mal so:

    char str_name[]="/home/toolkit/tmp/top_debug";
    char str_year[]="2005";
    .
    .
    .
    

    so wie du das machst, müsstest du erst deinen char-pointern speicher
    reservieren!



  • 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(); anpassen 🙄

    3. 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.... 🙄


Anmelden zum Antworten