将2个或多个字符串(中间可能包含'\0')按顺序保存到一段分配的内存中

asdk77 2012-10-19 01:16:41
如题,希望将多个字符串(例如2个),按顺序保存到一段分配的内存中,用memcpy复制了第1个,想将第2个、第3个复制进内存中,本打算用strcat连接,但若中间有‘\0’则终止,我需要的是将完整的串复制进去(包括可能出现的‘\0’)请问如何保存这些字符串呢?

请高手指教!谢谢!
...全文
348 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdk77 2012-10-22
  • 打赏
  • 举报
回复
谢谢各位!
AndyZhang 2012-10-19
  • 打赏
  • 举报
回复
memcpy和strcat都不会让中间有'\0'这个可以放心用
mymtom 2012-10-19
  • 打赏
  • 举报
回复
一题多问?
http://topic.csdn.net/u/20121019/01/321a7dce-f4e4-40e1-957d-65def224be4d.html
[code=C/C++]
/**
* @file strjion.c
* @brief
*/

#include <stdarg.h>
#include <stdio.h>
#include <string.h>

char *strjoin(char *s, int n, ...)
{
va_list ap;
char *ptr, *arg;
int i;
size_t len;

va_start(ap, n);
ptr = s;
for (i = 0; i < n; i++) {
arg = va_arg(ap, char *);
len = strlen(arg) + 1;
memcpy(ptr, arg, len);
ptr += len;
}
va_end(ap);

return s;
}

int main(int argc, char *argv[])
{
int i;
char s[1024];

strjoin(s, 3, "123", "456", "789");

for (i = 0; i < 12; i++) {
printf("%02x ", (unsigned int)(unsigned char)s[i]);
}
printf("\n");

return 0;
}
/* 输出:
31 32 33 00 34 35 36 00 37 38 39 00
*/
[/Code]
xiaoxiao8310 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

字符串是以'\0'结尾,但我需要将可能包含‘\0’的“字符串”保存到一段内存中。
[/Quote]
可以继续memcpy,但是要先知道长度。
cao_julians 2012-10-19
  • 打赏
  • 举报
回复
memcpy
memmove----这个更安全
love_debug 2012-10-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

void main()
{
char szbuf[1000]={0}; //定义缓冲区,全部初始化为0,目的是将下面的N个字符串连接起来 ,存在这个缓冲区中
char * str[]={"abcdef","ddd fff","KKK III ","SSSSSSSS","000111333","89754//7","<>sssff0123\n"};
//方法一:使用strcat
for(int i=0;i<sizeof(str)/sizeof(str[0]);i++)
strcat(szbuf,str[i]);
printf(szbuf);
//方法二:使用memcpy
char * tem=szbuf;
for(i=0;i<sizeof(str)/sizeof(str[0]);i++)
{
memcpy(tem,str[i],strlen(str[i]));
tem+=strlen(str[i]);
}
printf(szbuf);
//综合:一定要将目标初始化为0,否则需要自己来进行 '\0'的处理
//另外附上一套C语言教程:http://pan.baidu.com/share/link?shareid=89001&uk=354601140
}
love_debug 2012-10-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

void main()
{
char szbuf[1000]={0}; //定义缓冲区,全部初始化为0,目的是将下面的N个字符串连接起来 ,存在这个缓冲区中
char * str[]={"abcdef","ddd fff","KKK III ","SSSSSSSS","000111333","89754//7","<>sssff0123\n"};
//方法一:使用strcat
for(int i=0;i<sizeof(str)/sizeof(str[0]);i++)
strcat(szbuf,str[i]);
printf(szbuf);
//方法二:使用memcpy
char * tem=szbuf;
for(i=0;i<sizeof(str)/sizeof(str[0]);i++)
{
memcpy(tem,str[i],strlen(str[i]));
tem+=strlen(str[i]);
}
printf(szbuf);
//综合:一定要将目标初始化为0,否则需要自己来进行 '\0'的处理
//另外附上一套C语言教程:http://pan.baidu.com/share/link?shareid=89001&uk=354601140
}
love_debug 2012-10-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

void main()
{
char szbuf[1000]={0}; //定义缓冲区,全部初始化为0,目的是将下面的N个字符串连接起来 ,存在这个缓冲区中
char * str[]={"abcdef","ddd fff","KKK III ","SSSSSSSS","000111333","89754//7","<>sssff0123\n"};
//方法一:使用strcat
for(int i=0;i<sizeof(str)/sizeof(str[0]);i++)
strcat(szbuf,str[i]);
printf(szbuf);
//方法二:使用memcpy
char * tem=szbuf;
for(i=0;i<sizeof(str)/sizeof(str[0]);i++)
{
memcpy(tem,str[i],strlen(str[i]));
tem+=strlen(str[i]);
}
printf(szbuf);
//综合:一定要将目标初始化为0,否则需要自己来进行 '\0'的处理
//另外附上一套C语言教程:http://pan.baidu.com/share/link?shareid=89001&uk=354601140
}
mujiok2003 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
那就接着用memcpy()呀,memcpy()可以无视'\0'的.
[/Quote]

++
DataChat.Club 2012-10-19
  • 打赏
  • 举报
回复
那就接着用memcpy()呀,memcpy()可以无视'\0'的.
asdk77 2012-10-19
  • 打赏
  • 举报
回复
字符串是以'\0'结尾,但我需要将可能包含‘\0’的“字符串”保存到一段内存中。
xiaoxiao8310 2012-10-19
  • 打赏
  • 举报
回复
字符串中间怎么会有\0呢?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧