2017-01-24 6 views
1

는 다음과 같은 프로그램을 고려 :함수 역시() : 대상 문자열에서 임의의 문자

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

int main() { 

    int ret = 0; 

    char dirname[] = "test/"; 
    int path_maxlen = 256; 
    char path[path_maxlen]; 
    int filename_maxlen = path_maxlen - strlen(dirname); 

    strncat(path, dirname, path_maxlen - 1); 

    strncat(path, "file.txt", filename_maxlen); 

    FILE *file = fopen(path, "r"); 

    printf("path: %s\n", path); 

    if (file != NULL) { 
     printf("success\n"); 

     fclose(file); 
    } else { 
     printf("fail\n"); 
     ret = 1; 
    } 

    return ret; 
} 

이 처음 일 듯하지만 그것이 존재하지만 즉, 파일을 열 수 없습니다, 실패 시작 프로그램이나 파일을 변경하지 않았습니다.

그 시점에서 나는 path을 인쇄하는 라인을 추가했습니다. 출력을 파일로 재 지정하면 path 앞에 임의의 문자 (ASCII : 1 SOH 'heading start')가 오게됩니다. 그래서 나는 strncat이 여기에 제대로 사용되지 않고 임의의 정크가 내 경로 배열에 기록된다고 가정합니다.

위의 예에서 문자열을 올바르게 연결하려면 어떻게해야합니까?

추 신 : 내 OS는 우분투 16.04입니다. 컴파일러는 다음과 같습니다

$ gcc --version 
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 
+2

'char path [path_maxlen] = {0}; ' – DyZ

+0

@DYZ 아아, 가변 길이 배열에는 작동하지 않습니다. – AlexD

+0

@AlexD 그래서 가변 길이 배열을 사용하지 않습니다 ... 그래서,'path [0] = 0;'입니다. – DyZ

답변

4
strncat(path, dirname, path_maxlen - 1); 

path가 초기화되지 않은, 그것은 정의되지 않은 동작하므로.

char path[path_maxlen]; 
path[0] = 0; // since path is VLA, usual "={0}" initialization does not work 

을 시도하거나 그냥 strcpy_s 사용을 고려할 수 있습니다.

+0

고마워, 이제 알 겠어. 'char path [path_maxlen] = NULL; '도 작동합니까? 아니면 그러한 접근에 대한 경고가 있습니까? – nautical

+0

음 ... 컴파일됩니까 :-)? – AlexD

+0

실수로 프로그램의 백업 파일을 편집 및 컴파일했지만 편집되지 않은 파일을 컴파일했습니다. 그래서 변경 사항은 훌륭하게 보였습니다 :-). 그러나, 내 오류를 발견 한 후 나는 올바른 파일을 편집했으며'{0}'이나'NULL' 버전도 컴파일되지 않습니다. – nautical