0

2 つの printf 呼び出しを使用せずに、この印刷を適切に行うにはどうすればよいですか?

char* second = "Second%d";
printf("First%d"second,1,2);
4

5 に答える 5

2

あなたが私たちに示したコードは構文的に無効ですが、私はあなたが次と同じ効果を持つ何かをしたいと思っていると思います:

printf("First%dSecond%d", 1, 2);

ご存じのとおり、 の最初の引数printfはフォーマット文字列です。リテラルである必要はありません。好きなように構築できます。

次に例を示します。

#include <stdio.h>
#include <string.h>
int main(void)
{
    char *second = "Second%d";
    char format[100];
    strcpy(format, "First%d");
    strcat(format, second);

    printf(format, 1, 2);

    putchar('\n');
    return 0;
}

いくつかのメモ:

出力の後に改行を追加しました。出力テキストは (ほとんど) 常に改行で終了する必要があります。

フォーマット文字列に 100 バイトの任意のサイズを設定しました。より一般的には、次のように宣言できます。

char *format;

への呼び出しで初期化し、malloc()実際に必要なサイズを割り当てます (そしてmalloc()、null ポインターを返すことによって失敗を通知しなかったことを確認します)。あなたはそれをfree(format);終えた後に電話したいと思うでしょう。

templatetypedef がコメントで述べているように、フォーマット文字列が制御されていないソースからのものである場合、この種のことは潜在的に危険である可能性があります。

(または、2 回呼び出すこともできます。1printf回呼び出すよりもそれほど高価ではありません。)

于 2012-06-21T21:18:29.010 に答える
0

プリプロセッサを使用して、2つの文字列を連結します。

#define second "Second%d"
printf("First%d"second,1,2);

実際のプログラムではこれを行わないでください。

于 2012-06-21T21:21:18.773 に答える
0
char *second = "Second %d";
char *first = "First %d";
char largebuffer[256];

strcpy (largebuffer, first);
strcat (largebuffer, second);
printf (largebuffer, 1, 2);

上記の方法のような生成されたフォーマットを使用する際の問題は、printf() 関数が可変長の引数リストであるため、提供された引数の数を知る方法がないことです。提供されたフォーマット文字列を使用し、フォーマット文字列で説明されているタイプを使用して、引数リストからその数とタイプの引数を選択します。

上記の例のように、2 つの %d 形式があり、それらの場所に出力される 2 つの整数が指定されている場合のように、正しい数の引数を指定すると、すべて問題ありません。ただし、次のようなことをするとどうなりますか。

char *second = "Second %s";
char *first = "First %d";
char largebuffer[256];

strcpy (largebuffer, first);
strcat (largebuffer, second);
printf (largebuffer, 1);

この例では、printf() 関数はフォーマット文字列と可変数の引数を想定しています。フォーマット文字列は、整数とゼロで終了する文字列の 2 つの追加引数があることを示しています。ただし、追加の引数が 1 つだけ提供されているため、printf() 関数は、スタック上で次にあるものをゼロで終了する文字列へのポインターとして使用します。

運が良ければ、printf() 関数がポインターとして解釈するデータは、アプリケーションの有効なメモリー アドレスであり、ポイントされるメモリー領域は、ゼロで終わる 2 つの文字になります。運が悪いと、ポインターがゼロまたはガベージになり、すぐにアクセス違反が発生し、アプリケーションのクラッシュの原因を簡単に見つけることができます. まったく運が悪い場合、ポインターは約 2K 文字の有効なアドレスを指すのに十分であり、その結果、printf() はスタックを完全に台無しにし、雑草と結果のクラッシュ データはほとんど役に立ちません。

于 2012-06-21T21:36:43.490 に答える
0
char *second = "Second%d";
char tmp[256];
memset(tmp, 0, 256);
sprintf(tmp, second, 2);
printf("First%d%s", 1,tmp);

またはそのようなもの

于 2012-06-21T21:12:40.400 に答える
-1

出力が必要だと思います:

First 1 Second 2

これを行うには、printfの機能をもう少しよく理解する必要があります。これが非常に便利な本当の理由printfは、文字列を出力するだけでなく、変数をフォーマットすることです。変数をどのようにフォーマットするかによって、異なるフォーマット文字を使用する必要があります。変数を符号付き整数としてフォーマットするように%d指示しますが、これは既に知っています。ただし、 float や double、long 整数、stringprintfなど、他の形式もあります。%f%l%%schar*

%sフォーマット文字を使用してchar*変数 を出力するとsecond、コードは次のようになります。

char* second = "Second";
printf ( " First %d %s %d ", 1, second, 2 );

これはprintf、最初の変数を整数として、2 番目を文字列として、3 番目を別の整数としてフォーマットすることを示しています。

于 2012-06-21T21:27:55.177 に答える