【问题标题】:copy character from string to another string in C将字符从字符串复制到C中的另一个字符串
【发布时间】:2012-05-09 16:23:41
【问题描述】:

我有一个字符串 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 .. 如何获得摆脱那个?或者如何让它以其他方式工作?任何建议将不胜感激。

【问题讨论】:

  • char * 字符串以空值结尾。如果您想在代码中将 colorX 用作字符串(我假设您在将 0xbb 转换为 187 时会这样做),您需要将它们扩展一个字节并将此字节设置为 0。
  • 如果你只想跳过 2 个字符,为什么不干脆做类似strncpy(color2, string+2, 2); color2[2] = '\0' 之类的事情?
  • 是的,谢谢你们俩.. 我想通了 :) 和@Anthales 感谢您指出我根本不需要 strtok
  • 您提到您正在寻找 187,但这在问题的其余部分并不明显。为什么不在较大的字符串上使用strtoul,而不是先将其切成碎片?
  • @MrLister 实际上我正在寻找一种工具,它将十六进制值表示的颜色切割成 3 个不同的值,然后我会将它们转换为十进制值 (RGB),但我已经通过添加一个空格来实现for '\0' 进入我的数组:)

标签: c string char truncate strncpy


【解决方案1】:

好吧,color1color2 有两个字节长 - 你没有空间容纳 \0 终止符。当您将其中一个视为字符串 时,您会得到更多想要的字符。如果你把它们看成两个字符,你会得到正确的结果。

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

【讨论】:

    【解决方案2】:

    首先,您需要为 \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 是对的,但是Jack 提供的解决方案包含了足够的信息,无论如何我都可以根据自己的需要对其进行调整。不幸的是,我只能接受一个人,而 zmbq 是第一个有实际正确答案的人。如果我碰巧有 15 名声望,我会投票赞成你的问题。感谢您的帮助。
    猜你喜欢
    • 2014-05-26
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多