復習:動的な文字列結合
CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 61/63。
チャレンジ
簡単テキスト処理ユーティリティを構築するために、動的な文字列連結関数を実装する C プログラムを作成してください。プログラムでは、次の処理を行います。
concatenateStringsという名前の関数を記述します。この関数は次の処理を行います。str1とstr2という名前の2つのchar*パラメーターを受け取る- 動的に割り当てられた文字列を指す
char*を返す - 2つの文字列とヌル終端文字のために必要なメモリの合計を計算する
malloc()を使用して、必要な量のメモリを正確に割り当てる- メモリ割り当てが成功したか確認する(割り当てに失敗した場合はNULLを返す)
strcpy()を使用して、最初の文字列を割り当てたメモリにコピーするstrcat()を使用して、2番目の文字列を結果に追加する- 新しく作成した連結文字列へのポインターを返す
processTextという名前の関数を記述します。この関数は次の処理を行います。word1、word2、separatorという3つのchar*パラメーターを受け取る- 動的に割り当てられた文字列を指す
char*を返す - 次の形式で結合文字列を作成する:word1 + separator + word2
- まず
concatenateStringsを呼び出して、word1とseparatorを結合する - 次に、再度
concatenateStringsを呼び出して、結果にword2を追加する - 中間処理で割り当てたメモリを適切に解放する
- 最終的な連結結果を返す
- main関数では、次の処理を行います。
- それぞれサイズ50の文字配列を3つ宣言する:
firstWord、secondWord、connector - 1つ目の単語、2つ目の単語、接続文字列を表す3つの文字列を入力から読み取る
- これら3つの文字列を指定して
processText関数を呼び出す - 返されたポインターがNULLでないことを確認する
- 成功した場合、結果を次の正確な形式で出力する:
Result: [concatenated_string] - メモリ割り当てに失敗した場合は、次のように出力する:
Memory allocation failed - 結果の文字列の長さを計算し、次の正確な形式で出力する:
Length: [length] - 動的に割り当てられたメモリを解放する
- それぞれサイズ50の文字配列を3つ宣言する:
この課題では、動的メモリ割り当て、文字列操作関数、ポインターの戻り値、適切なメモリ管理に関する習熟度を確認します。必要なメモリ量の計算、malloc()とfree()の使用、複数の文字列関数の扱い、メモリ割り当て失敗への対処を練習できます。この課題を通じて、動的割り当てによって、関数がスコープを抜けた後も有効なデータを作成して返せることを学びます。
自分で試してみよう
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: ここにconcatenateStrings関数を記述する
// TODO: ここにprocessText関数を記述する
int main() {
// 入力を読み取る
char firstWord[50];
char secondWord[50];
char connector[50];
scanf("%s", firstWord);
scanf("%s", secondWord);
scanf("%s", connector);
// TODO: 以下にコードを記述する
// processText関数を呼び出し、結果を処理する
return 0;
}論理と制御フローのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ