2014-12-11 3 views
2

코드 조각이 잘못 작동하고 있으며 어떻게 수행하고 있는지 잘 모릅니다.STRCAT은 동시에 두 개의 변수를 변경합니다.

내가하고 싶은 것입니다 :

  1. 는 현재에서 디렉토리 이름 path하고 파일 이름 filename
  2. 복사 다른 변수 caminho
  3. 복사 이러한 두 파일을 수신하는 기능을 가지고 디렉토리를받은 디렉토리로 이동하십시오.

내 문제가 코드 내 기능은 다음과 같습니다 어떤이 코드가 할 일은이 같은 simething 인쇄가

void fileTransfer(const char* filename, const char* path, bool ts) 
{ 
    std::cout << filename << std::endl; 
    char *caminho; 
    caminho[0] = '\0'; 
    std::cout << "0 " << caminho << ' ' << filename << std::endl; 
    strcat(caminho, path); 
    std::cout << "1 " << caminho << ' ' << filename << std::endl; 
    strcat(caminho, "\\"); 
    std::cout << "2 " << caminho << ' ' << filename << std::endl; 
    strcat(caminho, filename); 
    std::cout << "3 " << caminho << ' ' << filename << std::endl; 

    //does the rest 
} 

:

:
file.txt 
0 file.txt 
C:\Users\Username file.txt 
C:\Users\Username\ file.txt 
C:\Users\Username\file.txt file.txt 

그러나이 코드가 실제로 인쇄

이있다
file.txt 
0 
C:\Users\Username C:\Users\Username 
C:\Users\Username\ C:\Users\Username\ 
C:\Users\Username\C:\Users\Username\C C:\Users\Username\C:\Users\Username\C 

또한이 모든 것 전에 strcatfilename을 인쇄했는데 정확합니다. 누구든지이 코드를 잘못 볼 수 있습니까?

답변

2

경로 및 파일 이름을 복사 할 메모리를 할당하지 않았습니다. 게다가 초기화되지 않은 포인터 만 정의했습니다. 결합 된 문자열이 하나가 더 필요하지 않을 때

올바른 기능은 할당 된 메모리를 해제하는 것을 잊지 마세요 또한

void fileTransfer(const char* filename, const char* path, bool ts) 
{ 
    size_t n = strlen(path) + strlen(filename) + sizeof("\\"); 

    // char *caminho = malloc(n * sizeof(char)); for C or 
    char *caminho = new char[ n ]; 

    caminho[0] = '\0'; 

    strcat(caminho, path); 
    strcat(caminho, "\\"); 
    strcat(caminho, filename); 

    //does the rest 
} 

처럼 보일 수 :

free(caminho); // for C 
delete [] caminho; // for C++ 

고려해야 당신 같은 C++을 사용하고 있다면 std :: string 클래스를 사용할 수 있습니다.

예를

std::string caminho(path); 

caminho += "\\"; 

caminho += filename; 

를 들어

하고 문자열을 얻을 필요가 있다면 당신은 멤버 함수 c_str을 사용할 수 있습니다. 예를 들어

는 는
+0

흠, 나는이 일을 시도했지만 잘못했다.'size_t' (한동안 C/C++로 코딩하지 않았습니다)를 사용하지 않았습니다. 그리고 함수의 마지막에'malloc '에 의해 할당 된 메모리를 지울 필요가 없을까요? – Comum

+0

@Comum 올바른 기능이 어떻게 보이는지 보여주었습니다. 그것은 추가가 필요없는 올바른 코드입니다. –

+0

그래, 그것이 트릭을 해야하는 것처럼 보입니다. 적절한 결과를 얻을 수 있는지 확인하기 위해 구현 중입니다. 건배!!! – Comum

4

caminho 아무 곳이나 가리 키지 않습니다. 임의의 메모리를 덮어 쓰는 중입니다.

왜 C 문자열 조작을 사용합니까? std::string을 사용하십시오.

+0

내가 나쁜 결과를 얻을 자신의 유형'표준 : string'를 변환 할 때 나는 또한 * 문자'로하지만, LCPCTSTR' /'LCPCWSTR' 나는 '함께 일하고'그것을 잘

caminho.c_str() 
작동 . 그렇다면'filename'도 어떻게 업데이트됩니까? 그리고 가장 중요한 이유는 무엇입니까? – Comum

+4

그래서'LPCTSTR'에는'LPCWSTR'에'std :: wstring'을 사용하고'LPCTSTR'에는'std :: basic_string '을 사용하십시오. 그대로, * 정의되지 않은 동작 *을 가지므로 프로그램은 원하는대로 수행 할 수 있습니다. 정말로 C 문자열 조작을 주장한다면 제대로 수행하는 법을 배우십시오. http://www.cprogramming.com/tutorial/c/lesson9.html –

+0

그래, 정보가 부족했다. 건배. – Comum

관련 문제