我要遍历一个字符串,并针对该字符串中的每个字符,将其与某个字符进行比较,例如“ M”。 main/jniLibs
对我不起作用,因为字符串中字符出现的顺序很重要(例如,罗马数字MC与CM不同)。
我拥有的代码(我正在使用c ++ 11进行编译):
std::string::find
控制台错误显示:
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
string str = ("Test Mstring");
for (auto it = str.begin(); it < str.end(); it++) {
if (strcmp(*it, "M") == 0) cout << "M!1!!1!" << endl;
}
}
答案 0 :(得分:2)
取消引用从std::string
获得的迭代器将返回char
。您的代码只需要是:
if (*it == 'M') cout << "M!1!!1!" << endl;
也:
注意'M'!=“ M”。在C ++中,双引号定义了一个字符串文字,该字符串以一个空字节结尾,而单引号则定义了一个字符。
除非打算刷新标准输出缓冲区,否则不要使用endl
。 \n
快很多。
strcmp
通常是代码气味。
答案 1 :(得分:2)
字符串的元素是字符,例如'M'
,而不是字符串。
string str = "Test Mstring";
for (auto it = str.begin(); it < str.end(); it++) {
if (*it == 'M') cout << "M!1!!1!" << endl;
}
或
string str = "Test Mstring";
for (auto ch: str) {
if (ch == 'M') cout << "M!1!!1!" << endl;
}
答案 2 :(得分:1)
strcmp
比较整个字符串,因此如果将"mex"
与"m"
进行比较,则它们不相等,并且您无法将char
与char
进行比较string
在此函数中,因为要比较字符,可以将字符串用作数组,例如
string c = "asd";
string d = "dss";
if(c[0]==d[0] /* ... */
if(c[0]=='a') /*... */
请记住,it
是字符串中char的指针,因此在取消引用时,必须与char比较
if(*it=='c')
顺便说一句,为什么要混合使用C和C ++字符串?您像在C ++中一样使用string
,但是功能strcmp
来自C库
答案 3 :(得分:0)
您可以执行以下操作:
std::for_each(str.begin(), str.end(), [](char &c){ if(c == 'M') cout<< "M!1!!1!"<<endl; });
迭代器指向字符串变量中的一个char,而不必进行字符串比较