在C语言中将一个字符串的字符复制到另一个字符串中。

3
我可以帮您进行翻译。以下是需要翻译的内容:

我有一个字符串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); 

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

字符指针字符串以空字符结尾。如果您想在代码中使用colorX作为字符串(我假设您在将0xbb转换为187时这样做),则需要将它们扩展一个字节并将此字节设置为0。 - Dmitry Alexeyev
如果你只想跳过2个字符,为什么不直接像这样做:strncpy(color2, string+2, 2); color2[2] = '\0'等等? - Anthales
是的,谢谢你们两位。我已经想通了 :) @Anthales,感谢您指出我根本不需要strtok。 - Markus
你提到你正在寻找187,但从问题的其余部分并不明显。为什么不先在较大的字符串上使用strtoul而不是先将其切成几块呢? - Mr Lister
@MrLister 实际上我正在寻找一种工具,它可以将用十六进制表示的颜色切成三个不同的值,然后我会将它们转换为十进制值(RGB),但是我已经通过在我的数组中添加一个空格符“\0”来解决了这个问题 :) - Markus
2个回答

5
首先,你需要将 \0 的大小增加1。
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);

我认为他并不打算将 bbCC 复制到 color2 中,他可能只想要 bb(正如他在第一句话中所暗示的那样)。 - Anthales
1
实际上,Anthales是正确的,但Jack提供的解决方案包含足够的信息,我可以根据自己的需求进行调整。不幸的是,我只能接受一个人,而zmbq是第一个给出实际正确答案的人。如果我有15个声望,我会投票支持你的问题。谢谢你的帮助。 - Markus

1

嗯,color1color2都是两个字节长的 - 你没有空间放置\0终止符。当你将它们之一作为字符串查看时,你会得到更多你所希望的字符。如果你将它们视为两个字符,你将得到正确的结果。

你应该将它们定义为3个字符长,并在末尾放置\0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接