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

时间:2018-07-25 21:47:09

标签: 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 == '2') {
      //do things
   }
   else if (num == '3') {
      //do things
   }
   else {
      // return error
   }

我的问题是,我要输入一个%c以便使用单个字符,但是用户可能会输入诸如123之类的内容,但它仍将采用第一个字符,在这种情况下,{ {1}}。最后的else语句不能解决所有其他情况。

是否有一种方法可以将用户输入限制为给定范围内的单个字符?我也尝试过1fgets(),但也遇到了问题。

2 个答案:

答案 0 :(得分:3)

  

是否有一种方法可以将用户输入限制为   给定范围?我也尝试过fgets()

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

您可以按照自己喜欢的任何方式进行输入,例如scanfgetcharfgets等。但是,您有责任验证输入的各个方面。例如,

  1. 我得到一个有效的字符吗?,
  2. 是否在要求的范围内?
  3. 用户是否通过生成手册EOF(例如,在Linux上是 Ctrl + d 或在windoze上是 Ctrl + z )来取消输入,但请参见:{{ 3}}),
  4. 用户输入的字符数是否超过了要求输入的字符数(或者键盘上踩了猫键)?最后
  5. 在尝试下一次输入之前,我是否已清空输入缓冲区(例如stdin)?

虽然您可以使用scanfgetchar,但是对于新C程序员来说,使用fgets可能会更容易,它会读取并包含 缓冲区中的结尾'\n'。 (您可能需要使用固定大小的缓冲区进行多次读取,以消耗超过缓冲区长度的行,但这很容易通过循环来处理)。

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

将其完全放在一起,听起来您正在要求执行以下操作:

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;
}

使用$ ./bin/single123 press [Enter] alone or generate manual EOF to exit. enter single char 1-3: 0 error: invalid input '0' enter single char 1-3: 1 '1' - accepted. enter single char 1-3: 2 '2' - accepted. enter single char 1-3: 3 '3' - accepted. enter single char 1-3: 4 error: invalid input '4' enter single char 1-3: 100 '1' - accepted. (additional characters entered) enter single char 1-3: 20000 '2' - accepted. (additional characters entered) enter single char 1-3: 33333 '3' - accepted. (additional characters entered) enter single char 1-3: 4444444444444444444444444444444 error: invalid input '4' (additional characters entered) enter single char 1-3:

getchar()(和getchar())提供了一种同样简单的方法来完成相同的事情,不同之处在于您将一次从输入缓冲区处理一个字符,而不是进行缓冲第一个缓冲区大小的字符数-您必须删除所有其他字符-包括您自己按下 Enter 生成的scanf()。该代码实际上短了几行,例如

'\n'

(使用/输出相同)

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

答案 1 :(得分:0)

  

是否可以将用户输入限制为给定范围内的单个字符?

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

例如,您可以将整个输入行读取为字符串,检查其长度,如果不是所需的长度(在您的情况下为1),请告知用户。