繁体   English   中英

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

[英]Comparing Character Literal to Std::String in C++

我想将字符文字与字符串的第一个元素进行比较,以检查文件中的注释。 为什么要用炭? 我想把它变成一个函数,它接受注释的字符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;
}

给我...

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

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

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

这样做:

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

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

 if (my_string[0] == my_char)
   // do stuff

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

if (my_string[0] == my_char1)

您可以使用string的运算符[]将其与单个char进行比较

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

前两个比较调用的行为完全取决于随机存储器内容跟随每个char的地址。 您正在调用basic_string::compare(const char*)并且此处的param假定为C-String(以null结尾),而不是单个char。 compare()调用将比较你想要的char,然后是char之后的内存中的所有内容,直到下一个0x00字节,手中有std :: string。

Otoh <<运算符确实有一个适当的char输入重载,所以你的输出不能反映你在这里实际比较的内容。

将dec和of b转换为const char[] a = "a"; 你会得到你想要发生的事情。

很标准,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的长度比较我的性格参考参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM