1.我编写了以下代码,该代码可编译但在运行时崩溃,显示在调用_tcsset时显示“访问冲突写入” 。
void function(TCHAR *tsatz)
{
printf( "Before: %s\n", tsatz );
_tcsset(tsatz,'*');
printf( "After: %s\n", tsatz );
}
void main( void )
{
TCHAR* tsatz;
tsatz = new char[256];
tsatz = "This is a test string ";
function(tsatz);
getchar();
}
使用_tcsset时我在哪里错了?
2.如果我们告诉目标缓冲区有多大,我知道所有“安全”功能都可以使用。但是,如果我需要在tsatz来自外部的“函数”中使用_tcsset_s,有办法吗?
我是初学者。我能得到的任何帮助将不胜感激。提前致谢。
您正在修改字符串文字,这是未定义的行为。
tsatz = "This is a test string ";
这不会将字符串文字复制到字符串中tsatz
,只是指定tsatz
指向的地址"This is a test string ";
,无法修改。解决此问题的一种方法是声明tsatz
为数组,并使用字符串文字对其进行初始化,这将自动为您将文本复制到数组中
TCHAR tsatz[] = "This is a test string ";
如果需要跟踪数组的大小,则需要明确地这样做(请注意,sizeof
只有在操作数实际上是数组而不是指针的情况下,数组才起作用):
void function(TCHAR *tsatz, size_t numberOfElements)
{
_tprintf( "Before: %s\n", tsatz );
_tcsset_s(tsatz, numberOfElements, '*');
_tprintf( "After: %s\n", tsatz );
}
void main( void )
{
TCHAR tsatz[] = "This is a test string ";
function(tsatz, sizeof tsatz / sizeof(TCHAR));
getchar();
}
或使用模板
template<size_t sz>
void function(TCHAR (tsatz&)[sz])
{
_tprintf( "Before: %s\n", tsatz );
_tcsset_s(tsatz, sizeof tsatz / sizeof(TCHAR), '*');
_tprintf( "After: %s\n", tsatz );
}
或者您也可以使用std::basic_string
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句