C++ 检查IX或IV后面是否有其他字符

C++ 检查IX或IV后面是否有其他字符,c++,arrays,string,C++,Arrays,String,我有一个算法,它应该取一个名为str的字符串,并根据定义为以下内容的特定规则进行检查: 在第九节或第四节之后没有任何内容。 如果规则没有被破坏,它将打印为合法,如果规则被破坏,它将打印为非法 以下是我创建的代码: string str = "MXCIVXX"; int length = str.length(); bool legal = true; for (int i = 0; i < length; i++) { if ((str[i] == 'I' && s

我有一个算法,它应该取一个名为
str
的字符串,并根据定义为以下内容的特定规则进行检查:

在第九节或第四节之后没有任何内容。 如果规则没有被破坏,它将打印为合法,如果规则被破坏,它将打印为非法

以下是我创建的代码:

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;
string str=“MXCIVXX”;
int length=str.length();
bool-legal=true;
for(int i=0;icout您的意思是空字符,因此
'\0'
而不是
'/0'

此外,您的方法也不准确(请阅读下面的评论并感谢)。这种方法应能更好地发挥作用:

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;
}
intmain()
{
std::string str=“IX”;
int size=str.size();
bool-legal=true;
if(str[size-2]='I')//最后一个字符之前的字符
{
if(str[size-1]='V'| | str[size-1]=='X')//最后一个字符
合法=真实;
其他的
合法=虚假;
}
其他的
合法=虚假;
国际单项体育联合会(法律)

std::cout您指的是空字符,因此
'\0'
而不是
'/0'

此外,您的方法也不准确(请阅读以下评论并感谢)。这种方法应该更有效:

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;
}
intmain()
{
std::string str=“IX”;
int size=str.size();
bool-legal=true;
if(str[size-2]='I')//最后一个字符之前的字符
{
if(str[size-1]='V'| | str[size-1]=='X')//最后一个字符
合法=真实;
其他的
合法=虚假;
}
其他的
合法=虚假;
国际单项体育联合会(法律)
std::cout要检查“IX”或“IV”是否存在,如果存在,则它位于字符串的末尾,您可以使用并检查它是否返回位于字符串末尾的位置

std::string bad_str = "MXCIVXX";
我们使用
find
like

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";
if(pos==std::string::npos | | pos==bad_str.size()-2)
std::cout要检查“IX”或“IV”是否存在,如果存在,则它位于字符串的末尾,您可以使用并检查它是否返回位于字符串末尾的位置

std::string bad_str = "MXCIVXX";
我们使用
find
like

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";
if(pos==std::string::npos | | pos==bad_str.size()-2)

std::cout您可以尝试以下代码来处理类似“MIXCIXXIV”的情况:

String str=“MXCIVXX”;
int length=str.length();
bool-legal=true;
对于(int i=0;ii+2){
合法=虚假;
打破
}
如果((str[i]='i'&&str[i+1]='V')&&length>i+2){
合法=虚假;
打破
}
}
如果(合法==真)

cout您可以尝试以下代码来处理类似“MIXCIXXIV”的情况:

String str=“MXCIVXX”;
int length=str.length();
bool-legal=true;
对于(int i=0;ii+2){
合法=虚假;
打破
}
如果((str[i]='i'&&str[i+1]='V')&&length>i+2){
合法=虚假;
打破
}
}
如果(合法==真)

不能“在第九次或第四次之后就没有了…”什么都不定义,你是说只有空格?行尾?没有其他罗马数字?一步一步地调试它,看看为什么会发生这种情况。这就是当你的程序不工作时应该做的。后面没有其他字符。最后两个字符是IX或IV。请注意,
'/0'
有很大的不同de>“\0”
“在IX或IV之后没有任何内容…”什么都不定义,你是说只有空格?行尾?没有其他罗马数字?一步一步地调试它,看看为什么会发生这种情况。这就是当你的程序不工作时应该做的。后面没有其他字符。最后两个字符是IX或IV。请注意,
'/0'
有很大的不同de>'\0'
std::string::find
是您的朋友。您不需要
str[i]…&&str[i+1]…
业务。在许多情况下,这将超过数组的结尾。它将中断@nathan。它与
“MXCIX”
“IV”一起工作
请您解释一下好吗?UB不一定不起作用。拥有它是个坏主意。如果字符串以IX或IV结尾,那么
str[i+2]!='\0'
将超过字符串的结尾,是UB。字符串“IV”只有有效的索引0和1。
std::string::find
是您的朋友。您不需要
str[i]…&&str[i+1]…
业务。在许多情况下,这将超过数组的末尾。它将破坏@nathan。它与
“MXCIX”
“IV”
一起工作。请您解释更多信息好吗?UB不一定不工作。拥有它只是一个坏主意。如果字符串以IX或IV结尾,则
str[i+2]!='\0'
将超过字符串的结尾并为UB。字符串“IV”只有0和1的有效索引。