本文介绍了循环外的语句重复c++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试像编译器一样从用户的输入中读取令牌。
标记化运行良好,但在输出所有标记时,我希望在它们全部发出后换行。
以下是我的代码:
#include
#include
输入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++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持吉威生活!
[英文标题]Statement outside of loop gets repeated c++
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,如有侵权,请联系QQ:330946442删除。