[英]C, Malformed int to char[] after strcat
當打印具有連接的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
因為隱式null終止符附加到字符串文字上)。 要更正緩沖區的大小,請使用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);
}
}
您聲明:
char in[50] = "INSERT INTO `Test` (`Col1`, `Col2`) VALUES ('1', '";
但
sizeof "INSERT INTO `Test` (`Col1`, `Col2`) VALUES ('1', '"
是51個字符。
這意味着沒有足夠的空間,在你原來的空終止in
數組,所以in
不是一個字符串,所以你能不能連接任何東西把它和hmdj
甚至寫道,如果它是一個字符串,就沒有余地來連接任何已滿的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.