0

整数変数に浮動値を入力すると、期待どおりに小数部分がスキップされますが、その後はコンソールから値が読み取られない ac プログラムを実行しようとしています。次のコード スニペットでは、入力すると scanf 行がスキップされます浮動小数点値です。理由が見つかりません。助けてください。

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

#define SIZE 50

void push(int i);
int pop(void);

int *tos, *p1, stack[SIZE];

int main(void)
{
    int value;
    tos = stack; /* tos points to the top of stack */
    p1 = stack; /* initialize p1 */

    do
    {
        printf("\n Enter value: \n");
        scanf("%d", &value);
        printf("\n value entered is %d",value);

        if(value!=0)
            push(value);

        else
            printf("value on top is %d\n", pop());

    } while(value!=-1);

    return 0;
}


void push(int i)
{
    p1++;

    if(p1==(tos+SIZE))
    {
        printf("Stack Overflow.\n");
        exit(1);
    }
    *p1 = i;
}


int pop(void)
{
    if(p1==tos)
    {
        printf("Stack Underflow.\n");
        exit(1);
    }
    p1--;

    return *(p1+1);
}

コンソールから浮動小数点値を入力している間、小数部分を無視し、その後実行を続けますが、scanf ステートメントが機能しないため、スタックがいっぱいになるまで実行した後、終了します。ここで scanf が機能しない理由を見つけるのを手伝ってください?

4

1 に答える 1

4

scanf整数値を読み取るように要求します。次に、たとえば浮動小数点値を入力するscanfと、最初の数値が読み取られ、「ポイント」で停止します。次に入力を読み取ろうとすると、「ポイント」が表示され、何も読み取られません。

の戻り値を確認する必要がありscanfます。正常に読み取られて変換されたアイテムの数が返されるため、最初の呼び出しでは が返されます1が、他のすべての呼び出しでは が返されます0

行全体を ( を使用して) バッファーに読み込むことで、これを解決できます。fgetsたとえばsscanf、バッファーで使用します。ただし、戻り値をチェックして、ユーザーが有効な整数を入力したかどうかを確認する必要があります。

于 2013-08-29T05:57:16.243 に答える