いつもお世話になっています。
今回質問させていただくのは、string.hライブラリの中のstrcpy関数の引数及び動作についてです。
やりたいこととしては
"abcaabbccaaabbbccc"という定型文に対して、
入力した文字列①が含まれているか?また含まれていた場合にその文字列①を入力した文字列②に置き換えるということです。
以下が私が書いたコードになります。
#include <stdio.h> #include <string.h> void hairetuOkikaeSyutan(char *); //hairetuOkikaeSyutanのプロトタイプ宣言。以下の実装を確認してください void hairetuOkikaeSyutan(char *cntHairetu){ //配列の0番目から順に'\0'を格納するための関数 int cnt = 0; //渡されたchar配列の0番目の要素からの現在地を格納する変数 for(int cnt = 0; cnt < 200; cnt++) *(cntHairetu + cnt) = '\0'; //渡されたchar配列の0番目の要素から順に、'\0'で200字分埋める処理 } int hairetuCount(char *); //hairetuCountのプロトタイプ宣言 int hairetuCount(char *sentouP){ //渡された配列の長さをカウントする関数 int hairetuCount = 0; //カウントした文字列の長さを格納する変数 while( *(sentouP + hairetuCount) != '\0') hairetuCount++; return hairetuCount; //カウントした要素数を返す } int main(int argc, char *argv[]){ //複数回使用される重要な変数の宣言部--------------- char *kentiPlace; //入力した文字列①を検知した場所を示すポインタを格納する変数 char kensaStr[200]; //入力した文字列①を格納する変数 char changeStr[200]; //入力した文字列②を格納する変数 char taisyoStr[200]; //検査対象となる定型文を格納する変数 char changeKanryoStr[200]; //文字列置換完了後の文字列を格納する変数 //-------------------------------------------- //配列の初期値に\0を代入する関数を呼び出す hairetuOkikaeSyutan(changeStr); hairetuOkikaeSyutan(taisyoStr); //---------------------------------------- //初期表示および変数入力----------------------- strcpy(taisyoStr, "abcaabbccaaabbbccc"); printf("置換前文字列 : %s\n", taisyoStr); printf("対象文字列 : "); fflush(stdout); scanf("%s", kensaStr); printf("置換文字列 : "); fflush(stdout); scanf("%s", changeStr); //------------------------------------------- //置換文字列の文字数を代入する処理-------- int cntChangeStr = hairetuCount(&changeStr[0]); //置換用文字列の長さを格納する変数の宣言 //---------------------------------------- //検査文字列の文字数を代入する処理-------- int cntKensaStr = hairetuCount(&kensaStr[0]); //置換用文字列の長さを格納する変数の宣言 //---------------------------------------- //文字列の置換---------------------------------------------------------------------------------- strcpy(changeKanryoStr, taisyoStr); kentiPlace = &changeKanryoStr[0]; while( (kentiPlace = strstr(kentiPlace, kensaStr)) != NULL){ //検査対象文字列の中に検査文字列が含まれている間以下の処理を繰り返す 1. //char testStr[200]; 1. //strcpy(testStr, (kentiPlace + cntKensaStr)); 1. //strcpy((kentiPlace + cntChangeStr), testStr); 2. strcpy((kentiPlace + cntChangeStr), (kentiPlace + cntKensaStr)); //...2 strncpy(kentiPlace, changeStr, cntChangeStr); kentiPlace = kentiPlace + cntChangeStr; } //------------------------------------------------------------------------------------------- //置換完了後文字列出力--------------------------- printf("置換後文字列 : %s", changeKanryoStr); //置換後の文字列を表示 //----------------------------------------------- return 0; }
実行結果としては以下のようになりました。
置換前文字列 : abcaabbccaaabbbccc 対象文字列 : ab 置換文字列 : ddd 置換後文字列 : dddcccbbccaaaabbccc
期待する結果は
dddcadddbccaadddbbccc
ですが、ソース中の2.の部分が期待する動作をしてくれずに困っています。
コメントアウトされた1.の3行で実行すると期待する結果になりますが、
一体何が違っているのかわかりません。
質問がアバウトになってしまいますが、1.の3行と、2.の1行で何が異なっているせいで期待する結果が得られないかを教えていただきたいです。
また必要な情報が足りなかった場合には追記させていただきます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/08 12:34