scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在 运行 时确定。如何使它可变?
Width Specifier for scanf() - Length of characters to consume is not fixed at compilation and only determined at run-time. How to make it variable?
我想将字段宽度说明符应用于 scanf() 操作以读取字符串,因为明确指定 read/consume 的字符数量而不是进行 scanf()
操作容易引起缓冲区溢出。除了目标参数指向一个已经匹配的 char
数组,它具有元素的大小,字段宽度的期望值必须是,对于 [=16=]
+ 1。此 char
数组的大小也在 运行 之前确定。
现在的问题是最大字段宽度的值无法固定;它仅在 运行 时间确定。
如何才能在 运行 时确定最大字段宽度值?
我做了一些研究,发现 Whosebug 上已经提出了一个问题,在其源代码中,解决了与我完全相同的问题。 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");
有没有办法使 scanf()
函数内的最大字段宽度取决于 运行 时间确定或生成的值?
是否有替代方法可以达到同样的效果?
我使用 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;
}
我想将字段宽度说明符应用于 scanf() 操作以读取字符串,因为明确指定 read/consume 的字符数量而不是进行 scanf()
操作容易引起缓冲区溢出。除了目标参数指向一个已经匹配的 char
数组,它具有元素的大小,字段宽度的期望值必须是,对于 [=16=]
+ 1。此 char
数组的大小也在 运行 之前确定。
现在的问题是最大字段宽度的值无法固定;它仅在 运行 时间确定。
如何才能在 运行 时确定最大字段宽度值?
我做了一些研究,发现 Whosebug 上已经提出了一个问题,在其源代码中,解决了与我完全相同的问题。 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");
有没有办法使
scanf()
函数内的最大字段宽度取决于 运行 时间确定或生成的值?是否有替代方法可以达到同样的效果?
我使用 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;
}