2012-10-10 5 views
1

그래서 내가하려는 것은 사용자가 치즈를 검색하고 화면에 표시하도록하는 것입니다. 후자와 문제가 있습니다. 나는 문자열을 표시하는 것,하지만 내 코드는 여전히 실행됩니다. 여기 내 코드는 다음과 같습니다.검색된 문자열을 화면에 어떻게 표시합니까?

#include<stdio.h> 
#include<string.h> 

    char cheeses[][20] = { 
     "Cheddar", 
     "White Cheddar", 
     "Colby Jack", 
     "Gouda", 
     "Blue Cheese", 
     "Gorgonzola", 
     "Asiago", 
     "Limburger", 
     "Feta", 
     "Brie", 
     "Goat", 
    }; 

     void find_cheese(const char *search_for) 
    { 
     int i; 
     for (i = 0; i < 5; i++) { 
      if (strstr(cheeses[i], search_for)) 
       printf("Cheese %i: '%s'\n", i, cheeses[i]); 
     } 
    } 

int main() 
    { 
     char search_for[20]; 
     printf("Search for: "); 
     fgets(search_for, 20, stdin); 
     find_cheese(search_for); 
     return 0; 
    } 

그래서이 경우 어떻게해야합니까? "Lim"이라고 입력하면 Limburger가 표시됩니다 (나중에 치즈 정보를 표시 할 수 있습니다). 내가 어떻게 할까?

답변

3

괜찮아 보이지만, 먼저 5 번만 검색하면 Limburger가 목록의 끝에 너무 가깝습니다.

이 코드 유형은 "센티넬", 즉 목록이 종료되었음을 나타내는 데 사용되는 특수 마커로 해결하는 것이 더 좋습니다. 문자열의 경우 배열을 고정 크기 배열이 아닌 문자열에 대한 포인터의 배열로 표현한 다음을 사용하면 매우 자연 스럽습니다.

배열이 될 것입니다 :

const char *cheeses[] = { "Cheddar", "White Cheddar", "Colby Jack", 
      /* ... rest of the cheeses ... */ 
      NULL 
}; 

은 다음과 같이 검색 루프를 작성할 수 있습니다

int i; 

for(i = 0; cheeses[i] != NULL; ++i) 
{ 
    /* Test and handling code here, against cheeses[i] just like before. */ 
} 
+0

당신이 그런 짓을 수'에 대한 (전 = 0; i가 sizeof 연산자 <(치즈)/sizeof (* cheeses); i ++)'대신에? – Reimeus

+0

@ Reimeus 예, 물론입니다. 좀 더 복잡해 보였으므로 저는 감시 카메라 appraoch를 선택했습니다. 그러나 이것은 일반적으로 사용되었습니다. 또한 변수 이름을 괄호로 묶을 필요가 없으며 'sizeof'는 함수가 아닙니다. – unwind

+0

실행되지만 여전히 치즈 이름이 표시되지 않습니다. 다른 printf가 필요합니까? –

관련 문제