我试图通过这种愚蠢的方法从字符串中删除既不是数字也不是字母的字符,因为我没有得到其他方法(我是一个真正的初学者“只是尝试”)
我知道这种方式不对,但我的问题是它有什么问题,错误是什么,因为它不起作用:S
string g = "9-=p98u;iu8y76";
string y;
int t = 0;
for (int i = 0; i < g.length(); i++)
{
if (isdigit(g[i]) || isalpha(g[i]))
{
y[t++] = g[i];
}
else
continue;
}
g = y;
cout << g;
最佳答案
问题是 y
的大小为 0,它是空的。因此,访问其元素(使用 y[t++]
)到达字符串“之后”——这是缓冲区溢出和未定义行为。
您需要扩展y
。要以对代码进行最少的更改来做到这一点,您可以这样做:
string g = "9-=p98u;iu8y76";
string y;
for (int i = 0; i < g.length(); i++)
{
if (isdigit(g[i]) || isalpha(g[i]))
{
y.push_back(g[i]);
}
else
continue;
}
g = y;
cout << g;
当然,还有其他方法可以做到这一点。使用标准算法和 erase-remove 习惯用法会更符合 C++ 的习惯。整个代码可以替换为:
auto shouldBeRemoved = [](char c) { !(isdigit(c) || isalpha(c)) };
g.erase(std::remove_if(g.begin(), g.end(), shouldBeRemoved), g.end());
cout << g;
std::remove_if
通过重新组织范围来工作,以便在所有要保留的元素之后移动与谓词匹配的所有元素(即应该删除的元素)。成员函数 erase
然后删除所有移到后面的那些。
关于c++ - 从字符串中删除一些字符并复制它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28899556/