2016-02-26 89 views
-2

我不明白爲什麼它在到達行「if(strcmp(next,str2)== 0)return」後立即停止;「
現在我已註釋掉%。*因此我可以完整地打印兩個字符串,它們在到達if語句之前進行比較,因此5在我的示例輸入中無關緊要。我的遞歸函數有問題

當我打印兩個字符串「下一步」和「STR2」,下面顯示
enter image description here

我可以看到字符串「ABC DEF」是不一樣的「BC DEFA」,但現在看來,這滿足if語句,因爲它會停止選取框功能。當我註釋if語句時,它會經歷無限遞歸。
也許是同我是這麼認爲的我印這兩個字符串
enter image description here
這表明STRCMP是-1,這不是的STRCMP程序0

有人能告訴我嗎?也許我只是錯過了一些簡單的東西,或者有一種更好的方法來突破我的遞歸,一旦下一個等於str2。

編輯:我放在旋轉功能

int main(){ 

    int n,i,signlength; 
    char sign[100]; //max 99 letters 

    //get number of cases 
    scanf("%d",&n); 

    //process each case 
    for(i=0;i<n;i++){ 

     //ignore rest of line \n 
     char ic; 
     while ((ic = getc(stdin)) != EOF && ic != '\n'); 
     //take in sign string and length of sign 
     gets(sign); 
     scanf("%d",&signlength); 

     if(signlength >= strlen(sign)) 
       printf("[%-*s]\n",signlength,sign); 

     if(signlength < strlen(sign)){ 

       printf("%s\n",sign); 
       //printf("[%.*s]\n",signlength,sign); 
       marquee(sign,signlength,sign); 
     } 

    } 

    return 0; 
} 

char* marquee(char* str, int size, char* str2){ 

    char* next = rotate(str); 

    printf("%s\n",next); 
    //printf("[%.*s]\n",size,next); 
    if(strcmp(next,str2) == 0) 
     return; 

     return marquee(next,size,str2); 

} 

void swap(char* a, char* b){ 

    char temp = *a; 
    *a = *b; 
    *b = temp; 
} 

void reverse(char* array, int size){ 
    int i; 
    for(i=0;i<size/2;i++) 
     swap(array + i, array + (size-i-1)); 
} 

char* rotate(char* str){ 

    reverse(str +1, strlen(str) -1); 
    reverse(str, strlen(str)); 

    return str; 
} 
+0

我不是說你的函數'marquee'可以在這個狀態下編譯...你確定你在測試什麼嗎? – purplepsycho

+1

不測試'scanf'的返回值始終是一個驚喜。正如使用棄用的gets()函數一樣。改用fgets。噢,當你返回時,會發生什麼?'返回'char *'的函數? – Jens

+0

@purplepsycho,不,我不確定。我是C新手,不熟悉如何通過函數進行網格化,所以我最好的辦法就是打印所有內容lol – Hispazn

回答

1

你的旋轉和反轉函數都在你的字符數組上就地操作。實際上,如果您查看rotate,則可以看到它始終返回str。所以,當你這樣做:

char* next = rotate(str); 

所有它做它旋轉就地str,然後返回str。通話結束後,nextstr的值相同,str的原始內容不再可用。

如果你想保留str,只需複製它。舉例來說,你可以這樣做:

char* next = rotate(strdup(str)); 

這將首先複製str,然後調用rotate將破壞性修改副本,留下str不變。

+0

哦! ASDFGHJKL。 謝謝!當你滔滔不絕地說,我是否應該讓我的更改更有效率? – Hispazn

+0

不,它只是意味着它會覆蓋它所操作的字符串,並在此過程中有效地銷燬它。有時候沒關係,但在這種情況下並非如此。 –

3

的問題似乎是,你打電話marquee()strstr2是相同的指針。當你rotate(str)這對str2也「同樣」(因爲它們指向相同的內存。)這可能不會做你認爲應該的。

而且通過各種手段,輪到你的編譯器的所有警告和它捕獲在marquee()return;是免費的。

+0

ohh,我想str2保持不變,所以我應該聲明另一個變量可能?這將保留原文。所以像Original = str2? – Hispazn

+0

@Hispazn不,那隻會創建第三個指針。您需要**將字符串指向的數據複製到**。即使用第二個字符數組或malloc一些內存,並將舊的內容複製到新內存中。 – Jens