合計 昨日 今日

cのプログラミング基礎

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: shika
[URL]
Date: 2017年11月10日(金) 20:36
No: 1
(OFFLINE)

 cのプログラミング基礎

printf()関数で、%nで出力文字数を表示せせてみましたが、本での解説では、文字数が15文字に成っていますが、
自分でパンチしてコンパイルしてみると、13文字に成っています。cl コンパイラと、gcc コンパイラでは、仕様が違うのでしょうか?
以下にコードを記載しておきます。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
#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個が、カウントされないからなのかどうかと言う事
の様に見えますが、憶測を超えません。
どなたか詳しい方は、どうぞ御教授下されば幸いです。

Name: shika
[URL]
Date: 2017年11月10日(金) 21:35
No: 2
(OFFLINE)

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

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

Name: Bull
[URL]
初心者(6,758 ポイント)
Date: 2017年11月10日(金) 22:04
No: 3
(OFFLINE)

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

VC++ではデフォルトでは%nサポートが無効の状態です。
有効にするには、_set_printf_count_output()関数を使用します。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
#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;
}

Name: shika
[URL]
Date: 2017年11月11日(土) 12:34
No: 4
(OFFLINE)

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

[解決!]

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

Name: shika
[URL]
Date: 2017年11月11日(土) 13:20
No: 5
(OFFLINE)

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

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

Name: Bull
[URL]
初心者(6,758 ポイント)
Date: 2017年11月20日(月) 17:41
No: 6
(OFFLINE)

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

解決した後見てなかったので、遅くなりました。
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を記述することです。
コード[C]: 全て選択
1
2
#define  __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>

これで、独自のprintfを使うようになり、"%n"が機能するようになります。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[17人]