C言語

【C言語】文字列に含まれる特定の文字、もしくは部分文字列を置き換える

プログラミング初心者向けの練習問題の一つとして、対象の文字列に含まれる特定の文字、又は部分文字列の置き換えるプログラムの作成があります。

本記事では、対象の文字列に含まれる特定の文字、又は部分文字列の置き換え処理をプログラムに実装する方法について解説しています。

特定の文字を置き換えるプログラム

まずは対象の文字列に含まれる特定の文字を置き換えるプログラムの実装方法を解説します。

なお、このプログラムでは長さ1を超える部分文字列を置き換えることはできません。

プログラム作成の手順

プログラム作成の手順は以下の通りです。

  1. ユーザに処理対象の文字列[0]と文字[1]、[2]を入力させる
  2. 置き換え後の文字列を格納する変数convertedを用意する
  3. [0]の先頭から末尾まで一文字ずつチェック
    →[1]と一致すれば[2]をconvertedに格納
    →[1]と一致しなければチェックしている文字をconvertedに格納

実装例

上記の手順に従ってプログラムを作成します。使用する言語はC言語です。

#include <stdio.h>

int main(void){

  char str[100];
  char alphabet_1[10];
  char alphabet_2[10];
  char converted[100];

  printf("文字列[0]に含まれる文字[1]を文字[2]で置き換えます。\n");
  printf("[0] : ");
  scanf("%s", str);
  printf("[1] : ");
  scanf("%s", alphabet_1);
  printf("[2] : ");
  scanf("%s", alphabet_2);
  printf("-----------------------------------------------\n");

  /*
  文字[1]、文字[2]として入力された値が
  長さ1を超える文字列ではないことをチェック
  */
  int count1 = 0;
  int count2 = 0;
  for (int i=0; alphabet_1[i]!='\0'; i++) {
    count1++;
  }
  for (int i=0; alphabet_2[i]!='\0'; i++) {
    count2++;
  }

  if (count1==1 && count2==1) {
    /*
    文字列[0]の先頭から末尾までチェックして
    文字[1]と同じものがあれば文字[2]で置き換える
    */
    int i = 0;
    for (i=0; str[i]!='\0'; i++) {
      if (str[i]!=alphabet_1[0]) {
        converted[i] = str[i];
      } else {
        converted[i] = alphabet_2[0];
      }
    }
    converted[i] = '\0';
    printf("%s\n", converted);
  } else {
    printf("不正な入力です。\n");
  }
  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

文字列[0]に含まれる文字[1]を文字[2]で置き換えます。
[0] : abcabcabc
[1] : a
[2] : x
-----------------------------------------------
xbcxbcxbc

発展:部分文字列を置き換えるプログラム

次に対象の文字列に含まれる部分文字列を置き換えるプログラムの実装方法を解説します。

なお、このプログラムは特定の文字も長さ1の部分文字列として扱うことができるため、先ほど紹介したプログラムの上位互換のような立ち位置になります。

プログラム作成の手順

プログラム作成の手順は以下の通りです。

  1. ユーザに処理対象の文字列[0]と部分文字列[1]、[2]を入力させる
  2. 置き換え後の文字列を格納する変数convertedを用意する
  3. [0]の先頭から末尾まで一文字ずつチェック
    →[1]と同じ並びがあれば[2]をconvertedに格納
    →[1]と同じ並びがなければチェックしている文字をconvertedに格納

実装例

上記の手順に従ってプログラムを作成します。使用する言語はC言語です。

#include <stdio.h>

int main(void){

  char str[100];
  char substr_1[100];
  char substr_2[100];
  char converted[100];

  printf("文字列[0]に含まれる部分文字列[1]を部分文字列[2]で置き換えます。\n");
  printf("[0] : ");
  scanf("%s", str);
  printf("[1] : ");
  scanf("%s", substr_1);
  printf("[2] : ");
  scanf("%s", substr_2);
  printf("----------------------------------------------------------\n");

  int len_substr_1 = 0;
  int len_substr_2 = 0;
  for (int n=0; substr_1[n]!='\0'; n++) {
    len_substr_1++;
  }
  for (int n=0; substr_2[n]!='\0'; n++) {
    len_substr_2++;
  }

  /*
  文字列[0]の先頭から末尾までチェックして
  部分文字列[1]と同じ並びがあれば部分文字列[2]で置き換える
  */
  int i_str = 0;
  int i_con = 0;
  while (str[i_str]!='\0') {
    int flag = 1;
    for (int n=0; substr_1[n]!='\0'; n++) {
      if (str[i_str+n]=='\0' || str[i_str+n]!=substr_1[n]) {
        flag = 0;
        break;
      }
    }
    if (flag==1) {
      for (int n=0; substr_2[n]!='\0'; n++) {
        converted[i_con+n] = substr_2[n];
      }
      i_str += len_substr_1;
      i_con += len_substr_2;
    } else {
      converted[i_con] = str[i_str];
      i_str++;
      i_con++;
    }
  }
  converted[i_con] = '\0';
  printf("%s\n", converted);
  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

文字列[0]に含まれる部分文字列[1]を部分文字列[2]で置き換えます。
[0] : abcabcabc
[1] : abc
[2] : xx
----------------------------------------------------------
xxxxxx
文字列[0]に含まれる部分文字列[1]を部分文字列[2]で置き換えます。
[0] : aaa
[1] : aa
[2] : xxx
----------------------------------------------------------
xxxa