【问题标题】:Strcat keeps overwriting my char array?Strcat 不断覆盖我的 char 数组?
【发布时间】:2014-06-27 11:59:38
【问题描述】:

buffeV 是这里的问题。当我 strcat 它被覆盖而不是附加。

char temper[12];char buffeV[12];char buffe[2];
if(version<10)
{
    sprintf(temper,"/0%d",version);
    strcpy(buffeV, temper);
}
if(version>=10)
{
    sprintf(temper,"/%d",version);
    strcpy(buffeV, temper);
}      
printf(" BUFFEV: %s ",buffeV);  
if(fileCount<10)
{
    sprintf(buffe,"0%d",fileCount);
    sprintf(temper,"/0%d/0000",fileCount);
    strcat(buffeV,temper);
}
if(fileCount>=10)
{
    sprintf(buffe,"%d",fileCount);
    sprintf(temper,"/%d/0000",fileCount);
    strcat(buffeV,temper);
}
printf(" BUFFEV: %s ",buffeV);

printf 显示 buffeV 是 /03 然后 /03/0000 应该是 /03/03/0000 顺便说一句,它们并不总是相同的值,这就是它被分开的原因。 我已经搞砸了很多,无法得到不同的结果。我还尝试专门声明 '\0' 的位置,看看是否可以解决问题,但仍然没有成功。这段代码有什么问题? 谢谢

注意:version 和 fileCount 都是在别处声明的整数。但它们不是问题,代码实际上运行良好,直到我意识到我需要检查 fileCount 是否高于 10,这是我最初只使用 sprintf 时必须添加 strcat 的时候

【问题讨论】:

  • 请做一个最小的可编译示例。 sprintf(buffe, ...) 调用意味着您要么打错了字,要么遗漏了变量声明。
  • 你去吧,抱歉我没有注意那个变量。
  • buffe[2] 也太小了。它至少需要 3 个元素。目前,您正在溢出它并破坏堆栈上相邻的任何变量。
  • 我觉得这太复杂了。为什么不用buffeV[100];sprintf("/%02d/%02d/0000", version, fileCount);替换整个代码sn-p。
  • %02d 是否意味着每次都是 2 个字节?我不知道这个......这很有用

标签: c arrays printf strcpy strcat


【解决方案1】:

更简单的方法是让 sprintf 为您完成所有工作:

buffeV[100];
sprintf(buffeV, "/%02d/%02d/0000", version, fileCount);

这将自动填充任何单个数字值。这就是我认为您的代码正在尝试做的事情。

或者更安全的版本:

buffeV[100];
snprintf(buffeV, 100, "/%02d/%02d/0000", version, fileCount);

【讨论】:

    【解决方案2】:

    buffe[2] 太小。它至少需要 3 个元素。填充它的 sprintf 调用溢出到堆栈上的相邻变量 (buffeV)。 buffe 的终止 NUL 以 buffeV[0] 结束,因此后续的 strcat(buffeV, ...) 调用会在 buffeV 中看到一个零长度字符串。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多