字串函式(一):strcpy函式、strcat函式和strcmp函式
阿新 • • 發佈:2021-02-09
這三個函式是字串函式中比較經常用到的函式,放在一起解釋是因為它們有一個共同點,就是操作的字串都不限制其長度。
strcpy函式
在官方的解釋中,strcpy函式的作用是拷貝一個字串。
該函式的引數有兩個,一個是目標字串,一個是源字串
返回值是字元指標,也就是目標字串的地址。
舉個例子:
int main()
{
char arr1[] = "***************";
char arr2[] = "abcdef";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
在使用strcpy函式的時候要注意以下幾點:
1.源字串必須以’\0’結尾,否則複製字串的時候沒有終止條件。
2.在拷貝的時候,源字串中的’\0’也會拷貝到目標字串裡。
3.strcpy函式不能判斷拷貝過去的字串的大小,也就是無法判斷會不會越界訪問,因此在利用strcpy函式進行拷貝的時候,目標字串的空間必須足夠放下源字串。
strcat函式
strcat函式的作用是將兩個字串連線起來
函式的引數和strcpy一樣,一個是目標字串,一個是源字串
返回引數是目標字串的地址
舉例:
int main()
{
char arr1[20] = "hikgjjk" ;
char arr2[] = "abcdef";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
要注意的幾點:
1.源字串必須以’\0’為結束標誌,作為終止條件
2.在進行字串連線的操作時,定義字串的陣列的陣列長度就不能為空,必須是能夠容納連線之後新字串的長度。
這裡還涉及到一個問題,就是利用strcat函式能不能自己連線自己?
答案是不行的,這個與地址相同無關,因為連線字串是以’\0’為結束標誌的,但是自己連線自己就會把原來的’\0’覆蓋掉,從而沒有了終止條件。
strcmp函式
strcmp函式的作用是比較兩個字串的大小,比較的方式是用ASCII碼進行比較。
返回值是一個整數。
如果字串1大於字串2,返回大於0的數;
如果字串1等於字串2,返回0;
如果字串1小於字串2,返回小於0的數。
舉例:
int main()
{
char arr1[20] = "hikgjjk";
char arr2[] = "abcdef";
int ret=strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
需要注意的是,在VS2013的編譯器上,strcmp的返回值是1、0、-1,但是換一個編譯器就不一定是這樣的,因此在使用的時候,要先看看在你的編譯器上的返回值是什麼再進行相關功能的編寫。
模擬實現
最後是我將上面的函式進行了模擬實現,大家可以根據這些瞭解其內部是怎樣實現的。
strcpy函式
char* my_strcpy(char* arr1, const char* arr2)//返回值是目標字串的地址,函式引數中源字串不能被改變,否則就會出錯
{
assert(arr1&&arr2);
char* str = arr1;
while (*arr1++ = *arr2++)//如果在迴圈內部進行對兩個字串++的話,在迴圈出來還要再將'\0'賦值給目標字串
//這樣寫會簡化程式碼,先解引用再加加,並且用賦值操作符,*arr1的值就是迴圈條件,直到賦值為‘\0’
{
;
}
return str;
}
strcat函式
char* my_strcat(char* str1, const char* str2)
{
assert(str1&&str2);
char* str = str1;
while (*str1)//如果判斷是*str1++,就會在判斷str1遇到'\0'之後再加加一次,就會將字元後面的'\0'跳過,所以只能輸出cxd
{
str1++;//而把加加放在裡面,在判斷之後就不會在進行加加操作,就會正常
}
while ((*str1++ = *str2++))//然後連結的部分就相當於複製
{
;
}
return str;
}
strcmp函式
int my_strcmp(const char* str1,const char* str2)
{
assert(str1&&str2);
//兩個字串相等則繼續向後比較,如果不相等就返回兩者之差
while (*str1 == *str2&&*str1!='\0'&&*str2!='\0')//迴圈的條件是元素相等,並且兩個字串還沒有到頭
{
str1++;
str2++;
if (*str1 == '\0' && *str2 == '\0')
return 0;
}
return *str1 - *str2;
}