2017-07-23 66 views
-2

我不明白这是什么错误是在我的C++说代码无法将字符串转换为'char *'参数错误?

error: cannot convert 'std::string {aka std::basic_string}' to 'char' for argument '1' to '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; 
} 

我不明白什么是看到的问题!有任何想法吗?

+1

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

回答

1

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

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

但顾名思义,这使你的代码看起来更象C比C++。最好传递std::string的常量引用,并使用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(); 
} 
+0

而OP也必须将'char expr []'改为'const char expr []'。 (或者甚至更好'const std :: string&expr'。) – HolyBlackCat

+0

我应该在哪里解决这个问题? – TevinTwoTimes

+0

@TevinTwoTimes查看编辑答案。 –

0

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

bool areParenthesesBalanced(const std::string& expr) 

没有必要转换为char []。您可以使用带有字符串的[]运算符。

+0

我试过这个,我得到了“错误:不能转换'const string(又名const std :: basic_string }'到'const char *'参数'1'到'size_t strlen(const char *)'for(int i = 0; i TevinTwoTimes

+0

std :: string有一个成员函数长度 –

+0

OP也需要'#include '。 –