質問: 至急!c言語文字列置換 初心者です。みなさまどうか教えてください。(>_<) 文字列置換関数をつくれ ただし文字列操作系関数はつかうな(str---)。 void replace(char*str, char*before,char*after);
回答: 以下のようにしてください。#include #include //自前の文字列操作関数 //strのlengthを返す(自前のstrlen) int mystrlen(char *str){ int i = 0; while(*str){ i++; str++; } return i; } //メモリの比較を行う(自前のmemcmp) int mymemcmp(void *str1,void *str2,int len){ unsigned char *s1 = (unsigned char*)str1; unsigned char *s2 = (unsigned char*)str2; int i = len; if (len == 0) return 0; while(*s1 == *s2){ i--; if (i == 0) return 0; s1++; s2++; } return (*s1 - *s2); } //メモリのコピー(str1<--str2)(自前のmemmove) void mymemmove(void *str1,void *str2,int len) { unsigned char *s1 = (unsigned char*)str1; unsigned char *s2 = (unsigned char*)str2; if (s1 < s2){ while(len > 0){ len--; //前からコピー *s1++ = *s2++; } }else{ while(len > 0){ len--; //後ろからコピー *(s1+len) = *(s2+len); } } return; } //メモリのコピー(str1<--str2)(自前のmemcpy) void mymemcpy(void *str1,void *str2,int len) { unsigned char *s1 = (unsigned char*)str1; unsigned char *s2 = (unsigned char*)str2; while(len > 0){ len--; *s1++ = *s2++; } return; } //課題の関数 //myxxxxのmyをとり実際に存在するxxxxを呼び出しても同じ結果が得られる筈 //例 mystrlen--->strlen //例 mymemcmp--->memcmp //例 mymemcpy--->memcpy //例 mymemmome--->memmove void replace(char *str,char *before,char *after) { int slen = mystrlen(str); int blen = mystrlen(before); int alen = mystrlen(after); int len; char *s = str; char *from; char *to; /* if (blen < alen){ printf("afterの長さ>beforeの長さの為処理を中止します\n"); return; }*/ while(*s){ //str中にbeforeがあるかチェックする if (mymemcmp(s,before,blen) == 0){ //存在する場合 //beforeの後の文字列の移動 from = s + blen; to = s + alen; len = mystrlen(from); mymemmove(to,from,len); //終端に\0を設定 *(to+len) = '\0'; //文字列の置換 mymemcpy(s,after,alen); //mymemmoveを使用しても問題ない //次は置換された文字列の次から処理する s = to; continue; } s++; } } //replace呼び出し前後のstr,bofore,afterの内容を表示 void test(char *str, char *before,char *after) { printf("実行前\n"); printf("<%s> <%s> <%s>\n",str,before,after); replace(str,before,after); printf("実行後\n"); printf("<%s> <%s> <%s>\n",str,before,after); } int main(void) { char str[256]; strcpy(str,"abcxxefgxxxyzxx"); test(str,"xx","yyy"); strcpy(str,"abcxyzefgxyzxyzxyz"); test(str,"xyz","ab"); strcpy(str,"abcxxxxxx"); test(str,"xx","abcd"); return 0; }以下、実行結果です。 実行前 実行後 実行前 実行後 実行前 実行後