如何在C ++中终止std :: string?

时间:2012-05-28 05:33:24

标签: c++

我正在尝试从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 个答案:

答案 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'错误至少有两个原因:

  1. str_in.length()不会反映删除标点符号时所需字符串的大小。
  2. null charatcter是一个额外的章程,将发送到任何输出流,例如cout << str_in;
  3. 使用std::string类,您可能不应该使用相同的缓冲区,但可能会使用str_out缓冲区,而在复制所有需要的内容后,它将具有正确的长度(即排除标点符号) ,或者你应该调整str_in的长度而不是添加空值。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

str_out += str_in[i];