2016-05-18 13 views
2

sprintfで間違った書式の文字列を使用すると疑いがあります。たとえば%fが整数の書式指定子として使用されているとします。暗黙の変換を行わないのはなぜですか? 次のプログラムを検討してください。sprintfで間違った書式の型を追加する

#include <stdio.h> 
#include <string> 
using namespace std; 
int main() 
{ 
    int i = 0; 
    char temp[50];int a = 1; 
    sprintf(temp, "%f",a); 
    puts(temp); 
    return 1; 
} 
+2

*間違った書式文字列がsprintf *で使用されているときに疑問があります。*これは未定義の動作です。これを反省する必要はありません。 – PaulMcKenzie

+0

これは 'C standart library'です。 'cout'を使う - それは自動的に型を検出し、書式指示子を必要としない – fnc12

+0

' cout'は多くのユースケースで使いやすいものではない(例えば、数値やポインタを '。'パディング)。加えて文字列には印刷されません。その場合、文字列ストリームが必要になります。 – Dennis

答えて

2

適切なパラメータを指定しない限り、送信するタイプは関数にはわからないためです。

定義によるバリアント関数は、未定義引数の型情報を持たず、与えられたデータから何を得るかを決定する必要があります。

2

sprintf関数には、可変パラメータ・リストがあります。
通常、コンパイラは、連続するパラメータの型を判別するために、2番目の引数(書式文字列)を解析しません。
したがって、暗黙の変換はできません。

+0

コンパイラは、書式文字列に対してparams型をチェックして警告を出すかもしれませんが、それは... – Unda

関連する問題