C ++ LPTSTR для int (но проблема с перезаписью памяти при использовании atoi) - PullRequest
1 голос
/ 02 мая 2010

У меня есть следующий код, 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
  • у = 5
  • у = 2
  • у = 5
  • у = 18
  • y = 68

Вы это видите? szTemp при вставке в atoi возвращает число 6, но объединяет вторую цифру последнего числа !!! Вот почему я сделал szTemp = "";, но проблема сохраняется. Кроме того, допустим, что последнее число было 17 (а не 18), тогда на этот раз отладчик сказал бы, что у = 67, так что это определенно эта проблема.

Однако в отладчике Visual Studio, когда вы наводите курсор мыши на szTemp во время этой итерации, он говорит «6» <---, а не «68» внутри szTemp. Так что каким-то образом Атои разрушает его. </p>

Предполагаю ли я объединить \ 0 в szTemp перед тем, как поместить его в atoi? Как мне решить это легко?

Ответы [ 2 ]

4 голосов
/ 02 мая 2010

Из документации MFC CEdit :: GetLine :

Примечания: Скопированная строка не содержит символа завершения нуля.

Так что вам нужно обратить внимание на возвращаемое значение GetLine, чтобы определить, сколько байтов было скопировано в буфер, а затем добавить собственный NUL-терминатор.

Кроме того, я бы порекомендовал передать размер буфера, чтобы убедиться, что у вас нет потенциального переполнения буфера.

0 голосов
/ 02 мая 2010

Я думаю, вы должны указать размер буфера для GetBuffer

например.

szTemp = s_y.GetBuffer (MY_MAX_STRLEN);

с GetBuffer (0) выделяет буфер размером 0, так как CString (предположительно) пустой.

...