重写字符串操作函数在C语言的笔试中也是比较常见的,以下几个函数是我在笔试中遇到过的。
//字符串拷贝函数
char *my_strcpy(char *dest,const char *src){
assert((dest != NULL) && (src != NULL));
char *temp_dest = dest;
while( (*dest++ = *src++)!= '\0');
return temp_dest;
//这里的temp_dest作用在于保存目的字符串头指针,
//其作为函数的返回值,必须得有。
}
//字符串拷贝函数(拷贝n个字符)
char *my_strncpy(char *dest, const char *src, int n){
assert((dest != NULL) && (src != NULL));
char *temp_dest = dest;
while(n--){
*dest++ = *src++;
}
return temp_dest;
}
//字符串反转函数
char *my_strrev(char *str){
assert(str != NULL);
char *st, *et;
st = et = str;
while(*++et);//st指向字符串末尾
for(--et; st < et; ++st,--et){
*st = *st ^ *et;
*et = *st ^ *et;
*st = *st ^ *et;
//关于两个变量进行无中间变量的交换,在笔试题中也经常遇到 ,顺便就写在这里了
}
return str;
}
//字符串比较函数
int my_strcmp(char *str1, char *str2){
while(*str1 == *str2){
if((*str1=='\0')&&(*str2=='\0'))
return 0;
str1++;
str2++;
}
return ( *str1 < *str2 )? -1 : 1;
}
int main(void){
char p1[] = " 123456789999999999 ";
//char ppp[100]={}; //注释掉这一句后,在执行my_strcpy后p1会发生意想不到的变化。
//C语言不检查数组边界就可以在这体现出来,所以要千万注意。
char p2[] = "abcdefg ";
char p3[] = "abcdefg ";
char *ptr1,*ptr2;
ptr1 = p1;
ptr2 = p2;
printf(p1);
printf("\n");
printf(p2);
printf("\n");
//ptr2 = my_strcpy(p2,p1);
//my_strncpy(p2, p1, 4);
//my_strrev(p1);
printf("str1 - str2 : %d\n",my_strcmp(p2, p3));
return 0;
}