2015-10-18 1 views
-1

Например,Метод в C для проверки самой длинной совпадающей строки?

У меня есть строка: 7364jruf62

У меня также есть динамический 2d массив: (7, 4f6, 73, 2)

мне нужно пройти через строку и найти длинная совпадающая строка из массива (7 из строки может совпадать с 7 из массива, но 73 будет лучшим совпадением, так как это 2 цифры). Затем перейдите к остальной части строки, чтобы попытаться найти совпадения из массива (поскольку 73 было лучшим совпадением, которое мы теперь просматриваем через 64jruf62 в строке).

Причина, по которой массив является динамическим, поэтому я могу добавить соответствующее значение для строки в конце.

Я попытался сделать это в цикле с

for (i = 1; i <= numberOfStrsInArray; i++) { 
      count = 0; 
      shift = 0; 
    while (string[shift] == array[i][count]) { 
        shift++; 
        count++; 

Однако, это не работает, и вместо того, чтобы программа падает из-за этой линии. Может ли кто-нибудь сказать мне, почему это приводит к сбою моей программы или предложению лучшего решения для того, что я пытаюсь сделать? Благодарю. Я могу предоставить больше кода из моей программы, если предоставленный фрагмент не ясен.

+2

* Вопросы, требующие отладочной помощи («почему этот код не работает?») Должны включать e желаемое поведение, конкретная проблема или ошибка и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны для других читателей. * Показать [mcve] –

ответ

0

Поскольку вы имеете дело с массивами символов здесь, было бы проще работать с strstr, а не сравнивать друг с другом.

int index index = -1; 
int maxLength = -1; 
for (i = 1; i <= numberOfStrsInArray; i++) { 
    if (null != strstr(string, array)) { 
      if ((strlen(array) > maxLength) { 
      index = i; 
      maxLength = strlen(array); 
    } 
} 

Как уже упоминалось @Jongware, в случае, если массив не содержит нуль-концевых укусов - это приведет к катастрофе, так как массив будет вне границ. Если вы абсолютно необходимо использовать не строки нуль-teminated, вам следует использовать что-то вроде этого

int size = sizeof array/sizeof array[0]; 
char * strA = new char[ size + 1); 
strncpy (strA, string, size); 
strA[size] = 0; 
+2

«Динамический массив 2d» может не содержать правильную строку C. Возможно, OP может это разъяснить. – usr2564301

+0

Хорошая точка. Не думал об этом. –

+1

Ну, если он не заканчивается на нуль, а код автора, безусловно, сбой (и это действительно так), так как он попытается сравнить за пределами массива. –

0

В вашем коде,

for (i = 1; i <= numberOfStrsInArray; i++) 

1), i следует начинать с 0. Как вы знаете, индекс массива всегда начинается с 0. Таким образом, первая строка будет иметь индекс 0.

2) Еще один момент - цикл должен работать до numberOfStrsInArray-1.

Таким образом, цикл должен измениться

for (i = 0; i < numberOfStrsInArray; i++) 

Отредактировано

Согласно замечанию ОП, то второй пункт выше относится только к коду, то ..

+0

О, извините, не упомянув об этом. Первая строка в массиве должна быть пустой, поэтому я просто пропустил ее. – yezi3

+0

@ yezi3 вы опустили весь важный код из вопроса. Зачем? –

+0

@DavidHeffernan Бит кода, который я предоставил, является моим основным методом поиска и сравнения символов и является частью моей программы, которая вызывает ее сбой. – yezi3