C++ 指针算术和串联问题

标签 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')
}

(根据我最近正在处理的代码的内存复制)

最佳答案

它基本上是一个 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/

相关文章:

java - 如何在 JTextArea 中打印数组列表(使用字符)?

c++ - 如何在 C++ 中创建一个简单的 Qt 控制台应用程序?

c++ - 寻找关于指针使用差异的一些确认

c - 如何使用函数更改 2 个字符串,通过更改它们的指针值

Objective-C @interface/指针澄清

java - 如何随机显示给定单词中的单个字符

c++ - 将对象转换为 char,然后转换为 "uncasting it back"

c++ - 在不解析 C++ 的情况下将 html 转换为纯文本?

c++ - Visual Studio 不保存启动项目和解决方案配置

c++ - volatile 和多线程?