strcmp - '[' 标记之前的预期主表达式

Posted

技术标签:

【中文标题】strcmp - \'[\' 标记之前的预期主表达式【英文标题】: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.

【问题讨论】:

请不要修改问题以应用答案中提供的修复。这样做会改变编写这些答案的上下文并使它们无效。如果您有其他信息,请将其添加到问题的底部。 【参考方案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

以上是关于strcmp - '[' 标记之前的预期主表达式的主要内容,如果未能解决你的问题,请参考以下文章

cpp:“。”标记之前的预期主表达式

无法弄清楚出了啥问题:“')'标记之前的预期主表达式”

联合初始化程序“错误:‘。’标记之前的预期主表达式”

矩阵类:错误:“)”标记之前的预期主表达式

* C++ 之前的预期主表达式

错误:“双重”修复之前的预期主表达式?