C语言 如何检查一个单词在一个字符串中以所有可能的大小写组合出现的次数

lp0sw83n  于 2023-01-08  发布在  其他
关注(0)|答案(4)|浏览(82)

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"这样的句子中时,它什么也不计数。(抱歉我的英语)

vqlkdk9b

vqlkdk9b1#

您需要制作一个副本,以确保Haystack是可修改的或者根本不修改它。另外,使用函数。strnicmp不是通用的,因为它不检查字符串是否有不同的大小,但在这种情况下不需要。您还可以添加一些参数检查。

char strnicmp(const char *haystack, const char *needle, size_t len)
{
    while(len--)
        if(tolower((unsigned char)*haystack++) != tolower((unsigned char)*needle++))
            return 1;
    return 0;
}

size_t count(const char *haystack, const char *needle, int overlap)
{
    size_t result = 0;
    size_t hsize = strlen(haystack);
    size_t nsize = strlen(needle);

    for(size_t pos = 0; pos + nsize <= hsize;)
    {
        if(!strnicmp(haystack + pos, needle, nsize)) 
        {
            result++;
            pos += overlap ? 1 : nsize;
        } else pos++;
    }
    return result;
}

int main(void)
{
    printf("%zu\n", count("horSeHORse", "hORsE",0));
    printf("%zu\n", count("horSe is", "hORsE",0));
    printf("%zu\n", count("dffd;dfsgd d;lgd;fslg ks;dfl kd;", "hORsE",0));
    printf("%zu\n", count("tatatatatata", "tata",0));
    printf("%zu\n", count("tatatatatata", "tata",1));
}

https://godbolt.org/z/YzaMrKGfz
谢谢你的回答。但是有没有一种方法可以不用tolower和strncmp来完成这个任务
使用函数是一个很好的实践,但是如果你不想使用标准的函数,你可以自己编写;

int mytolower(const int x)
{
    if(x >= 'A' && x <= 'Z') return x - ('A' - 'a');
    return x;
}

char strnicmp(const char *haystack, const char *needle, size_t len)
{
    while(len--)
        if(mytolower(*haystack++) != mytolower(*needle++))
            return 1;
    return 0;
}
km0tfn4u

km0tfn4u2#

在每次检查之前将flag设置为零,而不仅仅是在匹配成功之后。
查找匹配项时,不要向i添加任何内容。添加5会导致超出“horsehorse”中的第二个“h”,因为循环无论如何都会添加1。无需添加任何内容,因为循环在每次迭代中都会向i添加1,添加超过1是错误的,因为对于某些字符串,新的匹配项可能会在当前匹配项结束之前开始。例如,“yoyoyo”包含“yoyo”的两个匹配项。

p4tfgftt

p4tfgftt3#

您可以创建一个for循环来检查单词,并使用tolower将其转换为小写形式,然后可以使用strncmp将单词与horse进行比较

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

int main() {
    char str[100];
    int i,SL,count=0;
    printf("Give string:");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';
    SL=strlen(str);

    for (i = 0; i < SL; i++) {
        str[i] = tolower(str[i]);
    }

    for (i=0; i<SL; i++) {
        if (strncmp(str + i, "horse", 5) == 0) {
        count++;
            i += 4;
        }
    }
    printf("There are %d horse in the string", count);
    return 0;
}

示例输出1:

Give string:horsehorse
There are 2 horse in the string

示例输出2:

Give string:hello i am a hORsE
There are 1 horse in the string
wsewodh2

wsewodh24#

这里有两个问题:首先,请不要发布无法编译的不完整代码。另外,您在这里使用了一些不安全、不推荐使用的函数,这是一个等待发生的意外:你应该把gets改成fgets。
对于程序的逻辑,在if语句外将flag设置为0,并跳过手动递增i

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

#define BUFFSIZE 512

int main() {
  char str[BUFFSIZE];
  int i, SL, count = 0, flag = 0;
  printf("Give string:");
  fgets(str, BUFFSIZE, stdin);
  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;
  }
  printf("There are %d horse in the string", count);
}

相关问题