我有一个算法,它应该采用一个名为str
的字符串,并根据定义为的特定规则进行检查:
在IX或IV之后没有出现。 如果规则没有被破坏,它将打印合法,如果规则被破坏,它将打印为非法。
这是我创建的代码:
string str = "MXCIVXX";
int length = str.length();
bool legal = true;
for (int i = 0; i < length; i++) {
if ((str[i] == 'I' && str[i + 1] == 'X') && (str[i + 2] != '/0'))
legal = false;
if ((str[i] == 'I' && str[i + 1] == 'V') && (str[i + 2] != '/0'))
legal = false;
}
if (legal == true)
cout << "Legal" << endl;
else if (legal == false)
cout << "Illegal" << endl;
我在字符串中测试了多个罗马数字,但是如果IX后面跟着字符串中的另一个字符,它会打印出合法的数字。如何解决此问题以确认IX或IV后面没有其他字符?
答案 0 :(得分:1)
您的意思是空字符,因此'\0'
代替'/0'
此外,您的方法不准确(请阅读以下评论并感谢@NathanOliver)。这种方法应该更好:
int main()
{
std::string str = "IX";
int size = str.size();
bool legal = true;
if (str[size - 2] == 'I') // the char before the last char
{
if (str[size - 1] == 'V' || str[size - 1] == 'X') // the last char
legal = true;
else
legal = false;
}
else
legal = false;
if (legal)
std::cout << "Legal" << std::endl;
else
std::cout << "Illegal" << std::endl;
getchar();
return 0;
}
答案 1 :(得分:1)
检查&#34; IX&#34;或者&#34; IV&#34;存在,如果它存在,则它在字符串的末尾,您可以使用std::string::find
并检查它是否返回位于字符串末尾的位置。所以,如果我们有一个像
std::string bad_str = "MXCIVXX";
我们使用find
之类的
std::size_t pos = bad_str.find("IV");
然后pos
将是std::string::npos
,意味着没有找到任何内容,或者它将是找到的位置&#34; IV&#34;。您可以使用
if (pos == std::string::npos || pos == bad_str.size() - 2)
std::cout << "good\n";
else
std::cout << "bad\n";
然后你只需要为&#34; IX&#34;同样。这样可以避免在手动版本中忘记处理的所有陷阱,例如超过字符串的结尾。
答案 2 :(得分:0)
您可以尝试以下代码来处理类似&#34; MIXCIXXIV&#34; :
String str = "MXCIVXX";
int length = str.length();
bool legal = true;
for (int i = 0; i < length - 2; i++) {
if ((str[i] == 'I' && str[i + 1] == 'X') && length > i + 2){
legal = false;
break;
}
if ((str[i] == 'I' && str[i + 1] == 'V') && length > i + 2){
legal = false;
break;
}
}
if (legal == true)
cout << "Legal" << endl;
else if (legal == false)
cout << "Illegal" << endl;