仅对 c 中的整数使用 scanf

Using scanf only for integers in c

我需要让用户输入 0 到 100 之间的数字。问题是当我在 scanf 中输入字母时,程序崩溃或将其识别为 0.I 希望避免任何用户错误使我的 program.I 以前使用的 getch 崩溃,但我不知道如何使用它获取多位数字。 任何有关如何解决此问题的帮助都会很好。 谢谢。

do
    {
        printf("Enter ID: ");
        scanf("%d", &NewWorkder->id);
        TargetList= FillWorker();
        TargetList= SeekList(Head, NewWorker->id);
    }
    while (NewWorker->id<0 || NewWorker->id>100 || (TargetList)!= (NULL) ||NewWorker->id ==0);
    fprintf(filemechanic,"%s %s %d\n", NewWorker->name, NewWorker->surname, NewWorker->id);
    free(TargetList);
    fclose(filemechanic);
}

如果您想查看 scanf 是否能够成功匹配一个整数,您必须检查 return 值。

换行

scanf("%d", &NewWorkder->id);

至:

if ( scanf("%d", &NewWorkder->id) != 1 )
{
   fprintf( stderr, "Error reading number!\n" );
   exit( EXIT_FAILURE ); 
}

如果要检查值是否在想要的范围内,可以添加如下代码:

if ( newWorker->id < 0 || newWorker->id > 100 ) )
{
   fprintf( stderr, "Input is out of range!\n" );
   exit( EXIT_FAILURE ); 
}

如果您不希望您的程序在错误输入时退出,但希望它打印一条错误消息并再次提示用户,您可以改用以下代码:

bool bad_input;

do
{
    bad_input = false;

    //prompt user for input
    printf("Enter ID: ");

    //call scanf and verify that function was successful
    if ( scanf("%d", &NewWorkder->id) != 1 )
    {
        printf( "Error reading number, try again!\n" );
        bad_input = true;
    }

    //verify that input is in range
    if ( newWorker->id < 0 || newWorker->id > 100 ) )
    {
        printf( "Number must be between 0 and 100, try again!\n" );
        bad_input = true;
    }

    //discard remainder of line
    for ( int c; (c=getchar()) != EOF && c != '\n'; )
        ;

} while ( bad_input );

但是,对于基于行的输入,我不建议使用 scanf,因为该函数不会从输入流中提取整行;它只提取所需的量。这可能会造成混淆 can lead to programming bugs. Instead, I would recommend using fgets and strtol instead. See the other answer for such a solution. Also, I suggest that you read this guide: A beginners' guide away from scanf()

根本不要使用 scanf。也许您可以使用它的 return 值来查看是否根本没有输入任何数字,但是如果您不希望像 12ab 这样的输入有效,那么 scanf 将无济于事。

这是一个使用 fgetsstrtol 检查有效号码的示例:

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

int main(void)
{
    char nptr[1024];
    char *errptr;
    long n = 0;
    do
    {
        printf("Enter a base-10 number: ");
        fgets(nptr, sizeof nptr, stdin);
        n = strtol(nptr, &errptr, 10);
    } while ((*errptr != '\n' && *errptr != '[=10=]') || n < 0 || n > 100);
}

运行 示例:

Enter a base-10 number: ab
Enter a base-10 number: 12ab
Enter a base-10 number: -1
Enter a base-10 number: 101
Enter a base-10 number: 123
Enter a base-10 number: 50
[end]