字符函数
字符分类函数
包含在头文件<string.h>
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格’ ‘,制表符:’\t、‘\v’,换行:‘\n’,回车:‘\r’,换页:‘\f’ |
isdigit | 十进制数字’0’~'9’字符 |
isxdigit | 十六进制字符,包括所有十进制数字字符,大小写字母’a’、‘A’~‘f’ 、‘F’ |
islower | 小写字母a~z |
isupper | 大小字母A~Z |
isalpha | 字母a-z或A-Z |
isalnum | 字母或者数字a-z、A-Z、0-9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印字符) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
这些函数的使用方法非常类似,这里就讲解一个函数,其余的一葫芦画瓢:
int main()
{
int i=0;
char c;
char a[]={This Is Hello World};
while(a[i])
{
c=a[i];
//if(a[i])//如果是小写字母,就转换成大写字母在输出
//c-=32;
putchar(c);
i++;
}
return 0;
}
字符转换函数
c语言中提供了两个字符转换函数:
将参数传进去的⼤写字⺟转⼩写 | 将参数传进去的⼩写字⺟转⼤写 |
---|---|
tolower | toupper |
这里演示一个函数,另一个同理:
int main()
{
char ch[] = {"abdE"};
int i = 0;
while (ch[i])
{
putchar(toupper(ch[i]));
i++;
}
return 0;
}//输出ABDE
字符串函数
函数 | 作用 |
---|---|
strlen | 计算\0前字符的个数 |
strcpy | 将源空间的字符复制到目标空间 |
strcat | 将源空间的字符追加到目空间 |
strcmp | 比较两个字符串 |
strncpy | 指定复制多少字符 |
strncmp | 指定比较多少个字符 |
strncat | 指定追加多少个字符 |
strstr | 查找字符串str2在str1中第一次出现的位置 |
strtok | 在sep中存放特殊字符,根据特殊字符在字符串str1中将字符串分割成小段字符 |
strerror | 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器 |
strlen函数的模拟实现:
方法1
//递归实现
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char*str)
{
assert(str);
if(*str=='\0')
return 0;
return 1+my_strlen(str+1);
}
int main()
{
char str[]={"abcdef"};
int ret=my_strlen(str);
printf("%d",ret);
return 0;
}
方法2
//有计数器
#include<stdio.h>
size_t my_strlen(const char*str)
{
int count=0;
while(*str)
{
count++;
str++;
}
return count;
}
int main()
{
char str[]={"abcdef"};
int ret=my_strlen(str);
printf("%d",ret);
return 0;
}
方法3
//无计数器
#include<stdio.h>
size_t my_strlen(const char*str)
{
char *src=str;
while(*str++)
;
return str-src-1;
}
int main()
{
char str[]={"abcdef"};
int ret=my_strlen(str);
printf("%d",ret);
return 0;
}
strcpy函数模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char str1[] = { "abcde" };
char str2[20] = { 0 };
my_strcpy(str2, str1);
printf("%s", str2);
return 0;
}
strcat函数模拟实现:
#include<stdio.h>
int my_strcmp(const,char*src1,const char*src2)
{
while(*src1==*src2)
{
src1++;
src2++;
}
return *src1-*src2;
}
int main()
{
char ch[]={"abcde"};
char ch1[]={"abdef"};
int ret=my_strcmp(ch,ch1);
printf("%d",ret);
return 0;
}
strcmp函数模拟实现:
#include<stdio.h>
int my_strcmp(const,char*src1,const char*src2)
{
while(*src1==*src2)
{
src1++;
src2++;
}
return *src1-*src2;
}
int main()
{
char ch[]={"abcde"};
char ch1[]={"abdef"};
int ret=my_strcmp(ch,ch1);
printf("%d",ret);
return 0;
}
strncpy函数模拟实现:
char* my_strncpy(char*dest,const char*src,size_t num)
{
char* ret = dest;
while (num)
{
*dest = *src;
dest++;
src++;
num--;
}
return ret;
}
int main()
{
char ch[] = { "abccdefg" };
char ch1[20] = {"xxx"};
my_strncpy(ch1,ch,4);
printf("%s",ch1);
return 0;
}
strncat函数模拟实现:
char* my_strncat(char*dest,const char*src,size_t num)
{
while (*dest)
dest++;
while (num&&*src)
{
*dest++ = *src++;
}
*dest = '\0';
}
int main()
{
char ch[] = { "ab" };
char ch1[20] = { "xxxxxx" };
my_strncat(ch1, ch, 4);
printf("%s", ch1);
return 0;
}
strncmp函数模拟实现:
int my_strncmp(const char*src1,const char*src2,size_t num)
{
while (num--)
{
if (*src1 == *src2)
continue;
return *src1 - *src2;
}
return 0;
}
int main()
{
char ch[] = { "abcd" };
char ch1[20] = { "abcd" };
int ret = my_strncmp(ch1, ch, 4);
printf("%d",ret);
return 0;
}
strstr函数模拟实现:
char* my_strstr(const char*str1,const char*str2)
{
assert(str1&&str2);
char* s1 = NULL;
char* s2 = NULL;
char* cur = str1;
if (*str2 == '\0')
return NULL;
while(*cur)
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cur;
if (*s1 == '\0')
return NULL;
cur++;
}
return NULL;
}
int main()
{
char a[] = { "abcdefg" };
char a1[] = {"cdefg"};
printf("%s",my_strstr(a,a1));
return 0;
}
strtok函数模拟实现:
char* my_strtok(char*str1,const char*sep)
{
static char* p = NULL;
char* ret = NULL;
if (str1 != NULL)
p = str1;
if (p == NULL)
return NULL;
char* token_end = strpbrk(p,sep);
if (token_end != NULL)
{
*token_end = '\0';
ret = p;
p = token_end + 1;
}
else
{
ret = p;
p = NULL;
}
return ret;
}
int main()
{
char ch[] = {"wqer.ewq.asd"};
char *sep = ".";
char* token = my_strtok(ch,sep);
while (token!=NULL)
{
printf("%s\n",token);
token=my_strtok(NULL,sep);
}
return 0;
}
strerror函数的使用:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE* fp;
fp = fopen("file.txt", "r");
if (fp == NULL)
{
printf("Error: %s\n", strerror(errno));
}
return(0);
}