字符函数与字符串函数

  • 1.strlen
size_t strlen ( const char * str );
注意事项:
字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
'\0' )
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t ,是无符号的( 易错 )。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
size_t mystrlen(const char* t)
{
int count=0;
assert(t);
while (*t)
{
count++;
t++;
}
return count;
}
int main()
{
char a[10] = { "ADFG" };
printf("%d", mystrlen(a));
return 0;

}
  • 2 strcpy
char* strcpy ( char * destination , const char * source );
注意事项:
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
char* mystrcpy( char* a, const char* b)
{
char* ret = a;
assert(a);
assert(b);
while (*a++=*b++)
{
;
}
*a='\0';
return ret;
}
int main()
{
char a[10] = { "ADFG" };
char b[10] = { "dsvgbbgf" };
mystrcpy(a,b);
printf("%s", a);
return 0;
}
  • 3 strcat
char * strcat ( char * destination , const char * source );
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
char* mystrcat( char* a,const char* b)
{
char* ret = a;
assert(a);
assert(b);
while (*a)
{
a++;
]
while (*a++ = *b++)
{
;
}
return ret;
}
int main()
{
char a[20] = { "ADFG" };
char b[10] = { "dsvgbbgf" };
mystrcat(a,b);
printf("%s", a);
return 0;

}
  • 4 strcmp
int strcmp ( const char * str1 , const char * str2 );
第一个字符串大于第二个字符串,则返回大于 0 的数字
第一个字符串等于第二个字符串,则返回 0
第一个字符串小于第二个字符串,则返回小于 0 的数字

#include<stdio.h>
#include<assert.h>
int mystrcmp(const char* a,const char* b)

{

assert(a && b);
while (*a == *b )
{

if (*a == '\0')
return 0;
a++;
b++;
}
return (*a - *b);
}
int main()
{
char arr1[10] = "SADF";
char arr2[10] = "SADF";
mystrcmp(arr1, arr2);
if (mystrcmp(arr1, arr2) == 0)
{
printf("=");
}
if (mystrcmp(arr1, arr2) < 0)
{
printf("<");
}
if (mystrcmp(arr1, arr2) > 0)
{
printf(">");
}
return 0;
}

​
  • strncpy
char * strncpy ( char * destination , const char * source , size_t num );
拷贝 num 个字符从源字符串到目标空间。
如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个。
  • strncat
char * strncat ( char * destination , const char * source , size_t num );
将num个字符追加到上一个字符串后面。
如果字符数量小于num,这只1在末尾加一个斜杠零。
  • 7 strncmp
int strncmp ( const char * str1 , const char * str2 , size_t num );
比较到出现另个字符不一样或者一个字符串结束或者
num 个字符全部比较完。
  • 8 strstr
char * strstr ( const char * str1 , const char * str2 );
返回一个字符串中出现子串第一个字符的地址
#include<stdio.h>
#include<assert.h>
char* mystrstr(void* a, void* b)
{
assert(a && b);
(char*)a;
(char*)b;
char* p = a;
char* m = b;
while (1)
{
a = p;
b = m;
while (*(char*)a == *(char*)b&&*(char*)a!='\0')
{
(char*)a= (char*)a+1;
(char*)b= (char*)b + 1;
}
if (*(char*)b == '\0')
return p;
if (*(char*)a == '\0')
return NULL;
p++;
}
}
int main()
{
char arr1[10] = "12345";
char arr2[10] = "234";
mystrstr(arr1,arr2);
if (mystrstr(arr1, arr2) != NULL)
printf("%s", mystrstr(arr1, arr2));
if (mystrstr(arr1, arr2) == NULL)
printf("NULL");
return 0;
}
  • 9 strtok
char * strtok ( char * str , const char * sep );
sep 参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标
记。
strtok 函数找到 str 中的下一个标记,并将其用
\0 结尾,返回一个指向这个标记的指针。(注:
strtok 函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在字符串
中的位置。
strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
  • 10 strerror
char * strerror ( int errnum );
返回错误码,所对应的错误信息
  • 11 memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果 source destination 有任何的重叠,复制的结果都是未定义的。
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
(char*)src = (char*)src + 1;
(char*)dest = (char*)dest + 1;
}
*(char*)dest = '\0';
return ret;
}
int main()
{
char arr1[10] = "ASCVG";
char arr2[10] ;
my_memcpy(arr2, arr1,5);
printf("%s ", arr2);
return 0;
}
  • 12 memmove

 void * memmove ( void * destination, const void * source, size_t num );

memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
#include<stdio.h>

#include<assert.h>



void mymemmove(void* a,const void* b,size_t num)

{

assert(a && b);

while (num--)

{

*((char*)a + num + 1) = *((char*)b + num + 1);



}

*((char*)a + num + 1) = *((char*)b + num + 1);



return 0;

}

int main()

{

int arr[10] = { 1,2,3,4,5,6,7,8,90,10 };

mymemmove(arr + 2, arr, 20);

printf("%d", *(arr + 3))

;

return 0;

}
  • 13 memcmp
int memcmp ( const void * ptr1 ,
const void * ptr2 ,
size_t num );
比较从 ptr1 ptr2 指针开始的 num 个字节
第一个字符串大于第二个字符串,则返回大于 0 的数字
第一个字符串等于第二个字符串,则返回 0
第一个字符串小于第二个字符串,则返回小于 0 的数字
  • 14 memset

void *memset( void *dest, int c, size_t count );

把从dest地址开始的count个·字符置为c或者以c为ASCII的字符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南种北李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值