C ++指针算术和连接问题

时间:2010-08-16 01:26:05

标签: c++ pointers char

此代码如何连接字符串缓冲区中的数据?什么是 * 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')
}

(根据我最近编写的代码记忆复制)

3 个答案:

答案 0 :(得分:3)

作为数字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)。

答案 1 :(得分:3)

它基本上是一个atoi - 类型(或atol - 类型)函数,用于从字符串创建整数值。考虑字符串"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个字符数组中的值更改为 18个字符一个,否则当你试图使用超越最终的角色时,你会遇到一些问题;我还必须改为long long,因为我的长度不够大):

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

答案 2 :(得分:1)

它只是将当前的长值(*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)