段落を文に変換するにはどうすればよいですか? 次のような関数シグネチャがあります。
char **makeSentences(char *paragraph);
その中で:
paragraph
複数の文を含む文字列です。Paragraph は、各文がピリオド (.) で終わり、段落全体が null ターミネータで終わるようにします。- 動的に割り当てられた文の配列を返します。
その場で文の配列にメモリを割り当てる方法について少し混乱しています。
段落を文に変換するにはどうすればよいですか? 次のような関数シグネチャがあります。
char **makeSentences(char *paragraph);
その中で:
paragraph
複数の文を含む文字列です。Paragraph は、各文がピリオド (.) で終わり、段落全体が null ターミネータで終わるようにします。その場で文の配列にメモリを割り当てる方法について少し混乱しています。
内で、ピリオドと の文字を含め、各文に含まれる文字数makeSentences
を調べる必要があります。paragraph
\0
次のようにメモリを割り当てることができます。
int i;
char** sentences = (char**)malloc( sizeof(char*) * number_of_sentences );
for (i = 0; i < number_of_sentences; i++) {
sentences[i] = (char*)malloc( sizeof(char) * length_of_sentences[i] );
}
wherelength_of_sentences
は、発見した文の長さを含む配列です。
呼び出し元がいつ配列の最後に到達したかを判断できるように、配列を 1 エントリ大きくして、最後の/余分なエントリに NULL を使用します。
難しいのは、文の開始/終了位置を決定することです。以下にいくつかの例文を示します (1 行に 1 文)。
Hello world!
Are you hungry?
She said "Hello. I'm Sara!" and smiled.
I installed version 1.3.
They laughed at the F.B.I. and ran.
The function returned the sequence 1, 3, 5, ..., 33.
7 is a lucky number (and this sentence doesn't start with a capital letter).
これらの文をすべて 1 つの段落にまとめて、「文の終わり」の検出が正しく機能するかどうかを確認します。
事前に段落数のカウントを提供するヘルパー メソッドを記述してから、この数に基づいて char* ポインターの配列を malloc します。以下のコードはテストされていないため、すぐには機能しない可能性がありますが、次のようになります。
int getSentenceCount( char* paragraph) {
int sentenceCount = 0, i = 0;
for(i=0; i < sizeof(paragraph); i++){
if(paragraph[i] == '.') sentenceCount++;
}
return sentenceCount;
}
文数を取得したら、残りは文字列ユーティリティ関数を使用して簡単に行うことができます (string.h を参照)。