みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ライブラリ関数

文字列をコピーする(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' の前の定義を確認してください
上記の問題が解決できません。助けてください><

投稿日時 - 2007-06-10 21:10:57

QNo.3073580

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

とりあえず自作のstrcpy()とstrlen()を取り除けばほぼ問題がなくなります。string.hヘッダをインクルードしておいて、その中にある関数と同じプロトタイプ(同じ名前&同じ引数の組み合わせ)の関数を作ってはだめです。コンパイラが自作の関数かライブラリの関数か区別できないので、エラーを出しています。どうしても使いたければ、namespace を宣言して区別します。

それから、それでも出るエラーは、Visual Studioがセキュリティにうるさいせいで出ます。たとえば、strcpy()かわりにstrcpy_s()を使えというようなエラーです。この種のエラーは出ないように設定することもできます(単純に置き換えた方が楽です)。

投稿日時 - 2011-04-24 02:43:03

ANo.5

zwi

ソースコードを見る限り、根本的にC言語が分かっていないところが見受けられますので、もう一度教科書や参考資料を見直してください。
それにソースコードにsizeofを使っていませんが良いのですか?

string.hは、C言語の標準ライブラリの文字列処理ライブラリの定義ヘッダで、そこに文字列処理ライブラリの実体はありません。
ですので、「string.hを呼び出す」というのは言葉として変です。
目的は、文字列処理ライブラリを呼び出す。そのために、string.hをインクルードして文字列操作関数の関数プロトタイプを宣言しておくです。

それとも、自分の勉強のためにオリジナルの文字列処理関数(strcpyやstrlen)を作っているのであれば、#include <string.h>は外して、自分で関数プロトタイプを宣言しないといけません。いまのままだと名前も衝突しています。

自分のやりたいことを明確にすることから始めてください。

投稿日時 - 2007-06-11 15:07:20

ANo.4

>これだけでOKとかなのでしょうか?
そう。strcpy などは既に標準 C ライブラリとして作成済みで、実行時にそのコードが使用されます。

投稿日時 - 2007-06-11 00:47:49

ANo.3

>string.hを呼び出すという問題なんです。
なら逆にもう定義済みだから、自分で書く必要はありません。ラクチン、ラクチン。

投稿日時 - 2007-06-10 22:17:55

補足

といいますと?・・・
#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とかなのでしょうか?・・・わからないっす><;

投稿日時 - 2007-06-10 22:19:34

ANo.2

そだね。勉強のために strcpy などを自作しているのであれば、
#include <string.h> を取ればいいんじゃないカナ?

投稿日時 - 2007-06-10 21:44:44

補足

string.hを呼び出すという問題なんです。
難しいです;;

投稿日時 - 2007-06-10 21:48:21

ANo.1

同じ型、同じ名前の関数を重複して定義しているからです。

関数の仮引数では、ポインタと配列は記述の仕方が異なるだけで同じ意味になります。例えC++でも、それらを多重定義することはできません。

投稿日時 - 2007-06-10 21:16:55