gpt4 book ai didi

C 中的检查循环 - scan() 未在第二次运行时运行

转载 作者:行者123 更新时间:2023-12-04 02:28:56 24 4
gpt4 key购买 nike

void openMenu(int *op) {//edited
do {
printf("Your turn...\t\n");
scanf(" %d", op);
if (*op > 14 || *op < 1 ) {
printf("Only enter a number between 1 and 14!\n");
}
} while (*op > 14 || *op < 1 );
}

我正在尝试创建一个检查循环来控制输入的值是否在 114 之间。如果有字母也必须重复,输入过程。

也许它没有工作,每次在第二次运行时 scanf 都没有运行。

我检查了在 %d 前面设置一个空格的东西,但它也不起作用...你有什么好主意吗?

在 Mac 11.1 上使用 Xcode

最佳答案

您需要检查 scanf 的返回值:

#include <stdio.h>

void openMenu(int *op) {//edited
do {
printf("Your turn...\t\n");
if (scanf(" %d", op) != 1 || *op > 14 || *op < 1 ) {
while(getchar()!='\n'); // clean the input buffer
printf("Only enter a number between 1 and 14!\n");
}
} while (*op > 14 || *op < 1 );
}

int main()
{
int op;
openMenu(&op);
printf("Number Read {%d}\n", op);
return 0;
}

更强大(和复杂)的解决方案如下:

int isNumber(char buffer[]){
for(int i = 0; buffer[i] != '\0'; i++)
if(!isdigit((unsigned char) buffer[i]))
return 0;
return 1;
}

int readInput(char buffer[]){
int result = scanf("%99s", buffer);
while(getchar()!='\n');
return result;
}

int isInRange(int *op, char buffer[]){
*op = atoi(buffer);
return *op <= 14 && *op >= 1;
}


void openMenu(int *op) {
do {
char buffer[100];
if(readInput(buffer) && isNumber(buffer) && isInRange(op, buffer)) {
break;
}
printf("Only enter a number between 1 and 14!\n");
} while (1);
}

这将避免将诸如 4odgjlda 之类的输入视为有效数字。尽管如此,在当前方法中,诸如 4 odgjlda 之类的输入仍将被视为有效输入,因为 scanf 会读取第一个 word 而不是整条线。要获得更强大的解决方案,您应该改用 fgets。可以在 Andreas Wenzel 提供的答案中看到此类解决方案的示例。

关于C 中的检查循环 - scan() 未在第二次运行时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65508024/

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