我正在尝试编写一个程序来从字符串中去除标点符号。程序的输入应该是一串字符,包括标点符号;输出应该是一个删除标点符号的字符串。我正在使用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;
}
答案 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
将不会自动调整大小。