字符串替换问题

时间:2015-04-24 19:28:00

标签: c++ string

我正在尝试编译的程序出现问题。它是一个字符串替换程序。

它应该用第二替换第一个第一个,每个所有一些替换,然后最后最后倒数第二

编译时,我收到错误"运行时检查失败#0 - ESP的值未在函数调用中正确保存。这通常是调用使用一个调用约定声明的函数的结果,函数指针使用不同的调用约定声明。"

  

ConsoleApplication6.exe中0x7697C42D处的未处理异常:Microsoft C ++异常:内存位置0x0031F6E0处的std :: out_of_range。

然后我收到调试错误CRT detected the application wrote to memory before start of heap buffer.

有没有人知道我做错了什么?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    string data, textOut;

    ifstream dataIn;
    dataIn.open("indata.txt");

    if (dataIn.is_open()) {
        while (dataIn.good()) {
            getline(dataIn, data);
            cout << data << endl;
        }
        textOut = data;
        while (dataIn.is_open()) {
            textOut.replace(textOut.find("first"), 6, "second");
            textOut.replace(textOut.find("all"), 4, "some");
            textOut.replace((textOut.find_last_of("last", 0)), 5,
                            "penultimate");
        }

        dataIn.close();
    } else
        cout << "Unable to open file. Please confirm you have exact file name "
                "and location." << endl;

    ofstream fileOutput;
    fileOutput.open("dataout.txt");
    fileOutput << textOut;
    fileOutput.close();

    system("pause");

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码令人困惑。让我试着弄清楚你在做什么。

while (dataIn.good()) {
    getline(dataIn, data);
    cout << data << endl;
}
textOut = data;

以上代码循环直到发生错误,打印所有文本 变量data将包含最后一个文本行。

然后在下一个循环中继续读取文件的错误状态:

   while (dataIn.is_open()) {
        textOut.replace(textOut.find("first"), 6, "second");
        textOut.replace(textOut.find("all"), 4, "some");
        textOut.replace((textOut.find_last_of("last", 0)), 5,
                        "penultimate");
    }

该文件在关闭之前将保持打开状态,因此这是一个forever循环,因为在循环内没有关闭它的语句。

此外,由于textOutdata的副本,它是文件中的最后一行文本,因此您将替换textOut中的文本,直到文件关闭。

请注意您如何使用循环中的新内容重新初始化textOut变量。

最后,在程序结束时(如果有人关闭文件),您将textOut变量(输入文本的最后一行转换)写入输出文件。

此外,您还要检查打开输入文件的状态,但不要检查打开输出文件的状态。

你想做什么?

编辑1:转换文件中的文本

如果您正在转换或编辑文本文件中的行,请按以下步骤操作:

while (getline(dataIn, data)) // Read until no more data
{
  cout << data << "\n";

  // Transform or edit the "data" text
  std::transform(data.begin(), data.end(), data.begin(), toupper);

  // Write out the data to the output file
  dataOut << data << "\n";
}

设计的主要区别在于处理是一次执行一行。读入,打印,转换一个文本行并将其写入输出文件。读入并处理新的文本行。重复此过程,直到没有更多输入数据。

编辑2:替换数据

我建议您远离LISP语法并一次调用一个函数。这将允许您在将返回值作为参数传递给另一个函数之前检查返回代码并处理它们。

例如,std::string::find函数返回找到的文本的字符串中的位置,**或std :: string :: npos如果找不到搜索文本**。

因此,让我们首先找到文本并在替换前验证它是否存在:

std::string::size_type position = 0;
position = textOut.find("first");
if (position != std::string::npos)
{
  // The text "first" was found, now replace it.
}

使用有关std::string::replace的信息,我们会使用&#34;位置,长度&#34;变化

std::string::size_type position = 0;
const std::string key_text("first");
position = textOut.find(key_text);
if (position != std::string::npos)
{
  // The text "first" was found, now replace it.
  std::string::size_type length_of_key_text(key_text.length());
  textOut.replace(position, length_of_key_text, "second");
}