我有一个char缓冲区,它一个接一个地包含几个整数,它们之间没有任何中断,其中每个单独数字的偏移量是事先已知的。例如“1234123123456”,从位置[0]到[3],它将是第一个数字,[4]到[6]第二个,[7]到最后将是第三个。
有没有办法在不改变缓冲区的情况下将这些不同的部分转换为整数?请不要使用std :: string,因为它对我来说效率低。
答案 0 :(得分:4)
您可以编写一个简单的转换函数:
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;
}
将产生:
1234
56
78901
234567890
请注意,我使用了2个索引参数,第一个包含在内,第二个包含在内。这与C和C ++实践更加一致。您还可以使用更经典的C ++ API,例如int convert_slice(const char *a, const char *b);
答案 1 :(得分:1)
在不编写自己的解析代码或制作临时副本的情况下执行此操作的一种简洁方法是使用sscanf
:
sscanf(src+start_offset, "%4d", &result);
如果字段的长度(示例中为4)不是常数,则需要snprintf
构造一个格式字符串以传递给sscanf
,或者一个可能的数组格式化您需要的大小的字符串。