推荐答案1
在C ++中,您可以根据要实现的目标来以各种方式忽略字符串的空格(Whitespace字符).这是一些常见技术:
- 使用
std::cin
对象:如果您在从标准中读取输入时要忽略空格输入(例如,读取用户输入时忽略空格),可以将std::cin
流与>>
运算符一起使用.默认情况下,>>
操作员跳过领先的空间字符(包括空格,选项卡和新线),并读取直到遇到下一个whitespace contrain.cppcopy code#include <iostream> #include <string> int main() { std::string word; std::cout << "Enter a word: "; std::cin >> word; // Will ignore spaces and read until the first space encountered. std::cout << "You entered: " << word << std::endl; return 0; }
在此示例中,如果您输入" Hello World",它将仅在word
变量中读取" Hello". - 使用
std::getline
要读取完整行:如果要读取整个文本并保留字符串中的空间,则可以使用std::getline
.此功能读取整个行,包括空格,直到遇到一个newline字符('\n'
).cppcopy代码#include <iostream> #include <string> int main() { std::string line; std::cout << "Enter a line of text: "; std::getline(std::cin, line); // Reads the entire line. std::cout << "You entered: " << line << std::endl; return 0; }
在此示例中,如果您输入" Hello世界,"它将读取和存储整个行,包括空格.
如果要从现有字符串中删除空格,则可以使用各种字符串操作技术,例如通过字符串中的字符迭代并删除空格或使用库函数,例如 std::remove_if
从 <algorithm>
header中取出空间.这是使用 std::remove_if
从字符串中删除空格的示例:
- cppCopy code#include <iostream>
- #include <string>
- #include <algorithm>
- int main() {
- std::string str = "Hello World";
- // Use std::remove_if to remove spaces from the string.
- str.erase(std::remove_if(str.begin(), str.end(), ::isspace), str.end());
- std::cout << "String without spaces: " << str << std::endl;
- return 0;
- }
推荐答案2
在新(可能较短)范围的1之后元素的迭代器.然后您需要使用std :: string :: string :: erase()函数从STD :: String
中删除空格
- // #include <algorithm>
- // #include <string>
- std::string s;
- s.erase(std::remove(s.cbegin(), s.cend(), ' '), s.cend());
推荐答案3
取决于"忽略"的含义.如果要打印字符串,则可以检查下一个要打印的字符是否是空间,然后跳过它,不要打印出来.同样,如果要将字符串复制到另一个字符串,则可能要跳过太空字符,等等
您拥有通常通过炭指针访问的传统C样式字符串,在这种情况下忽略空间可以要做类似的事情.
for(char * p = str; * p; ++ p){
//用 *p
}
或,您可以使用数组索引,而不是使用指针.基本上是相同的代码,除了char * p可以用int x so
替换(int x = 0; str [x]; ++ x){跨度>
if(str [x] =='')继续;
//用str [x] 跨度>
}
但是,C ++还具有可以使用迭代器或索引的std :: String.如果使用索引,则类似于上面的索引示例
for(int x = 0; x
if(str [x] =='')继续;
//用str [x] 做某事
}
std :: string string str str str ;
但是,您也可以使用迭代器.
for(std :: string :: string :: iterator it it It = str.begin(); it!= str.end(); ++ it){
if(*it ==''')继续;
//用 *it
}
当然,在上面的示例中,我不仅忽略了_a_空间,而且我忽略了所有空格.如果您实际上意味着忽略一个空间,则必须确定要忽略的空间,从而使条件变得更好以处理此问题.例如,如果仅是第一个空间或前导空间,那么最好让一个循环循环遍历所有初始空间,然后具有处理其余的字符串的第二个循环.如果您想忽略落后空间,只要找到一个空间,就可以从弦的末端开始,然后在找到最后一个非空格角色时向后走,然后在找到该点时前进并停止.确保您还包括最后一个非空间字符.
推荐答案4
如果您的意思是,为什么C ++没有内置的字符串类型,我不能代表Bjarne或其他早期的C ++采用者.
c ++从一开始就有C弦.是的,他们很麻烦.但是我们花了一些时间才能获得std :: string. 1998年是特定的.
一个在线消息来源说,比贾恩说,从C ++开始时没有一些标准字符串是一个错误.
一些旧代码可能已经先于std :: string,并使用了一些替代.甚至在STD :: string之后,无论出于何种原因,都可能选择了其他方法来执行字符串.但是我猜大多数代码都使用std :: string.一些角色.我已经阅读了为什么他们没有将其添加到标准库中的意见.但是,作为专业程序员,我不相信努力解释为什么缺少非常常用的字符串功能.
为什么我必须重新发明轮子?跨度>
长话短说,C ++具有字符串类型.是std :: string.这不是内置类型.这并不意味着它没有一个.
推荐答案5
- bool has_space =
- std::any_of(
- str.begin(),
- str.end(),
- [] (auto &&ch) {
- return std::isspace(ch, std::locale{});
- }
- );
将使用默认的语言环境.如果要从环境中使用该语言环境,请将空字符串作为 std::locale
的构造函数的参数对于任何类型的 std::basic_string<>
不管字符类型如何(在理性内;请参见注释).单个参数 std::isspace()
仅适用于ASCII.