2015-12-08 3 views
-5

У меня есть 2D массив строк, загруженные с GetLine из STDIN Например:Cutting « 0» из строки

Hi my name is John. 
I like chocolate. 

Тогда я хочу искать, если введенную строку/подстроки с одним из примера строковых массивов:

Ohn. - matches at line 1 
chocolate. - matches at line 2 

Я использую функцию Standart strstr:

if ((strstr(array[i],string)) != NULL) { 
     printf("Match"); 
} 

проблема заключается в том, что, когда я хочу найти строка, которая не находится в конце строки, как я написал, она не соответствует, потому что, вероятно, когда я хочу найти «как» в строке, она, вероятно, сравнивается как \ 0 с «как», поэтому она никогда не будет соответствовать.

Когда я загружаю строку с помощью getline в буфер, я использовал функцию: strlen (buffer) -1, тогда я выделил память для strlen (buffer) - 1 * sizeof (char), а затем скопировал ее в массив с функцией memcpy. Все работало отлично, но когда строка имеет длину в 7-8 он ставит 2 неопределенные символы в конце строки, например:

строк длиной менее 7 или более 8 символов работают отлично. Если вы знаете, как исправить эту проблему или узнать лучший способ сделать из строки \ 0 просто строка без \ 0, дайте мне знать, я буду благодарен.

Часть кода, который не работает. Только совпадения с конечными строками, как я упомянул. Поле представляет собой 2D массив строк, строка - это буфер, в котором хранится строка.

size_t len = 0; 
char *line = NULL; 
int number; 
while ((number = getline(&line, &len, stdin)) != -1) { 
    for (i = 0; i < index; i++) { 
      if(strstr(pole[i], line) != NULL) { 
       printf("Match"); 
      } 
    } 
} 


    6 
John. 

'Hi my name is John. 
' contain 'John. 
' 
'Testing stuff 
' does not contain 'John. 
' 
'I do not know what to write 
' does not contain 'John. 
' 
8 
Testing 

'Hi my name is John. 
' does not contain 'Testing 
' 
'Testing stuff 
' does not contain 'Testing 
' 
'I do not know what to write 
' does not contain 'Testing 
' 
5 
know 

'Hi my name is John. 
' does not contain 'know 
' 
'Testing stuff 
' does not contain 'know 
' 
'I do not know what to write 
' does not contain 'know 
' 
+7

Строка представляет собой массив символов, заканчивающихся на \ 0. Если он не заканчивается символом \ 0, это не строка. Кроме того, strstr делает ** не ** считать \ 0. – immibis

+0

Так можете ли вы тогда сказать мне, почему это не соответствует всей строке или подстроке? – paxie

+0

можете ли вы отредактировать вопрос с помощью фрагмента кода, который вы написали? –

ответ

3

Ваша проблема очевидна в вашем отладочном выходе. getline не удаляет символ новой строки от входа, так, например, вы ищете:

"know\n" 

в

"I do not know what to write\n" 

Так что ваша проблема не про зачистку \0 строки терминатора, а зачистки \n конец строки.

Это может быть достигнуто несколькими способами, например:

char* newline = strrchr(line, '\n') ; 
if(newlineaddr != NULL) 
{ 
    *newlineaddr = '\0' ; 
} 

или

size_t newlineindex = strcspn(line, "\n") ; 
line[newlineindex] = '\0' ; 

Первые справляется с входом многострочного (не требуется в данном случае) - только удаление последняя строка новой строки, вторая - более кратка.

+0

Отправленный код и результат после печати двух сравниваемых строк. – paxie

+0

Да, спасибо, что это была проблема. – paxie

+2

@paxie: проблема была бы сразу очевидна, когда вы наблюдали строки в отладчике. – Clifford

0

Поиск с помощью функции в с очень easy.You можно использовать STRCMP для сравнения и зЬгстр поставляется с различными вкусами ней как stricmp, strncmp и так далее ... Вот link

+0

«Поиск через * функцию *"? Вы имели в виду «поиск * с использованием * функции» или «поиск по строке *»? Но это не ответ на вопрос в любом случае. Поиск подстроки напрямую поддерживается стандартной библиотекой с помощью 'strstr()' Выполнение одной и той же вещи по-другому не решит проблему здесь, которая заключается в том, что строка действительно не существует в строке - потому что она имеет отклоненную ' \ n' добавлено. – Clifford

+1

... чтобы быть справедливым, @paxie изменил вопрос * после * принятия ответа, поэтому я вижу, как вы могли подумать, что это полезно. Я вернул вопрос для поддержания контекста. – Clifford

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