此代码如何连接字符串缓冲区中的数据?什么是 * 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')
}
(根据我最近编写的代码记忆复制)
答案 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
设置为零。
'1'
并减去'0'
,实际上加1得1。'2'
并减去'0'
,有效地加2得12。'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)