質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

8114閲覧

strcpyでエラーがでます。

yu_de_egg

総合スコア15

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/06 12:49

編集2020/05/06 13:34

イメージ説明ジをクリックするととばされるサイト
(https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?redirectedfrom=MSDN&view=vs-2019)
参考書を見ながら下記のコードを入力したのですが、strcpy(pName,pN);の部分でエラーがでます。
エラーメッセージが全て英語だったので、Google翻訳ですがリクエストが承認されませんと言われます。

c++

1#include<iostream> 2#include<string> 3using namespace std; 4 5class Car 6{ 7private: 8 int num; 9 double gas; 10 char* pName; 11public: 12 Car(char* pN, int n, double g); 13 //デストラクタ 14 ~Car(); 15 void show(); 16}; 17 18Car::Car(char* pN, int n, double g) 19{ 20 //コンストラクタ内で動的にメモリ確保 21 //strlen(pN) pNの中身の文字列のNULLより前の文字数を数える 22 pName = new char[strlen(pN) + 1]; 23 //strcpy(pName, pN) pNameにpNの中身の文字列をコピーする 24 strcpy(pName, pN); 25 num = n; 26 gas = g; 27 cout << pName << "を作成しました。" << endl; 28} 29 30Car::~Car() 31{ 32 cout << pName << "を破棄します。" << endl; 33 delete[] pName; 34} 35 36void Car::show() 37{ 38 cout<<"車のナンバーは"<<num<<"です。"<<endl; 39 cout<<"ガソリン量は"<<gas<<"です。"<<endl; 40 cout<<"名前は"<<pName<<"です。"<<endl; 41} 42 43 44int main() 45{ 46 Car car1("mycar", 1234, 25.5); 47 car1.show(); 48 49 return 0; 50} 51```![エラーメッセージ](5fefd4c0f55f8efdb55c6179a453a1b8.png)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/05/06 12:55

翻訳などしなくてよいのでエラーメッセージは原文ママ示して下さい。 情報は、よくわかっている内容でもない限り(それなら質問しないでしょう)、余計な加工や解釈、まとめなどをしないでそのまま提示したほうがよいことがほとんどです。
yu_de_egg

2020/05/06 13:09

ご指摘ありがとうございます。 エラーメッセージをクリックするととばされるサイトのURLを貼り付けました。
thkana

2020/05/06 13:17

なぜエラーメッセージそのものでなくサイトのURLなのですか? エラーメッセージにはエラーになった場所などの情報も含まれていたのではないかと思いますが、その情報を敢えて削るのはなぜですか? 「そのまま」です。「そのまま」。 自分が頑張ったところを見せたいのなら、元々の情報に追加する形にして下さい。
yu_de_egg

2020/05/06 13:34

エラーメッセージの画像を貼り付けました。 これで大丈夫でしょうか?
yominet

2020/05/06 14:09

次回からは、開発に使用しているソフト(バージョンも)も提示しましょう #言語は進化・変化しつづけているため、エラー・警告の内容が開発ソフト・バージョンによって変わります
yu_de_egg

2020/05/07 10:32

情報が足らず申し訳ありません。 次からはバージョンも記載します。
guest

回答3

0

本題の方は十分な情報が集まったと思います。
ので、多少邪道なやり方を。

プログラミングに関する情報はネット上多く転がっています。なので、出たメッセージを(またまた)「そのまま」検索にかけるとそのものズバリだったりかなり参考になったりする情報が引っかかることも多いです。
'strcpy': This function or variable may be unsafe.
を「そのまま」検索してみて下さい。どうでしょうか。

投稿2020/05/06 23:01

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_de_egg

2020/05/07 10:38

ご教授ありがとうございます。 プログラマには問題を自分で調べて解決することも大事ですよね。 次からは、質問する前に自ら調べてみます。
guest

0

VisualStudioではstrcpyは推奨されておりません。

「strcpy_sに書き換えてください」と言われております。なお、引数として配列長を指定する必要があります。

投稿2020/05/06 13:52

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C++ では文字列リテラルは const char* 型として扱われるので、コンストラクタの第一引数は char* ではなく、const char* にする必要があります。

文字列リテラル - cppreference.com

その点を直せば、動くと思います。

diff

1- Car(char *pN, int n, double g) 2+ Car(const char *pN, int n, double g)

追記: C++11 だと思っていたのですが、C++03 では、文字列リテラルを char* に変換するのが許可されているので、この点は変更しなくても動きますね。

追記

Warning の内容はより安全な関数 strcpy_s() を使ってくださいという内容です。
strcpy との違いはコピーする長さを指定する必要がある点です。

diff

1- strcpy(pName, pN); 2+ strcpy_s(pName, strlen(pN) + 1, pN);

修正後のコード

cpp

1#include <iostream> 2#include <string> 3using namespace std; 4 5class Car 6{ 7private: 8 int num; 9 double gas; 10 char *pName; 11 12public: 13 Car(const char *pN, int n, double g); 14 //デストラクタ 15 ~Car(); 16 void show(); 17}; 18 19Car::Car(const char *pN, int n, double g) 20{ 21 //コンストラクタ内で動的にメモリ確保 22 //strlen(pN) pNの中身の文字列のNULLより前の文字数を数える 23 pName = new char[strlen(pN) + 1]; 24 //strcpy(pName, pN) pNameにpNの中身の文字列をコピーする 25 strcpy_s(pName, strlen(pN) + 1, pN); 26 num = n; 27 gas = g; 28 cout << pName << "を作成しました。" << endl; 29} 30 31Car::~Car() 32{ 33 cout << pName << "を破棄します。" << endl; 34 delete[] pName; 35} 36 37void Car::show() 38{ 39 cout << "車のナンバーは" << num << "です。" << endl; 40 cout << "ガソリン量は" << gas << "です。" << endl; 41 cout << "名前は" << pName << "です。" << endl; 42} 43 44int main() 45{ 46 Car car1("mycar", 1234, 25.5); 47 car1.show(); 48 49 return 0; 50} 51

投稿2020/05/06 13:04

編集2020/05/06 14:16
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HogeAnimalLover

2020/05/06 13:55

VisualStudioのエラーメッセージを見る限りは、「strcpy_sに書き換える」ことが正しいと思います。
tiitoi

2020/05/06 14:05

コメントありがとうございます。 回答した段階ではエラーの内容が記載されていなかったため、こちらでコンパイルした際の問題点を記載したのですが、追記を見ると、ご指摘いただいた点が問題のようです。修正しました。
yominet

2020/05/06 14:12

tiitoiさんが回答した時点ではエラーメッセージの提示はなかったので、そこは仕方ないことかと
thkana

2020/05/06 22:44

明らかになっていないことを明らかにしないまま推測して間違えたのは当然に起こりうることではありますが、「仕方がないこと」なのでしょうか? #明らかになっていない質問に回答しないとすると相当数の質問が回答不能になる、という現実もありますけどね。
tiitoi

2020/05/07 01:29

To: thkana さん コメントありがとうございます。 teratail の質問で修正依頼なしで回答に必要な情報が揃っている場合というのは、あまりありません。その場合、追記、修正依頼しつつも、情報がなかなか出てこない場合は、ある程度推測できる場合は回答するようにしています。 もちろん、その場合、質問者さんの意図と異なる回答となっている場合があるので、質問欄編集やコメントで追加で情報が得られた場合は回答は修正するようにしています。
yu_de_egg

2020/05/07 10:36

皆さんのご教授感謝します。ありがとうございました。 自分の開示した情報が少なすぎて、皆さんにはご迷惑をおかけしました。申し訳ありません。 次回からの質問からは、細かいところまで情報を開示しようと思います。 今後ともよろしくお願いいたします。
thkana

2020/05/07 11:43

私も最初はconstだろうと思っていましたし、とりあえずそれで回答しつつ質問者の真意を探る、というのも1つのやり方だというのは理解します。ただ、情報不足な質問が出て、それにとりあえず回答するのが普通な現状を「仕方ない」と言ってしまうのはなにか違う気がしたのでコメントしています。(「仕方ない」と言ったのはtiitoiさんじゃないですね) 本当に「仕方ない」のかもしれませんが...
thkana

2020/05/07 11:47

yu_de_eggさん いえいえ、ちゃんと対応して頂いたので大丈夫です。 回答するには情報が足りない、といわれると怒り出す人も多かったりするなか、大変気持ちよくやり取りが出来たと思っています。こちらこそありがとうございました。
tiitoi

2020/05/07 12:07

To: thkana さん すいません。今回は確かに早合点して回答してしまいました。 今後はもう少し必要な情報が揃うのを待ってから回答しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問