2017-11-06 9 views
-1

저는 C 언어가 매우 새로워서 중복 된 파일을 찾기 위해 폴더를 스캔 한 다음 몇 가지 작업을 수행하는 유틸리티에서 작업하고 있습니다. 중복 파일 이름 목록을 가지고있을 때 파일을 조작하기 위해 전체 경로와 파일 이름으로 문자열을 작성해야하지만 \에 경로를 추가하려고 할 때마다 오류가 발생하지만 오류는 발생하지 않습니다. 내가 건너 뛴다. 여기에 문제 코드의 단순화 된 버전입니다 : 내가 주석 아래에서 세 번째 줄을두면C에서 문자열 경로 작성하기

char *TARGET1 = "."; 
char *TARGET2 = ".\\test"; 
char *PATH_SEP = '\\'; 

char *folder1_files[filecount1]; // These arrays are populated with file 
char *folder2_files[filecount2]; // names elswhere in the code 
int l = 0; // The counter for the loop that is comparing the filenames 

char buffer[1024]; 
strcpy(buffer, TARGET2); 
printf("Building the path now...\n"); 
//strcat(buffer, PATH_SEP); 
strcat(buffer, folder2_files[l]); 
printf("Path: %s\n", buffer); 

이 프로그램이 완료와 나는 다음과 같은 출력 얻을 : 내장

경로를! 경로 :. 내가 주석을 제거하면 \

testfile3.txt, 나는이 오류 : 액세스 위반 읽기 위치 0x0000005C

이 잘못 어디로 이

사람이 지적 할 수 있습니까? C에서 경로를 만드는 더 표준적인 방법이 있습니까?

+0

* 코드에서 이름이 ... * 어디서? 저것을 배치하십시오. 더 쉽고 깨끗한 대신'snprintf()'를 사용하십시오. –

+0

스택 오버플로에 오신 것을 환영합니다. [About] 및 [Ask] 페이지를 곧 읽으시겠습니까? 더 중요하게는 MCVE ([MCVE])를 만드는 방법을 읽어보십시오. 'char * folder1_files [filecount /];'는 문법 에러이다. 'filecount1'을 원하셨습니까? –

+0

아래에서 세 번째 줄은 int l = 0; 주석을 달면 strcat (buffer, folder2_files [l])에서 컴파일 타임 오류가 발생합니다. 난 정의가 안 돼 –

답변

1

PATH_SEP과 같은 문자 상수는 자동으로 NUL 종료되지 않습니다. 당신이

strcat(buffer, PATH_SEP); 

를 호출 할 때 strcat 루틴은 두 인수가 NUL 종료 문자열을 가리 것으로 기대하고있다. PATH_SEP이 NUL 종료되지 않았기 때문에 루틴은 NUL 바이트를 찾기 위해 메모리 검색을 계속합니다. 결국에는 중요한 것을 덮어 쓰거나 그렇지 않아야하는 메모리에 액세스합니다.

변경

char *PATH_SEP = '\\'; 

char *PATH_SEP = "\\"; 

에 예상대로 코드가 수행해야합니다.

행운을 빈다.

+0

정말 고마워요! 나는 문자 상수가 NUL로 끝나지 않을 것임을 몰랐다. 나는 char * PATH_SEP = '\\'; "\\\ 0"로 설정하면 실제로 예상대로 작동했습니다! –

1

바닥에서 세 번째 줄은 당신이 그것을 주석 경우 당신이 그것을 사용하기 전에 l를 선언해야하기 때문에

int l = 0; 

, 당신의 코드는 컴파일되지 않습니다이다. 당신은 문자 (문자)와 문자열 (숯불 *)를 초기화하기 때문에

바닥에서 네 번째 라인은

//strcat(buffer, PATH_SEP); 

char *PATH_SEP = '\\'; 

가 이해되지 않는다 라인입니다. 큰 따옴표 안에있는 것은 문자열이고, 작은 따옴표 안에있는 것은 문자입니다. 따라서 PATH_SEP은 쓰레기를 가리 킵니다.