C++ C++;:将char数组的一部分转换为int的有效方法

C++ C++;:将char数组的一部分转换为int的有效方法,c++,C++,我有一个字符缓冲区,它包含几个整数,一个接一个,它们之间没有任何中断,每个单独数字的偏移量都是预先知道的。例如,“1234123123456”,其中从位置[0]到[3]它将是第一个数字,[4]到[6]是第二个数字,[7]到末尾将是第三个数字 有没有办法在不改变缓冲区的情况下将这些不同的部分转换为int?请不要使用std::string,因为它对我来说效率很低。您可以编写如下简单的转换函数: int convert_slice(const char *s, size_t a, size_t b)

我有一个字符缓冲区,它包含几个整数,一个接一个,它们之间没有任何中断,每个单独数字的偏移量都是预先知道的。例如,“1234123123456”,其中从位置[0]到[3]它将是第一个数字,[4]到[6]是第二个数字,[7]到末尾将是第三个数字


有没有办法在不改变缓冲区的情况下将这些不同的部分转换为int?请不要使用std::string,因为它对我来说效率很低。

您可以编写如下简单的转换函数:

int convert_slice(const char *s, size_t a, size_t b) {
    int val = 0;
    while (a < b) {
       val = val * 10 + s[a++] - '0';
    }
    return val;
}

int main(void) {
    char buffer[] = "12345678901234567890";

    printf("%d\n", convert_slice(buffer, 0, 4);
    printf("%d\n", convert_slice(buffer, 4, 6);
    printf("%d\n", convert_slice(buffer, 6, 11);
    printf("%d\n", convert_slice(buffer, 11, 20);

    return 0;
}

注意,我使用了两个索引参数,第一个包含,第二个排除。这与C和C++的实践更一致。您还可以使用更经典的C++ API,如<代码> int转换子句(const char *,const char b);<代码>

您可以编写如下简单的转换函数:

int convert_slice(const char *s, size_t a, size_t b) {
    int val = 0;
    while (a < b) {
       val = val * 10 + s[a++] - '0';
    }
    return val;
}

int main(void) {
    char buffer[] = "12345678901234567890";

    printf("%d\n", convert_slice(buffer, 0, 4);
    printf("%d\n", convert_slice(buffer, 4, 6);
    printf("%d\n", convert_slice(buffer, 6, 11);
    printf("%d\n", convert_slice(buffer, 11, 20);

    return 0;
}

注意,我使用了两个索引参数,第一个包含,第二个排除。这与C和C++的实践更一致。您还可以使用更经典的C++ API,如<代码> int转换子句(const char *,const char b);<代码>

一种不用编写自己的解析代码或制作临时副本的干净方法是使用
sscanf

sscanf(src+start_offset, "%4d", &result);

但是,如果字段的长度(示例中为4)不是恒定的,则需要
snprintf
来构造一个格式字符串以传递给
sscanf
,或者一组可能的格式字符串,以满足您所需的大小。

在不编写自己的解析代码或制作临时副本的情况下,可以使用
sscanf

sscanf(src+start_offset, "%4d", &result);

如果字段的长度(4中的例子)不是常数,则需要使用<代码> SNPROTNF 来构造一个格式字符串,以传递给ScSnFf>代码>,或者一个可能的格式字符串,以供您所需要的大小。

C不是C++,不是C语言。我是用C++编程的,但是一个简单的C答案在这里也会对我有所帮助,因为它们通常都比较简单efficient@EyalK. - “通常更有效”通常是废话。C不是C++不是C语言。我用C++编程,但是C语言的答案也会帮助我,因为它们通常更多。efficient@EyalK. - “通常效率更高”通常是胡说八道。尽管这会在“1234ab+cd/89”这样的字符串上产生有趣的效果。因此,您可能需要执行一些错误处理,这取决于从何处获取字符串。错误处理的成本太高,因为我需要在一个紧密的循环中运行它。我从一个几乎可以保证正常运行的文件中获取字符串,因此我宁愿冒着出错的小风险,而不是运行时的差异。尽管这会在“1234ab+cd/89”这样的字符串上产生有趣的效果。因此,您可能需要执行一些错误处理,这取决于从何处获取字符串。错误处理的成本太高,因为我需要在一个紧密的循环中运行它。我从一个几乎可以保证正常运行的文件中获取字符串,因此我宁愿冒着出错的小风险,而不是运行时的差异