2016-08-11 117 views
0

相同字符我有兩個字符串:C:兩個字符串

char *str1 = "this is a test"; 
char *str2 = "ts bd a"; 

我試圖寫一個返回與兩個字符串相同字符的新字符串沒有重複(也「功能」是重複)。例如:

char *retStr = GetSameChars(str1, str2); //returns "ts a"; 

我該怎麼做?

我正在嘗試:

char *GetSameChars(char str1[], char str2[]) { 
    int found = -1, i , j = 0, biggest, index = 0; 
    char *retArr, *star = '*'; 
    int str1Len, str2Len, count = 0; 
    str1Len = strlen(str1); 
    str2Len = strlen(str2); 
    biggest = str1Len > str2Len ? str1Len : str2Len; 

    retArr = (char *)malloc(sizeof(char) * count); 

    for (i = 0; i < str1Len; i++) { 
     for (j = 0; j < str2Len; j++) { 
      if (str1[i] == str2[j] && found == -1) { 
       count++; 
       found = j; 
      } else 
      if (str2[j] == str2[found]) 
       str2[j] = star; //Throw an exception 
     } 
     found = -1; 
    } 

    retArr = (char *)malloc(sizeof(char) * count); 
    j = 0; 

    for (i = 0; i < str2Len; i++) 
     if (str2[i] != '*') 
      retArr[j++] = str2[i]; 

    for (i = 0; i < str2Len; i++) 
     printf("%c", retArr[i]); 
} 

當我想我得到了一個異常的行str2[j] = star;

我的錯誤是什麼?

+2

你嘗試過這麼遠嗎?你的代碼如何工作,或不工作?當你打電話給你的功能是什麼結果呢?你期望的結果是什麼?最重要的是,*你能顯示你的函數*的代碼嗎?請[閱讀關於如何提出好問題](http://stackoverflow.com/help/how-to-ask),並學習如何創建[最小,完整和可驗證示例](http:// stackoverflow。 COM /幫助/ MCVE)。 –

+0

@JoachimPileborg,查看更新。 – CSharpBeginner

+1

我想你的編譯器應該抱怨'str2 [j] = star;'行。你正在試圖將'char *'類型賦值爲'char'類型。'star'只是一個字符,將其定義更改爲'char star ='*';' – yano

回答

0

您的代碼抱怨,因爲你正嘗試將指針賦值給一個char,得到你需要使用*運算符,就像這樣裏面的指針值:

*star; 

一個很好的方式來檢查,如果字母已經出現了(如果你想在所有的ASCII表上使用它,那麼128)就是使用查找表。首先你需要聲明一個陣列中的所有字母的長度在字母表像這樣:

char lut[26]; 

如果它是一個全局變量,然後它會被設置爲0,那麼所有你需要做的就是到你得到的char的索引並將其標記爲1,一個簡單的if將稍後能夠確定一個字母是否已經出現。 例如:

lut[toupper(somechar) - 'A'] = 1; 

在這個例子中,你設置在查找表中的字符等同於somechar變量1,這標誌着它已經出現了。

希望這有助於。

2

我的建議是:保持簡單;瞭解C標準庫;少寫,多測試。

您的代碼的一些特定問題:您將錯誤的變量傳遞給malloc();你估計的答案適合兩個弦中較大的弦的大小,但它實際上會適合兩個弦中的較小者;您修改參數字符串str2[j] = star - 您應該將參數視爲只讀;你malloc()retArr兩次不必要的,當你分配第二個泄漏第一個;你的算法根本行不通。

雖然查找表,如其他人所說,將更有效率,讓我們使用標準庫例程strchr()來解決這個問題:

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

char *getSameChars(const char *string1, const char *string2) { 

    size_t string1_length = strlen(string1); 
    size_t string2_length = strlen(string2); 
    size_t shortest = string1_length < string2_length ? string1_length : string2_length; 

    char *common_pointer, *common = malloc(shortest + 1); 

    *(common_pointer = common) = '\0'; 

    for (size_t i = 0; i < string1_length; i++) { 
     // character found in both input strings, but not yet in common string 
     if (strchr(string2, string1[i]) != NULL && strchr(common, string1[i]) == NULL) { 
      *common_pointer++ = string1[i]; 
      *common_pointer = '\0'; 
     } 
    } 

    return common; 
} 

int main() { 
    char *stringA = "this is a test"; 
    char *stringB = "ts bd a"; 

    char *result = getSameChars(stringA, stringB); 

    printf("%s\n", result); 

    free(result); 

    return(0); 
} 
+1

'index'不是使用'strchr'而不是'index'的標準庫的函數。 – BLUEPIXY

+0

謝謝@BLUEPIXY,感謝您的糾正,這很諷刺。 – cdlane