2

再会,

所以我决定再次使用我的 C 语言并开始在字符串中进行简单的搜索。

这是我的代码:

#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,它总是返回word found。我也尝试过使用strcmp,但这只会比较字符串的第一个实例,并在未找到匹配项时停止,因此如果您想在字符串问题中进行单词搜索,它并不是真正可取的。

我以前没有真正制作过这样的程序,实际上从来不需要一个。所以我想问为什么不能正常工作,因为根据它的描述strstr应该是在一个句子中搜索一个词或者我只是误解了它。

另外,如果您对我的程序有任何意见,请随时说出来,以便我意识到我的错误。

谢谢

示例:单词:狗
句子:狗在这里
应该返回真

4

4 回答 4

5

这条线

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

应该

if(strstr(sentence,word) != NULL)

strstr()如果找不到单词,则返回指向第一次出现wordinsentence的指针。NULL

详情请阅读这里


还使用fgets()to read in the "strings" 将 a 附加'\n'到 "strings" 的末尾。这会阻止成功的比较。

要切断尾随'\n',您可以这样做:

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

  if (size && ('\n' == word[size-1]))
  {
    word[size-1] = '\0';
  }
}
于 2013-07-02T09:41:04.327 回答
2

返回指向 str1 中第一次出现 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。

返回 NULL (0) 本质上意味着未找到该字符串。

因此

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

应该

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

来源 - http://en.cppreference.com/w/c/string/byte/strstr

此外,正如 Armin 指出的那样,您不应该&printf. %s期望将指针传递给printf并使用数组的名称,因为sentence实际上与指向数组开头的指针相同,即sentence == &sentence[0]

于 2013-07-02T09:40:43.223 回答
1

该函数在字符串“haystack”中找到第一次出现的子字符串“needle”,如果没有找到strstr(),则返回指向子字符串开头的指针。NULL

所以你的 if 语句应该是

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

数组名代表自己的基地址,所以写

printf("%s",&word) 

或者

printf("%s",word) 

两者都表示数组的基地址。

于 2013-07-02T10:09:46.650 回答
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!");
}
于 2014-08-27T00:51:30.577 回答