我用这个代码:
while ( scanf("%s", buf) == 1 ){
Run Code Online (Sandbox Code Playgroud)
什么是防止可能的缓冲区溢出的最佳方法,以便它可以传递随机长度的字符串?
我知道我可以通过调用例如限制输入字符串:
while ( scanf("%20s", buf) == 1 ){
Run Code Online (Sandbox Code Playgroud)
但我更愿意能够处理用户输入的任何内容.或者这不能使用scanf安全地完成,我应该使用fgets?
我知道:
#define foo 4
#define str(s) #s
Run Code Online (Sandbox Code Playgroud)
与str(foo)写出:"foo"因为字符串化的第一个文本扩展的执行,但这样的:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
Run Code Online (Sandbox Code Playgroud)
与xstr(foo)写出:"4".
为什么?该过程涉及哪些步骤?
编辑:对于我的班级,我必须使用scanf.所以推荐其他输入方式不是我正在寻找的解决方案(如果有一个涉及scanf).
如果我正在读取小项目的用户输入(例如,游戏).让我们说我会问would you like to play? 这会接受yes或no回答.所以我写了一些像这样的简单代码:
#include <stdio.h>
int main(void)
{
char string[3]; //The max number of letters for "yes".
printf("Would you like to play?");
scanf("%s", string);
}
Run Code Online (Sandbox Code Playgroud)
所以这段代码应该简单地要求他们输入yes或no.我正在设定我char array的大小3.这样它足够大yes,也可以no.但是如果有人要输入无效的输入,比如yesss,我知道如何比较字符串以后处理这样的事件,但是这不会在技术上/可能覆盖我声明的其他局部变量,因为它会扩展到我的数组长度之外?如果是这样,有没有办法处理这个限制3个输入字符或什么?如果没有,为什么/如何知道只输入3的大小?
*注意:我是C的新手,我找不到这个,所以即使这很简单,我也很感激.因为我显然缺少一些东西.我来自java背景,这甚至都不是问题.
通常我使用一个字符串大小的define,但是当我使用时scanf(),我想保护函数不要读取太多字符(并为null终止符保留空间).我想知道我是否可以使用我的定义,而不是硬编码的幻数...
#include <stdio.h>
#define MAXLEN 4
int main(void) {
char a[MAXLEN];
scanf("%3s", a); // Can I do that with 'MAXLEN' somehow?
}
Run Code Online (Sandbox Code Playgroud)
可能吗?如果有,怎么样?
我想将字段宽度说明符应用于 scanf() 操作以读取字符串,因为明确指定要读取/使用的字符数量,并且不会使 -scanf()操作容易导致缓冲区溢出。除了目标参数指向一个已经匹配的char数组,该数组与元素的大小完全相同,字段宽度的所需值必须是,+ 1 表示\0. 这个char数组的大小也是在运行时之前确定的。
现在的问题是最大字段宽度的值无法固定;它仅在运行时确定。
我如何实现,能够在运行时确定最大字段宽度的值?
我做了一些研究,发现在 Stackoverflow 上已经有一个问题,在它的来源中,解决了与我完全相同的问题。scanf() 可变长度说明符
但不幸的是,在问题的发展以及答案的内部,解决方案只能使用预处理器指令宏处理,这意味着字段宽度的值实际上并不是那个变量,它在编译时是固定的-时间。
我有一个例子给你我的意思:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我想做的是这样的:
scanf("%(nr_of_elements)s");
Run Code Online (Sandbox Code Playgroud)
或者,如果我遵循链接问题中答案的编程风格:
scanf("%" "nr_of_elements" "s");
Run Code Online (Sandbox Code Playgroud)
有没有办法使scanf()-function内的最大字段宽度取决于由运行时确定或生成的值?
有没有替代方法可以实现相同的目标? …
我正在尝试创建一个sscanf字符串文字,以帮助在C99中防止缓冲区溢出.目标是这样的:
#define MAX_ARG_LEN 16
char arg[MAX_ARG_LEN] = "";
if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)
显而易见的"手动"解决方案如下:
#define MAX_ARG_LEN 16
#define MAX_ARG_CHARS "15"
char arg[MAX_ARG_LEN] = "";
if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)
但是,我希望在缓冲区大小为16的情况下自动生成"%15X".这个链接几乎适用于我的应用程序:将预处理程序标记转换为字符串,但它不处理-1.
建议?