重建字符串去除标点符号的问题

时间:2011-03-21 15:26:48

标签: c++

我正在尝试编写一个程序来从字符串中去除标点符号。程序的输入应该是一串字符,包括标点符号;输出应该是一个删除标点符号的字符串。我正在使用Visual Studio 2008来编译和运行该程序。执行它时,我遇到异常:“Debug Assertion Failed,Expression:string subscript out of range。”

什么 我在这里做错了吗?

int main()
{    
    string input;
    string output;

    getline(cin, input);

    string::size_type i = 0;
    for (string::size_type ix = 0; ix != input.size(); ++ix)
    {

        if (!ispunct(input[ix]))
        {
            output[i] = input[ix];
            ++i;
        }

    }


    cout << output << endl;

    return 0;
}

4 个答案:

答案 0 :(得分:4)

您没有为output变量设置有意义的大小,因此您正在访问不存在的元素。您需要output.push_back(input[ix]);

答案 1 :(得分:2)

您从未为输出string分配任何空间。实际上,你告诉它写入未定义的内存位置,导致断言。

我无法判断您是要完全删除标点符号还是仅将其更改为空格,但假设您要将其完全删除,请在if支票中使用:

output.push_back(input[ix]);

答案 2 :(得分:2)

尝试标准算法:

#include <string>
#include <iostream>
#include <cctype>
#include <functional>

int main()
{
    std::string input;
    std::string output;

    std::getline(std::cin, input);

    // This method copies items from the input container to the output container.
    // Unless the predicate is true (for the character being tested.
    // http://www.sgi.com/tech/stl/remove_copy_if.html
    std::remove_copy_if(input.begin(), input.end(),            // Input container
                        std::back_inserter(output),            // Output (note the back inserter)
                        std::ptr_fun<int, int>(&std::ispunct)  // a function that tests for punct.
                       );

    std::cout << output << "\n";
}

与原始代码(不为输出分配空间)不同,它使用std :: back_inserter迭代器将push_back()新元素放入输出容器中(从而自动生成所需的空间)。

答案 3 :(得分:1)

使用此:

output += input[ix];

output为空 - output[i]正在尝试访问外部输出的边界。如果您尝试访问越界,std::string将不会自动调整大小。