我开始尝试编写一个函数,该函数将从字符串中删除空格,但是现在,我已经研究了许多其他人针对该问题的解决方案,我只是想确切地了解代码中出了什么问题/为什么最后的std::cout << t << std::endl;
没有输出任何内容。
当我在循环中包含std::cout << t[count];
(下面注释掉的语句)时,它将正确输出到控制台:hereissometext
,不带空格。当我最后有std::cout << t[0] << std::endl;
时,它将正确输出h
,t[1]
作为e
,t[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
行为的评论,这可能值得考虑。