凉桔 发表于 2019-8-15 20:15:51

小甲鱼老师的例题看不懂,求助大佬!

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

cplus 发表于 2019-8-15 20:42:44

你在程序里面测试下,看能不能删除

迷雾少年 发表于 2019-8-15 20:49:09

本帖最后由 迷雾少年 于 2019-8-15 21:46 编辑

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

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

2.
比如str="asdfgh",ch='f'
当str!=f的时候 也就是前面三个字符asd的时候 i 和j都是一样的 一起增加
到str的时候 j不再增加 留在str = 'f' 这个位置 但是i增加
到str='g' (i==4)的时候 符合str!='f' 此时 str = 'g' 因为j还留在str的位置 所以str前面4个字符变成了asdg 然后到h的时候 str = 'h' j i又增加 然后不符合for 循环 这时候j刚好是5 str = 0作为字符串结尾

风羽.Song 发表于 2019-8-15 21:15:13

楼上说的是对的!简而言之,这个函数的功能就是替换。遇到需要删除的字符,把后一个字符赋值该字符,以达到删除的目的。

兰梦书生 发表于 2019-8-15 21:17:40

012D1424mov         eax,dword ptr       
                {
                        str = str;
012D1427add         eax,dword ptr
012D142Amov         ecx,dword ptr
012D142Dadd         ecx,dword ptr
012D1430mov         dl,byte ptr
012D1432mov         byte ptr ,dl
012D1434mov         eax,dword ptr
012D1437add         eax,1
012D143Amov         dword ptr ,eax
                }


反汇编后,可以看出 str=str ,可以看做str=str;j++;

cplus 发表于 2019-8-15 21:21:43

楼主,问题解决了,请结帖!
页: [1]
查看完整版本: 小甲鱼老师的例题看不懂,求助大佬!