For example: "horse HORSE HORse HoRsE" the word horse appears 4 times. How can i do this in c? #include<stdio.h> #include<string.h> your text
main() your text
{
char str[100];
int i,SL,count=0,flag=0;
printf("Give string:");
gets(str);
SL=strlen(str);
for (i=0;i<SL;i++)
{
if ((str[i]=='h')||(str[i]=='H'))
{
flag++;
}
if ((str[i+1]=='o')||(str[i+1]=='O'))
{
flag++;
}
if ((str[i+2]=='r')||(str[i+2]=='R'))
{
flag++;
}
if ((str[i+3]=='s')||(str[i+3]=='S'))
{
flag++;
}
if ((str[i+4]=='e')||(str[i+4]=='E'))
{
flag++;
}
if (flag==5)
{
count++;
flag=0;
i=i+5;
}
}
printf("There are %d horse in the string",count);
} your text
当我把horse放在任何可能的组合中时,它都可以计数,就像我举的例子一样。但是当单词没有空格"horse horse"时,它只计数第一个单词。当我把horse放在像"hello horse how are you today"这样的句子中时,它什么也不计数。(抱歉我的英语)
4条答案
按热度按时间vqlkdk9b1#
您需要制作一个副本,以确保Haystack是可修改的或者根本不修改它。另外,使用函数。strnicmp不是通用的,因为它不检查字符串是否有不同的大小,但在这种情况下不需要。您还可以添加一些参数检查。
https://godbolt.org/z/YzaMrKGfz
谢谢你的回答。但是有没有一种方法可以不用tolower和strncmp来完成这个任务
使用函数是一个很好的实践,但是如果你不想使用标准的函数,你可以自己编写;
km0tfn4u2#
在每次检查之前将
flag
设置为零,而不仅仅是在匹配成功之后。查找匹配项时,不要向
i
添加任何内容。添加5会导致超出“horsehorse”中的第二个“h”,因为循环无论如何都会添加1。无需添加任何内容,因为循环在每次迭代中都会向i
添加1,添加超过1是错误的,因为对于某些字符串,新的匹配项可能会在当前匹配项结束之前开始。例如,“yoyoyo”包含“yoyo”的两个匹配项。p4tfgftt3#
您可以创建一个
for
循环来检查单词,并使用tolower
将其转换为小写形式,然后可以使用strncmp
将单词与horse
进行比较示例输出1:
示例输出2:
wsewodh24#
这里有两个问题:首先,请不要发布无法编译的不完整代码。另外,您在这里使用了一些不安全、不推荐使用的函数,这是一个等待发生的意外:你应该把gets改成fgets。
对于程序的逻辑,在if语句外将flag设置为0,并跳过手动递增i