如何在C++中忽略字符串中的空格?

推荐答案1

在C ++中,您可以根据要实现的目标来以各种方式忽略字符串的空格(Whitespace字符).这是一些常见技术:

  1. 使用 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".
  2. 使用 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 从字符串中删除空格的示例:

  1. cppCopy code#include <iostream> 
  2. #include <string> 
  3. #include <algorithm> 
  4.  
  5. int main() { 
  6. std::string str = "Hello World"; 
  7.  
  8. // Use std::remove_if to remove spaces from the string. 
  9. str.erase(std::remove_if(str.begin(), str.end(), ::isspace), str.end()); 
  10.  
  11. std::cout << "String without spaces: " << str << std::endl; 
  12. return 0; 
  13. } 

此代码将输出"无空格的字符串:helloworld"从原始字符串中删除空格后.

推荐答案2

在新(可能较短)范围的1之后元素的迭代器.

然后您需要使用std :: string :: string :: erase()函数从STD :: String

  1. // #include <algorithm> 
  2. // #include <string> 
  3. std::string s; 
  4. s.erase(std::remove(s.cbegin(), s.cend(), ' '), s.cend()); 
中删除空格

推荐答案3

取决于"忽略"的含义.如果要打印字符串,则可以检查下一个要打印的字符是否是空间,然后跳过它,不要打印出来.同样,如果要将字符串复制到另一个字符串,则可能要跳过太空字符,等等

它也很大程度上取决于您如何与字符串和什么一起工作卑鄙的"字符串". C ++有几件事都可以被视为"字符串".

您拥有通常通过炭指针访问的传统C样式字符串,在这种情况下忽略空间可以要做类似的事情.

for(char * p = str; * p; ++ 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

  1. bool has_space =  
  2. std::any_of( 
  3. str.begin(), 
  4. str.end(), 
  5. [] (auto &&ch) { 
  6. return std::isspace(ch, std::locale{}); 
  7. } 
  8. ); 

将使用默认的语言环境.如果要从环境中使用该语言环境,请将空字符串作为 std::locale 的构造函数的参数对于任何类型的 std::basic_string<> 不管字符类型如何(在理性内;请参见注释).单个参数 std::isspace() 仅适用于ASCII.