4

私は今cを学んでおり、ポインターを使用してテキストを印刷できるこの例を思いつきました。

#include <stdio.h>

main ()
{ 
    char *quotes = "One good thing about music, when it hits you, you feel no pain. \"Bob Marley\"\n";
    printf(quotes);     
}

コンパイラから「フォーマットは文字列リテラルではなく、フォーマット引数はありません」という警告が表示され、プログラムを実行すると正常に実行されます。

ここで、コンパイラから同じ警告が表示されたという他の質問をいくつか読みましたが、自分に合った答えが見つかりませんでした。このメッセージが表示される理由がわかりました。

この警告は、printf スタイル関数 (printf、fprintf など) への書式文字列引数を検証できないことを gcc が通知する方法です。この警告は、コンパイラが手動で文字列を覗いて、実行時にすべてが意図したとおりに進むことを確認できない場合に生成されます...

ケース 3. これはややあなたのケースです。実行時に生成された文字列を取得して、印刷しようとしています。表示される警告は、文字列に書式指定子が含まれる可能性があるというコンパイラの警告です。たとえば、「bad%sdata」と言います。この場合、ランタイムは存在しない引数にアクセスして %s と一致させようとします。さらに悪いことに、これはユーザーがプログラムを悪用しようとしている可能性があります (読み取るのが安全ではないデータを読み取ります)。 (答えを見てください)

しかし、コンパイラからの警告を受けないようにするために、私の場合に何を追加する必要がありますか?

4

6 に答える 6

4

「文字列」または文字の配列であるprintf("%s", quotes);指定子を追加するように変更します。quotes

于 2013-10-25T07:55:14.890 に答える
3

printf何を印刷しているのかを伝える必要があります。%s記述子は、文字列を出力していることをprintfに伝えます。

=の形式printf(「印刷するデータの種類の記述子」、データを保持する変数);

文字列の記述子は %s、文字の記述子は %c、int の記述子は %d です

printf を次のように変更します。

printf("%s",quotes);
于 2013-10-25T07:54:57.970 に答える
2

フォーマット文字列を指定する必要があります - 最も単純な形式で:

char *quotes = "One good thing about music(...)\n";
printf("%s", quotes);

または、フォーマット文字列を使用して出力を装飾できます。

char *quotes = "One good thing about music(...)"; // no newline
printf("%s\n", quotes); // newline added here

または、フォーマット文字列をいじりたくない場合は、次のようにします。

char *quotes = "One good thing about music(...)"; // no newline
puts(quotes); // puts() adds newline

また

char *quotes = "One good thing about music(...)\n";
fputs(quotes,stdout);
于 2013-10-25T07:55:12.890 に答える
0

これを試して:

#include <stdio.h>

main ()
{ 
char *quotes = "One good thing about music, when it hits you, you feel no pain. \"Bob Marley\"\n";
puts(quotes);      //Either 
printf("%s",quotes);//or
return 0;
}
于 2013-10-25T08:16:51.140 に答える
0

印刷している文字列に「%」が含まれていると危険なので、警告が表示されます。この行では、パーセントには意味がありませんが、たとえばこれを印刷したい場合:

int main ()
{ 
    int percent = 10;
    char *s = "%discount: %d\n";
    printf(s, percent);     
    return 0;
}

printf が 2 番目のパーセントに遭遇し、printf からスタックから値をポップしようとすると、プログラムがクラッシュする可能性があります。パーセント記号を印刷する場合は、「%%discount:」を使用します。

于 2013-10-25T08:20:22.797 に答える