仅对 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
将无济于事。
这是一个使用 fgets
和 strtol
检查有效号码的示例:
#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]
我需要让用户输入 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
将无济于事。
这是一个使用 fgets
和 strtol
检查有效号码的示例:
#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]