【发布时间】:2018-11-10 03:46:13
【问题描述】:
我一直在开发一个 C++ 程序来对用户选择的文本文件进行形态学更改,但是在制作这个程序时我遇到了一个问题,即一个不同的函数基本上以相同的方式完成其目的其他功能,不会打印。即使它应该打印。
这是我目前所拥有的:
#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);
}
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]);
string argument3 (argv[3]);
string argument4 (argv[4]);
while(fin)
{
ch = fin.get();
if(ch!='\n') {
temp.push_back(ch);
}
else
{
data.push_back(temp);
temp.clear();
}
}
if (argument2 == "replace") {
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;
}
} else if (argument2 == "dilate") {
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();
}
注意:我如此困惑的原因是因为我在int main 中使用的打印方法适用于替换,但不适用于膨胀。我看不出这两个功能之间存在任何重大差异,因此它们不会被打印。我什至做了一个小测试程序,它在那个程序中工作:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
for (vector<char> &v : vec)
{
replace(v.begin(), v.end(), oldd, neww);
}
}
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);
}
int main(int argc, char* argv[])
{
vector<vector<char>> data(5, std::vector<char>(9,'.'));
data[2][4] = 'x';
dialationn(data, 'x', 'i');
for (int i = 0; i < data.size(); i ++) {
for (int j = 0; j < data[i].size(); j++) {
cout << data[i][j];
}
cout << endl;
}
}
由于这是通过命令行输入完成的,因此替换功能如下:
./a.exe input1.txt replace (OLD LETTER NEEDING TO BE REPLACED) (NEW LETTER REPLACING)
对于膨胀函数:
./a.exe input1.txt dilate (SYMBOL IN FILE TO DILATE)
input1.txt如下:
.........
.........
.........
.........
....X....
.........
.........
.........
.........
【问题讨论】:
-
你应该提到你正在使用的命令行参数。
-
您的两个代码示例之间的主要区别在于,不工作的一个使用命令行参数,而工作的不使用命令行参数。检查您提供给程序的任何参数。
-
注意:input1.txt dialate (SYMBOLE IN FILE TO DIALATE) 看起来很像 3 个参数,这意味着
string argument4 (argv[4]);越界,所有赌注都被取消。 -
我添加了一个虚拟参数
input1.txt dialate X y,程序的行为符合我的预期。 -
@xannax159 声明argument4你需要它的地方...也就是说,在
if (argument2 == "replace")...里面,它会在使用后自动丢弃...因为给一个字符串分配一个空参数将立即中断程序...