C char数组连接

red*_*iun 11 c arrays concatenation char

是)我有的:

char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};
Run Code Online (Sandbox Code Playgroud)

所以我想cmd通过添加一个来自的连接来连接v.

明显:

strcat(cmd, v[3]);
Run Code Online (Sandbox Code Playgroud)

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

MGr*_*ant 12

嗯.据我所知,你想从第二个数组中添加一个char?所以你必须使用

  strncat (cmd, &v[3], 1);
Run Code Online (Sandbox Code Playgroud)

:-)


hyd*_*yde 9

您的方法存在问题.

  • C字符串必须以0字节结尾,换句话说'\0'字符.使用""自动添加,但是你必须自己添加它,并且所有字符串函数都依赖于那里的0.

  • 你的v数组包含字符,而不是字符串,并strcat采用字符串.

一个解决方案

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

这会将您的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]);
Run Code Online (Sandbox Code Playgroud)

注意:像这样的sizeof只有在buf真正是一个数组的情况下才能工作,并[]在这里声明.同样使用snprintf,使用相同的缓冲区作为目标和格式参数可能会产生意外的结果,所以我添加了一个新的目标缓冲区变量.

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

snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]);
Run Code Online (Sandbox Code Playgroud)

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


iab*_*der 5

千万不能使用此:

strcat(cmd,&v[3]);
Run Code Online (Sandbox Code Playgroud)

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

strncat(cmd, &v[3], 1);
Run Code Online (Sandbox Code Playgroud)