关于VC显示字符串的问题

来源:百度知道 编辑:UC知道 时间:2024/07/06 11:43:13
//串口接收成功回调函数
void CALLBACK CSerialPortTestDlg::OnCommRecv(CWnd*pWnd,char*buf,int buflen)
{
CString tmp;
CSerialPortTestDlg*pDlg=(CSerialPortTestDlg*)pWnd;
CEdit*pRecvStrEdit=(CEdit*)pDlg->GetDlgItem(IDC_REC_DISP); //取得接收区控件指针
for(int i=0;i<buflen;i++,buf++)
{
tmp.Format(_T("%c"),*buf);
pDlg->m_strRecDisp+=tmp; //将字符转化为字符串
}
pRecvStrEdit->SetWindowText(pDlg->m_strRecDisp); //显示在窗口上
}

这是从书上抄下来的程序,运行没有问题。用过串口接收到的数据会显示在我定义为m_strRecDisp的静态文本框中。但我想把显示的方式变一下。我把从串口接收过来的数据分成两部分,再造两个静态文本框,让一个文本框显示一部分。问题就来了:该程序好像是把收到的字符串都存了起来,但存在哪里我不知道,请问是在buf中吗?还有char*buf是什么类型?没见过char*。最后,我希望可以把收到的数据存在一个数组中,这样调用起来方便。请问该怎样改呢?谢谢!

字符串就存在buf中,而你长度由buflen给出。for循环使用pDlg->m_strRecDisp+=tmp,采用的是累加的机制,所以所以的字符串还在。
char*buf中的buf是指向字符的指针,就是说buf是一个内存地址,而在这个地址的内存中存的值应该是一个字符。使用 *buf 的方式可以访问buf所指内存地址的字符。字符指针相当于变相的字符数组,只不过数组的长度不可变,而这个的长度是可变的。所以你不能把这个值存到数组当中了,因为消息的大小你确定不了。可以存为一个CString对象。这样就行了 CString str(buf,buflen);

char* 不就是字符指针吗? CString 类有对 += 进行运算符重载,所以这句
:for(int i=0;i<buflen;i++,buf++)
{
tmp.Format(_T("%c"),*buf);
pDlg->m_strRecDisp+=tmp; //将字符转化为字符串
}
可以直接改为 pDlg->m_strRecDisp+=buf;
strRecDisp存了之前和现在收到的buf,当前的字符串就是存在buf中。可以认为buf就是一个数组,因为数组是一个静态的指针。