C - 确保用户输入的长度合适
C - Making sure user input is of appropriate length
一些我认为非常基本的东西让我很困惑。
如果我有一个 char
数组 char menuInput[3];
并执行 fgets(menuInput,3,stdin);
,我可以轻松检查他们是否未输入任何内容:
if(menuInput[0]=='\n')
{
printf("******You made no selection.******");
}
或者如果他们输入了太多(在这种情况下,不止一个)字符:
else if(menuInput[1]!='\n')
{
printf("******Invalid Selection: Please enter a single digit option.******");
break;
}
在这种情况下,用户要么没有输入字符,要么输入的字符数恰好(一个),要么输入的字符太多。
给我带来麻烦的是检查他们什么时候可以不输入字符,最多 n
个字符,或者太多。
如果我有 char surname[SURNAME_MAX + 1];
,并使用 fgets(surname,SURNAME_MAX + 1,stdin);
,其中 SURNAME_MAX
是 12,我不知道如何检查输入是否在 'acceptable' 范围内范围。
我可以很容易地看到用户是否输入了任何内容 (if surname[0]='\n'
) 以及他们是否正好输入了 12 个字符(第 13 个字符是 '\n'
)。
我认为问题的关键在于确保 surname[SURNAME_MAX + 1]
在某处包含 '\n',但我不知道如何在 C 中做到这一点。
此致,
道格
编辑:好的,我会接受@R Sahu 的回答,但我无法使其正常工作。
我最多期待 SURNAME_MAX 定义的 12 个字符。
这应该意味着,根据该答案,我的数组应该是 surname[SURNAME_MAX+3]
("need at least SURNAME_MAX+2 just to store the newline and the terminating null character")
然后我fgets(surname,SURNAME_MAX + 3,stdin);
然后它应该是:
while(strlen(surname)>SURNAME_MAX+2);
{
printf("Input is too long!\n");
printf("Surname (1-12 characters): ");
fgets(surname,SURNAME_MAX + 2,stdin);
}
?
这是实现答案的正确方法吗?
在我看来是正确的,但是,无论我输入什么,我都会收到 "Input is too long!" 消息。
编辑 2:糟糕,有一些代码放错了地方,现在一切都好了。
要在字符串中查找字符,可以使用 strchr 方法:
char *pch;
pch=strchr(SURNAME,'\n');
if (pch != NULL)
{
// ok we've got \n in string
}
但我不确定这是解决这个问题的最佳方法。
你说:
What is giving me trouble is checking when they could either enter no characters, up to n amount, or too many.
我的建议:如果您希望最多看到 N
个字符,请创建一个大小大于 N+2
的数组。您至少需要 N+2
来存储换行符和终止空字符,并在该字符串上使用 fgets
。如果字符串的长度大于 N+1
,那么您就知道他们输入了太多字符。检测他们输入的字符是否太少很简单。我想你一定能弄明白的。
建议将用户输入与变量分开 checking/assignment。
首先读入用户输入
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
// EOF or IO error occurred.
return;
}
现在限定输入;存在各种方法。
int len = strlen(buf);
// lop off potential \n
if (buf > 0 && buf[len-1] == '\n') buf[--len] = 0;
if (len >= sizeof surname) {
// Input too long
return;
}
memcpy(surname, buf, len + 1);
一些我认为非常基本的东西让我很困惑。
如果我有一个 char
数组 char menuInput[3];
并执行 fgets(menuInput,3,stdin);
,我可以轻松检查他们是否未输入任何内容:
if(menuInput[0]=='\n')
{
printf("******You made no selection.******");
}
或者如果他们输入了太多(在这种情况下,不止一个)字符:
else if(menuInput[1]!='\n')
{
printf("******Invalid Selection: Please enter a single digit option.******");
break;
}
在这种情况下,用户要么没有输入字符,要么输入的字符数恰好(一个),要么输入的字符太多。
给我带来麻烦的是检查他们什么时候可以不输入字符,最多 n
个字符,或者太多。
如果我有 char surname[SURNAME_MAX + 1];
,并使用 fgets(surname,SURNAME_MAX + 1,stdin);
,其中 SURNAME_MAX
是 12,我不知道如何检查输入是否在 'acceptable' 范围内范围。
我可以很容易地看到用户是否输入了任何内容 (if surname[0]='\n'
) 以及他们是否正好输入了 12 个字符(第 13 个字符是 '\n'
)。
我认为问题的关键在于确保 surname[SURNAME_MAX + 1]
在某处包含 '\n',但我不知道如何在 C 中做到这一点。
此致,
道格
编辑:好的,我会接受@R Sahu 的回答,但我无法使其正常工作。
我最多期待 SURNAME_MAX 定义的 12 个字符。
这应该意味着,根据该答案,我的数组应该是 surname[SURNAME_MAX+3]
("need at least SURNAME_MAX+2 just to store the newline and the terminating null character")
然后我fgets(surname,SURNAME_MAX + 3,stdin);
然后它应该是:
while(strlen(surname)>SURNAME_MAX+2);
{
printf("Input is too long!\n");
printf("Surname (1-12 characters): ");
fgets(surname,SURNAME_MAX + 2,stdin);
}
?
这是实现答案的正确方法吗?
在我看来是正确的,但是,无论我输入什么,我都会收到 "Input is too long!" 消息。
编辑 2:糟糕,有一些代码放错了地方,现在一切都好了。
要在字符串中查找字符,可以使用 strchr 方法:
char *pch;
pch=strchr(SURNAME,'\n');
if (pch != NULL)
{
// ok we've got \n in string
}
但我不确定这是解决这个问题的最佳方法。
你说:
What is giving me trouble is checking when they could either enter no characters, up to n amount, or too many.
我的建议:如果您希望最多看到 N
个字符,请创建一个大小大于 N+2
的数组。您至少需要 N+2
来存储换行符和终止空字符,并在该字符串上使用 fgets
。如果字符串的长度大于 N+1
,那么您就知道他们输入了太多字符。检测他们输入的字符是否太少很简单。我想你一定能弄明白的。
建议将用户输入与变量分开 checking/assignment。
首先读入用户输入
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
// EOF or IO error occurred.
return;
}
现在限定输入;存在各种方法。
int len = strlen(buf);
// lop off potential \n
if (buf > 0 && buf[len-1] == '\n') buf[--len] = 0;
if (len >= sizeof surname) {
// Input too long
return;
}
memcpy(surname, buf, len + 1);