使用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;
答案 0 :(得分:1)
在您写的第一句话中,您使用的是C ++ 14。
在“更现代的” C ++中,建议使用算法。因此,通常您不会使用C-Style For循环。
随处可见的标准方法是erase
和std::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--;
}
}