c++ - scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在运行时确定。如何使其可变?

标签 c++ c runtime scanf format-specifiers

我想将字段宽度说明符应用于 scanf() 操作来读取字符串,因为明确指定了要读取/使用的字符数量,而不是使 scanf()-操作容易导致缓冲区溢出。除了目标参数指向一个已经匹配的 char 数组(该数组的元素大小完全相同)之外,所需的字段宽度值也必须是 + 1(对于 \0。这个char数组的大小也是在之前的运行时确定的。

现在的问题是最大字段宽度的值无法固定;它仅在运行时确定。

如何实现最大字段宽度值能够在运行时确定?

<小时/>

我做了一些研究,发现 Stackoverflow 上已经提出了一个问题,在其源代码中,解决了与我完全相同的问题。 scanf() variable length specifier

但不幸的是,在问题的发展以及答案的内部,解决方案结果只能使用预处理器指令宏来处理,这意味着字段宽度的值实际上不是那个变量,而是在编译时修复。

<小时/>

我有一个例子告诉你我的意思:

#include <stdio.h>

int main(void)
{
    int nr_of_elements;

    printf("How many characters your input string has?\n");
    scanf("%d",&nr_of_elements);

    nr_of_elements++;                          //+1 element for the NULL-terminator.

    char array[nr_of_elements];

    printf("Please input your string (without withspace characters): ");
    scanf("%s",array);        // <--- Here i want to use a field width specifier.      

    return 0;
}
<小时/>

我想做的是这样的:

scanf("%(nr_of_elements)s");

或者如果我遵循链接问题中答案的编程风格:

scanf("%" "nr_of_elements" "s");
<小时/>
  1. 有没有办法使 scanf() 函数内部的最大字段宽度取决于运行时确定或生成的值?

  2. 是否有其他方法可以实现相同的目的?

我使用 C 和 C++ 并为两者标记问题,因为我不想为每个单独的问题重复相同的问题。如果这些答案之间存在差异,请说明重点关注哪种语言。

最佳答案

您可以使用sprintf将其用作格式:

只是为了发表评论,我使用了 unsigned 因为我无法想象字符串长度为负的情况。

#include <stdio.h>

int main(void)
{
    unsigned nr_of_elements;

    printf("How many characters your input string has?\n");
    scanf("%u",&nr_of_elements);

    nr_of_elements++;                          //+1 element for the NULL-terminator.

    char array[nr_of_elements];

    printf("Please input your string (without withspace characters): ");

    char format[15]; //should be enough
    sprintf(format, "%%%us", nr_of_elements - 1);
    scanf(format,array);       

    return 0;
}

关于c++ - scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在运行时确定。如何使其可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59156783/

相关文章:

C++,拉帕克 : undefined reference to `dsyev' with libraries linked

java - 如何在 Linux 的 java 程序中打开包含 GUI 的 .bat?

分配给泛型类型的 Java 原始类型值运行时 getClss() 方法错误

Java动态实现抽象方法

c++ - 替罪羊搜索功能

c++ - 如何从模板别名切换到 typedef?

c++ - 在 C++ vector 中手动执行内存重新分配

c - Windows 共享内存段

python - 使用 ctypes 时 islower 结果不正确

c++ - 使用显存的c中的文本编辑器