c语言用函数编程实现计算字符串中子串出现的次数。为什么子串是一位数或者出现1的时候输出不正确,求修改
#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN32767intFindString(char*...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 32767
int FindString(char *str,char *sub);
int main()
{
int p;
char s1[N];
char s2[N];
char *str=s1;
char *sub=s2;
gets(str);
getchar();
gets(sub);
p=FindString(str,sub);
printf("%d",p);
return 0;
}
int FindString(char *str,char *sub)
{
int m,n,i,j,count=0,wow=0;
m=strlen(str);
n=strlen(sub);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(str[i+j]==sub[j])
wow++;
}
if(wow==n)
count++;
wow=0;
}
return count;
} 展开
#include <stdlib.h>
#include <string.h>
#define N 32767
int FindString(char *str,char *sub);
int main()
{
int p;
char s1[N];
char s2[N];
char *str=s1;
char *sub=s2;
gets(str);
getchar();
gets(sub);
p=FindString(str,sub);
printf("%d",p);
return 0;
}
int FindString(char *str,char *sub)
{
int m,n,i,j,count=0,wow=0;
m=strlen(str);
n=strlen(sub);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(str[i+j]==sub[j])
wow++;
}
if(wow==n)
count++;
wow=0;
}
return count;
} 展开
展开全部
if(str[i+j]==sub[j]) 当i+j>=m的时候指针溢出了。修改函数如下:
int FindString(char *str,char *sub)
{
int m,n,i,j,count=0,wow=0;
m=strlen(str);
n=strlen(sub);
/*加上长度检查*/
if(m<n) return 0;
/*for(i=0;i<m;i++)*/
/*改为以下语句*/
for(i=0;i<m-n+1;i++)
{
for(j=0;j<n;j++)
{
if(str[i+j]==sub[j])
wow++;
}
if(wow==n)
count++;
wow=0;
}
return count;
}
int FindString(char *str,char *sub)
{
int m,n,i,j,count=0,wow=0;
m=strlen(str);
n=strlen(sub);
/*加上长度检查*/
if(m<n) return 0;
/*for(i=0;i<m;i++)*/
/*改为以下语句*/
for(i=0;i<m-n+1;i++)
{
for(j=0;j<n;j++)
{
if(str[i+j]==sub[j])
wow++;
}
if(wow==n)
count++;
wow=0;
}
return count;
}
追问
我试了,你把函数编译一下,当子串长度为1的时候就不对。。。
追答
没啥问题呀,这是等效的C++UnitTest案例(运行于vs2012)
#include "stdafx.h"
#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest2
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
Assert::AreEqual(FindString("12345", "1"), 1);
Assert::AreEqual(FindString("12345", "8"), 0);
Assert::AreEqual(FindString("12345", "5"), 1);
Assert::AreEqual(FindString("12345", "123"), 1);
Assert::AreEqual(FindString("12345", "234"), 1);
Assert::AreEqual(FindString("12345", "345"), 1);
Assert::AreEqual(FindString("12345", "456"), 0);
Assert::AreEqual(FindString("12345", "123456"), 0);
}
int FindString(char* str, char* sub)
{
int m, n, i, j, count = 0, wow = 0;
m = strlen(str);
n = strlen(sub);
/*加上长度检查*/
if (m < n) return 0;
/*for(i=0;i<m;i++)*/
/*改为以下语句*/
for (i = 0; i < m - n + 1; i++)
{
for (j = 0; j < n; j++)
{
if (str[i + j] == sub[j])
wow++;
}
if (wow == n)
count++;
wow = 0;
}
return count;
}
};
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询