2015-12-08 113 views
-5

我有從標準例如裝載有函數getline串的2D陣列:切割「 0」從字符串

Hi my name is John. 
I like chocolate. 

然後,我想如果輸入的字符串/子與串陣列示例的一個相匹配,以搜尋:

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

我使用的是非標準功能的strstr:

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

的問題是,當我想找到一個不在字符串末尾的字符串,就像我寫的,它不匹配,因爲可能當我想在字符串中找到「like」時,它可能與\「like」比較\ 0,所以它永遠不會匹配。 (緩衝區)-1然後我分​​配內存爲strlen(緩衝區) - 1 * sizeof(char),然後將它複製到與memcpy函數的數組。一切都工作正常,但是當字符串已經lenght 7-8它把2個未定義字符在字符串例子的末尾:

字符串與長度小於7或大於8個字符很好地工作。如果你知道如何解決這個問題或知道從字符串\ 0更好的方式只是字符串沒有\ 0讓我知道我會感激。

部分代碼不起作用。只匹配像我提到的wtith結尾字符串.Pole是字符串的二維數組,行是存儲字符串的緩衝區。

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不會去除從輸入換行,所以,例如,你正在尋找:

"I do not know what to write\n" 

"know\n" 

所以你的問題不是關於剝離\0字符串結束,而是剝離\n行尾。

這可以以許多方式來實現,例如:

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

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

與多行輸入(無需進行在這種情況下)第一COPES - 僅去除最後一個換行符,而第二個換行符更簡潔。

+0

發佈代碼和打印兩個比較字符串後的結果。 – paxie

+0

是的,謝謝你是這個問題。 – paxie

+2

@paxie:當您在調試器中觀察字符串時,問題會立即顯而易見。 – Clifford

0

通過C中的函數搜索是非常easy.You可以使用的strcmp用於比較和的strcmp帶有像stricmp,STRNCMP它不同的口味等等...這裏是​​

+0

「通過*函數*進行搜索」?你的意思是「搜索*使用*函數」或「搜索*字符串*」?但這不是對這個問題的答案。使用'strstr()'標準庫直接支持搜索子字符串使用'strstr()'直接支持子字符串以不同的方式執行相同的操作並不能解決問題,因爲字符串確實不存在於行中 - 因爲它有一個「 \ n附加。 – Clifford

+1

......爲了公平,@paxie在接受答案後改變了問題*,所以我可以看到你怎麼會認爲這有幫助。我回滾了這個問題以保持上下文。 – Clifford