我想检查一个20个字符的字符串对象是否只有空字符(值为零)。我的尝试:
string subString;
subString = fileBuffer.substr(origin, origin+20);
if(strCompare.compare("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") == 0)
cout<<"string is empty"<<endl;
else
cout<<"string is not empty"<<endl;
我确定subString被赋予20个null的字符,但是,程序只输出“string is not empty”。我也试过其他方法,例如将compare参数设为“”或NULL无效。有人可以向我指出任何明显的错误或正确的方法吗?我真的很感激。
答案 0 :(得分:6)
这个问题:
if(strCompare.compare("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
是从C风格的字符串构造的字符串将为空。您需要显式构造一个字符串,提供大小。一种方式:
if( strCompare.compare(
std::string( "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20 ) == 0 )
或稍短:
if( strCompare.compare(
std::string( 20, 0 ) == 0 )
答案 1 :(得分:3)
尝试find_first_not_of:
if (subString.find_first_not_of('\0') == string::npos)
{
cout << "Empty" << endl;
}
else
{
cout << "Not empty" << endl;
}
答案 2 :(得分:2)
你提出的问题很奇怪。 “我想检查一个20个字符的字符串对象是否只有空字符(值为零)。” 30个字符的字符串怎么样? 5个字符?你还需要检查它们吗?如果你这样做,那么30个零的字符串怎么样,输出“字符串是否为空”?您的代码表达的意图似乎表明不应将30个零的字符串视为“空”。但那有点奇怪。我希望所有的零字符串都被视为“空”(即使全零字符串不是真的空),无论长度如何。
无论如何,如果你想只检测由零组成的所有字符串,那么正确使用的是find_first_not_of
方法(已经建议)
if (subString.find_first_not_of('\0') == subString::npos)
cout << "string is empty" << endl;
else
cout << "string is not empty" << endl;
虽然如果您的意图是在解释为C字符串时检测空字符串,但您唯一需要检查的是第一个字符。
答案 3 :(得分:1)
首先,当你编写“string”时,它实际上并不是C / C ++意义上的字符串。字符串是一组带有'\ 0'结尾的字符。正常的字符串比较操作在这里没有帮助,因为它们在看到第一个'\ 0'时停止。因此,您应该说您要测试“缓冲区”是否全部为空。此外,std::string
可以优化您插入的字符串(如果它只有空字符),并存储零大小的字符串。但是,您可以使用memcmp
之类的内容来实现此目的:
char buffer[20];
infile.read(buffer, 20);
if (!memcmp(buffer, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20)
{
// it is empty
}
存在其他方法,但考虑到C字符串的定义。
答案 4 :(得分:0)
尝试memcmp