在C++中比较字符文字与Std :: String

Jas*_*ick 5 c++ string char literals string-comparison

我想将字符文字与字符串的第一个元素进行比较,以检查文件中的注释.为什么要用炭?我想把它变成一个函数,它接受注释的字符var.我不想允许字符串,因为我想将其限制为单个字符的长度.

考虑到这一点,我认为简单的方法是解决字符并将其传递给std :: string的比较函数.然而,这给了我意想不到的结果.

我的代码如下:

#include <string>
#include <iostream>

int main ( int argc, char *argv[] )
{
  std::string my_string = "bob";
  char my_char1 = 'a';
  char my_char2 = 'b';

  std::cout << "STRING : " << my_string.substr(0,1) << std::endl
        << "CHAR : " << my_char1 << std::endl;
  if (my_string.substr(0,1).compare(&my_char1)==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;

  std::cout << "STRING : " << my_string.substr(0,1) << std::endl
        << "CHAR : " << my_char2 << std::endl;
  if (my_string.substr(0,1).compare(&my_char2)==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;

  std::cout << "STRING : " << my_string << std::endl
        << "STRING 2 : " << "bob" << std::endl;
  if (my_string.compare("bob")==0)
    std::cout << "WOW!" << std::endl;
  else
    std::cout << "NOPE..." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

给我...

STRING : b
CHAR : a
NOPE...
STRING : b
CHAR : b
NOPE...
STRING : bob
STRING 2 : bob
WOW!
Run Code Online (Sandbox Code Playgroud)

为什么函数认为子字符串和字符不一样.正确比较chars和std :: string变量的最短方法是什么?

(一个短暂的咆哮,以避免重新分类我的问题....随意跳过)
当我说最短我的意思是出于对编码口才的渴望.请注意,这不是一个家庭作业问题.我是化学工程博士候选人,正在编写独立研究的一部分.当我询问效率时,我的最后一个问题之一被用户msw重新归类为"家庭作业" ,我在滥用的边界上考虑了效率.我的代码可能会或可能不会被其他人重用,但我试图让它易于阅读和维护.我也有一种奇怪的愿望,即尽可能使我的代码尽可能高效.因此,关于效率和口才的问题.

Col*_*len 14

这样做:

  if (my_string.substr(0,1).compare(&my_char2)==0)
Run Code Online (Sandbox Code Playgroud)

将无法正常工作,因为你"欺骗"了字符串,认为它正在获取一个指向以null结尾的C字符串的指针.这将产生奇怪的效果,包括崩溃你的程序.相反,只需使用正常的相等性来比较字符串的第一个字符和my_char:

 if (my_string[0] == my_char)
   // do stuff
Run Code Online (Sandbox Code Playgroud)

  • 在尝试访问`my_string [0]`之前,不要忘记检查`0 <my_string.length()`. (5认同)