将字符串s1中任何与字符串s2匹配的字符都删掉

     源自《The C Programming Language》P38 pr2-4:

 

     编写函数squeeze(s1, s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。

 

     代码:

     #include #define MAXLINE 100 char s[MAXLINE] = {'/0'}; //用于存储经过squeeze处理后的字符串 char* squeeze(char s1[], char s2[]); int main() { char str[] = "good fuck you see you next time"; //待处理字符串 char charset[] = "koei"; //参考字符集:当中存储所有要被抹去的字符 //char s[MAXLINE] = {'/0'}; //---(1) printf("%s/n", squeeze(str, charset)); return 0; } char* squeeze(char s1[], char s2[]) { int i, j, k; //char s[MAXLINE] = {'/0'}; //---(2) k = 0; for(i = 0; s1[i] != '/0'; ++i) { j = 0; while(s2[j] != '/0' && s1[i] != s2[j]) ++j; if(s2[j] == '/0') s[k++] = s1[i]; } s[k] = '/0'; return s; }

     分析:

 

     1,  关于函数返回值,如果本例中将字符串s定义在函数squeeze中,当执行完return s;后,将会给主函数返回一个char*

          指针,但因为s是squeeze的局部变量,当调用完squeeze后会释放字符串s所占有的空间,故在主函数中打印字符串

          printf("%s/n", squeeze(str, charset));时,只是打印了存放在主函数临时变量中的从squeeze中返回的指针所指向

          的字符串,而这个字符串是个未知字符串,所有会在终端打印出莫名其妙的字符串。

 

     2,  关于函数返回值的解析:例如函数fun1调用了函数fun2,当fun2返回时,会将返回值暂存在寄存器中(一般是eax),

          当程序返回到fun1中执行时,fun1会将返回值从eax中拷贝到自己的栈空间中(一般以临时变量的形式),故而在fun1

          中可以使用fun2的返回值。

          Q: 返回值是怎么会被保存到寄存器里呢?

          A:你用return x语句,编译器会给你自动插入
               mov eax, x
               ret
               的代码,汇编指令ret在这里只有返回调用地址的作用,返回值x存储在eax中。

 

     3,  如果将s定义在main函数中,则在squeeze函数中使用s是非法的,未定义的,使用本例中将s定义为全局变量,这样

          不管是对main还是squeeze函数都是可见,已定义的。

 

 

 

    

你可能感兴趣的:(C)