C, strcat 之后的 char[] 格式错误的 int

标签 c

当打印一个包含 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/

相关文章:

c - 尝试使用 pdcurses 扩展库时出现与 gdi32 相关的错误

c - 反转字符数组而不更改数字值?

c - 使用动态 n 生成 1 到 n 之间的整数

比较 c 输入与 $$ 和 `tty` &

c - GCC v4.9.2 上无法识别的命令行选项 ‘-rdynamic’

c - extern 与 c 中变量的全局定义

c - 返回以 void * 形式存储在 fifo 队列中的 struct *(通过多个函数返回它)

c - 使用 strtok() 的正确方法是什么?

c - 如果重定向输入则执行操作

c - 如何将两个位图与 AVX2 混合 80-20%?