2013-07-02 2 views
2

제목이 내 문제를 올바르게 해결하는지 알 수 없습니다. 그래서 나는 그걸로 갈 것입니다. 여기에 문제가 있습니다. 예를 들어 많은 백 슬래시가 포함 된 파일 경로 (Windows)의 char 배열을 입력해야합니다. "C : \ myfile.txt"를 반환하고 C 스타일 파일 경로의 부호없는 char 배열을 반환합니다. "C : \ myfile.txt".백 슬래시 문자를 이스케이프하지 않게 만드는 방법

나는 함수를 작성하려고 시도했다. 나는이 발생하고 (나를 위해)

unsigned char* parse_file_path(char *path); 
{ 
    unsigned char p[60]; 
    int i,j; 
    int len = strlen(path); 
    for(i=0,j=0; i<len; i++, j++) 
    { 
     char ch = path[i]; 
     if(ch==27) 
     { 

      p[j++]='\\'; 
      p[j]='\\'; 
     } 
     else 
      p[j] = path[i]; 
    } 
    p[j]='\0'; 
    return p; 
} 

이상한 것은 여기에 경로가 하나의 백 슬래시를 포함입니다 '\'. 하나의 백 슬래시를 얻으려면 경로에 '\'를 써야합니다. 이것은 불가능합니다. 경로에 '\'을 포함 할 수 없습니다. 이것을 parse_file_path("t\es\t \it)과 같이 호출하면 t←s it을 반환합니다. 그러나 parse_file_path("t\\es\\t \\it")t\es\t \it을 반환합니다.

내 작업을 어떻게 수행 할 수 있습니까? 미리 감사드립니다.

+0

C 언어 사양에서는 리터럴 문자열에서 단일 백 슬래시를 얻으려면 이스케이프 처리해야한다고 명시합니다. –

+0

실제 이스케이프 (ASCII 27)로 이스케이프 처리되는 입력의 백 슬래시가 예상되는 것처럼 보입니다. – unwind

+0

@JoachimPileborg 문자열에 이미 이스케이프 처리 된 백 슬래시가 있습니다. 각각의 백 슬래시를 두 번 어떻게 만들 수 있습니까? – muntasir2000

답변

3

코드에 다른 문제를 언급 할 수만 있다면.

로컬 변수 (unsigned char p)가 반환됩니다. 이것은 정의되지 않은 동작입니다. char* p을 지정하여 malloc을 사용하여 메모리를 동적으로 할당 한 다음 p을 반환하는 것으로 간주하십시오. 예 : 뭔가 같은 :

char* p = malloc(60); 

일반적인 방법은 malloc으로 메모리를 할당 할 때 sizeof을 사용하는 것입니다 그러나 여기에서 나는 char는 모든 플랫폼에서 1 바이트가 될 것이라는 C 표준 보증으로 직접 (60)을 통과했습니다.

그러나 으로 할당 된 메모리가 있어야합니다.

또는 버퍼를 입력 인수로 사용하도록 함수를 변경할 수 있습니다. 그렇게하면이 함수를 호출 할 일반 배열을 전달할 수 있습니다. 여기 슬래시 문제에 관한

: pj\\로 변경됩니다

p[j++]='\\'; 
p[j]='\\'; 

위치는 다음 j가 증가되고 바로 다음 줄에 당신은 성공 문자 위치에 대한 동일한 작업을 수행. 두 과제를 정말로 원하니?

그런데 명령 줄에서 경로를 입력하면 이스케이프 처리가 처리됩니다. 예 : 다음 코드를 고려하십시오

#include <stdio.h> 
#include <string.h> /* for strlen */ 
#include <stdlib.h> /* for exit */ 

int main() 
{ 
    char path[60]; 

    fgets(path, 60, stdin); /* get a maximum of 60 characters from the standard input and store them in path */ 

    path[strlen(path) - 1] = '\0'; /* replace newline character with null terminator */ 

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

    if (!handle) 
    { 
     printf("There was a problem opening the file\n"); 
     exit(1); /* file doesn't exist, let's quite with a status code of 1 */ 
    } 

    printf("Should be good!\n"); 

    /* work with the file */ 

    fclose(handle); 

    return 0; /* all cool */ 
} 

을 그리고 당신은 그것을 실행하고 입력 뭔가 같은 '! 잘해야'

C:\cygwin\home\myaccount\main.c

그것은 인쇄해야

(파일이 존재할 경우 'C : \'로 테스트 할 수도 있습니다).

적어도 cygwin을 사용하는 Windows 7에서는 이것이 나옵니다. 이것이 당신을 위해 처리되므로 어떤 탈출구도 필요 없습니다.

+0

위의 여러분의 게시물에있는 것들 :'free'와 함께 p 포인트를'NULL'로 만들거나 매달려있는 포인터 –

+1

+1이 될 것입니다,하지만'char * p = malloc (60);'으로 충분합니다, sizeof (char)는 1 바이트로되어 있습니다. –

+0

@DavidRF 고마워요, 제 대답을 업데이트 할 것이고, 왜 sizeof는 단지 덜 혼란 스럽지만 나쁜 습관 일지 모른다고 생각할 것입니다.) – Nobilis