【问题标题】:Cannot Convert string to 'char*' for argument error?无法将字符串转换为 'char*' 参数错误?
【发布时间】:2017-12-29 07:48:42
【问题描述】:

我不明白这个错误在我的 C++ 代码中的含义

错误:无法将 'std::string {aka std::basic_string}' 转换为 'char' 用于参数 '1' 到 'bool areParenthesesBalanced(char*)'

if(areParenthesesBalanced(str))

我的代码:

bool areParenthesesBalanced(char expr[])
{
    stack<char> s;
    char a, b, c;

    for (int i=0; i<strlen(expr); i++)
    {
        if (expr[i]=='(' || expr[i]=='[' || expr[i]=='{')
        {
            s.push (expr[i]);
        }
        else
        {
            switch (expr[i])
            {
                case ')':
                a = s.top();
                s.pop();
                if (a=='{' || a=='[')
                cout<<"Not Balanced";
                break;

                case '}':
                b = s.top();
                s.pop();
                if (b=='(' || b=='[')
                cout<<"Not Balanced";
                break;

                case ']':
                c = s.top();
                s.pop();
                if (c=='(' || c=='{')
                cout<<"Not Balanced";
                break;
            }
        }
    }

    if (s.empty())  //check if stack is empty
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    std::ifstream t("file.txt");
    std::string str;
    t.seekg(0, std::ios::end);
    str.reserve(t.tellg());
    t.seekg(0, std::ios::beg);
    str.assign((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());

    if(areParenthesesBalanced(str))
    {
        cout<<"Balanced";
    }
    else
    {
        cout<<"Not Balanced";
    }
    return 0;
}

我不明白它所看到的问题!有什么想法吗?

【问题讨论】:

  • 为什么 expr 是 char 数组而不是 std::string?你为什么用 std::string 调用你的函数?

标签: c++ compiler-errors char boolean


【解决方案1】:

你应该使用std::string::c_str()

在这里阅读:http://www.cplusplus.com/reference/string/string/c_str/

但顾名思义,这使您的代码看起来更像 C 而不是 C++。最好传递 std::string 的 const 引用并使用 foreach 语法(基于范围的 for 循环)或 std::string::size()

修改后的代码(C++11):

bool areParenthesesBalanced(const std::string &expr)
{
    const std::unordered_map<char, char> parens { {')', '('}, {']', '['}, {'}', '{'} };
    std::stack<char> paren_stack;

    for (const auto chr : expr)
    {
        switch (chr)
        {
        case '(':
        case '[':
        case '{':
            paren_stack.push(chr);
            break;

        case ')':
        case ']':
        case '}':
        {
            const auto val = paren_stack.top();
            paren_stack.pop();
            if (parens.find(chr)->second != val) {
                std::cout << "Not Balanced";
                return false;
            }
            break;
        }

        default:
            break;
        }
    }

    return paren_stack.empty();
}

【讨论】:

  • 而且 OP 还必须将 char expr[] 更改为 const char expr[]。 (或者更好的const std::string &amp;expr。)
  • 我应该在哪里解决这个问题?
  • 如果它对您有用,请投票并接受。另请注意,您需要包含stringstackunordered_map
【解决方案2】:

您可能希望将函数声明更改为:

bool areParenthesesBalanced(const std::string& expr)

无需转换为char []。您可以将[] 运算符与字符串一起使用。

【讨论】:

  • 我试过这个,我得到“错误:无法将参数 '1' 的 'const string {aka const std::basic_string}' 转换为 'const char*' 到 'size_t strlen( const char*)' for(int i = 0; i
  • std::string 有一个成员函数长度。
  • OP 也需要#include &lt;string&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多