【问题标题】:Weird output of strlen on int to char conversion in C在 C 中将 int 转换为 char 时 strlen 的奇怪输出
【发布时间】:2018-09-09 00:03:43
【问题描述】:

为什么下面的代码将长度打印为 2 而不是 1?

int i = 2;

char tmp = i + '0';

printf("len of %s is %zu \n ",&tmp,strlen(&tmp));

【问题讨论】:

  • tmp 是一个char,其值为'2'。表达式&tmp 产生一个指向该字符的指针,但这不是一个字符串,因为它指向的(等效于一个)单字符数组中没有终止符。因此,strlen() 调用表现出未定义的行为。

标签: c string type-conversion int


【解决方案1】:

为什么下面的代码打印...

因为您的代码表现出未定义的行为,并且可以执行任何操作(包括崩溃而不是打印任何内容)。

strlen合约 表示您必须将指向 NUL 终止字符串的指针传递给它。但是&tmp 不是指向这样一个字符串的指针。

要解决此问题,您可以这样做:

char tmp[2];
tmp[0] = i + '0';
tmp[1] = '\0';  // The NUL terminator

printf("len of %s is %zu \n ", tmp, strlen(tmp)); 

【讨论】:

  • 但这里我必须是个位数,当我达到两位数时你会怎么做?
  • @PrathuBaronia 您是否尝试实现itoa?显然,您将需要更大的临时缓冲区(仍应正确为NUL-terminated)。
  • 作为我的问题的一部分,我在做与 itoa 相同的事情,但我想澄清一下添加“0”的事情。是否可以替代小于 255 的两位和三位数字?
  • @PrathuBaronia 对不起,我不明白你的问题。您可能应该从“您正在努力实现的目标”、“您到目前为止所写的内容”以及您关于终止 \0 的问题开始一个新问题(应该仍然存在)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2012-06-25
  • 2021-05-03
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多