c语言用函数编程实现计算字符串中子串出现的次数。为什么子串是一位数或者出现1的时候输出不正确,求修改

#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;
}

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;
}追问

我试了,你把函数编译一下,当子串长度为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;
}
};
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-13
char 类型怎么可以用等号if(str[i+j]==sub[j]) 来进行比较呢。应该用strcmp吧

c语言用函数编程实现计算字符串中子串出现的次数。为什么子串是一位数...
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...

c语言统计字符串中每个字符出现的次数
int len=strlen(s),n=0;\/\/子串的长度和计数器 for(;*ptr;ptr++)\/\/循环整个串 { if(ptr2-ptr<len)\/\/如果一开始子串就大于src,则退出 break;for(prev=ptr;*prev==*p;prev++,p++)\/\/寻找第一个相等的位置,然后从此位置开始匹配子串 { if(*(p+1)==0||*(p+1)==10)\/\/如果已经到了...

c语言编程【编写一个 C 函数,在一个字符串中找到可能的最长的子字符串...
这个函数根本就不对,因为数组不能自己动态增长。第三,你在程序中已经限定了数组的长度是100,那么最好就直接使用x[100]。字符串是以'\\0'结尾的,所以,只要读到'\\0'就认为字符串结束。所以不需要动态数组。

C语言编程:统计字符串中各字母出现的次数
char*ptr=src,*p=s;\/\/定义两个指针 char*ptr2=src+strlen(src),*prev=NULL;\/\/ptr2为src的末位置指针 int len=strlen(s),n=0;\/\/子串的长度和计数器 for(;*ptr;ptr++)\/\/循环整个串 n++;\/\/自增 p=s;\/\/重新指向子串 break;\/\/退出 char a[81],b[81];\/\/定义两个字符数组 fgets(b...

c#统计一个字符在字符串出现次数的函数
C#中没有统计子字符串出现次数的函数,那么如何在C#求出字符串中某字符的出现次数,比如求“ADSFGEHERGASDF”中“A”出现的次数。首先想到的方法当然是从头遍历字符串并统计:c1 = 0;for (int i = 0; i < str.Length; i++){ if (str[i] == 'A'){ c1++;} } 第二种方法也很容易想到...

C语言编程:编写函数,统计字符串中字母、数字、空格和其他字符的个数...
include<stdio.h> void TongJi(char s[]){ int ZiMu=0,KongGe=0,ShuZi=0,QiTa=0,i;for(i=0;s!='\\0';i++){ if(s==32)KongGe++;else if((s>=48)&&(s<=57))ShuZi++;else if(((s>=97)&&(s<=122))||((s>=65)&&(s<=90)))ZiMu++;else QiTa++;} printf("空格:...

...*str,char *sub_str),统计字符串中子串的出现次数,如在字符串“1010...
;printf("input a string:\\n");scanf("%s",string);printf("input the substring:\\n");scanf("%s",sub_str);char *str1,*str2;str1 = string;str2 = sub_str;printf("count = %d",count_substr(str1,str2));}int count_substr(char *str,char *sub_str){int count = 0;...

C语言:编程统计字符串s在字符串str中出现的次数
以下是 C 语言实现统计字符串 s 在字符串 str 中出现的次数的程序:```c include <stdio.h> include <string.h> \/\/ 统计字符串 s 在字符串 str 中出现的次数 int countSubstring(char str[], char s[]) { int n = strlen(str); \/\/ 获取字符串 str 的长度 int m = strlen(s); ...

如何统计字符串中某个字符出现的次数?
思路:从键盘分别输入字符串和要统计的字符,然后对此字符串从头开始逐个与所统计的字符比较。如相同,则让计数器加1,知道字符串整体比较结束为止,计数器中就是需统计的字符的个数,具体代码设计如下:函数应用 1、连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn.例:concat(‘11’,'aa’...

请问c语言当中,如何统计数字各自出现的次数
实现代码:include <stdio.h> int main() { int num = 0, i = 0;printf("请输入一个整数:");scanf("%d", &num);int array[10] = {};while(num) { array[num % 10]++; \/\/让数组下标代表所判断的数字 num \/= 10;} for (i = 0; i < 10; i++) { if (array[i] !

相似回答