2015-04-22 3 views
1

Я пытаюсь написать функцию, которая ищет уникальную часть (максимум два символа) строки в массиве строк. Хотя strstr и strchr не работают и по какой-то причине не работают. Поэтому я прибегал к созданию чего-то, что напоминает их функцию.Функция для поиска строки в массиве строк

Мой вопрос:
Почему strstr не работает (что-то вроде strstr(lex[j],word)) и что я здесь делаю неправильно?

Вот код для функции, которая ищет двух уникальных символов в массиве строк:

void convert(char word[]) 
{ 
    int i; 

    for (i = 0 ; i <= strlen(word) ; i++) 
    { 
     if(word[i] >= 65 && word[i] <= 90) 
     { 
      word[i] = word[i]+32; 
     } 
    } 
} 


int twochar(char lex[50][50],char word[], int size,char temp[3]) 
{ 
    int i,j,k,count,totlen; 
    convert(word); 

    for (i = 0 ; i < strlen(word) - 1 ; i++) 
    { 
     count = 0; 
     totlen = 0; 
     for(j = 0; j<size; j++) 
     { 
      convert(lex[j]); 
      totlen += strlen(lex[j]) - 1; 
      for(k = 0 ; k < strlen(lex[j]) - 1 ; k++) 
      { 
       if (word[i] != lex[j][k] || word[i+1] != lex[j][k + 1]) 
       { 
        count++; 
       } 
      } 
     } 
     if(count = = totlen) 
     { 
      temp[0] = word[i]; 
      temp[1] = word[i+1]; 
     } 
    } 
} 



int main(int argc, char *argv[]) 
{ 
    char lex[50][50] = {"word1","word2","word3","word4" }, word[] = "test"; 
    char p[3]; 

    twochar(lex,word,4,p); 
    printf("%c%c\n",p[0],p[1]); 
    return 0; 
} 
+1

Это 'STRLEN (закон [J]) - 1' является receipe для Desaster. Представьте, что произойдет, если 'lex [j]' является emtpy "string" с длиной '0'. Подсказка: проверьте тип 'strlen()' return. – alk

+0

Я удалил свой комментарий, в котором говорилось, что вы не завершаете 'temp []' с помощью 'temp [2] = '\ 0'', потому что я заметил, что вы никогда не используете' temp' или 'p' в качестве строки, только как обычную массив. –

+0

хорошо, я знаю, что это не лучшее решение, но что может быть альтернативой? – Peter

ответ

2

эта линия:

for(k=0;k<strlen(lex[j])-1;k++) 

проблема.

strlen(lex[0]) is 0 
strlen(lex[0])-1 is -1 (0xFFFFFFFF in a 32 bit system) 
k starts at 0 and is incremented until it is equal to 0xFFFFFFFF 

конечно, к выходит за пределы Lex [0] при к = 50.

результат не определен поведение, которое приводит к событию разлома SEG

Для того, чтобы определить, все вышесказанное, Я скомпилировал/связал программу через gcc с параметром -ggdb.

я запускал программу с помощью 'GdB Theprogram'

within gdb I entered 
br main <-- break point set 
run 
c <-- continue 
the program then crashed with a seg fault event 
then I entered 
bt <-- back trace 
the bt showed me this line: 'if(word[i]!=lex[j][k] || word[i+1]!=lex[j] [k+1])' 
Then I entered 
p k <-- print variable k 
=6832 (which is WAY out of bounds) 

then I entered 
run 
y 
br theprogram.c:41 (the line number from above) <-- set another break epoint 
c 
the program stopped at line 41 
p j 
=0 (this was the gdb response) 
p k 
= 0 
p i 
= 0 

a little thinking, 
stepping though that inner loop using 'n' <-- next 
and playing on gdb 
indicated that the problem was in line 42 
and resulted in revealing the root of the problem 
+0

BTW: предупреждения компилятора могут быть устранены путем объявления некоторых переменных цикла как «size_t», а не «int», – user3629249

Смежные вопросы