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

我怎样才能完成我的任务?提前致谢。

4

1 回答 1

3

如果我可以提及您的代码的另一个问题。

您正在返回一个局部变量(您的unsigned char p)。这是未定义的行为。考虑声明一个char* p你分配内存的动态使用malloc然后p像你一样返回。例如:

char* p = malloc(60);

一种常见的做法是sizeof在分配内存时使用,malloc但在这里我直接传递了 60,因为 C 标准保证 achar在所有平台上都是 1 字节。

但是你必须给free分配的内存malloc

或者,您可以更改函数以将缓冲区作为输入参数,然后写入。这样你就可以传递一个普通的数组来调用这个函数。

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

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

位置jinp将更改为\\,然后j将递增,并且在下一行您对后续 char 位置执行相同操作。你确定要这两个任务吗?

顺便说一句,如果您从命令行输入路径,则会为您处理转义。例如,考虑以下代码:

#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 上,这是我得到的。无需任何转义,因为这是为您处理的。

于 2013-07-02T11:35:29.950 回答