【问题标题】:C Programming - Limit user to type certain amount of charactersC 编程 - 限制用户输入一定数量的字符
【发布时间】:2016-01-26 20:33:54
【问题描述】:

所以我正在启动这个程序,这是一个新的学习阶段,我需要学习如何在提示用户输入时只允许用户输入一定数量的字符。比如:

char firstname[20];
printf("What is your first name?");
scanf("%s", &firstname);

我只希望用户能够键入和输入 20 个字符。我将如何处理?提示用户仅输入数字时是否会采用相同的方式?

【问题讨论】:

  • 离题代码注释:如果你想在一个字符串中包含 20 个字符,你的数组应该是 21 个字符长(对于空字符)。
  • 输入超过20个字符会怎样?
  • 没有办法(除非代码控制机械臂)阻止用户输入超过 20 个字符。如前所述,您需要定义输入过多字符时想要发生的情况。没有这些信息,问题就太宽泛了。

标签: c string scanf


【解决方案1】:

我只希望用户能够输入和输入 20 个字符

好吧,您只能指导用户并期望他们遵循。您无法阻止用户输入超过n 个字符,但是,以编程方式,您只能将扫描限制为n 个字符,使用

char firstname[20];
printf("What is your first name?");
scanf("%19s", firstname);           //& not needed

为空终止符留出空间。

如果 name 包含空格,%sscanf() 将无法处理输入。在这种情况下,您可能需要使用fgets(),它可以处理输入字符串中存在的空白。

也就是说,

  1. 您可能希望在扫描后清理剩余字符的输入缓冲区。
  2. 始终检查scanf() 的返回值以确保扫描成功。

【讨论】:

  • 我能问一下为什么不需要 & 吗?是不是因为不是整数?
  • @JordanSavell 因为数组名decays指向数组第一个元素的指针,所以它已经是一个指针了。
  • scanf("%19s""Mary Beth" 之类的名字失败。
  • @chux 名字应该有空格吗? ;)
  • IMO 保存 "%s" 用于定义明确的文件 IO。使用用户输入 - 这是邪恶的 - ,使用 fgets()getline()
【解决方案2】:

这里有两个非常不同的问题:

  1. 如何限制缓冲区大小并避免覆盖缓冲区末尾

  2. 如何处理用户输入的字符数超出预期

已经给出的大多数答案都集中在#1上,它们很好。

对于#2,您的程序必须读取多余的字符并丢弃它们。例如,您可以分块阅读它们,直到获得行尾。如果你不这样做,那么多余的字符将在下一次提示后进入输入缓冲区,你的程序和用户将不同步。

【讨论】:

    【解决方案3】:

    考虑使用fgets

    char *fgets(char *str, int n, FILE *stream)
    

    根据男人的说法:

    fgets() 从流中最多读取一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。一个终止的空字节('\0')存储在缓冲区中的最后一个字符之后。

    示例 sn-p:

    fgets(firstname,20,stdin);
    

    请记住从字符串中删除尾随换行符 ('\n')。你可以使用 strcspn 来做到这一点,只是

    #include  <string.h>
    

    此外,如果您的尝试是让用户能够输入最多 20 个字符,您应该将数组声明为多 1 个位置,因为空终止字符“\0”。 所以应该是

    char firstname [21];
    

    请注意 fgets() 将防止缓冲区溢出但不会处理额外的字符 事实上,它们留在标准输入中。这可能是个问题。但是我发现this post 很有用,我将引用BLUEPIXY 发布的解决方案:

    fgets(answer2,sizeof(answer2),stdin);
    > if(!strchr(answer, 'n')) //newline does not exist while(fgetc(stdin)!='n');//discard until newline fgets(answer2,sizeof(answer2),stdin);
    

    【讨论】:

      【解决方案4】:

      如果您想限制用户可以在控制台键入的字符数,那么您将不得不使用 C 语言本身不存在的实用程序。标准 C I/O 例程只看到一个输入 stream,直到用户键入 Enter 后才会更新。您可能想查看ncurses,尤其是表单库,以了解此类功能。

      您可以通过多种方式限制程序从输入流中读取的输入量。如果使用fgets,则传递一个单独的参数来指示输入缓冲区的大小:

      char buff[N+1]; // where N is the max number of characters you want to allow
      if ( fgets( buff, sizeof buff, stdin ) )
      {
        // process contents of buff
      }
      

      在此代码中,仅从输入流中读取sizeof buff - 1 字符并将其存储到buff。但是,这对用户可以从控制台输入的字符数没有影响(因为fgets 会阻塞,直到用户点击 Enter)。

      如果使用scanf,您可以使用最大字段宽度作为转换说明符的一部分:

      if ( scanf( "%19s", buff ) == 1 )
      {
        // process buff
      }
      

      不幸的是,没有很好的方法将字段宽度作为参数传递给scanf(就像你可以使用printf一样);它必须作为转换说明符的一部分进行硬编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多