C,在strcat之后将字符串格式化为char []

时间:2015-01-27 20:18:39

标签: c

当打印一个具有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')

2 个答案:

答案 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写道,即使它是一个字符串,也没有空间连接任何东西,因为它已满。