评估字符串的布尔函数

Boolean Function to Evaluate string

我需要构建一个函数来计算 C++ 中的一串数字。数字字符串采用 balanced ternary 形式,表示数字为 -1、0 或 1 才有效。所以函数的重点是检查字符串以确保它是有效的。例如,如果用户输入“-101-11”,则布尔函数将为 return true。或者,如果用户输入“-1012”,则布尔函数将为 return false。这个函数也是一个class的私有成员函数。让我向您展示到目前为止我编写的代码(我知道这是不正确的,但如果有人能帮助我,那就太好了!)它是用 C++ 编写的。

bool BTernary::isTernary(string s)
{
    int i;
    int l = s.length();
    for (i = 0; i < l; i++) {
        if (s.at(i) == '-') {
            continue;
        }
        else if (s.at(i) == '0') {
            continue;
        }
        else if (s.at(i) == '1') {
            break;
        }

        return true;
    }

    return false;
}

我也尝试了一种不同的方法来检查字符串,它看起来像这样:(这是我已经处理了一段时间的测试文件,它编译没有错误。问题是如果它看到'-' 或 '1' 或 '0' 它会自动假定它是真实的,我想我需要逐个字符地评估字符而不是评估整个字符串?

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int i;
    string s = "0";
    for (i = 0; i < s.length(); i++) {
        if (s.at(i) == '-' || '0' || '1') {
            cout << "True" << endl;
            return True;
        }
        else {
            cout << "false" << endl;
            return false;
        }
    }
}

算法很简单,你应该检查 - 后面是否总是跟着 1 并且没有其他字符,只有 01

bool BTernary::isTernary(string s) {
    int l = s.length();
    bool minus = false;
    for (int i = 0; i < l; i++) {
        if (s[i] == '-') {
            if (minus) {
                return false;
            }
            minus = true;
        } else if (s[i] == '0') {
            if (minus) {
                return false;
            }
        } else if (s[i] == '1') {
            if (minus) {
                minus = false;
            }
        } else {
            return false;
        }
    }
    return !minus;
}

这是 Mihail 建议的精简版:

bool BTernary::isTernary(const std::string& s)
{
    bool minus = false;

    for (const char c : s)
    {
       switch (c)
       {
         case '-':
            if (minus) return false;
            minus = true;
            break;

         case '0':
            if (minus) return false;
            break;

         case '1':
            if (minus) minus = false;
            break;

         default:
            return false;
    }

    return !minus;
}