- 相干保举
C说话字符串操纵函数及常常利用的完成
口试官很喜好让求职者写一些常常利用库函数的完成,有良多是和字符串相干的,有一些是对于内存拷贝的。普通,常会让写的函数有以下几个:
strcpy , strncpy, memcpy。
memset普通不会让去写,但这个函数也很有特色,有良多轻易用错的处所。一并总结吧。
字符串操纵函数 |
|
atof() | 将字符串转换成浮点数 |
atoi() | 将字符串转换成整数 |
atol() | 将字符串转换生长整型数 |
gcvt() | 将浮点型数转换为字符串(四舍五入) |
strtod() | 将字符串转换成浮点数 |
strtol() | 将字符串转换生长整型数 |
strtoul() | 将字符串转换成无标记长整型数 |
toascii() | 将整数转换成正当的ASCII码字符 |
tolower() | 将大写字母转换为小写字母 |
toupper() | 将小写字母转换为大写字母 |
index() | 查找字符串并前往初次呈现的地位 |
rindex() | 查找字符串并前往最初一次呈现的地位 |
strcasecmp() | 判定字符串是不是相称(疏忽巨细写) |
strcat() | 毗连字符串 |
strcmp() | 按照ASCII码比拟字符串 |
strcoll() | 按照情况变量LC_COLLATE来比拟字符串 |
strcpy() | 复制字符串 |
strcspn() | 查找字符串并前往初次呈现的地位 |
strchr() | 查找字符串并前往初次呈现该字符的地点 |
strdup() | 复制字符串 |
strlen() | 前往字符串长度 |
strncasecmp() | 比拟字符串的前n个字符 |
strncat() | 拼接字符串(取前n个字符) |
strncpy() | 复制字符串(取前n个字符) |
strpbrk() | 定位字符串中第一个呈现的指定字符 |
strrchr() | 定位字符串中最初呈现的指定字符 |
strspn() | 前往从字符串开首持续包罗特定字符的字符数量 |
strstr() | 前往指定字符串第一次呈现的地点 |
strtok() | 字符串朋分 |
1. strcpy
strcpy函数的原型是:
char * strcpy(char* dest, const char* src)
strcpy的完成常常要注重的细节是:
(1)判定地点是不是为空,小我感受可以或许利用断言
(2)参数只要两个地点,不拷贝的长度。拷贝到'\0‘时就会停止,要保障终究dest开端是'\0'。
(3)要保障方针字串的长度充足,可以或许包容原串的长度。
(4)由于拷贝是dest会挪动,而终究要前往的是拷贝后字符串的肇端地点,是以要先保管dest的地点,便于终究前往。
在完成这一点时,有两种体例。 char* temp=dest; 拷贝时挪动dest前往temp,或拷贝时挪动temp前往dest,不晓得哪一个是对的。感受两个都是不题目标
此中一种完成体例:
[cpp] view plaincopychar* mystrcpy(char* dest,const char* src)
{
assert(dest!=NULL && src!=NULL);
char* temp=dest;
while((*temp++ = *src++ )!='\0')
{}
return dest;
}
2. strncpy
strncpy的功效和strcpy近似,只是它复制时多了一个停止前提。便是未碰到原串的'\0’,若是已复制了n个字符(n为供给的参数长度),复制一样会停止。
strcpy的完成要注重的细节也根基合用于strncpy的完成。
完成体例:
[cpp] view plaincopychar* mystrncpy(char* dest, const char* src, int len)
{
assert(dest!=NULL && src!=NULL);
char* temp=dest;
int i=0;
while(i++ < len && (*temp++ = *src++)!='\0')
{}
if(*(--temp)!='\0')
*temp='\0';
return dest;
}
[cpp] view plaincopy注重:刚起头我写strncpy的完成时,把while(i++ < len && (*temp++ = *src++)!='\0')写成了while( (*temp++ = *src++)!='\0' && i++ < len); 致使最初多复制了一个字符,大白为甚么吧。。
3. memcpy
memcpy和strncpy有些近似,但也有实质的差别。
(1)strncpy只能复制字符串,但memcpy对范例不请求。
(2)strncpy有两个停止前提,memcpy只要一个停止前提,那便是复制n个字节。(n是memcpy的第三个参数)
(3)要出格注重目标地点和源地点重合的题目,拷贝前要加以判定。
(4)完成这个函数时普通要把本来的指针范例转换成char*,如许每次挪动都是一个字节。
完成体例:(斟酌了两个地点空间是不是会有堆叠)
[cpp] view plaincopyvoid* mymemcpy(void* dest, void* src, int len)
{
int i=0;
char* tempdest=(char*)dest;
char* tempsrc=(char*)src;
if(tempdest(tempsrc+len-1))
{
while(i
{
*tempdest++ = *tempsrc++;
i++;
}
}
else
{
tempdest+=len;
tempsrc+=len;
i=len;
while(i>0)
{
*tempdest-- = *tempsrc--;
i--;
}
}
return dest;
}
注重,memcpy是对内存的拷贝,对其余宁静性不做斟酌。用户在利用这个函数时要谨慎,比方用它来拷贝字符串(固然若是是字符串拷贝必定是用strncpy)就要注重开端的\0字符之类的。
4. memset
memset函数的原型是:
void *memset(void *s, int ch, size_t n)
感化是把s所指向的地点起头的n个字节的内容全数置位ch所指定的ASCII值。
普通常常常利用memset对某段内存空间置零。
常常会呈现的一个题目:在C++中,为甚么不倡导在机关函数中利用:memset(this,0,sizeof(*this))
缘由: 在C++中,若是类中都是根基范例的数据成员并且不虚函数和虚担当的话,利用memset如许用到不太多影响。
若是有虚函数,memset会把虚表指针等全数置零,对类会发生粉碎。
【C说话字符串操纵函数及常常利用的完成】相干文章:
C说话中前往字符串函数的完成体例09-19
C说话之字符串处置函数08-31
8种C说话根基常常利用的字符串处置函数05-30
php的字符串常常利用函数06-15
C说话法式的完成09-27
C说话的底层操纵08-23
C说话字符串常识点07-27
c说话数学函数的先容10-20
C说话函数递归教程09-25
C说话函数的递归挪用08-26