Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更优化的解决方案是查找字符串中的子字符串数。使用C_C_String_Substring - Fatal编程技术网

更优化的解决方案是查找字符串中的子字符串数。使用C

更优化的解决方案是查找字符串中的子字符串数。使用C,c,string,substring,C,String,Substring,所以,我有一个任务,在给定的字符串中找到子字符串的数量。我无法使用任何C库来执行此任务。stringExist只能有2个字符串作为参数 我的解决方案是可行的,但我觉得应该有一种更优雅的方式来完成这项任务。 解决方案1:事实证明,它不能正常工作 #包括 int stringExist(char string[],char s2[]); 内部主(空){ 字符字符串[]=“strstrastrst”; 字符s2[]=“str”; printf(“最终结果:%i\n”,stringExist(strin

所以,我有一个任务,在给定的字符串中找到子字符串的数量。我无法使用任何C库来执行此任务。stringExist只能有2个字符串作为参数

我的解决方案是可行的,但我觉得应该有一种更优雅的方式来完成这项任务。 解决方案1:事实证明,它不能正常工作

#包括
int stringExist(char string[],char s2[]);
内部主(空){
字符字符串[]=“strstrastrst”;
字符s2[]=“str”;
printf(“最终结果:%i\n”,stringExist(string,s2));
返回0;
}
int stringExist(字符字符串[],字符s2[]){
/*我知道我可以在一行中初始化所有这些值*/
整数计数=0;
int size=0;
int i=0;
内部温度=0;
int结果=0;
而(s2[size]!='\0'){
大小++;
}
while(字符串[i]!='\0')
{        
if(字符串[i]==s2[0])
{
printf(“找到第一个匹配项\n”);
计数=0;
而((临时=(字符串[i]==s2[count])!=0)
{            
计数++;
如果(大小==计数){
printf(“匹配\n”);
结果++;
打破
}
i++;
}
}
i++;
}
返回结果;
} 
解决方案编号2:

到目前为止,没有发现任何错误

做了一点不同的字符串遍历,现在我不在compare chars循环中增加I

#include <stdio.h>

int stringExist(char string[], char s2[]);

int main(void){
    char string[] = "bobobobojkhhkjjkhbo;klkl;bobo";
    char s2[] = "bobo";
    printf("Final result: %i\n",stringExist(string,s2));
    return 0;
}

int stringExist(char string[], char s2[]){
    int count = 0;
    int size = 0;
    int i = 0;
    int c = 0;
    int temp = 0;
    int result = 0;

    while(s2[size]!='\0'){      
        size++;
    }
    for(i=0;string[i]!='\0';i++){
        if(string[i]==s2[0])
        {
            printf("Found first occurence at %i\n",i);
            count = 0;
            c = i;              

                while((temp=(string[c]==s2[count]))!=0)
                {       
                    printf("Count %i, I %i, current char: %c\n",count, c,string[c]);
                    count++;                    
                    if(size==count){
                        printf("Match\n");
                        result++;                   
                        break;                  
                    }
                    c++;
                }

        }
    }


    return result;
}
#包括
int stringExist(char string[],char s2[]);
内部主(空){
字符字符串[]=“bojkhkjkhbo;klkl;bobo”;
字符s2[]=“bobo”;
printf(“最终结果:%i\n”,stringExist(string,s2));
返回0;
}
int stringExist(字符字符串[],字符s2[]){
整数计数=0;
int size=0;
int i=0;
int c=0;
内部温度=0;
int结果=0;
而(s2[size]!='\0'){
大小++;
}
对于(i=0;字符串[i]!='\0';i++){
if(字符串[i]==s2[0])
{
printf(“发现第一次出现在%i\n”,i);
计数=0;
c=i;
而((临时=(字符串[c]==s2[count])!=0)
{       
printf(“计数%i,i%i,当前字符:%c\n”,计数,c,字符串[c]);
计数++;
如果(大小==计数){
printf(“匹配\n”);
结果++;
打破
}
C++;
}
}
}
返回结果;
}
谢谢你的建议,
维塔利

这感觉像是一个家庭作业问题——在这种情况下,你肯定应该自己做。但是,您可能需要检查一些我认为您的代码现在无法正确处理的问题,如下所示:

“bobo”在字符串“bobo”中出现多少次。它应该是两次,我认为您的代码将只计算一次

祝你好运,
马克。

好吧,从算法的角度来看,这还不错。您可以进行优化,但我认为这不是重点(看起来像是家庭作业!)

您可能有一个小问题:在像“哈哈哈”这样的字符串中,“哈哈哈”应该被检测多少次?两次?三次?您的代码将看到它两次


从风格的角度来看,当然还有改进的余地,但随着时间的推移,您将从编码和阅读他人的代码=)中学到这一点。坚持下去

我建议以允许使用库函数的方式编写。然后返回并编写您所使用的库函数的您自己的版本。虽然编写高度优化的string.h函数可能很困难,但用C编写大多数函数的合适版本却相当容易

使用子例程(函数)执行此问题的子任务将有助于保持代码清晰,并避免某些类型的问题,例如,如果调用:

x = stringExist("aaaaa", "aa");
在“aaaaa”中有4个字符串“aa”,但我认为您的函数不会找到所有这些字符串。这样做的原因是,当您在较大的字符串中搜索第二个发生的事件时,您对字符串的开头和字符串内使用了相同的索引。事实上,看起来你会得到错误的结果:

x = stringExist("tBatBath", "tBath");
当然,除非我误解了函数的作用

如果您要编写自己版本的字符串前缀比较函数(基本上是
memcmp
strncmp
),那么您就可以将匹配字符串长度的工作与深入查看字符串分离开来,并且可能不会犯这样的错误

如果您担心挤压函数的效率和调用函数的开销,请不要这样做。首先,没那么糟。其次,只需将它们声明为
inline
static inline
,如果在编译时启用了优化,编译器很可能会生成与不使用多个函数时一样好的代码。

击败它:(也适用于额外条件)


每次在s1中找到s2的第一个字符时,这将打印“首次出现”。您的函数不工作。请尝试“char string[]=”strstrasdstrstrstrstrstr“;”答案应该是4。谢谢Dingo,我也发现了这个问题=(…我想我在这里使用了错误的方法…呸,我没有主意。是的,这是一种家庭作业,对我来说。你的测试用例刚刚打断了我的大脑。谢谢你显示了失败点,我会进一步研究=)。哦,对不起,C系统管理没有那么先进=)好的,我明白了,这是一个令人印象深刻的解决方案。你是人类吗
x = stringExist("tBatBath", "tBath");
int stringExist( char *string, char *sub )
{
  int count = 0;

  while( *string )
  {
    char *a = string, *b = sub;
    while( *a && *a == *b ) {a++;b++;}
    count += !*b;
    ++string;
  }

  return count;
}