5

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

考虑到这一点,我认为最简单的方法是对字符进行寻址并将其传递给 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!

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

(为了避免对我的问题重新分类而进行简短的咆哮......随意跳过)
当我说最短时,我的意思是出于对编码雄辩的渴望。请注意,这不是家庭作业问题。我是一名化学工程博士候选人,正在编码作为独立研究的一部分。当我询问效率时,我的最后一个问题被用户msw重新归类为“作业”(他也发表了讽刺的言论),我认为这是滥用的边界。我的代码可能会或可能不会被其他人重用,但我正在努力使其易于阅读和维护。我也有一个奇怪的愿望,即尽可能使我的代码尽可能高效。因此,关于效率和口才的问题。

4

5 回答 5

15

这样做:

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

不起作用,因为您“欺骗”字符串认为它正在获取指向以空结尾的 C 字符串的指针。这将产生奇怪的影响,包括使您的程序崩溃。相反,只需使用普通相等将字符串的第一个字符与 my_char 进行比较:

 if (my_string[0] == my_char)
   // do stuff
于 2010-08-30T19:06:02.167 回答
4

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

if (my_string[0] == my_char1)
于 2010-08-30T19:08:25.920 回答
3

您可以使用 string 的 operator[] 将其与单个 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;
}
于 2010-08-30T19:05:59.067 回答
1

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

Otoh << 运算符确实对 char 输入有适当的重载,因此您的输出不能反映您在此处实际比较的内容。

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

于 2010-08-30T19:06:36.930 回答
1

非常标准,c++ 中的字符串是空终止的;字符不是。因此,通过使用标准比较方法,您实际上是在检查“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 的字符参考进行比较。参考

于 2010-08-30T19:26:20.250 回答