当打印一个具有int concat值的char []时,int不正确。但是str
之后的sprintf
的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')
答案 0 :(得分:4)
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);
}
}
答案 1 :(得分:3)
你宣布:
char in[50] = "INSERT INTO `Test` (`Col1`, `Col2`) VALUES ('1', '";
但
sizeof "INSERT INTO `Test` (`Col1`, `Col2`) VALUES ('1', '"
是51个字符。
这意味着原始in
数组中的空终止符没有足够的空间,因此in
不是字符串,因此您无法将任何内容连接到hmdj
写道,即使它是一个字符串,也没有空间连接任何东西,因为它已满。