1

私は C を学んでいますが、キーボードから入力を取得したいと考えています (2 つの数値の範囲 [0,99] とそれらを比較します)。入力を取得するための多くのオプションが見つかりました:

  • scanf()
  • getchar()
  • fgets()
  • 取得()

私はそれらのいくつかを試しました:

スキャン:

#include<stdio.h>

main()  
{
int flag=0,num1, num2;

printf("Give a number between 0-999");

do{

    if(flag == 1){
       printf("Wrong Input. Plz give a number between 0-99 ");    
    }   
    printf("\nnumber 1: ");
    scanf("%d", &num1);
    flag=1;   
}while(num1<0 || num1>1000);

printf("Give one more");
flag=0;

do{

    if(flag == 1){
       printf("Wrong Input. Plz give a number between 0-99 ");    
    }   
    printf("\nnumber 2: ");
    scanf("%d", &num2);
    flag=1;   
}while(num2<0 || num2>1000);

if(num1>num2){
    printf("the max number is : %d\n", num1);
}else 
    if (num1<num2){
        printf("the max number is : %d\n", num2);
    }else
        printf("they are equals\n");            

}

ただし、数字ではないを押すと、無限に印刷されます。

番号 2: 間違った入力。0 から 99 までの数字を入力して
ください。数字 2: 入力が間違っています。0 から 99 までの数字を入力して
ください。数字 2: 入力が間違っています。0 から 99 までの数字を入力してください
。 // そして続きます..

次に、getcharを使用しようとしました。

#include<stdio.h>

main()
{
int flag=0;
char input1,input2;

printf("Give a number between 0-999");

do{

    if(flag == 1){
       printf("Wrong Input. Plz give a number between 0-99 ");    
    }   
    printf("\nnumber 1: ");
    input1 = getchar();
    flag=1;   
}while(input1<0 || input1>1000);

printf("Give one more");
flag=0;

do{

    if(flag == 1){
       printf("Wrong Input. Plz give a number between 0-99 ");    
    }   
    printf("\nnumber 2: ");
    input1 = getchar();
    flag=1;   
}while(input2<0 || input2>1000);

if(input1>input2){
    printf("the max number is : %c\n", input1);
}else 
    if (input1<input2){
        printf("the max number is : %c\n", input2);
    }else
        printf("they are equals\n");


}

しかし、このコードは機能しません。助言がありますか?

4

1 に答える 1

2

scanfは、正常にスキャンされた値の数を返すか、-1エラーが発生した場合に返します。したがって、scanfが返されない場合は1、何かがうまくいかなかったので、それに応じて行動する必要があります。


問題getcharは、それが文字を返すことです(またはEOFエラーが発生した場合。したがって、数字を入力すると、最初の数字のみが返され、数字ではなく文字として返されます。2番目の呼び出しgetcharは、最初の数字から2番目の数字を返します文字として入力します。


代わりに、入力関数は次のようになることをお勧めします。

int get_input(void)
{
    /* Infinite loop */
    for (;;)
    {
        printf("Please enter a value between 1 and 9999 (inclusive): ");
        fflush(stdout);

        char buffer[256];

        /* Read input from the user */
        if (fgets(buffer, sizeof(buffer), stdin) == NULL)
        {
            perror("Error getting input");
            return -1;
        }

        int value;

        /* Extract an integer value from the input */
        if (sscanf(buffer, "%d", &value) != 1)
        {
            printf("Your input was not a valid value.\n");
            continue;  /* Try to get input again */
        }

        /* Check for a valid value */
        if (value >= 1 && value <= 9999)
            return value;  /* Got a value that is allowed */

        printf("Not a valid value.\n");
        /* Since we're in a loop, will continue from the beginning by asking for a value */
    }

    return -1;  /* Must return a value */
}

この関数を呼び出して値を取得し、-1 が返された場合はエラーが発生しました。

int value1;
if ((value1 = get_input()) == -1)
    exit(1);  /* Error reading value */
于 2013-10-23T11:28:25.763 に答える