这个C语言中的for循环把我整糊涂了!求大侠赐教!

心若磐石 2013-07-23 09:33:53
今天我在写代码的时候,写了一个检查删除字符串中字串的程序,只要是字符串中有和子字符串相同的部分就删掉,以下是代码:


#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循环没有是错误的呢?
...全文
165 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
missheaven2011 2013-07-24
  • 打赏
  • 举报
回复
引用 1 楼 dnvycumt3 的回复:
你for循环的条件有问题

for(j;j<j+m-1;j++)
//j<j+m-1这个条件是要闹哪样啊,只要m>1就必然是死循环啊。
+1
max_min_ 2013-07-24
  • 打赏
  • 举报
回复
上面那个有点下bug 改成这个
 21 
 22 int del_substr_func(char *src, const char* substr)
 23 {
 24     int i = 0, times = 0;
 25     int src_len    = strlen(src);
 26     int substr_len = strlen(substr);
 27 
 28     while( src[i] )
 29     {
 30         if( strncmp(&src[i], substr, substr_len) == 0)
 31         {
 32 //          memset( &src[i], 0, substr_len);
 33 
 34             strncpy( &src[i], (const char *) &src[i + substr_len],  (src_len - i - substr_len ));
 35             
 36             memset( &src[src_len - substr_len ] , 0, substr_len ); // 必须要用这个操作,否则后面如果出现字串的话,在拷贝字串串,一直会存在字串
 37 
 38             printf("\n ##### Deleting   arrSrcstr: %s\n", src);
 39             
 40             times ++;
 41         }
 42         
 43         i++;
 44     }
 45 
 46     return times;
 47 }
 48 int main (void )
 49 {
 50 //  char arrSrcstr[] = "AAABBBBBCCCAABBBCCCAABBAAABBDDDDAA";
 51 //  const char *substr = "AA";
 52     char arrSrcstr[] = "boyhelloboysIboybloveboyyouboheihieboysboy";
 53     const char *substr = "boy";
 54     
 55     printf("\n ##### Before del arrSrcstr: %s\n", arrSrcstr);
 56     
 57     int RetVal = del_substr_func( arrSrcstr, substr);
 58     
 59     printf("\n ##### After  del arrSrcstr: %s\n", arrSrcstr);
 60     printf("\n ##### del times :%d\n", RetVal);
 61     
 62     return 0;
 63 }   
结果
 ##### Before del arrSrcstr: boyhelloboysIboybloveboyyouboheihieboysboy

 ##### Deleting   arrSrcstr: helloboysIboybloveboyyouboheihieboysboy

 ##### Deleting   arrSrcstr: hellosIboybloveboyyouboheihieboysboy

 ##### Deleting   arrSrcstr: hellosIbloveboyyouboheihieboysboy

 ##### Deleting   arrSrcstr: hellosIbloveyouboheihieboysboy

 ##### Deleting   arrSrcstr: hellosIbloveyouboheihiesboy

 ##### Deleting   arrSrcstr: hellosIbloveyouboheihies

 ##### After  del arrSrcstr: hellosIbloveyouboheihies

 ##### del times :6
心若磐石 2013-07-24
  • 打赏
  • 举报
回复
谢谢楼上的各位 昨晚确实晕了 这么点小错误没看出来 实在是太差劲了 谢谢各位!
max_min_ 2013-07-24
  • 打赏
  • 举报
回复
  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 
你自己看看把
酱油小龟 2013-07-23
  • 打赏
  • 举报
回复
你for循环的条件有问题

for(j;j<j+m-1;j++)
//j<j+m-1这个条件是要闹哪样啊,只要m>1就必然是死循环啊。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧