2015-06-20 108 views
2

我想寫結合2串入一個字符串,它是按字母順序排列的2串都只是小字母和字母升序遞歸函數。例如: s1:「aegiz」s2:「abhxy」s3:「aabeghixyz」結合2串在另一個字符串按字母順序

我對遞歸函數和C一般還不熟悉,我認爲這可以比我做的更好地解決...

到目前爲止我的代碼:

#include <stdio.h> 
 
#include <conio.h> 
 
#include <stdlib.h> 
 
#define N 50 
 
char *combinealph(char *str1, char *str2, char *str3); 
 
void main() 
 
{ 
 
\t char *str1[N], *str2[N],*str3; 
 
\t int length; 
 
\t printf("Enter first string:\n"); 
 
\t gets(str1); 
 
\t printf("Enter second string:\n"); 
 
\t flushall(1); 
 
\t gets(str2); 
 
\t length = strlen(str1) + strlen(str2); 
 
\t str3 = (char*)malloc((length+1)*sizeof(char)); 
 
\t printf("The combined string :\n"); 
 
\t puts(combinealph(str1, str2, str3)); 
 
\t getch(); 
 
} 
 

 
char *combinealph(char *str1, char *str2, char *str3) 
 
{ 
 
\t if (*str1 == '\0' && *str2 != '\0') 
 
\t \t strcpy(str3, str2); 
 
\t \t return str3; 
 
\t if (*str1 != '\0' && *str2 == '\0') 
 
\t \t strcpy(str3, str1); 
 
\t \t return str3; 
 
\t if (*str1 == '\0' && *str2 == '\0') 
 
\t \t \t return '\0'; 
 

 
\t if (*str1 >= *str2) 
 
\t { 
 
\t \t strcpy(str3, str1); 
 
\t \t return strcat(*str3, combinealph(str1 + 1, str2, str3+1)); 
 
\t } 
 
\t if (*str1 < *str2) 
 
\t { 
 
\t \t *str3 = *str2; \t 
 
\t \t return strcat(*str3, combinealph(str1, str2 + 1, str3+1)); 
 
\t } 
 
}

+0

什麼是你的問題?關於提高代碼的問題屬於在代碼審查http://codereview.stackexchange.com/ –

+1

以及我的代碼不能正常工作,所以我想我怎樣才能使其正常工作是個問題? – n4tri0s

+0

使函數成爲'void'並去掉所有的'return's。擺脫'strcat's,也是。而你有'的strcpy(STR3,STR1);',你的意思是'* STR3 = * STR1;'(從底部5日線)..順便說一句,你在執行操作稱爲 「合併」。 – ooga

回答

2

看來,你指的是以下

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

char * combine_strings(char *result, const char *s1, const char *s2) 
{ 
    if (*s1 == '\0' && *s2 == '\0') 
    { 
     *result = '\0'; 
     return result; 
    } 
    else if (*s1 == '\0') 
    { 
     *result++ = *s2++; 
     return combine_strings(result, s1, s2) - 1; 
    } 
    else if (*s2 == '\0') 
    { 
     *result++ = *s1++; 
     return combine_strings(result, s1, s2) - 1; 
    } 
    else 
    { 
     *result++ = *s2 < *s1 ? *s2++ : *s1++; 
     return combine_strings(result, s1, s2) - 1; 
    }   
}  

int main(void) 
{ 
    const char *s1 = "aegiz"; 
    const char *s2 = "abhxy"; 
    char result[ strlen(s1) + strlen(s2) + 1]; 

    printf("%s\n", combine_strings(result, s1, s2)); 

    return 0; 
} 

程序輸出是

aabeghixyz 

可以使功能更短。例如

char * combine_strings(char *result, const char *s1, const char *s2) 
{ 
    if (*s1 == '\0' && *s2 == '\0') 
    { 
     *result = '\0'; 
     return result; 
    } 
    else 
    { 
     *result++ = (*s2 && *s2 < *s1) || !*s1 ? *s2++ : *s1++; 
     return combine_strings(result, s1, s2) - 1; 
    }   
}  
+0

謝謝,這正是我想要的。 有一個問題:請您在退貨結束時解釋-1的用途? – n4tri0s

+0

@ n4tri0s函數應該返回指向結果字符串,它可以在輸出函數中使用,因爲它是在我的示範計劃顯示,因爲函數中的原始指針被增加的第一個字符。 –

+0

現在我明白了,謝謝。 – n4tri0s

相關問題