2013-07-02 4 views
2

Я не знаю, что название правильно соответствует моей проблеме или нет. Итак, я просто поеду с ним. Вот проблема: мне нужно ввести массив символов пути к файлу (в Windows), содержащий много обратных косых черт в нем, например. «C: \ myfile.txt» и возвращает массив беззнакового символа путей файла C-стиля, например. "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); 

Обычной практикой является использование sizeof при выделении памяти с malloc, но здесь я прошел 60 непосредственно в качестве стандарта C гарантирует, что char будет 1 байт на всех платформах.

Но у вас должно быть free память, присвоенная malloc.

Или, альтернативно, вы можете изменить функцию, чтобы принять буфер в качестве входного аргумента, который он затем записывает. Таким образом, вы можете передать нормальный массив, где вы могли бы вызвать эту функцию.

Что касается вашего вопроса, слэш здесь:

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

Позиция j в p будет изменено на \\, то 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: \»).

По крайней мере, в Windows 7 с cygwin это то, что я получаю. Нет необходимости в каких-либо побегах, поскольку это обрабатывается для вас.

+0

Может быть, вы можете добавить эти вещи в вашем сообщении выше: Наряду с «свободным» сделайте p-точку «NULL», или это будет висячий указатель –

+1

+1, но 'char * p = malloc (60);' достаточно, sizeof (char) гарантированно будет 1 байт –

+0

@DavidRF Спасибо, я уточню свой ответ, и я объясню, почему нет необходимости в 'sizeof', просто подумал, что это может быть немного менее запутанным, но, тем не менее,) – Nobilis