我有一个程序创建一个动态 char 数据输入字符串(不允许使用 c++ 字符串),看起来像这样(其中基本上可以是任何其他数据而不是日期,并且没有给出数据块的数量):
2004-01-18|2005-01-18|
我需要对字符串做的是将其拆分为可用于打印的奇异数据块的 2d char 数组。我的代码如下所示:
char** CRegister::Split(char *st, int& parts, int& maxChars) const{
parts = 0;
maxChars = 0;
int maxtmp = 0;
int j = 0;
/* Calculating the number of data blocks in the string */
while(st[j]){
if(st[j] == '|'){
parts++;
}
j++;
}
j = 0;
/* Calculating the longest data block length for array initialization */
while(st[j]){
if(st[j] != '|'){
maxtmp++;
}
else{
if(maxtmp > maxChars){
maxChars = maxtmp;
}
maxtmp = 0;
}
j++;
}
j = 0;
cout << "!!!!!-----!!!!!-" << st << "-!!!!!!!-----!!!!!" << endl;
/* Initialization of the dara array */
char **array = new char*[parts];
for(int i = 0; i < parts; i++){
array[i] = new char[maxChars];
}
/* Filling the array with data blocks */
int p = 0;
for(int i = 0; i < parts; i++){
while(st[j] != '|'){
array[i][p] = st[j];
j++;
p++;
}
if(st[j] == '|'){
j++;
}
p = 0;
}
return array;
}
在大多数情况下,它按照我需要的方式工作,但问题是它有时会表现得无法预测,破坏了整个程序——数据块并没有在它们应该在的地方结束,还有一堆其他字符被添加到它(通常是以前使用的单词的一部分)。结果看起来像这样(“!!!!!-----!!!!!-”之间的线是预处理数组)
!!!!!-----!!!!!-2003-01-18|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Whiston's street|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Miami|-!!!!!!!-----!!!!!
2003-01-18 Whiston's street Miami
!!!!!-----!!!!!-2004-01-18|2005-01-18|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Whiston's street|Someone's streetz|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Miami|Siberia|-!!!!!!!-----!!!!!
2004-01-18 Whiston's street Miami
2005-01-18street Someone's streetz Siberia
!!!!!-----!!!!!-2004-01-18|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Whiston's street|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Miami|-!!!!!!!-----!!!!!
2004-01-18 Whiston's street Miami
!!!!!-----!!!!!-2004-01-18|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Whiston's street|-!!!!!!!-----!!!!!
!!!!!-----!!!!!-Miami|-!!!!!!!-----!!!!!
2004-01-18streetz Whiston's street Miami
对于三组不同的数据,该函数连续调用三次,然后连续打印。