【问题标题】:Which function(s) should I use for getting input from the keyboard?我应该使用哪些功能从键盘获取输入?
【发布时间】:2013-10-23 11:26:00
【问题描述】:

我正在学习 C,现在我想从键盘获取输入(2 个数字范围 [0,99] 并比较它们)。我发现了很多获取输入的选项:

  • scanf()
  • getchar()
  • fgets()
  • gets()

我尝试了其中的一些:

Scanf:

#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");            

}

但是,如果我按 a not a number,它会无限打印:

数字 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");


}

但此代码不起作用。有什么建议吗?

【问题讨论】:

  • 试试gets(),也可以把读取数字的内容封装在一个函数中,避免代码重复

标签: c input


【解决方案1】:

scanf 返回成功扫描的值的数量,或 -1 返回错误。因此,如果scanf 没有返回1,则说明出现问题,您应该采取相应措施。


getchar 的问题在于它返回一个字符(或 EOF 出错。因此,如果您输入一个数字,则只会返回第一个数字,并且作为字符而不是数字。第二次调用然后getchar 将从第一个输入中返回第二个数字,作为一个字符。


我建议输入函数看起来像这样:

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 */

【讨论】:

  • 我不知道!好的! @JoachimPileborg :) 但是我将如何检查它? (通过检查变量 num1?)
  • 因为我在while语句中进行了检查,如果scanf返回-1,它应该再次循环..
  • @Nat95 如果scanf 返回EOF(例如-1),这可能意味着文件结束可能意味着存在错误。在任何一种情况下,您都无法在这种情况下继续。另一方面,如果scanf 返回0,那么您应该跳过输入(使用例如fgets 读入虚拟缓冲区)并告诉用户输入正确的数字。
  • @Nat95 更新了代码以明确比较来自fgetsNULL 的结果,因为fgets 在任何类型的错误上都会返回NULL。在第二个if 我比较了1 因为我扫描了一个项目。如果sscanf 没有返回1,那么扫描该项目时会出现某种问题。
  • @Nat95 continue 语句立即继续循环,因此它会跳回到循环的开头并再次打印提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2011-10-19
  • 2010-11-29
相关资源
最近更新 更多