【发布时间】:2015-10-21 10:33:04
【问题描述】:
假设我们有一个字符串str:
String str = "1,2,3,4444444444;5,6,7,8888888888;.9,10,11,1212121212;.";
定义嵌入在字符串中的三个维度d1、d2和d3如下:
-
d1包含由点“。”分隔的元素 -
d2包含由分号“;”分隔的元素 -
d3包含由逗号“,”分隔的元素
d3 是 d2 的子代,d2 是 d1(父代)的子代。 d1 > d2 > d3.
我们希望能够访问嵌入在字符串中的每个元素,这意味着我们应该 - 作为结果 - 一个数组,如下所示:
d[0][0][0] = "1";
d[0][0][1] = "2";
d[0][0][2] = "3";
d[0][0][3] = "4444444444";
d[0][1][0] = "5";
d[0][1][1] = "6";
d[0][1][2] = "7";
d[0][1][3] = "8888888888";
d[1][0][0] = "9";
d[1][0][1] = "10";
d[1][0][2] = "11";
d[1][0][3] = "12121212";
- 您可以看到
d[i][j][k]其中k = [0, 2]是整数。 - 您可以看到
d[i][j][k]其中k = 3是长整数。
我们现在希望将这些字符串转换为适当的整数类型(常规整数或长整数)。这意味着我们的最终数组应该是这样的:
d[0][0][0] = 1; // int
d[0][0][1] = 2; // int
d[0][0][2] = 3; // int
d[0][0][3] = 4444444444; // long int
d[0][1][0] = 5; // int
d[0][1][1] = 6; // int
d[0][1][2] = 7; // int
d[0][1][3] = 8888888888; // long int
d[1][0][0] = 9; // int
d[1][0][1] = 10; // int
d[1][0][2] = 11; // int
d[1][0][3] = 12121212; // long int
这个想法将在基于 c/c++ 的 arduino 微控制器上实现。
这是我的看法,不幸的是无法正常工作。
String data = "1,2,3,1445303228;4,5,6,1445303228;.7,8,9,1445303273;.";
int data_length = data.length() + 1;
if (data_length != 1) {
char d0[data_length]; // couldn't do it with String, let's try char
data.toCharArray(d0, data_length);
int size1 = 32, size2 = 64; // intuitive sizes
char d1[size1][136]; // strlen("1,2,3,1445303228") * 8, 17 * 8 = 136
int i = 0;
for (char *p = strtok(d0, "."); p != NULL; p = strtok(NULL, "."))
strcpy(d1[i++], p); // d1
int d1_length = i;
char d2[d1_length][size2][17]; // strlen("1,2,3,1445303228") = 16
int d2_length[size2];
for (int i = 0; i < size2; i++) d2_length[i] = 0; // initialize array = 0
for (int i = 0; i < d1_length; i++) {
int j = 0;
for (char *p = strtok(d1[i], ";"); p != NULL; p = strtok(NULL, ";"))
strcpy(d2[i][j++], p); // d2
d2_length[i] = j;
}
int d2_length_max = 0;
for (int i = 0; i < size2; i++)
if (d2_length[i] > d2_length_max) d2_length_max = d2_length[i];
char d3[d1_length][d2_length_max][4][10];
// d2 can have 4 d3's max, d3 can have 10 chars max
for (int i = 0; i < d1_length; i++) {
for (int j = 0; j < d2_length[i]; j++) {
int k = 0;
for (char *p = strtok(d2[i][j], ","); p != NULL; p = strtok(NULL, ","))
strcpy(d3[i][j][k++], p); // d3
}
}
int rows[d1_length][d2_length_max][3];
long rows_long[d1_length][d2_length_max];
for (int i = 0; i < d1_length; i++)
for (int j = 0; j < d2_length[i]; j++)
for (int k = 0; k < 3; k++)
rows[i][j][k] = atoi(d3[i][j][k]); // char array to integer
for (int i = 0; i < d1_length; i++)
for (int j = 0; j < d2_length[i]; j++) {
char temp[10];
for (int k = 0; k < 10; k++) temp[k] = d3[i][j][3][k];
rows_long[i][j] = atol(temp); // char array to long
}
}
请注意,长整数实际上是一个 unix 时间戳。
【问题讨论】:
-
解析前知道大小吗?你有没有尝试过?
-
解析前知道元素个数和大小吗?
-
@Ôrel 在解析之前我不知道大小,我们无法判断,这实际上是技巧的一部分,它取决于可以变化的字符串的大小。我在下面发布了我的尝试。
-
格式不一致为什么在
.之前有一个;或者为什么在;之前没有一个,以及为什么要完成;.数据? -
不,不是,在您的示例中,
4444444444之后没有,,那么您为什么在5,6,7,8888888888之后有;?显示 pblm 的其他方式有 3 个,用于 4 个元素,但 3;用于 3 个元素
标签: c++ c arrays string arduino