将字符串拆分为等长的部分c ++

Posted

技术标签:

【中文标题】将字符串拆分为等长的部分c ++【英文标题】:Split string into parts of equal length c++ 【发布时间】:2020-05-31 04:57:13 【问题描述】:

我想迭代地将任意长度的字符串分解为 length = 80 的子字符串,直到最终子字符串的大小小于 80 或 0。 假设字符串不能被 80 整除,因此最终子字符串的长度不一定是 80。 我在这里做错了什么?

#include <string>
#include <math.h>

string sub;

for (int i = 0; i < ceil(str.length()/80); i++) 
            if(str.length()/80 >= 1)
                sub = str.substr(i*80, 80);
            
            if(str.length()/80 == 0)
                 sub = str.substr(i*80, str.length()%80);
            
            if(sub.length() <= 0)
                 return;

【问题讨论】:

你有什么问题? 一个错误是它不能编译——所以读者不能只是将它复制并粘贴到一个临时的 .cpp 文件中然后运行它来查看它的作用。 【参考方案1】:

ceil(str.length()/80) 是错误的,因为它是整数除法。 ceil(str.length()/80.0) 会更好。然而,使用浮点运算感觉是错误的。

if(str.length()/80 >= 1)
     sub = str.substr(i*80, 80);

if(str.length()/80 == 0)
     sub = str.substr(i*80, str.length()%80);

看起来不错,但它不必要地复杂,因为允许 substr 的第二个参数超过字符串的长度,在这种情况下选择字符串的其余部分。所以这个sub = str.substr(i*80, 80);就是你需要做的。

这是我的编码方式

for (size_t i = 0; i < str.size(); i += 80)

     string sub = str.substr(i, 80);
     ...

【讨论】:

字符串不一定能被 80 整除,所以子字符串的长度可能不是 80。 if(str.length()/80 == 0) 应该是if(str.length()%80) @DarnocEloc substr 的长度参数允许超过字符串中从给定位置到结尾的字符数。如果是这种情况,则返回的字符串将是从给定位置开始的后缀。 @DarnocEloc 正如我所说, substr 的第二个参数允许超过字符串的长度。它简化了编码。 @selbie 是的,我错过了。【参考方案2】:

下面是我的编码方式:

void split(const std::string& str)

    const size_t linelength = 80;

    size_t count = str.length() / linelength;
    auto start = str.begin();
    std::string sub;

    for (size_t i = 0; i < count; i++)
    
        size_t startoffset = i * linelength;
        size_t endoffset = startoffset + linelength;
        sub = std::string(start + startoffset, start + endoffset);
    
    if (str.length() % linelength)
    
        sub = std::string(start + count * linelength, str.end());
    

【讨论】:

【参考方案3】:

这是您问题的替代解决方案:

#include <iostream>
#include <string>
#include <bits/stdc++.h> 
using namespace std;


int main() 
    string initial_str =  "";  //your main string
    int len = initial_str.size(); // size of the main string
    vector<string> sub_str; // vector of substrings

    for (int i = 0; i < len; i += 80)
        sub_str.push_back(initial_str.substr(i, 80));
        //cout<< initial_str.substr(i, 5) << endl;
    

    for (int i = 0; i < sub_str.size(); i++) 
        cout << sub_str[i] << "\n"; 
    return 0;

【讨论】:

以上是关于将字符串拆分为等长的部分c ++的主要内容,如果未能解决你的问题,请参考以下文章

strtok() 如何将字符串拆分为 C 中的标记?

将字符串拆分为C中的字符串数组

C将一个char数组拆分为不同的变量

C#将文本拆分为子字符串

C ++函数将字符串拆分为单词

想要一种使用 PowerShell 将不同字符串拆分为多个部分的通用方法