2016-11-09 35 views
-1
char** strSplit(const char* str, const char splitter) 
{ 
    unsigned long splitterCount = strSplitCount(str, splitter) + 1; 

    char** result = new char*[splitterCount]; 

    unsigned long startRange = 0, endRange = 0; 
    for (unsigned long i = 0; i < splitterCount; i++) 
    { 
     while (str[endRange] == splitter) 
     { 
      endRange++; 
      startRange++; 
     } 
     while (str[endRange] != splitter && str[endRange] != '\0') 
     { 
      endRange++; 
     } 

     result[i] = new char[(endRange - startRange + 1)]; 

     strCopy(result[i], str); 

     //  unsigned long indexOffset = 0; 
     //  for (unsigned long j = startRange; j < endRange; j++) 
     //  { 
     //   if (str[j] != splitter) 
     //   { 
     //    result[i][indexOffset] = str[j]; 
     //   } 
     //   indexOffset++; 
     //  } 
     //  result[i][indexOffset] = '\0'; 
     // 
     //  startRange = ++endRange; 
    } 

    return result; 
} 

此函數需要一個cstring的const char *和一個要在字符串中拆分的const char *。該函數正確地將字符串分割成char **並返回它。爲了使看起來更清潔的功能,我做了一個strCopy函數,在這個函數之外正確地工作。但是,當在函數中使用strCopy時,Visual Studio會引發嚴重錯誤。但是,如果取消評論代碼的註釋並刪除strCopy函數,使事情變得更有趣,數據將被正確複製並且不會引發錯誤。那麼爲什麼我的strCopy函數不起作用?當從char *複製到char *時出現嚴重錯誤使用自定義字符串複製函數

void strCopy(char* dest, const char* src) 
{ 
    while (*src) 
    { 
     *dest = *src; 
     src++; 
     dest++; 
    } 
    *dest = '\0'; 
} 
+0

如果您使用的是C++,那麼爲什麼要標記C並使用strcpy?使用'str :: string'代替 –

+0

C不是C++不是C!刪除不相關的標籤。 – Olaf

回答

0

看這個說法

result[i] = new char[(endRange - startRange + 1)]; 

很顯然,你需要從startRange複製str高達endRange並與終止零追加結果字符串。

但是,您正試圖複製所有字符串str

strCopy(result[i], str); 

你需要寫一個函數或者像std::strncpy或類似std::memcpy,並用它來複制子。

+1

我甚至不會試圖理解這個完全混淆和破壞的算法。前面的'while'循環提前'endRange'直到找到分隔符或''\ 0',所以'startRange'在這個中絕對沒有任何有意義的作用。即使算法以這種方式得到調整,它仍然會被完全徹底地破壞,這是非常明顯的。 –

+0

@SamVarshavchik我相信他對他的函數strCopy感到困擾,並且顯示的代碼不是真實的代碼;)當他寫這個函數時,他可以提出一個新的問題:) –

相關問題