2012-06-25 165 views
2

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

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

为什么不按原样使用路径? – dirkgently

+1

反斜杠是转义字符,当它们出现在源代码中的字符串文字中时。内存中的字符串中的反斜杠不能用作转义字符,而用另一个字符替换它们可能无法解决您的问题。 –

+0

也许试试Perl正则表达式? perl -pi -e's/\ // \\/g' 这将直接编辑该文件,因此您可能需要首先对其进行测试。 – squiguy

回答

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

旧的逻辑应该工作吗?只是它每次需要更换角色时都要经过循环。 – Laserallan

+0

@Laseralian:真的 - 我现在更新了答案 –

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每次迭代中,不仅当你没有找到一个匹配,尽管这不是你的问题的根源..

+0

Downvoter谨慎解释?这里到底出了什么问题? –

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的固定缓冲区的大小是危险的,当然,但只有这么多问题,一个可以参考的答案...

0

我知道这并不能帮助你的程序,但为了功能的缘故,你可以试试这个Perl单行程。

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

这可以在多个文件上工作,并用反斜杠代替所有正斜杠。