1

Eclipse を使用して C++ で次の関数を使用して、文字列入力が有効かどうかをテストしようとしています。

#include <string>

bool testLegal::checkData(std::string &input, int &reg) {

    //test to see if pitchnames are legal

    std::string toneClasses = "CDEFGAB";
    std::string accidentals = "#b";
    std::string toTest;

    try {
        //TEST 1 IS the pitch name legal?
        toTest = input.substr(0, 1);
        if (_isLegal(toTest, toneClasses) == false)
            throw dataClean(2, "The pitch name you entered is illegal. Please correct it!");

        //TEST 2 to see if there is a second character in the pitch name and whether it is a sharp or flat
        toTest = input.substr(1);
        if (input.length() == 2 && _isLegal(toTest, accidentals) == false)
            throw dataClean(3, "The second character in the pitch name must be a sharp or flat");

    } catch (const cExceptions& e) {    
        throw dataClean(4, "There is an error in the data you inputed. Please re-enter");
    }
    return true;
}

ただし、.substr のパラメーターに関して「無効な引数」エラーが発生します。私は成功せずにさまざまな解決策を試しました。不思議なことに、関数は Netbeans と Codelite の両方で問題なく実行されます。これを解決する方法についてのアイデアに感謝します。期待してThx...

4

3 に答える 3

2

NDKを使用している場合、部分文字列を使用してEclipseで同様の問題が発生しました。整数をstring::size_typeにキャストする必要がありました

string twoLetters = hexStr.substr((string::size_type)i,(string::size_type)2);
于 2013-06-11T09:31:19.063 に答える
0

入力に十分な文字が含まれていることを確認するチェックが表示されません。文字列のサイズを超える部分文字列を取得しようとすると、引用されたエラーが発生する可能性があります。同様に、無効なインデックスから開始すると、この問題も発生する可能性があります。inputつまり、あなたはたまたま空っぽだと思います。追加してみてください:

if (input.empty()) {
    throw std::runtime_error("received an empty string");
}
于 2012-09-30T17:03:28.637 に答える
0

これは、Eclipse CDT用に修正した方法です。プロパティを開き、パスとシンボルセクションに移動します。C++ コードの残りの部分が正常に動作している場合は、C++ ヘッダー ファイルをインクルードするための何らかの行がある可能性があります。たとえば、私の Mac では次のようになります。

/usr/include/c++/4.2.1

ここで、「tr」サブディレクトリも含む新しいエントリを追加します。

/usr/include/c++/4.2.1/tr

その後、インデックスを再構築すれば完了です。

于 2016-03-03T18:09:20.203 に答える