我开始尝试编写一个函数,该函数将从字符串中删除空格,但是现在,我已经研究了许多其他人针对该问题的解决方案,我只是想确切地了解代码中出了什么问题/为什么最后的std::cout << t << std::endl;没有输出任何内容。

当我在循环中包含std::cout << t[count];(下面注释掉的语句)时,它将正确输出到控制台:hereissometext,不带空格。当我最后有std::cout << t[0] << std::endl;时,它将正确输出ht[1]作为et[2]作为r,等等。但是,当我尝试在最后输出t时,它输出空格,而t.size()输出0

我是编码的新手,如果这是一个完全明显的问题,请原谅我。

    std::string s = "here is some text";
    std::string t = "";
    int count = 0;

    for (int i = 0; i < s.size(); i++) {
        if (std::isalpha(s[i])) {
            t[count]+=s[i];
            // std::cout << t[count];
            count++;
        }
    }

    std::cout << t << std::endl;

最佳答案

您在循环中有未定义的行为,因为您在使用std::string插入operator[]时未确保其大小正确。您可以改用

t.push_back(s[i]);

这样不仅会插入char,而且还可以确保当内部缓冲区对于新字符串而言太小时(重新)分配内部缓冲区。

还要注意,您实际上并不需要count变量。 std::string始终跟踪其长度,因此t.size()将始终产生当前count的值(当然,一旦修复了UB)。

顺便说一句,复制序列中符合特定条件的部分是一项常见的任务,并且存在一个特定的库模板可以完全做到这一点,并使您摆脱手工制作的循环:
#include <algorithm>

std::copy_if(s.cbegin(), s.cend(), std::back_inserter(t),
     [](char c){ return std::isalpha(c); });

最后,还要注意@MatthieurFoltzer对std::isalpha行为的评论,这可能值得考虑。

07-24 09:45
查看更多