2013-07-02 62 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); 

通常的做法是用malloc分配内存时使用sizeof但在这里,我直接传递60 C标准保证一个char将在所有平台上1个字节。

但你必须free分配malloc内存。

或者,您可以更改功能采取了缓冲区作为输入参数,它然后写入。这样你可以传递一个普通的数组,你可以调用这个函数。

关于你的斜线的问题,在这里:

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

位置jp将改为\\,然后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,否则它将是一个悬挂指针 – 2013-07-02 11:37:07

+1

+1,但char * p = malloc(60);'足够了,sizeof (char)保证是1个字节 –

+0

@DavidRF谢谢,我会更新我的答案,我会解释为什么不需要'sizeof'只是认为这可能不那么容易混淆,但却是一个坏习惯: ) – Nobilis

相关问题