【发布时间】: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
我有什么:
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
嗯。据我了解,您想从第二个数组中添加一个字符? 所以你必须使用
strncat (cmd, &v[3], 1);
:-)
【讨论】:
你的方法有问题。
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 支持的所有数据类型,而不是字符。
【讨论】:
int len=strlen(cmd); cmd[len] = v[3]; cmd[len+1] = 0;。注意数组索引是如何从 0 开始的,所以 some_cstring[strlen(some_cstring)] 总是 0。
不要不要使用这个:
strcat(cmd,&v[3]);
&v[3] 不是指向空终止字符串的指针!而是使用
strncat(cmd, &v[3], 1);
【讨论】:
首先,确保变量“cmd”分配了足够的内存。
其次,提到“v[3]”是一个有符号字节的值。您必须使用以下调用 strncat(不是 strcat):
strncat(cmd,&v[3],1);
【讨论】:
怎么样
strcat(cmd,&v[3]);
【讨论】:
问题是你也没有使用 strcat:
char *strcat (char *dest, const char *src);
因为你这样做
char *strcat (char *dest, char src);
所以你必须声明一个 char * 作为你的 char。
【讨论】:
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';
【讨论】: