2012-04-29 14 views
3

私は最初の2つをコピーして配列に追加し、中間の2つをコピーして最後の2つを追加して追加しますそれらを配列に変換します。文字をCの文字列から別の文字列にコピー

これは私が何をすべきかです:

char color1[2]; 
char color2[2]; 
char color3[2]; 

strncpy(color1, string, 2); // I take the first two characters and put them into color1 

// now I truncate the string to remove those AA values: 

string = strtok(string, &color1[1]); 

// and when using the same code again the result in color2 is bbAA: 

strncpy(color2, string, 2); 

それは、私はそれは私にいくつかの大きな値を与えることにstrtolはを使用する場合、配列は、2つだけの場所を持っているにもかかわらず... BBも前のものからAAそれらを渡します私が探している187ではない。それをどうやって取り除くのか?またはそれを他の方法で動作させる方法アドバイスをいただければ幸いです。

+0

のchar *文字列がNULL終端されています。あなたは(私は187に0xbb変換するときにあなたが想定する)文字列として、あなたのコード内でcolorXを使用する場合は、なぜ、あなただけの2つの文字をスキップしたい場合は0 –

+0

にこのバイトを設定し、1つのバイトの広告でそれらを拡張する必要がありますあなたは、単にstrncpyを(カラー2、文字列+ 2、2) 'のような何かをしません。 color2 [2] = '\ 0''など? – Anthales

+0

は、ええ、あなたの両方を感謝..私はあなたが187探していることは言うが、それはの残りの部分から明らかでない私は、すべての – Markus

答えて

1

まあ、color1color2の長さは2バイトです。\ 0ターミネータのためのスペースはありません。文字列としてのいずれかを見ると、あなたが望む文字数が増えます。それらを2文字で見ると、正しい結果が得られます。

これらを3文字の長さとして定義し、末尾に\ 0を入れる必要があります。

+0

ありがとうございました、\ 0は仕事をしました:) – Markus

4

まず、\0に+1のサイズを追加する必要があります。

char color1[3]; 
char color2[5]; 

、その後:

char *string = "AAbbCC"; 

printf("color1 => %s\ncolor2 => %s\n", color1, color2); 

出力があると仮定すると

strncpy(color1, string, 2); 
color1[3] = '\0'; 

strncpy(color2, string + 2, 4); 
color2[4] = '\0'; 

color1 => AA 
color2 => bbCC 

私は、これはあなたを助ける願っています。あなたは(XからYへの)文字列の一部を取得するためにsubstr()関数を記述して、あなたの文字列にコピーすることができ

UPDATE

その後
char * substr(char * s, int x, int y) 
{ 
    char * ret = malloc(strlen(s) + 1); 
    char * p = ret; 
    char * q = &s[x]; 

    assert(ret != NULL); 

    while(x < y) 
    { 
     *p++ = *q++; 
     x ++; 
    } 

    *p++ = '\0'; 

    return ret; 
} 

char *string = "AAbbCC"; 
char color1[3]; 
char color2[4]; 
char color3[5]; 
char *c1 = substr(string,0,2); 
char *c2 = substr(string,2,4); 
char *c3 = substr(string,4,6); 

strcpy(color1, c1); 
strcpy(color2, c2); 
strcpy(color3, c3); 

printf("color1 => %s, color2 => %s, color3 => %s\n", color1, color2, color3); 

出力:

color1 => AA, color2 => bb, color3 => CC 

そして忘れてはいけない:

free(c1); 
free(c2); 
free(c3); 
+0

彼は 'bbcc'を' color2'にコピーしようとは思わなかったので、彼はおそらく 'bb'だけを望んでいました(彼の最初の文を暗示しています)。 – Anthales

+0

@Anthales:私のアップデートをチェックしてください。 – Jack

+1

実際にはAnthalesが正しいですが、Jackが提供するソリューションには十分な情報が含まれているため、必要に応じて調整することができました。残念ながら、私は1人の人に同意を与えることができ、zmbqは実際の正解を持つ最初の人でした。もし私が15の評判を持ってしまったら、私はあなたの質問に投票します。ご協力ありがとうございました。 – Markus

関連する問題