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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

14395閲覧

strcpyとstrcpy_sの扱い

yusukee345

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/10/27 06:53

strcpy関数をどうすれば使えるようになるか教えて頂きたいです。C初心者でVisualStudio2013を使っています。

#include<stdio.h>
#include<string.h>

void main(){
char s[10];
int len;
strcpy(s,"ABC");
printf("s=%s\n",s);
strcat(s,"DEF");
printf("s=%s\n",s);
len = strlen(s);
printf("文字列の長さ:%d\n",len);
getchar();
}

というプログラムを実行したいです。コンパイルしようとすると、「error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.」と出てきたので、strcpyの代わりにstrcpy_sを用いた所、「IntelliSense: 関数呼び出しの引数が少なすぎます」「error C2198: 'strcpy_s' : 呼び出しに対する引数が少なすぎます。」と出てきてしまいます。

すごく初歩的な質問ですが答えて下されば光栄です。

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

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

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

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

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

guest

回答3

0

こんにちは。

取り敢えず、strcpy_sについては、その名前で検索するとすぐに使い方がでてきますので、それを確認すると良いですよ。strcpy_s、wcscpy_s、_mbscpy_s

ただ、Visual Studio 2013なのにエラーになるのですね。普通は警告で済みますし、対策もあと1つ表示されます。会社の開発環境で特殊な設定がされているのでしょうか?
もし、YESならstrcpy_sを使うのが適正かも知れません。会社の方へ確認下さい。

そうでないなら、strcpyを使ってもC4996警告を消す方法があります。C4996ワーニングについてが参考になります。
私は、主にマルチプラット・フォーム向けに開発しているので、C4996は小さな親切大きなお世話なので#pragma warning(disable:4996)にて出ないようにしています。

投稿2016/10/27 07:06

Chironian

総合スコア23272

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

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

yusukee345

2016/10/27 08:12

#pragma warning(disable:4996) だと動いたのですが、 #define _CRT_SECURE_NO_WARNINGS だと先程と同一のエラー「error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.」が出てきます。
Chironian

2016/10/27 08:38

#pragma warning(disable:4996)で解決したのであればそれで良いのでは?
guest

0

プロジェクトのプロパティ画面で、[C/C++]-[コマンドライン]ツーリーの「追加のオプション」に

/D "_CRT_SECURE_NO_WARNINGS"

を追加してコンパイルしてみてください。エラーが消えるはずです。(このオプションはDebug/Releaseの両方に入れておく必要があります)
もしくは、このエラーをワーニングに変えるかです。同じプロパティページで[C/C++]-[全般]の中に「警告レベル」があると思いますが、ここがレベル4になっていませんか?レベル3にするとワーニングメッセーに切り替わるはずです。そうすれば、ワーニングは出ますがコンパイルは正常終了となります。ワーニングが出るのも嫌な場合は、上記の追加のオプションを加えるか、_s 付きの関数に置き換えるかになります。

strcpy_sを使うのであれば、

C

1strcpy(s,_countof(s),"ABC");

と2つ目パラメータにコピー先バッファのサイズを入れるようにします。

投稿2016/10/27 08:26

PineMatsu

総合スコア3579

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

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

0

ベストアンサー

まさにエラー文の通りです
strcpy_sになって引数が増えましたので、必要な引数を追加してください。
引数については
MSDN参照
をどうぞ

端的に言うと、コピー先の配列の大きさを引数に追加する必要があります

投稿2016/10/27 07:17

ardin

総合スコア544

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

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

yusukee345

2016/10/27 08:07

コピー先の配列の大きさを引数にどうやって追加するのですか?
ardin

2016/10/27 08:46

MSDNのリンク読みましたか?(リンク先の例はよくないけれども) PineMatsuさんが記載してくれていますが、今回ならば strcpy_s(s,10,"ABC"); とする手もあります。綺麗ではないですけれども。 こちらがスマートですかね strcpy_s(s,_countof(s),"ABC"); _countofマクロについては、以下を参考に https://msdn.microsoft.com/ja-jp/library/ms175773.aspx
yusukee345

2016/10/28 06:04

皆様、わざわざ具体的な回答ありがとうございます。strcpy_sを使っていきます。お陰様で勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問