检查字符串对象是否只有空字符

时间:2010-01-29 21:34:51

标签: c++

我想检查一个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无效。有人可以向我指出任何明显的错误或正确的方法吗?我真的很感激。

5 个答案:

答案 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