Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語】テキスト内の単語を別の指定した単語に置き換えるプログラムの作り方

この記事では、3つの文字列 text(元のテキスト)、oldWord(置き換え対象の単語)、newWord(新しい単語)が与えられたとき、テキスト内の単語を別の指定した単語にすべて置き換えるCプログラムの作成方法を解説します。

プログラムは、テキスト内に存在する oldWord の出現箇所をすべて検索し、それぞれを newWord で置き換えた結果を出力します。

問題を理解するための具体例

入力

text = "I am learning programming"
oldWord = "learning"
newWord = "practicing"

出力

"I am practicing programming"

この例では、「learning」という単語が「practicing」に置き換えられ、残りの部分はそのまま維持されます。

解決のアプローチ

この問題を解くための手順は以下のとおりです。

  1. まず、strstr() 関数を使って、文字列内に oldWord が出現する回数を数えます。
  2. 出現回数をもとに、置き換え後のテキストを格納するのに十分なサイズのメモリを動的に確保します。
  3. 再度文字列を走査し、oldWord が見つかった位置には newWord をコピーし、それ以外の文字はそのままコピーします。

置き換え後の文字列は元の文字列より長くなる(短くなる)可能性があるため、必要なメモリサイズは「元の文字列の長さ + 出現回数 ×(newWord の長さ − oldWord の長さ)+ 1(終端ヌル文字分)」として計算します。

単語を別の単語に置き換えるCプログラム

サンプルコード

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void replaceWordInText(const char *text, const char *oldWord, const char *newWord) {
    int i = 0, cnt = 0;
    int len1 = strlen(newWord);
    int len2 = strlen(oldWord);

    // oldWord の出現回数をカウント
    for (i = 0; text[i] != '\0'; i++) {
        if (strstr(&text[i], oldWord) == &text[i]) {
            cnt++;
            i += len2 - 1;
        }
    }

    // 置き換え後の文字列用にメモリを確保
    char *newString = (char *)malloc(i + cnt * (len1 - len2) + 1);

    i = 0;
    while (*text) {
        if (strstr(text, oldWord) == text) {
            // oldWord が見つかったら newWord に置き換え
            strcpy(&newString[i], newWord);
            i += len1;
            text += len2;
        }
        else
            // 一致しない場合はそのままコピー
            newString[i++] = *text++;
    }
    printf("New String: %s\n", newString);
}

int main() {
    char str[] = "I am learning programming";
    char c[] = "learning";
    char d[] = "practicing";

    printf("Original string: %s\n", str);
    replaceWordInText(str, c, d);

    return 0;
}

実行結果

Original string: I am learning programming
New String: I am practicing programming

プログラムのポイント解説

  • 出現回数のカウント: strstr(&text[i], oldWord) == &text[i] の比較により、現在位置から oldWord が始まっているかどうかを判定しています。一致した場合はカウンタを増やし、ポインタを oldWord の長さ分だけ進めます。
  • 動的メモリ確保: 置き換えによって文字列の長さが変化するため、malloc() を使って必要なサイズのメモリを確保しています。使用後は free() で解放することが推奨されます。
  • 文字列の再構築: 2回目の走査では、oldWord と一致した位置で newWord を strcpy() でコピーし、それ以外の文字は1文字ずつコピーしていくことで、置き換え済みの新しい文字列を構築します。

このように、strstr()strlen()malloc() などの標準ライブラリ関数を組み合わせることで、テキスト内の任意の単語を効率的に別の単語へ置き換えることができます。

  1. 数値を英語の単語に変換するCプログラムの書き方

    数値で構成された文字列が与えられたとき、その数値を英語の単語(スペル表記)へ変換するのが本記事の課題です。例えば、入力が「361」であれば、出力は「Three hundred sixty one」となるようにします。この問題を解くためには、一の位・十の位・百の位・千の位など、それぞれの数字がどの桁に位置しているのかを意識することが重要です。なお、今回紹介するコードは最大4桁、つまり0から9999までの数値に対応しています。したがって、入力は0〜9999の範囲である必要があります。例として「1,111」を考えてみましょう。各桁は以下のように対応します。千の位:1(one thousand)百の位

  2. Wordでテキストを並べ替える方法|リスト・表の並べ替え手順を解説

    アプリケーションでテキストを並べ替えるというと、多くの方はExcelのスプレッドシートのセル並べ替えを思い浮かべるでしょう。しかし実は、テキストの各区切りがどこで始まりどこで終わるのかをWordに伝える情報さえあれば、Wordでもテキストを並べ替えることができます。 この記事では、Wordでテキスト・リスト・表を並べ替える具体的な方法をご紹介します。なお、すでにExcelにデータがある場合は、ExcelシートをWord文書に直接挿入する方法も便利なので、あわせて覚えておくとよいでしょう。 Wordでリストを並べ替える Wordで並べ替えの対象となるリストには、主に3種類あります。 1つ目は、単