2017-08-28 58 views
2

我遇到問題,我需要查找代碼如何顯示在文件中。 問題是,在這個文件中的代碼可能會出現多次,我只需要考慮一個。如何在文件中查找非重複字符串

我試着寫計數代碼是如何在文件中的函數(丟棄重複的代碼):

int calcolo (struct sistema *sis,int l) { 
    char nome[l][6]; 
    int i=2,a=1,h; 


    strcpy(nome[1],sis[1].codice); 
    h=1; 

    while(i<l) { 
     for(a=1;a<=h;a++) { 
      if(strcmp(nome[a],sis[i].codice)==0) { 
       i++;  
       break; 
      } 
     } 

     h++; 
     strcpy(nome[h],sis[i].codice); 
     i++;  

    } 
    return h; 
} 

輸入文件是:

2015-03-03 07:01 X100 8.1 
2015-03-04 08:02 X100 15.2 
2015-03-18 13:15 X100 31.9 
2015-08-02 13:10 B209 32.0 
2015-08-15 12:01 B209 35.4 
2016-01-02 10:44 A101 8.1 
2016-02-02 15:41 X100 13.2 

我不知道如何如果我沒有識別出任何重複的字符串,就「繞過」這段時間的第二部分。 所以結果是3代表樹代碼(X100 B209 A101),但我收到5,爲什麼?

+5

在一個(可能)不相關的筆記上,你*知道數組索引是基於零?即第一個元素的索引爲'0'。 –

+1

你顯示輸入文件(這很好,許多求助者不這樣做),但你也應該告訴我們預期的輸出,這會使問題更清楚。你應該讀這個:[mcve] –

+0

給OP的答案,但問題寫得很差,或者他們希望你逐字寫出答案,我downvoted。根本不值得回答 –

回答

0

我找到了答案,我知道這是不使用轉到一個更好的辦法,但我需要跳過代碼的第二部分,我已經「解決」它:

int calcolo (struct sistema *sis,int l) { 
    char nome[l][6]; 
    int i=2,a=1,h; 


    strcpy(nome[1],sis[1].codice); 
    h=1; 

    BACK: 
     while(i<l) { 
      for(a=1;a<=h;a++) { 
       if(strcmp(nome[a],sis[i].codice)==0) { 
        i++; 
        goto BACK; 
       } 
      } 
      h++; 
      strcpy(nome[h],sis[i].codice); 
      i++; 

     } 
    return h; 
} 

輸出: 獲得3 - 預期3

我寧願不要使用goto那麼如果有人腦子裏想一些其他的解決路徑,讓我知道了,謝謝大家

0

把每一個新的字符串轉換成一組。然後你使用這樣的:

set<string, FOO>::iterator it = set.find("X100"); 
if(it != set.end()) // if "X100" was not found 
     ... 
+1

對不起,但'set'在C?! 我認爲這隻適用於C++ – Fabio

+0

https://github.com/avsej/hashset.c檢查這裏,是的,我沒有看標籤後看到「C」而不是「C++」 –

+1

感謝它可能是有用的 – Fabio

相關問題