常用的字符函数和字符串函数汇总

简介: C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。字符串常量 适用于那些对它不做修改的字符串函数。

0.前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。

字符串常量 适用于那些对它不做修改的字符串函数

1.求字符串长度

strlen

       获得字符串的长度(string length)

函数原型:size_tstrlen(constchar*string);

  • 字符串已经' \0 '作为结束标志,strlen函数返回的是在字符串中' \0 '前面出现的字符个数(不包括' \0 '
  • 参数指向的字符串必须要以' \0 '结束
  • 注意函数的返回值为size_t,是无符号的(易错)

(详细请参考:strlen函数详解

示例

#include<stdio.h>
#include<string.h>
int main()
{
  const char* str1 = "abcdef";
  const char* str2 = "bbb";
  printf("str1的长度%d  str2的长度%d\n", strlen(str1), strlen(str2));
  if (strlen(str2) > strlen(str1) > 0)
  {
  printf("str2>str1\n");
  }
  else {
  printf("str1>str2\n");
  }
  return 0;
}

f42d1387c0ce0ddde325527dd1b9c7ac_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

2.长度不受限制的字符串函数

strcpy

       拷贝字符串到目标地址

函数原型:char*strcpy(char* destination,constchar* source)

  • 源字符串必须以' \0 '结束
  • 会将源字符串中的' \0 '拷贝到目标空间
  • 目标空间必须足够大,以确保能存放源字符串
  • 目标空间必须可变

示例

#include<stdio.h>
#include<string.h>
int main()
{
  char arr1[8] = "xxxxxxx";
  char arr2[] = "abcdef";
  printf("赋值字符前arr1:%s\n", arr1);
  strcpy(arr1, arr2);
  printf("赋值字符后arr1:%s\n", arr1);
  return 0;
}

strcat

         字符串追加

函数原型:char*strcat(char* destination,constchar* source);


源字符串必须以' \0 '结束。

目标空间必须有足够的大,能容纳下源字符串的内容。

目标空间必须可修改。

(详细请参考:strcpy函数详解)

示例

#include<stdio.h>
#include<string.h>
int main()
{
  char arr1[20] = "hello \0xxxxxxx";
  char arr2[] = "bit";
  strcat(arr1, arr2);
  printf("字符串追加后arr1:%s", arr1);
  return 0;
}

16267b9879a7f438bdcf2a2d2da02823_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

strcmp

       比较两个字符串

函数原型:intstrcmp(constchar*string1, constchar*string2);

标准规定

第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字

(详细请参考:strcmp函数详解)

示例

#include<stdio.h>
#include<string.h>
int main()
{
  char arr1[] = "abcd";
  char arr2[] = "abq";
  char arr3[] = "abc";
  char arr4[] = "abcd";
  printf("%d %d %d", strcmp(arr1, arr2), strcmp(arr1, arr3), strcmp(arr1, arr4));
  return 0;
}

c4ac6d9e59f51b98e8ae924227206abb_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

3.长度受限制的字符串函数介绍

strncpy

       拷贝n个字符到目标字符串中

函数原型:

char * strncpy ( char * destination , const char * source , size_t num );

拷贝num个字符串从源字符串到目标空间。

如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

(详细请参考:strncpy函数详解)

示例

#include<stdio.h>
#include<string.h>
int main()
{
  char dest[] = "abcdef";
  char sorce[] = "qwertyuiop";
  strncpy(dest, sorce, 3);
  printf("%s", dest);
  return 0;
}

63edab4a65033780cd0f1f1c4e0f5def_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_14,color_FFFFFF,t_70,g_se,x_16.png

strncat

函数原型:char * strncat ( char * destination, const char * source, size_t num )

示例

#include<stdio.h>
#include <string.h>
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;
}

eb272c220973fc707ba71315476e9bd8_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_13,color_FFFFFF,t_70,g_se,x_16.png

strncmp

函数原型:int strncmp ( const char * str1, const char * str2, size_t num );

  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较晚。

示例

#include <stdio.h>
#include <string.h>
int main()
{
  char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
  int n;
  puts("Looking for R2 astromech droids...");
  for (n = 0; n < 3; n++)
  if (strncmp(str[n], "R2xx", 2) == 0)
  {
    printf("found %s\n", str[n]);
  }
  return 0;
}

72260b7bb9bae9e64611b41caf3b6633_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

4.字符串查找

strstr

   查找字符子串

函数原型:char*strstr(constchar*str1,constchar*str2);


匹配成功则返回在str1中第一次找到str2跟匹配子串的首地址,失败则返回NULL  

(详细请参考:strstr函数详解)

示例

#include<stdio.h>
#include<string.h>
int main()
{
  char arr1[] = "abcdeqabcdef";
  char arr2[] = "cdef";
  char arr3[] = "abcdefqabcdef";
  char* ret1 = strstr(arr1, arr2);
  char* ret2 = strstr(arr3, arr2);
  if (NULL == ret1)
  {
  printf("在arr1中找不到跟arr2相同的子串\n");
  }
  else {
  printf("ret1:%s\n", ret1);
  }
  if (NULL == ret2)
  {
  printf("在arr3中找不到跟arr2相同的子串\n");
  }
  else {
  printf("ret2:%s\n", ret2);
  }
  return 0;
}

35212dc91a160f260f8cbefcfdade572_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

strtok

       在字符串中查找下一个标记

函数原型:char * strtok(char*str ,constchar*sep);

sep参数是个字符串,定义了用作分隔符的字符串集合

第一个参数指定了一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

strtok函数找到str中下一个标记,并将其用' \0 '结尾,返回一个指向这个标记的指针。

strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

如果字符串中不存在更多的标记,则返回NULL指针。

实例1

#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;
}

edbf1316e8af38d34f441f689b6e7dae_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

示例2

#include <stdio.h>
#include<string.h>
int main()
{
  char* p = "zhangpengwei@bitedu.tech";
  const char* sep = ".@";
  char arr[30];
  char* str = NULL;
  strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
  for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
  {
  printf("%s\n", str);
  }
}

e964099284f33f28d8a884fe41a83721_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png


5.错误信息报告

strerror

      返回错误码,所对应的错误信息

函数原型:char * strerror ( int errnum );


(详细请参考:strerror函数详解)

示例

#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;
}

433c022208908c697f95280e2b173852_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

6.字符操作

字符分类函数

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace

空白字符:‘空格’,换页' \f ',换行' \n ',回车' \r ',制表符' \t '或者垂直制表符' \v '

isdigit 十进制数字0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字符a~f,大写字母A~F
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母a~z或A~Z
isalnum 字母或者数字,a~z,A~Z,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

字符转换

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;
}

da0bbe2012a629aaf5f211f4dbe08ead_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

以上就是大家常用字符函数和字符串函数,有错误的地方希望大家能批评指正,别忘了点赞👍+收藏


相关文章
|
10月前
|
存储 C语言
字符串函数介绍&应用(一)
字符串函数介绍&应用
|
10月前
|
存储 C语言
字符串函数介绍&应用(二)
字符串函数介绍&应用
|
1月前
|
C语言
字符函数和字符串函数
字符函数和字符串函数
56 0
|
6月前
|
C语言
字符函数和字符串函数(上)
字符函数和字符串函数
|
6月前
|
C语言
字符函数和字符串函数(下)
字符函数和字符串函数(下)
|
8月前
|
C语言 Python
字符函数和字符串函数(下)
字符函数和字符串函数(下)
33 0
字符函数和字符串函数(下)
|
6月前
|
C语言
详解字符函数和字符串函数-2
详解字符函数和字符串函数
33 0
|
6月前
详解字符函数和字符串函数-1
详解字符函数和字符串函数
28 0
|
8月前
|
编译器 C语言 Python
字符函数和字符串函数(上)
字符函数和字符串函数(上)
35 0
|
9月前
|
存储 安全
常用的字符函数和字符串函数
常用的字符函数和字符串函数
71 0