【问题标题】:C++ check if string is space or nullC++ 检查字符串是空格还是空
【发布时间】:2011-06-12 23:45:08
【问题描述】:

基本上,我在文件的某些行中有空白字符串" " 或空白块或"" 为空,我想知道C++ 中是否有一个函数可以检查这一点。

*note:* 作为一个附带问题,在 C++ 中,如果我想分解一个字符串并检查它的模式,我应该使用哪个库?如果我想自己编写代码,我应该知道哪些基本函数来操作字符串?有没有好的参考资料?

【问题讨论】:

  • 目前发布的许多答案似乎都缺少“或空白块”条款。我认为这个想法是找到仅包含零个或更多空格的行,其中“或更多”可能大于 1。
  • @SC:这部分问题是在大多数答案之后添加的(不必要的,IMO)澄清。 “字符串”已经是一个字符序列,不仅限于一个字符。但是,嘿,我试图提供一个解释这一点的答案,并被 Alf 抨击假设输入是 ASCII(这是一个比他所做的更合理的假设,IMO)。所以我的答案将永远处于低谷。没关系,我不需要代理。我把它留在那里,以防马克欣赏一个真正有效的答案。
  • @Ben:对不起,我没有试图“抨击”你。只是很多新手编写了对isspace 和家人的不正确简单调用。所以我认为在任何出现的地方纠正简单化的调用是非常重要的,这样阅读它的人就可以学习如何正确调用这些函数(以及不直接调用它们的危险是什么)。
  • @Alf:我立即承认你对传递负值和相关问题的可能性是正确的。大多数新手可能会受益于被告知 isspace 不能保证在扩展字符上按他们期望的方式工作。

标签: c++ string


【解决方案1】:
bool isWhitespace(std::string s){
    for(int index = 0; index < s.length(); index++){
        if(!std::isspace(s[index]))
            return false;
    }
    return true;
}

【讨论】:

    【解决方案2】:
    std::string str = ...;
    if (str.empty() || str == " ") {
        // It's empty or a single space.
    }
    

    【讨论】:

    • 不考虑多个空格
    【解决方案3】:
     std::string mystr = "hello";
    
     if(mystr == " " || mystr == "")
       //do something
    

    在分解字符串时,std::stringstream 会很有帮助。

    【讨论】:

      【解决方案4】:

      “文件的某些行中”没有空字符串。

      但是你可以有一个空字符串,即一个空行。

      您可以使用例如std::string.length,或者如果你更喜欢 C,strlen 函数。

      为了检查空格,isspace 函数很方便,但请注意,对于 char 字符,参数应强制转换为 unsigned char,例如,即开即用,

      bool isSpace( char c )
      {
          typedef unsigned char UChar;
          return bool( ::isspace( UChar( c ) ) );
      }
      

      干杯,

      【讨论】:

      • 这根本不处理字符串,不要介意“空白字符串(字符)”具有任意长度(空白不可数)。对于非 ASCII 字符串,盲目地转换为 unsigned char 通常是错误的。
      • @Ben:肯定的,您已经正确理解该函数不处理字符串。它处理char。你没有理解演员表的目的。通过“盲目铸造”的假设来填补这一空白并不是一个好主意。通常,这种强制转换对于避免未定义行为是必要的。它举例说明了如何正确使用此功能和系列。干杯&hth.,
      • @Alf:你用可能错误的行为替换了未定义的行为。例如如今,大多数非 ASCII 字符都以 UTF-8 表示,如果您传递一个 UTF-8 前导字节,::isspace 会做错事。
      • @Ben:您的论点如果正确,将适用于 C++ 标准库的大多数字符处理...... :-( 处理 UTF-8 和其他可变长度编码要困难得多,因为标准库有一个固定大小的假设。上面的函数是最有效和最通用的函数。因此,它可以用你想要的任何条件包装,但以效率为代价。反过来,产生高效和最通用的函数从一个有限的功能,一般不可能。本质上,一旦你在底部添加它,你就无法摆脱低效率。
      • @Alf: AFAICT,所有的 C++ 标准库字符处理只针对基本字符集指定,这意味着当前所有平台上的 ASCII。 OEM 字符 > 0x7f 的处理完全由实现定义且不可移植。 C++ 甚至没有指定一个字符的有效值的范围是什么,(除了它绝对是 0-127 的严格超集)
      【解决方案5】:

      由于您没有指定字符的解释 > 0x7f,我假设是 ASCII(即字符串中没有高位字符)。

      #include <string>
      #include <cctype>
      
      // Returns false if the string contains any non-whitespace characters
      // Returns false if the string contains any non-ASCII characters
      bool is_only_ascii_whitespace( const std::string& str )
      {
          auto it = str.begin();
          do {
              if (it == str.end()) return true;
          } while (*it >= 0 && *it <= 0x7f && std::isspace(*(it++)));
                   // one of these conditions will be optimized away by the compiler,
                   // which one depends on whether char is signed or not
          return false;
      }
      

      【讨论】:

      • -1 通常不正确地调用std::isspace。参数需要转换为unsigned char(或等效表达式)。请修复。
      • @Alf:转换为unsigned char 也不正确。当你开始支持非 ASCII 字符时,你需要知道一种编码,开始考虑多字节字符等等。
      • @Alf:我修复了它永远不会将负数传递给std::isspace。你觉得还有问题吗?
      • @Ben:是的,还有一个问题,即无法将char 的负值识别为空白。也就是说,该函数可能会产生假阴性。只需转换为 unsigned char 即可修复它,对于默认编码(实际参数随后会隐式提升到 int,但总效果与直接转换为 int 不同:您应该转换为unsigned char).
      • @Alf:“如果不是ASCII,则需要考虑多字节字符”的哪一部分不清楚?编写此函数(现在已记录)以在 ASCII 字符串上正常工作。如果输入不是 ASCII,则逻辑将 (1) 依赖于编码并且 (2) 复杂得多。转换为 unsigned char 不是适当的修复方法。
      【解决方案6】:

      如果您想要模式检查,请使用正则表达式。

      【讨论】:

      • ...对于这样一个简单的场景来说,这完全是矫枉过正。这个答案也缺乏任何细节。
      • 他问“如果我想分解一个字符串并检查我应该使用哪个库的模式”
      • 作为“附带问题”。 Stack Overflow 不做“附带问题”。而且“正则表达式”不是库。它是对广泛的正则表达式引擎的广泛描述,由各种库实现。
      猜你喜欢
      • 2017-08-19
      • 2010-12-16
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多