【c语言】字符函数与字符串函数

字符函数与字符串函数,这一篇就够了!!!!

字符函数

字符分类函数

包含在头文件<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语言中提供了两个字符转换函数:

将参数传进去的⼤写字⺟转⼩写将参数传进去的⼩写字⺟转⼤写
tolowertoupper

这里演示一个函数,另一个同理:

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);
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值