Strcasecmp.无法解决的错误消息

strcasecmp. unsolvable error message

本文关键字:错误 消息 解决 Strcasecmp      更新时间:2023-10-16
#include <strings.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
    string s = "test";
    if(strcasecmp(s, "TEST"))
        cout << "equals"<< endl;
    return 0;
}

关于如何使用strcasecmp所需的帮助,当我尝试编译时,编译器保留显示错误消息

错误:无法将'std :: string {aka std :: basic_string}'转换为" const char*",for参数'1'转换为'int strcasecmp(const char*,cont char*,const char*(

strcasecmp采用const char*,而不是std::string作为参数。改用strcasecmp(s.c_str(), "TEST"),或者首先让s成为C风格的字符串。

strcasecmp()函数期望指向零端的char字符串,您无法将std::string直接传递给它。

正确使用此操作的方法应该是:

strcasecmp(s.c_str(), "TEST")

此外,该代码在程序中看起来不正确,因为strcasecmp()在字符串相等的情况下返回零。因此,您应该使用以下内容:

if(strcasecmp(s, "TEST") == 0)
    cout << "equals"<< endl;

这意味着strcasecmp期望C样式字符串(0终止char[](而不是C string。您可以使用s.c_str()

您可以尝试

strcasecmp(s.c_str(), "TEST")

strcasecmp()功能未在C国际标准中指定。但是,strcasecmp() posix.1-2001 4.4BSD 规格的一部分。

在cygwin下,您甚至需要附加线

#include <strings.h>

使此功能在您自己的代码中可用。

要保持您的代码便携式,我会放弃此功能并自己重建其功能:

int StringCaseCompare (const std::string& s1, const std::string& s2)
{
  if ( &s1 == &s2 )
    return 0;
  auto iter1 = s1.cbegin();
  auto iter2 = s2.cbegin();
  
  while ( iter1 != s1.cend() )
  {
    if ( iter2 != s2.cend() )
    {
      int cmp = int(std::tolower(*iter1)) - int(std::tolower(*iter2));
      if ( cmp != 0 )
        return cmp;
      ++iter2;
    }
    else
      return int(std::tolower(*iter1));
    ++iter1;
  }
  return -int(std::tolower(*iter2));
}