【问题标题】:C++ Pointer Arithmetic and Concatenation QuestionC++ 指针算术和连接问题
【发布时间】:2010-08-16 01:26:04
【问题描述】:

这段代码如何连接字符串缓冲区中的数据? * 10 在做什么?我知道减去 '0' 就是减去 ASCII 所以变成一个整数。

char *buf; // assume that buf is assigned a value such as 01234567891234567
long key_num = 0;
someFunction(&key_num);
...

void someFunction(long *key_num) {

    for (int i = 0; i < 18; i++)
        *key_num = *key_num * 10 + (buf[i] - '0')
}

(从我最近正在编写的代码的记忆中复制)

【问题讨论】:

  • 这不是基本的 atoi 等价物吗?当然,假设是 buf 具有从 '0' 到 '9' 的字符,并且 long 的宽度足以容纳结果(64 位平台?)。此外,此代码不会连接任何前导零。
  • @chubsdad:事实证明,在这种情况下,丢弃前导零是一种期望的副作用。我从不认为这是 atoi 的情况,但我现在明白你的意思了。

标签: c++ pointers char


【解决方案1】:

它基本上是一个atoi-type(或atol-type)函数,用于从字符串创建整数值。考虑字符串"123"。

在开始之前,key_num 设置为零。

  • 在第一次迭代中,乘以 10 得到 0,然后添加字符值 '1' 并减去 '0',实际上加 1 得到 1。
  • 在第二次迭代中,乘以 10 得到 10,然后添加字符值 '2' 并减去 '0',实际上加 2 得到 12。
  • 在第三次迭代中,乘以 10 得到 120,然后添加字符值 '3' 并减去 '0',实际上加 3 得到 123。

瞧!给你,123。

如果您将代码更改为如下所示:

#include <iostream>

char buf[] = "012345678901234567";
void someFunction(long long *key_num) {
    std::cout << *key_num << std::endl;
    for (int i = 0; i < 18; i++) {
        *key_num = *key_num * 10 + (buf[i] - '0');
        std::cout << *key_num << std::endl;
    }
}

int main (void) {
    long long x = 0;
    someFunction (&x);
    return 0;
}

那么您应该会看到它的实际效果(我必须将您在评论中提供的 17-character 数组更改为 18-character 数组,否则当你尝试在结尾使用字符时会遇到一些问题;我还不得不更改为 long long,因为我的 long 不够大):

0
0
1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890
12345678901
123456789012
1234567890123
12345678901234
123456789012345
1234567890123456
12345678901234567

【讨论】:

    【解决方案2】:

    作为一个数字 1234 的简短示例,可以认为是:

    1000 * 1 + 100 * 2 + 10 * 3 + 4
    

    或者:

    10 * (10 * (10 * 1 + 2) + 3) + 4
    

    第一次循环时,*key_num 为 1。第二次乘以 10 并加 2(即 12),第三次乘以 10 并加 3(即 123),第四次乘以由 10 和 4 相加(即 1234)。

    【讨论】:

      【解决方案3】:

      它只是将当前的 long 值 (*key_num) 乘以 10,然后将数字值相加,然后再次存储结果。

      编辑:它不会移位任何东西。这只是数学。你可以把它想象成移动十进制数字,但它内部是二进制的。

      key_num = 0 (0) key_num = key_num * 10 + ('0' - '0') (0) key_num = key_num * 10 + ('1' - '0') (1) key_num = key_num * 10 + ('2' - '0') (12)

      【讨论】:

      • 您能进一步解释一下吗?比如它是如何转变为下一个数字腾出空间的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多