【问题标题】:Split string into parts of equal length c++将字符串拆分为等长的部分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 文件中然后运行它来查看它的作用。

标签: c++ string loops substring


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2015-10-05
      • 2011-04-15
      • 2012-01-06
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多