2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか?
/*文字列連結*/
void *my_stract(char*, char*, char*);
void main(void)
{
char bun1[100],bun2[100],bun3[200];
printf("文字列1を入力してください\n"); gets(bun1);
printf("文字列2を入力してください\n"); gets(bun2);
my_stract(bun1,bun2,bun3);
puts(bun3);
}
char *my_stract(char *str3, char *str2, char *str1)
{
char *p1, *p2, *p3;
p1=str1;
p2=str2;
p3=str3;
while(*p1)
{
*p3=*p1;
p1++;
p3++;
}
while(*p2)
{
*p3=*p2;
p2++;
p3++;
}
*p3='\0';
return str3;
}
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
「いくらなんでもそれはないだろ」的に巨大な間違いがあるなら, 突っ込んでいいと思いますけどね>#5.
とよそ向けに書いておくけど, 今までの回答で言われたことを理解できてる?
No.5
- 回答日時:
#1, #2 でもう説明してありますけど
>2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか?
>char *my_stract(char *str3, char *str2, char *str1)
この関数の説明を書いてみてください。
>my_stract(bun1,bun2,bun3);
その書いた説明の使い方に合っていますか。
#3のコードにも突っ込み入れたい・・・
No.4
- 回答日時:
あえて突っ込ませてもらいます>#3.
i < MAX_SRC という比較が全く意味不明. あと, 他の関数にあわせて dst を第1引数においた方がいいとか, src は const 付けてあげた方が親切だろうとか, いくつかありますけどね.
No.3
- 回答日時:
どこから突っ込めばいいやら…
bun1, bun2, bun3はbuf1, buf2, buf3のスペルミスでは…
my_stractもmy_strcatのスペルミスでは…
それはいいとして…
my_stractの一行目から、
char *p1, *p2, *p3;
p1=str1;
p2=str2;
p3=str3;
は要りません
while(*p1)は、p1がNULL終端してるのかも調べないで回しているので確認する必要があります。while(*p2)も同様
さらに、*p3は100しか容量がないのにただ*p1と*p2をくっつけたら容量をオーバーします。
また、これは定石なのですが、出力が文字列の場合は、戻り値ではなく引数で返るようにするべきです。
ですから、これらを実現するためには、
int my_strcat( char src1[], size_t lenSrc1, char stc2[], size_t lenSrc2, char[] dst, sizeof maxDst );
という形の関数とし、1つ目の文字列、その長さ、2つ目の文字列、その長さ、出力先、その最大長 を渡して、
戻り値には正常終了(例えば0)、出力先の長さが足りなかった(例えば1)、などとするべきです。
(標準のstrcatではこの安全機構がないのでミスを生みやすいです)
参考に、私が書いたソースを載せておきます。
(突貫工事なのでアホなことしてるかもしれません。 丸写しはやめてください。)
http://ideone.com/lXoPII
No.2
- 回答日時:
>char bun1[100],bun2[100],bun3[200];
>my_stract(bun1,bun2,bun3);
で、
>char *my_stract(char *str3, char *str2, char *str1)
>p1=str1;
>while(*p1)
おめでとう。かなり高い確率でバッファオーバーランを実現だ。
mainで確保している【未初期化のbun3】から'\0'が見つかるまで突っ走るぜ!!
俺様を止められるのはOSによる強制停止だげだぜ!ヒッハー!!
ローカル変数はちゃんと初期化しましょうね。
あと、変数名はもう少し気を遣いましょうね。
>while(*p1)
>{
> *p3=*p1;
> p1++;
> p3++;
>}
未初期化のbun3の内容を
>printf("文字列1を入力してください\n"); gets(bun1);
で入力したbun1に対して上書きしていくコードです。
変数名をよ~~っく確認してください。
# char *my_stract(char *str3, char *str2, char *str1)
# の並びで第1引数の変数名が「str3」となっている辺りから誤解がスタートするんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
小数点入りの文字列をfloat型に...
-
C言語でポインターで詰まってい...
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
char型にint型の数値を代入する。
-
C++17で、unsigned char * 配列...
-
文字型配列に格納した空白の切捨て
-
csvファイルをfscanfで読み込む...
-
strcpy関数で文字型変数へのポ...
-
コマンドライン引数 *argv[]は...
-
コマンドライン引数
-
警告
-
C言語にて構造体のメンバがNULL...
-
new charとnew char[N]の違いは?
-
char 文字列型 の表現範囲が-12...
-
C言語での文字の連結
-
strcat関数を自作したいです
-
ゼロを含む文字列の連結方法
-
エクセルのMID関数は、C言語では?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
DWORDとcharの変換
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
char 文字列型 の表現範囲が-12...
-
C言語の文字リテラル中の16進文...
-
C++17で、unsigned char * 配列...
-
fstream型オブジェクトを関数の...
-
char型にint型の数値を代入する。
-
2次元配列の文字"列"の初期化方法
-
strcat関数を自作したいです
-
C++Builder 2009 テキスト...
-
動的メモリの初期化方法について。
-
C言語のプログラムについてです
-
C言語で文字列をかえす正しい書...
-
入力された文字列の中の数字を...
-
エクセルのMID関数は、C言語では?
おすすめ情報