请问大神,系统如何实现复制功能的?

weixin_44690344 2019-04-20 03:03:22
建了一个基于对话框的mfc,添加了两个编辑框,在第一个编辑框中写入abc\0abc,然后全选,在第二个对话框中粘贴后,结果仍然是abc\0abc; 但是如果我自己写函数实现这个功能的话,把第一个框中的字符串赋给第二个对话框时,结果成了abc,即把\0认成结束符,将字符串截断了! 想请教各位大神,系统的复制粘贴是怎么做到不丢\0后面的字符串的?或者各位大神有什么好方法?(最近处理的数据中会出现\0,经常丢后面的数据,所以想到了系统的复制粘贴,想了解是怎么实现的!网上没有找到合适的资料!)万分感激!
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44690344 2019-04-21
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster的回复:
strlen(sendtext2)+1 即 '\0' ; 改变分割符
一会去试一下,谢谢您!
zgl7903 2019-04-21
  • 打赏
  • 举报
回复
//这里假设已经接收到了完整的数据,没有考虑数据被截断
char *pStr = (char*)pRecv; //指向接收缓冲区
int iTotalLen = 0; //总长度
CStringArray rcvStr; //接收数组
while(iTotalLen < iRecvedLen)
{
  rcvStr.Add(CString(pStr)); //添加到数组
  int iLen = (int)strlen(pStr) + 1; //字符串长度+结束符
  pStr += iLen; //移动到下一组数据起始位置
  iTotalLen  += iLen; //总处理的长度
}

schlafenhamster 2019-04-21
  • 打赏
  • 举报
回复
strlen(sendtext2)+1 即 '\0' ; 改变分割符
weixin_44690344 2019-04-21
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903的回复:
'\0' 其实就是字符串的结束符0 所以可以把接收到的数据当成字符串处理就行, 像MFC的CString 做+运算就可以了
服务器连续执行下面的两个send函数 send(sockConn, sendtext1, strlen(sendtext1)+1 , 0); //sendtext1为"abc" send(sockConn, sendtext2, strlen(sendtext2)+1 , 0); //sendtext2为"efg" 客户端再执行一次recv函数,将接收的数据存到recvtext中,查看内存发现recvtext接收的数据为"abc\0efg\0",(数据是对的),但对这个数据应用时,比如把recvtext赋给其他变量时,得到的结果为"abc",就像您说的,recvtext认为自己只有"abc",遇到\0时就认为自己的字符串已经结束了,但实际上后面还有"efg"呢,所以怎么把"efg"读出来啊?
zgl7903 2019-04-20
  • 打赏
  • 举报
回复
'\0' 其实就是字符串的结束符0 所以可以把接收到的数据当成字符串处理就行, 像MFC的CString 做+运算就可以了
weixin_44690344 2019-04-20
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903的回复:
\表示字符的话用'\\' \单个的话表示转意 "\\0" 这样就不会有问题
我是在做套接字时遇到的问题,服务器连续两次执行send函数向客户端发送信息,而客户端只执行一次recv,因为服务器发送的两次数据中间会自动加上\0,导致客户端recv到的数据只是服务器第一次send的,第二次send的数据丢了,查看内存发现两次的数据都到了客户端,所在想怎么能把两次send的数据都recv到字符串中,两次数据的中间用空格或是换行等区分!
weixin_44690344 2019-04-20
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903的回复:
\表示字符的话用'\\' \单个的话表示转意 "\\0" 这样就不会有问题
\\在ascii编译时看做整体,ascii码为5c,这点我明白了,很感谢您!还想请教您一下!所复制的字符串是随便写的,不会事先知道字符串的长度和内容,那我应该用什么方法把这个字符串中的\0改成\\0?(用字符串函数替换处理的话,碰到\0就结束了,读不完整;用字符一个一个处理的话又不知道所复制字符串的长度,strlen得不到正确的长度,因为碰到\0时就认为结束了!)感谢您!
zgl7903 2019-04-20
  • 打赏
  • 举报
回复
引用 2 楼 weixin_44690344 的回复:
[quote=引用 1 楼 zgl7903的回复:]\表示字符的话用'\\' \单个的话表示转意 "\\0" 这样就不会有问题
也就是说我要先把要复制的字符串处理一下,粘贴后再把字符串用相反的方式处理?[/quote] \ 表示转意符 是在编译阶段完成的,


  CString szSrc = _T("abc\\01234");
  SetDlgItemText(IDC_EDIT1, szSrc);

  CString szStr2;
  GetDlgItemText(IDC_EDIT1, szStr2);
  SetDlgItemText(IDC_EDIT2, szStr2);
weixin_44690344 2019-04-20
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903的回复:
\表示字符的话用'\\' \单个的话表示转意 "\\0" 这样就不会有问题
也就是说我要先把要复制的字符串处理一下,粘贴后再把字符串用相反的方式处理?
zgl7903 2019-04-20
  • 打赏
  • 举报
回复
\表示字符的话用'\\' \单个的话表示转意 "\\0" 这样就不会有问题

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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