我正在尝试从C ++中的std :: string中删除所有标点字符。我目前的代码:
string str_in;
string::size_type i, j;
cout << "please input string with punctuation character..." << endl;
cin >> str_in;
for (i = 0, j = 0; i != str_in.size(); ++i)
if (!ispunct(str_in[i]))
str_in[j++] = str_in[i];
str_in[j] = '\0';
cout << str_in << endl;
str_in[j] = '\0';
错了吗?
答案 0 :(得分:4)
如果您要将str_in
截断为前j
个字符,可以说str_in.resize(j)
。
如果您想使用标准库,可以像这样应用erase-remove
成语:
#include <algorithm>
#include <iostream>
#include <string>
int main()
{
std::string str_in;
std::getline(std::cin, str_in);
// Here is where the magic happens...
str_in.erase(std::remove_if(str_in.begin(), str_in.end(), ::ispunct), str_in.end());
std::cout << str_in << '\n';
return 0;
}
答案 1 :(得分:1)
C ++字符串类型未实现为空终止(尽管c_str()
调用将为您提供空终止字符串。)
所以是的,str_in[j] = '\0'
错误至少有两个原因:
str_in.length()
不会反映删除标点符号时所需字符串的大小。cout << str_in;
使用std::string
类,您可能不应该使用相同的缓冲区,但可能会使用str_out
缓冲区,而在复制所有需要的内容后,它将具有正确的长度(即排除标点符号) ,或者你应该调整str_in
的长度而不是添加空值。
答案 2 :(得分:0)
当字符串没有任何标点符号时,我认为str_in[j] = '\0'
是错误的。
答案 3 :(得分:0)
不是修改相同的字符串,而是创建一个新字符串(例如str_out
)并附加到该字符串:
str_out += str_in[i];