C字符数组连接

11

我所拥有的:

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

所以我想通过从v中添加一个字母来连接cmd

显然:

strcat(cmd, v[3]);

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

7个回答

12

嗯,就我理解的来看,您想从第二个数组中添加一个单个字符?那么您需要使用:

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

:-)


我选择了另一种方法来完成它,但这个也可以,而且非常简单。谢谢 :) - redgiun

9

你的做法有问题。

  • 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 来进行字符串连接,因为它将目标数组的总大小(包括终止空值)加起来,并且总是在那里添加空值,因此更难出错。以下是使用您原始的 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示例,仅使用您原始的两个数组,在当前cmd内容的末尾添加:
snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]);

显然,在这种情况下,其他答案中建议使用strncat(cmd,&v[3],1)来添加一个字符的方式更好。但是,snprintf的好处在于,你可以添加所有由printf支持的数据类型,而不仅仅是字符。


1
谢谢!如果我能确保cmd[]包含足够的空间,你认为哪种方法是最快的? - redgiun
strncat可能是其中最快的,但最快的方法是int len=strlen(cmd); cmd[len] = v[3]; cmd[len+1] = 0;。请注意,数组索引从0开始,因此some_cstring[strlen(some_cstring)]始终为0。 - hyde
意外的深入回答 - 感谢您提供的价值! - OxenBoxen

5

不要使用这个:

strcat(cmd,&v[3]);

&v[3] 不是指向以空字符结尾的字符串的指针!请使用

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

2

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

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

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

1

怎么样?

strcat(cmd,&v[3]);

1
这将添加多个字符,并且它将查找超出数组末尾以被复制的内容,因为没有空终止符。 - Benj

1

问题在于您没有正确使用strcat函数:

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

因为你这样做

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

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


1
char buf[2];

sprintf(buf,"%c", V[3]);
strcat(cmd, buf);

或者

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

你无法做到它。

strcat(cmd,&v[3]);

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

我可以提供另一种解决方案

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

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