希望这很容易做到。我正在用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);
...
}
这样做的正确方法是什么?
答案 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)
这可以处理多个文件,并用反斜杠替换所有正斜杠。