- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要根据先前输入确定的可变数量的变量在一行中获取输入。
如果你在前面的函数中得到的输入是 1,代码会像这样
std::string istring;
std::getline(std::cin, istring);
std::istringstream stream(istring);
while (stream >> a)
{
statement;
}
是否可以为 while 循环创建一个根据您的输入内容而变化的条件?所以如果输入是例如 5,它会表现得像
while (stream >> a >> a >> a >> a >> a)
{
statement;
}
我试过 while ((stream>>a)*number)
但那不起作用
最佳答案
首先回答你的具体问题:
I need to get input in a line based on a modifiable number of variables that are determined from an earlier input.
C++ 中的解决方案是 istringstream
、while
循环和 vector
的组合:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int main() {
unsigned int earlierInput = 5; // this is the earlier input
std::vector<int> numbers; // The type of vector also controls what
// data type you want the user to give
// you. Because the stream will try to
// the user input into that type.
while (numbers.size() != earlierInput) {
// Here we ask the user for input and convert the input
// to a stream, like that we can try to convert the user
// input into the data type we want.
std::string istring;
std::cout << "Please type in " << earlierInput << " numbers: ";
std::getline(std::cin, istring);
std::istringstream reader(istring);
// read as many numbers as possible.
for (int number; reader >> number;) {
numbers.push_back(number);
}
if (numbers.size() != earlierInput) {
// if not enough numbers empty vector and print
// error message
std::cout << "Not the right amount of numbers!";
std::cout << "Try again!" << std::endl;
numbers.clear();
}
}
// If we get here the user typed in the right amount of numbers
std::cout << "You typed the following numbers:" << std::endl;
for (const int& i : numbers) {
std::cout << i << std::endl;
}
}
这仅适用于一次用户输入。如果您想询问用户任意次数来执行此操作(例如,您想询问用户 10 次以获取 5 个数字),那么您需要再次应用上述规则,这样叠加起来:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int main() {
unsigned int amountOfInputs = 2; // this is the amount of times
// you want the user to type
// something in
unsigned int earlierInput = 5; // this is the earlier input
std::vector<std::vector<int>> allNumbers; // Now we need a vector in
// a vector to store the results.
// The type of the inner vector also
// controls what data type you want the
// user to give you.
while (allNumbers.size() != amountOfInputs) {
std::vector<int> numbers; // This is the vector as in the example
// above.
while (numbers.size() != earlierInput) {
// Here we ask the user for input and convert the input
// to a stream, like that we can try to convert the user
// input into the data type we want.
std::string istring;
std::cout << "Please type in " << earlierInput << " numbers: ";
std::getline(std::cin, istring);
std::istringstream reader(istring);
// read as many numbers as possible.
for (int number; reader >> number;) {
numbers.push_back(number);
}
if (numbers.size() != earlierInput) {
// if not enough numbers empty vector and print
// error message
std::cout << "Not the right amount of numbers!";
std::cout << "Try again!" << std::endl;
numbers.clear();
}
}
// If we get here the user typed in the right amount of numbers
// and we can save them and clear the array for using it again.
allNumbers.push_back(numbers);
numbers.clear();
}
std::cout << "You typed the following numbers:" << std::endl;
unsigned int round = 1;
for (auto numbersOfRound : allNumbers) {
std::cout << "For round " << round++ << ": ";
for (auto i: numbersOfRound) {
std::cout << i;
}
std::cout << std::endl;
}
}
要保存任意数量的数据并能够访问它,您必须使用动态分配的数组或类似的东西。这是因为在编译时您不知道在运行时需要多少变量,因此您无法为所有变量命名。
理论上,流可能是无限长的字符串或数据(另请参见 here )。因此,用户输入是一个 stream
,因为它在理论上可能是无限长的。尽管这在实践中并不适用。
要从流中提取信息,必须使用 >>
运算符,也称为提取运算符。如文档 here 中所述,此运算符不支持将 vectors
作为 (rhs) 操作数.它仅支持基本数据类型(这就是为什么我们在上面的示例中需要一个临时变量 int number
)。
关于c++ - 修改 istringstream 中的变量数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184179/
以下是我的代码的简化版本: #include #include #include int main() { std::istringstream f; f.clear();
我想在检测到某个子字符串后输出每一行。不知何故,我得到了 iss 的五倍输出。这是我的代码: //load all data from txt string data;
当我尝试使用 istringstream 从输入中提取有效数字时,我从 istringstream 得到以下错误行为: 例如: void extract(void) { double x; strin
由于使用 atoi 和 atof,我正在尝试修复 Coverity 关于污染值的一些发现。我切换到 istringstream,但它没有为 10 以外的基产生预期结果。 如果我切换到 16 进制,输入
我无法让 istringstream 在如下所示的 while 循环中继续。数据文件也如下所示。我使用输入文件中的 getline 获取第一行并将其放入 istringstream lineStrea
我正在尝试编写一个 C++ opengl 应用程序来加载 .OBJ 文件,我使用这段代码来读取顶点: char buf[256]; while(!objFile.eof()) { objFil
我正在使用 istringstream 来分解字符串的标记。假设我有这样一个字符串: print "this is a test" 它将它分成 5 个标记: print | "this | is |
我正在使用以下代码将输入字符串转换为 float : template T parseString(const std::string &s) { T val; std::istri
我遇到一个问题,istringstream 没有存储它读取的值。这是我所拥有的: if(inputFile.good()){
我有这段代码: if(flag == 0) { // converting string value to integer istringstream(temp) >> value ; value =
所以我从文件中读出行,然后通过 stringstream 读出这些行。 我发现问题是由于行的格式很少将 2 个单独的部分写在一起并作为一个字符串一起读取。我试图通过将错误的读取值放回流中并再次读取来解
我有一串数字。我正在尝试使用 istringstream 将其打印为字符串中每个单个数字的 int 类型。如果将整个字符串作为参数传递给 main 中的转换函数,它工作正常,但如果我按索引传递它,则会
我有一个代码,用于读取行中存储有 float 的文件,如下所示:“3.34|2.3409|1.0001|...|1.1|”。我想使用 istringstream 阅读它们,但它并不像我期望的那样工作:
这个: #include #include #include using namespace std; int main (void) { istringstream iss("123
我有这样的输入:(50.1003781N, 14.3925125E) 存储在 const string & input 中。我想要做的是提取括号,获取代表 GPS 坐标的数字 - 50.1003781
我有一个文件: a 0 0 b 1 1 c 3 4 d 5 6 使用istringstream,我需要得到a,然后是b,然后是c,等等。但是我不知道该怎么做,因为网上和我的书中都没有很好的例子。 到目
因此 istringstream 在初始化时复制字符串的内容,例如 string moo("one two three four"); istringstream iss(moo.c_str());
在尝试用我的代码回答另一个问题时,我发现以下代码无法编译 #include #include #include #include using namespace std; // (main o
您好,我想问一下如何从一个字符串中解析多个由“/”和空格分隔的 float 。 文件中的文本格式为“f 1/1/1 2/2/2 3/3/3 4/4/4”我需要将这行文本中的每个整数解析为几个 int
#include #include #include #include #include void reverse_words(const std::string &file) {
我是一名优秀的程序员,十分优秀!