C++ C++;每X个字符拆分一个字符串

C++ C++;每X个字符拆分一个字符串,c++,arrays,string,vector,C++,Arrays,String,Vector,我正在尝试编写一个函数,该函数接受一个字符串,并每X个字符拆分一次: std::vector<std::string> DIFSplitStringByNumber(std::string s, int l) { const char *c = s.c_str(); char buffer[l]; std::vector<std::string> entries; entries.reserve(int(s.length() / l)

我正在尝试编写一个函数,该函数接受一个字符串,并每X个字符拆分一次:

std::vector<std::string> DIFSplitStringByNumber(std::string s, int l)
{
    const char *c = s.c_str();  
    char buffer[l];
    std::vector<std::string> entries;
    entries.reserve(int(s.length() / l) + 1);

    int d = 0;   
    for(int i = 0; i < s.length() - 1;)
    {
        if(d != l)
        {
            buffer[d] = c[i];
            d++;
            i++;
        }
        else
        {
            entries.push_back(std::string(buffer, l));

            //Clear array
            memset(buffer, 0, l);
            d = 0;
        }       
    }

    return entries;
}

但是,它似乎只得到前两个结果(向量大小为2),当我执行类似于DIFSplitStringByNumber(“hello”,2)的操作时,它崩溃了,可能是因为它试图访问一个不存在的数组索引(它需要6个字符,但只有5个字符)。有更简单的方法吗?

这会将字符串拆分为向量。如果没有偶数个拆分,它将在末尾添加额外的字符

std::vector<std::string> Split(const std::string& str, int splitLength)
{
   int NumSubstrings = str.length() / splitLength;
   std::vector<std::string> ret;

   for (auto i = 0; i < NumSubstrings; i++)
   {
        ret.push_back(str.substr(i * splitLength, splitLength));
   }

   // If there are leftover characters, create a shorter item at the end.
   if (str.length() % splitLength != 0)
   {
        ret.push_back(str.substr(splitLength * NumSubstrings));
   }


   return ret;
}
std::vector Split(const std::string&str,int splitLength)
{
int NumSubstrings=str.length()/splitLength;
std::载体ret;
对于(自动i=0;i
该算法的核心实际上可以归结为以下两行

for (size_t i = 0; i < s.size(); i += l)
    res.push_back(s.substr(i, l));
(大小i=0;i res.push_back(s.substr(i,l));
另外,您应该通过const引用传递字符串。

使用std::string是char的集合,一个简单的实现可以是:

std::vector<std::string> DIFSplitStringByNumber(const std::string & str, int len)
{
    std::vector<std::string> entries;
    for(std::string::const_iterator it(str.begin()); it != str.end();)
    {
        int nbChar = std::min(len,(int)std::distance(it,str.end()));
        entries.push_back(std::string(it,it+nbChar));
        it=it+nbChar;
    };
    return entries;
}
std::vector DIFSplitStringByNumber(const std::string&str,int len)
{
std::向量条目;
for(std::string::const_迭代器it(str.begin());it!=str.end();)
{
int-nbChar=std::min(len,(int)std::distance(it,str.end());
返回(std::string(it,it+nbChar));
it=it+nbChar;
};
返回条目;
}

更改计算向量大小的方式:

int size = (s.length() - 1) / l + 1;
这相当于输入字符串长度的上限除以输入长度

顺便说一句,
int(s.length()/l)
强制转换是无用的,因为两个操作数都是整数


最后,在循环中使用此大小:

for (int i=0; i<size; i++)

<代码> >(int i=0;为什么没有字符串::子字符串):VC++(例如,代码> char缓冲区[L] <代码>)允许在C++ 14?@ BalkMaNOS中使用C++或G++,yes@barakmanos我甚至没有意识到这是一个非标准的构造。我想它应该是类似于
char*buffer=new char[l]
?@Igor:是的,我会用这个……但是如果它对你有用,那么,我能说什么:)。。。在任何情况下,我都写了一个答案(如下),建议你应该如何计算向量的大小。它是有效的,但似乎没有millsj的解决方案那么快。
for (int i=0; i<size; i++)