[C++] 130 文字列分割ライブラリの機能追加 区切り文字の変更

[M1 Mac, Big Sur 11.6.8, FLTK 1.3.8, NO IDE]

前回記事で文字列のスペースを削除して新たなファイル名を作成しましたが、より読みやすくするため区切り文字をアンダースコアなどに変更できるようライブラリにsplitJoin2関数を追加しました。

#pragma once
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <vector>
#include <cstdio>
#include <sstream>
#include <iostream>

using std::string; using std::vector;
using std::cout; using std::endl;

class Split{
    
public:
vector<string> splits(string str, const char* del);
string splitJoin(string str, const char* del, int start, int end);
string splitJoin2(string str, const char* del1, const char* del2, int start, int end);
int chCWD(string str, const char* del, int start, int end);
};
#include "Split.h"

using std::string; using std::vector;
using std::cout; using std::endl;

// 文字列を文字列delで分割しリスト化する関数
vector<string> Split::splits(string str, const char* del) {
    int first = 0;
    int last = str.find_first_of(del);
 
    vector<string> result;
 
    while (first < str.size()) {
        string subStr(str, first, last - first);
 
        result.push_back(subStr);
 
        first = last + 1;
        last = str.find_first_of(del, first);
 
        if (last == string::npos) {
            last = str.size();
        }
    }
    return result;
}

// 分割リストのstart番目からend番目までの要素を同じ区切り文字で再結合する関数(startの最小値は0)
string Split::splitJoin(string str, const char* del, int start, int end){
    string result2;

    if (str.find(del) == std::string::npos){
        cout << "区切り文字が含まれていません" << endl;
        return str;
    }

    vector<string> list = Split::splits(str, del);

    vector<string> list2;
    for (int i = 0; i < list.size(); i++){
        if (end < 0){
            end += list.size();
        }
        if (i >= start && i <= end) {
            list2.push_back(list[i]);
        }
    }

    for (int i = 0; i< list2.size(); i++){
        result2.append(list[i] + del);
    }
    return result2;
}

// 分割リストの全要素を異なる区切り文字で再結合する関数
string Split::splitJoin2(string str, const char* del1, const char* del2){
    string result3;

    if (str.find(del1) == std::string::npos){
        cout << "区切り文字が含まれていません" << endl;
        return str;
    }

    vector<string> list = Split::splits(str, del1);

    // リストの要素を区切り文字del2で結合
    const char* delim = del2;
    std::ostringstream os;
    std::copy(list.begin(), list.end(), std::ostream_iterator<string>(os, delim));
    result3 = os.str();

    return result3;
}

// 作業ディレクトリを変更(階層を上げる)
int Split::chCWD(string str, const char* del, int start, int end){
    string new_str = Split::splitJoin(str, del, start, end);

    int rtn = chdir(new_str.c_str());
    return rtn;
}