替换反斜杠C.

时间:2012-06-25 18:18:55

标签: c backslash

希望这很容易做到。我正在用C编写一个需要在Windows和Linux上运行的程序。在Linux上它运行良好,但在Windows上(通过Cygwin),它会搞砸,因为环境变量在路径中有反斜杠而不是斜杠。有没有办法取代这些?我尝试了以下但它没有改变任何东西,可能是因为它认为反斜杠是逃避下一个字符,显然不是这种情况。这是我试过的:

char* fixPath(char *env)
{
    char *val[100];
    strcpy(val, getenv(env));
    int index = 0;
    while(val[index])
    {     
         if(val[index] == '\\')
            val[index] = '/';
         else
            index++;
    }
    printf("\n***%s",val);
    return val;
};

int main(int argc, char *argv[])
{
    char *test1;
    test1 = fixPath("SERVER1");
    printf("\n*****%s",test1);
...
}

这样做的正确方法是什么?

5 个答案:

答案 0 :(得分:4)

主要问题:

(1)

char *val[100];

应该是:

char val[100];

(2)

您不能将局部变量(val)作为函数结果返回,因为它将超出范围。

次要问题:

这里的逻辑是错误的:

while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     else
        index++;
}

它应该是:

while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     index++;
}

虽然这不是致命的。

答案 1 :(得分:2)

你的记忆管理存在缺陷。首先,您声明char *val[100]而不是char val[100]。然后,您尝试通过引用返回该本地地址,这是未定义的行为。你最好将缓冲区作为参数传递给函数,并使其成为一个字符数组。不是一个指针数组。

哦,你正在将一个字符串文字("SERVER1")投射到char*中,这也很糟糕。将其设为const char*

void fixPath(const char* env, char* fixed)
{
//...
}

int main(int argc, char *argv[])
{
    char test1[100];
    fixPath("SERVER1", test1);
    printf("\n*****%s",test1);
...
}

现在,使用100的固定缓冲区大小是危险的,但是在答案中只能提到很多问题......

答案 2 :(得分:0)

char *val[100];
strcpy(val, getenv(env));
int index = 0;
while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     else
        index++;
}

您已将val声明为指针数组。它应该是char的数组。

因此,您遍历数组指针,而val[index]非空。这是一个问题。您没有遍历字符串并比较字符,而是将指针与\\进行比较。

您还应该在每次迭代时增加index,不仅在找不到匹配项时,尽管这不是您问题的根源。

答案 3 :(得分:0)

您的功能的内存管理存在问题。您正在返回指向本地分配的内存的指针。 尝试使用此通用字符串替换函数:What is the function to replace string in C?

答案 4 :(得分:0)

我知道这对你的程序没有帮助,但为了功能,你可以试试这个Perl单行程。

perl -pi -e 's/\//\\/g' filename(s) 

这可以处理多个文件,并用反斜杠替换所有正斜杠。