2012-03-02 87 views
1

我對C++超新穎。如何在C++中使用開關大小寫比較字符串

我必須做一個解析器。取一個像「34 + 5-(9 * 8)」的輸入並將其插入二叉樹。我的想法是比較字符串中的每個字符並確定字符是數字還是simbol(+, - ,*,/等),並將其插入隊列以使用後綴表示法,然後將其插入二進制樹

我要的是讓用戶輸入字符串,分割字符串轉換成字符,然後比較

#include <iostream> 
#include <string> 
using namespace std; 

string cadena; 
string numero; 
int i; 

int main(){ 

    cout<< "Type String"; 
    cin>> cadena; 
    for (i=0; i<cadena.length(); i++){ 
     switch(cadena[i]{ 
      case "0": 
      case "1": 
      case "2": 
      ... 
      case "9": 
       numero+=cadena[i]; 
     } 
     cout << numero<<endl; 
     numero=""; 
    } 
    return 0; 
} 

但是編譯器會抱怨我不能比較當前字符(cadena[i] )與我的字符串(「0」)。

有人能告訴我該怎麼做嗎?

我已經用炭,而不是試圖std:string,閱讀其他問題等

+1

'INT ISDIGIT(INT CH);' – 2012-03-02 18:52:10

+0

感謝所有的答覆。答案來自我已經擁有的一個項目。 解決方案是將cadena [i]轉換爲int int car =(int)cadena [i] 然後與ascii值進行比較。 對不起,我是新來的C++,我也討厭它哈哈 – chepe263 2012-03-03 00:13:03

回答

8

在switch語句中case標籤現在是字符串,但你解析字符串的每個單獨的一個字符。嘗試將案例標籤中的雙引號更改爲單引號。例如:

switch (cadena[i]) { 
    case '0': 

    /* ... */ 
} 

更一般地,如果標籤上的常量必須是完整的數字常量如int,焦炭,短,等你不能把其他類型的值存在。

也就是說,您可能需要查看標題<cctype>中的isdigit函數,該函數直接測試字符是否爲數字。

希望這會有所幫助!

6

而不是

case "0": 
    case "1": 

使用

case '0': 
    case '1': 

(和其他人,當然)

+0

它也沒有工作嘿嘿 – chepe263 2012-03-03 00:11:57

0

你不能比較一個字符串(類型const char *)沒有char某種類型的自定義函數調用。但是,您可以將其與另一個char進行比較。用'0', '1', ...替換「0」,「1」等,你應該編譯。

1

您不能使用字符串(const char*值)作爲您的案例標籤。此外,numero+=cadena[i]沒有做你認爲它的作用:價值將大幅下降。您應該使用numero = 10*numero + (cadena[i] - '0')

此外,switch是完全不必要的:您可以改爲使用isdigit(cadena[i])

最後,你甚至不需要一個循環:有一個很方便的功能,做你所需要的:

numero = atoi(cadena.c_str()); 
相關問題