[英]C++ -- need help figuring out a while loop issue
所以,需要一些关于为什么这个循环永远循环的方向。 我想要它做的是读取一个新的 m,然后设置 for 循环的条件。 因此,它读取 m,然后将其计算为一个数组,然后读取一个新的 m,等等。目前它读取一个 m 并永远执行 for 循环。
while(inputFile >> m) {
while (m != 0) {
cout << "m=" << m << endl;
for (i=0; i < (m*m); i++) {
cout << "m times m = " << (m*m) << endl;
for (ROW=0; ROW < m; ROW++) {
inputFile >> image[ROW][COL];
cout << "array= " << image[ROW][COL] << endl;
for (COL=0; COL < m; COL++) {
inputFile >> image[ROW][COL];
cout << "array= " << imagee[ROW][COL] << endl;
}
}
}
}
}
}
输入文件示例:
3
1 2 3
4 5 6
7 8 9
如果您稍微清理一下代码,您会发现不会出现无限循环:
while(inputFile >> m) {
while (m != 0) {
...
可以组合成这样:
while(inputFile >> m && m != 0) {
现在一旦for-loop
s 完成,另一个m
将从inputFile
读取。
让我们检查一下为什么它以前不起作用。 假设inputFile
提取了 4 并将其绑定到m
。
while(4 != 0)
始终为真,因此这是无限循环。 在此之后inputFile
再次从inputFile
读取m
。
或者你可以写
while(inputFile >> m) {
if (m != 0) {
...
这将保证处理整个文件,跳过值 0。
编辑
阅读m
后,您需要使用inputFile.get()
使用换行符。
我编写了一个小驱动程序来向您展示如何执行此操作,但是我使用了std::vector
而不是数组 - 它们更易于使用。
这是读取两个数组的ideone 。
代码:
#include <iostream>
#include <sstream>
#include <string>
#include <istream>
#include <vector>
void output_matrix(const std::vector<std::vector<int > > arr, size_t m) {
std::cout << "Matrix we read in was: " << std::endl;
for(size_t i = 0; i < m; ++i) {
for(size_t j = 0; j < m; ++j) {
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}
}
void read_matrix(std::istream &in) {
size_t m = 0;
while(in >> m && m > 0) {
std::vector<std::vector<int > > arr(m);
// Swallow the newline after reading in `m`.
in.get();
std::string line;
for(size_t i = 0; i < m; ++i) {
arr.resize(m);
/*
`std::getline` will swallow newlines in other lines until `m`
needs to be read again.
*/
std::getline(std::cin, line);
std::stringstream ss(line);
for(size_t j = 0; j < m; ++j) {
arr[i].resize(m);
int temp = 0;
ss >> temp;
arr[i][j] = temp;
}
}
output_matrix(arr, m);
}
}
int main() {
read_matrix(std::cin);
return 0;
}
问题在这里:
while(inputFile >> m) {
while (m != 0) {
你有一个读入m
的外循环,你有一个内循环,当m
为 0 时结束。问题是外循环的条件在内循环完成之前不会再次检查。 内部循环永远不会完成,因为读入m
,这恰好也是外部检查永远不会到达。
一般来说,如果你有loop1和loop2,loop2是loop1的内循环,那么loop2是通过loop1到达的,但是一旦到达loop2,就必须在检查loop1的条件之前完成。 如果 loop1 未完成,则 loop2 将重新启动,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.