替换反斜杠C

替换反斜杠C,c,backslash,C,Backslash,希望这很容易做到。我正在用C编写一个程序,需要在Windows和Linux上运行。在Linux上它工作得很好,但在Windows上(通过Cygwin),它会出错,因为环境变量在路径中有反斜杠而不是斜杠。有没有办法取代这些?我尝试了下面的方法,但没有改变任何东西,可能是因为它认为反斜杠正在转义下一个字符,而事实显然并非如此。以下是我尝试过的: char* fixPath(char *env) { char *val[100]; strcpy(val, getenv(env));

希望这很容易做到。我正在用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);
...
}

正确的方法是什么?

主要问题:

(一)

应该是:

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

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

小问题:

这里的逻辑是错误的:

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

char val[100];
while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     index++;
}
虽然这不是致命的

char *val[100];
strcpy(val, getenv(env));
int index = 0;
while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     else
        index++;
}
您已在此处将
val
声明为指针数组。它应该是一个字符数组

因此,当
val[index]
为非空时,可以循环遍历指针数组。这是个问题。您不是在字符串中循环并比较字符,而是在比较指向
\\
的指针


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

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

哦,您正在将字符串文本(
“SERVER1”
)转换为
字符*
,这也很糟糕。将其设置为
常量字符*

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

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

现在,使用100的固定缓冲区大小当然是危险的,但答案中只有这么多问题可以参考…

函数的内存管理有问题。您正在返回指向本地分配内存的指针。
尝试使用这个通用字符串替换函数:

我知道这对您的程序没有帮助,但出于功能考虑,您可以尝试使用这个Perl one liner

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

这可以用于多个文件,并将所有正向斜杠替换为反斜杠。

反斜杠在源代码中以字符串文字形式出现时是转义字符。内存中字符串中的反斜杠不充当转义字符,用另一个字符替换它们可能不会解决您的问题?perl-pi-e's/\/\\/g'这将直接编辑文件,因此您可能希望首先对其进行测试。我将尝试使用给定的路径,但如果尝试并执行命令(ant-f path),则返回“ant-f C:servernewfolderjboss”。它没有向前或向后的斜线。但是旧的逻辑应该有效吗?只是每次需要替换一个角色时,它都会再次通过循环。