【问题标题】:How to convert an integer to a c-string and vice versa and other datatypes without using any in-built functions? [closed]如何在不使用任何内置函数的情况下将整数转换为 c 字符串,反之亦然和其他数据类型? [关闭]
【发布时间】:2020-01-04 14:31:37
【问题描述】:

我不明白它的基本概念。

【问题讨论】:

  • 甚至没有关闭。与您的教授/助教交谈。您需要学费,而不是 SO 问题。
  • C 中没有“内置”函数,大概您的意思是不使用标准库或第三方函数?字符串是字符的序列,而整数是二进制值。从一个翻译到另一个显然不像你天真的建议那么简单。作为一名 CS 学生,这就是你的课程导师应该教给你的——这是非常基础的东西——不是 C 语言,而是一般的计算......
  • 您在编辑中使问题变得更糟 - 不要在标题中提出与正文不同的问题,并且一次不要提出多个问题。它已经因为缺乏焦点而获得了密切的投票,现在你让情况变得更糟了。您的更改使现有答案(以及某人可能正在编写的任何答案)变得毫无意义。
  • 什么?!不!你是怎么得出这个结论的?你试过了吗?它有效吗?重新开始,并在代码中展示您想要实现的目标的一些努力或示例 - 与您似乎试图免费完成作业相比,它被关闭的可能性要小得多。
  • 计算机中的值使用位表示。大多数情况下,八位组合在一起并称为一个字节。在 C 中,char 是表示字符的字节。 C 字符串是一个字节序列(包含在一个数组中),以一个值为 0 的字节结尾。正整数使用二进制表示。通常,C 中的int 类型是四个字节(32 位)。要从 C 字符串中的十进制数字转换,您需要编写软件代码来检查字符串中的字符,计算表示的值,并将结果放入 int

标签: c arrays string function


【解决方案1】:

C 中的字符串是包含零值终止符的字符值序列 - 字符串 "1234" 表示为字符序列 {'1', '2', '3', '4', 0}。假设 ASCII 编码,这是一个 {0x31, 0x32, 0x33, 0x34, 0x00} 的字节序列。

C 中的整数值是标准的二进制表示。假设一个 32 位整数,值 1234 表示为 0x000004d2 - 与字符串表示不同。

将十进制整数 ("1234") 的字符串表示形式转换为整数值相当简单:

int result = 0;
char *p = "1234";

while ( *p )  // while we haven’t reached the end of the string
{
  result *= 10;           // shift our result by 1 digit left
  result += (*p++ - '0')  // convert the current character 
                          // to its decimal equivalent and 
                          // add to the result, and advance 
                          // p to point to the next character
}

所以当我们处理字符串"1234"时,我们得到

result = 0            // 0
result = 10 * 0 + 1   // 1
result = 10 * 1 + 2   // 12
result = 10 * 12 + 3  // 123
result = 10 * 123 + 4 // 1234

C 标准要求十进制数字编码是连续的,因此 '1' - '0' 产生 1'2' - '0' 产生 2 等。

另一种方式(整数到字符串)涉及更多。您必须确保目标缓冲区足够大以容纳字符串,包括符号和终止符。表示一个十进制数字平均需要 3 位多一点,因此 32 位整数可能代表 10 个十进制数字。您的目标缓冲区至少需要 12 个字符宽才能考虑可能的符号和终止符。

你可以通过将整数值连续除以10从右到左得到各个小数位:

char target[14] = {0};
int value = 1234;
size_t end = 4; // this is a cheat
while ( value )
{
  digit = value % 10;   // isolate the least significant digit
  value /= 10;          // shift value one digit right
  char c = '0' + digit; // convert digit to character
  target[––end] = c;    // add the digit to the string.
}

我有点作弊,因为我知道要提前转换多少位数 - 在一般情况下,您必须弄清楚要计算多少位数,以及是否必须使用符号考虑到。

【讨论】:

  • 假设一个 32 位整数不能超过 10 位,一个简单的解决方案是以end = sizeof(target) - 1 开头,并使用字符串&target[end + 1] 而不是target
【解决方案2】:
4567

意思

4 * 10^3 + 5 * 10^2 + 6 * 10^1 + 7 * 10^0

这也可以写成

( ( 4 * 10 + 5 ) * 10 + 6 ) * 10 + 7

如果这个数是反复乘以10形成的,那就意味着把它拆开是通过反复除以10来完成的。

4567/10 = 456 + 7/10
 456/10 =  45 + 6/10
  45/10 =   4 + 5/10
   4/10 =   0 + 4/10

这些除法的其余部分,一旦添加到'0',将给出你的字符串的数字。

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多