2017-02-12 4 views
0

한 유형의 데이터를 다른 유형으로 변환하는 간단한 코드를 만들려고합니다. 나는 strtok을 사용하여 데이터의 한 부분을 추출한 다음 정확한 출력을 찾기 위해 if 조건의 긴 시리얼을 실행합니다. 그러나 정확한 출력이 발견되어 변수 currentNote에 쓰여지면 알아낼 수없는 이유로 변수 comma을 덮어 쓰는 것으로 보입니다. 여기에 코드의 문제가있는 부분입니다 :strcpy가 다른 변수를 덮어 쓰지 않도록 방지하는 방법은 무엇입니까?

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

int main() 
{ 
    char sequence[] = "c1[M],c1[M],d3[L],c3[M],b2[M],(#A-2)[IKN],(#A-1)[L]"; 
    char copy[] = ""; 
    char *comma; 
    char currentNote[4] = ""; 

    strcpy(copy, sequence); 

    comma = strtok(copy, ","); 

    if(strstr(comma, "c1") != 0)  //c1 
     { 
       printf("%s\n\n", comma);   //Here ... 
       strcpy(currentNote, "C5 "); 
       printf("%s\n\n", comma); 
     } 
    return 0; 
} 

는 그리고 여기 결과입니다 :

c1[M] 

cC5 

strcpy(currentNote, "C5 ");이 원인이 있다고 할 필요가. 나는 왜 그런지 모르지만, 나는 그것을하고자하는 것처럼 c1[M]을 돌려 줄 것이라고 생각했다. 좀 더 실험을 한 후에는 두 번째 printf("%s\n\n", comma);이 항상 sequence의 첫 번째 문자 다음에 C5을 반환한다는 것을 알게되었습니다. 누군가가 알면 좋겠어. 아주 좋을거야.

+0

아마도'copy'에 물건을 저장할 메모리가 있습니다 –

+0

그건 컴파일되지 않습니다. 'currentNote'가 선언 된 곳은 어디입니까? – ikegami

+1

'strcpy (copy, sequence)'는 좋지 않습니다. 'copy'는 충분한 공간이 없습니다. – ikegami

답변

1


strcpy(copy, sequence)copy은 1 요소 길이 배열입니다. 충분한 크기를 지정하여 정의해야합니다. 귀하의 코드는 그대로 UB입니다.

char copy[100];

처럼 재정 또는 동적으로 malloc를 사용하여 충분한 메모리를 할당합니다.

+1

감사합니다. 항상 귀하의 의견에 감사드립니다. 대답을 편집했습니다. – VHS