簡體   English   中英

C,在strcat之后將int格式化為char []

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM