1

谁能告诉我这部分代码有什么问题?它在执行过程中崩溃。

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。详细信息请参见在线帮助。

4

4 回答 4

3

你的问题是错误的。这段代码可以编译,这里没有关于 QT 的内容。

strcpy已弃用,因为它不安全。替代方案是strcpy_s

strcpy_s( cstr, ui->lineEdit->text().length() + 1, costam.c_str() );

请注意,您应该分配ui->lineEdit->text().length() + 1,而不是ui->lineEdit->text().length()。这就是崩溃的原因,我猜。

顺便说一句,我认为根本没有理由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 );
        }
    }
于 2013-04-29T19:23:57.740 回答
1

您可以尝试再次编译来更改此行strcpy(cstr, costam.c_str());吗?strcpy_s(cstr, costam.c_str());

它也不应该阻止编译,MSVC2010 只是警告不安全的使用。您还可以降低MSVC2010的警告级别。

于 2013-04-29T17:58:38.573 回答
1

由于人们在编写 C++ 时对安全性不太了解,而 Windows 也因此受到了不好的评价,Visual Studio “弃用”了几个函数,这些函数是缓冲区溢出的常见原因。在这种情况下,您应该没问题,并且可以通过定义 _CRT_SECURE_NO_WARNINGS 来禁用警告。您也可能会在 posix 函数中发现此问题,在这种情况下,您可以使用单独的 #define 禁用这些警告。

于 2013-04-29T18:00:21.070 回答
1

你这里有两个问题。

崩溃是因为 strcpy 会将length + 1字符写入目标缓冲区,但您的缓冲区只有 size length。+1 用于空终止字符,不包含在length.

警告是因为微软认为使用 strcpy 太容易出错,不鼓励使用它。正如乔尔所提到的,您可以启用定义来防止该警告。我不推荐 semihyagcioglu 和微软使用 strcpy_s 的建议,因为它不是一个可移植的解决方案。

我还想指出,虽然修复这些问题将使您的代码编译和运行没有错误,但还有其他问题。比如:为什么你首先需要 cstr 变量?cstr[n] 可能可以替换为 costam.data()[n]。然后 cstr 变量根本不需要存在。您将不需要 new、delete 或 strcpy。

于 2013-04-29T19:16:22.570 回答