如何删除字符串向量中的字符?

时间:2015-12-22 23:27:22

标签: c++ c++11

我正在编写一个代码,我在其中读取字幕文件并删除()中的文本,包括括号本身,即在()中有背景噪音的听力受损的字幕。

例子:
13个
00:01:08,535 - > 00:01:10,127 //删除此
(PIANO PLAYING) //删除此

125
00:07:09,162 - > 00:07:12393个
同时:(用收音机唱歌)教 //仅删除括号中的文字,包括()
他们很好,让他们一路领先

代码在这里:

#include<iostream>
#include<fstream>
#include<string>
#include<vector>

using namespace std;

void subRem();

int main() {

    subRem();

    system("PAUSE");
}

void subRem() {

    ofstream out;
    ifstream in;

    out.open("whip it2.srt");
    if (out.fail()) {
        perror("whip it2.srt");
    }

    in.open("whip it.srt");
    if (out.fail()) {
        perror("whip it.srt");
    }

    vector<string> input;
    string inc;

    while (getline(in, inc)) {
        input.push_back(inc);
    }
    vector<int> len;
    for (int i = 0; i < input.size(); i++) {
        len.push_back(input[i].size());
    }

    for (int i = 0; i < input.size(); i++) {
        for (int j = 0; j < len[i]; j++) {
            if (input[i][j] == '(') {
                for (int k = j; k < len[i]; k++) {
                    j = k;
                    if (input[i][k] == ')') {
                        if (k == (len[i] - 1)) {
                            input[i - 1] = "";
                        }
                        input[i][k] = '\0';
                        break;
                    }
                    input[i][k] = '\0';
                }
            }
        }
    }

    for (int k = 0; k < input.size(); k++) {
        out << input[k] << endl;
    }
}

我想删除括号中的字符,所以我正在使用:

input[i][k] = '\0';

问题是字符被删除但是它们被空格替换,例如:

与她一起 (SHOUTING)?

我明白了:

___________和她在一起?

(____是空格,因为我无法让它们出现)

有白色空间。如果它是字符串,我可以这样做:

input[i][k] = "";

但是当我这样做时,我会收到错误:

input[i][k] = '';
  

引用字符串应包含至少一个字符

我计划通过重命名行号并删除额外的换行符来进一步改进代码,但我想创建一个应用程序,我可以拖放字幕文件并单击运行,以获取修改后的字幕文件。创建GUI需要了解什么?我是否需要学习Qt或其他一些图书馆?

4 个答案:

答案 0 :(得分:3)

std:;string可以包含\0没有问题,它不是std::string中的字符串结尾字符。 MikeCAT的建议是正确的答案:使用std::string::erase

(请不要一次提出多个问题,但是Qt是创建GUI的合理方法)

答案 1 :(得分:0)

尝试使用substr。此方法为您提供两个给定位置之间的子字符串。虽然这解决了第二个问题的问题,但在第一个案例中它会为字符串留下空字幕。我建议检查一个空结果并删除字符串。

答案 2 :(得分:0)

由于您基本上是将字符从一个文件复制到另一个文件,因此我只是在您复制时跟踪您是否在副标题中,如果是,则不要复制字符,直到再次遇到一个紧密的括号。

#include <string>
#include <iostream>
#include <sstream>

int main() {
    std::istringstream in{
R"(13
00:01:08,535 --> 00:01:10,127
(PIANO PLAYING)

125
00:07:09,162 --> 00:07:12,393
BOTH: (SINGING WITH RADIO) Teach
them well and let them lead the way)"   
};

    bool in_subtitle = false;

    std::string temp;
    while (std::getline(in, temp)) {
        unsigned line_len = 0;
        for (char ch : temp) {
            switch (ch) {
            case '(': in_subtitle = true; break;
            case ')': in_subtitle = false; break;
            default: 
                if (!in_subtitle) {
                    std::cout << ch;
                    ++line_len;
                }
                break;
            }
        }
        if (line_len != 0) std::cout << "\n";
    }
}

答案 3 :(得分:0)

#include <iostream>
#include <regex>

int main() {

    std::string text("this text (remove this) and (remove this) end.");

    // First Method: with regular expression
    std::regex expr("\\(.*?\\)");
    std::cout << std::regex_replace (text, expr, "");

    // Second Method: with stl
    auto begin = text.find_first_of("(");
    auto end = text.find_last_of(")") + 1;
    if (std::string::npos != begin && std::string::npos != end && begin <= end)
        text.erase(begin, end-begin);

    // Optional
    std::cout << text << std::endl;

}