在C中,什么是sscanf的安全替代品?

Cof*_*fee 4 c

我在网上发现,在C++中有一个替代方案,但是普通的C呢?我感谢任何提示或建议.

Kei*_*son 8

这取决于你想用它做什么.

由于您在内存中有字符串,因此可以通过小心传递的参数来安全地避免缓冲区溢出.例如,如果你正在扫描一个字符串,使用"%s",只需使用足够大的目标缓冲区来保存可能存在的最大字符串(并确保源缓冲区是一个有效的字符串,即它被'\0'终止).

所有*scanf()函数的一个危险是,如果您正在扫描数值,并且输入值太大而无法在目标类型中表示,则行为未定义.例如,这个程序:

#include <stdio.h>
int main(void) {
    const char *s = "999999999999999999999999999";
    int n;
    sscanf(s, "%d", &n);
    printf("n = %d\n", n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有未定义的行为(除非INT_MAX真的很大).

您可以放心地使用扫描的数值strto*()函数:strtol(),strtoll(),strtoul(),strtoull(),strtof(),strtod(),strtold().他们对错误的行为有点棘手,但至少它的定义很明确.


ula*_*ekh 5

我相信您正在寻找“m”修饰符。它动态分配内存来保存提取的字符串,以避免缓冲区溢出。唯一的缺点是它是一个 GNU 扩展,所以例如 MSVC 可能无法识别它。

这是关于该主题的现有 Stack Overflow 答案

以下是如何使用它的示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *str;
    printf("Enter your name:\n");
    scanf("%ms", &str);

    printf("Hello %s!\n", str);
    free(str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)