strcpy
拷贝源字符串到子字符串,包括‘\0’。
代码实现:
char* strcpy(char* dst,const char* src)
{
assert(src);
char* ret = dst;
while (*src)
{
*dst = *src;
src++;
dst++;
}
*dst = '\0';
return ret;
}
2.strncpy:
strncpy与strcpy之间差别在于,strcpy将源字符串全部拷贝到新的字符串中,而strncpy拷贝长度由自己确定。
代码实现:
char* strncpy(char* dst, const char* src, int count)
{
assert(dst);
assert(src);
char* ret = dst;
while (count--)
{
*dst = *src;
dst++;
src++;
}
*dst = '\0';
return ret;
}
3.strcat:
strcat作用是链接字符串,即:
str1: hel str2:lo 则链接后为hello。
代码实现:
char* strcat(char* dst, char* src)
{
assert(dst);
assert(src);
char* ret = src;
while (*src)
{
src++;
}
while (*dst)
{
*src = *dst;
dst++;
src++;
}
*dst = '\0';
return ret;
}
4.strcmp:
strcmp用来比较字符串长度。
对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一个正整数
(3)字符串1<字符串2,返回一个负整数。
代码实现:
int strcmp(const char* dst, const char* src)
{
assert(dst);
assert(src);
while (*src&&*dst)
{
if (*src == *dst)
{
src++;
dst++;
}
else
{
return *src - *dst - '\0';
}
}
return *src - *dst - '\0';
}
5.strncmp:
与strcmp区别在于:strcmp是针对整个字符串而言,而strncmp针对指定长度。
但是要注意,如果count比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。
代码实现:
int strncmp(const char* dst, const char* src,size_t count)
{
assert(dst);
assert(src);
while (count--&&*src&&*dst)
{
if (*src == *dst)
{
src++;
dst++;
}
else
{
return *src - *dst - '\0';
}
}
return *src - *dst - '\0';
}
6.strstr:
寻找子字符串,我们在源字符串设置一个指针,用做来当此时确实满足是子串标志原串的位置,如下面的p。而s1,s2分别用作来遍历。
代码实现:
char* strstr(const char* dst, const char* src)
{
assert(dst);
assert(src);
char* s1 = dst;
char* p = src;
char* s2 = p;
while (*s2)
{
s1 = dst;
s2 = p;
while (*s2 && *s1)
{
if (*s2 == *s1)
{
s1++;
s2++;
}
else
{
p++;
break;
}
}
if (*s1 == '\0')
{
return p;
}
}
return NULL;
}
7.memcpy:
strcpy完成字符串的拷贝,而对于非字符串类的,却要用memcpy完成内存拷贝。
代码实现:
void* memcpy(void* dst, const void* src, size_t count)
{
assert(dst);
assert(src);
char* dst_ = (char*)dst;
char* src_ = (char*)src;
while (count--)
{
*dst_++ = *src_++;
}
//即使此时count不为0,但是当我们将原数拷贝到新的数据结束,那也要结束程序。
*dst_ = '\0';//必须加上结束标志,否则会乱码
return dst;
}
8.memmove:
memmove在于它可解决内存重叠问题。
如:将1,2,3,4,5,6,7,8中的1,2,3,4移动到3,4,5,6位置。那么则仍然按照memcpy则会,将1移动到3处,2移动到4处,再准备移动3时发现此时的3已经由于被移动到此处的1覆盖而丢失。4同理。这就是memmove的优势所在。我们分情况即可解决。
代码实现:
void memmove(void* dst, const void* src, size_t count)
{
assert(dst);
assert(src);
char* dst_ = (char*)dst;
char* src_ = (char*)src;
if (dst_ > src_&&dst < dst_ + count)
{
while (count--)
{
*(dst_+count) = *(src_+count);
dst_++;
src_++;
}
}
else
{
while (count--)
{
*dst_ = *src_;
dst_++;
src_++;
}
}
*dst_ = '\0';
return dst;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。