如何检查字符串是否包含空格/制表符/换行符(任何空白内容)?

How to check if a string contains spaces/tabs/new lines (anything that's blank)?

本文关键字:制表符 任何 换行符 空白 包含 何检查 检查 字符串 是否 空格      更新时间:2023-10-16

我知道有一个"isspace"函数可以检查空格,但这需要我迭代字符串中的每个字符,这可能会影响性能,因为这会被调用很多。有没有一种快速的方法可以检查std::字符串是否只包含空格?

例如:

function("       ") // returns true
function("    4  ") // returns false

我想到的一个解决方案是使用regex,然后我就会知道,如果它是false,它只包含空白。。。但我不确定这是否会比isspace函数更有效。

regex: [wW] //checks for any word character(a,b,c..) and non-word character([,],..)

提前感谢!

使用常规字符串,您能做的最好的事情是:

return string::find_first_not_of("tn ") == string::npos;

在最坏的情况下,这将是O(n),但在不了解字符串的其他情况下,它将是你能做的最好的。

任何方法都必须查看字符串的每个字符。对每个字符调用isspace()的循环非常有效。如果isspace()是由编译器内联的,那么这将是非常接近最优的。

当然,循环应该在看到非空格字符后立即中止。

您假设regex不会迭代字符串。Regex可能比线性搜索重得多,因为它可能会构建FSM并在此基础上遍历。

您可以进一步加快速度并使其成为一个近乎恒定的时间操作的唯一方法是,通过迭代对字符串的每次更新,缓存一个跟踪是否存在类似空格的字符的bool/bit,如果此后没有进行任何更改,则返回该值,并在对该字符串执行写操作时更新该位,来分摊成本。但是,为了提高自定义has_space()的速度,这会牺牲/降低修改操作的速度。

值得一提的是,区域设置有一个函数(scan_is)可以执行以下操作:

#include <locale>
#include <iostream>
#include <iomanip>
int main() {
    std::string inputs[] = { 
        "all lower",
        "including a space"
    };
    std::locale loc(std::locale::classic());
    std::ctype_base::mask m = std::ctype_base::space;
    for (int i=0; i<2; i++) {
        char const *pos;
        char const *b = &*inputs[i].begin();
        char const *e = &*inputs[i].end();
        std::cout << "Input: " << std::setw(20) << inputs[i] << ":t";
        if ((pos=std::use_facet<std::ctype<char> >(loc).scan_is(m, b, e)) == e)
            std::cout << "No space charactern";
        else
            std::cout << "First space character at position " << pos - b << "n";
    }
    return 0;
}

与在循环中使用isspace(或使用std::find_if)相比,这是否提供了很多(如果有的话)真正的优势,这可能是一个悬而未决的问题。

如果所有字符都在给定列表中,也可以使用find_first_not_of。这样就可以避免循环。

以下是的示例

#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string str1="      ";
    string str2="      u    ";
    bool ContainsNotBlank1=(str1.find_first_not_of("tn ")==string::npos);
    bool ContainsNotBlank2=(str2.find_first_not_of("tn ")==string::npos);
    bool ContainsNotBlank3=(str2.find_first_not_of("tn u")==string::npos);
    cout << ContainsNotBlank1 <<endl;
    cout << ContainsNotBlank2 <<endl;
    cout << ContainsNotBlank3 <<endl;
    return 0;
}

输出:1:因为只有空格和制表符0:因为u不在列表"\t\t"中1:因为str2包含空格、制表符和一个u.

希望有帮助如果您有任何问题,请告诉我