2014-01-18 15 views
5

これまでに出力された文字数をカウントするために変換文字を使用しようとしています。コードブロックMinGWと%n変換文字

#include <stdio.h> 
int main(void) { 
    int n; 
    printf("%s: %nFoo\n", "hello", &n); 
    printf("%*sBar\n", n, ""); 
} 

正しく動作すると、このコードはHello Fooを出力し、次の行にFooと整列します。

私のLinuxのボックスでGCCをコンパイルするとうまく動作します。しかし、Windows PCのコードブロックでminGWを使用してコンパイルすると、%nが機能せず、そのすべてがhelloです:Barはすべて1行に出力されます。どうして私はこれを修正できますか?

それはこのようになります

答えて

5

使用コンパイルオプション-D__USE_MINGW_ANSI_STDIO

例えば

>gcc prog.c -D__USE_MINGW_ANSI_STDIO 

または

>clang prog.c -D__USE_MINGW_ANSI_STDIO 

もう1つの解決策は、このコマンドを最初のimport文の上に置くことです(下記参照)。これにより、ANSI I/O標準がMicrosoftのものよりも優先されるようになります。このリンクの詳細情報here

#define __USE_MINGW_ANSI_STDIO 1 
#include <stdio.h> 
+0

文書をリンクできますか?私はこれについて詳細を掘り下げようとしばらく過ごしました。私が探していたものが不思議です。 –

+1

@ShafikYaghmour http://sourceforge.net/apps/trac/mingw-w64/wiki/printf%20and%20scanf%20family – BLUEPIXY

3

で、Windowsの問題は、このarticleは言う:

デフォルトのCランタイムライブラリ(MSVCRT.DLL)Vista上では%を持っているのnデフォルトでは無効になっているようだ - もちろん

のセキュリティ上の理由

有効にするには_set_printf_count_outputがあるようです。

BLUEPIXYは順番に、それは外Visual Studioあなたneed to define__USE_MINGW_ANSI_STDIO作業を取得することがわかった:

#define __USE_MINGW_ANSI_STDIO 1 
+0

コードブロックを使用してこのコマンドを呼び出すにはどうすればよいですか?私は未定義の参照エラーがあります。私はVisual Studio 2010でそれを試してみても、同様のエラーが発生しました。 –

+0

わかりません。rextesterのビジュアルスタジオで動作するようにMSDNコードを取得できました。[ライブ参照](http://rextester.com/LQB95928)。 –