【问题标题】:Unexpected output while adding characters from a string into other strings using sprintf使用 sprintf 将字符串中的字符添加到其他字符串时出现意外输出
【发布时间】:2015-12-23 03:20:38
【问题描述】:

我有一个日期字符串,格式为 yyyymmdd。我需要找出日、月、年并将它们存储在单独的字符串中并进一步使用它们。 我写了以下代码

char *date="20151221";
char day[2];
char month[2];
char year[4];
sprintf(day, "%c%c", date[6], date[7]);
sprintf(month, "%c%c", date[4], date[5]);
sprintf(year, "%c%c%c%c", date[0], date[1],date[2],date[3]);
lr_output_message("day is %s",day);
lr_output_message("month is %s",month);
lr_output_message("year is %s",year);

但是得到的输出是

日期是 21122015

月份是 122015

年份是 2015 年

也许这是一个愚蠢的问题,但我是 C 的新手。有人可以解释一下原因吗?

【问题讨论】:

  • 当您使用 sprintf 时,它会在字符串末尾附加一个空值。问题是您正在用空值覆盖相邻变量。这是未定义的行为。查看 sprintf 的手册页。
  • 你知道一个 2 字符的字符串实际上包含 3 个字符吗?例如,“ab”是“a”、“b”和“\0”。

标签: c arrays printf loadrunner


【解决方案1】:

根据C11 标准,第 §7.21.6.6 章,sprintf() 函数,(强调我的

sprintf函数等价于fprintf,只是输出被写入 一个数组(由参数s 指定)而不是流。 写入空字符 在所写字符的末尾; [...]

表示,如果是

sprintf(day, "%c%c", date[6], date[7]);

day 至少应分配 3 个chars 的空间,包括要写入的终止空值。现在,在您的情况下,它没有空间用于终止 null,因此,sprintf() 尝试写入过去分配的内存区域,调用 undefined behavior

在定义数组时,您还需要考虑终止 null 的空间分配。

其他数组也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多