2010-08-18 103 views
0

好日子全部, 我有兩個數組,我想將第一個數組中的某些數據複製到第二個數組而不在第二個數組中重複任何值有人告訴我我不在這裏。將一個數組的某些內容複製到另一個數組而不重複所包含的數據

#include <stdio.h>   
#include <stdlib.h>   
#include <string.h> 

main() 
{ 
    char *hours; 
    char *strl; 
    hours = {0,0,0,0,1,1,2,2,2,5,5,10,10,10,10,10,.,.,.,23}; 

    strl=calloc(100,sizeof(char)); 

    sprintf(strl, "%d", hours); 

    if(strcmp(strl, hours)) 
    { 
     if(*strl) 
      strcpy(strl,hours); 
    } 
    printf("%s ",strl; 
} 
+0

你的源數組是否總是排序? – sje397 2010-08-18 14:07:56

+1

這是什麼,我什至不是。請正確縮進您的代碼示例,並解釋您的想法。 – Sjoerd 2010-08-18 14:09:48

+1

然後,因爲這不是你的第一個問題,所以你應該知道你應該給出沒有錯誤和沒有警告的編譯代碼。然後,有人可能願意討論。 – 2010-08-18 14:11:08

回答

0

首先,你有兩個字符數組。現在,在C中,字符數組通常用於存儲字符串,但是你並沒有這樣做。這些根本不是字符串,所以忘記了庫中的所有字符串函數。

你實際上有兩個微小整數數組,所以你像處理int數組一樣處理它們。

#include <stdio.h>   
#include <stdlib.h>   

int main() 
{ 
    char *hours; 
    char *strl; 
    int i; 
    int j; 
    char last; 
    /* I'm going to assume the the values in hours are sorted. */ 
    hours={0,0,0,0,1,1,2,2,2,5,5,10,10,10,10,10,.,.,.,23} 

    strl=calloc(100,sizeof(char)); 

    j = 0; 
    last = hours[0]; 
    for(i=1; i < 100; ++i) // I'm going to assume hours has 100 items 
    { 
     if (hours[i] != last) 
     { 
      strl[j++] = last; 
      last = hours[i]; 
     } 
    } 
    strl[j++] = last; // UPDATE (Thanks, Matthew) 
} 

/* printf("%s ",strl; 
    You'll need a different way of printing you results */ 
} 
+0

-1,如果init語法正確,他肯定會有'char'數組。足夠小的'int'直接轉換爲'char'沒有問題。 – 2010-08-18 14:14:28

+0

@詹姆斯,詹姆斯是對的。如果沒有NUL終止的數組,你可以*不使用字符串函數。他的陣列以23結尾,而不是NUL。 – 2010-08-18 14:15:19

+0

你有一個錯誤的錯誤。 'hours'的最後唯一值(23這裏)不會被複制。 – 2010-08-18 14:19:06

0

你可能想要做更多的東西一樣:

char *dst = strl; 
char *cur = hours; 
char prev = '\0'; 
while(*cur) { 
    if(*cur != last) { 
    prev = *dst = *cur; 
    dst++; 
    } 
    cur++; 
} 

哦,是啊,但其它人指出的那樣,你的陣列不與'\0'終止,因此,標準的字符串函數不工作(和對於這個問題,我的循環也不會)。

第二個沒有標準C庫函數做你想做的事......我會留給你來修復我的循環。 (注意它只在數組排序後才起作用)

+0

你假設一個NUL終止的字符串 - 實際上,這裏零開始... – 2010-08-18 14:17:30

0

正如James所說,你不能使用字符串函數,因爲你的數組不是NUL終止的。即使可以,strcmp總是返回非零(特別是負值),並且*strl將始終爲0,這意味着inner如果總是失敗。最後strcpy不會消除任何重複。如果您的數組已排序,則可以通過檢查重複的連續值來完成此操作。否則,您可以使用像GHashTable這樣的散列集/散列表。

+0

謝謝大家,你們真的是我真的花了一些時間在這個,不知道,我真的是這個標誌。 – chriscol 2010-08-19 10:13:57

相關問題