首先列出這些常用庫函數的函數原型
strcmp
string.h
int strcmp(const char *s1, const char *s2);
負數、零還是正整數,依賴于 s1 所指向的字元串是小于、等于還是大于 s2 所指的字元串。
strncmp
string.h
int strcmp(const char *s1, const char *s2, size_t n);
負整數、零還是正整數,依賴于 s1 所指向的數組的前 n 個字元是小于、等于還是大于s2 所指向的數組的前 n 個字元。如果在其中某個數組中遇到空字元,比較都會停止。
strcpy
string.h
char *strcpy(char * dst, const char * src);
傳回dst指向目的的指針。
函數原型:
char *strcpy(char *dst, const char *src)
{
assert((dst != NULL) && (src != NULL));
char * tmpdst = dst;
if (dst == src) {
return dst;
}
while(((*dst++) = (*src++) != '\0')) {
NULL;
}
return tmpdst;
}
strncpy
string.h
char *strncpy(char * dst, const char * src, size_t n);
傳回dst指向目的的指針。
strcat
string.h
char *strcat(char * dst, const char * src);
strcat() 會将參數 src 字元串複制到參數 dest 所指的字元串尾部;dest 最後的結束字元 NULL 會被覆寫掉,并在連接配接後的字元串的尾部再增加一個 NULL。傳回dest 字元串起始位址.
strncat
string.h
char *strcat(char *dst, const char * src, size_t n);
同上,隻是追加n個字元。
strlen
string.h
size_t strlen(const char * s);
傳回字元串長度,以\0截止(不包括\0)。
sizeof
sizeof(類型說明符);
sizeof 表達式;
傳回的是所占的記憶體空間;
strlen和sizeof的差別,前者計算字元串的真實長度,後者計算說明符所占記憶體空間。
FEP:#include
#include
int main(void) {
char a[20] = "0123456789";
printf("%d %d\n", sizeof(a), strlen(a));
}
結果是20,10
又或者#include
#include
int main(void) {
int a[20] = {};
printf("%d %d\n", sizeof(a), strlen(a));
}
結果是80,0
memcmp
string.h
int memcpy(const char* s1, const char *s2, size_t n);
負整數、零還是正整數依賴于 s1 所指向對象的前 n 個字元是小于、等于還是大于 s2 所指向對象的前 n 個字元。
memset
string.h
void *memset(void *s, int c, size_t n);
指向記憶體塊s的指針。
函數實作:void* memset(void* dst,int val, size_t count)
{
void* ret = dst; //用ret指針來儲存dst的位址
while(count--)
{
*(char*)dst = (char)val;
dst = (char*)dst + 1; //移動一個位元組
}
return ret;
}
memcpy
string.h
void* memcpy(char * dst, const char* src, size_t n);
傳回s1指針。
函數實作:void* memcpy(char * dst, const char* src, size_t n)
{
if ((dst == NULL) && (src == NULL)) {
return -1;
}
unsigned char *dst1 = (unsigned char*) dst;
unsigned char *src1 = (unsigned char*) src;
while(n--) {
*dst1 = *src1;
dst1++;
src1++;
}
return dst1;
}