7

だから私はこのコードを持っています:

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

..。

char* b = new char [10];
strcpy(b, "1234567890");

エラー:microsoft visual studio 11.0 \ vc \ include \ string.h(110):「strcpy」の宣言を参照してください

どうすれば修正できますか?

4

7 に答える 7

21

簡単な修正は、プロジェクトの設定に _CRT_SECURE_NO_WARNINGS 定義を追加することです

C++ を右クリックし、[プロパティ] 項目を選択して、プロパティ ウィンドウに移動します。

次に、「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサ定義」をたどって展開します。

「プリプロセッサ定義」に追加

_CRT_SECURE_NO_WARNINGS

追加することをお勧めします

_CRT_SECURE_NO_WARNINGS;%(プリプロセッサ定義)

定義済みの定義を継承するように

IMHO & ほとんどの場合、これは良いアプローチです。

于 2012-10-24T04:24:19.970 に答える
15

これについての説明と解決策が MSDN にあります。

関数 strcpy は、境界チェックがなく、バッファ オーバーフローを引き起こす可能性があるため、安全ではないと見なされます。

したがって、エラーの説明で示唆されているように、strcpy の代わりに strcpy_s を使用できます。

strcpy_s( char *strDestination, size_t numberOfElements,
const char *strSource );

と:

非推奨を無効にするには、_CRT_SECURE_NO_WARNINGS を使用します。詳細については、オンライン ヘルプを参照してください。

http://social.msdn.microsoft.com/Forums/da-DK/vcgeneral/thread/c7489eef-b391-4faa-bf77-b824e9e8f7d2

于 2012-08-30T19:42:00.663 に答える
5

表示されるメッセージは、標準の strcpy 関数を使用しないことを推奨する MS からのアドバイスです。彼らの動機は、悪い方法で誤用されやすいということです (そして、コンパイラは通常、そのような誤用を検出して警告することはできません)。あなたの投稿では、まさにそれをやっています。コンパイラにそのようなアドバイスをしないように指示することで、メッセージを取り除くことができます。ただし、コードの重大なエラーは残ります。

10 文字分の余裕のあるバッファを作成しています。次に、11文字を詰め込みます。(末尾の '\0' を覚えていますか?) ちょうど 10 個の卵を入れるのに十分なスペースがある箱を用意し、その中に 11 個の卵を詰め込もうとしました。それはあなたに何をもたらしますか?これを行わないのはあなたの責任であり、コンパイラは通常、そのようなことを検出しません。

この C++ にタグを付け、文字列を含めました。strcpy を使用する動機はわかりませんが、C スタイルの文字列の代わりに std::string を使用すると、ボックスが拡張され、その中に何を入れるかが表示されます。

于 2012-08-30T19:59:01.870 に答える
3

strcpy_s を使用する必要がありましたが、うまくいきました。

#include "stdafx.h"
#include<iostream>
#include<string>

using namespace std;

struct student
{
    char name[30];
    int age;
};

int main()
{

    struct student s1;
    char myname[30] = "John";
    strcpy_s (s1.name, strlen(myname) + 1 ,myname );
    s1.age = 21;

    cout << " Name: " << s1.name << " age: " << s1.age << endl;
    return 0;
}
于 2016-02-07T21:41:16.790 に答える