我有以下代码,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 数字:
如果您使用Visual Studio的调试器,您会注意到异常!! 这是它显示的内容:
但是,Visual Studio调试器,当您在此迭代期间将鼠标悬停在szTemp上时,它会在szTemp中显示“6”&lt; --- not'68'。所以atoi正在破坏它。
我想在将它放入atoi之前将\ 0连接到szTemp?我该如何轻松解决这个问题?
答案 0 :(得分:4)
来自MFC CEdit::GetLine documentation:
说明: 复制的行不包含空终止字符。
因此,您需要注意GetLine
的返回值,以确定将多少字节复制到缓冲区中,然后添加您自己的NUL终止符。
另外,我建议您传入缓冲区大小以确保没有潜在的缓冲区溢出。
答案 1 :(得分:0)
我认为您应该为GetBuffer指定缓冲区大小
e.g。
szTemp = s_y.GetBuffer(MY_MAX_STRLEN);
让GetBuffer(0)分配一个0大小的缓冲区,因为CString(大概)是空的。