gpt4 book ai didi

c - C 上的 bool 表达式

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

创建一个简单的 C 函数,以防止用户输入 1 到 9 之间的数字以外的任何其他内容。不应接受任何其他输入,包括字母符号和任何小于 1 或大于 9 的数字。到目前为止,它非常简单;然而,代码应该检查输入的字符不是符号或字母的部分没有按照我希望的方式工作。

int validateUserInput(){
printf("%s\n", "Please enter a number from 1 to 9: ");

char value = getchar();
int numValue = value;
char temp;

int digitCounter = 0;

while((temp = getchar()) != '\n'){
digitCounter++;
}
//if there is more than 1 digit.
if(digitCounter>0){
printf("%s\n","Input too long!");
return validateUserInput();
}
// if the char entered is not between 1 and 9
// this part is giving me a hard time.
else if(numValue < 49 || numValue > 57){
printf("%s\n", "Imput is not within the valid parameters");
return validateUserInput();
}
return numValue;
}

最佳答案

在使用输入例程进行输入时,还有一些额外的要点需要注意。如果用户需要取消输入怎么办? (例如,在 Windows 上按 ctrl+dctrl+z)如您所写,无法取消循环。 (虽然这适用于您只强制输入 1-9 的目的,但它没有办法取消)如果您捕获 EOF,您提供了两种方式取消,以及在调用函数中指示取消返回的方法(例如,通过检查 EOF 的返回值)

虽然递归有它的位置,但请注意,每个递归本身都是一个单独的函数调用,需要一个单独的堆栈,以及函数调用的所有其他陷阱。很多时候,使用简单的 goto 语句就可以避免这种情况。 glibc 经常使用 goto(例如,检查 qsortgetdelim 等的来源)。在您的情况下,单个 goto标签可以完全免去递归的需要。例如,您可以在满足所有条件的同时执行类似于以下的操作:

int validateuserinput()
{
int c, extra, tmp;

getinput:; /* a simple goto can avoid recursion completely */
extra = 0;
printf ("Please enter a number from 1 to 9: ");
/* prompt/loop while chars not between 1 and 9 */
for (c = getchar(); (c < '1' || '9' < c ); c = getchar()) {
if (c == '\n') { /* no digits in input */
fprintf (stderr, "error: invalid input.\n");
goto getinput;
}
else if (c == EOF) { /* trap EOF */
fprintf (stderr, "\nerror: input canceled.\n");
return c;
}
}
/* empty input buffer -- increment extra count */
for (tmp = getchar(); tmp != '\n' && tmp != EOF; tmp = getchar())
extra++;

if (extra) { /* if extra chars -- input too long */
fprintf (stderr, "error: input too long.\n");
goto getinput;
}

return c - '0'; /* return integer value instead of ASCII value */
}

(只是一个风格说明,C 通常避免使用 camelCase 变量名以支持小写,这只是一般性,完全取决于您)

您可以使用以下一小段代码检查函数(并响应取消):

#include <stdio.h>

int validateuserinput();

int main (void) {

int n;

if ((n = validateuserinput()) != EOF)
printf ("\n valid input : %d\n", n);

return 0;
}

示例使用/输出

测试仅接受 1-9 的输入:

$ ./bin/inputhandler
Please enter a number from 1 to 9: Hello World!
error: invalid input.
Please enter a number from 1 to 9: ?
error: invalid input.
Please enter a number from 1 to 9: 0
error: invalid input.
Please enter a number from 1 to 9: 23
error: input too long.
Please enter a number from 1 to 9: 6

valid input : 6

测试输入取消(例如 ctrl+d,或 Windows 上的 ctrl+z)

$ ./bin/inputhandler
Please enter a number from 1 to 9:
error: input canceled.

虽然使用递归没有错,但问“这是否需要以递归函数开始?”总是有帮助的避免额外开销的方法。 (注意:几次递归的开销很小,因此在您的情况下这不是一个重要的考虑因素,但如果您无意中调用了一个旋转一百万次的递归函数,它很快就会成为一个问题)

查看所有答案,如果您有任何问题,请告诉我们。

关于c - C 上的 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240331/

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