【问题标题】:cast one element of char array to int将 char 数组的一个元素转换为 int
【发布时间】:2013-10-16 14:17:34
【问题描述】:

我有 char 数组:

char c[10]="ff213";

我需要将 char 的一个元素转换为 int。我试过这个:

int i=atoi(c[2]);

但我得到运行时错误。还有这个:

int i=(int)c[2];

但它返回 50 而不是 2。 我该怎么做?

【问题讨论】:

  • 最好在问题中包含错误消息。
  • 它返回 50 而不是 2,因为 50 是字符“2”的 ASCII 值。

标签: c casting char


【解决方案1】:

像这样:

const int digit2 = c[2] - '0';

这是可行的,因为 C 保证十进制数字的编码是按顺序排列的,没有任何间隙。

这不是(如您所见)“演员表”,它只是简单的计算。如果你转换字符,你会得到一个整数的编码表示,在你的例子中是 50(十六进制 0x32),它是数字 2 的 ASCII(和 UTF-8,以及一堆其他编码)编码。

【讨论】:

  • 放松,你的意思是c[2] - '0''\0'NUL字符
  • @AlterMann 绝对是一个愚蠢的错字!谢谢!
【解决方案2】:

您收到错误的原因是 atoi() 需要一个字符串(即 char* 到一个以 null 结尾的字符串)。

不仅你给 atoi() 一个字符而不是一个指针,空字节 ('\0') 只存在于第 5 个字符之后。

完成您所追求的最简单的方法是:

int i = c[2] - '0';

这样,'2' (50) 的 ascii 代码减去 '0' (48) 的 ascii 代码,得到 i 的正确答案。

【讨论】:

  • 如果我错了,请纠正我,但通过给 atoi c[2] 他本质上是取消引用 c 数组。给atoi(&c[2])不是更好吗?这样它应该返回 i 作为 213。
  • 通过调用 atoi(&c[2]) 他确实会使用正确的参数(即指向空终止字符串的指针)调用函数,并在 i 中返回 213。问题是他只想“投射”第三个字符,而不是整个后面的字符串。
猜你喜欢
  • 2017-02-17
  • 2014-09-12
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多