2

ここにコードがあります

       printf("\n");
       printf("Enter a integer vaule:");
       scanf("%d" , &num3);
       printf("You entered: %015d", num3);


       printf("Enter a float value:");
       scanf("%f", &deci3);
       printf("You entered: %15.2f", deci3);
       printf("\n");

出力は

       Enter a integer vaule:4.4
       You entered: 000000000000004
       Enter a float value:You entered:            0.40

問題は、このコードが停止していないことです

       printf("Enter a float value:");

そしてこのscanf

      scanf("%f", &deci3);

以前のscanfからその値を取得しているようです

4

4 に答える 4

3

変換は、整数が停止した%dところで停止します。これは小数点です。そこで入力を破棄したい場合は、明示的に…getcループfgetsなどで破棄してください。これにより、入力を検証することもできます。プログラムはおそらく4.4.

于 2013-01-26T00:18:48.327 に答える
0

これは機能しますが、intに4.4と入力しても文句はありません。

#include <stdio.h>

int main() {

char buffer[256];
int i;
float f;

printf("enter an integer : ");
fgets(buffer,256,stdin);
sscanf(buffer, "%d", &i);
printf("you entered : %d\n", i);

printf("enter a float : ");
fgets(buffer,256,stdin);
sscanf(buffer, "%f", &f);
printf("you entered : %f\n", f) ;

return 0;
}
于 2013-01-26T00:32:14.840 に答える
0

関数は、仕様scanfに従って次のように機能します。

入力項目は、一致するシーケンスの最初のサブシーケンスである、入力バイトの最長シーケンス (指定された最大フィールド幅まで。変換指定子に応じて文字数またはバイト数で測定されます) として定義されます。【強調追加】

あなたの例では、次の C 文字列は、最初の呼び出しが入力を要求したときのstdinの内容を表しています: .scanf"4.4\n"

この最初の呼び出しでは、フォーマット文字列は%d、整数を表す単一の指定子 で構成されます。これは、関数が整数の定義を満たすstdinからできるだけ多くのバイトを読み取ることを意味します。あなたの例では、それはstdinを含む4ままにしておくだけです(これが混乱している場合は、整数とは何かを確認することをお勧めします)。".4\n"

2 番目の呼び出しでは、上記のようにstdinに既に含まれているscanfため、ユーザーからの追加入力は要求されません。フォーマット文字列を使用すると、 stdinの現在の値から浮動小数点数を読み取ろうとします。読み取る数値は(仕様によると、ほとんどの場合のように空白を無視します)。".4\n"%f.4scanf\n

あなたの質問に完全に答えるために、問題は を誤用していることではなく、入力しているものと期待する動作scanfとの間に不一致があることです。scanf

人々がそのように入力を台無しにできないことを保証したい場合は、代わりにstrtolandstrtodを組み合わせて使用​​することをお勧めしfgetsます。

于 2013-01-26T00:57:06.000 に答える