Как сравнить строку с использованием регистра переключателя в C ++ - PullRequest
1 голос
/ 02 марта 2012

Я супер новичок в C ++.

Я должен сделать парсер. Возьмите входные данные типа «34 + 5- (9 * 8)» и вставьте их в двоичное дерево. Моя идея состоит в том, чтобы сравнить каждый символ в строке и определить, является ли символ числом или символом (+, -, *, / и т. Д.), И вставить его в очередь, чтобы использовать постфиксную нотацию, а затем вставить его в двоичное дерево

Я хочу попросить пользователя ввести строку, разбить строку на символы и затем сравнить

что-то вроде

#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, читать другие вопросы и т. Д.

Ответы [ 4 ]

8 голосов
/ 02 марта 2012

Метки регистра в вашем выражении switch прямо сейчас являются строками, но каждый отдельный фрагмент анализируемой строки - это символ. Попробуйте изменить двойные кавычки в ярлыках дел на одинарные. Например:

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

    /* ... */
}

В более общем случае константы в метках case должны быть целочисленными числовыми константами, такими как int, char, short и т. Д. Вы не можете помещать туда другие типы значений.

Тем не менее, вы можете посмотреть на функцию isdigit из заголовка <cctype>, которая непосредственно проверяет, является ли символ цифрой или нет.

Надеюсь, это поможет!

6 голосов
/ 02 марта 2012

Вместо

    case "0":
    case "1":

используйте

    case '0':
    case '1':

(и для остальных, конечно)

1 голос
/ 02 марта 2012

Вы не можете использовать строки (const char* значения) в качестве меток вашего регистра.Кроме того, numero+=cadena[i] делает не то, что вы думаете: значение будет значительно меньше.Вместо этого следует использовать numero = 10*numero + (cadena[i] - '0').

Более того, switch совершенно не нужен: вместо него можно использовать isdigit(cadena[i]).

Наконец, вам даже не нужен цикл: естьочень удобная функция, которая делает то, что вам нужно:

numero = atoi(cadena.c_str());
0 голосов
/ 02 марта 2012

Невозможно сравнить char со строковым литералом (тип const char *) без какого-либо вызова пользовательской функции. Однако вы можете сравнить его с другим char. Замените «0», «1» и т. Д. На '0', '1', ..., и вы должны скомпилировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...