代码之家  ›  专栏  ›  技术社区  ›  Dexter

C++ LPTSTR到int(但使用ATOI内存重写问题)

  •  1
  • Dexter  · 技术社区  · 16 年前

    我有以下代码,m_edit是一个mfc cedit(我知道我永远不会使用mfc,但project要求它)。

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

    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;
     }
    

    重要示例: 所以我们假设塞迪特 六 数字:

    • 零
    • 五
    • 二
    • 五
    • 十八
    • 六

    如果您使用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”。所以不知怎么的,阿泰毁了它。

    在将一个0放入a to i之前,我是否应该将它连接到sztemp?我该如何轻松解决这个问题?

    2 回复  |  直到 16 年前
        1
  •  4
  •   jamesdlin    16 年前

    从 MFC CEdit::GetLine documentation :

    评论: 复制的行不包含空终止字符。

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

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

        2
  •  0
  •   AndersK    16 年前

    我认为应该为getbuffer指定一个缓冲区大小

    例如

    sztemp=s_y.getbuffer(my_max_strlen);

    让getbuffer(0)分配一个0大小的缓冲区,因为cstring(可能)是空的。