c - C中输入循环的范围

标签 c

我一直在尝试找出如何制作一个程序,该程序在输入超出范围时循环并拒绝无效输入(例如字母表)或不向程序输入任何内容。我找到了一个解决方案,但它使用 1-99 的数字范围作为可接受的值。我希望能够将范围设置为 1-20 或 1-任何指定范围,但是当我尝试修改程序时,它停止正常工作。有谁知道如何更改此程序以使范围不同(例如 1-20 或 1-30),但程序仍能正常工作,这意味着如果没有输入任何数字,它会告诉用户数字是否超出范围, 或者如果输入了不正确的符号。另外,如果有人设法做到这一点,您能否向我解释一下其背后的逻辑是什么?

#include "stdio.h"
#include "string.h"

int main() {

    printf("\nProgram Start.....\n\n");

    char userInput[64];
    int num = 0;
    char temp;
    size_t length = 0;
    int index = 0;
    int flag = 0;
    while( num == 0 ) {

        length = 0;
        flag = 0;
        num = 0;

        printf("Please enter a number 1 to 99:");
        fgets(userInput, 63, stdin);
        length = strlen(userInput);

        if( length < 2 || length > 3) {
            printf("Invalid strlen()\n");
            continue;
        }

        length--;

        for(index = 0; index < length; ++index) {
            if(userInput[index] < '0' || userInput[index] > '9') {
                flag = 1;
                break;
            }
        }

        if( flag) {
            printf("Invalid character\n");
            continue;
        }

        if( sscanf(userInput, "%d", &num) != 1) {
            printf("Invalid sscanf()\n");
            continue;
        }

        if( num < 1 || num > 99) {
            printf("Invalid range\n");
            continue;
        }

        printf("Number OK:%d\n",num);
    }

    printf("\nProgram Quit.....\n");

    return 0;
}

最佳答案

让我们先看看如果我们只更改 if( num < 1 || num > 99) 会出现什么问题至 if( num < 1 || num > 20)其中输入为 25。如果我们达到该测试,我们已经将 25 分配给了 num。与 sscanf ,因此条件通过,我们打印出错误消息,并且 continue让我们回到 while声明:

while( num == 0 )

因为我们已经为 num 分配了一个非零值,我们没有通过这个测试,并退出循环。要解决这个问题,我们可以调整 if阻止

if( num < 1 || num > 99) {
    printf("Invalid range\n");
    num = 0;
    continue;
}

为什么这不是原始程序中的问题?

在原始程序中,您在进行检查之前已经验证了输入是一个 2 位数字。所以,它可能失败的唯一方法是如果 num是 0,所以当 continue 将我们抛回到 while语句,我们重新进入循环。

关于c - C中输入循环的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29012774/

相关文章:

c - 在字符串数组中查找字符串。 (C代码)

c - 在 linux 中观察共享映射文件内存

c - 指向 VLA 的指针

c - const char* 值将存储在哪里。什么是堆栈崩溃和堆崩溃?

c - Win32 IO 性能问题

c - 为什么这个 qsort() 不起作用?

c - 这个程序中的ctime函数是如何工作的?

C Socket Write 添加额外的字符

c - 如何在 C 中使用 strlen() 查找字符指针的长度?

c - 将打印浮点值转换为分数的程序不起作用..?