将char数组快速拆分成块c ++

时间:2013-06-16 06:46:09

标签: c++ arrays

除了遍历整个数组之外,是否有更快/更有效的方法将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;
    }
}

3 个答案:

答案 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个变量iji表示当前子字符串的开头,j表示一个过去的结束迭代器。这里的迭代器可以被认为是指向string的{​​{1}}数组的内部结构的指针 - 它们甚至可能是char s!

然后我们一次遍历原始字符串一行。 char*只是在正确的位置构建emplace的新元素。该调用等同于vector,仅在C ++ 11中可用。

要完成,我们使用output.push_back(std::string(i, j))检查是否还有另一个整块; line.end() - j > 21line.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 :: string,请使用它。
  • 不要使用浮点进行整数计算:只需使用整数关节术
  • 问题的复杂性是O(1)。没有其他解决方案可以用较少的一个字符串步行范围和相关副本
  • 来覆盖它
  • 正确使用C ++,忘记C

=

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处理。