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 回答