Windows 解决tcsncpy_.inl断言(第24行)
我有一个相当简单的程序,需要用户以文本字符串的形式输入。我有一个带有编辑框的CLR表单,我需要获取该输入并将其传递到我的类中,该类只是将其复制到一个成员变量中 在Form.h代码中,处理TextChanged事件是Windows 解决tcsncpy_.inl断言(第24行),windows,visual-studio,c++-cli,clr,Windows,Visual Studio,C++ Cli,Clr,我有一个相当简单的程序,需要用户以文本字符串的形式输入。我有一个带有编辑框的CLR表单,我需要获取该输入并将其传递到我的类中,该类只是将其复制到一个成员变量中 在Form.h代码中,处理TextChanged事件是 int textLength = m_userDest->TextLength; if (textLength > 2 && textLength < 5) { // Could be an ICAO code in here
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);
}
当运行时,我得到这个调试断言,它不会停留在屏幕上,几秒钟后自动清除
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_.inl的文件
如果我不调用我的类函数,那么就没有断言,所以我认为这就是问题所在
但奇怪的是,当单步执行调试器时,断言发生在我跳出TextChanged事件时,其余函数按预期运行(据我所知)
有人知道问题是什么吗?我如何着手解决它?我不明白你的代码是如何工作的。您使用
m_userDest
两次,首先它似乎是指向某种结构的指针,可能是文本框控件的句柄:
int textLength = m_userDest->TextLength;
稍后您将其传递给strncpy\u s
,它需要一个char*
,而不是指向某个结构的指针
void CAirTraffic::SetUserDest(char* dest)
{
strncpy_s(m_userDest, 5, dest, 5);
}
虽然结构可以隐式转换为char*
,但结构指针不可能这样做。也许有一个智能指针?或者在不同的类中使用相同的成员变量名用于完全不同的目的1
在任何情况下,strncpy\u s
都在检查其第一个参数的值,但不喜欢它
请注意,新的“智慧”说不要使用匈牙利符号破坏了以文本形式理解此代码的能力。我们没有IDE提供有关变量数据类型的鼠标悬停信息应用程序匈牙利语在现实世界中仍然是一个好主意,尽管有许多“最佳实践”文档对此表示谴责。令人惊讶的是,有多少代码样式的文档是从纯理论基础上编写的。当将
m_userDest
传递给strncpy\u s
时,null
我安装了其他版本的Visual Studio,但在${InstallDrive:\Program Files(x86)\Microsoft Visual Studio$(VSVersion)\VC\crt\src
。无论如何,第24行在我的版本中似乎也是一个断言。我不明白为什么要首先在这里使用字符数组和strncpy。使用字符串类发生了什么事?string^text=m_userDest->text->ToUpper();sprintf_s(dest,5,“%s”,text);
坏得很厉害--您无法将字符串^
传递给printf,但编译器无法捕获它,因为变量参数列表。您是对的,我应该澄清一下。m_userDest是第一个代码段中的编辑框和字符数组(char m_userDest[5])在第二个例子中,我以前几乎没有注意到这一点,并且假设它们在不同的范围内,但我会尝试重命名。好的,我会的,谢谢Ben。结果是,这两个变量不喜欢同名(尽管它们在完全不同的类中).我想我把范围弄乱了。我重新命名了字符数组,现在一切都好了。大家干杯。。。
void CAirTraffic::SetUserDest(char* dest)
{
strncpy_s(m_userDest, 5, dest, 5);
}