如何在C ++中使用switch case比较字符串

时间:2012-03-02 18:46:57

标签: c++ string parsing switch-statement

我是C ++的新手。

我必须做一个解析器。选择“34 + 5-(9 * 8)”之类的输入并将其插入二叉树。我的想法是比较字符串中的每个字符并确定字符是数字还是simbol(+, - ,*,/等)并将其插入队列以使用后缀表示法然后将其插入二叉树< / p>

我想要的是要求用户输入字符串,将字符串拆分为字符然后进行比较

类似

#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;
}

但是编译器抱怨我无法将当前的char(cadena[i])与我的字符串(“0”)进行比较。

有人可以告诉我该怎么做吗?

我已经尝试过使用char代替std:string,阅读其他问题等等。

4 个答案:

答案 0 :(得分:8)

现在,switch语句中的case标签是字符串,但是你正在解析的每个字符串都是char。尝试将案例标签中的双引号更改为单引号。例如:

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

    /* ... */
}

更一般地说,case标签中的常量必须是整数数字常量,如int,char,short等。你不能在那里放置其他类型的值。

也就是说,您可能希望查看标题isdigit中的<cctype>函数,它直接测试字符是否为数字。

希望这有帮助!

答案 1 :(得分:6)

而不是

    case "0":
    case "1":

使用

    case '0':
    case '1':

(当然还有其他人)

答案 2 :(得分:1)

您不能使用字符串(const char*值)作为案例标签。此外,numero+=cadena[i]没有按照您的想法行事:价值将大幅下降。您应该使用numero = 10*numero + (cadena[i] - '0')代替。

此外,switch完全没必要:您可以改用isdigit(cadena[i])

最后,你甚至不需要循环:有一个非常方便的功能可以满足你的需要:

numero = atoi(cadena.c_str());

答案 3 :(得分:0)

如果没有某种自定义函数调用,则无法将char与字符串文字(类型const char *)进行比较。但是,您可以将其与另一个char进行比较。用'0', '1', ...替换“0”,“1”等,你应该编译。