2014-04-01 5 views
0

방금 ​​문제가 발생했습니다. 문제는, 내가 문자열이 있고 문자열에서 가장 긴 연속 문자열을 찾아야한다는 것입니다 (그래서 aaaccaaaaaggt를 사용하면 "A : 5"로 따옴표없이 인쇄 할 것입니다). 아르. 내 접근 방식은 내가 가장 긴 cnsecutive 문자열 길이에서 memct 그것을 acgt (일종의 DNA 시퀀스이기 때문에) 중 하나였습니다.C printf가 이상한데, 말도 안되는 문구를 인쇄합니다.

aaaaaaaaaaaaaaaa{Xs⌂▼▐

하지만 솔직히, 나는 이유를 알고하지 않습니다 내가 기능을 실행하고 같은 것이 있었다 나에게 memsetted 문자열을 인쇄 할 때 문제이다.

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

당신은 null 종결을위한 공간을 할당뿐만 아니라

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

Ooppssssssssss, 저는 보통 오른쪽에 strlen이 있습니다. – this

관련 문제