Statement outside of loop gets repeated c++(循环外的语句重复c++)
本文介绍了循环外的语句重复c++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试像编译器一样从用户的输入中读取令牌。 标记化运行良好,但在输出所有标记时,我希望在它们全部发出后换行。
以下是我的代码:
#include <iostream>
#include <map>
#include <vector>
//import for using std::getline()
#include <string>
//DIGITs
const std::string DIGITS = "0123456789";
const std::string WHITESPACE = "
";
//TOKENS
const std::string TT_INT = "INT";
const std::string TT_FLOAT = "FLOAT";
const std::string TT_PLUS = "PLUS";
const std::string TT_MINUS = "MINUS";
const std::string TT_MUL = "MUL";
const std::string TT_DIV = "DIV";
const std::string TT_LPAREN = "LPAREN";
const std::string TT_RPAREN = "RPAREN";
const std::string TT_INVALID_NUMBER = "INVALID_NUMBER_LITERAL";
class Token{
public:
std::string type;
std::string value;
void repr(){
std::cout << type << ":" << "value" << "
";
}
};
class Lexer{
public:
std::string text;
int position = -1;
std::string current_char;
void advance(){
this->position += 1;
this->current_char = this->text[this->position];
}
void make_digit(std::string *type, std::string *value){
//if its number or floating point
std::string digit = "";
int is_float = 0;
while(DIGITS.find(this->current_char) != std::string::npos || this->current_char == "."){
digit += this->current_char;
if(this->current_char == "."){
is_float += 1;
}
this->advance();
}
*value = digit;
if(is_float == 0){
*type = TT_INT;
} else if((0 < is_float) && (is_float < 2)){
*type = TT_FLOAT;
} else {
*type = TT_INVALID_NUMBER;
}
}
std::vector<std::string> make_tokens(){
std::vector<std::string> tokens;
this->advance();
while (!(this->text.length() <= this->position))
{
if(WHITESPACE.find(this->current_char) != std::string::npos){
//dont add a token
this->advance();
} else if(DIGITS.find(this->current_char) != std::string::npos){
std::string type;
std::string value;
this->make_digit(&type, &value);
tokens.push_back(type);
tokens.push_back(value);
} else if(this->current_char == "+"){
tokens.push_back(TT_PLUS);
tokens.push_back(this->current_char);
this->advance();
} else if(this->current_char == "-"){
tokens.push_back(TT_MINUS);
tokens.push_back(this->current_char);
this->advance();
} else if(this->current_char == "*"){
tokens.push_back(TT_MUL);
tokens.push_back(this->current_char);
this->advance();
} else if(this->current_char == "/"){
tokens.push_back(TT_DIV);
tokens.push_back(this->current_char);
this->advance();
} else if(this->current_char == "("){
tokens.push_back(TT_LPAREN);
tokens.push_back(this->current_char);
this->advance();
} else if(this->current_char == ")"){
tokens.push_back(TT_RPAREN);
tokens.push_back(this->current_char);
this->advance();
} else {
//nothing
this->advance();
}
}
return tokens;
}
};
int main(){
//previous: true
while(std::getline(std::cin, input)){
std::string input;
//previous: std::cin >> input;
//fix
std::getline(std::cin, input);
Lexer mylexer;
mylexer.text = input;
int x = 0;
std::vector<std::string> output = mylexer.make_tokens();
for (int i = 0; i < output.size(); i += 2){
std::cout << output.at(i) << ":" << output.at(i + 1) << std::endl;
}
std::cout << "
";
}
};
输入1+2时
我所期望的
1 + 2
INT:1
PLUS:+
INT:2
here is the cursor
我得到的
1 + 2
INT:1
PLUS:+
INT:2
here is the cursor
当删除末尾的换行符时,我会得到这样的结果,但当输入第二个输入行时,它们都在一起,没有空行,这不是我想要的
1 + 2
INT:1
PLUS:+
INT:2
here is the cursor
但我希望它看起来像这样
1 + 2
INT:1
PLUS:+
INT:2
3 + 4
INT:3
PLUS:+
INT:4
谁能解释一下这种奇怪的行为是什么? 我是不是遗漏了什么?请注意,我没有多少C++经验。 我在Windows上用clang-cl.exe编译。我还想知道当使用MSYS2 g++.exe编译时,Throw_Bad_ARRAY_NEW_LENGTHV错误意味着什么
推荐答案
输出中出现额外换行符的原因是您正在使用operator>>
读入input
。
operator>>
一次仅读取一个单词。遇到空格时停止读取。
1 + 2
作为输入时,您最终调用make_tokens()
,只将第一个单词1
作为mylexer.text
,然后您的循环打印出INT:1
后跟一个换行符,然后在循环退出后打印出另一个换行符。然后,读入下一个单词+
,对其进行标记化,然后打印出PLUS:+
,后跟2个换行符。然后读入下一个单词2
,对其进行标记化,然后打印出INT:2
,后跟2个换行符。
改用std::getline(std::cin, input);
。然后,您将在一次对make_tokens()
的调用中将整个输入1 + 2
标记化,然后您将打印出预期的输出类型-所有3个标记,它们之间有一个换行符,然后在结束之后再打印一个换行符。
附注:您不应该使用
while(true)
循环,尤其是在忽略std::cin
是否成功阅读的情况下。您将导致可能导致代码崩溃的无限循环。当没有更多要读取的输入时,应使用std::cin
的错误状态停止循环,例如:
std::string input;
while (std::cin >> input){
// use input as needed...
}
或者,如果是std::getline()
:
std::string input;
while (std::getline(std::cin, input)){
// use input as needed...
}
这篇关于循环外的语句重复c++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:循环外的语句重复c++
基础教程推荐
猜你喜欢
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01