strlen
size_ t strlen ( const char * str );
字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0' )
参数指向的字符串必须要以'\0'结束,char arr[]={'a','b','c','d'};这种数组不行,这种数组最后没有'\0',int len=strlen(arr);得到的是随机值。注意函数的返回值为size_ t,size_t 就是unsigned int
strcpy
char* strcpy(char * destination,const char * source );
源字符串必须以'\0'结束。拷贝的位置是从目标地址的第一个元素开始会将源字符串中的'\0'拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串。目标空间必须可变,不能是const
strncpy
char *strncpy( char *strDest, const char *strSource, size_ t count );
第三个参数是要拷贝的字符个数,当源字符串不足时,补'\0',但是要注意count是几就拷贝几个,不会在拷贝完后追加'\0'
char arr1[30]="abcdxxxxxxxxxxx",arr2[]="ef"; strncpy(arr1,arr2,6);//arr2不足6位,拷贝的时候在arr1补0,arr2还是ef,后面也只有一个'\0'
strcat
char * strcat ( char * destination, const char * source );
源字符串必须以'\0'结束。目标空间必须有足够的大,能容纳下源字符串的内容。目标空间必须可修改。字符串自己不能给自己追加
源字符串的'\0'也追加到目标空间了,并且是从目标空间的'\0'开始,'\0'要被覆盖掉
strncat
char *strncat( char *strDest, const char *strSource, size_ t count );
count为追加个数,追加完后会在后面补'\0',当源字符串个数小于count时,多余的部分不追加
char arr1[30]="abcdefxxx\0xxxxxxxxx",arr2[]="jk"; strncat(arr1,arr2,8);
strcmp
int strcmp( const char *stringl, const char *string2 );
比的是字符的ascall码的大小,两个字符串第一个字符相等就比较第二个,以此类推
string1小于string2返回值<0,string1等于string2返回值=0,string1大于string2返回值>0,
strncmp
int strncmp ( const char * str1,const char * str2,size. _t mum );
基本都和strcmp一样,只是mum是比较的字符个数
strstr
char *strstr (const char *,const char *);
查找字符串函数,找到了返回查找字符串在目标中的首地址,没找到返回NULL指针
strtok
char * strtok ( char * str,const char * sep ) ;
char str[]="10086@qq.com";
char sep[]="@.";
char *p;
p=strtok(str,sep);printf("%s",p);//10086
p=strtok(NULL,sep);printf("%s",p);//qq
p=strtok(NULL,sep);printf("%s",p);//com
sep参数是个字符串,定义了用作分隔符的字符集合,例如上例的'@'和'.',也叫标记
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的一个标记时,将其用\0替换,返回一个指向这个标记的指针。
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串时,一般都要用临时拷贝的内容进行切分。
strtok函数在找str中第一个标记时,第一个参数设置为str的首元素地址,在找到第一个标记时,strtok函数将保存它在字符串中的位置。
strtok函数在找str中除第一个标记以外的标记时,第一个参数设为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。
strerror
char*strerror ( int errnum ) ;
返回错误码,所对应的错误信息。errno是一个全局的错误码的变量,
当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中
FILE* pf = fopen("test .txt", "r");//打开文件
if (pf == NULL)
{
printf("%s\n", strerror(errno));
}
else
printf("open file success\n");
字符分类函数
还有两个字符转换函数:
int tolower ( int c );//将大写转换为小写
int toupper ( int c );//将小写转换为大写
char arr[]="abcdefjk"
int i = 0;
while (arr[i])
{
if (islower(arr[i]))//是否小写
arr[i] = toupper(arr[i]);//转化为大写
i++;
}
printf("%s\n", arr); 通过循环就可以实现字符串大小写的转换
相关代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <errno.h>
int my_strlen(const char a[])
{
int count=0;
while (*a)
{
count++;
a++;
}
return count;
}
char* my_strcpy(char* aim, const char* str)
{
char *a = aim;
while (*aim++ = *str++);
return a;
}
char* my_strcat(char* aim, const char* str)
{
char *a = aim;
while (*aim)aim++;
while (*aim++ = *str++);
return a;
}
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1 - *str2);
}
char* my_strncpy(char* aim,const char* str,int count)
{
char* a = aim;
while (count && (*aim++ = *str++))
count--;
if (count)
while (--count)
*aim++ = '\0';
return a;
}
char * my_strncat(char * aim,const char * str,int count)
{
char *a = aim;
while (*aim++)
aim--;
while (count--)
if (!(*aim++ = *str++))
return(a);
*aim = '\0';
return a;
}
int main()
{
char arr1[30] = "abcdef",arr[30]="abcdef";//两个数组,在不同空间,只是内容一样
char *p = "abcd";//这是常量字符串
char *q = "abcd";//p,q指向的是同一块空间,与数组不同
char arr2[] = { 'a','b','c','e','f' };
char arr3[] = { "jk" };
int a =strlen(arr1);
int b = strlen(arr2);
char *p1 = "ab", *p2 = "cd";
char *res;
char str[] = "10086@qq.com";
char sep[] = "@.";
printf("%d\n", a);//6
printf("%d\n", b);//随机值
if (strlen("abcd") - strlen("abcdef")>0)//这里需要注意,strlen返回值是无符号整型,
//4-6=-2,-2=10000010,10000010无符号是130
printf("1\n");//所以打印1
else
printf("2\n");
//arr1 = arr3;这种直接将地址赋值给地址的拷贝方式是错误的,字符串之间的拷贝用strcpy函数
//strcpy(arr1, arr2);arr2没有\0,会向后越界访问
//strcpy(p, arr3);p是常量字符串,不能修改
strcpy(arr1, arr3);
printf("%s\n", arr1);//jk,这里没有cdef,因为将arr3的\0也拷贝了
strncpy(arr1, p1, 6);//不足6位补0
printf("%s\n", arr1);//ab,
strcat(arr, arr3);
printf("%s\n", arr);//abcdefjk,这里也可以证明arr和arr1在不同空间,如是在同一块空间应是打印jkjk
strncat(arr1, arr3,8);//在追加完后,会在后面补0,arr3不足8个,超过的部分不追加
printf("%s\n", arr);//abcdefjkjk
printf("%d %d %d\n",strcmp(p, q), strcmp(p1, p2), strcmp(p2, p1));
res=strstr(p, p1);//查找字符串函数,找到了返回查找字符串在p中的首地址,没找到返回NULL指针
if (res == NULL)printf("没找到");
else printf("%s\n", res);//abcd
for(res=strtok(str, sep);res!=NULL; res = strtok(NULL, sep))
printf("%s\n", res);
//errno是一个全局的错误码的变量
//当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中
FILE* pf = fopen("test .txt", "r");//打开文件
if (pf == NULL)
{
printf("%s\n", strerror(errno));
}
else
printf("open file success\n");
int i = 0;
while (arr[i])
{
if (islower(arr[i]))
arr[i] = toupper(arr[i]);
i++;
}
printf("%s\n", arr);
return 0;
}


京公网安备 11010502036488号