【问题标题】:How can I print an error message if 5 or more characters are entered如果输入 5 个或更多字符,如何打印错误消息
【发布时间】:2021-03-03 21:44:06
【问题描述】:

我已尝试将数组设置为 5 个字符长,以便检查最后一个位置是否已更改,但随后程序将 enter 键作为第五个字符输入,我也不知道如何解决此问题。

char input[4];

printf("Please enter your 4 digit pin: ");
scanf(" %s", &input);

【问题讨论】:

  • scanf(" %4s" ... 只会占用 4 个字符。 (它将最多写入 5 个,包括终止的 null。)

标签: c string validation input error-handling


【解决方案1】:

试试这个:

    #include <string.h>
    char input[20];
    printf("Please enter your 4 digit pin: "); scanf(" %s", &input);

    if ( strlen(input) > 4 ) printf("Entered more than 4 characters")

【讨论】:

  • 可能会因0123456789+0123456789-0123456789等输入而崩溃
  • 我认为这正是我想要的。到目前为止工作完美。谢谢。
  • Basile Starynkevitch 您可能是对的,但这是经典的做法。只要它是一个严肃的项目,你的建议肯定是更可靠的方法。
  • 是的,我知道程序仍然有办法以这种方式出现故障,但这只是为了学校作业,我们还没有真正学到任何东西,但我们的讲师告诉我们需要实施“适当的输入验证”,所以我只是想在这种情况下介绍一些基本的东西。再次感谢,到目前为止还没有造成任何问题:D
  • 这是一个错误。您应该永远在没有宽度说明符的情况下使用"%s"。这和使用gets 一样糟糕
【解决方案2】:

一个 4 位数的 pin 至少需要 5 个 个字符,因为终止的是空字节。

你可以试试

char input[8];
memset (input, 0, sizeof(input));
printf("Please enter your 4 digit pin:\n");
if (fgets (input, sizeof(input), stdin)) {
  /// handle input
}
else {
   fprintf(stderr, "fgets failure\n");
   exit(EXIT_FAILURE);
}

为了稳健性,inputmemset 清除。如果您使用GCC 进行编译,请确保启用所有警告和调试信息(因此请使用gcc -Wall -Wextra -g)。另请阅读您的 debugger(例如 GDB)以及您的 compiler 的文档。

但是,到了 2020 年,UTF-8 is everywhere,所以事情变得更复杂了。我的法语AZERTY 键盘可以输入 符号(在Linux 上)。您可能想使用GNU libunistring

记得阅读Modern Cthis C reference,并注意标准函数(如fgetsscanf)可能会失败。请参阅n1570 了解更多信息。

【讨论】:

  • 我不太确定这应该如何工作我从未见过它的大部分内容。我试着运行它,无论我输入什么程序都会结束。
  • 您是否尝试使用调试器?
  • 我什至不完全确定这意味着什么哈哈。很久没有编程了,甚至更少。
  • 调试器是我的回答中提到的 GDB 之类的程序。
  • 啊,我没有类似的东西。生病看看它。谢谢!
【解决方案3】:

您可以通过在转换说明符上设置字段宽度来限制 scanf 将使用的数据量。例如:" %4s"

char input[5];
if( scanf(" %4s", input) == 1 ) { ...

请注意,字段宽度应该比缓冲区的大小小一,因为 scanf 会比它消耗的多写一个字符(空字节)。

如果您想验证在 pin 之后没有更多数据,或者下一个字符是换行符或其他分隔符,请再次读取。我认为这超出了这个问题的范围,因为这里的关键是限制您初始 scanf 读取的数据量。

附带说明:为此使用 scanf 可能更容易。如果您只需要 4 个字符,请在循环中使用 fgetc。需要担心的边缘情况更少,代码可能更易于理解。

【讨论】:

  • 我已经摆弄了很多 %4s,但是当我这样做时出现了很多错误。不过,我会看看 fgetc 。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多