2012-06-25 196 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) 

這可以在多個文件上工作,並用反斜槓代替所有正斜槓。