2016-02-12 95 views
3

編寫代碼,以檢查是否s2是隻使用一個呼叫isSubStrings1轉動(即waterbottleerbottlewat旋轉)。旋轉的字符串

我寫這個程序,但我無法得到所需的輸出。請指導我哪裏出錯。

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

int isRotated(char *s1, char *s2); 
int isSubstring(char *s1, char *s2); 

int isRotated(char *s1, char *s2) 
{ 
     int r; 
     char s[100]; 
     if(strlen(s1) == strlen(s2)) 
       strcpy(s, s1); 
     r = isSubstring(s, s2); 
     strcat(s, s1); 
     return r; 
} 

int isSubstring(char *s1, char *s2){ 
     if(strstr(s1, s2)) 
       return 1; 
     else  
       return 0; 
} 

int main(void) { 
     char s1[100], s2[100]; 
     printf("Enter the first String\n"); 
     scanf("%s", s1); 
     printf("Enter the second String\n"); 
     scanf("%s", s2); 

     if(isRotated(s1, s2)==1) 
       printf("%s and %s are rotated string\n", s1, s2); 
     else 
       printf("%s and %s are not rotated string\n", s1, s2); 

     return 0; 
} 
+0

什麼是STrings' ????? –

+0

「你期望的輸出」究竟是什麼意思?你得到了什麼?錯誤消息? –

+0

如果兩個字符串有不同的長度,'s'是未初始化的,這意味着'isSubString'和'strcat'可能在未正確終止的字符串上運行。 –

回答

3

如果你做strstr()您正在搜索的字符串旋轉一個子比較。所以你在做什麼是找到例如字符串s1 ABCD在另一個字符串s2 CDAB。所以實際上s2中沒有子串s1,你的功能int isSubString(char *s1,char *s2)將總是返回false

一個簡單的解決方案就是不直接比較s1和s2。您必須將s2與s1的雙倍副本進行比較:您可以看到該字符串包含子字符串ABCD,並且您的函數將返回true。

這將意味着你的函數:

int isRotated(char *s1,char *s2) 
{ 
    char s[200]; 
    strcpy(s,s1); // Copy content of s1 to s 
    strcat(s,s1); // Append s again with the content of s1 

    if(strstr(s,s2)) 
     return 1; 
    else 
     return 0; 
} 
+2

這樣比較好,但是對於不同長度的字符串可能會失敗。另外,你已經實現了'isRotated',而不是'isSubString'。 –

5

要檢查是否s2s1旋轉,你可能要集中2個s1 S,並嘗試在新的字符串找到s2

有必要檢查s1s2的長度。例如,s1是「ABCD」,s2是「CDA」。那麼s是「AB CDA BCD」。 strstr(s, s2) == 1,但很明顯,s2不是輪轉的s1

另外,我想先撥打strcmp(),因爲我認爲「ABCD」是「ABCD」本身的旋轉。但是,這只是一個定義問題。

int isRotated(char *s1, char *s2) 
{ 
     char s[199]; 
     if(strlen(s1) != strlen(s2)) 
       return 0; 
     else if(strcmp(s1, s2) == 0) 
       return 1; 
     else 
       strcpy(s, s1); 
     strcat(s, s1); 
     return isSubString(s, s2); 
} 

BTW: 「子」 就是一個字,所以它可能是更好的改變isSubString()isSubstring()

+0

打我吧! :) – Wossname

+0

請注意,'strstr()'不會返回'int',它會將'char *'返回到找到的子字符串,因此您的文本有點混亂。 – unwind

+1

我現在修好了,'如果'strstr(s,s2)!= NULL',isSubString()'會返回'1' –

0

這個怎麼樣,使用串連-和查找的子串的方法:

int isRotated(const char *s1, const char *s2) 
{ 
    const size_t l1 = strlen(s1); 
    const size_t l2 = strlen(s2); 
    if(l1 != l2) 
    return 0; 
    char joined[2 * l1 + 1]; 
    memcpy(joined, s1, l1); 
    memcpy(joined + l1, s1, l1); 
    joined[2 * l1] = '\0'; 
    return strstr(joined, s2) != NULL; 
} 

基本上使用更多的const,可變長度的數組來處理不同的長度,當我們知道我們正在複製的長度時,使用memcpy()