2011-08-03 15 views
1

私はCで全く初心者です。 文字列(char配列)を分割する簡単なC関数を実行しようとしています。null終端文字ポインタ

配列内の文字配列を終了する方法がわからないため、次のコードは正しく機能しません。 functionで渡されたポインタをcharにする必要があります。分割する元の定数char配列を含むものとそれ以外のポインタは、それぞれの分割部分を別々のchar配列に格納する多次元配列です。

私は明らかにCの経験が不足しているため、多くのハスルが発生しました。

私はこの機能では達成できないと思うのは、個々の配列を '\ 0'で終了することだと思います。

void splitNameCode(char *code, char *output); 

void splitNameCode(char *code, char *output){ 

    int  OS = 0; //output string number 
    int  loop; 
    size_t s = 1; 

    for (loop = 0; code[loop]; loop++){ 
     if (code[loop] == ':'){ 
      output[OS] = '\0'; // I want to terminate each array in the array 
      OS ++; 
     }else { 
      if (!output[OS]) { 
       strncpy(&output[OS], &code[loop], s); 
      }else { 
       strncat(&output[OS], &code[loop], s); 
      } 
     } 
    } 
} 

int main (int argc, const char * argv[]) { 

    char output[3][15]; 
    char str[] = "andy:james:john:amy"; 
    splitNameCode(str, *output); 

    for (int loop = 0; loop<4; loop++) { 
     printf("%s\n", output[loop]); 
    } 

    return 0; 
} 
+0

'output'は多次元配列、つまり文字列の配列であるといえます。しかし、そうであれば、それは 'char ** 'でなければなりません。この関数のシグネチャを与えられたか、それを構築するのに助けが必要なのでしょうか? –

+0

私はおそらくそれを構築するのに役立つ必要があります。私はCでよく知られていません。私はchar **を使用しようとしましたが、それはもっと悪くなりました。私はポインタについての少しの手がかりを持っていますが、私はまだビットとボブが欠けています。 – sumofighter666

答えて

1

ここではあなたのための作業プログラムです。説明が必要な場合はお知らせください。

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

void splitNameCode(char *code, char **output) { 
    int i = 0; 
    char* token = strtok(code, ":"); 
    while (token != NULL) { 
     output[i++] = token; 
     token = strtok(NULL, ":"); 
    } 
} 

int main (int argc, const char *argv[]) { 
    char* output[4]; 
    char input[] = "andy:james:john:amy"; 
    splitNameCode(input, output); 
    for (int i = 0; i < 4; i++) { 
     printf("%s\n", output[i]); 
    } 
    return 0; 
} 
+0

ありがとうございました!素晴らしい作品、しかし、無料の関数は、エラーを言って与える:解放されているポインタは – sumofighter666

+0

割り当てられていないので、私はクリーニングmem関数を削除しました。自分でコードを分析します。私はObjective-Cプログラマなので、ポインタも扱いますが、そのレベルでは扱いません。 – sumofighter666

+0

さて、すみません、私は、@ paulを台無しにしました。メモリクリーンアップコードが属していませんでした。私はもともとメモリを割り当てた 'strdup'でコードを書いていました。 'strtok'自体はメモリを割り当てませんが、返される文字列は元の文字列の中のポインタなので、あらゆる種類の問題が発生します。管理メモリを持つ言語には、これらの問題はありません。 Java、Ruby、Python、Perlなどで 'split'を書くのは素晴らしいことです。なぜなら、それは組み込まれているからです。:) –

1

私が正しくあなたの意図を理解していれば、あなたはandy:james:john:amyのような文字列を取り、andy\0james\0john\0amyに到着しようとしている:ここで コードです。この場合、コードを大幅に簡略化することができます:

void splitNameCode(char *code, char *output){ 
    int loop; 
    strncpy(code, output, strlen(code)); 
    for (loop = 0; output[loop]; loop++){ 
     if (output[loop] == ':'){ 
      output[loop] = '\0'; // I want to terminate each array in the array 
     } 
    } 
} 
+0

あなたは正しいですが、私はAndy James John Amyを "output"という別の配列に割り当てることを望みます。 main()関数で読むことができる "出力"はchar型の多次元配列です。 – sumofighter666