如何在C++中使用开关大小写来比较字符串

How to compare a string using a switch case in C++

本文关键字:大小写 开关 比较 字符串 C++      更新时间:2023-10-16

我是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")进行比较。

有人能告诉我该怎么办吗?

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

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

switch (cadena[i]) {
    case '0':
    /* ... */
}

通常情况下,大小写标签中的常量必须是整数常量,如int、char、short等。您不能在其中放置其他类型的值。

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

希望这能有所帮助!

而不是

    case "0":
    case "1":

使用

    case '0':
    case '1':

(当然还有其他)

不能使用字符串(const char*值)作为大小写标签。此外,numero+=cadena[i]并没有做你认为它会做的事情:该值将显著降低。您应该使用numero = 10*numero + (cadena[i] - '0')

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

最后,您甚至不需要循环:有一个非常方便的函数可以满足您的需要:

numero = atoi(cadena.c_str());

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