質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2206閲覧

【C言語】ファイル中の文字列の置き換えに関するコードの疑問

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/01/22 06:26

編集2022/01/22 06:46

疑問点

dog.txtの"dog"を"rabbit"に置換してrabbit.txtに書き込むプログラムを作成しています。
まず、dog.txtの文字列をfgetsで読み込みbufrに格納します。その後、bufwにbufrの配列をコピーします。
そして、bufrの中から"dog"を探しそのアドレスをpに格納するというところまでは自力で理解できました。

その後、if(p)のブロックが置換のプログラムだと思うのですが、何をしているのかがわかりません。どういった操作が行われているのでしょうか?
特にq = bufw + (p - bufr); strcpy(q + strlen(str2), p + strlen(str1));のコードがわかりません。

加えて、このプログラムをそっくりそのまま実行してもrabbit.txtには書き込みがされませんでした。

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 FILE *fpr, *fpw; //読み書きファイルポインタ 7 char bufr[256], bufw[256]; //読み書きバッファ 8 char str1[] = "dog"; 9 char str2[] = "rabbit"; 10 char *p, *q; 11 12 fpr = fopen("dog.txt", "r"); 13 if (fpr == NULL) 14 { 15 printf("file open error!\n"); 16 return 1; 17 } 18 19 fpw = fopen("rabbit.txt", "w"); 20 if (fpw == NULL) 21 { 22 printf("file open error!\n"); 23 return 1; 24 } 25 26 do 27 { 28 fgets(bufr, 256, fpr); 29 strcpy(bufw, bufr); //bufwに読み込んだデータを格納 30 p = strstr(bufr, str1); //bufrの中からstr1=dogを探索 31 32 if (p) 33 { 34 q = bufw + (p - bufr); //疑問点 35 strcpy(q, str2); //疑問点 36 strcpy(q + strlen(str2), p + strlen(str1));//疑問点 37 } 38 fprintf(fpw, "%s", bufw); 39 40 if (feof(fpr)) 41 break; 42 43 } while (1); 44 45 fclose(fpr); 46 fclose(fpw); 47 return 0; 48} 49

dog.txt

1The dog Mr.Tanaka has is so ugly.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

rabbit.txtには書き込みがされませんでした。

fpw = fopen("rabbit.txt", "r");

fpw = fopen("rabbit.txt", "w");
に修正してみてください。

投稿2022/01/22 06:43

shsh_

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/22 06:47

簡単なミスをしていました。ありがとうございます。
guest

0

ベストアンサー

p = strstr(bufr, str1); //bufrの中からstr1=dogを探索

p はなにを指してるのかわかるでしょうか

投稿2022/01/22 06:34

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/22 06:35

これはbufrからstr1を探索し、該当アドレスをpに格納していると認識しています。
y_waiwai

2022/01/22 06:37

なら、(p - bufr)という式の結果はなにを表してるのかわかりますか
退会済みユーザー

退会済みユーザー

2022/01/22 06:43

具体的にイメージができないです。 bufrは配列の先頭アドレスで、pはこの場合bufr[4]なのでよくわからないですがlong型の整数が残る気がします。
y_waiwai

2022/01/22 06:48 編集

pにbufr+4 のアドレスが入っているなら、p-bufr の結果は、4が出てきます。((bufr+4)-bufr) んじゃそのつぎ、bufw+4 の式の結果はなにを表してるのか考えてみよう
退会済みユーザー

退会済みユーザー

2022/01/22 06:53

bufwはbufrと同等なのでbufwの"d"の部分のアドレスですね。 それでdogの部分にstr2”rabbit”をコピーして上書きしているんですね。
退会済みユーザー

退会済みユーザー

2022/01/22 06:57

strcpy(q + strlen(str2), p + strlen(str1));はMr.以降をコピーしているのですね。謎が解けました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問