2014-04-01 67 views
0

我剛碰到這個問題。問題是,我有一個字符串,我必須找到字符串中最長的連續子字符串(所以如果我有aaaccaaaaaggt它會打印「A:5」不帶引號),如果有的話,打印它在哪裏和多長時間是。我的做法是,我從最長的可能連續字符串長度和memset它去acgt(其中之一,因爲它是一個DNA序列)。問題是,當我跑的功能和它印我memsetted串有類似:C printf有點怪,打印總廢話

aaaaaaaaaaaaaaaa{Xs⌂▼▐

但說實話,我不知道爲什麼。

unsigned int longestSubstrInSequenceO(const char *str) 
{ 

int i = 0; 

char *cntrlStr = (char *)malloc((strlen(str)) * sizeof(char)); 

char *copied = (char *)malloc((strlen(str)) * sizeof(char)); 

int size; 

strcpy(copied, str); 

strLower(copied); 

copied[0] = tolower(copied[0]); 

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

for(i; i < strlen(str); i++) 
{ 
    printf("%d\n", (strlen(str) - i + 1)); 

    memset(cntrlStr, 'a', (strlen(str) - i) * sizeof(char)); 
    printf("%s\n", cntrlStr); 
    if(strstr(copied, cntrlStr) != NULL) 
    { 
     printf("Longest sequence: %d\n", i); 
     break; 
    } 
    memset(cntrlStr, 'c', (strlen(str) - i + 1) * sizeof(char)); 
    printf("%s\n", cntrlStr); 
    if(strstr(copied, cntrlStr) != NULL) 
    { 
     printf("Longest sequence: %d\n", i); 
     break; 
    } 
    memset(cntrlStr, 'g', (strlen(str) - i + 1) * sizeof(char)); 
    printf("%s\n", cntrlStr); 
    if(strstr(copied, cntrlStr) != NULL) 
    { 
     printf("Longest sequence: %d\n", i); 
     break; 
    } 
    memset(cntrlStr, 't', (strlen(str) - i + 1) * sizeof(char)); 
    printf("%s\n", cntrlStr); 
    if(strstr(copied, cntrlStr) != NULL) 
    { 
     printf("Longest sequence: %d\n", i); 
     break; 
    } 
    memset(cntrlStr, '\0', (strlen(str) - i + 1) * sizeof(char)); 
    printf("%s\n", cntrlStr); 

    free(cntrlStr); 
    printf("bbbbbbbbbbb"); 
    cntrlStr = (char *)malloc((strlen(str) - i + 1) * sizeof(char)); 


    //memset(cntrlStr, 0, (strlen(str) - i) * sizeof(char)); 

} 
printf("search end\n"); 
//strstr(); 
return 0; 
} 

所以,大家請,如果你能幫助我,我哪裏出錯我會非常感激。我不要求你寫我的代碼,只是指出這個問題的根源,或者告訴我你將如何做(如果你能做得更好):)謝謝!

回答

4

你必須爲空終止分配空間以及

char *cntrlStr = (char *)malloc((strlen(str) + 1) * sizeof(char)); 

char *copied = (char *)malloc((strlen(str) + 1) * sizeof(char)); 

這同樣適用於所有其他的字符串分配。

+2

'(strlen(str))*(sizeof(char)+ 1)'???你確定這是你的意思嗎? – AnT

+1

錯誤的地方爲'+ 1'。你想'(strlen(str)+1)* sizeof(char)' – Tim

+0

Ooppssssssssssss,我通常在右邊strlen。 – this