1

このdo/whileループを初めて実行した後、出力には常にprintfの前に余分なスペースがあるように見えます。バッファオーバーフローと関係があるのではないかと思いますが、どうやって取り除くのかよくわかりません。

どんな助けでも大歓迎です、ありがとう!

do {
   printf("Enter a format specifier: ");
   scanf(" %c", fmt+1);
   printf(fmt, value);
} while(*(fmt+1) != 'q');

**fmtはchar配列です。

4

1 に答える 1

0

次のように、コードを完全なプログラムに拡張しました。

#include "stdio.h"

main () {
    char fmt[2] = "% ";
    int value = 23;
    do {
        printf("Enter a format specifier: ");
        scanf(" %c", fmt+1);
        printf(fmt,value);
    } while(*(fmt+1) != 'q');
}

...そして、次の結果を得ました:

Enter a format specifier: i
23h (Enter a format specifier: d
23h (Enter a format specifier: x
17h (Enter a format specifier: o
27h (Enter a format specifier: q
qh (

この出力は、あなたが観察したように見えるものとは少し異なっていましたが、原理的には同じかもしれないと思います. もしそうなら、それはあなたが推測した通りだと思いますfmt.C文字列の最後にあるはずのnullを含めるのに十分な長さのないchar配列として宣言されているという事実によって引き起こされるバッファオーバーフローエラー. したがって、printf()たまたま null に遭遇するまで、フォーマット文字の後にランダム データを書き込み続けました。

コードの 4 行目を変更して、文字列に表示される文字と終端の null のための十分なスペースがあることを確認します。

char fmt[] = "% ";

... 次の結果が得られます (これは、おそらく、あなたが期待したようなものでしたか?):

Enter a format specifier: i
23Enter a format specifier: d
23Enter a format specifier: x
17Enter a format specifier: o
27Enter a format specifier: q
q

この問題の詳細については、Char array initialization dilemmaを参照してください。

于 2013-01-14T09:29:39.120 に答える