我必须获得用户输入,但只能输入一个字符,即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语句不能解决所有其他情况。
是否有一种方法可以将用户输入限制为给定范围内的单个字符?我也尝试过1
和fgets()
,但也遇到了问题。
答案 0 :(得分:3)
是否有一种方法可以将用户输入限制为 给定范围?我也尝试过
fgets()
是(但您有责任隔离并使用键入的第一个字符并丢弃其余字符)
您可以按照自己喜欢的任何方式进行输入,例如scanf
,getchar
,fgets
等。但是,您有责任验证输入的各个方面。例如,
EOF
(例如,在Linux上是 Ctrl + d 或在windoze上是 Ctrl + z )来取消输入,但请参见:{{ 3}}),stdin
)?虽然您可以使用scanf
或getchar
,但是对于新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),请告知用户。