String.at()不与字符''比较

时间:2016-10-24 19:56:05

标签: c++ string while-loop

我正在编写一个C ++函数,它接受“let_varname _ = _ 20”形式的字符串,然后它将隔离“varname”以使用我的名称变量名创建一个新字符串。我试图告诉.at()函数在遇到一个空格时停止迭代一个while循环(下划线是空格,我只是希望它非常清楚,有一个空格)。但是,它没有正确地比较它们,因为它完全没有停止(通过2个空格)到达字符串的末尾。

void store(std::string exp) {


int finalcount = 4;
char placeholder = ' ';
while (exp.at(finalcount)!=placeholder) {

    finalcount++;
}

for (int i = 0; i < exp.size(); i++) {
    std::cout << exp.at(i) << std::endl;
}


std::string varname = exp.substr(4, finalcount+1);

std::cout << finalcount + 1 << std::endl;
std::cout << varname << std::endl;


}

我从索引4开始,因为我知道teh字符串的索引0-3将是'l'''t'和''。打印陈述只是我检查它是什么阅读与我输入的内容(它正在阅读一切正常,只是没有正确比较)。我也尝试过我的while循环条件,而char是&gt; 65&amp;&amp; &lt; 90使用ASCII码,但也无效。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用const std::string test_data = "let varname = 20"; std::istringstream test_stream(test_data); std::string let_text; std::string var_name; char equals_sign; unsigned int value; test_stream >> let_text >> var_name >> equals_sign >> value; 并将字符串视为流:

std::string

这可能比您的代码容易得多。

编辑1:搜索字符串
您还可以使用find_first_of方法,find_first_not_ofstd::string::size_type position = test_data.find_first_of(' '); position = test_data.find_first_not_of(' ', position); std::string::size_type end_position = test_data.find_first_of(' '); let_text = test_data.substr(position, end_position - position);

for <variable> in <sequence> { ... }

答案 1 :(得分:1)

问题是您没有正确使用substr(),正如我在评论中提到的那样。另外,正如评论中提到的Pete Becker一样,您还应检查=并在到达字符串末尾时停止,以便在没有任何字符串时不会超出字符串更多的空间。此外,在确定子字符串长度时,您不希望将{1}添加到finalcount,因为那样您的子字符串将包含使检查失败的空格或=

试试这个:

void store(std::string exp) {
    const int start = 4;          // <-- Enter starting position here.
    const char placeholder_space = ' '; // Check for space.
    const char placeholder_equal = '='; // Check for equals sign, as pointed out by Pete Becker.

    int finalcount = start;       // <-- Use starting position.
    bool found = false;

    while (finalcount < exp.size() && !found) {
        if (!((exp.at(finalcount) == placeholder_space) ||
              (exp.at(finalcount) == placeholder_equal))) {
            finalcount++;
        } else {
            found = true;
        }
    }
    if (!found) {
        std::cout << "Input is invalid.\n"; // No ' ' or '=' found, put error message here.
        return;
    }

    for (int i = 0; i < exp.size(); i++) {
        std::cout << exp.at(i) << std::endl;
    }

    std::string varname = exp.substr(4, finalcount - start); // <-- Use starting position.

    std::cout << finalcount - start << std::endl; // Length of varname.
    std::cout << varname << std::endl;
}