C 如何将用户输入限制为仅一个字符

C 如何将用户输入限制为仅一个字符,c,user-input,C,User Input,我必须获得用户输入,但只有1-3个字符。如果用户输入其他内容,则应返回错误消息。我有以下内容,这是我代码的一部分: char val = 'i'; while (1) { if (val == 'i') { printf("Enter option: (1/2/3)\n"); scanf(" %c", &num); } else if (num == '1') { //do things } else if (num ==

我必须获得用户输入,但只有1-3个字符。如果用户输入其他内容,则应返回错误消息。我有以下内容,这是我代码的一部分:

char val = 'i';
while (1) {
   if (val == 'i') {
      printf("Enter option: (1/2/3)\n");
      scanf(" %c", &num);
   }
   else if (num == '1') {
      //do things
   }
   else if (num == '2') {
      //do things
   }
   else if (num == '3') {
      //do things
   }
   else {
      // return error
   }
我的问题是,我接受了一个
%c
字符,因此只有一个字符,但是用户可能输入了
123
之类的内容,它仍然会接受第一个字符,在本例中为
1
。结尾的else语句不考虑所有其他备选情况

有没有办法将用户输入限制为给定范围内的单个字符?我也尝试过
fgets()
strncmp()
但也遇到了问题

有没有办法将用户输入限制为给定范围内的单个字符

没有

用户可以输入他喜欢的任何内容,但当您的程序收到输入时,您有责任正确对待它

例如,可以将整个输入行作为字符串读取,检查其长度,如果不是所需的长度(本例中为1),则通知用户

有没有一种方法可以将用户输入限制为两个字符之间的单个字符 给定范围?我还尝试了
fgets()

(但您有责任隔离并使用键入的第一个字符,并丢弃其余字符)

您可以按自己喜欢的方式接受输入,例如
scanf
getchar
fgets
,等等,但您有责任验证输入的各个方面。例如:

  • 我得到有效字符了吗
  • 是否在要求的范围内
  • 用户是否通过生成手动
    EOF
    (例如Linux上的Ctrl+d或windoze上的Ctrl+z,但请参见:)来取消输入
  • 用户输入的字符数是否超过了要求的字符数(或在键盘上进行了cat操作)?,最后
  • 在尝试下一次输入之前,我是否清空了输入缓冲区(例如,
    stdin
  • 虽然您可以使用
    scanf
    getchar
    ,但对于新的C程序员来说,使用
    fgets
    可能更容易,fgets将读取到并在填充的缓冲区中包含尾随的
    '\n'
    。(您可能需要使用固定大小的缓冲区进行多次读取,以使用超过缓冲区长度的行,但这可以通过循环轻松处理)

    此外,由于您将使用字符数组作为缓冲区(在访问时转换为指向第一个元素(字符)的指针),因此您可以简单地取消对缓冲区的引用以获得第一个字符,以验证它是否为
    1-3

    总而言之,听起来你要求做类似于以下的事情:

    #include <stdio.h>
    #include <string.h>
    
    #define MAXC 1024   /* do NOT skimp on buffer size */
    
    int main (void) {
    
        char buf[MAXC] = "";
    
        puts ("press [Enter] alone or generate manual EOF to exit.\n");
        while (1) {
            size_t len = 0;
            fputs ("enter single char 1-3: ", stdout);
            if (!fgets (buf, sizeof buf, stdin)) {  /* validate read */
                /* manual EOF */
                fputs ("(user canceled input)\n", stderr);
                break;
            }
            if (*buf == '\n')       /* check for [Enter] alone */
                break;
            if (*buf < '1' || '3' < *buf)   /* if not 1-3, error */
                fprintf (stderr, "  error: invalid input '%c'\n", *buf);
            else    /* otherwise good value */
                printf ("  '%c' - accepted.\n", *buf);
            len = strlen (buf);    /* get length of input (+ '\n') */
            if (len > 2)    /* check if more than 1 character entered */
                puts ("  (additional characters entered)");
            /* validate entire line read */
            while (len && buf[len-1] != '\n') {
                fgets (buf, sizeof buf, stdin);
                len = strlen (buf);
            }
        }
        return 0;
    }
    
    使用
    getchar()

    getchar()
    (和
    scanf()
    )提供了一种同样简单的方法来做同样的事情,不同之处在于,您将从输入缓冲区一次处理一个字符,而不是缓冲第一个缓冲区大小的字符数——并且您必须删除任何其他字符——包括您自己按Enter键生成的
    '\n'
    。代码实际上短了几行,例如

    #include <stdio.h>
    
    int main (void) {
    
        puts ("press [Enter] alone or generate manual EOF to exit.\n");
    
        while (1) {
            int c;          /* note: c must be declared as 'int' */
            fputs ("enter single char 1-3: ", stdout);
            c = getchar();
            if (c == EOF) { /* manual EOF */
                fputs ("(user canceled input)\n", stderr);
                break;
            }
            if (c == '\n')  /* check for [Enter] alone */
                break;
            if (c < '1' || '3' < c)     /* if not 1-3, error */
                fprintf (stderr, "  error: invalid input '%c'\n", c);
            else    /* otherwise good value */
                printf ("  '%c' - accepted.\n", c);
            /* check if more than 1 character entered */
            if ((c = getchar()) != '\n') {
                puts ("  (additional characters entered)");
                /* remove additional characters */
                do {
                    c = getchar();
                } while (c != '\n' && c != EOF);
            }
        }
        return 0;
    }
    
    #包括
    内部主(空){
    puts(“单独按[Enter]或生成手动EOF退出。\n”);
    而(1){
    int c;/*注意:c必须声明为“int”*/
    fputs(“输入单字符1-3:”,标准输出);
    c=getchar();
    如果(c==EOF){/*手动EOF*/
    fputs(“(用户取消输入)\n”,stderr);
    打破
    }
    如果(c=='\n')/*单独检查[Enter]*/
    打破
    如果(c<'1'| |'3'
    (使用/输出相同)


    请仔细检查,如果您还有其他问题,请告诉我。

    始终验证
    scanf
    的返回,然后按照
    scanf
    添加
    (int c=getchar();c!='\n'&&c!=EOF;c=getchar()){}
    删除任何其他字符(包括按
    '\n'
    生成的
    ),然后再尝试下一次输入。您还可以使用
    fgets
    (例如
    fgets(line,sizeof line,stdin)
    )读取整行内容,然后只需检查
    *line-'0'
    是否为
    1、2或3
    ,并使用足够大的缓冲区确保它可以包含整个输入内容(并验证它是否包含)您尝试过getchar吗?可能重复的还有:您可能希望检测键盘事件,而不是任何人的第一个C赋值的标准答案。
    #include <stdio.h>
    
    int main (void) {
    
        puts ("press [Enter] alone or generate manual EOF to exit.\n");
    
        while (1) {
            int c;          /* note: c must be declared as 'int' */
            fputs ("enter single char 1-3: ", stdout);
            c = getchar();
            if (c == EOF) { /* manual EOF */
                fputs ("(user canceled input)\n", stderr);
                break;
            }
            if (c == '\n')  /* check for [Enter] alone */
                break;
            if (c < '1' || '3' < c)     /* if not 1-3, error */
                fprintf (stderr, "  error: invalid input '%c'\n", c);
            else    /* otherwise good value */
                printf ("  '%c' - accepted.\n", c);
            /* check if more than 1 character entered */
            if ((c = getchar()) != '\n') {
                puts ("  (additional characters entered)");
                /* remove additional characters */
                do {
                    c = getchar();
                } while (c != '\n' && c != EOF);
            }
        }
        return 0;
    }