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