2010-11-20 3 views
14

Mein Programm ist wie folgt;Warum stört die Verwendung des falschen Formatbezeichners in C mein Programm unter Windows 7?

Ich kompiliere unter gcc, und obwohl es mir keine Fehler gibt, stürzt das Programm jedes Mal ab, wenn ich es laufe. Der Code scheint aus Beispielen, die ich gesehen habe, gut zu sein. Es wäre toll zu wissen, ob ich irgendetwas falsch mache.

Danke.

+0

Danke an alle. Hätte ich gesehen, ich habe gerade mit C angefangen und habe bisher nur mit Textprogrammen gespielt, die Strings benutzen, also kam% s einfach automatisch in den Sinn. – austinprete

+4

+1, weil ich gelernt habe, dass ich% all statt %% oder sogar% –

+1

verwenden sollte Wenn du GCC verwendest, mach deine Fehler mit "-Wall" oder vielleicht "-Wextra" oder vielleicht '-Werror'. GCC ist in der Lage, die Formatzeichenfolge zu prüfen und vor fehlerhaften Argumenten für die Funktionen "printf", "scanf", "strftime" und "strfmon" zu warnen. –

Antwort

16

Unrichtiger Formatbezeichner in printf() ruft nicht definiertes Verhalten. Correct Formatspezifizierer sollte %zu (nicht %d) sein, da der Rückgabetyp strlen() ist size_t

Hinweis: Längenmodifizierer z in %zu eine ganze Zahl von Länge gleich wie size_t

+0

Wann hat GCC unter Windows die Verwendung des Microsoft CRT gestoppt? Ich habe bei der letzten Verwendung von% zu MinGW Fehler erhalten, oder gibt es eine andere gcc-Version, die glib verwendet? –

+0

@Pete: Sie sollten keinen solchen Fehler erhalten. Stellen Sie sicher, dass Sie die neueste Version von MinGW mit C99-Unterstützung verwenden. –

+0

Süß! Irgendwelche ETA für MingW, die emulierte UTF-8-Sprachumgebung über den Fenstern _wfopen usw. implementiert? –

2
printf("That string is %d characters long.\r\n", strlen(string)); 

statt:

printf("That string is %s characters long.\r\n", strlen(string)); 
+0

eine Sache, ändern Sie den Variablennamen "string" in einen anderen. "String" ist reserviertes Wort. –

+0

Ok, danke.Ich habe 'string' benutzt, um ein schnelles Programm zusammenzustellen, das Streicherlänge hat, während ich ein Programm schreibe, das Palindrome erkennt und ein Gefühl dafür bekommen möchte, wie ich es machen würde. Ich werde daran denken, es in der Zukunft nicht zu verwenden. – austinprete

+0

Syntaktisch ist 'string' kein Schlüsselwort. Es ist jedoch, wie alle Namen beginnend mit 'str',' mem' oder 'wcs'," reserviert für die zukünftige Verwendung "als String-Funktion in der' ' Header. (Quelle: ISO C99, 7.26.11) –

7

Sie haben falsche Formatangabe. %s wird für Strings verwendet, aber Sie übergeben size_t (strlen(string)). Die Verwendung eines falschen Formatspezifizierers in printf() ruft undefiniertes Verhalten auf. Verwenden Sie stattdessen %zu, da der Rückgabetyp strlen()size_t ist.

So

printf("That string is %s characters long.\r\n", strlen(string)); 

ändern:

printf("That string is %zu characters long.\r\n", strlen(string)); 

Da Sie gcc verwenden Sie einen Blick here für weitere Informationen, was zu printf weitergegeben werden können

+1

Die Verwendung von 'gcc' zum Kompilieren bedeutet nicht unbedingt, dass Sie den glibc zur Ausführung Ihres Codes verwenden. –

2

Sie haben ein Problem hier printf("That string is %s characters long.\r\n", strlen(string));

setzen

printf("That string is %d characters long.\r\n", strlen(string)); % d, weil Sie Länge von str DruckenDas wollen (strlen Rücksendenummer)

1

Programm stürzt ab, weil die Formatierung Routine versucht, eine Zeichenfolge an der Adresse für den Zugriff auf 0x0000001D, die das Ergebnis von strlen() ist, wo es nichts wie eine Schnur und wahrscheinlich gibt es überhaupt keine zugängliche Erinnerung.

Verwandte Themen