Hallo, ich möchte mehrere Textfiles erstellen, die alle dasselbe Präfix haben und eine angehängte fortlaufende Nummerierung. Warum funktioniert das Folgende nicht? Ich habe mir überlegt, zunächst 3 getrennte Strings anzulegen: char* endung={".txt"}; char* praefix={"text"}; char* nummer={"0"}; Jetzt hänge ich die mit strcat aneinander und übergebe den Gesamtstring der Funktion fopen als Dateinamen. --> FRAGE: Geht das überhaupt? Kann ich fopen einen solchen String übergeben, oder muss er ausgeschrieben (hartcodiert) werden? Anschließend wollte ich für fortlaufende Nummern den String nummer "hochzählen", indem ich ihn als Array sehe und das nullte Element (was ja char ist) hochzähle: nummer[0]++; Aber das scheint nicht zu funktionieren, ich wollte es mir zur Kontrolle folgendermaßen anzeigen lassen: 1 printf("%s\n",nummer); // gibt "0" aus 2 printf("%c\n",nummer[0]); // gibt "0" aus 3 nummer[0]++; // scheint nicht zu funktionieren 4 printf("%s\n",nummer); // Zeilen 4 und 5 werden scheinbar igno- 5 printf("%c\n",nummer[0]); // riert, es ist keine Anzeige zu sehen. mit nummer[0]=nummmer[0]+1 in Zeile 3 geht's übrigens auch nicht. WARUM?
Schau Dir mal in einer ASCII Tabelle an, welches Zeichen nach "0" kommt. Vielleicht kommst Du dann ja selbst darauf, was da nicht stimmt. Murkser
Murkser schrieb: > Schau Dir mal in einer ASCII Tabelle an, welches Zeichen nach "0" kommt. > Vielleicht kommst Du dann ja selbst darauf, was da nicht stimmt. Das ist nicht das Problem, das auf "0" folgende Zeichen ist "1".
Murkser schrieb: > Schau Dir mal in einer ASCII Tabelle an, welches Zeichen nach "0" kommt. Aber die 0 ist hier doch der Character '0', also 0x30?! In Anbetracht dessen, dass nummer ein string ist, wäre das doch auch logisch. Dann kommt beim Hochzählen 0x31 und damit das Zeichen '1'. Oder wird ein String "65" bei zeichenweiser Ausgabe (als Array) auch als A ausgegeben? Woher wüsste der Compiler dann, das ich EINE 65 meine und nicht EINE 6 und EINE 5 ? Rufus Τ. Firefly schrieb: > Das ist nicht das Problem, das auf "0" folgende Zeichen ist "1". Genau ;)
Mark M. schrieb: > Aber die 0 ist hier doch der Character '0', also 0x30?! > In Anbetracht dessen, dass nummer ein string ist, wäre das doch auch > logisch. Dann kommt beim Hochzählen 0x31 und damit das Zeichen '1'. So ist es. Mark M. schrieb: > Oder wird ein String "65" bei zeichenweiser Ausgabe (als Array) auch als > A ausgegeben? Woher wüsste der Compiler dann, das ich EINE 65 meine und > nicht EINE 6 und EINE 5 ? Nein. Worauf lässt Du Dein Programm laufen? In was für einem Speicherbereich werden Stringkonstanten Deines Programmes abgelegt? Und warum habe ich das Wort Stringkonstanten kursiv geschrieben?
Ok, Stringkonstanten können nicht verändert werden? Aber wieso wird dann garnichts angezeigt und das Programm ab der Veränderung, die nicht möglich ist, komplett ignoriert, ohne Fehlermeldung? Es ist ein einfaches Konsolenprogramm mit GNU GCC Compiler. Ist die Veränderung der Stringkonstanten auch nicht mit Indexansprache möglich?
Mark M. schrieb: > Ok, Stringkonstanten können nicht verändert werden? Das kann so sein, muss aber nicht. Hängt vom Zielsystem und dem verwendeten Compiler ab. > Aber wieso wird dann garnichts angezeigt und das Programm ab > der Veränderung, die nicht möglich ist, komplett ignoriert, > ohne Fehlermeldung? Das wird Dir nur Dein Debugger verraten können, in dem Du Dein Programm mal laufen lassen solltest.
Mal eine ganz andere Frage: Warum muß es denn unbedingt mit Rumrechnen der ASCII-Werte sein? Wäre sprintf hier nicht deutlich einfacher? Mit festem Präfix und Erweiterung: int nummer; sprintf(output_string, "text%d.txt", nummer); Oder wenn Präfix und Endung sich ändern: sprintf(output_string, "%s%d%s", praefix, nummer, endung); Servus Michael
Mark M. schrieb: > Ok, Stringkonstanten können nicht verändert werden? Aber wieso wird dann > garnichts angezeigt und das Programm ab der Veränderung, die nicht > möglich ist, komplett ignoriert, ohne Fehlermeldung? Das Verhalten ist undefiniert. Das von dir beobachtete Ergebnis ist eine Ausprägung davon. > Ist die Veränderung der Stringkonstanten auch nicht mit Indexansprache > möglich? Ob nun mit Index oder ohne - eine Konstante darf man nicht ändern, sonst wäre es ja keine Konstante. Rufus Τ. Firefly schrieb: > Mark M. schrieb: >> Ok, Stringkonstanten können nicht verändert werden? > > Das kann so sein, muss aber nicht. Hängt vom Zielsystem und dem > verwendeten Compiler ab. Die bessere Formulierung wäre vielleicht, daß Strinkonstanten nicht verändert werden dürfen. Je nach Compiler kann man nämlich das Pech haben, daß es tatsächlich zu funktionieren scheint.
Mark M. schrieb: > Oder wird ein String "65" bei zeichenweiser Ausgabe (als Array) auch als > A ausgegeben? Woher wüsste der Compiler dann, das ich EINE 65 meine und > nicht EINE 6 und EINE 5 ? Und um das auch noch zu beantworten. Was wohl ist der UNterschied in printf( "%d", 65 ); printf( "%c", 65 ); printf( "%s", "65" );
Mark M. schrieb: > char* endung={".txt"}; > > char* praefix={"text"}; > > char* nummer={"0"}; Mark M. schrieb: > 3 nummer[0]++; // scheint nicht zu funktionieren so wird was draus: char endung[] = {".txt"}; char praefix[] = {"text"}; char nummer[] = {"0"}; nummer[0]++; // funktioniert Mark M. schrieb: > 4 printf("%s\n",nummer); // Zeilen 4 und 5 werden scheinbar igno- > > 5 printf("%c\n",nummer[0]); // riert, es ist keine Anzeige zu sehen. die Zeilen 4 und 5 werden nicht ignoriert, sondern das Programm stürzt in Zeile 3 ab (Access violation). mfg.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.