2016-05-06 14 views
0

Ich habe einen Algorithmus, der eine Zeichenfolge namens str und überprüfen Sie es gegen eine bestimmte Regel definiert nehmen soll:prüft IX oder IV durch ein anderes Zeichen gefolgt werden

NICHTS nach IX oder IV kommt. Es wird legal gedruckt, wenn die Regel nicht gebrochen ist, und Illegal, wenn die Regel ungültig ist.

Hier ist mein Code, die ich geschaffen habe:

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; 

ich mehrere römische Ziffern in der Zeichenfolge getestet haben, aber es druckt legal, wenn IX durch ein anderes Zeichen in der Zeichenfolge folgt. Wie kann ich das beheben, um zu bestätigen, dass auf IX oder IV kein anderes Zeichen folgt?

+0

„_NOTHING kommt nach IX oder IV .._“ definieren NICHTS, so dass Sie in Raum? Ende der Linie? keine anderen römischen Ziffern? –

+0

Debuggen Sie es Schritt für Schritt und sehen Sie, warum das passiert. Das sollten Sie tun, wenn Ihr Programm nicht funktioniert. – user31264

+0

Nichts als in keinem anderen Charakter ist, danach zu kommen. Die letzten 2 Zeichen sind entweder IX oder IV. –

Antwort

1

Sie soll die Null-Zeichen, so '\0' statt '/0'

Auch Ihr Ansatz ist nicht korrekt (unten Kommentare und dank @NathanOliver lesen). Dieser Ansatz sollte besser funktionieren:

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' ist dein Freund. Du brauchst das Geschäft "str [i] ... && str [i + 1] ..." nicht. – erip

+1

Dies wird in einigen Fällen über das Ende des Arrays hinausgehen. – NathanOliver

+0

Es wird @nathan brechen. Es funktioniert mit '" MXCIX "' oder '" IV "' Könnten Sie bitte mehr erklären? –

1

Um zu überprüfen, ob „IX“ oder „IV“ existieren und wenn es tut, ist es dann die Zeichenfolge beenden Sie std::string::find verwenden können, und prüfen, ob es eine Position zurückgibt, ist in das Ende der Zeichenfolge. Wenn wir also eine Zeichenfolge wie

std::string bad_str = "MXCIVXX"; 

haben und wir verwenden find wie

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

Dann wird pos entweder std::string::npos bedeutet nichts gefunden wurde oder es wird die Position, wo er „IV“ gefunden. Sie können dies überprüfen, indem Sie

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

verwenden Dann müssen Sie dies auch nur für "IX" tun. Dies vermeidet alle Fallstricke, die Sie vergessen könnten, in der manuellen Version zu behandeln, als wenn Sie über das Ende der Zeichenfolge hinausgehen.

0

Sie können den folgenden Code versuchen, die Fälle wie „MIXCIXXIV“ behandelt:

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; 
Verwandte Themen