簡體   English   中英

與 char 比較的二維數組

[英]2d array comparing with char

我有一個從文件中讀取數據的數組,數據是二進制數字,例如 010011001001 和許多其他數字,因此數據是我讀入二維數組的字符串,但我堅持將數組的每個值與 0 進行比較。任何幫助將不勝感激。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string myArr[5000][12];
    int i = 0, zeroCount = 0, oneCount = 0;
    
    ifstream inFile;
    inFile.open("Day3.txt");
    
    while(!inFile.eof())
    {
        for(int i = 0; i < 5000; i++)
        {
            for(int j = 0; j < 12; j++)
            {
                inFile >> myArr[i][j];
                j++;
            }
            i++;
        }   
    }
    
    for(int j = 0; j < 12; j++)
    {
        for(int i = 0; i < 5000; i++)
        {
            if(myArr[i][j].compare("0") == 0)
            {
                zeroCount++;
            }
            else
            {
                oneCount++;
            }
            i++;
        }
        
        if(zeroCount > oneCount)
        {
            cout << "Gamma is zero for column " << i << endl;
        }
        else
        {
            cout << "Gamma is One for column " << i << endl;
        }       
        j++;
    }
}

來自文本文件的一些輸入:010110011101 101100111000 100100000011 111000010001 001100010011 010000111100

感謝您編輯您的問題並提供更多信息。 現在,我們可以幫助您。 你有兩個主要的誤解。

  1. for 循環是如何工作的?
  2. C++ 中的std::string是什么

讓我們從 for 循環開始。 您可以在此處的 CPP 參考中找到解釋。 或者,您也可以查看此處顯示的教程。

for 循環基本上有 3 個部分: for (part1; part2; part3) 都是可選的,你可以用,但沒必要用。

  • part1 是初始化語句。 在這里您可以聲明/定義/初始化一個變量。 在您的情況下,它是int i = 0 您定義一個數據類型為 int 的變量並將其初始化為 0
  • 第 2 部分是條件。 循環將運行,直到條件變為假。 條件將在循環開始時檢查。
  • part3 就是所謂的迭代表達式。 這個詞有點誤導。 它基本上是在循環結束時執行的語句,在執行下一個循環運行之前以及再次檢查條件之前。

在偽代碼中是這樣的:

{

    init-statement
    while ( condition ) {

        statement
        iteration-expression ;

    } 
} 

這意味着對於您的部分代碼for(int j = 0; j < 12; j++)

{

    int j = 0;                 // init-statement
    while ( j < 12 ) {         // while ( condition ) {

       inFile >> myArr[i][j];  // Your loop statements
       j++;                    // Your loop statements  PROBLEM

       j++;                    // iteration-expression from the for loop
    } 
} 

現在你看到了問題。 不幸的是,您將“j”增加了兩次。 你不需要這樣做。 for循環的最后部分 3 已經為您完成了這項工作。

所以請刪除重復的增量語句。


接下來, std::string

字符串,顧名思義,是一串字符,或者在編程語言的上下文中,是一個字符數組。

在 C 中,我們實際上寫的是char[42] = "abc"; . 所以使用真正的字符數組。 問題始終是這樣一個字符串的固定長度。 這里以 42 為例。在這樣的數組中,您只能存儲 41 個字符。 如果字符串更長,那么它就無法工作。

C++的發明者解決了這個問題。 他們創建了一個動態字符數組,一個可以根據需要增長的數組。 他們稱這個東西為std::string 它沒有預定義的長度。 它將根據需要增長。

因此,寫string myArr[5000][12]; 說明你沒有完全理解這個概念。 您不需要[12] ,因為string已經可以容納 12 個字符。 所以,你可以刪除它。 他們的角色將隱含地在那里。 如果你寫inFile >> myString那么提取操作符>>將從 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 中讀取字符直到下一個空格,然后將它存儲在你的 myString 變量中,不管字符串有多長。

請閱讀有關字符串的本教程

這是 C-Style 字符串的一大優勢。

然后您的代碼可能如下所示:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string myArr[5000];
    int zeroCount = 0, oneCount = 0;

    ifstream inFile;
    inFile.open("Day3.txt");

    while (!inFile.eof())
    {
        for (int i = 0; i < 5000; i++)
        {
            inFile >> myArr[i];
        }
    }

    for (int i = 0; i < 5000; i++)
    {
        zeroCount = 0; oneCount = 0;
        for (int j = 0; j < 12; j++) 
        {

            if (myArr[i][j]== '0')
            {
                zeroCount++;
            }
            else
            {
                oneCount++;
            }
        }

        if (zeroCount > oneCount)
        {
            cout << "Gamma is zero for column " << i << endl;
        }
        else
        {
            cout << "Gamma is One for column " << i << endl;
        }
    }
}

但還有更多。 您對字符串數組使用幻數 5000。 你這樣做是因為你認為 5000 總是足夠大以容納所有字符串。 但是,如果不是呢? 如果您的源文件中有超過 5000 個字符串,那么您的代碼將會崩潰。

與字符 arrays 的字符串問題類似,我們在 C++ 中也有一個數組,可以根據需要動態增長。 它被稱為std::vector ,您可以在此處閱讀有關它的信息。 可以在此處找到教程。

有了它,您就可以完全擺脫任何 C 樣式數組。 但是請繼續深入學習 C++ 語言,你會越來越了解。

您的代碼中有更微妙的問題,例如while(.inFile.eof()) ,但這應該稍后解決。

我希望我能幫上忙

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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