C 中将字符从字符串复制到另一个字符串

Mar*_*kus 3 c string truncate char strncpy

我有一个字符串 AAbbCC 我需要的是复制前两个并将它们添加到数组中,然后复制中间两个并将它们添加到数组中,最后复制最后两个并将它们添加到数组中。

这就是我所做的:

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); 
Run Code Online (Sandbox Code Playgroud)

它通过了那些 bb,但也通过了前一个的 AA ..即使数组只有两个位置,当我在其上使用 strtol 时,它给了我一些大值,而不是我正在寻找的 187 ..如何摆脱它?或者如何让它以其他方式工作?任何意见,将不胜感激。

Jac*_*ack 5

首先,您需要为\0.

char color1[3];
char color2[5];
Run Code Online (Sandbox Code Playgroud)

进而:

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

strncpy(color2, string + 2, 4); 
color2[4] = '\0';
Run Code Online (Sandbox Code Playgroud)

假如说

char *string = "AAbbCC"; 

printf("color1 => %s\ncolor2 => %s\n", color1, color2);
Run Code Online (Sandbox Code Playgroud)

输出是:

color1 => AA
color2 => bbCC
Run Code Online (Sandbox Code Playgroud)

我希望这对你有帮助。

更新

您可以编写一个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;
}
Run Code Online (Sandbox Code Playgroud)

然后:

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);
Run Code Online (Sandbox Code Playgroud)

输出:

color1 => AA, color2 => bb, color3 => CC
Run Code Online (Sandbox Code Playgroud)

并且不要忘记:

free(c1);
free(c2);
free(c3);
Run Code Online (Sandbox Code Playgroud)