首先列出这些常用库函数的函数原型
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 <stdio.h>
#include <stdlib.h>
int main(void) {
char a[20] = "0123456789";
printf("%d %d\n", sizeof(a), strlen(a));
}
结果是20,10
又或者
#include <stdio.h>
#include <stdlib.h>
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;
}