2016-11-09 11 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)]; 

あなたがendRangeまでstartRangeからstrをコピーし、終端ゼロの結果文字列を追加する必要があることは明らかです。

ただし、すべての文字列strをコピーしようとしています。

strCopy(result[i], str); 

は、次のいずれかのようなstd::strncpyまたはstd::memcpyのような関数を記述し、サブストリングをコピーするためにそれを使用する必要があります。

+1

私はこの完全に難読化され、壊れたアルゴリズムの意味を作ろうとしません。前の 'while'ループは区切り文字または' '\ 0'を見つけるまで 'endRange'を進めるので、' startRange'は全く意味のある役割はありません。アルゴリズムがこのように調整されても、それは完全に完全に壊れてしまいます。それは非常に明白です。 –

+0

@SamVarshavchik私は彼がstrCopyの機能について気にしていると確信しています、そして、表示されたコードは実際のコードではありません;)彼が新しい質問をすることができます。 –

関連する問題