相关疑难解决方法(0)

如何防止scanf导致C中的缓冲区溢出?

我用这个代码:

while ( scanf("%s", buf) == 1 ){
Run Code Online (Sandbox Code Playgroud)

什么是防止可能的缓冲区溢出的最佳方法,以便它可以传递随机长度的字符串?

我知道我可以通过调用例如限制输入字符串:

while ( scanf("%20s", buf) == 1 ){
Run Code Online (Sandbox Code Playgroud)

但我更愿意能够处理用户输入的任何内容.或者这不能使用scanf安全地完成,我应该使用fgets?

c scanf overflow

75
推荐指数
4
解决办法
9万
查看次数

字符串化 - 它是如何工作的?

我知道:

#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".

为什么?该过程涉及哪些步骤?

c c++ stringification c-preprocessor

50
推荐指数
2
解决办法
3万
查看次数

使用scanf()读取的字符串大小不超过

编辑:对于我的班级,我必须使用scanf.所以推荐其他输入方式不是我正在寻找的解决方案(如果有一个涉及scanf).


如果我正在读取小项目的用户输入(例如,游戏).让我们说我会问would you like to play? 这会接受yesno回答.所以我写了一些像这样的简单代码:

#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)

所以这段代码应该简单地要求他们输入yesno.我正在设定我char array的大小3.这样它足够大yes,也可以no.但是如果有人要输入无效的输入,比如yesss,我知道如何比较字符串以后处理这样的事件,但是这不会在技术上/可能覆盖我声明的其他局部变量,因为它会扩展到我的数组长度之外?如果是这样,有没有办法处理这个限制3个输入字符或什么?如果没有,为什么/如何知道只输入3的大小?

*注意:我是C的新手,我找不到这个,所以即使这很简单,我也很感激.因为我显然缺少一些东西.我来自java背景,这甚至都不是问题.

c string scanf format-specifiers

31
推荐指数
4
解决办法
4万
查看次数

保护scanf从定义中读取太多字符?

通常我使用一个字符串大小的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)

可能吗?如果有,怎么样?

c arrays string scanf c-preprocessor

4
推荐指数
1
解决办法
192
查看次数

scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在运行时确定。怎么让它变呢?

我想将字段宽度说明符应用于 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)
  1. 有没有办法使scanf()-function内的最大字段宽度取决于由运行时确定或生成的值?

  2. 有没有替代方法可以实现相同的目标? …

c c++ runtime scanf format-specifiers

3
推荐指数
1
解决办法
893
查看次数

使用C预处理器为scanf构造字符串文字?

我正在尝试创建一个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.

建议?

c string concatenation scanf c-preprocessor

1
推荐指数
1
解决办法
1313
查看次数