近期由于项目收尾,时间比较充裕,故翻看了大量的面试题,其中多以Linux C+网络知识为主,对以往C的知识盲点也有了进一步认识。
本篇文章的编写侧重于对C语言的指针的理解,总结一下与大家共同温习、巩固。
其中有一道面试题:不利用库函数,实现strcat,下面两种实现方法中哪一个正确的?为什么?
方法一:
char *my_strcat(char *dest,char *src)
{
char *retp = dest;
if(dest == NULL || src == NULL) return;
while(*dest++);
while(*dest++ = *src++) ;
return retp;
}
方法二:
char *my_strcat(char *dest,char *src)
{
char *retp = dest;
if(dest == NULL || src == NULL) return;
while(*dest)
dest++;
while(*dest++ = *src++) ;
return retp;
}
乍一看,好像两种方法的区别并不大,区别为第一个while循环
方法一中第一个while循环为
while(*dest++);
方法二中第一个while循环为
while(*dest)
dest++;
首先需要说明的是方法二是正确的,方法一是错误的。
其实题目比较迷惑人的是对 * 和 ++ 的应用,首先应该明确的是当对字符串的处理中同时应用上述两个符号时,它们的结合顺序为自右向左的
所以 char *sp = "abcd";
*sp++ 与 *++sp是不同的,
*sp++ 的值为‘a’,但此时sp指向的是字符' b';
*++sp 的值为' b',但此时sp指向的是字符' b';
如果读者此时存在疑惑,说明对最基本的 ++ 运算了解的还不是很透彻,
例如 int a = 1;
a++ = 1,此时a = 2;
++a = 2,此时a = 2;
返回题目中来,对上述两个while拆解来看,假如此时dest 指向的字符串“abcd”
即 char *dest = "abcd";
dest++;
printf("%c\n",*dest);//此时输出‘b’,dest也指向字符' b' 的位置
若 char *dest = "abcd";
char ch = *dest++;
printf("%c\n",ch);//此时输出' a ',但是dest指向字符' b' 的位置
所以方法一中的第一个while循环
while(*dest++);
最后一次判断为 *dest++ == ' \0',即为字符串dest 的结束标志' \0' ,则结束循环,但是此时dest指向的‘ \0’的下一个地址空间
所以此时在应用第一个while循环实现字符串连接,实际上将源字符串src接到了目的字符串dest结束符' \0' 的下一个地址空间,两个字符串中中间还夹着一个' \0'
此时返回的rep 仍然指向的是dest串
方法二中的第一个while循环
while(*dest)
dest++;
最后一次判断为dest++ == ‘ \0’,即为字符串dest 的结束标志' \0' ,则结束循环,但是此时dest指向的‘ \0’
所以此时在应用第二个while循环实现字符串连接,实际上将源字符串src接到了目的字符串dest结束符' \0' 位置上,成功实现了字符串连接。