1

我有以下代码,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,但连接最后一个数字的第 2 位!!!这就是我执行 szTemp = ""; 的原因,但问题仍然存在。另外,假设最后一个数字是 17(不是 18),那么这次调试器会说 y = 67,所以肯定是这个问题。

但是,Visual Studio 调试器在此迭代期间将鼠标悬停在 szTemp 上时,它会在 szTemp 中显示“6”<---而不是“68”。所以不知何故atoi正在破坏它。

我是否想在将其放入 atoi 之前将 \0 连接到 szTemp 中?我如何轻松解决这个问题?

4

2 回答 2

4

MFC CEdit::GetLine 文档

备注:复制的行不包含空终止字符。

所以你需要注意GetLine's 返回值来确定有多少字节被复制到缓冲区中,然后添加你自己的 NUL 终止符。

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

于 2010-05-02T03:02:36.523 回答
0

我认为您应该为 GetBuffer 指定缓冲区大小

例如

szTemp = s_y.GetBuffer(MY_MAX_STRLEN);

GetBuffer(0) 分配一个大小为 0 的缓冲区,因为 CString (可能)为空。

于 2010-05-02T03:54:03.597 回答