代码之家  ›  专栏  ›  技术社区  ›  Jason R. Mick

C++中字符字符串与STD::字符串的比较

  •  5
  • Jason R. Mick  · 技术社区  · 14 年前

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

    考虑到这一点,我认为最简单的方法是寻址字符并将其传递给std::string的compare函数。然而,这给了我意想不到的结果。

    我的代码如下:

    #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;
    }
    

    给我…

    STRING : b
    CHAR : a
    NOPE...
    STRING : b
    CHAR : b
    NOPE...
    STRING : bob
    STRING 2 : bob
    WOW!
    

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

    (对 避免重新分类 关于我的问题……请随意跳过)
    当我说“最短”时,我的意思是出于对编码口才的渴望。请注意,这不是家庭作业问题。我是一个化学工程博士候选人,正在编码作为独立研究的一部分。我最后的一个问题被用户重新分类为“家庭作业” msw 当我问起效率时(他也说了一句卑鄙的话),我考虑到了滥用的边界。我的代码可能被别人重用,也可能不被别人重用,但我正在努力使它易于阅读和维护。我还有一个奇怪的愿望,那就是在可能的情况下尽可能提高代码的效率。因此,关于效率和口才的问题。

    5 回复  |  直到 14 年前
        1
  •  14
  •   Colen    14 年前

    这样做:

      if (my_string.substr(0,1).compare(&my_char2)==0)
    

    不会起作用,因为你在“欺骗”字符串,让它认为它得到一个指向以空结尾的C字符串的指针。这会产生奇怪的效果,包括破坏你的程序。相反,只需使用普通等同性将字符串的第一个字符与我的字符进行比较:

     if (my_string[0] == my_char)
       // do stuff
    
        2
  •  4
  •   Ferruccio    14 年前

    为什么不在字符串上使用索引运算符呢?它将返回char类型。

    if (my_string[0] == my_char1)
    
        3
  •  3
  •   Leonid    14 年前

    可以使用字符串的运算符[]将其与单个字符进行比较

    // string::operator[]
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main ()
    {
        string str ("Test string");
        int i; char c = 't';
        for (i=0; i < str.length(); i++)
        {
            if (c == str[i]) {
                std::cout << "Equal at position i = " << i << std::endl;
            }
        }
        return 0;
    }
    
        4
  •  1
  •   Steve Townsend    14 年前

    要比较的前两个调用的行为完全取决于每个字符地址后面的随机内存内容。你在呼唤 basic_string::compare(const char*) 这里的参数被假定为C字符串(以空结尾),而不是单个字符。compare()调用将比较所需的char,随后是内存中该char之后的所有内容,直到下一个0x00字节,并将std::string放在手边。

    o对于char输入,<<运算符确实有适当的重载,因此您的输出不会反映您在这里实际比较的内容。

    将的decls和b转换为 const char[] a = "a"; 你会得到你想要的。

        5
  •  1
  •   Tony    14 年前

    非常标准,C++中的字符串为null结尾;字符不是。因此,通过使用标准比较方法,您可以真正检查“b\0”==“b”。

    我用这个得到了期望的输出:

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

    这意味着从子字符串的位置0开始,使用长度1,并将其与长度为1的字符引用进行比较。 Reference