cpp中的字符串比较

时间:2014-09-21 09:07:40

标签: c++

我正在尝试比较cpp中的字符串但是我遇到了一堆错误
不匹配'operator =='
从char到const char的无效转换*

我正在实现两个功能:
1)比较字符串并搜索括号,然后返回一个bool。
2)比较字符串并搜索算术运算符,然后返回一个bool。

这是我的代码:

bool isBracket(const string b)
{
    if(b == ")" || b=="(")
            return true;
    else
            return false;
}

bool isOperator(const string op)
{
    string ops= "*+-^/";
    for(int i = 0; i < ops.length(); i++)
    {
            if (op == ops[i])
                    return true;
            else 
                    return false;
    }
}

int main()
{
    string exp="(a+b)";

    for(int i=0; i < exp.size(); i++)
    {
        cout<<exp[i]<<endl;
        if(isBracket(exp[i]))
                cout<<"bracket found"<<endl;
        if(isOperator(exp[i]))
                cout<<"operator found"<<endl;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:4)

这些功能可以采用以下方式

bool isBracket( const string &b )
{
    return b.find_first_of( "()" ) != std::string::npos;
}

bool isOperator( const string &op )
{
    return op.find_first_of( "*+-^/" ) != std::string::npos;
}

或者,如果您只比较字符串的元素,那么函数可能看起来像

#include <cstring>
//...

bool isBracket( char b )
{
            const char *brackets = "()"; 
            return std::strchr( brackets, b ) != NULL; 

}

bool isOperator( char op )
{
            const char *ops = "*+-^/";
            return std::strchr( ops, op ) != NULL; 
}

甚至喜欢

#include <cstring>
//...

bool isBracket( char b )
{
            const char *brackets = "()"; 
            return b != '\0' && std::strchr( brackets, b ) != NULL; 

}

bool isOperator( char op )
{
            const char *ops = "*+-^/";
            return op != '\0' && std::strchr( ops, op ) != NULL; 
}

答案 1 :(得分:2)

比较 op == ops [i]

比较std :: string和char,如果op是你可以做的一个char字符串 op [0] == ops [i] 代替。

另外,我建议你看一本好的参考书,例如: Josuttis“C ++标准库:教程和参考”。还有不错的在线参考,只有谷歌为他们。在那里你可以找到许多有用的字符串函数,STL算法也可能有用,正如其他海报已经指出的那样。

答案 2 :(得分:0)

你的isOperator()函数总是返回false,因为(如上所述)你试图将字符串与char进行比较。另一方面,如果你将char与char进行比较,它甚至不会起作用,但是你必须尝试op字符串中的每个char。

你必须在if()之后更改return语句。相反,只有当它遍历整个for循环时才返回false。

其他人确实发布了一些更有用的代码,但是另一个问题是,返回运营商(甚至可能是哪个运营商)的位置会不会更有用?