C 输入字符不能正确读取

C 输入字符不能正确读取,c,function,if-statement,C,Function,If Statement,这应该是一个简单的错误。我的代码基本上是读取一个用户输入值,如果该值大于0,它将返回该值。如果没有,它将打印一个错误并再次请求值。唯一的问题是,当输入一个新值时,它会使用旧的假值而不会出错 int menuSize(int s) { printf(" Please Enter size: "); scanf("%i", &s); if (s>0) { } else { printf(" Invalid Input\n"); getchar(); menuSi

这应该是一个简单的错误。我的代码基本上是读取一个用户输入值,如果该值大于0,它将返回该值。如果没有,它将打印一个错误并再次请求值。唯一的问题是,当输入一个新值时,它会使用旧的假值而不会出错

int menuSize(int s) {
printf(" Please Enter size: ");
scanf("%i", &s);
if (s>0) {
}
else {
    printf(" Invalid Input\n");
    getchar();
    menuSize(s);
}
return s;
}

如果输入无效,则函数对自身进行递归调用,但不对递归调用的返回值执行任何操作。这意味着将返回当前调用中读取的无效值

更改函数以返回递归调用的值。另外,由于未使用函数的参数,请将其删除,并将
s
设置为本地。您还应该将
s
初始化为某个已知值,并检查
scanf
的返回值,以防未读取任何内容

int menuSize(void) 
{
    int s = -1;
    printf(" Please Enter size: ");
    int rval = scanf("%i", &s);
    if (rval == 1 && s>0) {
        return s;
    } else {
        printf(" Invalid Input\n");
        getchar();
        return menuSize();
    }
}

因为它是递归的,所以您最好使用
menuSize
recursive调用的返回值来执行一些操作(比如将它分配给s并返回它)。此外,我没有看到将
s
作为参数传递的点。一般来说,递归不是这里使用的正确技术。改为使用循环。
scanf()
不检查返回值。。。这里的问题不大,因为函数的参数是
s
,但这通常是等待发生的未定义行为,因为如果用户输入了字符串以外的内容,则不会初始化本地
s
。这也可能是你的问题所在。你不知道。
getchar()rval==1&&s@chux-Monica OP表示,他们希望输入一个大于0的值,因此不读取任何值或OP的代码有
else{
,因此在
sMight想要在
EOF
上中断递归时输入。