Преобразование абзаца в предложения с динамической памятью - PullRequest
0 голосов
/ 20 ноября 2011

Как я могу преобразовать абзац в предложения? У меня есть подпись функции следующим образом:

char **makeSentences(char *paragraph);

В котором:

  • paragraph - строка, содержащая несколько предложений. Параграф гарантирует, что каждое предложение заканчивается точкой (.), А весь абзац заканчивается нулем-терминатором.
  • возвращает динамически распределенный массив предложений.

Я немного озадачен тем, как распределить память для массива предложений на лету.

Ответы [ 3 ]

1 голос
/ 20 ноября 2011

В пределах 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 - массив, содержащий длины предложений, которые вы обнаружили.

0 голосов
/ 20 ноября 2011

Чтобы вызывающий мог определить, когда он достиг конца массива, просто увеличьте массив на одну запись и используйте 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).

Поместите все эти предложения в один абзац, чтобы проверить, правильно ли работает определение «конца предложения».

0 голосов
/ 20 ноября 2011

Напишите вспомогательный метод, чтобы заранее подсчитать количество абзацев, а затем сопоставить массив указателей char * на основе этого числа.Это будет что-то вроде этого, хотя приведенный ниже код не протестирован, поэтому он может не работать сразу:

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

   return sentenceCount;
}

После того, как вы получите количество предложений, остальное должно быть легко с использованием строковых служебных функций (См. Строкуч)

...