• 締切済み

分からないです(;_;)

分からないです(;_;) 2 ユーザ関数char *my_strstr(const char *str1, const char *str2)とchar *strrep(char *src, const char *sch, const char *rep)を作成する。以下にユーザ関数の詳細を示す。 ・char *my_strstr(const char *str1, const char *str2) 文字列str1の中に文字列str2が含まれているか検索して、もし含まれているならばその位置をポインタで返し、含まれていないならばNULLを返す。ただし、以下の条件をつける。 ・文字列str2が文字列str1に複数含まれている場合は、str1の先頭から見て最初に現れるstr2を返す ・標準ライブラリ関数strcmp, strstrは使わない ・char *strrep(char *s, const char *sch, const char *rep) ユーザ関数my_strstrを用いて、文字列sの中に文字列schが含まれているか検索して、もし含まれているならばその部分を文字列repで置換し、置換した文字列の次の文字の位置を返す。含まれていないならばNULLを返す。ただし、以下の条件をつける。 ・文字列schが文字列sに複数含まれている場合は、sの先頭から見て最初に現れるschを置換する。 そして、キーボードから「文字列」「検索する文字列」「置換する文字列」を入力し、ユーザ関数strrepを用いて、「文字列」の中に含まれているすべての「検索する文字列」を「置換する文字列」で置換した結果と、「検索する文字列」が含まれていた個数を表示する。 <実行結果> Input a character string :anpanman Input a character string which you want to search :an Input a character string which you want to replace :enki The character string after replace is "enkipenkimenki" count :3 Input a character string :Yamanote-Line Input a character string which you want to search :Yamanote Input a character string which you want to replace :Chuo The character string after replace is "Chuo-Line" count :1 Input a character string :abc123/.@ Input a character string which you want to search :def Input a character string which you want to replace :xyz The character string after replace is "abc123/.@" count :0

みんなの回答

回答No.2

// strlenとかmemmoveは使っていいのかどうか不明なので // printfとscanf以外の標準関数は使わなかった // 設問上の仕様に不明確だけど、検索文字より置換文字の方が長い場合は // 呼び出し元で配慮しないとバッファあふれの危険あり #include <stdio.h> char *my_strstr(const char *str1, const char *str2) { const char *pos = str1; int idx, dif; while (*pos != '\0') { for (idx = 0, dif = 0; *(str2 + idx) != '\0'; idx++) { if (*(pos + idx) != *(str2 + idx)) { dif = 1; break; } } if (dif == 0) break; pos++; } return((char *)(dif ? NULL : pos)); } char *strrep(char *s, const char *sch, const char *rep) { int idx; int len_sch, len_rep, len_str; char *pos; for (idx = 0; *(sch + idx) != '\0'; idx++) ; len_sch = idx; for (idx = 0; *(rep + idx) != '\0'; idx++) ; len_rep = idx; for (idx = 0; *(s + idx) != '\0'; idx++) ; len_str = idx; if ((pos = my_strstr(s, sch)) == NULL) return(pos); if (len_rep > len_sch) { for (idx = len_str; s + idx >= pos + len_sch; idx--) { *(s + idx + (len_rep - len_sch)) = *(s + idx); } } else { for (idx = (pos - s + len_rep); idx <= len_str - (len_sch - len_rep); idx++) { *(s + idx) = *(s + idx + (len_sch - len_rep)); } } for (idx = 0; idx < len_rep; idx++) { *(pos + idx) = *(rep + idx); } return(pos + len_rep); } void main() { char str[256], sch[256], rep[256]; int count = 0; printf("Input a character string :"); scanf("%s", str); printf("Input a character string which you want to search :"); scanf("%s", sch); printf("Input a character string which you want to replace :"); scanf("%s", rep); while(strrep(str, sch, rep) != NULL) count++; printf("The character string after replace is \"%s\"\n", str); printf("count :%d\n", count); }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「わからない」とわめくだけでは絶対にわからない. 何をどう考えた? memcmp や strlen は使っていいんだろうか.