重寫字符串操作函數在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;
}