有人能告诉我这部分代码有什么问题吗?它在执行期间崩溃。
void MainWindow::on_pushButton_clicked()
{
char * cstr = new char [ui->lineEdit->text().length()];
string costam;
costam=ui->lineEdit->text().toStdString();
strcpy(cstr, costam.c_str()); <<<----TROUBLE LINE
int z;
z=costam.length();
for(int n=0;n<z;n++){
string wynik;
wynik=konwersja(cstr[n]);
mors(wynik);
Sleep(300);
}
delete[] cstr;
}
当我尝试在Qt 5.0.1中使用MinGW编译它时,一切正常,但在Qt 4.8.1中有MSVC2010,则会出现警告:
警告C4996:'strcpy':此函数或变量可能不安全。请考虑使用strcpy_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助。
答案 0 :(得分:2)
你的问题是错的。这段代码编译,这里没有QT。
strcpy
已弃用,因为它不安全。替代方案是strcpy_s
:
strcpy_s( cstr, ui->lineEdit->text().length() + 1, costam.c_str() );
请注意,您应该分配ui->lineEdit->text().length() + 1
,而不是ui->lineEdit->text().length()
。我想这就是崩溃的原因。
BTW我认为没有理由在你的代码中使用cstr
数组。例如:
void MainWindow::on_pushButton_clicked() {
string costam;
costam = ui->lineEdit->text().toStdString();
for( size_t n = 0; n < costam.length(); n++ ) {
string wynik;
wynik = konwersja( costam[ n ] );
mors( wynik );
Sleep( 300 );
}
}
答案 1 :(得分:1)
您可以使用strcpy(cstr, costam.c_str());
再次尝试编译来更改此行strcpy_s(cstr, costam.c_str());
吗?
此外,它不应该阻止编译,MSVC2010只是警告不安全的用法。您还可以降低MSVC2010的警告级别。
答案 2 :(得分:1)
因为人们在编程C ++时不太了解安全性,并且Windows因此而得到了不好的说法,所以Visual Studio“弃用”了几个导致缓冲区溢出的常见原因。在这种情况下,您应该没问题,并且可以通过定义_CRT_SECURE_NO_WARNINGS来禁用警告。您也可以使用posix函数找到此问题,在这种情况下,您可以使用单独的#define禁用这些警告。
答案 3 :(得分:1)
这里有两个问题。
崩溃是因为strcpy会将length + 1
个字符写入目标缓冲区,但您的缓冲区只有length
大小。 +1表示空终止字符,不包括在length
中。
警告是因为微软认为使用strcpy很容易犯错误并且不鼓励使用它。正如Joel所提到的,您可以启用定义来阻止该警告。我不建议使用semihyagcioglu和微软建议使用strcpy_s,因为它不是一个可移植的解决方案。
我还要注意,虽然修复这些内容会使代码编译运行没有错误,但还有其他问题。喜欢:为什么你首先需要cstr变量? cstr [n]可能会被替换为costam.data()[n]。然后cstr变量根本不需要存在。您不需要new,delete或strcpy。