鱼C论坛

 找回密码
 立即注册
查看: 1188|回复: 5

[已解决]小甲鱼老师的例题看不懂,求助大佬!

[复制链接]
发表于 2019-8-15 20:15:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*定义外部函数delete_string()
形参str为字符串
形参ch为需要删除的字符*/
void delete_string(char str[], char ch)
{
    int i, j;
    for(i=j=0;str[i] !="\0";i++)
    {
         if(str[i] != ch)
         {
              str[j++] = str[i];
         }
     }
         str[j]='\0';
}
功能是从str中删除指定的字符,我不理解str[j++] = str[i];这一句,以下是我的理解,希望各位大佬能够帮助小白找到错误。谢谢大佬。
比如str="asdfgh",ch='f',第一次执行到该句j=1,i=0,str[0]='a',所以执行完该句str[1]='a',这样str="aadfgh",第二次执行j=2,i=1,str[1]='a',所以执行完该句str[2]='a',这样str="aaafgh",一直循环下去,字符串str都会变成a,怎么实现删除功能呢?希望各位大佬帮忙,指出我的错误,谢谢大佬!!
最佳答案
2019-8-15 20:49:09
本帖最后由 迷雾少年 于 2019-8-15 21:46 编辑

我不理解str[j++] = str;这一句
比如str="asdfgh",ch='f',第一次执行到该句j=1,i=0,str[0]='a',所以执行完该句str[1]='a',这样str="aadfgh",第二次执行j=2,i=1,str[1]='a',所以执行完该句str[2]='a',这样str="aaafgh",一直循环

1.
str[j++] = str
等价
str[j] = str
j++;

2.
比如str="asdfgh",ch='f'
str!=f的时候 也就是前面三个字符asd的时候 i 和j都是一样的 一起增加
str的时候 j不再增加 留在str[3] = 'f' 这个位置 但是i增加
str[4]='g' (i==4)的时候 符合str!='f' 此时 str[j] = 'g' 因为j还留在str[3]的位置 所以str前面4个字符变成了asdg 然后到h的时候 str[4] = 'h' j i又增加 然后不符合for 循环 这时候j刚好是5 str[5] = 0作为字符串结尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-15 20:42:44 | 显示全部楼层
你在程序里面测试下,看能不能删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 20:49:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 迷雾少年 于 2019-8-15 21:46 编辑

我不理解str[j++] = str;这一句
比如str="asdfgh",ch='f',第一次执行到该句j=1,i=0,str[0]='a',所以执行完该句str[1]='a',这样str="aadfgh",第二次执行j=2,i=1,str[1]='a',所以执行完该句str[2]='a',这样str="aaafgh",一直循环

1.
str[j++] = str
等价
str[j] = str
j++;

2.
比如str="asdfgh",ch='f'
str!=f的时候 也就是前面三个字符asd的时候 i 和j都是一样的 一起增加
str的时候 j不再增加 留在str[3] = 'f' 这个位置 但是i增加
str[4]='g' (i==4)的时候 符合str!='f' 此时 str[j] = 'g' 因为j还留在str[3]的位置 所以str前面4个字符变成了asdg 然后到h的时候 str[4] = 'h' j i又增加 然后不符合for 循环 这时候j刚好是5 str[5] = 0作为字符串结尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 21:15:13 | 显示全部楼层
楼上说的是对的!简而言之,这个函数的功能就是替换。遇到需要删除的字符,把后一个字符赋值该字符,以达到删除的目的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 21:17:40 | 显示全部楼层
012D1424  mov         eax,dword ptr [str]        
                {
                        str[j++] = str[i];
012D1427  add         eax,dword ptr [j]  
012D142A  mov         ecx,dword ptr [str]  
012D142D  add         ecx,dword ptr [i]  
012D1430  mov         dl,byte ptr [ecx]  
012D1432  mov         byte ptr [eax],dl  
012D1434  mov         eax,dword ptr [j]  
012D1437  add         eax,1  
012D143A  mov         dword ptr [j],eax  
                }


反汇编后,可以看出 str[j++]=str [i],可以看做  str[j]=str[i];j++;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 21:21:43 | 显示全部楼层
楼主,问题解决了,请结帖!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表