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]
。
【讨论】:
您提出的解决方案仅在i
为 0
时才有效,并且它还假设空终止且没有嵌入空值。第一个与所述问题对立,而后者未在问题中指定。
"我想将字符串 "word[i]" 的某个字符与拉丁字母 "b" 进行比较。" 代码中的0
是只是一个例子。
@AsteroidsWithWings 终止空字符包含在从c_str()
返回的数组中
没关系:如果输入字符串嵌入了空值,它将在错误的位置,std::string
支持。不要将 C 库函数用于 C++ 的东西。
而你仍然假设i
是0
以上是关于strcmp - '[' 标记之前的预期主表达式的主要内容,如果未能解决你的问题,请参考以下文章