学校の課題で
strcat関数と全く同じ働きをするmy_strcatを実装せよ
という課題がでています。
strcatは
char* strcat(char *dest, const char *str)
で表され、文字列 strを文字列 dest に合成して
合成された新しい文字列として dest を返します。
例えば、dest = Japan, str = Korea だったら,
関数処理後に、 dest = JapanKorea を戻り値とします。
*********************************************
my_strcat実装について
実装段階で一番の問題になるのが、文字列のサイズです。
とりあえず、私の書いたコードを示します↓
char* my_strcat(char *dest, const char *src)
{
int i=0;
int j=0;
while(*dest)
{
dest++;
i++;
}
while(*src)
{
*(dest+i) = src[0];
i++;
src++;
}
*(dest+j) = src[0]; //put null at the end of dest
return dest;
}
試しにdest=Japan,str=Koreaでやってみたのですが、動きませんでした。
原因はdest の文字サイズを無視した無理やりなりな実装だと考えます。
C言語では文字のサイズを一度宣言したら、変えられないと思うので、困っています。
どなたかアドバイスをいただけないでしょうか。
よろしくお願いします
No.2ベストアンサー
- 回答日時:
★原因は『*(dest+j)』行の部分です。
・間違い⇒『*(dest + j)』
正しい⇒『*(dest + i)』
分かりますか? 『j』ではなくて『i』なのです。
・それから『j』は使っていませんよね。宣言の必要はないと思います。
また、『dest++』してポインタを移動したものをリターンしています。
これでは『dest』の末尾に『src』を追加コピーして『src』と同じ文字列の先頭を
返すことになってしまいますよ。標準ライブラリの strcat 関数と動作が異なります。
・さらに『dest』や『src』でポインタを使っているならば、『i』カウンタは必要ない!
下に『i』カウンタを使わないでポインタでの記述を載せます。
サンプル:
char* my_strcat( char *dest, const char *src )
{
char *ret = dest; ←先頭位置を記憶
while ( *dest != '\0' ){
dest++;
}
while ( *src != '\0' ){
*dest++ = *src++;
}
*dest = '\0'; ←src[0]をコピーするよりも'\0'の方が分かりやすよ(コメントするよりかはね)
return( ret ); ←記憶しておいた先頭位置を返す
}
最後に:
・while 文の条件式で『*dest != '\0'』と記述したほうが分かりやすくなります。
・あと回答者 No.1 さんのアドバイスどおり、合成格納領域『dest』に合成する『src』の
メモリが十分にないとメモリなどを破壊します。でも、このことは標準関数の『strcat』も
同じですので『my_strcat』の実装は上記の方法のように格納領域のサイズは気にしなくても
よいでしょう。→標準関数の『strcat』と同じなら。
・以上。参考に!
回答ありがとうございます。
私のポインタの使い方がいかに悪かったかわかりました。
おかげさまでポインタについての理解が深まり、勉強になりました。
strcatの他に、strcpyなども実装する宿題なのですが、Oh-Orangeさんのおかげで、他の関数も以前よりすっきりしたコードを書くことができました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
C言語のプログラムについてです
-
C言語で文字列をかえす正しい書...
-
char型にint型の数値を代入する。
-
strcpy関数で文字型変数へのポ...
-
const char* s1とただのchar s1...
-
C言語 strstrの実装
-
警告
-
CStringからchar*への型変換に...
-
fstream型オブジェクトを関数の...
-
文字列の途中から途中までを抽出
-
文字列のswap
-
C++17で、unsigned char * 配列...
-
小数点入りの文字列をfloat型に...
-
Cの関数の引数のconst *charに...
-
strcat関数を自作したいです
-
'\\0'とはなんですか?
-
文字列の演算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報