基于对话框,点击确认按钮后,把在文本框输入的内容空格显示在文本框里。m_StrEdit是关联文本框的变量。
代码如下:
UpdateData(TRUE);
m_StrEdit.Format("\n%s\n",m_StrEdit);
UpdateData(FALSE);
Microsoft Visual C++ Debug Library错误
代码如下:
UpdateData(TRUE);
m_StrEdit.Format("\n%s\n",m_StrEdit);
UpdateData(FALSE);
Microsoft Visual C++ Debug Library错误
自身给自身增加了两字符,超出字符串数组m_StrEdit的范围
如果不讲道理,一定要用m_StrEdit.Format("\n%s\n",m_StrEdit);
只能用m_StrEdit.Format("%s",m_StrEdit);
这样再试下
看这个,楼主用的是"",而不是_T(""),就知道楼主不是UNIOCDE
因为不加_T(),在UNICODE下会出错。
下面这行,楼主的编译不出错,所以不是UNICODE。
m_StrEdit.Format("\n%s\n",m_StrEdit);
数组越界的问题,编译不出错,Release下运行不出错,Debug下运行才会出错。
对于CString 类型的m_StrEdit,它的内存空间是由CString类来管理的,CString::Format()方法,如果超出原字符串长度,会给m_StrEdit分配合适的新的内存空间,并不会出现溢出的问题。
在OnOk时,GetDlgItemText, SetDlgItemText就ok了
GetDlgItemText之后,得到值处理一下,然后SetDlgItemText。
注意:
m_StrEdit.Format("\n%s\n",m_StrEdit);
是自已给自已。实际上内部还是调用TCHARCString 内部保存字符串也是TCHAR
从这个函数CString.GetBuffer()可以看出。
1.改为:UpdateData(TRUE);
m_StrEdit.Format("a%sb",m_StrEdit);
UpdateData(FALSE); 也会出错2.改为UpdateData(TRUE);
m_StrEdit = _T("aa")
m_StrEdit.Format("\n%s\n",m_StrEdit);
UpdateData(FALSE); 也会出错3.改为://UpdateData(TRUE);
m_StrEdit.Format("a%sb",m_StrEdit);
//UpdateData(FALSE); 还会出错
4.改为//UpdateData(TRUE);
m_StrEdit = _T("aa")
m_StrEdit.Format("\n%s\n",m_StrEdit);
//UpdateData(FALSE); 会出错
5.改为//UpdateData(TRUE);
m_StrEdit = _T("")
m_StrEdit.Format("\n%s\n",m_StrEdit);
//UpdateData(FALSE); 不会出错从上面的错和不错,本人得出字符串数组“溢出”的结论
跟了下代码,发现Format()函数会先计算并分配需要的内存空间,这时分配的内存长度是正确的,但在赋值时,由于会从同一个地址读取数据又往相同地址内写,很有可能把源数据未尾的‘\0’给覆盖掉,而读源数据时是以这个标志为读取结束的依据,从会把不停的把后面更多数据拷入进来,直到遇到下一个‘\0’,从而导致赋值失败。
The call will fail if the string object itself is offered as a parameter to Format. For example, the following code:
CString str = "Some Data";
str.Format("%s%d", str, 123); // Attention: str is also used in the parameter list.
will cause unpredictable results.