在C++

2017-06-14 113 views
6

比較CHAR這是我從在C++

10 
wood  8 
gold  7 
silver 5 
gold  9 
wood  1 
silver 1 
silver 9 
wood  3 
gold  5 
wood  7 

獲取數據我的文本文件,我應該找產品具有相同的名稱,並添加所有它們的量,所以最終的結果應該是木= 19;金= 21;銀= 15。這是我做的,到目前爲止

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    ifstream read("data.txt"); 
    int n; 
    read >> n; 
    char name[10][n]; // 10 symbols are given for items name 
    int amount[n]; 
    for(int i=0; i<n; i++) 
    { 
    read.ignore(80, '\n'); 
    read.get(name[i], 10); 
    read >> amount[i]; 
    } 

for(int i=0; i<n; i++) 
{ 
    for(int d=1; d<n; d++) 
    { 
    if(name[i]==name[d] && i!=d) 
    { 

    } 
    } 
} 
    return 1; 
} 

問題至今是name[i]==name[d]沒有反應,甚至是例如name[i]="wood"name[d]="wood"

+6

使用'std :: string'代替'char []',你的理智會感謝你。 – NathanOliver

回答

6

在C++中,我們傾向於使用std::stringchar[]。第一個是等於操作符重載,因此你的代碼應該工作。有了後者,你需要strcmp()來實現你的目標。

現在你的代碼可能是這樣的(我用的std ::矢量,但您可以使用字符串數組,但我不建議這樣做):

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

using namespace std; 

int main() 
{ 
    ifstream infile("data.txt"); 
    int n; 
    infile >> n; 
    vector<string> name(n); 
    int amount[n], i = 0; 
    while (infile >> name[i] >> amount[i]) 
    { 
     cout << name[i] << " " << amount[i] << endl; 
     i++; 
    } 
    // do your logic 
    return 0; 
} 

順便說一句,你可以使用std::pair,使您的代碼更具可讀性,其中第一個成員是名字,第二個是數量。


無關您的問題,main()趨於return 0;時,一切都很好,而你返回1

PS:這裏是一個工作示例:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <utility> 

using namespace std; 

int main() 
{ 
    ifstream infile("data.txt"); 
    int n; 
    infile >> n; 
    vector<string> name(n); 
    int amount[n], i = 0; 
    while (infile >> name[i] >> amount[i]) 
    { 
//  cout << name[i] << " " << amount[i] << endl; 
     i++; 
    } 


    vector< pair<string, int> > result; 
    bool found; 
    for(int i = 0; i < name.size(); ++i) 
    { 
     found = false; 
     for(int j = 0; j < result.size(); ++j) 
     { 
      if(name[i] == result[j].first) 
      { 
       result[j].second += amount[i]; 
       found = true; 
      } 
     } 
     if(!found) 
     { 
      result.push_back({name[i], amount[i]}); 
     } 
    } 

    cout << "RESULTS:\n"; 
    for(int i = 0; i < result.size(); ++i) 
     cout << result[i].first << " " << result[i].second << endl; 
    return 0; 
} 

輸出:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++0x main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
RESULTS: 
wood 19 
gold 21 
silver 15 
+0

如何從文件中讀取字符串?我得到'錯誤:沒有匹配函數調用'std :: basic_ifstream :: get(std :: string&,int)'在'read.get(name [i],10)'行;'如果我改變了char串起來。 –

+0

@MahigYahok檢查我的更新! =)有幫助嗎? – gsamaras

+0

問題是,我現在正在爲我的學校考試做準備,我不知道我們是否會被允許使用額外的庫,所以我寧願學習如何讓這些代碼在沒有他們的情況下工作 –

0

您正在使用的char [] ==運算符正在比較指針值,而不是字符串比較值。即你正在比較內存中第一個字符的位置。作爲一個附註,char name [10] [n];是無效的;因爲n必須是編譯時間常量。我會建議std :: vector作爲替換。

1

好了,GCC是知道要接受它,但變長數組是不是在C++的支持,所以這行:

char name[10][n]; // 10 symbols are given for items name 

是不符合的,應給予至少一個警告。

C++處理維數僅在運行時已知的數組的方法是使用std::vector

但你真正的問題是,無論是原始字符數組,也不是一個字符指針有一個被覆蓋的==操作(這是不可能的數組或指針),所以在你name[i]==name[d]你實際上是比較地址,因爲數組衰變在表達式中使用指向它們的第一個元素的指針。所以你的測試和if (&name[i][0] == &name[d][0)一樣,不能給出預期的結果。

您可以使用strcmp來比較空終止字符數組(也稱爲C字符串)或更好地使用std::string,它具有過分的==運算符。

0

如果你只是想添加數字,那麼你可以使用unordered_map。它類似於java中的哈希表。