除了遍历整个数组之外,是否有更快/更有效的方法将char数组拆分为块(比如21个字符/数组)?
这是我现在的尝试
const char* arr = line.c_str();
char smallArr[(int)ceil((double)strlen(arr)/(double)21)][21];
int arrSisze[(int)ceil((double)strlen(arr)/(double)21)][1];
int m=0;int n=0;
for (int i=0; i<strlen(arr); i++) {
smallArr[m][i]=arr[i];
arrSisze[m][0]=(i+1)-n;
if ((i-n)==19) {
m++;
n+=20;
}
}
答案 0 :(得分:3)
是,指针算术和memcpy
。但是,当你正在使用C ++时,让我们坚持std::string
并假设他们为我们做memcpy
。
std::vector<std::string> output;
output.reserve(line.length() / 21 + (line.length() % 21) ? 1 : 0);
auto i = line.begin(), j = i + 21;
for(; line.end() - j > 21; i = j, j+= 21)
{
output.emplace(i, j)
}
if(j != line.end())
{
output.emplace(j, line.end());
}
那么,这里发生了什么?出于我们的目的,将std::string
视为char
数组和length
变量就足够了。
首先,我们为输出预留了足够的空间。你也是这样做的。
接下来,我们定义2个变量i
和j
。 i
表示当前子字符串的开头,j
表示一个过去的结束迭代器。这里的迭代器可以被认为是指向string
的{{1}}数组的内部结构的指针 - 它们甚至可能是char
s!
然后我们一次遍历原始字符串一行。 char*
只是在正确的位置构建emplace
的新元素。该调用等同于vector
,仅在C ++ 11中可用。
要完成,我们使用output.push_back(std::string(i, j))
检查是否还有另一个整块; line.end() - j > 21
是line.end()
数组的一个过去的迭代器 - 它指向char
个字符(如果有的话)。如果没有整个块,我们使用NUL
检查部分块。
答案 1 :(得分:1)
1)使用memcpy
char myname[] = "hello";
char dest[20] = {0};
/* using memcpy to copy string: */
memcpy ( dest, myname, 5);
2)使用strncpy
char str1[]= "To be or not to be";
char str2[40];
strncpy ( str2, str1, sizeof(str2) );
答案 2 :(得分:0)
不要重新优化标准库。
=
std::vector<std::string> chunks;
chunks.resize(21);
size_t chunksize = line.size()/21+1;
for(size_t i=0,j=0; i<line.size(); i+=chunksize, ++j)
{ chunks[j] = line.substr(i,chunksize); }
请注意sting::size
需要N ^ 0,而strlen
需要N ^ 1复杂度(内部有一个循环)。
在这段代码中,我的循环在块上是21 ^ 1,substr是每个块内容的(N / 21)^ 1,在整个长度上给出N ^ 1。
不需要跟踪字符串长度,并且null终止字符串。全部由std :: string class处理。