将段落转换为具有动态记忆的句子

时间:2011-11-20 08:04:19

标签: c memory-management malloc realloc text-segmentation

如何将段落转换为句子?我有一个函数签名如下:

char **makeSentences(char *paragraph);

其中:

  • paragraph是一个包含多个句子的字符串。段落确保每个句子以句点(。)结尾,整个段落以空终止符结束。
  • 返回动态分配的句子数组。

我对如何为动态句子分配内存感到困惑。

3 个答案:

答案 0 :(得分:1)

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] );
}

其中length_of_sentences是一个包含您发现的句子长度的数组。

答案 1 :(得分:0)

编写一个帮助方法,提前计算段落数,然后根据这个数字malloc一个char *指针数组。它会是这样的,虽然下面的代码是未经测试的,所以它可能不会直接起作用:

int getSentenceCount( char* paragraph) {
   int sentenceCount = 0, i = 0;
   for(i=0; i < sizeof(paragraph); i++){
        if(paragraph[i] == '.') sentenceCount++;
   }

   return sentenceCount;
}

一旦你有一个句子计数,其余的应该很容易使用字符串实用程序函数(见string.h)

答案 2 :(得分:0)

这样调用者可以确定它何时到达数组的末尾,只需将数组放大一个条目,并使用NULL作为最后一个/额外的条目。

困难的部分肯定是确定句子的开始/结束位置。这是一些例句(每行一个句子):

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).

将所有这些句子放在一个段落中,看看你的“句末”检测是否正常。