解决 tcsncpy_s.inl 断言(第 24 行)

Solving tcsncpy_s.inl assertion (line 24)

我有一个相当简单的程序,它需要用户以文本字符串的形式输入。我有一个带有编辑框的 CLR 表单,我需要获取该输入并将其传递到我的 class 中,后者只是将其复制到一个成员变量中。

在 Form.h 代码中,处理 TextChanged 事件是...

int textLength = m_userDest->TextLength;

if (textLength > 2 && textLength < 5)
{
     // Could be an ICAO code in here
     char dest[5];
     String^ text = m_userDest->Text->ToUpper();
     sprintf_s(dest, 5, "%s", text);
     airTraffic.SetUserDest(dest);
}

我的 class (airTraffic) SetUserDest 函数只是

void CAirTraffic::SetUserDest(char* dest)
{
    strncpy_s(m_userDest, 5, dest, 5);
}

当这是 运行 我得到这个调试断言时,它不会停留在屏幕上并在几秒钟后自动清除。

Debug Assertion Failed!

Program: ...sual Studio 2010\Projects\FSAirTraffic\Debug\FSAirTraffic.exe

File: f:\dd\vctools\crt_bld\self_x86\crt\tcsncpy_s.inl

Line: 24

Expression: ((_Dst)) != NULL && ((_SizeInBytes)) > 0

我没有 f:\ 驱动器,所以我猜这是一些内部 Microsoft(?) 代码,所以我看不到断言的上下文以及它的确切问题所在。我的机器上没有名为 tcsncpy_s.inl 的文件。

如果我不调用我的 class 函数,那么就没有断言,所以我认为这是问题所在。

但奇怪的是,当我单步执行调试器时,断言会在我退出 TextChanged 事件时发生,其余功能按预期运行(据我所知)。

有人知道问题出在哪里吗?我该如何解决?

我不明白你的代码是如何工作的。您使用 m_userDest 两次,首先它似乎是指向某种结构的指针,可能是 TextBox 控件的句柄:

int textLength = m_userDest->TextLength;

稍后将它传递给 strncpy_s,它需要一个 char*,而不是指向某个结构的指针。

void CAirTraffic::SetUserDest(char* dest)
{
    strncpy_s(m_userDest, 5, dest, 5);
}

虽然结构可以隐式转换为 char*,但结构指针不可能这样做。也许涉及到一个智能指针?或者您在不同的 类1?

中出于完全不同的目的使用相同的成员变量名称

无论如何,strncpy_s 正在检查其第一个参数的值并且不喜欢它。


1 请注意,新的 "wisdom" 声明不使用匈牙利符号破坏了以文本形式理解此代码的能力。我们没有 IDE 提供有关变量数据类型的鼠标悬停信息。 应用匈牙利语在现实世界中仍然是一个好主意,尽管有多少 "best practices" 文件反对它。令人惊讶的是,有多少代码样式文档是从纯理论基础编写的。