2014-04-27 3 views
0

내 프로그램에서 파일을 열어야하며 파일 경로는 argv[1]을 사용하여 명령 줄에서 검색됩니다.이상한 문자열 결과

나는 fopen을 사용하여 파일을 열려고하지만 파일 경로에 이중 백 슬래시가 없으므로 fopen이 작동하지 않으므로 프로그램이 충돌합니다.

필자는 자신의 변환 함수를 작성하고 결과를 확인하기 위해 print를 사용하여 첫눈에 좋았습니다.

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


const char* ConvertToPath(std::string path) 
{ 
    std::string newpath = ""; 
    for(unsigned int i = 0; i < path.length(); ++i) 
    { 
     if(path[i] == '\\') 
     { 
      newpath += "\\\\"; 
     } 
     else 
     { 
      newpath += path[i]; 
     } 
    } 
    printf("%s \n", newpath.c_str()); 
    return newpath.c_str(); 
} 

bool OpenDBC(const char* path) 
{ 
    const char* file = ConvertToPath(path); 
    printf("%s \n", file); 
    FILE* dbc = fopen(file, "rbw"); 
    if (!dbc) 
     return false; 
    return true; 
} 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("Error, expected DBC file."); 
     getchar(); 
     return -1; 
    } 

    if (!OpenDBC(argv[1])) 
    { 
     printf("There was an error opening the DBC file."); 
     getchar(); 
     return -1; 
    } 
    getchar(); 
    return 0; 
} 

내 프로그램으로 DBC 파일 열기 나에게 다음과 같은 결과를 제공합니다 :

문제는 내가 인수로 * 반환 CONST 문자를 사용할 때 .. 나에게 이상한 결과를 제공 내 코드이다

D:\\Achievement.dbc 
a 

const char* file에는 파일 경로의 1 문자 만 포함됩니다. 이유는 무엇입니까?

+6

당신은 정의되지 않은 행동에 의존하고 있습니다. 지역 문자열에서'c_str()'을 반환하는 것은 정말 나쁜 생각입니다. 그냥 대신 문자열을 반환하고'OpenDBC' 내부에서'c_str()'을 호출하십시오. – Chnossos

+1

@ Chnossos의 코멘트는 정확하지만이 문장에 대해서도 궁금합니다. "사용하는 파일 경로에 이중 백 슬래시가 없으므로 fopen이 작동하지 않기 때문에 프로그램이 다운됩니다." 일반적으로 경로가 프로그램의 소스 코드에서 지정되는 경우를 제외하고는 백 슬래시를 이스케이프 할 필요가 없습니다. –

+1

당신은'ConvertToPath'를 전혀 필요로하지 않고 단지'fopen (argv [1])'을 호출하고 결과를 볼 수 있습니다. – CiaPan

답변

1

ConvertToPath 함수가 전혀 필요하지 않습니다. 이중 백 슬래시는 문자열 리터럴에만 필요합니다. std :: string과 같은 변수에는 절대로 사용하지 마십시오.

-1

나는 리눅스 코드를 컴파일하고

D:\\\\Achievement.dbc 
D:\\\\Achievement.dbc 

후자에 ./filereader "D:\\\\Achievement.dbc" 결과를 실행

D:\\Achievement.dbc 
D:\\Achievement.dbc 

./filereader "D:\\Achievement.dbc" 결과를 실행 결과는 명령 때문에 원하는됩니다 복제 할 수 없습니다 라인 인수를 이스케이프해야합니다. 그런 다음 ConvertToPath을 삭제할 수 있습니다.

+0

정의되지 않은 동작은 여러 가지 방법으로 나타날 수 있습니다. http://stackoverflow.com/a/6445794/12711 –

+0

Jap, right. 또한 포인터 문제가 있습니다. –