2016-05-28 4 views
2

Я пытаюсь найти наиболее эффективный способ поиска тегов в заданном массиве символов. Эти «теги» представляют собой последовательность символов, расположенных случайным образом в массиве символов.поиск последовательности символов в C в цикле

Приведен пример массива символов: {'a','s','s','1','m','s','g','e','x','x','r','s','1',...}. тег "ss1" указывает начало сообщения, содержащего каждый символ, до тех пор, пока не будет найдена последовательность "exx", которая является тегом для конца сообщения и продолжает поиск массива для следующей последовательности «s1». В этом примере сообщение «msg».

мой первоначальный дизайн был (псевдокод)

while(array[i] != '\0') 
    if(array[i] == 's' && array[i+1] == 's' && array[i+2] == '1' ) 
     int j = i+3; 
      if(array[j] != '\0' && array[j] == 'e' && array[j+1] == 'x' && array[j+2] == 'x') 
       i += 3; 
      else 
       print(array[j]); 
    else i++; //next char 

может быть немного недостатков, но вы получите идею. Есть ли способ лучше? Я думал о strstr, но поскольку я имею дело с массивом символов здесь и продолжаю цикл даже после расшифровки сообщения, я думал, что это может быть сложно реализовать.

+0

может быть вложены теги? что-то подобное приемлемо? msg_start _..... innerloopmessage ... msg_eng _....

+0

no @RaviSankarRaju –

+0

Ну для начала вы индексируете прошлое конца массива. Что, если останется один персонаж? Поэтому 'array [i]' is '' x'' например, и 'array [i + 1]' is ''\ 0''. Поэтому вы проверяете, является ли 'array [i]' '' \ 0'', а это не так. Затем переходите к рассмотрению * трех * записей, когда вы только знаете, что один из них доступен. Это, вероятно, нарушение прав доступа. Он будет * вероятно * работать, но это не гарантируется, и это очень неряшливое кодирование. Никогда, никогда не пытайтесь читать мимо конца массива. Хуже того, вы продолжаете еще больше с 'j'. –

ответ

1

Попробуйте сохранить состояние, обозначающее, сколько тегов начало и конец вы нашли. Что-то вроде этого: (Этот код будет работать, даже если сообщение в теге произвольной длины)

int state = 0; 
int found = 0; 
int i = 0,j; 
int msgStartIndex; 
int msgEndIndex; 
while(array[i]){ 
    if((array[i] == 's' && state == 0) || (array[i] == 's' && state == 1) || (array[i] == '1' && state == 2)){ 
     state++; 
     if(!found && state == 3){ 
      msgStartIndex = i+1; 
      found = 1; 
     } 
    } 
    else if(!found && (array[i] = 's' && state == 2)) 
     state = 2; 
    else if(!found) 
     state = 0; 
    if((array[i] == 'e' && state == 3) || (array[i] == 'x' && state == 2) || (array[i] == 'x' && state == 1)){ 
     state--; 
     if(found && state == 0){ 
      found = 0; 
      msgEndIndex = i-3; 
      for(j=msgStartIndex; j < msgEndIndex+1; j++) 
       printf("%c",array[j]); 
      printf("\n"); 
     } 
    } 
    else if(found && (array[i] == 'e') && (state == 2 || state == 1)) 
     state = 2; 
    else if(found) 
     state = 3; 
    i++; 
} 

Обновленный ответ для открывающего тега st1 и закрывающего тега ex1

int state = 0; 
int found = 0; 
int i=0,j; 
int msgStartIndex; 
int msgEndIndex; 
while(array[i]){ 
    if((array[i] == 's' && state == 0) || (array[i] == 't' && state == 1) || (array[i] == '1' && state == 2)){ 
     state++; 
     if(!found && state == 3){ 
      msgStartIndex = i+1; 
      found = 1; 
     } 
    } 
    else if(!found && (array[i] = 's' && (state == 1 || state == 2))) 
     state = 1; 
    else if(!found) 
     state = 0; 
    if((array[i] == 'e' && state == 3) || (array[i] == 'x' && state == 2) || (array[i] == '1' && state == 1)){ 
     state--; 
     if(found && state == 0){ 
      found = 0; 
      msgEndIndex = i-3; 
      for(j=msgStartIndex; j < msgEndIndex+1; j++) 
       printf("%c",array[j]); 
      printf("\n"); 
     } 
    } 
    else if(found && (array[i] == 'e') && (state == 2 || state == 1)) 
     state = 2; 
    else if(found) 
     state = 3; 
    i++; 
+0

Что происходит, когда закрывающий тег является ex1? как это влияет на код? –

+0

@i_use_the_internet просто измените 'if ((array [i] == 'e' && state == 3) || (array [i] == 'x' && state == 2) || (array [i] = = 'x' && state == 1)) 'to' if ((array [i] == 'e' && state == 3) || (array [i] == 'x' && state == 2) || (array [i] == '1' && state == 1)) ' – Nishant

+0

вызывает ошибку сегментации для массива {'a', 's', 't', '1', 'm', ' с, 'G', 'е', 'х', '1', 'R', 's', 'т', '1', 's', 'т', '1', 's' , 's', 'G', 'е', 'х', '1', 'г'}; начальный тег st1 end tag ex1 –