Zeichen in einen String einfügen



  • Hallo Leute,

    ich habe mal wieder ein Problem beim behandeln von einer Zeichenkette.

    Meine Zeichenkette die ich einlese ist folgende:

    c:\Ordner1\Ordner2\Ordner3\test.dsc

    Nun muss ich diese o.g. Datei zum Einlesen öffnen (mit fopen usw.). Dazu muss der String den ich übergebe ja folgendermaßen aussehen:

    c:\\Ordner1\\Ordner2\\Ordner3\\test.dsc

    Wie kann ich das realisieren?

    Vielen Dank schon einmal für eure Antworten!!

    Chris



  • Zeig doch mal deinen Code und erkläre wieso das du aus '\' '\' machen willst? 😕



  • strcpy(input, "c:\\Ordner\\ini-maker\\ebsini.ini");
    	InputIni = fopen(input, "r");
    	if (InputIni == NULL)
    	{
    		exit(0);
    	}
    

    Hier mal nur was wesentliche. Wenn ich den o.g. String ohne die \\ verwende, funktioniert das Ganze leider nicht.


  • Mod

    Das doppelte \\ brauchst du nur, wenn du in deinem Quellcode ein Stringliteral mit \ drin haben willst. Denn aus einem einfachen \ macht der Präprozessor vor dem Übersetzen des Programms irgendwelche tollen Sonderzeichen. Wenn aber dein Programm erstmal läuft und irgendwoher einen String mit \ drin hat, dann ist das schon genau das was du willst.

    Christiangr schrieb:

    Hier mal nur was wesentliche. Wenn ich den o.g. String ohne die \\ verwende, funktioniert das Ganze leider nicht.

    😕 Dann schreib's doch mit \.



  • hm das verstehe ich dann nicht so ganz. Was genau muss ich denn nun machen, damit das funktioniert?



  • ja das Problem ist nur, dass der String den ich einlesen nicht handisch eingetragen wird, sondern von einem anderen Programm geschrieben wird!



  • Christiangr schrieb:

    ja das Problem ist nur, dass der String den ich einlesen nicht handisch eingetragen wird, sondern von einem anderen Programm geschrieben wird!

    liest du den string aus einer datei ein?



  • ja genau ich lese den Pfad aus einer Datei ein, das Beispiel von oben ist nur um zu verdeutlichen wie ich vorgehe!



  • 💡 dann gibts da keine probleme 💡



  • lese ich den Pfad mit den \\ ein funktioniert das einlesen, wenn ich es mit einem \ einlese funktioniert es nicht... auch im o.g. Beispiel geht es dann nicht!



  • poste code



  • Der Aufruf:

    load_net("C:\\Users\\Christian\\Documents\\Kondensatwasserstrom.wgt", "C:\\Users\\Christian\\Documents\\Kondensatwasserstrom.dsc");
    

    Die Funktion:

    void load_net(speicherfile, dscfile)
    char *speicherfile, *dscfile;
    {
    	long i, j, jin, jout;
    	FILE *input;
    	long FORLIM;
    	char *TEMP;
    	long FORLIM1;
    	char input_NAME[256];
    
    	int scanreturn;
    
    	input = NULL;
    	strcpy(input_NAME, dscfile);
    
    	if (input != NULL)
    		input = freopen(input_NAME, "r", input);
    	else
    		input = fopen(input_NAME, "r");
    	fscanf(input, "%ld%*[^\n]", &(Netz[Netznummer].paramsges));
    	getc(input);
    	fscanf(input, "%ld%*[^\n]", &(Netz[Netznummer].datages));
    	getc(input);
            //hier gehts dann so weiter...
    }
    

    Hinweis: Dieser Code funktioniert so! Ändere ich beim Aufruf aber die \\ in \ gehts nicht mehr. Habe vorher die Strings aus einer Datei eingelesen, ist jetzt erstmal weg, weil ich was getestet hab. Aber die Logik sollte klar sein?!



  • hartcodierte pfade müssen doppelslash haben z.b.

    char* pfad = "C:\\test\\test.dat";
    

    wenn du aus einer datei einliest sollte das so funzen, wenn die pfade stimmen.



  • seltsam, hat vorhin nicht funktioniert. ich guck gleich nochmal, nciht das da irgendwo ein Zeilenumbruch dranhängt oder so?!



  • Also wenn ich Dich richtig verstehe, dass kommen die Strings momentan aus einem Literal, und das brauchst Du wie schon gesagt \\ weil \ in C-Stringliteralen ein Escape-Zeichen für Sonderzeichen ist (wie halt z.B. \n für Linefeed-Return oder \t für Tabulator).

    Da \ alleine ein Escape-Zeichen ist, brauchst Du für das Zeichen '\' im String-Literal ein "\".

    Aber wenn der Dateiname aus einer Datei gelesen wird, oder irgendwie "algorithmisch" entsteht, ist das nicht notwendig, da kein Literal im Quelltext.

    BTW: es ist der Compiler und nicht der Preprozessor, der die String-Literale parsen muss. Der Preprozessor macht nur Macroersetzungen mit ## etc.

    Ansonsten scheint mir Dein Code sehr seltsam. Wieso nutzt Du Parameter nach K&R Schreibweise statt ANSI-C? Ein C++ Compiler im C++ Modus muss kein K&R schlucken. K&R ist seit Ende er 80er obsolet.

    Dann: warum kopierst Du den Dateinamen nochmal extra in ein char-Array. Das ist überflüssig. Gib fopen einfach den String-Pointer!

    Und if(FILE==NULL) ist bei einer uninitialisierten lokalen Variablen sehr fraglich. In C++ wäre sie auf jeden Fall mit dem Default-Wert 0 initialisiert. Bei C bin ich mir momentan nicht mehr sicher, ob globale oder lokale auto Variablen initialisiert werden, oder Müll enthalten.

    Hast Du evtl. ein static vergessen?



  • Paulomat schrieb:

    Da \ alleine ein Escape-Zeichen ist, brauchst Du für das Zeichen '\' im String-Literal ein \.

    Die Forensoftware hat das Doppelbackslash in Anführungszeichen halb gefressen.



  • Christiangr schrieb:

    seltsam, hat vorhin nicht funktioniert. ich guck gleich nochmal, nciht das da irgendwo ein Zeilenumbruch dranhängt oder so?!

    Wenn du den Pfad mit fgets einliest, dann hängt da sehr wahrscheinlich ein Zeilenumbruch dran. Den kannst du einfach mit einer 0 überschreiben.



  • also es ist so: Der Pfad inkl. Dateinamen und Endung kommen aus einer txt-Datei und werden da von einem anderen Programm reingeschrieben. Die Funktion load_net ist nicht von mir und "darf" ich nicht ändern. Somit ist mir erstmal egal was da passiert. Zu dem ganzen C++ und C, ich weiß, dass das alles seltsam ist, aber momentan aufgrund von vielen Dingen nicht zu ändern.
    Ich vermute, dass sich an einem von den Dateinamen noch ein Zeilenumbruch befindet, sodass dadruch die Probleme auftauchen.



  • Wie kann ich denn den Zeilen Umbruch überschreiben mit der "0" ?



  • Besser so:

    Christiangr schrieb:

    void load_net(speicherfile, dscfile)
    char *speicherfile, *dscfile; // <= K&R C ist obsolet, es sei denn der
                                  //Compiler ist 20 Jahre alt.
    // void load_net(char *speicherfile, char *dscfile)
    {
    	long i, j, jin, jout;
    	FILE *input; // auto Variable uninitialisiert auf Stack 
    	long FORLIM;
    	char *TEMP;
    	long FORLIM1;
    	char input_NAME[256]; //wozu? was wenn Pfad länger als 255 Zeichen?
    
    	int scanreturn;
    
    	input = NULL;
    	strcpy(input_NAME, dscfile); // wozu?
               
    
    	if (input != NULL) // ist zufälliger Datenmüll
    
    		input = freopen(input_NAME, "r", input);
    	else
    		input = fopen(input_NAME, "r");
    	fscanf(input, "%ld%*[^\n]", &(Netz[Netznummer].paramsges));
    	getc(input);
    	fscanf(input, "%ld%*[^\n]", &(Netz[Netznummer].datages));
    	getc(input);
            //hier gehts dann so weiter...
    }
    

    Habe im C99 Standard nachgeschaut (ISO/IEC 9899:TC3 Committee Draft — Septermber 7, 2007 WG14/N1256):

    6.2.4 Storage durations of objects
    [...]
    $6 [...] The initial value of the object is indeterminate.


Log in to reply