c - 如何在我的 C 限制下检查用户的有效输入?

标签 c

我有一个问题正在尝试解决! 如何在我的 C 限制下检查用户的有效输入?

我需要使用开关盒构建一个“银行模拟器”,用户提供一个字符,这将决定他将执行什么操作...... 例如,如果用户输入 O,他将开设一个新帐户。

现在我的问题是,我希望用户可以选择输入,例如,仅输入一个字符,但如果我使用: scanf("%c", char) 并且用户在 OB33、B33 中输入的内容将保留在缓冲区中,程序将继续执行,直到下一个 scanf。 我还尝试使用 %[OBDWCIPE]fgets 等限制,但似乎没有任何方法可以解决验证输入的问题...

(我还需要对 INT 和 DOUBLE 执行相同的操作...)

我怎样才能避免它......?

最佳答案

根据您的代码注释,将该代码包装在 main 和 do/while 中。
使用充足的缓冲区 [100]。
fgets 中使用 sizeof buf 作为第二个参数。
buf[1] != "\n" 中使用单引号代替双引号。

#include <stdio.h>
int main ( void) {
    char buf[100];
    do {
        printf("What actions would you like to do:");
        fgets ( buf, sizeof buf, stdin);
        if( '\n' != buf[1])
        {
            printf("not valid");
        }
        printf("string is: %s\n", buf);
    } while ( '\n' != buf[1]);
    return 0;
}

使用类似的 do/while 包裹 strtol 可以解析长整数。
last 是指向 strtol 处理的最后一个字符的指针。这里的有效输入是一个整数后跟一个换行符。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
int main ( void) {
    char buf[100];
    do {
        printf("What actions would you like to do:");
        fgets ( buf, sizeof buf, stdin);
        if( '\n' != buf[1])
        {
            printf("not valid");
        }
        printf("string is: %s\n", buf);
    } while ( '\n' != buf[1]);

    long int value = 0;
    char *last = NULL;
    do {
        printf("Enter an integer:");
        fgets ( buf, sizeof buf, stdin);
        value = strtol ( buf, &last, 10);
        if ( ( errno == ERANGE && ( value == LONG_MAX || value == LONG_MIN))
        || ( errno != 0 && value == 0)){// parsing error from strtol
            perror ( "value");
            last = buf;
        }
    } while ( last == buf || '\n' != *last);
    printf ( "value is %ld\n", value);
    return 0;
}

关于c - 如何在我的 C 限制下检查用户的有效输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984678/

相关文章:

c - 当程序使用自定义入口点(使用 gcc 7.4.0)运行时,scanf 会产生段错误

c - 在 C/UNIX 中扫描内存

c - 为什么这个函数在第一次调用后不返回指针?

c++ - _stprintf_s 将 "10"视为 "1"

c - 从 char 数组中解析 int

python - Python 或 C 中的康托三元集

c - 在 Windows Phone 8 上的 taskhost 下运行的进程

c - C语言的家谱

c - 在结构中将 const char 转换为 char 时出错?

c - "alignment trap"错误是什么意思?