【问题标题】:Comparing element in string with length-1 string in C++将字符串中的元素与 C++ 中长度为 1 的字符串进行比较
【发布时间】:2018-06-18 19:36:51
【问题描述】:

我很抱歉这个简单的问题,但我不明白为什么这个简单的程序不起作用。

除了"a"a[0] 应该是什么?

#include <iostream>

using namespace std;

int main(){

    string a = "abcd";
    string b = "a";


    if (a[0]==b){//<------problem here
        cout << a << endl;
    }

    return 0;
}

返回错误

'operator==' 不匹配(操作数类型为'char' 和'std::__cxx11::string {aka std::__cxx11::basic_string}')

或者简单地使用string c=a[0];会返回错误:

要求从“char”转换为非标量类型“std::__cxx11::string {aka std::__cxx11::basic_string}”

PS:在尝试了一些事情之后,如果我比较a[0]==b[0] 或分配c[0]=a[0],我可以让它工作,因为它们现在绝对是同一类型,但我仍然想知道标准和/或在 C++ 中将子字符串与另一个字符串进行比较的最快方法是。

【问题讨论】:

  • what is a[0] supposed to be other than "a"? 嗯,可能是字符'a'
  • 这很好用,因为它们是相同的类型,但我想测试一个像 a[0]==b 这样的子字符串是否失败,因为它们是不同的类型。那么a[0]是什么类型呢?
  • 您是在寻找字符串中任意长度的通用子字符串,还是试图快速找到长度正好为 1 的子字符串在字符串中?第二种情况类似于在字符串中查找char
  • A std::stringchar 的字符串,因此string 的任何索引都是char
  • 查看所有回复后,我现在的问题是,如果我定义 char c="a"; a[0]==c;如果 a[0] 是字符,则返回错误。

标签: c++ types


【解决方案1】:

您应该使用 std::string::find 来查找子字符串。在字符串上使用下标运算符返回单个字符(标量),而不是字符串(向量,非标量);因此,它们不是同一类型,并且没有明确的比较。

您也可以使用 std::string::substr 选择一个子字符串,您可以直接将其与另一个字符串进行比较。

示例

#include <iostream>
#include <string>

int
main() {
    std::string a = "abcd";
    std::string b = "a";
    if (a.find(b) != std::string::npos) {
        std::cout << a << "\n";
    }
    if (a.substr(0, 1) == b) {
        std::cout << a << "\n";
    }
    return 0;
}

参考文献

http://en.cppreference.com/w/cpp/string/basic_string/find
http://en.cppreference.com/w/cpp/string/basic_string/substr
http://en.cppreference.com/w/cpp/string/basic_string

【讨论】:

  • 也许还提到std::string::substr,以及"foo" 的类型为const char *(指向\0 终止字符串的指针)而'f' 的类型为@987654330 @(单个字符)。此外,我个人建议链接到 cppreference.com 而不是 cplusplus.com 以获得更高质量的参考网站。
【解决方案2】:

除了“a”之外,a[0] 应该是什么?

它是'a' 而不是"a",它是char。您无法将 charstring 进行比较,因为它们是不同的类型。但是你可以做的是从你的字符串中提取一个长度为 1 个字符的子字符串:

if (a.substr(0,1)==b)...

然后您将比较 "a""a",因为 .substr 返回 string 而不是 char,即使长度为 1。

如果您正在使用std::string,请不要忘记#include &lt;string&gt;

【讨论】:

  • 有点矫枉过正。 a[0] == b[0] 会更直接一些。不过,黄金标准可能是将b 变成char
  • @user4581301 虽然可能是这样,而且我同意你的观点,但 OP 似乎对比较字符串感兴趣。
  • 谢谢,终于为我解决了这个问题(在我的代码和头脑中),a[0]='a'。以后我需要更加小心区分“a”和“a”。
【解决方案3】:

a[0] 是一个字符,其值为'a',而b 是一个字符串,它具有不同的类型。如果定义了 operator ==(char, string)(或带有 const 和/或引用的一些变体)但至少在 C++ 标准中没有定义,这将起作用,因此编译应该失败. clang 编译器甚至给出了有用的信息,

二进制表达式的无效操作数('int' 和 'string'...

这表明您正在比较不同的类型。

尝试更改它以比较 a[0]b[0]The bracket operator is defined for strings, and returns a character,所以你可以这样比较。

编辑: 这看起来好像没有回答问题。它确实回答了最初的问题; OP在事后更改了整个问题(并且有人添加了相应的答案),但第一段中仍然存在原始问题。如果版主愿意,我会删除答案。

【讨论】:

  • 我将收到的错误消息称为稍微直接一点:“操作数类型是'char'和'std::__cxx11::string”。
  • 这很有帮助,但我也尝试定义 char c="a",但是 a[0]==c 也返回错误(从 'const char*' 到 'char' 的无效转换 [- fpermissive]),所以 a[0] 不是一个字符,正如我所预料的那样。
  • @user4581301 我认为这是不同的编译器信息;我指出我的声音很响。
  • @jpf137 相反,a[0] char;不是c。每当你使用双引号时,你都会得到一个char *
  • @user4581301 另外,我要指出,所提到的编译器错误具有难看但很常见的限定条件,这有助于使某些编译器的消息对新手不可读:std::__cxx11::string 而不仅仅是简单的@987654334 @.
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 2013-08-17
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多