cのプログラミング基礎

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
shika

cのプログラミング基礎

#1

投稿記事 by shika » 6年前

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個が、カウントされないからなのかどうかと言う事
の様に見えますが、憶測を超えません。
どなたか詳しい方は、どうぞ御教授下されば幸いです。

shika

Re: cのプログラミング基礎

#2

投稿記事 by shika » 6年前

誠に申し訳ありませんが、誤記を訂正して置きます。
せせて、は、させて、です。
それと、空白と¥nが、無視されている様です。に修正して置きます。

Bull
記事: 149
登録日時: 9年前

Re: cのプログラミング基礎

#3

投稿記事 by Bull » 6年前

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;
}

shika

Re: cのプログラミング基礎

#4

投稿記事 by shika » 6年前

御教授ありがとうございます。
これで解決できます。

shika

Re: cのプログラミング基礎

#5

投稿記事 by shika » 6年前

cl の場合でなくて、gccの場合の説明を望んでいます。
今、問題なのは、gccでの場合です。
どうか御教授願います。

Bull
記事: 149
登録日時: 9年前

Re: cのプログラミング基礎

#6

投稿記事 by Bull » 6年前

解決した後見てなかったので、遅くなりました。
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"が機能するようになります。

返信

“C言語何でも質問掲示板” へ戻る