我有以下代码,m_edit是MFC CEdit(我知道我永远不会使用MFC,但项目需要它)。

这是一个简单的循环,它从文本编辑中获取文本,在获取第一行后将其转换为整数,然后将其存储在 m_y vector 中。

LPTSTR szTemp;
vector<int> m_y;
for(int i = 0; i < m_edit->GetLineCount(); i++){
  szTemp = s_y.GetBuffer(0);
  m_edit->GetLine(i, szTemp); // get line text store in szTemp
  y = atoi(szTemp);
  m_y.push_back(y);
  szTemp = "";
  y = 0;
 }

重要示例:因此,假设CEdit具有 6个数字:
  • 0
  • 5
  • 2
  • 5
  • 18
  • 6

  • 如果您使用Visual Studio的调试器,则会发现异常!!
    它显示的内容是:
  • y = 0
  • y = 5
  • y = 2
  • y = 5
  • y = 18
  • y = 68

  • 你看到了吗? szTemp插入atoi时,将返回数字6,但会连接最后一个数字的第二个数字!这就是为什么我做了szTemp =“”;,但问题仍然存在。另外,假设最后一个数字是17(而不是18),那么这次调试器将说y = 67,因此肯定是这个问题。

    但是,Visual Studio调试器在此迭代期间将鼠标悬停在szTemp上时,它在szTemp内部显示为'6'
    我是否想将\ 0连接到szTemp,然后再放入atoi?如何轻松解决此问题?

    最佳答案

    MFC CEdit::GetLine documentation:



    因此,您需要注意GetLine的返回值,以确定将多少字节复制到缓冲区中,然后添加自己的NUL终止符。

    另外,我建议您传入缓冲区大小以确保没有潜在的缓冲区溢出。

    07-24 12:54