检查IX或IV是否后跟另一个字符

时间:2016-05-06 19:12:47

标签: c++ arrays string

我有一个算法,它应该采用一个名为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后面没有其他字符?

3 个答案:

答案 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;