C++ C++;:将char数组的一部分转换为int的有效方法
我有一个字符缓冲区,它包含几个整数,一个接一个,它们之间没有任何中断,每个单独数字的偏移量都是预先知道的。例如,“1234123123456”,其中从位置[0]到[3]它将是第一个数字,[4]到[6]是第二个数字,[7]到末尾将是第三个数字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)
有没有办法在不改变缓冲区的情况下将这些不同的部分转换为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 来构造一个格式字符串,以传递给