C++ 检查输入(字符串)是否包含罗马数字

C++ 检查输入(字符串)是否包含罗马数字,c++,arrays,boolean,C++,Arrays,Boolean,一种函数,它接受一个字符串作为输入,如果该字符串仅包含 罗马数字,否则为假。回想一下,罗马数字是M,D,C,L, 十、 V和I 这就是我目前所拥有的 bool isRoman(string str, char key) { assert(str.length() > 0) if(length[i] == key) { return i; } } #包括 #包括 #包括 使用名称空间std::string_文本; 布尔是罗马的(标准::字符串视图sv) {//如

一种函数,它接受一个字符串作为输入,如果该字符串仅包含 罗马数字,否则为假。回想一下,罗马数字是M,D,C,L, 十、 V和I

这就是我目前所拥有的

bool isRoman(string str, char key)
 {

 assert(str.length() > 0)

 if(length[i] == key)
  {

  return i;
  } 
 }
#包括
#包括
#包括
使用名称空间std::string_文本;
布尔是罗马的(标准::字符串视图sv)
{//如果在字符串中找不到该字符
对于(auto-const&ch:sv)//包含罗马数字符号,返回false。
if(“MDCLXVI”s.find(std::toupper(static_cast(ch)))==std::string::npos)
返回false;
返回true;
}

不使用额外标准库的演示

#include <stdexcept>
#include <cctype>
#include <string>
using namespace std;

bool isRoman(string s){
    if(s.empty()){
        throw std::runtime_error("Got empty string");
    }
    bool isAllRoman = true;
    for(const auto& c: s){
        if(isspace(c)) //if you need to skip whitspace 
            continue;  
        if(!(c == 'M' || c == 'D' || c == 'C' || 
        c == 'L' || c == 'X' || c == 'V' || c == 'I')){
            isAllRoman = false;
            break;
        }
    }
    return isAllRoman;
}
#包括
#包括
#包括
使用名称空间std;
布尔伊斯曼(字符串s){
如果(s.empty()){
抛出std::runtime_错误(“获取空字符串”);
}
布尔·伊萨尔罗曼=真;
用于(常数自动和c:s){
if(isspace(c))//如果需要跳过whitspace
持续
如果(!(c='M'| c='D'| c='c'|
c='L'| | c='X'| | c='V'| | c='I')){
isAllRoman=假;
打破
}
}
返回是全罗马的;
}

如果您有任何不明白的地方,请留下评论。

如果您只想知道
std::string
是否只包含可以使用的特定有效字符集的值。这使您的函数成为一行:

bool isRoman(const std::string &str)
{
    return !str.empty() && str.find_first_not_of("MDCLXVI") == std::string::npos;
}

什么是
i
?什么是
?至少你已经开始了。这里似乎有一些错误,即使用了未定义的变量
i
,而不是返回值的函数的所有控制路径。你有问题吗?你的标题是“排序字符串”。但是您的描述没有提到排序。assert()只会在调试模式下被捕获。。。释放不会击中那个。我建议执行类似if(str.empty()){return false;}的操作,然后继续…@JE3 true,如果该字符串仅包含罗马数字——您确定正确阅读了描述吗?这是一个字符串--“LLLLLL”--是罗马数字吗?或者这里是另一个字符串--“XX II”--包含两个罗马数字。因此,您需要进一步澄清这个赋值应该做什么。您可以返回false而不是
isAllRoman=false
。不需要
bool
ean。最好每个函数有一个返回路径。。。。也许在你看来,我喜欢它的样子。这是一个极具争议的话题。@Rick如果函数在抛出之前返回而不会抛出,则不要从
@OmidCompSCI向函数传递潜在的负值。很抱歉,你说的是bs。我会调用strupr(number),而不是std::toupper(),每个字符的每个函数调用。你可以使用
std::transform
std::toupper
先转换字符串。我也不喜欢这个函数。它不能正常工作。如果数字为空,它将跳过while(*number)并返回true。。。。函数应该是israman(),没有人会在函数之间使用uu(这更像是一个变量名)@OmidCompSCI
strupr()
不是标准的。@OmidCompSCI没有人会在函数名中使用“u”?你看过C++标准库吗?
bool isRoman(const std::string &str)
{
    return !str.empty() && str.find_first_not_of("MDCLXVI") == std::string::npos;
}