2012-07-01 4 views
1

주어진 디렉토리에서 .txt 파일을 열 수있는 프로그램을 만들고 있는데 디렉토리에있는 파일의 절대 경로가 모두 포함 된 배열이 있습니다. 다음과 같이 추출 파일의 이름을 반환하는 함수, 함수는 기록 :strcpy와 이상한 오류 C로 이상한 오류가 발생했습니다

char *name(char *string) { 
    int i = strlen(string); 
    char *aux; 
    while(string[i-1] != '/'){ 
     i--; 
    } 
    strcpy(aux, &string[i]); 
    return aux; 
} 

위의 함수는 분할 오류 오류가 제공되지만, 내가 다음 줄을 추가하는 경우 "INT의 J = 0;" C : 실수가 사라 보조의 선언 전에 새로운 작업 코드는

char *name(char *string) { 
    int i = strlen(string); 
    int j = 0; 
    char *aux; 
    while(string[i-1] != '/'){ 
     i--; 
    } 
    strcpy(aux, &string[i]); 
    return aux; 
} 

입력은 \ 테스트 \의 a.txt이에게
출력 :

a.txt이 왜 "INT의 추가 j = 0; " 문제를 해결합니까? 이 불일치가 나중에 더 큰 문제로 이어질 지 모르기 때문에 나는 계속 붙어 있고 계속할 수 없다. 나는 문자열을 복사하기 위해 내 자신의 함수를 작성하려고 생각하고있다. 그러나 그 전에는 그 사실을 정말로 알고 싶다. 오류.

+1

aux가 초기화되지 않았습니다. malloc을 먼저 사용하십시오. –

+0

다른 해결책은 "int i = strlen (string);"이라는 선언 순서를 교환하는 것입니다. 및 "char * aux;" – user1493813

+1

@ user1493813 이들은 해결책이 아닙니다. 이것은 정의되지 않은 동작입니다. – chris

답변

4

aux을 할당하지 마십시오. aux에 아무 것도 복사하지 않으려면 유효한 메모리 위치를 가리켜 야합니다.

char *aux 대신 char *aux = malloc(i+1);과 같은 것이 필요합니다. i+1은 과도한 결과이므로 auxstring (항상 포함되지 않음)보다 3 자 이상 짧지 만 작은 문자열은 상관하지 않기 때문에 작업이 끝나면 포인터를 free()에 기억하십시오.

또한, 이유는 당신은 당신이 단지 char *aux;, aux 포인트로 할 경우 (당신이 운이 가지고 있다는 아마 어떻게 든되는 aux 점 위치가 유효 할 선언의 순서를 전환 및/또는 선언을 추가하여 작동 발견 임의의 위치). 이것은 순수한 행운이지만, 비록 작동한다고해도 코드는입니다.

미래에 Valgrind 같은 도구를 사용하여 메모리 문제를 진단 할 수 있습니다. 또한 기본 메모리 관리 및 C의 포인터에 대한 자습서를 읽어야합니다.

+1

strcpy는 널 종결자를 복사합니다. 절대적으로 (i + 1)이 필요합니다. – Nick

+0

@ 닉 : 아니야. 'aux'는 항상'string'보다 짧습니다. – houbysoft

+0

@ 닉 : 명확하지 않은 경우에 대비하여 설명을 추가했습니다. – houbysoft

1

aux에 메모리를 할당하지 않았습니다. 초기화되지 않은 포인터를 통해 메모리에 쓰려고합니다.

3

문자열의 파일 이름 부분을 매개 변수로만 사용하는 것처럼 들리므로 다른 옵션은 이미 가지고있는 문자열 부분을 사용하는 것입니다.

시도해보십시오. aux = & 문자열 [i]; strcpy 대신에.

사용자가 관심있는 문자열 부분 (즉, 마지막 '/'다음의 마지막 부분)에 대한 포인터를 제공합니다.

두 번째로 모든 입력 문자열에 '/'문자가 포함되어 있는지 확인하십시오. 그렇지 않으면 루프가 문자열의 시작 부분을 지나쳐 일부 지점에서 세그먼트 오류가 발생할 가능성이 있습니다. 루프에 조건을 넣어 i = 1 이상으로 계속 진행하지 않는 것이 가장 좋습니다.

관련 문제