1

これはかなり基本的な質問だと思いますが、インターネットを 1 時間以上検索しましたが、答えが見つかりませんでした。

入力を文字列として受け取るテキスト インターフェイスを作成しています。入力文字列が数値の場合、文字列を整数に変換し、作成したスタックにプッシュします。

テキスト インターフェイスのコードは次のとおりです。

#include <iostream>
#include "textInterface.h"
#include "Stack.h"
#include <string>
#include <regex>

using namespace std;

void Interface(){
    Stack stack = Stack();

    string input;

    cout << "Please enter a number or operation";
    cin >> input;


     if (input == "."){
         cout << stack.pop();
     } //this pops the stack

     if (input == "+"){
         int a = stack.pop();
         int b = stack.pop();
         int c = a + b;
         stack.push(c);
     } //pops the first two things off the stack, adds them, and pushes the result

     if (input == "-"){
        int a = stack.pop();
        int b = stack.pop();
        int c = a - b;
        stack.push(c);
     } //pops the first two things off the stack, subtracts them, and pushes the result

     if (input == "*"){
        int a = stack.pop();
        int b = stack.pop();
        int c = a * b;
        stack.push(c);
     } //pops the first two things off the stack, multiplies them, and pushes the result

     if (input == ".s"){
         cout << stack.count();
     } //returns the size of the stack

     if (regex_match(input, "[0-9]")){
         int num;
         stringstream convert(input);
         convert >> num;
         stack.push(num);
     } //This is the part with the error!!! 

}

先ほど言ったように、入力が数値かどうかを確認し、数値の場合は文字列を int に変換してスタックにプッシュします。私は以前に正規表現を扱ったことがありますが、それは久しぶりで、Python でした (C++ は初めてです)。私の regex_match が正しく定式化されていないことは知っていますが、それを正しくする方法について誰かアドバイスや、読むべきリソースの提案はありますか?

4

2 に答える 2

2

整数のように見えるかどうかを確認してから、整数に変換しないでください。むしろ、それを整数に変換して、それが機能するかどうかを確認してください。使用std::stoi(またはstolまたはstoll、期待する数値の大きさに応じて) (in <string>):こちらを参照してください。

文字列を指定されたサイズの整数に変換できない場合は、例外がスローされるため、その関数を a 内で実行する必要がありますtry。(あなたが pythonista なら、そのスタイルはよく知られているはずです。)

また、数字があったが、文字列全体を占めていない場合 (つまり、末尾のゴミ)、size_t2 番目の引数のポイントは、最初の未使用文字のインデックスに設定されます。 string は数値であるため、返されたインデックスが入力文字列のサイズであることも確認する必要があります。

strtol標準ライブラリによってスローされたものであっても、例外に不快感を覚える場合は、基礎となる標準の c 関数やその仲間を使用することができます。それらは同様のインターフェースを持っていますが、設定と組み合わせた任意の値の戻り値を使用して、errno失敗を伝えようとします。個人的には、例外インターフェイスの方が手間がかからないと思いますが、いつものように、好みはさまざまです。

于 2013-09-26T23:43:30.043 に答える