我不确定我是否正确使用了find_first和last_of,但我想要做的是当我在代码的开头或结尾找到_时,以及当它找到两个或更多时,我需要打印错误_彼此相邻,如此lol___, lol__lol, _lol_, _lol, lol_,
和另外一条规则,_不能在大写字母前面,如lol_Lol
这是我的代码
std::string::size_type n;
std::string::size_type n2;
std::string::size_type n3;
std::string const ss = slovo;
n = ss.find('_');
n2 = ss.find_first_of('_');
n3 = ss.find_last_of('_');
if (n2 == std::string::npos && n3 == std::string::npos) {
cout << "chyba" << endl;
}else if(n == std::string::npos){
string s = transform(slovo);
cout << s << endl;
}else{
string s = untransform(slovo);
cout << s << endl;
}
编辑&gt;
if ( !ss.empty() && ss.front() == '_' && ss.back() == '_' )
{
cout << "Chyba" << endl;
} else {
if ( ss.length() > 3 && ss.find( '__', 1, ss.length() - 2 ) != std::string::npos )
{
if (n == std::string::npos){
string s = transform(slovo);
cout << s << endl;
}else{
string s = untransform(slovo);
cout << s << endl;
}
}else{
cout << "chyba" << endl;
}
}
EDIT2:
cin >> slovo;
}
std::string::size_type n;
std::string const ss = slovo;
n = ss.find('_');
// kontrola podtrznika
if ( ss.empty() && ss[0] == '_' && ss[ss.length() - 1] == '_' )
{
cout << "chyba" << endl;
}
if ( ss.length() > 3 && ss.find( "__", 1, ss.length() - 2 ) != std::string::npos )
{
cout << "chyba" << endl;
}
if (n == std::string::npos)
{
string s = transform(slovo);
cout << s << endl;
}else{
string s = untransform(slovo);
cout << s << endl;
}
答案 0 :(得分:2)
如果这些函数返回npos
,则意味着在字符串中找不到该字符。因此,如果其中一个返回,则所有3个都将返回。
因此,此代码输出'chyba',字符串中没有_
,否则调用untransform
。根据你的描述,这不是你想要的。
您确实需要扫描所有这些条件的字符串。如果您想检查字符串的第一个和最后一个字符,请使用ss[0]
和ss[ss.length() - 1]
(请注意,您没有长度为0或1的字符串)。
答案 1 :(得分:0)
很明显,这两个函数调用会给你相同的结果
n = ss.find('_');
n2 = ss.find_first_of('_');
在这种情况下,它们是等价的。
如果我理解正确,你需要确定一个字符串中的第一个和最后一个字符是否为下划线,以及该字符串是否包含两个相邻的非本地字符。
要确定第一种情况,写起来很简单
if ( !ss.empty() && ss.front() == '_' && ss.back() == '_' )
{
//...
}
要查找至少两个相邻的下划线,不包括您可以编写的第一个和最后一个字符
if ( ss.length() > 3 && ss.find( "__", 1, ss.length() - 2 ) != std::string::npos )
{
//...
}