【问题标题】:C char array concatenationC char 数组连接
【发布时间】:2012-11-05 09:21:20
【问题描述】:

我有什么:

char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};

所以我想通过添加来自v 的字母来连接cmd

显然:

strcat(cmd, v[3]);

不起作用,因为strcat 不接受v[n] 参数n = int

【问题讨论】:

    标签: c arrays char concatenation


    【解决方案1】:

    嗯。据我了解,您想从第二个数组中添加一个字符? 所以你必须使用

      strncat (cmd, &v[3], 1);
    

    :-)

    【讨论】:

    • 我选择了另一种方法,但这也很有效,而且非常简单。谢谢你:)
    【解决方案2】:

    你的方法有问题。

    • C 字符串必须以 0 字节结尾,即 '\0' 字符。使用"" 会自动添加它,否则您必须自己添加它,并且所有字符串函数都依赖于那个 0。

    • 你的 v 数组包含字符,而不是字符串,strcat 接受字符串。

    一种解决方案:

    char cmd[50] = "some text here";
    char *v[] = {"a","s","d","c","b"};
    strcat(cmd,v[3]);
    

    这会将您的 char 数组转换为指向 C 字符串的指针数组。

    另外,您有责任注意cmd[] 包含足够的空间来容纳您使用 strcat 添加到其中的任何内容(这里是这样)。通常最好使用snprintf 来进行字符串连接,因为它需要目标数组的总大小包括 终止null,并且总是在那里添加null,因此更难搞砸。原始 char 数组的示例:

    char cmd[50] = "some text here";
    char buf[50];
    char v[] = {'a','s','d','c','b'};
    snprintf(buf, sizeof buf, "%s%c", cmd, v[3]);
    

    注意:只有当buf 确实是一个数组时,这样的 sizeof 才有效,用[] 声明,就像这里一样。同样使用 snprintf,使用相同的缓冲区作为目标和格式参数可能会产生意想不到的结果,所以我添加了一个新的目标缓冲区变量。

    还有一个 snprintf 示例,仅使用原始的两个数组,附加到 cmd 当前内容的末尾:

    snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]);
    

    很明显,在这种特殊情况下,在其他答案中建议添加 1 个字符的 strncat(cmd, &v[3], 1) 更好,但 snprintf 的好处是,您可以添加 printf 支持的所有数据类型,而不是字符。

    【讨论】:

    • 谢谢!如果我能注意 cmd[] 包含足够的空间,你认为哪一种是最快的方法?
    • strncat 可能是其中最快的,但最快的是int len=strlen(cmd); cmd[len] = v[3]; cmd[len+1] = 0;。注意数组索引是如何从 0 开始的,所以 some_cstring[strlen(some_cstring)] 总是 0。
    • 意外的深入回答 - 感谢您提供价值!
    【解决方案3】:

    不要不要使用这个:

    strcat(cmd,&v[3]);
    

    &v[3] 不是指向空终止字符串的指针!而是使用

    strncat(cmd, &v[3], 1);
    

    【讨论】:

      【解决方案4】:

      首先,确保变量“cmd”分配了足够的内存。

      其次,提到“v[3]”是一个有符号字节的值。您必须使用以下调用 strncat(不是 strcat):

      strncat(cmd,&v[3],1);
      

      【讨论】:

        【解决方案5】:

        怎么样

        strcat(cmd,&v[3]);
        

        【讨论】:

        • 这将添加多个字符,并且它会超出要复制的数组的末尾,因为没有空终止。
        【解决方案6】:

        问题是你也没有使用 strcat:

        char *strcat (char *dest, const char *src);
        

        因为你这样做

        char *strcat (char *dest, char src);
        

        所以你必须声明一个 char * 作为你的 char。

        【讨论】:

          【解决方案7】:
          char buf[2];
          
          sprintf(buf,"%c", V[3]);
          strcat(cmd, buf);
          

          strncat (cmd, &v[3],1);
          

          你不能这样做

          strcat(cmd,&v[3]);
          

          这会将 V 数组从单元格 3 复制到数组末尾,而不是仅复制 V[3]

          我可以建议另一种解决方案

          int len = strlen(cmd);
          cmd[len]=v[3];
          cmd[len+1] = '\0';
          

          【讨论】:

            猜你喜欢
            • 2011-01-14
            • 2014-08-06
            • 2017-09-13
            • 2012-05-18
            • 1970-01-01
            • 2018-11-03
            • 1970-01-01
            • 2016-09-23
            相关资源
            最近更新 更多