- ベストアンサー
strcat関数を自作したいです
S117の回答
- S117
- ベストアンサー率40% (18/45)
「できるだけわかりやすいコード」で。 char *strcat(char *dest, const char *src) { size_t i; size_t l; /* 結合先の文字列の終端を探す */ for (l = 0 ; dest[l] != '\0' ; l++) ; //このfor文に本体はない /* コピー元の文字列の終端まで結合先の文字列の末尾にコピー */ for (i = 0 ; src[i] != '\0' ; i++) { dest[l + i] = src[i]; } /* 最後に終端を示す'\0'を代入 */ dest[l + i] = '\0'; return dest; /* 戻り値は結合先のポインタ */ } これでどうでしょ?
関連するQ&A
- strcat関数
学校の課題で 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言語では文字のサイズを一度宣言したら、変えられないと思うので、困っています。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします
- ベストアンサー
- C・C++・C#
- strcat関数のオーバーフロー回避について
C言語を勉強中の者です。開発環境はWindows7 Visual Studio 2010です。 2つの文字列を入力し、strcat関数を用いて文字列を結合、出力するプログラム を作成しています。文字列は1つの配列につき最大半角5文字です。 本来であれば、char st1[11];ではなく、char st1[6]; としたかったのですが、char st1[6];とすると、strcat関数を実行した際に バッファオーバーフローによるエラーが出てしまいます。 この様な時に、もっと合理的なコードの書き方があれば教えていただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <string.h> void main(void) { char st1[11]; char st2[6]; printf("文字列(5文字以内)"); scanf("%s", st1); printf("文字列(5文字以内)"); scanf("%s", st2); strcat(st1, st2); printf("%s", st1); }
- ベストアンサー
- C・C++・C#
- 文字列連結関数「strcat」の意味をしりたい
お早う御座います、Cの初心者です、宜しくお願いします。 文字列を連結する関数で「strcat」とうのがありますが、前半の「str」は何となくわかるのですが、 後半の「cat」は何の略になるのでしょうか。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 標準ライブラリ関数の自作について質問です。
C言語初心者の学生です。 標準ライブラリ関数のstrncpyと同じ機能の関数を自作でつくる場合どのようにすれば良いでしょうか。 mystrncpy(char *s1,char *s2,int n) { } かっこの間を埋める形でお願いします。 同じようにstrncat、strnchr、strnstrも答えていただけると幸いです。 すべてではなく4つのうち1つからでも結構ですのでよろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- C言語 main関数とsum関数の記述順について
はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1 sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2 sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- C言語の自作関数がエラーになる
C言語の自作関数がエラーになる 現在C言語でWindowsのプログラミングを学習中ですが あるプロトタイプ宣言した自作の関数がエラーになってしまいます。 エラー内容は「未解決の外部シンボル・・・」といった内容です。 関数の引数をHWNDだけにした場合は問題ありませんでした。 環境はMicrosoft Visual C++ 2008 Express Editionです。 自作関数の引数に型の制限はあるのでしょうか? よろしくお願いします。 以下コード一部です LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int MySave(TCHAR *,HWND,int); ・ ・ ・ LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { THCAR buffer[1024]; int iCount; ・ ・ ・ MySave(buffer,hWnd,iCount); ・ ・ ・ } int MySave(buffer,hWnd,iCount); ・ ・ ・ }
- ベストアンサー
- C・C++・C#
- PHPでは具体的に自作関数をCで作成できるのでしょうか?
PerlやRubyではC言語と連携しやすいのですが、PHPでは具体的に自作関数をCで作成できるのでしょうか? PHPは4と5を使っています。
- ベストアンサー
- PHP