【问题标题】:Getting string length in winapi with strlen [closed]使用strlen在winapi中获取字符串长度[关闭]
【发布时间】:2015-03-16 12:52:34
【问题描述】:

我正在尝试获取缓冲区的长度,但出现未处理的异常错误。 谁能帮帮我。我做错了什么?

case WM_COMMAND:
    switch (LOWORD(wp))
{
    case IDC_MAIN_BUTTON:
    {
        char buffer[256];

        SendMessage(hEdit,
            WM_GETTEXT,
            sizeof(buffer) / sizeof(buffer[0]),
            (LPARAM*)(buffer));
        int bl = strlen(buffer);
        MessageBox(NULL,
            bl,
            "Information",
            MB_ICONINFORMATION);
    }
        break;
}

【问题讨论】:

  • strlen 返回size_t 类型。将bl 更改为size_t 类型。
  • SendMessage 也返回文本长度。
  • 我的猜测是对SendMessage 的调用失败并且没有任何内容被写入buffer。这意味着它可能不是以空值终止的,并且对strlen 的调用将读取超出缓冲区的末尾。

标签: c++ c winapi visual-c++ sendmessage


【解决方案1】:

除了the mistake mentioned M Oehm 之外,这里还有两个问题:

  1. SendMessage() 的结果未经测试。
  2. 传递的缓冲区未初始化并在任何情况下都传递给strlen(),因此如果未设置为C-“字符串”,则至少包含一个'\0'作为0-终止符,对strlen() 的调用将失败。

要解决这个问题,至少要改变这个:

char buffer[256];

成为

char buffer[256] = "";

【讨论】:

    【解决方案2】:

    MessageBox 的第二个参数是指向TCHAR 的指针。你传递了一个整数(至少应该得到一个合适的警告)。

    您必须首先将整数转换为字符串表示形式,例如在非 Unicode 构建中:

        int bl = strlen(buffer);
        char buf[20];
    
        _snprintf(buf, sizeof(buf), "%d", bl);
    
        MessageBox(NULL, buf, "Information", MB_ICONINFORMATION);
    

    (警告:代码未经测试。)

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2013-12-09
      • 1970-01-01
      • 2013-02-01
      • 2016-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2019-03-11
      相关资源
      最近更新 更多