这个C语言中的for循环把我整糊涂了!求大侠赐教!
今天我在写代码的时候,写了一个检查删除字符串中字串的程序,只要是字符串中有和子字符串相同的部分就删掉,以下是代码:
#include <stdio.h>
int main(void)
{
char* sub = "abrcchadbcuhiaaabc";//字符串
char* substr="abc";//子字符串
int num = del_substr(sub,substr);//删除相同的部分
printf("\n出现的次数:%d\n",num);
return 0;
}
int del_substr(char* sub,char*substr)
{
int n,m;//分别代表的是sub substr中字符的个数
char sub1[10000]={' '};
int count=0;//出现的次数
int p=0;//计数
n = Letter_Num(sub);
m = Letter_Num(substr);
//将字符串sub拷贝到字符数组中
for(int i=0;i<n;i++)
{
sub1[i]=sub[i];
}
for(int j=0;j<n;j++)
{
if(sub1[j]==substr[0])
if(compare(sub1,substr,j,m,n))//找到了一个字串
{
count++;
new_str(sub1,m,j,n);
n=n-m;
j=j-1;
}
}
printf("最终得到的字符串是:");
for(int t =0;t<n;t++)//这里可以通过在数组的最后一位加上\0构成字符串
printf("%c",sub1[t]);
return count;
}
//得到字符串的长度
int Letter_Num(char const* str)
{
int i = 0;
while(str[i]!='\0')
i++;
return i;//注意得到的个数是从1开始的
}
//比较是不是包含子串
int compare(char* sub,char* substr,int j,int m,int n)
{
int p=0;
if(j+m>n)
return 0;
for(j;j<j+m-1;j++)
{
if(sub[j] == substr[p])
{
p++;
if(p==m)
{
return 1;
}
}
}
return 0;
}
//重构新的字符数组
void new_str(char* sub1,int m,int j,int n)
{
int ptr=j;
for(j=j+m;j<n;j++)
{
sub1[ptr]=sub1[j];
ptr++;
}
return;
}
问题出在了compare函数中,程序总是有错误,后来发现错误出在了for循环中,我很奇怪,这个for循环怎么会没有判断条件是否成立,就一直在执行呢?
后来我给compare中的if语句加上else后程序就没有错误了,我很奇怪,为什么for循环没有是错误的呢?
[解决办法]
你for循环的条件有问题
for(j;j<j+m-1;j++)
//j<j+m-1这个条件是要闹哪样啊,只要m>1就必然是死循环啊。
5 int del_substr(char *src, const char *substr)
6 {
7 int i = 0, j = 0;
8 int substr_len = strlen(substr);
9 int src_len = strlen(src);
10 if (src_len < substr_len)
11 {
12 printf(" substr is longer than src\n");
13 return -1;
14 }
15
16 for(j = 0 ; j < src_len && src[j] != '\0'; j++)
17 {
18
19 if( strncmp(&src[j], substr, substr_len) == 0 )
20 {
21 memset( &src[j] , 0, substr_len);
22
23 strncpy( &src[j] , &src[j+substr_len], (src_len - j - substr_len));
24 memset(&src[src_len - substr_len], 0, substr_len);
25 i++;
26 }
27
28 }
29
30 return i;
31 }
32 int main (void )
33 {
34
35 char src[] = "bookshoolbookstudentarebook";//字符串
36 const char *substr="book";//子字符串
37 printf(" ##### src = %s \n", src);
38 int num = del_substr(src, substr);
39
40 printf(" ##### num = %d \n", num);
41 printf(" ##### src = %s \n", src);
42 return 0;
43 }
##### src = bookshoolbookstudentarebook
##### src = shoolbookstudentarebook
##### i = 1
##### src = shoolstudentarebook
##### i = 2
##### src = shoolstudentare
##### i = 3
##### num = 3
##### src = shoolstudentare