2017-10-06 70 views
2

嗨,我有兩個不同的字符串,我需要找到字符串中的普通字符。我設法得到公共字符串,但我需要返回「空字符串」輸入不具有相同的字符。查找字符串中的常見字符

當前的問題:

輸入1:ABC
輸入2:DEF
輸出:'//它SHLD是 「空字符串」;

繼承人我的代碼:

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

void strInterset(char * str1, char * str2, char * str3); 

int main() { 
    char str1[50], str2[50], str3[50]; 

    printf("Enter str1: \n"); 
    scanf("%s", str1); 
    printf("Enter str2: \n"); 
    scanf("%s", str2); 
    strInterset(str1, str2, str3); 

    if (*str3 == '\0') 
     printf("strIntersect(): null string\n"); 
    else 
     printf("strIntersect(): %s\n", str3); 

    return 0; 
} 

void strInterset(char * str1, char * str2, char * str3) { 
    int i = 0, j; 
    for (i; *(str1 + i) != '\0'; i++) { 
     for (j = 0; *(str2 + j) != '\0'; j++) { 
      if (*(str2 + j) == *(str1 + i)) { 
       strcpy(str3, str1 + i); 
       str3++; 
      } 
     } 
    } 
} 
+1

什麼是你正面臨着與上面的代碼的問題?初始化str3 [50]爲空 – Karthick

+0

如果沒有公共字符,則str3是具有不確定值的非初始化變量。 –

+0

即使有通用字符,'str3'也不會被NUL終止 –

回答

1

原因是strInterset()只有在找到匹配的情況下才會調用strcpy(),並且不會修改str3或其指向的數據。解決方法是簡單的 - 前strInterset()循環添加語句

*str3 = '\0'; 

如果找到匹配,strcpy()仍然會被調用。如果不是,則在main()中完成的測試將成功。

main()中的數組初始化爲零也適用於strInterset()的FIRST調用。但它可能不適用於後續調用(除非在每次調用之前main()重新初始化str3)。因此,最好在strInterset()中進行初始化。

0

初始化你str3顯式地爲NULL,宣佈它像

char str3[50] = { NULL }; 

如果你不這樣做,它與垃圾/不確定值的unitialised陣列。

0

你應該初始化str3NULL,像這樣:

char str3[50] = {0}; 

,因爲如果你不這樣做,它仍將是一個未初始化數組,這意味着訪問時它會調用未定義行爲,因爲它的值是垃圾。

此外,即使存在普通字符,str3也不會以NULL結尾。

我個人改變你的函數將此:

void strInterset(char * str1, char * str2, char * str3) { 
    int i = 0, j; 
    *str3 = '\0'; // NULL terminate 
    for (i; *(str1 + i) != '\0'; i++) { 
     ... 
} 

輸出:

Enter str1: abc 
Enter str2: dfg 
strIntersect(): null string 

PS:有警告編譯啓用,您將獲得:

prog.c: In function 'strInterset': 
prog.c:26:5: warning: statement with no effect [-Wunused-value] 
    for (i; *(str1 + i) != '\0'; i++) { 
    ^~~ 

只需將其更改爲:for (; *(str1 + i) != '\0'; i++) {,甚至更好for (int i = 0; *(str1 + i) != '\0'; i++) {。這不是你的問題,但很好解決警告。

+0

NULL?和char * str3 [50] ????? –

+0

哎呀,錯過了@ PeterJ_01,謝謝!它現在看起來如何? – gsamaras

+0

抱歉,我的意思是輸出sjould顯示「空字符串」不爲空字符 – Denise

0

快速修復應爲str3[0] = '\0'作爲main中的第二行。

但也有更多的方法可以使你的程序更好:

  • 爲什麼你需要一個完整的char str3[50]?您可以改爲使用函數的返回值,如下所示:char strInterset(char * str1, char * str2);然後在適當的位置添加return。 (順便說一句:應該是拼寫intersect?)

  • 你的程序使用兩個嵌套的for -loops(這對大輸入很慢)。相反,你可以創建一個數組,其中每個條目對應一個字符值(查看ascii-table)。然後該數組可以包含一個真/假是否出現該角色。您將所有條目初始化爲0.然後,運行第一個字符串,並將每個字符設置爲數組中的條目爲1.然後運行第二個字符串,並檢查每個字符是否在數組中的條目是 1.如果發現這種情況,那麼你發現一個字符出現在兩個字符串中。

0

這是您的函數,它檢查常用字符並將它們添加到結果字符串中而不重複。如果你不關心的只是重複刪除第二,如果(且僅當如果是線,但離開它的身體在括號內)

char *strcomm(const char *s1, const char *s2, char *s3) 
{ 
    const char *tmp; 
    char *tmps3 = s3; 
    *s3 = 0; 
    while(*s1) 
    { 
     tmp = s2; 
     while(*tmp) 
     { 
      if(*s1 == *tmp) 
       if(strchr(s3,*s1) == NULL) 
       { 
        *s3++ = *s1; 
        *s3 = 0; 
       } 
      tmp++; 
     } 
     s1++; 
    } 
    return tmps3; 
}