目录
一、求字符串长度
1.了解函数strlen
size_t strlen(const char*str)
参数指向字符串已经是以'\0'结尾,strlen函数返回的是在字符串中‘\0’前面出现的字符个数。
注意函数的返回值为size_t,是无符号的。
例如下面代码
#include <stdio.h>
int main() {
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0; }
运行结果
str2>str1
原因就是差值是无符号的,原反补码相同,数值是一个很大的正数。
模拟实现strlen
方法有很多,我们在这里介绍指针-指针的方式
int my_strlen(char *s) {
}
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
二、 长度不受限制的字符串函数
1.了解strcpy
char* strcpy(char*dst,const char*src)
源字符(src)串必须以'\0'结束,会将源字符串中的‘\0’拷贝到目标空间(dst)。
目标空间必须足够大和可变。
模拟实现strcpy
char *my_strcpy(char *dst, const char*src)
{
char *ret = dest;
assert(dst&&src);
while((*dst++ = *src++)){;}
return ret;
}
2.了解strcat
char * strcat ( char * destination, const char * source )
源字符串必须以'\0'结束,目标空间必须足够大且能修改。
模拟实现strcat
char *my_strcat(char *dst, const char*src)
{
char *ret = dst;
assert(dest&&src);
while(*dest)
{
dest++;
}
while((*dest++ = *src++)){;}
return ret;
}
3.了解strcmp
int strcmp ( const char * str1, const char * str2 )
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
模拟实现strcmp
int my_strcmp (const char * src, const char * dst)
{
int ret = 0 ;
assert(src &&dst);
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
{++src, ++dst;}
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
三、长度受限制的字符串函数
1.了解strncpy
char * strncpy ( char * dst, const char * src, size_t num )
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
模拟实现strncpy
char * my_strncpy ( char * dst, const char * src, size_t num )
{
char*ret=dst;
assert(src&&dst);
while(num--)
{
if(*src)
*dst++=*src++;
else
*dst++='\0';
}
return ret;
}
2.了解strncat
char * strncat ( char * dst, const char * src, size_t num )
如果源中C字符串的长度小于num,则仅复制到终止空字符的内容。
举例
int main () {
char str1[20];
char str2[20];
strcpy (str1,"To be ");
strcpy (str2,"or not to be");
strncat (str1, str2, 6);
puts (str1);
return 0;
}
运行结果
To be or not
模拟实现strncat
char * my_strncat ( char * dst, const char * src, size_t num )
{
char*ret=dst;
assert(dst&&src);
while(*dst)
{
dst++;
}
size_t len=strlen(src);
if(num>len)
num=len;
while(num--)
{
*dst++=*src++;
*(dst+1)='\0';
}
return ret;
}
3.了解strncmp
int strncmp ( const char * str1, const char * str2, size_t num )
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
模拟实现strncmp
int my_strncmp ( const char * str1, const char * str2, size_t num )
{
int ret=0;
assert(str1&&str2);
while(!(ret)&&*str2&&str1&&num--)
{
ret=(*(unsigned char*)str2-*(unsigned char*)str1);
str1++;
str2++;
}
if(ret<0)
return -1;
else if (ret>0)
return 1;
return ret;
}
四、字符串查找
1.了解strstr
char * strstr ( const char *str1, const char * str2)
返回str1中首次出现的str2的指针,如果str2不是str1的一部分,则返回空指针。
模拟实现strstr
char * my_strstr (const char * str1, const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{ s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )
{s1++;s2++;}
if (!*s2)
{return(cp);}
cp++;
}
return(NULL);
}
2.了解strtok
char * strtok ( char * str, const char * sep )
sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
举例
#include <stdio.h>
#include <string.h>
int main () {
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
结果
This
a
sample
string
五、错误信息报告
了解strerror
char * strerror ( int errnum )
返回错误码,所对应的错误信息。
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
//errno: Last error number
return 0;
}
六、字符分类函数
拿字符转换举例
int tolower ( int c )
int toupper ( int c )
#include <stdio.h>
#include <ctype.h>
int main ()
{
int i=0;
char str[]="Test String.\n";
char c;
while (str[i])
{
c=str[i];
if (isupper(c))
c=tolower(c);
putchar (c);
i++;
}
return 0;
}
运行结果
test string.