3

文字列AAbbCCがあります。必要なのは、最初の2つをコピーして配列に追加し、次に真ん中の2つをコピーして配列に追加し、最後に最後の2つを配列に追加することです。

これが私がすることです:

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); 

それはそれらのbbを渡しますが、前のものからのAAも渡します..配列には2つの場所しかありませんが、strtolを使用すると、私が探している187ではなく大きな値が得られます..それを取り除く方法?またはそれを他の方法で機能させる方法は?何かアドバイスをいただければ幸いです。

4

2 に答える 2

5

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

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

その後:

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

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

仮定して

char *string = "AAbbCC"; 

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

出力は次のとおりです。

color1 => AA
color2 => bbCC

これがお役に立てば幸いです。

アップデート

substr()文字列の一部(xからyまで)を取得してから文字列にコピーする関数を作成できます。

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);
于 2012-04-29T20:47:39.820 に答える
1

ええと、color12color2バイトの長さです-\0ターミネータの余地はありません。それらの1つを文字列として見ると、希望する文字が増えます。それらを2文字として見ると、正しい結果が得られます。

それらを3文字の長さとして定義し、最後に\0を付ける必要があります。

于 2012-04-29T20:35:56.063 に答える