2013-07-02 2 views
1

좋은 날을, 진정한 반환 C를 사용하여 문자열에서 단어를 찾을 수 있습니다. 지금않는 strstr 모든 시간 그래서 나는 다시 내 C 물마루 가기로 결정하고 문자열에서 간단한 검색을 단어를 만들기 시작 <p></p>

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

main(){ 
char word[100]; 
char sentence[100]; 

clrscr(); 
printf("Enter a word: "); 
fgets(word, 100, stdin); 
getch(); 
printf("The word is : %s", &word); 
getch(); 
printf("\nEnter a sentence: "); 
fgets(sentence, 100, stdin); 
getch(); 
printf("The sentence is: %s",&sentence); 
getch(); 
if(strstr(sentence,word) == 0){ 
    printf("word found!"); 
} 
getch(); 
return 0; 
} 

문제 내가 strstr를 사용하여 문자열에서 단어를 검색하려고 할 때마다, 항상 단어을 발견 반환한다는 것입니다 :

여기 내 코드입니다. 또한 strcmp을 사용해 보았습니다.하지만 문자열의 첫 번째 인스턴스를 비교하고 일치 항목을 찾을 수 없을 때 중지하므로 문자열 문제에서 단어를 검색하려는 경우에는 사용하지 않는 것이 좋습니다.

저는 실제로 이런 프로그램을 만들지 않았습니다. 실제로는 하나도 필요하지 않았습니다. 그래서 그 이유 설명에 따라 제대로 작동하지 않는 이유를 물을 수도 있습니다. strstr 문장에서 단어를 검색해야하거나 그냥 오해했을뿐입니다.

또한 내 프로그램에 대한 의견이 있으면 자유롭게 말하면서 실수를 알 수 있습니다.

감사합니다

예 : 단어 : 개
문장 : 개는 여기
이 사실

+0

에 코드를 변경'의 printf는 ("문장은 다음과 같습니다 % s '에, 문장),' –

+0

@Armin I 미안하지만 그건 내가 쓴거야? – magicianiam

+0

예. 나는 그것을 지적하고있다. –

답변

4

이 줄은

if(strstr(sentence,word) == 0) 

해야한다, printf에 전달 sentence 같은 배열의 이름을 사용하는 것이 실제로 배열의 시작에 대한 포인터와 동일한 것으로 예상
if(strstr(sentence,word) != NULL) 

strstr()sentence 또는 NULL 승 경우에 word의를 선두에 대한 포인터를 반환 ord가 발견되지 않았습니다.

please read here.또한, "스트링"의 읽어 fgets()를 사용


은 "문자열"끝에 '\n'를 추가한다. 이것은 성공적인 comparsion을 금지합니다.

fgets(word, sizeof(word), stdin); 
{ 
    size_t size = strlen(word); 

    if (size && ('\n' == word[size-1])) 
    { 
    word[size-1] = '\0'; 
    } 
} 
+0

좋은 날 @alk, 나는 노력했지만 아직 작동하지 않았다. 단지 문장의 시작 부분에 단어가있을 때만 작동했다. – magicianiam

+0

fgets 대신에 무엇을 제안 하시겠습니까? – magicianiam

+0

@magicianIam :'fgets()'를 사용하는 것은 아무것도하지 않는 안전한 선택입니다. – alk

2

이 STR1에서 STR2의 첫 번째 항목에 대한 포인터를 반환 반환해야 또는 str2가 str1의 일부가 아닌 경우 널 포인터.

NULL을 반환하면 근본적으로 문자열을 찾을 수 없다는 의미입니다.

http://en.cppreference.com/w/c/string/byte/strstr가 아르 민은 지적 또한, 당신이 당신의 printf에 주소 연산자, &를 사용하지 말아야합니다 -

따라서

if(strstr(sentence,word) == 0){ 
    printf("word found!"); 
} 

if(strstr(sentence,word) != NULL){ 
    printf("word found!"); 
} 

소스이어야한다. %s 포인터 즉 sentence == &sentence[0]

+1

왜 downvote? –

1

strstr() 함수는 문자열 "건초 더미"에서 문자열 "바늘"의 첫 번째 발생을 발견하고 그것을 시작 부분에 포인터를 반환

는 다음과 같이 할 수있는 후행 '\n'의 잘라하려면 하위 문자열이 없으면 NULL입니다.

은 그래서 당신의 if 문은

if(strstr(sentence,word) != NULL){ 
printf("word found"); 
} 

배열 이름이 너무

printf("%s",&word) 

또는

printf("%s",word) 

배열의 두 repesents 기본 주소를 작성, 자신의 기본 주소를 표시해야합니다.

0

코드의 예에 약간의 수정이 있습니다,

if(strstr(sentence,word) == 0){ 
printf("word found!"); 
} 

변경은 다음과 같습니다 대신 == 0 = 0에 해당하는 = NULL, 포인터의 경우 0과 NULL은 동일합니다! . NULL 키워드는 다음과 같이 정의되어 있기 때문에 는 :

#define NULL ((void *)0) 

그래서 당신이 잘못 인쇄

if(strstr(sentence,word) != 0){ 
printf("word found!"); 
}