【问题标题】:Dilation function for char* in c++ not printing as it should bec++ 中 char* 的膨胀函数没有按应有的方式打印
【发布时间】:2018-11-11 05:40:25
【问题描述】:

我用 C++ 编写了一个程序,它接收一个文件和通过命令行应用到它的变形。但是,到目前为止。我的算法正在接受如下文件:

.............
.............
..XXX.....X..
..XXX.....X..
..XXX........
..XXX........
..XXXXXXX....
..XXXXXXX....
..XXXXXXX....
.............
.............

并打印出如下所示的内容:

.............
..X.X.....X..
.XXXXX...XXX.
..XXX.....X..
.XXXXX.......
..XXX.X.X....
.XXXXXXXXX...
..XXXXXXX....
.XXXXXXXXX...
..X.X.X.X....
.............

什么时候应该打印出如下所示的内容:

.............
..XXX.....X..
.XXXXX...XXX.
.XXXXX...XXX.
.XXXXX....X..
.XXXXXXXX....
.XXXXXXXXX...
.XXXXXXXXX...
.XXXXXXXXX...
..XXXXXXX....
.............

我已经让我的程序遍历每个索引并检查它是否是他们想要扩张的项目,然后查看上方、下方、左侧和右侧。将其索引的另一个副本添加到其周围的网格中。但是为什么我的程序会这样打印出来呢?

这是我目前的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
//look up line by line parsing
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
    for (vector<char> &v : vec) // reference to innver vector
    {
        replace(v.begin(), v.end(), oldd, neww); // standard library     algorithm
    }
}
void dialationn(vector<vector<char>> &vec, char suspect, char n)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = n;
                    }
                    if (j > 0) {
                     vec[i][j-1] = n;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = n;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = n;
                    }
                }
            }
        }
        replacee(vec, n, suspect);
}
void erode(vector<vector<char>> &vec, char suspect, char n)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = n;
                    }
                    if (j > 0) {
                     vec[i][j-1] = n;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = n;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = n;
                    }
                }
            }
        }
        replacee(vec, n, suspect);
}
int main(int argc, char* argv[]) {

    fstream fin; char ch;
    string name (argv[1]); //File Name.
    vector<vector<char>> data;
    // 2D Vector.
    vector<char> temp;
    // Temporary vector to be pushed 
    // into vec, since its a vector of vectors.
    fin.open(name.c_str(),ios::in);
    // Assume name as an arbitary file.
    string argument2 (argv[2]);
    while(fin)
    {
        ch = fin.get();
        if(ch!='\n') {
            temp.push_back(ch);
        }
        else 
        { 
            data.push_back(temp); 
            temp.clear(); 
        }
    }
    if (argument2 == "replace") {
            string argument4 (argv[4]);
            string argument3 (argv[3]);
        replacee(data, argument3[0], argument4[0]);
        for (int i = 0; i < data.size(); i ++) {
            for (int j = 0; j < data[i].size(); j++) {
                cout << data[i][j];
            }
            cout << endl;
        }
    }
    if (argument2 == "dialate") {
        string argument3 (argv[3]);
        dialationn(data, argument3[0], 'i');
        for (int m = 0; m < data.size(); m ++) {
            for (int n = 0; n < data[m].size(); n++) {
                cout << data[m][n];
            }
            cout << endl;
        }
    }

    fin.close();
} 

主函数将第一个参数作为文本文件名来解析它。然后,它查看第二个参数以了解用户想要做什么,然后根据参数 2,它调用适当的函数 replaceedialate 来应用变形。在其中一个函数修改了包含文件的 char* 之后,它会将其打印出来。

注意:dialatee 函数将它认为适合的所有字符更改为“i”,然后调用replacee 函数将它们转换回原始输出。这样做是为了防止函数读取已修改的字符并应用无意的变形。

【问题讨论】:

标签: c++ vector char


【解决方案1】:

在解析数据之前,您正在覆盖数据。在将vec 的元素设置为n 之前,请确保它不是suspect

用一个好的调试器单步调试你的代码应该会让你看到这种情况发生。

【讨论】:

  • 我会尝试实现这个解决方案,所以基本上,不要在指针的给定方向上添加 i,而指针方向上的索引 = x。
  • 我试图通过合并if 语句(如if(vec[i][j-1] != suspect) { vec[i][j-1] = n; })的行来实现此解决方案,但它没有工作,相反它使超过 95% 的网格 = 怀疑。跨度>
  • 我可能是有史以来最大的白痴,你看,我的程序应该使用不同排列的多个文件。我一直在测试错误的文件,试图将它与帖子中的文件进行比较。你的答案确实是正确的。我为自己是个白痴而道歉。
【解决方案2】:

当您点击第一个“X”时,您将在其上方、下方、左侧和右侧的空格中写入“i”,替换您尚未阅读的其他“X”。

在您第一次通过后,情况可能如下所示: ............. ..i.i.....i.. .iXiXi...iXi. ..iXi.....i.. .iXiXi....... ..XiX........ .iXiXiXiXi... ..XiXiXiX.... .iXiXiXiXi... ..i.i.i.i.... .............

因此,当您到达已从“X”切换到“i”的位置时,它不匹配,也不会得到相同的处理方式。

一个简单的解决方法是创建一个新向量,每当您在原始向量中找到“X”时,将“i”放在上、下、左、右并直接放在(在新向量中)其中“X”将在您的原始向量中。然后传递新的,因为效率不是您的首要任务。这将避免在读取时覆盖问题。

【讨论】:

  • 您的解释是正确的,我理解为什么它不起作用,但您的解决方案不起作用。而且我同意可以有一个更有效的解决方案,但最终,该计划的效率会达到很高的水平。
  • 反而带回了调用replace函数修复的问题。
  • 我已经修改了我的答案,正如您正确指出的那样,我最初的建议有点偏离。如果这个新建议对您不起作用,请告诉我。
  • 感谢您帮助我了解发生了什么。您的解决方案确实适用于修订版,但在您更改之前,我测试了另一个用户的另一个解决方案,该解决方案已经使用所需的最少代码。我已经测试了您的解决方案,并且确实有效。感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2011-09-23
相关资源
最近更新 更多