- 締切済み
ライブラリ関数
文字列をコピーする(strcpy) 文字列の長さを調べる(strlen) 配列の長さを調べる(sizeof) #include <stdio.h> #include <string.h> int main(void) { char s1[128] = "ABCD"; char s2[128] = "EFGH"; char s3[128] = "IJKL"; strcpy(s2, s1); strcpy(s3, s2); puts("s1をs2にs2をs3にコピーしました。"); printf("s1 = %s\n", s1); printf("s2 = %s\n", s2); printf("s3 = %s\n", s3); printf("文字列%sの長さは%uです。\n",s3,(unsigned)strlen(s3)); printf("文字列%sの長さは%uです。\n",s3,strlen(s3)); return (0); } char *strcpy(char *d, const char *s) { while (*d++ = *s++) printf("pointer=%s \n",d); } /* 文字列sをdにコピーする[配列版] */ char *strcpy(char d2[], const char s2[]) { unsigned i=0; while (d2[i] = s2[i]){ i++; printf("hairetsu=%s\n",&d2[i]); } } /*--- 文字列strの長さを返す[ポインタ版] ---*/ size_t strlen(const char *s) { size_t len = 0; while (*s++) len++; return (len); } /*--- 文字列strの長さを返す[配列版] ---*/ unsigned strlen(const char str[]) { unsigned len = 0; while (str[len]) len++; return (len); } c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(48) : error C2084: 関数 'char *strcpy(char *,const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の前の定義を確認してください c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(68) : error C2084: 関数 'size_t strlen(const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(80) : 'strlen' の前の定義を確認してください 上記の問題が解決できません。助けてください><
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Cfg4sA3W4s
- ベストアンサー率38% (31/81)
とりあえず自作のstrcpy()とstrlen()を取り除けばほぼ問題がなくなります。string.hヘッダをインクルードしておいて、その中にある関数と同じプロトタイプ(同じ名前&同じ引数の組み合わせ)の関数を作ってはだめです。コンパイラが自作の関数かライブラリの関数か区別できないので、エラーを出しています。どうしても使いたければ、namespace を宣言して区別します。 それから、それでも出るエラーは、Visual Studioがセキュリティにうるさいせいで出ます。たとえば、strcpy()かわりにstrcpy_s()を使えというようなエラーです。この種のエラーは出ないように設定することもできます(単純に置き換えた方が楽です)。
- zwi
- ベストアンサー率56% (730/1282)
ソースコードを見る限り、根本的にC言語が分かっていないところが見受けられますので、もう一度教科書や参考資料を見直してください。 それにソースコードにsizeofを使っていませんが良いのですか? string.hは、C言語の標準ライブラリの文字列処理ライブラリの定義ヘッダで、そこに文字列処理ライブラリの実体はありません。 ですので、「string.hを呼び出す」というのは言葉として変です。 目的は、文字列処理ライブラリを呼び出す。そのために、string.hをインクルードして文字列操作関数の関数プロトタイプを宣言しておくです。 それとも、自分の勉強のためにオリジナルの文字列処理関数(strcpyやstrlen)を作っているのであれば、#include <string.h>は外して、自分で関数プロトタイプを宣言しないといけません。いまのままだと名前も衝突しています。 自分のやりたいことを明確にすることから始めてください。
- koko_u_
- ベストアンサー率18% (459/2509)
>これだけでOKとかなのでしょうか? そう。strcpy などは既に標準 C ライブラリとして作成済みで、実行時にそのコードが使用されます。
- koko_u_
- ベストアンサー率18% (459/2509)
>string.hを呼び出すという問題なんです。 なら逆にもう定義済みだから、自分で書く必要はありません。ラクチン、ラクチン。
- koko_u_
- ベストアンサー率18% (459/2509)
そだね。勉強のために strcpy などを自作しているのであれば、 #include <string.h> を取ればいいんじゃないカナ?
補足
string.hを呼び出すという問題なんです。 難しいです;;
- jacta
- ベストアンサー率26% (845/3158)
同じ型、同じ名前の関数を重複して定義しているからです。 関数の仮引数では、ポインタと配列は記述の仕方が異なるだけで同じ意味になります。例えC++でも、それらを多重定義することはできません。
補足
といいますと?・・・ #include <stdio.h> #include <string.h> int main(void) { char s1[128] = "ABCD"; char s2[128] = "EFGH"; char s3[128] = "IJKL"; strcpy(s2, s1); strcpy(s3, s2); puts("s1をs2にs2をs3にコピーしました。"); printf("s1 = %s\n", s1); printf("s2 = %s\n", s2); printf("s3 = %s\n", s3); printf("文字列%sの長さは%uです。\n",s3,(unsigned)strlen(s3)); printf("文字列%sの長さは%uです。\n",s3,strlen(s3)); return (0); } これだけでOKとかなのでしょうか?・・・わからないっす><;