首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-08-01 
这个C语言中的for循环把我整糊涂了!求大侠赐教!今天我在写代码的时候,写了一个检查删除字符串中字串的程序

这个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就必然是死循环啊。



[解决办法]
引用:
你for循环的条件有问题

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

+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 

你自己看看把

热点排行