c++ - 从字符串中删除一些字符并复制它

标签 c++ string char

我试图通过这种愚蠢的方法从字符串中删除既不是数字也不是字母的字符,因为我没有得到其他方法(我是一个真正的初学者“只是尝试”)

我知道这种方式不对,但我的问题是它有什么问题,错误是什么,因为它不起作用: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/

相关文章:

C 中使用 char 数组的坐标系

c++ - boost::asio,线程池和线程监控

C++,将结构特征作为参数传递给函数

c++ - 在 C++ 项目中进行 TDD 是否可能/足够高效?

c++ - 如何管理固定数组中的对象?

c++ - 如何从字符串中提取单词并将它们存储在 C++ 中的不同数组中

string - "Yes, Virginia, it had better be unsigned"是什么意思?

c - 是否可以在不再次打印的情况下修改打印的字符串?

c++ - 将字符串复制到 char 数组

c++ - 十进制字符串转char