评估字符串的布尔函数

Posted

技术标签:

【中文标题】评估字符串的布尔函数【英文标题】:Boolean Function to Evaluate string 【发布时间】:2019-10-08 15:25:17 【问题描述】:

我需要构建一个在 C++ 中计算一串数字的函数。数字字符串采用balanced ternary 形式,表示数字为-1、0 或1 均有效。所以这个函数的重点是检查字符串以确保它是有效的。例如,如果用户输入“-101-11”,布尔函数将返回 true。或者如果用户输入“-1012”,布尔函数将返回 false。这个函数也是一个类的私有成员函数。让我向您展示到目前为止我编写的代码,(我知道这是不正确的,但如果有人可以帮助我,那就太好了!)它是用 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;所以continue 语句是错误的(不要忘记检查他的长度 1st)。该代码目前允许-0 让我给你看一下我到目前为止的代码,(我知道这是不正确的) - 你有没有努力纠正你自己的逻辑?学习如何编写程序的重点是看你是否能纠正自己的错误。你做了一个尝试,所以用调试器检查你的代码,看看程序在哪里违背了你的计划。 您可能需要考虑使用std::regex if (s.at(i)=='-'||'0'||'1') -- 这条线的目的是什么?它没有做你认为它做的事情。 【参考方案1】:

这是 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;

【讨论】:

【参考方案2】:

算法很简单,你应该检查-后面是否总是跟着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;

【讨论】:

这段代码急需一个 for-each 循环和一个 switch 语句

以上是关于评估字符串的布尔函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 stl 函数调用会导致不正确的布尔评估? [复制]

C# 布尔评估未按预期进行评估

这 20 个Pandas 函数, 你可能没试过

pandas query

module_param的内核模块参数简介

R语言eval函数评估表达式或者字符串实战