C言語とC++の、strcpy関数・strcpy_s関数について?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ムンバ

C言語とC++の、strcpy関数・strcpy_s関数について?

#1

投稿記事 by ムンバ » 15年前

こんばんはっ!

先日は配列についてご指導頂き、ありがとう御座いました。
連続投稿&また、いつも質問だけで相変わらず申し訳御座いません。(謝
こちらの掲示板での、皆さんのご質問やご解説、とても勉強になってます。
傍観してるだけで大変恐縮です。(_ _)
どうもありがとうございます。

今日は、構造体について勉強(購入した本や参考サイトで復習)をしてたのですが・・・
今回も長文になります。大変申し訳御座いません。

↓自分は、C言語だと思って作ったソース
----------------------------------------------------------------------------------------
// kouzoutai.c

#include <stdio.h>
//#include <string.h>    //    ←strcpy関数・C言語(.C)の時は必要無い?

struct munba{        //    構造体名:munba
    
    char name[10];    //    ↓メンバ
    char *sex;    //
    int year;        //
    float f_pai;    //
    double not_pai;    //    ↑メンバ

};//munba data;        // <C++(.cpp) C言語(.c)の場合は、コメントアウト不可? ; は必要

int main(){

    struct munba data;    // <C言語(.c) C++(.cpp)の場合はコメントアウト不可?
    
    strcpy(data.name, "ムンバ");    // . (←ドット)構造体メンバ演算子
    //strcpy_s(data.name, "ムンバ");    // strcpy_s関数は、C言語(.c)では使えない?

    printf("名前:%s\n", data.name);    //整数:%d 文字:%c 文字列:%s 実数:%f など

    data.sex = "男";
    printf("性別:%s\n", data.sex);

    data.year = 14;
    printf("年齢:%d歳\n", data.year);

    data.f_pai = 3.141592653589793;
    printf("円周率:%f\n", data.f_pai);

    data.not_pai = 3141592653.589793;
    printf("円周率の小数点の位置変更:%fは無意味です。\n\n", data.not_pai);

    return 0;
}
----------------------------------------------------------------------------------------
↓自分は、C++だと思って作ったソース
----------------------------------------------------------------------------------------
// kouzoutai.cpp

#include <stdio.h>
#include <string.h>    //    ←strcpy関数・C言語(.C)の時は必要無い?

struct munba{        //    構造体タグ:munba
    
    char name[10];    //    ↓メンバ
    char *sex;    //
    int year;        //
    float f_pai;    //
    double not_pai;    //    ↑メンバ

};munba data;        // <C++(.cpp) C言語(.c)の場合は、コメントアウトしてもしなくてもOK? ; は必要 

int main(){

    //struct munba data;    // <C言語(.c) C++(.cpp)の場合はコメントアウトしてもしなくてもOK?
    
    //strcpy(data.name, "ムンバ");    // . (←ドット)構造体メンバ演算子
    strcpy_s(data.name, "ムンバ");    // strcpy_s関数は、C言語(.c)では使えない?

    printf("名前:%s\n", data.name);    //整数:%d 文字:%c 文字列:%s 実数:%f など

    data.sex = "男";
    printf("性別:%s\n", data.sex);

    data.year = 14;
    printf("年齢:%d歳\n", data.year);

    data.f_pai = 3.141592653589793;
    printf("円周率:%f\n", data.f_pai);

    data.not_pai = 3141592653.589793;
    printf("円周率の小数点の位置変更:%fは無意味です。\n\n", data.not_pai);

    return 0;
}
----------------------------------------------------------------------------------------

自分が見易い様に、コメントとか字下げとかしてますので
見づらい様でしたら、どうかご勘弁下さい。

以上の構造体に関するソースを作るのに
参考にさせて頂いた本は、「猫でもわかるC言語プログラミング 第2版」
参考にさせて頂いたサイトは、こちらの「ゲームプログラミングの館」「苦しんで覚えるC言語」など
です。

ちなみに「苦しんで覚えるC言語」のサイトのアドレスなのですが
旧アドレス:http://homepage3.nifty.com/mmgames/c_guide/
新アドレス:http://9cguide.appspot.com/
と、お引越しされた様です。

相変わらず、自分が見た時に思い出せる様に
自分勝手に遊んで、保存してるソースです。

そこで、構造体の復習をしていたのですが(1年以上、プログラムの勉強さぼってました。)
上述したソースの、C言語(.c)とC++(.cpp)の違いが、ごちゃごちゃになってしまいました。(自爆
c++に関しての、教本とかサイトは勉強していません。
いつの間にか、導入されているのかもしれませんが。^^;


環境:Windows NT(32bit) VC++2008(SP1)

質問1:strcpy関数を使いたい時に

 // kouzoutai.c のソースでは、
 #include <string.h> は、必要無いみたいなのですが
 // kouzoutai.cpp のソースでは、
 #include <string.h> が、必要でした。

 C言語では strcpy関数 は、
  #include <stdio.h> から呼び出せて
  #include <string.h> には入っていない。
 C++ では strcpy関数 は
  #include <stdio.h> には入ってないで
  #include <string.h> から呼び出せる。

 と、解釈して良いのでしょうか?

誤字・脱字等ありましたら、ご勘弁下さい。
相変わらず勝手ながら、今日は寝てしまいます。
悩んだ挙句、いつも皆さんに頼ってしまってます。

ご指導頂ける方がいらっしゃいましたら
ご解説の程、宜しくお願い致します。
すみません。おやすみなさい。(謝

---編集部位---
preタグ付け忘れてました。
すみません。 画像

たかぎ

Re:C言語とC++の、strcpy関数・strcpy_s関数について?

#2

投稿記事 by たかぎ » 15年前

Visual C++特有の話なのか、一般論なのかがよくわかりませんが...

まず、一般論ということであれば、//で始まる行コメントはC99でなければ使うことができません。
C99であれば、関数を呼び出す際には関数原型を伴なう宣言が不可欠ですので、ヘッダのインクルードを省略することはできません(厳密なことをいえば、自分で宣言を書いてもよいのですが...).

Visual C++特有の話だとすると、C99には対応していませんので、関数原型無しで関数を呼び出すことはCであれば可能です。
その場合でも、返却値の型がintであればよいのですが、そうでなければ未定義の動作になります。
32ビット版であれば、intとchar*等のサイズが同じですのでたまたま動きますが、64ビット版だと問題が起こるかもしれません(未確認です)。

あと、strcpyは<string.h>で宣言されています。決して<stdio.h>ではありませんし、もしそんなところで宣言されていれば、それは処理系の不具合です。

CとC++の違いについては、
http://www.kijineko.co.jp/tech/cpp2c
を参考にしてください。
# 上記URLのコーナーも、条件演算子の違いに関する記述が抜けているのですが...

ムンバ

Re:C言語とC++の、strcpy関数・strcpy_s関数について?

#3

投稿記事 by ムンバ » 15年前

こんにちは。
たかぎさん、早速のご解説ありがとうございます。

今、職場のPCでもやってみたのですが .CPPの方
#include <string.h>をコメントアウトすると

c:(略)\visual studio 2008\projects\c++001\c++001.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした
c:(略)\visual studio 2008\projects\c++001\c++001.cpp(29) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
ビルドログは "file://c:(略)\Visual Studio 2008\Projects\C++001\Debug\BuildLog.htm" に保存されました。
C++001 - エラー 1、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

と出てしまいます。
無理やり実行はできるのですが、どうしてでしょうか?

夜になってしまいますが、帰宅したら
もう1度、ゆっくり考えて見ますね。^^;

---修正箇所---
(略)を修正しました。 画像

ムンバ

Re:C言語とC++の、strcpy関数・strcpy_s関数について?

#4

投稿記事 by ムンバ » 15年前

すみません。
たかぎさんのおっしゃってる意味が解りました! ---←誤字修正部位---

またまた私の勉強不足と思い違いでしたね。
ご迷惑をおかけしました。
出直してきます。<_ _>
ありがとうございました。
画像

閉鎖

“C言語何でも質問掲示板” へ戻る