2012-04-06 3 views
0

시퀀스 정렬 프로그램 (이것은 생물 정보학 프로젝트)에 의해 생성 된 일부 문자열에 문제가 있습니다. 정렬 파일을 구문 분석하는 기존 C 프로그램에 추가 기능을 추가하려고하지만 프로그램에서 만드는 "잘못된 일치"문자열의 구문 분석과 관련된 문제가 발생했습니다. 컨텍스트를 추가하려면 다음과 같이 정렬 문자열의 예가 있습니다.

example = "28G11AC10T32";

문자열을 해석하는 방법은 다음과 같습니다. 첫 번째 28 개 염기가 순서와 일치하고 "G"불일치 (29 번째 합계), 다음 11 개 염기 일치 (40 번째 합계), "A"불일치 (41 번째 기준), "C"불일치 (42 번째 기준) 등 ...

불일치가있는 기본 위치를 찾아야합니다 (예 : 문자열에 숫자 대신 문자가 있음). 이것을 int 배열에 저장하여 나중의 서브 루틴에서 이것을 볼 수 있습니다.

여기 내 문제가 발생합니다. 나는 "생각한"서브 루틴을 작성하여 이것을 파싱 할 수 있었지만 결과물에서 매우 이상한 유물을 얻습니다. 참고 : 내 끔찍하고 어수선한 코드를 용서해주십시오! 나는 C 프로그래머가 아니며 훈련은 컴퓨터 과학이 아닙니다!

C : parse char 문자로 구분 된 배열을 정수로 변환하고 숫자를 정수로 바꿈

int errorPosition(char *mis_match, int *positions){ 
    int i = 0; //iterator for loop 
    int pi = 0; //position array iterator 
    int in = 0; //makeshift boolean to tell if values are inside the pre array 
    int con = 0; //temporary holder for values converted from the pre array 
    char pre[5]; //this array will hold the digit values that will be converted to ints 
    pre[0] = '\0'; 
    for (i = 0; i < strlen(mis_match); i++){ 
     if(isalpha(mis_match[i]) && in == 1){ 
      con += atoi(pre); // this is the part where I get an artifact (see below) 
      positions[pi] = con; 
      con++; 
      pi++; 
      in = 0; 
      memset(&pre[0], 0, sizeof(pre)); 
      pri = 0; 
     }else if(isalpha(mis_match[i]) && in == 0){ 
      positions[pi] = con; 
      con++; 
      pi++; 
     }else if(isdigit(mis_match[i])){ 
      pre[pri] = mis_match[i]; 
      pri++; 
      in = 1; 
     } 
    } 
    if(pri > 0){ 
     con += atoi(pre); 
     positions[pi] = con; 
     pi++; 
    } 

} 

그래서, 내 문제는 내가 ("나는 오류를 얻을 곳이다") 위의 댓글을 달았 세그먼트에 도달 할 때 내 "사전"문자열이 들어있는 숫자의 시간 (10)이 포함되어 있다는 것입니다 예를 들어 위에 나열된 예제 문자열을 사용하면 루프가 해당 영역에 도달 할 때 처음에는 "28"이 포함될 것으로 예상되지만 대신에 "280"이 포함됩니다. 문자열을 변환 할 때 atoi를 사용하면 예상보다 10 배가 높습니다.
내가 여기에서 무식하다고 C에서 누락 된 문자 배열 규칙이 있습니까? 답장을 미리 보내 주셔서 감사합니다.

답변

0

이것은 유일한 문제는 아니지만, 전달한 문자열을 atoi으로 끝내지 않은 것입니다. 280의 세 번째 위치에있는 '0' 문자는 배열의 해당 위치에 쓴 적이 없으므로 가비지 수도 있습니다.

이 문제를 해결하기 위해, 당신은 atoi의 호출하기 전에이 줄을 추가해야합니다 :

pre[pri] = '\0'; 
+0

가! 가장 단순한 것, 맞죠? 답장 해주셔서 매우 감사합니다! int는 이제 정확하고 프로그램은 작동합니다! – user1317512

0

다음 코드가 문자열의 숫자 & 숫자가 아닌 부분을 추출 (인쇄) 할 것이다; 당신은 당신이 그 부분들과 함께 당신이 필요로하는 것을하기 위해 그것을 개조 할 수 있습니다.

char* example = "28G11AC10T32"; 
int pos = 0; 
int value = 0; 
while (1) { 
    if (!isdigit(example[pos])) { 
     if (value > 0) 
      printf("Number = %d\n", value); 
     value = 0; 
     if (example[pos]==0) 
      break; 
     else 
      printf("Char = %c\n", example[pos]); 
    } else { 
     value = value * 10 + example[pos]-'0'; 
    } 
    pos++; 
} 
+0

내 아마추어 솔루션보다 훨씬 우아합니다. 고맙습니다! – user1317512

관련 문제