2011-03-10 34 views
1

我需要創建一個函數來接受目錄路徑。但爲了讓編譯器來讀取反斜線在我需要創建一個函數,將一個反斜槓反斜槓2 ..所以到目前爲止,這是我的代碼:如何在C++中添加兩個反斜槓

string stripPath(string path) 
{  
     char newpath[99999]; 
     //char *pathlong; 
     char temp; 
     strcpy_s(newpath, path.c_str()); 
     //pathlong = newpath; 
     int arrlength = sizeof(newpath); 

      for (int i = 0; i <= arrlength ;i++) 
      { 
       if(newpath[i] == '\\') 
       { 
        newpath[i] += '\\'; 
        i++; 
       } 
      } 
      path = newpath; 
     return path; 
} 

這個代碼接收來自用戶的輸入,是一個帶有單個反斜槓的目錄路徑。 問題是它給出了一個髒文本輸出;

回答

2

在這一行:

if(newpath[i] = '\\') 

==取代=

在這一行:

newpath[i] += '\\'; 

這應該是一個\添加到字符串(我認爲這是你想要的),但它實際上在目前的性格有些古怪char數學。所以不是插入字符,而是破壞數據。

嘗試此代替:

#include <iostream> 
#include <string> 
#include <sstream> 

int main(int argc, char ** argv) { 
    std::string a("hello\\ world"); 
    std::stringstream ss; 

    for (int i = 0; i < a.length(); ++i) { 
    if (a[i] == '\\') { 
     ss << "\\\\"; 
    } 
    else { 
     ss << a[i]; 
    } 
    } 

    std::cout << ss.str() << std::endl; 
    return 0; 
} 
+0

(我可能偷步這裏,因爲這個問題目前似乎要結束了中期句...) – phooji 2011-03-10 02:59:50

+0

仍然導致一個骯髒的文字。 – 2011-03-10 03:01:55

+0

它改變了反斜槓髒文本 – 2011-03-10 03:03:02

5

int arrlength = sizeof(newpath);使整個陣列的大小(在char多個)被分配到arrlength。這意味着即使路徑較短(可能是這種情況),也會迭代數組中的99999個字符。

你的循環條件也允許進入一個過去的數組的邊界(自上次(第九萬九千九百九十九)元素實際上是在索引99998,不99999 - 陣列從零開始):

for (int i = 0; newpath[i]] != '\0'; i++) 

另外,當你可以直接循環訪問string對象時,沒有理由先將字符串複製到字符數組中。

無論如何,沒有必要從用戶輸入逃避反斜槓。反斜槓像其他任何字符一樣;只有在代碼中嵌入字符串文字時纔是特別的。

+0

你的意思是? – 2011-03-10 03:07:17

+0

+1用於查找我最初忽略的錯誤。我想,我們兩個人之間,我們還沒有上市的是對這種錯誤雖然:) – phooji 2011-03-10 03:11:41

+0

@phooji的事情:我停止尋找時,我意識到什麼的代碼在做;-) – Cameron 2011-03-10 03:16:25

1

很多錯誤。沒有測試這一點,但它讓你更接近 http://www.cplusplus.com/reference/string/string/

string stripPath(string path) 
{  
     string newpath; 
      for (int i = 0; i <= path.length() ;i++) 
      { 
       if(path.at(i) == '\\') 
       { 
        newpath.append(path.at(i)); 
        newpath.append(path.at(i)); 
       } 
       else 
        newpath.append(path.at(i)); 
      } 
     return newpath; 
} 
1

條件if (newpath[i] = '\\')if (newpath[i] == '\\')

聲明newpath[i] += '\\';不會給出連接的預期結果。它會將'\\'的整數值加到newpath[i]

此外,爲什麼你在函數內部使用char newpath[99999];數組。 newpath可能是std::string newpath

int main() 
{ 
    std::string path = "c:\\test\\test2\\test3\\test4"; 

    std::cout << "orignal path: " << path << std::endl; 

    size_t found = 0, next = 0; 
    while((found = path.find('\\', next)) != std::string::npos) 
    { 
    path.insert(found, "\\"); 
    next = found+4; 
    } 

    std::cout << "path with double slash: " << path << std::endl; 

    return 0; 
} 
1

但爲了讓編譯器來讀取 反斜線在我需要創建一個 功能,這將使一個 反斜槓2反斜線

編譯器只讀取字符串時,你編譯,在這種情況下,你將需要兩個,因爲第一個反斜槓將是一個轉義字符。所以如果你在代碼中有一個靜態路徑字符串,你將不得不這樣做:

std::string path = "C:\\SomeFolder\\SomeTextFile.txt"; 

編譯器永遠不會真的調用你的函數只編譯它。所以編寫一個這樣的函數讓編譯器可以讀取一個字符串不會解決你的問題。

+1

@Codeface:這是對OP的非常懷疑的解釋 - 我喜歡它。我想我假設在這裏進行了一些代碼生成,例如,這個程序需要添加轉義,因爲路徑正在以字符串文字的形式寫入文件。 – phooji 2011-03-10 03:43:55