簡體   English   中英

C++ -- 需要幫助解決一個 while 循環問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM