这段代码如何连接字符串缓冲区中的数据? * 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
类型(或 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
,因为我的 long 不够大):
0
0
1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890
12345678901
123456789012
1234567890123
12345678901234
123456789012345
1234567890123456
12345678901234567
关于C++ 指针算术和串联问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3490040/