【问题标题】:How can I read from keyboard a string of only 4 alphanumeric characters, not one less, not one more如何从键盘读取只有 4 个字母数字字符的字符串,不能少一个,不能多一个
【发布时间】:2018-11-07 02:25:51
【问题描述】:

我需要了解如何从键盘读取精确数量的字符串。

这个函数是从main调用的。

void get_string(char *prompt,
            char *input,
            int length)
{
    printf("%s", prompt);

    if (!fgets(input, length, stdin))
    {
        printf("\nErrore: Inserisci correttamente la stringa.\n");
        get_string(prompt, input, length);
    }
    return;
}

字符串被获取后会复制到input [length]中。

【问题讨论】:

  • 请向我们展示函数的主体,即使它不完整且无法正常工作,以便我们了解您已经尝试过的内容以及您可能遇到的问题。
  • 在循环中使用fgetc

标签: c string string-length


【解决方案1】:

使用scanf("%4s")s 之前的 4 在第 4 个字符之后停止保存输入。

罢工>

char buf[4];
scanf("%4s", buf);
printf("%s\n", buf);

input:  123abc
output: 123a

这个解决方案是错误的,因为它不仅仅是字母数字。

我的第二次尝试是将 scanf 更改为 scanf("%4[a-zA-Z0-9]s", buf); 但这将停止在非字母数字上,所以仍然没有好处。

正确的方法是这样(循环,扫描 1 个字符,检查是否为字母数字):

char buf[32] = "";
for(unsigned idx = 0; idx < 4; )
{
    int c = getchar();
    if(isalnum(c))
    {
        buf[idx] = c;
        idx++;
    }

}
printf("%s\n", buf);

【讨论】:

  • 您应该在打印之前零终止您的buf 数组。使用char buf[32] = "",您要求编译器创建代码以将零复制到数组的第一个字节。
  • @jens:不是这样。初始化器清除整个数组。
【解决方案2】:

正如我从另一个答案中读到的,您可以通过如下所示的 scanf 函数执行此操作:

scanf("%3s", string);

其中 3 是能够读取的最大字符数。请记住,如果要读取 n 个字符,则数组必须为 n+1 长,因为空终止符 '\0'

希望这会有所帮助,

【讨论】:

  • 我删除了它,因为那不是只读取字母数字(这是 OP 想要的)。试试输入“----”
  • OP 需要四个字符,这意味着他们必须提供一个可以使用%4s(或%4[)的五字节缓冲区。
猜你喜欢
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多