常见字符分类函数
这类函数的用法都十分相似,我只举一个例子就好了,其他的大家自己举一反三吧。
这里推荐大家一个网址cplusplus.com - The C++ Resources Network,,可以在里面搜索函数的参数、返回值以及所需的头文件和函数使用示例等等。
如图所示,islower是一个分类小写字母a~z的函数,这里识别小写字母转成大写字母。
#include <stdio.h>
#include <ctype.h>
int main()
{
char str[] = "Hello World";
char ch;
int i = 0;
while (str[i])
{
ch = str[i];
if (islower(ch))//islower函数的参数是int,ch的类型是char,大空间可以兼容小空间
{
ch -= 32;
}
i++;
putchar(ch);
}
return 0;
}
1 int tolower ( int c ); //将参数传进去的?写字?转?写
2 int toupper ( int c ); //将参数传进去的?写字?转?写
使用方法是将islower函数示例代码中的ch - =32换成ch=tolower (ch )/toupper (ch );说法比较牵强,但是话糙理不糙。
strlen函数是计算字符串中‘/0’前的字符个数,不包含‘/0’。
size_t strlen ( const char * str );//注意,size_t是无符号的整型
#include "stdio.h"
#include "string.h"
int main()
{
char arr[] = "abcdefg";
size_t len = strlen(arr);
printf("%d", len);
}
#include "stdio.h"
#include "string.h"
size_t My_strlen(char* arr)//模拟实现
{
int count = 0;
while (*arr)
{
arr++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t len = My_strlen(arr);
printf("%d", len);
return 0;
}
strcpy函数是将数组arr2中存储的字符串全部复制到数组arr1。值得注意的是数组arr2字符串中的‘/0’也会被复制过来,数组arr1需要有足够大的空间以及可被修改。
char * strcpy ( char * destination, const char * source );
#include "stdio.h"
#include "string.h"
int main()
{
char arr1[20];
char arr2[] = "hello world";
strcpy(arr1,arr2);
printf("%s", arr1);
return 0;
}
#include "stdio.h"
#include "string.h"
/*void my_strcpy(char *pa,char *pb)//模拟实现2
{
while (*pb)
{
*pa = *pb;
pa++;
pb++;
}
*pa = *pb;
}*/
char *my_strcpy(char *dest, const char*src)//模拟实现2
{
char* ret = dest;
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[20];
char arr2[] = "hello world";
char *aim=arr1;
aim = my_strcpy(arr1, arr2);
printf("%s", aim);
return 0;
}
strcpy函数有两种模拟实现方法,推荐第二种。
char * strcat ( char * destination, const char * source );
strcat函数可以将数组arr2中的字符串接到数组arr1中的字符串后。且数组arr1中的字符串与数组arr2中的字符串必须要有‘/0’,前者是追加时确认在何处追加的标注位,后者是追加结束后新的字符串的截止位。
#include "stdio.h"
#include "string.h"
int main()
{
char arr1[20]= "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
#include "stdio.h"
#include "string.h"
char *my_strcat(char *pa,char *pb)
{
char* ret = pa;
while (*pa)
{
pa++;
}
while (*pa++ = *pb++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
char* aim = my_strcat(arr1, arr2);
printf("%s", aim);
return 0;
}
int strcmp ( const char * str1, const char * str2 );
strcmp函数的一个比较字符串大小的函数,比较时会将两个字符串从左到右依次比较每一个字符的ascall码值的大小。第?个字符串?于第?个字符串,则返回?于0的数字;第?个字符串等于第?个字符串,则返回0;第?个字符串?于第?个字符串,则返回?于0的数字。
#define _CRT_SECURE_NO_WARNINGS 1
#include "stdio.h"
#include "string.h"
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
int ret = strcmp(arr1, arr2);
if (ret > 0)
printf("arr1>arr2");
else if (ret < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "stdio.h"
#include "string.h"
#include "assert.h"
int my_strcmp(char* pa, char* pb)
{
assert(pa);
assert(pb);
while (*pa == *pb)
{
if (*pa == '/0')
return 0;
pa++;
pb++;
}
return *pa - *pb;
}
int main()
{
char arr1[] = "bcdef";
char arr2[] = "abcdefg";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
printf("arr1>arr2");
else if (ret < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
char * strncpy ( char * destination, const char * source, size_t num );
?strncpy函数的使用与strcpy函数的使用方法类似,只不过多了一个num参数使得程序员可以控制复制过去的字符个数。如果源字符串的长度小于num,则拷贝完源字符串之后,在拷贝完的函数后边追加0,直到num个。如果源字符串的长度大于num,则拷贝完源字符串中的num个字符后,还需要手动在拷贝完的函数后面追加一个0;
strncpy函数的使用示例
#include "stdio.h"
#include "string.h"
//int main()//源字符串的长度小于num
//{
// char arr1[20];
// char arr2[] = "hello world";
// strncpy(arr1, arr2, 20);
// printf("%s", arr1);
// return 0;
//}
int main()//源字符串的长度大于num
{
char arr1[20];
char arr2[] = "hello world";
strncpy(arr1, arr2, 5);
arr1[5] = 0;
printf("%s", arr1);
return 0;
}
char * strncat ( char * destination, const char * source, size_t num );
?strncat函数的使用与strcat函数的使用方法类似,只不过多了一个num参数使得程序员可以控制追加过去的字符个数。将源字符串指向字符串的前num个字符追加到目的字符串指向的字符串末尾,再追加?个 \0 字符(系统自加)。如果源字符串指向的字符串的长度小于num的时候,只会将字符串中到\0 的内容追加到目的字符串指向的字符串末尾。
#include "stdio.h"
#include "string.h"
//int main()//源字符串的长度小于num
//{
// char arr1[20] = "hello ";
// char arr2[] = "world";
// strncat(arr1, arr2, 10);
// printf("%s", arr1);
// return 0;
//}
int main()//源字符串的长度大于num
{
char arr1[20]="hello ";
char arr2[] = "world";
strncat(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
int strncmp ( const char * str1, const char * str2, size_t num );
?strncmp函数的使用与strcmp函数的使用方法类似,只不过多了一个num参数使得程序员可以控制源字符串和目的字符串比较的最多字符个数。
#define _CRT_SECURE_NO_WARNINGS 1
#include "stdio.h"
#include "string.h"
int main()
{
char arr1[20] = "world ";
char arr2[] = "world";
int len = strncmp(arr1, arr2, 6);
if (len > 0)
printf("arr1>arr2");
else if (len < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
char * strstr (char * str1, const char * str2 );
strstr函数可以查询字符串str2是否是字符串str1的子字符串,即判断str1是否包含str2。字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志。比较匹配成功,即str2是str1的子字符串。函数返回字符串str2在字符串str1中第?次出现的位置。比较失败,返回NULL。?
#include "stdio.h"
#include "string.h"
int main()
{
char arr1[20] = "hello world ";
char arr2[] = "aworld";
char *p = strstr(arr1, arr2);
printf("%s", p);
return 0;
}
#include "stdio.h"
#include "string.h"
char* my_strstr(const char* str1, const char* str2)//模拟实现
{
char* ch = (char*)str1;
char* s1, * s2;
if (!*str2)
return((char*)str1);
while (*ch)
{
s1 = ch;
s2 = (char*)str2;
while (*s1 && *s2 && !(*s1 - *s2))
s1++, s2++;
if (!*s2)
return(ch);
ch++;
}
return(NULL);
}
int main()
{
char arr1[20] = "hello world ";
char arr2[] = "world";
char *p = my_strstr(arr1, arr2);
printf("%s", p);
return 0;
}
char * strtok ( char * str, const char * delimiters );
#include "stdio.h"
#include "string.h"
int main()
{
char arr[] = "110&119@120";
char str[] = "&@";
char* ch = NULL;
for (ch = strtok(arr, str); ch != NULL; ch = strtok(NULL, str))
{
printf("%s\n", ch);
}
return 0;
}
char * strerror ( int errnum );
#include <errno.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i = 0;
for(i=1;i<=11;i++)
{
printf("%s",strerror(i));
}
return 0;
}
#include <errno.h>
#include <string.h>
#include <stdio.h>
int main()
{ FILE * pFile=NULL;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
printf("Error opening file unexist.ent: %s\n", strerror(errno));
return 0;
}
void perror ( const char * str );
#include <errno.h>
#include <string.h>
#include <stdio.h>
int main()
{ FILE * pFile=NULL;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
perror("Error opening file unexist.ent");
return 0;
}
?