Linux C与C面试中经常提到类似问题,主要考察的是对字符串函数的实现原理和对指针的理解程度,总结一下。
--------------------------------------------------------------------------------------
实现函数:strcpy
char *my_strcpy(char *dest, const char *src)
{
if(dest == NULL || src == NULL) return ;
char *retp = dest;
while(*dest++ = *src++)
;
return retp;
}
int main(int argc,char *argv[])
{
if(argc < 3)
{
printf("Usage: ./a.out deststr srcstr\n");
exit(EXIT_FAILURE);
}
printf("my_strcpy : %s\n", my_strcpy(argv[1], argv[2]));
return 0;
}
---------------------------------------------------------------------------------------
实现函数:strcat
char *my_strcat(char *dest, const char *src)
{
if(dest == NULL || src == NULL) return ;
char *retp = dest;
while(*dest)
dest++;
//while(*dest++);
//错误写法,因为此循环的目的是想找到dest的串尾,若这样写最后一次执行时*dest++='\0',但是此时dest指向'\0'的下一个地址空间
while(*dest++ = *src++)
;
return retp;
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("Usage: ./a.out deststr srcstr\n");
exit(EXIT_FAILURE);
}
printf("my_strcat: %s\n",my_strcat(argv[1], argv[2]));
return 0;
}
-----------------------------------------------------------------------------------------------------
实现函数:strcmp
int my_strcmp(const char *dest, const char *src)
{
if(dest == NULL || src == NULL) return ;
for( ; *dest == *src; dest++,src++)
if(*dest == '\0')
return 0;
return *dest-*src;
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("Usage: ./a.out string1 string2");
exit(EXIT_FAILURE);
}
printf("my_strcmp: %d\n", my_strcmp(argv[1], argv[2]));
return 0;
}
-----------------------------------------------------------------------------------------------------
实现函数:strlen
int my_strlen(char *src)
{
if(src == NULL) return ;
int len = 0;
for(len = 0; src[len] != '\0';len++);
//while(*src++)
// len++;
return len;
}
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("Usage: ./a.out string\n");
exit(EXIT_FAILURE);
}
printf("my_strlen: %d\n", my_strlen(argv[1]));
return 0;
}
--------------------------------------------------------------------------------------------------
实现函数:字符串反转
char *my_inversion(char *src)
{
if(src == NULL) return ;
int len,i,j;
char temp;
for(len = 0; src[len] != '\0';len++);
//不可以将上面写成
// for(; *src != '\0'; src++)
// len++;
//因为这样改变了src的指向,执行完后src指向原字符串结束标志
for(i = 0,j = len-1; i< j; i++,j--) //循环终止条件应为i < j,当有奇数个字符时,位于中间的字符无需在和自身交换
{
temp = src[j];
src[j] = src[i];
src[i] = temp;
}
return src;
}
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("Usage: ./a.out string\n");
exit(EXIT_FAILURE);
}
printf("inversion_str: %s\n", my_inversion(argv[1]));
return 0;
}
--------------------------------------------------------------------------------------------------
int main()
{
char a[] = "12345678";
char b[4] = "abc";
strcpy(a, b);
printf("a[3] = %c\n",a[3]); //输出'\0'(空字符)
printf("a[4] = %c\n",a[4]); //输出5
printf("strcpy(a, b) = %s\n", a); //输出abc
return 0;
}
--------------------------------------------------------------------------------------------------