0

基数nの数値を基数10に変換するプログラムをCで作成しようとしています。メインを含まない、GettainNumber、GetBase、ConvertNumberToBase10、GetMyExponentialの4つの関数があります。私のメイン関数は、GetBase、GettainNumber、GetMyExponential、ConvertNumberToBase10の順序で関数を実行します。私のプログラムは、GetBase関数とGettainNumber関数の両方を実行します。ただし、GettainNumber関数でscanf関数を使用すると、プログラムは他の関数に進みません。

    long int ObtainNumber (long int myNumber)
    {

        scanf("%ld", &myNumber);
        while (myNumber > 999999999)
            {
                printf("Error. Please enter a number with no greater than 9 digits\n");
                scanf("%ld", &myNumber);
            }

        return (myNumber);

}

なぜこれが起こっているのか、どうすれば修正できるのか疑問に思いました。

4

1 に答える 1

1

このscanf()関数は type の結果を返しますint。これは、正常にスキャンされたアイテムの数、またはEOFエラーが発生した場合の値です。プログラムの制御を超えた状況により失敗する可能性があるため、常に結果を確認する必要があります。scanf()

scanf("%ld", ...)先頭の空白 (改行を含む) をスキップした後、オプションで署名された整数定数の構文でテキストを読み取ります。それに続くものはすべて、入力ストリームに残されます。

コードとそれに与えられた入力をもっと見ないと、問題が何であるかを判断するのは困難です。

使用scanfは難しい場合があります。より良いアプローチは、 を使用fgets()して入力行全体を読み取ってから、sscanf()その内容を解釈することです。を使用fgets()すると、次の呼び出しを待つ部分的な入力行を残すことはありません (行が入力バッファーよりも長い場合を除きます)。また、sscanf()呼び出しが失敗しても、入力ストリームの状態には影響しません。

fgets()ではなく を使用することに注意してくださいgets()gets()は本質的に安全ではなく、決して使用すべきではなく、言語標準から削除されました。

于 2013-01-28T04:31:04.760 に答える