替换反斜杠C
希望这很容易做到。我正在用C编写一个程序,需要在Windows和Linux上运行。在Linux上它工作得很好,但在Windows上(通过Cygwin),它会出错,因为环境变量在路径中有反斜杠而不是斜杠。有没有办法取代这些?我尝试了下面的方法,但没有改变任何东西,可能是因为它认为反斜杠正在转义下一个字符,而事实显然并非如此。以下是我尝试过的:替换反斜杠C,c,backslash,C,Backslash,希望这很容易做到。我正在用C编写一个程序,需要在Windows和Linux上运行。在Linux上它工作得很好,但在Windows上(通过Cygwin),它会出错,因为环境变量在路径中有反斜杠而不是斜杠。有没有办法取代这些?我尝试了下面的方法,但没有改变任何东西,可能是因为它认为反斜杠正在转义下一个字符,而事实显然并非如此。以下是我尝试过的: char* fixPath(char *env) { char *val[100]; strcpy(val, getenv(env));
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”。它没有向前或向后的斜线。但是旧的逻辑应该有效吗?只是每次需要替换一个角色时,它都会再次通过循环。