0

string を printf に渡すと、コードが正しく機能しません:

char p[50];
scanf("%s", p); 
printf(p, 10); 

入力:value:%d\n

期待される出力:value:10

出力:value:10\n

また、異なる時間に異なる出力を得ました。3 回連続して実行したときの同じ a.out の出力:

$./a.out

value: %d\n
value:

$./a.out

value:%d\n\n
value:10\n\n

$./a.out

value:%d\n
value:10\n

上記value: %d\nはscanfによるもので、次の行はprintfによるものです

4

2 に答える 2

4

に最初の引数としてユーザー指定のテキストを渡す場合は、細心の注意を払ってください。そうしないprintfと、フォーマット文字列の脆弱性が発生します。さらに、ベアを使用すると、バッファオーバーフローscanfに対しても脆弱になります。(わずか3行のコードに2つの脆弱性があります!)

\nとはいえ、出力でリテラルを取得する理由\nは、コンソールで入力nすると、改行文字ではなく、リテラルのバックスラッシュの後に。が続く文字列を取得するためです。

また、空白でscanf停止するため、入力するとバッファvalue: xxxにのみ入ることに注意してください。行全体を読みたい場合は、代わりに次value:のような関数を使用する必要があります。fgets

于 2013-02-27T07:37:48.930 に答える
0

コードは想定どおりに動作します。最初の例では、「10」の前にスペースを渡したので、印刷されていません。

最も簡単な修正は、scanf() の代わりに fgets() を使用することです。

#include <stdlib.h>
#include <stdio.h>

void main () {
  char p[50];
  fgets(p, 50, stdin);
  //scanf("%s", p);
  printf(p, 10);
}

その理由は、fgets() が標準入力から 1 行だけを取得するためです。その行に含まれる文字は気にしません。一方、scanf() では、どの文字がどの順序で表示されるかを正確に指定する必要があります。

詳細については、 scanffgetsのマニュアル ページを参照してください。

于 2013-02-27T07:40:21.863 に答える