【问题标题】:strcmp - expected primary-expression before ‘[’ tokenstrcmp - '[' 标记之前的预期主表达式
【发布时间】:2020-08-27 13:34:15
【问题描述】:

在我的主代码中,我有一个操作,我想将字符串“word[i]”的某个字符与拉丁字母“b”进行比较。显然我尝试使用“ word[i] == "b" ”但出错了。经过一番研究,我发现在 C++ 中“word[i] == "b"” 比较两个指针。有人建议应该使用 strcmp() 来代替。

所以我使用了 strcmp() 但仍然出现错误。有人可以向我解释为什么它不起作用吗?

最小的工作示例:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
    string test;
    cin >> test;
    if(strcmp(string[0], "a") == 0){
        cout << "yes";
    }
}

-->

untitled.cpp: In function ‘int main()’:
untitled.cpp:8:18: error: expected primary-expression before ‘[’ token
    8 |  if(strcmp(string[0], "a") == 0){
      |                  ^
Compilation failed.

【问题讨论】:

  • 请不要修改问题以应用答案中提供的修复。这样做会改变编写这些答案的上下文并使它们无效。如果您有其他信息,请将其添加到问题的底部。

标签: c++ string char comparison


【解决方案1】:

你的字符串不叫string;它被称为test

您通过提供类型名称而不是表达式来混淆编译器。

修复:

if(strcmp(test[0], "a") == 0){
//        ^^^^

但是,这仍然是错误的。 test[0] 不是字符串;它是单个字符。

解决方案:

if (test[0] == 'a') {
//             ^ ^

经过一番研究,我发现在 C++ 中“word[i] == "b"” 与指针比较

当然,对于 C 字符串,但在 C++ 中,std::string 定义了 ==,正如您所期望的那样。

【讨论】:

    【解决方案2】:

    显然我尝试使用 "word[i] == "b" " 但出错了

    表达式word[i](根据给出的程序,您的意思似乎是test[i] == "b"或更准确地说是test[0] == "a")的类型为char,而字符串文字"b"的类型为const char *。所以编译器会因为类型不兼容而报错。

    函数strcmp 旨在比较两个c 字符串。如果你会写例如

    strcmp( word[i], "b" ) == 0
    

    然后你会再次得到一个数组,因为表达式word]i] 不是指向字符串的指针。它产生一个字符。

    此外在这个 if 语句中

    if(strcmp(string[0], "a") == 0){
    

    您正在使用类型说明符 std::string 而不是对象。

    你需要的只是写

    if ( test[0] == 'a' ){
    

    比较了char 类型的两个对象:对象test[0] 和字符文字'0'

    【讨论】:

      【解决方案3】:

      string[0] 无效,因为 string 是类型名称。看来你的意思是test[0]

      还要注意strcmp(test[0], "a") == 0 不起作用,因为test[0]char 并且strcmp() 需要指向C 样式字符串(以'\0' 结尾的字符序列)的指针作为两个参数。

      您要比较的是字符,而不是字符串,所以应该是 test[0] == 'a'test[0] == "a"[0]

      【讨论】:

      • 您提出的解决方案仅在 i0 时才有效,并且它还假设空终止且没有嵌入空值。第一个与所述问题对立,而后者未在问题中指定。
      • "我想将字符串 "word[i]" 的某个字符与拉丁字母 "b" 进行比较。" 代码中的0 是只是一个例子。
      • @AsteroidsWithWings 终止空字符包含在从c_str() 返回的数组中
      • 没关系:如果输入字符串嵌入了空值,它将在错误的位置,std::string 支持。不要将 C 库函数用于 C++ 的东西。
      • 而你仍然假设i0
      猜你喜欢
      • 2013-08-29
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2017-09-24
      相关资源
      最近更新 更多