3

我正在尝试从 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';错了吗?

4

4 回答 4

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;
}
于 2012-05-28T05:50:20.020 回答
1

C++ 字符串类型未实现为空终止(尽管c_str()调用将为您提供空终止字符串。)

所以是的,str_in[j] = '\0'至少有两个原因是错误的:

  1. str_in.length()不会反映您期望删除标点的字符串的大小。
  2. 空字符是一个额外的宪章,它将被发送到任何输出流,
    例如cout << str_in;

使用std::string该类,您可能不应该覆盖相同的缓冲区,而是可能使用一个str_out缓冲区,它在复制所有想要的(即不包括标点符号)后具有正确的长度,或者您应该调整长度str_in而不是添加空值。

于 2012-05-28T05:47:20.457 回答
0

str_in[j] = '\0'当字符串没有任何标点符号时,我认为是错误的。

于 2012-05-28T05:39:35.920 回答
0

不要修改相同的字符串,而是创建一个新字符串(例如str_out)并附加到该字符串:

str_out += str_in[i];
于 2012-05-28T05:45:10.597 回答