基于对话框,点击确认按钮后,把在文本框输入的内容空格显示在文本框里。m_StrEdit是关联文本框的变量。

代码如下:
UpdateData(TRUE);
m_StrEdit.Format("\n%s\n",m_StrEdit);
UpdateData(FALSE);
Microsoft Visual C++ Debug Library错误

解决方案 »

  1.   

    m_StrEdit.Format("\n%s\n",m_StrEdit); 
    自身给自身增加了两字符,超出字符串数组m_StrEdit的范围
      

  2.   

    也就是说如果m_StrEdit = "12";则m_StrEdit 为char sz[3],使用m_StrEdit.Format("\n%s\n",m_StrEdit); 时增加了两字符"\n"和"\n"相当于使用了sz[4],sz[5],字符串数组越界
      

  3.   

    楼主想要达到目的,UpdateData(TRUE); UpdateData(FALSE); 就可以
    如果不讲道理,一定要用m_StrEdit.Format("\n%s\n",m_StrEdit); 
    只能用m_StrEdit.Format("%s",m_StrEdit); 
      

  4.   

    m_StrEdit如果是CString类型,不会报错吧
      

  5.   

    m_StrEdit = _T("/n") + m_StrEdit + _T("/n");
    这样再试下
      

  6.   

    你的那个可能是字符集问题,如果用的是UNICODE的话,要是"12……等等的"之前加上_T();如:_T("12……等等的")
      

  7.   


    看这个,楼主用的是"",而不是_T(""),就知道楼主不是UNIOCDE
    因为不加_T(),在UNICODE下会出错。
    下面这行,楼主的编译不出错,所以不是UNICODE。
    m_StrEdit.Format("\n%s\n",m_StrEdit); 
      

  8.   


    数组越界的问题,编译不出错,Release下运行不出错,Debug下运行才会出错。
      

  9.   

    如果m_StrEdit是char类型变量,使用sprintf()方式赋值的话,你的说法可能成立。
    对于CString 类型的m_StrEdit,它的内存空间是由CString类来管理的,CString::Format()方法,如果超出原字符串长度,会给m_StrEdit分配合适的新的内存空间,并不会出现溢出的问题。
      

  10.   

    不用关联什么变量。
    在OnOk时,GetDlgItemText, SetDlgItemText就ok了
    GetDlgItemText之后,得到值处理一下,然后SetDlgItemText。
      

  11.   


    注意:
    m_StrEdit.Format("\n%s\n",m_StrEdit); 
    是自已给自已。实际上内部还是调用TCHARCString 内部保存字符串也是TCHAR
    从这个函数CString.GetBuffer()可以看出。
      

  12.   

    各位注意,楼主的代码
    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); 不会出错从上面的错和不错,本人得出字符串数组“溢出”的结论
      

  13.   

    楼上做的很细,看来CString用自指的方式赋值,确实有问题。我有些想当然了。
    跟了下代码,发现Format()函数会先计算并分配需要的内存空间,这时分配的内存长度是正确的,但在赋值时,由于会从同一个地址读取数据又往相同地址内写,很有可能把源数据未尾的‘\0’给覆盖掉,而读源数据时是以这个标志为读取结束的依据,从会把不停的把后面更多数据拷入进来,直到遇到下一个‘\0’,从而导致赋值失败。
      

  14.   

    其实MSDN里早就有说明,只是大家遇到问题都习惯性的上论坛来问,而不先尝试查阅资料去解决。
    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.