如何检查字符串是否包含空格/制表符/换行符(任何空白内容)?
How to check if a string contains spaces/tabs/new lines (anything that's blank)?
我知道有一个"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.
希望有帮助如果您有任何问题,请告诉我
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- GStreamer在开始任何播放之前进行搜索
- 如何检查字符串是否包含空格/制表符/换行符(任何空白内容)?