数组字符串中空间检测的 C++ 问题

标签 c++ arrays space

我目前正在编写一个程序,我试图在其中过滤多余的空格,因此如果连续有超过 1 个空格,我将丢弃其余的,只留下一个

但这只是第一步,因为该程序的目的是用 mips 汇编指令解析 txt 文件。

到目前为止,我已经打开文件,将内容存储在一个 vector 中,然后将 vector 内容存储在一个数组中。然后我检查,如果您连续 2 次找到一个字符,则将数组向左移动。

问题是该代码适用于任何其他字母,但空格字符除外。 (在下面的代码中,我用 'D' 字符对其进行了测试并且它有效)

#include <iostream>
#include <cmath>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;

class myFile {
    vector<string> myVector;
public:
    void FileOpening();
    void file_filter();
};

void myFile::FileOpening() {
    string getcontent;
    ifstream openfile;     //creating an object so we can open files

    char filename[50];
    int i = 0;

    cout << "Enter the name of the file you wish to open: ";
    cin.getline(filename, 50);   //whatever name file the user enters, it's going to be stored in filename
    openfile.open(filename);     //opening the file with the object I created

    if (!openfile.is_open())       //if the file is not opened, exit the program
    {
        cout << "File is not opened! Exiting the program.";
        exit(EXIT_FAILURE);
    };

    while (!openfile.eof())             //as long as it's not the end of the file do..
    {
        getline(openfile, getcontent);     //get the whole text line and store it in the getcontent variable

        myVector.push_back(getcontent);
        i++;
    }
}

void myFile::file_filter() {
    unsigned int i = 0, j = 0, flag = 0, NewLineSize, k, r;
    string Arr[myVector.size()];

    for (i = 0; i < myVector.size(); i++) {
        Arr[i] = myVector[i];

    }

    //removing extra spaces,extra line change
    for (i = 0; i < myVector.size(); i++) {
        cout << "LINE SIZE" << myVector[i].size() << endl;
        for (j = 0; j < myVector[i].size(); j++) {

            //If I try with this character for example,
            //it works (Meaning that it successfully discards extra 'Ds' leaving only one.
            // But if I replace it with ' ', it won't work. It gets out of the loop as soon
            //as it detects 2 consecutive spaces.

            if ((Arr[i][j] == 'D') && (Arr[i][j + 1] == 'D')) {
                for (k = j; k < myVector[i].size(); k++) {
                    Arr[i][k] = Arr[i][k + 1];
                    flag = 0;
                    j--;
                }
            }
        }
    }


    for (i = 0; i < myVector.size(); i++) {
        for (j = 0; j < myVector[i].size(); j++) //edw diapernw tin kathe entoli
        {

            cout << Arr[i][j];
        }
    }
}

int main() {
    myFile myfile;

    myfile.FileOpening();
    myfile.file_filter();
}

我的问题是,为什么它适用于除空格之外的所有字符,我该如何解决这个问题? 提前致谢。

最佳答案

哇。多行代码。我只能建议学习更多关于 STL 和算法的知识。

您可以使用 vector “range”-constructor 和 std::istream_iterator 将完整文件读入 vector 。然后您可以使用 std::regex 替换字符串中的一个或多个空格。这真的不复杂。

在下面的示例中,我完成了所有工作,在函数 main 中有 2 行代码。请看:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <string>
#include <fstream>
#include <regex>

using LineBasedTextFile = std::vector<std::string>;

class CompleteLine {    // Proxy for the input Iterator
public:
    // Overload extractor. Read a complete line
    friend std::istream& operator>>(std::istream& is, CompleteLine& cl) { std::getline(is, cl.completeLine); return is; }
    // Cast the type 'CompleteLine' to std::string
    operator std::string() const { return completeLine; }
protected:
    // Temporary to hold the read string
    std::string completeLine{};
};

int main()
{
    // Open the input file
    std::ifstream inputFile("r:\\input.txt");
    if (inputFile)
    {
        // This vector will hold all lines of the file. Read the complete file into the vector through its range constructor
        LineBasedTextFile text{ std::istream_iterator<CompleteLine>(inputFile), std::istream_iterator<CompleteLine>() };
        // Replace all "more-than-one" spaces by one space
        std::for_each(text.begin(), text.end(), [](std::string& s) { s = std::regex_replace(s, std::regex("[\\ ]+"), " "); });

        // For Debug purposes. Print Result to std::out
        std::copy(text.begin(), text.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    return 0;
}

我希望我能给你一些关于如何进行的想法。

关于数组字符串中空间检测的 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52356764/

相关文章:

java - 将数组随机拆分为 2 个均分数组

css - WordPress header 标记不需要的空间

linux - Bash 和变量替换名称中带有空格的文件 : application for gpsbabel

css - 单独 div 中两行图像之间的空间,仅出现在一个特定行上

c++ - 在 C++ 中动态声明指向对象的指针数组

javascript - 搜索对象的嵌套数组

c++ - ShowWindow 无效的窗口句柄

php - 在 Laravel 中混淆数组和对象

c++ - 内存何时分配给预定义的流对象?

c# - 数组内存分配——分页