我正在编写一个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码,但也无效。
提前感谢您的帮助。
答案 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_of
和std::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;
}