2016-05-06 3 views
0

У меня есть алгоритм, который должен взять строку с именем str и проверить его против определенного правила определяется как:Проверяется IX или IV следует другому персонаж

НИЧЕГО приходит после 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

«_NOTHING приходит после IX или IV .._» не Define НИЧЕГО, вы имеете в виду только пространство? конец линии? никаких других римских цифр? –

+0

Отлаживайте его шаг за шагом и посмотрите, почему это происходит. Это то, что вы должны делать, когда ваша программа не работает. – user31264

+0

Ничто, как ни в каком другом персонаже, должно последовать за ним. Последние 2 символа - IX или IV. –

ответ

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; 
} 
+0

'std :: string :: find' является вашим другом. Вам не понадобится бизнес 'str [i] ... && str [i + 1] ...'. – erip

+1

В некоторых случаях это пройдет мимо конца массива. – NathanOliver

+0

Это сломается @nathan. Он работает с '' MXCIX ''или' "IV". Не могли бы вы объяснить больше, пожалуйста? –

1

Чтобы проверить, «IV» существует «IX» или если он делает это в то конец строки вы можете использовать std::string::find и убедитесь, что она возвращает позицию, в конец строки. Так что, если у нас есть строка, как

std::string bad_str = "MXCIVXX"; 

и мы используем find как

std::size_t pos = bad_str.find("IV"); 

Тогда pos будет либо std::string::npos означает, ничего не было найдено, или это будет позиция, где он нашел «IV». Вы можете проверить это, используя

if (pos == std::string::npos || pos == bad_str.size() - 2) 
    std::cout << "good\n"; 
else 
    std::cout << "bad\n"; 

Тогда вам просто нужно сделать это для «IX». Это позволяет избежать всех ошибок, которые вы могли бы забыть в ручной версии, например, в конце строки.

0

Вы можете попробовать следующий код, который будет обрабатывать случаи, как «MIXCIXXIV»:

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^