No.6ベストアンサー
- 回答日時:
> >const char * restrict s2
> の最初が「const」になっている理由は何でしょうか・・・?
第一の理由は、これがstrcatの仕様だからです。
第二の理由としては、コピー元の文字列は変更されることがないため、そのことを呼び出し元に保証するために付けています。
No.8
- 回答日時:
「できるだけわかりやすいコード」で。
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; /* 戻り値は結合先のポインタ */
}
これでどうでしょ?
No.7
- 回答日時:
char* strcat(char* s1, const char* s2) {
char* result = s1;
strcpy(s1+strlen(s1),s2);
return result;
}
※ で、ついでに strlen,strcpyも自作する、と。
No.5
- 回答日時:
>>const char * restrict s2
>の最初が「const」になっている理由は何でしょうか・・・?
s2が指している部分はコピー元であるため、
そこの内容を改変しない、という意思を表明しています。
No.4
- 回答日時:
>最後はreturn s1でも良いのでしょうか?
>ポインタを作らなければならないのでしょうか。
「ポインタを作る」とは何を意味しているのか補足にどうぞ。
また s1 は return するときに何を指しているのかも補足にどうぞ。
>あとwhile(*s1++ = *s2++);と while(*s1++);
>は色々間に省かれているような気がするのですが、それを省かずに
>表すとどうなるのでしょうか・・・?
省かれてはいません。
演算子の優先順位と ++ 演算子の前置と後置の違いについて復習しましょう。
No.3
- 回答日時:
こんなところです。
char *strcat(char * restrict s1, const char * restrict s2)
{
char *s = s1;
while (*s1 != '\0') ++s1;
while ((*s1 = *s2) != '\0') ++s1, ++s2;
return s;
}
質問に回答していただき大変感謝しております。
大変恐縮ですが質問させていただくと、
>const char * restrict s2
の最初が「const」になっている理由は何でしょうか・・・?
それとwhile ((*s1 = *s2) != '\0')
は「s2の値にヌルが入るまでs2の値をs1の値に代入し続ける」という
ことなのでしょうか?
超初心者の大変低レベルな質問で申し訳ございません。
No.2
- 回答日時:
こんにちは。
string.h で宣言されているstrcat()ですね。
いつもお世話になっています(笑)
例です。
strlen()は文字列の長さを測って返す関数です。
memcpy()はメモリの内容をコピーする関数です。
int my_strcat(char *str_a,const char *str_b)
{
int l,s;
s = strlen(str_a);
l = strlen(str_b);
memcpy(str_a + s,str_b,l + 1);
return (s + l);
}
実行すると、str_aの変数のお尻にstr_bの変数の内容を追加します。
戻り値は返されたstr_aの文字列の長さ(ヌル'\0'を含まない)です。
memcpyの第3引数で+1しているのは、ヌル'\0'をコピーして文字列を終端させるためです。
memcpyを使わないのなら、forやwhileループで1文字ずつコピーしてもいいんですが…手抜きです(汗)
質問にお答えいただき大変感謝しております。
とりあえず特殊な関数を使わずに自作してみたいと思うのです。。
それとちょっと内容が自分にはレベル高すぎる気がします。(へタレですみません)
ですが大変参考になりました。ありがとうございます。
No.1
- 回答日時:
strcat の仕様を補足にどうぞ。
この回答への補足
char *p = s1;
while(*s1++); /* s1を最後迄進める */
while(*s1++ = *s2++); /* s2をコピーする */
return p;
最後はreturn s1でも良いのでしょうか?
ポインタを作らなければならないのでしょうか。
あとwhile(*s1++ = *s2++);と while(*s1++);
は色々間に省かれているような気がするのですが、それを省かずに
表すとどうなるのでしょうか・・・?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学受験 3浪しようと思うので、アドバイスお願いします。 自分としては結構メンタルきつくて後期でいいから、東京 3 2023/02/13 21:47
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Excel(エクセル) ランダムで四択の問題を作る場合にvbaで何を学べばいいでしょうか。 1 2022/04/14 16:45
- CGI サイト訪問者の情報を取得したい 1 2023/02/21 11:03
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- Excel(エクセル) ExcelのFSO(ファイルシステムオブジェクト)について学びたいのですが。。。 5 2022/12/15 18:06
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- 大学受験 大学受験英語の勉強法についてです どうしても英語長文の勉強ができません 初めて数分で絶対にやる気がな 2 2023/05/05 00:32
- 統計学 加重最小二乗法=①「変数を自然対数変換」=②「誤差項の分散の逆数を重み付け」? 8 2022/11/26 11:15
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
str系関数を使わずに二つの文字を結合する方法
C言語・C++・C#
-
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
C言語の入力した文字を反転させるプログラミングの仕方が分かりません。
Ruby
-
-
4
再起呼び出しの回数をカウントするプログラム
C言語・C++・C#
-
5
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
6
printf で二進表示を行いたい。
C言語・C++・C#
-
7
自作strcat
C言語・C++・C#
-
8
strlen関数と同じ働きをする関数の作り方
C言語・C++・C#
-
9
C言語:小文字を大文字に変換する関数を作成
C言語・C++・C#
-
10
c言語 16進数の2進数への変換
C言語・C++・C#
-
11
関数から配列を返すには?
C言語・C++・C#
-
12
構造体から平均点を求める方法
C言語・C++・C#
-
13
while文について、c言語です。
C言語・C++・C#
-
14
文字列ポインタを結合
C言語・C++・C#
-
15
c言語の文字列の逆順のプログラムがわかりません
C言語・C++・C#
-
16
break文でループを一気に抜けるには
C言語・C++・C#
-
17
間接参照のレベルが異なっています
C言語・C++・C#
-
18
*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください
C言語・C++・C#
-
19
C言語 配列の長さの上限
C言語・C++・C#
-
20
c言語 構造体
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
CStringからchar*への型変換に...
-
C言語のプログラムについてです
-
SubStringの使い方について
-
ASCIIコードへの変換方法
-
strcat関数を自作したいです
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
文字列の途中から途中までを抽出
-
簡易版smtpクライアント(メール...
-
char型にint型の数値を代入する。
-
ポインタの配列でエラーが出て...
-
char *name1[4] とchar name2[]...
-
警告 : 問題のあるポインタの変換
-
fgetsで読み込んだ値のvector処理
-
char 文字列型 の表現範囲が-12...
-
C言語 配列の長さの上限
-
セグメントエラー
-
fopne で失敗する原因
マンスリーランキングこのカテゴリの人気マンスリー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言語:小文字を大文字に変換す...
おすすめ情報