
目录
前言
一、strlen
二、strcpy
三、strcat
四、strcmp
五、strncpy
六、strncat
七、strncmp
八、strstr
九、strtok
十、strerror
十一、memcpy
十二、memmove
十三、memcmp
十四、字符分类函数:
总结
前言
本章节为字符串进阶内容,包含了常见字符函数和字符串函数,易错点都已经标出来了。
一、strlen
size_t strlen( const char* str)
功能:计算字符串长度,不包含'‘输入:字符串地址返回值:函数返回值一定是size_t ,是无符号的注意:sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个 *** 作符,strlen()是函数模拟实现
int my_strlen(const char* str)
{
assert(str != NULL);
int consut = 0;
while (*str != '')
{
consut++;
str++;
}
return consut;
}
二、strcpy
char* strcpy(char* dest,char* src)
功能:将src拷贝到dest中输入:目标字符串地址,源字符串地址返回值:dest的起始地址注意:确保目标地址空间足够大,源字符串必须''结尾,会将源字符中的''拷贝到目标字符串中模拟实现
char* my_strcpy(char* str, const char* sub)
{
assert(*str != NULL && *sub != NULL);
char* ret = str;
while (*str = *sub)
{
str++;
sub++;
}
return ret;
}
三、strcat
char* strcat(char* dest,const char* src)
功能:将src拼接到dest之后输入:目标字符串地址,源字符串地址返回值:dest的起始地址注意:dest最后的结束字符’’会被覆盖掉,并在连接后的字符串的尾部再增加一个’’,dest要有足够的空间来容纳要复制的字符串,源字符串必须以 '' 结束。模拟实现
char* my_strcat(char* str, const char* sub)
{
char* cmp = str;
while (*str)
{
str++;
}
while (*str = *sub)
{
str++;
sub++;
}
return cmp;
}
四、strcmp
int strcmp (const char* s1,const char* s2)
功能:将s1与s2t比较输入:s1和s2返回值:若s1和s2字符串相同返回0,s1若大于s2则返回大于0,s1若小于s2则返回小于0注意:判断两个字符串大小1)ASII码 2)长度模拟实现
int my_strcmp(const char* str, const char* sub)
{
assert(*str != NULL && *sub != NULL);
if (*str == NULL || *sub == NULL)
{
return 0;
}
while (*str == *sub )
{
if (*str == '')
{
return 0;
}
str++;
sub++;
}
if (*str > *sub)
{
return 1;
}
else if (*str < *sub)
{
return -1;
}
else
{
return 0;
}
}
五、strncpy
char* strncpy(char* dest,const char* src,size_t num)
功能:拷贝src字符串的前num个字符至dest输入:dest地址src地址和需要拷贝的字符个数返回值:dest字符串起始地址注意:strncpy不会向dest追加’’,dest必须有足够的空间放置n个字符 六、strncat
char* strncat (char* dest,const char* src,size_t num)
功能:将n个字符追加到字符串结尾输入:dest地址src地址和需要拼接的字符个数返回值:dest字符串起始地址注意:strncat会将dest字符串最后的’’覆盖掉,字符追加完成后,再追加’’ 七、strncmp
int strncmp(const char* str1,const char* str2,size_t num)
功能:指定长度比较输入:dest地址src地址和需要比较的字符个数返回值:同strcmp一样注意:同strcmp一样 八、strstr
char* strstr(const char* str,const char* substr)
功能:检索子串在字符串中首次出现的位置输入:str和substr的地址返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL使用示范:
#include九、strtok#include int main() { char str[] = "This is a simple string"; char* pch; pch = strstr(str, "simple"); strncpy(pch, "sample", 6); puts(str); return 0; }
char* strtok(char* str,const char* sep)
功能:根据分隔符将字符串分隔成一个个片段输入:str为源字符串,sep参数是个字符串,定义了用作分隔符的字符集合返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL注意:当strtok在参数s的字符串中发现到参数sep的分割字符时则会将该字符改为’’字符。
在第一次调用时,strtok必须赋予参数str字符串,往后的调用则将参数str设置成NULL,直到str指向NULL停止
#include十、strerrorint main() { char* p = "woshinidie#baba,dong?"; const char* sep = "#,"; char arr[30]; char* str = NULL; strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容 for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)) { printf("%sn", str); } }
char * strerror ( int errnum );
功能:返回错误码输入:errno信息返回值:返回错误码注意:必须包含string.h和errno.h
#include十一、memcpy#include #include //必须包含的头文件 int main () { FILE * pFile; pFile = fopen ("unexist.ent","r"); if (pFile == NULL) printf ("Error opening file unexist.ent: %sn",strerror(errno)); //errno: Last error number return 0; }
void * memcpy ( void * destination, const void * source, size_t num )
功能:任何类型的拷贝输入:dest为目标函数,src为源函数,num为拷贝字符数量返回值:dest地址模拟实现:遇到''不会停下来,,不可以源内容和目标内容重叠。当每次解引用完后dest和src的类型还是void*所以,必须再次char*
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL && src != NULL);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
十二、memmove
void * memmove ( void * destination, const void * source, size_t num )
功能:任何类型的拷贝输入:dest为目标函数,src为源函数,num为拷贝字符数量返回值:dest地址模拟实现:遇到''不会停下来,,可以源内容和目标内容重叠。当每次解引用完后dest和src的类型还是void*所以,必须再次char*。当dest < src时,必须从后向前拷贝,当dest > src时,必须从前向后拷贝。
void* my_memmove(char* dest, const char* src, size_t num)
{
void* ret = dest;
assert(dest != NULL && src != NULL);
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
十三、memcmp
int memcmp ( const void * ptr1,
const void * ptr2,
size_t num )
功能:比较从ptr1和ptr2指针开始的num个字节输入:ptr1为目标函数, ptr2为源函数,num为比较字符数量返回值:ptr1和ptr2字符串相同返回0,ptr1大于ptr2则返回大于0,s1小于s2则返回小于0使用示范:
#include十四、字符分类函数:#include int main () { char buffer1[] = "DWgaOtP12df0"; char buffer2[] = "DWGAOTP12DF0"; int n; n=memcmp ( buffer1, buffer2, sizeof(buffer1) ); if (n>0) printf ("'%s' is greater than '%s'.n",buffer1,buffer2); else if (n<0) printf ("'%s' is less than '%s'.n",buffer1,buffer2); else printf ("'%s' is the same as '%s'.n",buffer1,buffer2); return 0; }
总结
算上今天还有27天就开学了,想想在家里呆了有15天了,虽然大部分时间都是在自我学习和学习他人,但有时候就感觉,别人都好努力呀,自己是不是因该再努力一点,但这样尝试之后自己会变得好累,但我就想再坚持一下就好了,希望自己还是能多关注一下自己的节奏吧,慢慢来,一切都会变得更好的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)