2016-07-31 3 views
2
zu arbeiten

Ich versuche, dass ich klar zu machen, wie% n verwendet wird, und ich habe den sehr einfachen Code unterVerwendung von% n mehr als einmal in einem Format-String scheint nicht

#include <stdio.h> 
int main (void) 
{ 
    int c1, c2; 
    printf("This%n is fun%n\n", &c1, &c2); 
} 

Es sollte Drucken Sie "Das macht Spaß" und speichern Sie die Anzahl der in c1 und c2 gedruckten Zeichen. Aber alles, was ich als Ausgabe bekomme, ist der String "This". Ich verwende MinGw v 4.9.3, um dies auf Windows10 zu kompilieren.

+0

Vielleicht werfen Sie einen Blick auf [diese SO-Post] (http://stackoverflow.com/questions/3401156/what-is-the-use-of-the-n-format-specifier-in-c) möglicherweise werfen etwas Licht (-: – user3078414

+0

Haben Sie versucht, '_set_printf_count_output (1);' zu verwenden, um die Verwendung von% n? –

+0

@ YotamSalmon: Das wäre nicht standardkonform! Nicht die erste MS-Umleitung, verwenden Sie nicht MSVC! – Olaf

Antwort

1

Ihr Programm stürzt nach dem Drucken ab This.

MinGW verwendet standardmäßig die Visual C++ - Laufzeit von Microsoft. MSDN sagt folgendes über "% n":

Da das %n Format von Natur aus unsicher ist, wird es durch standardmäßig deaktiviert ist. Wenn %n in einer Formatzeichenfolge auftritt, wird der ungültige -Parameterhandler aufgerufen, wie in Parameter Validation beschrieben. Zur Unterstützung %n Unterstützung, siehe _set_printf_count_output.

Der standardmäßige ungültige Parameterhandler bricht Ihr Programm ab. Entweder aktivieren Sie über _set_printf_count_output(1) oder kompilieren Sie mit -D__USE_MINGW_ANSI_STDIO=1, um es zu verwenden.

+4

Dieses Verhalten von Microsoft Laufzeit verletzt die C-und C++ - Standards. –

+0

@KeithThompson: das ist selten besorgt Microsoft vor - warum sollte es sich jetzt darum kümmern? –

+0

@KeithThompson: Also macht die Nummer - 4711, 10454?: - ((Einfache Lösung: Verwenden Sie nicht MSVC und die MS-libc. – Olaf

Verwandte Themen