这取决于你想用它做什么.
由于您在内存中有字符串,因此可以通过小心传递的参数来安全地避免缓冲区溢出.例如,如果你正在扫描一个字符串,使用"%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().他们对错误的行为有点棘手,但至少它的定义很明确.
我相信您正在寻找“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)