C 如何将用户输入限制为仅一个字符
我必须获得用户输入,但只有1-3个字符。如果用户输入其他内容,则应返回错误消息。我有以下内容,这是我代码的一部分: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 ==
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,但请参见:)来取消输入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;
}