当打印一个包含 int 值的 char[] 时,int 是不正确的。然而 sprintf
之后 str
的 printf 输出正确的值。
我正在使用这段代码:
int i;
for( i = 0; i < 10; i++){
char str[20];
sprintf(str, "%i", i);
char in[50] = "INSERT INTO `Test` (`Col1`, `Col2`) VALUES ('1', '";
strcat(in, str);
strcat(in, "')");
printf("%s", in);
}
输出:INSERT INTO Test (Col1, Col2) VALUES ('1', 'A&?0')
最佳答案
in
太小,因为字符串文字是 50
个字符,这意味着 strcat()
之后的写入超出了缓冲区的末尾导致未定义的行为,在这种情况下导致损坏(实际上字符串文字是 50 + 1
由于附加到字符串文字的隐式空终止符)。要正确增加缓冲区的大小并使用 snprintf()
以防止缓冲区溢出并在单个操作中执行字符串构造。例如:
for (int i = 0; i < 10; i++)
{
char str[128];
const int result =
snprintf(str,
sizeof(str),
"INSERT INTO `Test` (`Col1`, `Col2`) VALUES ('1', '%i')",
i);
if (-1 == result)
{
fprintf(stderr, "Failed to create 'INSERT' statement\n.");
}
else if (result >= sizeof(str))
{
fprintf(stderr, "Failed to create 'INSERT' statement: truncated\n");
}
else
{
printf("[%s]\n", str);
}
}
关于C, strcat 之后的 char[] 格式错误的 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28179220/