这个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循环没有是错误的呢?
...全文
212 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就必然是死循环啊。
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需深入理解各章节内容,特别是关于寄存器配置、时序要等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

70,038

社区成员

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

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