ページ 1 / 1
cのプログラミング基礎
Posted: 2017年11月10日(金) 20:36
by shika
printf()関数で、%nで出力文字数を表示せせてみましたが、本での解説では、文字数が15文字に成っていますが、
自分でパンチしてコンパイルしてみると、13文字に成っています。cl コンパイラと、gcc コンパイラでは、仕様が違うのでしょうか?
以下にコードを記載しておきます。
コード:
#include <stdio.h>
int main(void)
{
int i;
printf("%d %f\n%n", 100, 123.23, &i);
printf("これまでの出力文字数は、%d 個です。\n", i);
return 0;
}
100 123.230000
これまでの出力文字数は、15個です。
での、15 が、13 なのです。
考えられるのは、半角スペースと、小数点(ピリオド)の2個が、カウントされないからなのかどうかと言う事
の様に見えますが、憶測を超えません。
どなたか詳しい方は、どうぞ御教授下されば幸いです。
Re: cのプログラミング基礎
Posted: 2017年11月10日(金) 21:35
by shika
誠に申し訳ありませんが、誤記を訂正して置きます。
せせて、は、させて、です。
それと、空白と¥nが、無視されている様です。に修正して置きます。
Re: cのプログラミング基礎
Posted: 2017年11月10日(金) 22:04
by Bull
VC++ではデフォルトでは%nサポートが無効の状態です。
有効にするには、_set_printf_count_output()関数を使用します。
コード:
#include <stdio.h>
int main(void)
{
int i;
_set_printf_count_output(1);
printf("%d %f\n%n", 100, 123.23, &i);
printf("これまでの出力文字数は、%d 個です。\n", i);
return 0;
}
Re: cのプログラミング基礎
Posted: 2017年11月11日(土) 12:34
by shika
御教授ありがとうございます。
これで解決できます。
Re: cのプログラミング基礎
Posted: 2017年11月11日(土) 13:20
by shika
cl の場合でなくて、gccの場合の説明を望んでいます。
今、問題なのは、gccでの場合です。
どうか御教授願います。
Re: cのプログラミング基礎
Posted: 2017年11月20日(月) 17:41
by Bull
解決した後見てなかったので、遅くなりました。
gccはあまり詳しくないので、私のわかることだけですが。
まずgccはいろいろなOSで動作し、バージョンによっても事情が変わってくるので、使用している環境を明示していただいた方がいいのです。VC++をお使いのようなので、Windowsと仮定して回答します。もしWindowsでない場合は補足していただければ、他の人からも答えて頂けるかもしれません。
Windowsで動作するgccはCygwinとMinGWが有りますが、私はMinGWしか使ってないので、MinGWについて回答します。MinGWもいろいろな亜流があるようですが、現在使っているのはgcc (tdm64) 5.1.0です。他のものではまた、違うかもしれないです。
この問題はコンパイラーというよりは、VC++ライブラリの問題です。MinGWはVC++のライブラリ(msvcrt.dll)を使っているので、同じ現象がおこります。CygwinやLinuxで実行した場合は、この問題は起こらないのではないかと考えています。
回避策は#include <stdio.h>の前に#define __USE_MINGW_ANSI_STDIO 1を記述することです。
コード:
#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
これで、独自のprintfを使うようになり、"%n"が機能するようになります。