gpt4 book ai didi

c - C程序中的错误处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 03:45:12 25 4
gpt4 key购买 nike

我是一名 C 编程新手,并试图通过在这里编写一个原始的数字猜谜游戏来尝试一下。 (我保证这不是学校作业)。但是由于我在尝试完成整个功能时遇到了一些麻烦,我想也许我需要一点帮助。所以基本上我已经完成了这个程序的主要猜测部分:指示用户他的猜测太高或太低或者它是正确的答案。但是,如果用户输入一些无效值,如字符或小数(他们应该只输入 1-100 之间的整数),我的程序将提示用户猜测超出范围并自动循环此消息直到猜测时间用完了。我检查了我的代码,但无法弄清楚。如果有人能给我一个线索,我将不胜感激!这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_NUMBER 100

int main(void) {
int randNum;
srand((int)time(0));
randNum = rand() % 100 + 1;

long guessNum;
char guessStr[80];
guessNum = atoi(guessStr);
int count = 0;

do {
printf("\nplz enter a guess from integer 1 to 100: %d", randNum);
scanf("%ld", &guessNum);

if (guessNum < randNum && guessNum >= 1) {
printf("your guess is lower than the selected number");
count++;
printf("\nyou have %d times left to try", 100 - count);
}
if (guessNum > randNum && guessNum <= 100) {
printf("your guess is higher than the selected number");
count++;
printf("\nyou have %d times left to try", 100 - count);
}
if (guessNum < 1 || guessNum > 100) {
printf("your guess is out of the range, plz pick between 1-100");
count++;
printf("\nyou have %d times left to try", 100 - count);
}
if (guessNum == randNum) {
printf("congrats you got the right answer");
count++;
printf("\nyou used %d times to make the right guess", count);
}

} while (count < MAX_NUMBER);
printf("\nthe guess time is used out!");

return 0;
}

最佳答案

如果 scanf 检测到与转换说明符不匹配的输入(例如在需要数字的地方看到一个字母),它将在该点停止扫描并将该字符留在输入流中,它会在下一次阅读和之后的下一次阅读中犯规。

有几种方法可以解决这个问题。

首先,scanf返回转换和赋值成功的次数;例如,如果 scanf 能够从输入流中读取整数值,则 scanf( "%d", &value ); 将返回 1。因此,作为开始,我们可以检查一下:

if ( scanf( "%d", &guessNum ) == 1 )
{
// test the value of guessNum
}
else
{
// input wasn't a valid integer; consume input until we see a newline
char c;
while ( ( c = getchar() ) != '\n' )
;
}

一个问题是,如果您输入类似 12r 的内容,scanf 将在离开 r 时转换并分配 12 在输入流中。理想情况下,您希望拒绝整个输入。您可以在输入后立即读取字符,如下所示:

char follow;
int itemsRead = scanf( "%d%c", &guessNum, &follow );
if ( itemsRead == 2 && isspace( follow ) )
{
// test value of guessNum
}
else
{
// input was not an integer followed by a newline
while ( getchar() != '\n' )
;
}

这可以保护您免受 12r 之类的情况的影响。但是,仍然存在弱点。信不信由你,scanf( "%d") 不会

这样的输入阻塞
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890

即使这样的值不能由 native int 类型表示。同样,您希望能够完全拒绝此类错误的输入。

第三种方法是将输入读取为文本,然后使用诸如 atoistrtolsscanf 之类的方法对其进行转换。我的首选方法是使用 strtol,如下所示:

char input[MAX_INPUT_LEN]; // where MAX_INPUT_LEN is appropriate for a signed
// integer value; a 32-bit int can represent up to
// 10 decimal digits, plus the sign, plus the
// 0 terminator.

if ( fgets( input, sizeof input, stdin ) )
{
if ( !strchr( input, '\n' ) ) // if newline is not present in the input buffer
{
fprintf( stderr, "Input too long!\n" );
while ( getchar() != '\n' )
;
}
else
{
char *follow; // will point to first non-digit character in input
int tmp = strtol( input, &follow, 10 ); // convert input string to equivalent
// integer value;
if ( !isspace( *follow ) && *follow != 0 )
{
fprintf( stderr, "%s is not a valid integer value\n", input );
}
else
{
guessNum = tmp;
// test value of guessNum
}
}
}

您会希望根据您的需要对其进行调整(理想情况下将大部分废话隐藏在它自己的函数中),但您应该明白这一点。

关于c - C程序中的错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25170023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com