无法使用'erase'函数从c ++字符串中擦除数字

时间:2019-08-05 18:44:58

标签: c++ string

使用c ++ 14。 我正在提示用户输入包含字母和整数的字符串,并尝试通过string.erase()函数从字符串本身“剥离”整数。

我面临的问题是,当有2个或更多的序号时,该函数似乎先删除了前一个,但删除了后一个。

示例:

   input: H23ey Th2e3re St01ack O34verflow
   output: H3ey There St1ack O4verflow

我可以通过使用新字符串,遍历现有字符串并仅添加isalpha或isspace来另一种方式,但这似乎更麻烦。

代码:

string digalpha {};
cout << "Enter string containing both numbers and letters: ";
getline(cin, digalpha);


for (size_t i {}; i < digalpha.size(); i++)
    if (isdigit(digalpha.at(i)))
        digalpha.erase(i,1);


cout << digalpha << endl;

cout << endl;
return 0;

2 个答案:

答案 0 :(得分:1)

在您写的第一句话中,您使用的是C ++ 14。

在“更现代的” C ++中,建议使用算法。因此,通常您不会使用C-Style For循环。

随处可见的标准方法是erasestd::remove_it的组合。您将在许多示例中找到此构造。

请考虑使用这种解决方案,而不是for循环。

您甚至可以使用std::copy_if将输出包含在算法中。

请参阅:

#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    std::string test1{ "H23ey Th2e3re St01ack O34verflow" };
    std::string test2{ test1 };

    // C++ standard solution for erasing stuff from a container
    test1.erase(std::remove_if(test1.begin(), test1.end(), ::isdigit), test1.end());
    std::cout << test1 << "\n\n";

    // All in one alternative
    std::copy_if(test2.begin(), test2.end(), std::ostream_iterator<char>(std::cout), [](const char c) { return 0 == std::isdigit(c); });

    return 0;
}

答案 1 :(得分:0)

如果两个数字彼此相邻,则会跳过第二个数字。发生这种情况是因为即使一切都转移了,索引i仍在上升:

for (size_t i {}; i < digalpha.size(); i++)
    if (isdigit(digalpha.at(i)))
        digalpha.erase(i,1); //Here, i goes up anyway, skipping character after digit

要解决此问题,我们只需要在擦除数字后使i变粗:

for (size_t i {}; i < digalpha.size(); i++) {
    if (isdigit(digalpha.at(i))) {
        digalpha.erase(i,1);
        i--;
    }
}