2014-01-19 2 views
0
내가 C.

가져 오기 파일 이름 확장 C 오류

int getExt(char *file_name, char *ext) { 
    char *p = strrchr(file_name, '.'); 
    if(p == NULL) { 
     return 0; 
    } 
    strcpy(ext, p); 
    return 1; 
} 

에서 파일의 확장자를 얻기 위해 다음과 같은 기능을 사용하고 내가 이런 식으로 호출하고

:

char file_in[40] = "santa.bmp", file_out[40] = "santa.pgn"; 
char file_in_ext[4], file_out_ext[4]; 

getExt(file_in, file_in_ext); 
getExt(file_out, file_out_ext); 

printf("file_in_ext: %s\nfile_out_ext: %s\n", file_in_ext, file_out_ext); 

내가 무엇입니까 이 출력은 다음과 같습니다.

file_in_ext: .bmp 
file_out_ext: xn.bmp 

분명히 내 전체 프로그램이 망가져 있습니다. 그러나 이것은 대학 테스터에서만 발생합니다.

예, 맞습니다. 숙제입니다. 그럼에도 불구하고 제 질문은 숙제를 해결하지 못합니다. 어쩌면 숙제의 0.0001 % 일 수도 있습니다. 그러므로 제 질문이 적절하다고 생각합니다.

어쨌든 이상한 점은 개인용 컴퓨터, x64 아키텍처 및 Debian 7에서 모두 잘 작동한다는 것입니다. 나는 올바른 출력을 얻고있다 : 그것은

데비안 7. 그냥 것을

file_in_ext: .bmp 
file_out_ext: .pgm 

정말 대학 테스터에 대해 잘 모르겠어요 이런 일이 발생하고 주변에 얻을 수있는 방법이 왜 아십니까 이?

+2

'char file_in_ext [4], file_out_ext [4]; '가 작습니다. – BLUEPIXY

+0

터미네이터 또는 '.'를 끝내는 것을 잊어 버렸습니다. 귀하의 확장 버퍼. '.ext \ 0'은 5 개의 문자가 필요합니다; 4. – WhozCraig

+0

Exten *** SSSSSSSSS *** ion ... –

답변

3

버퍼 오버플로 때문에 프로그램이 의 정의되지 않은 동작으로 고통을 겪고 있습니다. 확장에 대해 4 자만 할당하고 있지만 getExt() 함수는 5를 쓰고 있습니다 : 4는 ".bmp"이고 4 번째는 NULL 종료 문자입니다.

getExt() 함수에 다른 인수를 전달하여 ext 버퍼의 크기를 제공해야합니다. 그런 다음 strcpy() 대신 strncpy()을 사용하고 해당 크기 인수를 전달하십시오. 이렇게하면 버퍼 오버플로가 방지됩니다. 그런 다음 확장 버퍼에 더 많은 공간을 할당해야합니다.

+0

그게 다야! 나는 내가 그것을 놓쳤다라고 생각할 수 없다! 고마워요! –

+0

@DragosRizescu 문제 없음 :) 이것은 안전한 프로그래밍 실무의 중요성에 대한 좋은 교훈이 될 수 있습니다. 때때로 버퍼 오버런은 크고 복잡한 시스템에서 추적하기가 어려운 이상한 행동을 유발할 수 있으므로, 처음에는이를 피하는 것이 매우 중요합니다. 행운을 빕니다! – TypeIA

+0

다른 옵션은 함수가 확장이 시작되는 파일 이름의 위치에 대한 포인터를 반환하도록하는 것입니다. 또한 파일 이름에'.'이 없도록 정의해야합니다. '.profile'의 확장자가'.profile'입니까? (그것은 두 가지 모두 논쟁의 여지가 있습니다 - 당신이 잘못했다는 진술이 아니라,'.profile'을 이름으로 전달하면 확장 기능을 얻을 수 있다는 것을 의미합니다.) –

관련 문제