2013-04-20 2 views
0

나는 이것으로 완전히 손실되었다. 왜 이것이 작동하지 않는지 나는 알 수 없다. 널 터미네이터가있는 간단한 문자 배열 - 출력 할 때 종료되지 않는다! 이 올바르게 종료되지 않는 이유fprintf 문자열 종료에 대한 정신 차단

> 16 

> 16 

>/.goutputstream\B7<random memory stuff> 

내가 알아낼 수 없습니다 :

int file_create(const char *path) { 
    //trying to trap situations where the path starts with /.goutputstream 
    char path_left_15[16]; 
    strncpy(path_left_15, path, 15); 
    printf("%d\n", strlen("/.goutputstream")+1); 
    path_left_15[strlen("/.goutputstream")+1] = '\0'; 
    printf("%d\n", strlen(path_left_15)); 
    printf("path_left_15: %s\n", path_left_15); 
    //continue on... 
} 

내 출력됩니다. 나는 배열을 더 길게 만들려고했지만 매번 같은 결과를 얻는다. 나는 내 마음을 잃어 가고있다!

누구나 볼 수 있습니까? 감사.

+1

** f ** printf? 파일 포인터를 전달하지 않습니다. – Kevin

+0

'NULL'은 널 포인터 * 상수로 확장되는 매크로입니다. 아마도 "NUL 터미네이터"또는 더 나은 아직 "' '\ 0"터미네이터 "를 의미 할 것입니다. –

+0

네 말이 맞아, 케빈. 나는 단지 printf를 의미했다. 좋은 캐치. – Alex

답변

1

배열에서 범위를 벗어났습니다. path_left_15[strlen("/.goutputstream")+1] = '\0'; 대신 시도하십시오 path_left_15[15] = '\0';

문자열을 자르지 만 인쇄 할 때 안전합니다.

+0

나는 이것이 내가 얼마나 바보가 될 수 있는지 깨닫는 것을 알고 있었다. 0에서부터 셀 수있는 시점과 1에서 시작하는 시점을 잊어 버리는 또 다른 예입니다. 감사합니다! – Alex

+0

BTW, 내 문자열을 자르지 않습니다. path_left_15 [15]에 터미네이터를 추가하면, 그것은 내 배열의 16 위치입니다. 정확히 원하는 위치에 있습니다. 다시 한번 감사드립니다. – Alex

2

배열에는 16 개의 요소 만 있습니다. 즉 17 번째 글자로 쓰려고합니다. 그래서 그것은 정의되지 않은 행동입니다.

+0

무슨 뜻인지 알 겠어. 내가 그것을 간과했다라고 생각할 수 없다. 감사. – Alex