関数strcatを自分で作ってみました。
#include<stdio.h>
char *my_strcat(char *s1, char *s2){
int i = 0;
int n = 0;
while(s1[i] != '\0'){
i++;
}
while(s2[n] != '\0'){
s1[i] = s2[n];
i++;
n++;
}
s1[i] = '\0';
return s1;
}
int main(){
char *s1 = "abc";
char *s2 = "vwxyz";
my_strcat(s1, s2);
printf("s1:%s s2:%s\n", s1, s2);
return 0;
}
これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。しかし、s2は一文字少なく表示されてしまいます。自分ではどこをどう直せばいいかわかりません。よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
s1→[0]
s2→[4]
[0]番地
|0|1|2|3 |4...
|a|b|c|\0|...
[4]番地
|4|5|6|7|8|9 |A...
|v|w|x|y|z|\0|...
my_strcat(s1, s2);
|0|1|2|3|4|5|6|7|8 |9 |A...
|a|b|c|v|w|x|y|z|\0|\0|...
|↑s1 |↑s2
文字列定数がどのようにメモリに配置されているのか
環境によって違います。
今回は、たまたま問題なく実行できただけです。
No.4
- 回答日時:
> char *s1 = "abc";
> char *s2 = "vwxyz";
上記二つは s1 と s2 に「どのような値」が入ってくるのか、
s1とs2が何を指すのかきちんと理解してください。
文字列「定数」がどのようなものなのか考えれば、
何故、これでダメなのか考えればすぐに分かります。
No.3
- 回答日時:
>char *s1 = "abc";
>char *s2 = "vwxyz";
>my_strcat(s1, s2);
問1.この「s1」の後ろに文字列を連結した時、s1の後ろはどうなりますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)
選択肢
A.何も起きない
B.文字列"vwxyz"が書き込まれる
C.何かが書き込まれるが、何が書き込まれるか判らない
問2.また、連結前のs1の後ろには、何がありますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)
選択肢
A.文字列s2を書き込むだけの充分な開き領域がある
B.たぶん文字列s2がある
C.そこに何があるか判らない
問3.文字列"abc"と"vwxyz"が、下図の図1ようにメモリに配置されていた場合、関数my_strcatを呼び出した後の、メモリ内の状態はどうなりますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)
図1
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'←ポインタs1が指すアドレス+2
0←ポインタs1が指すアドレス+3
'v'←ポインタs1が指すアドレス+4、ポインタs2が指すアドレス
'w'←ポインタs1が指すアドレス+5、ポインタs2が指すアドレス+1
'x'←ポインタs1が指すアドレス+6、ポインタs2が指すアドレス+2
'y'←ポインタs1が指すアドレス+7、ポインタs2が指すアドレス+3
'z'←ポインタs1が指すアドレス+8、ポインタs2が指すアドレス+4
0←ポインタs1が指すアドレス+9、ポインタs2が指すアドレス+5
選択肢
A.
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'
'v'
'w'
'x'
'y'
'z'
0
'v'←ポインタs2が指すアドレス
'w'
'x'
'y'
'z'
0
B.
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'
'v'←ポインタs2が指すアドレス
'w'←ポインタs2が指すアドレス+1
'x'
'y'
'z'
0
C.
'a'←ポインタs1が指すアドレス
'b'←ポインタs1が指すアドレス+1
'c'
'v'
'w'←ポインタs2が指すアドレス
'x'←ポインタs2が指すアドレス+1
'y'
'z'
0
0
>printf("s1:%s s2:%s\n", s1, s2);
問4.問3の条件で関数my_strcatを呼び出した結果、上記のprintf関数で表示される文字列はどうなりますか?以下のA~Cから正しいと思う物を1つ選びなさい(25点)
選択肢
A.s1:abc s2:vwxyz
B.s1:abcvwxyz s2:vwxyz
C.s1:abcvwxyz s2:wxyz
すべて、正解は「C」です。
これで100点を取れれば、s2がどうして1文字少なく表示されるかが判ります。
そして、何が悪かったのか、どう直せば良いかも判る筈です。
No.1
- 回答日時:
>これを実行したところ、s1はちゃんとs1にs2を連結した形で表示されました。
たまたまです。よく実行できましたね。
strcat() のマニュアルをまずは読みましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- 数学 数学の質問です。 kを正の実数とする。 点Pは△ABCの内部にあり、 kAP+5BP+3CP = 0 2 2023/07/03 21:24
- 工学 電気回路の2端子対回路 (1)スイッチS1のみが開いているときの電流I1を求めよ。 (2)スイッチS 4 2023/05/29 16:40
- Visual Basic(VBA) 該当セルに行替えを含むデータを命令文に入れて、2行に表示したい。 5 2023/07/20 11:51
- 工学 回路の勉強をしています。添付の説明で一点理解できないため教えてください。スイッチS1を閉じて定常状態 1 2022/10/24 15:58
- 統計学 t値の計算方法 1 2022/11/29 18:37
- 英語 節を列挙する例示表現について 2 2022/08/15 13:52
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
Cで作成したDLL関数をVBから呼...
-
fopne で失敗する原因
-
init関数の意味
-
DLL<->VB間での受け渡し(文字...
-
Run-Time Check Failure #3とい...
-
VB6でポインタ?
-
TCHAR文字列内の検索について
-
DelphiでCreateProcessがうまく...
-
printfとscanfの違いって・・・
-
構造体の削除について
-
ポインタ同士の割り算
-
構造体とfscanf
-
ハンドル、アドレス、ポインタ...
-
入れ子の構造体について
-
関数の動作説明
-
[excel vba] マウスポインタの...
-
int型ポインタの加算
-
Go言語のプログラムについて
-
for(s=p; *p; p++)の*p(ポイン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報