C语言字符串操作

01. 字符串的初始化 char* 指针  char[]数组 与 打印
#include <stdio.h>
int main ()
{
   char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
   char * str =  greeting;
   printf("Greeting message: %s\n", greeting );
   printf("str message: %s\n", str );
   return 0;
}
打印结果:
Greeting message: Hello
str message: Hello
#include <stdio.h>
#include <string.h>



int main(void)
{
char* str1 = "0123456789" ;  // 方法一  char*的初始化

char str2[20];
strcpy(str2, "abcdefghi");  // char[] 数组的初始化
printf("str1  = %s\n", str1);
printf("str2 = %s\n", str2);


char strtemp[20];
char* str3 = strcpy(strtemp, "helloworld"); 
printf("str3 = %s\n", str3);  // 方法二   char*的初始化(需要用到char数组铺垫)


return 0;
}//用char nnnn[20]定义的,用strcpy 
//用char *ppp定义的,用=来赋值





02.strcpy(str2,str1) 字符串复制 str1字符串复制到str2
#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[12] = "Hello";
   char str2[12];
   int  len ;

   /* 复制 str1 到 str2 */
   strcpy(str2, str1);
   printf("strcpy( str2, str1) :  %s\n", str2 );
   
   strcpy(str2, "abcdef"); //直接复制字符串常量到 str2 
   printf("strcpy( str2, ""abcdef"") :  %s\n", str2 );
}
打印结果:
strcpy( str2, str1) :  Hello
strcpy( str2, abcdef) :  abcdef

03.strcat( str1, str2);在str1字符串末尾添加字符串str2 
#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[12] = "Hello";
   char str2[12] = "King";

  /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );

}
打印结果:
strcat( str1, str2):   HelloKing

04.strlen(str1) 计算字符串的长度
#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[12] = "Hello";
   char str2[12] = "King";

  /* 连接 str1 和 str2 */
   strcat( str1, str2);
 
   printf("str1.length :   %d\n", strlen(str1));  /* 计算连接str2后,str1 的总长度 */
   
   char str3[12] = "a";
   strcat( str1, str3);
   printf("str1.length :   %d\n", strlen(str1));  /* 计算连接str3后,str1 的总长度 */
}
打印结果:
str1.length :   9
str1.length :   10

05.strncat(str1,str2,int size)
char *strncat(char *dest, const char *src, size_t n) 
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。

#include <stdio.h>
#include <string.h>

int main ()
{
   char src[50], dest[50];

   strcpy(dest,  "Toady is");
   strcpy(src, "Sunday And Feel Well");

   strncat(dest, src, 6);  // 把src的前6个字符"Sunday"添加到dest末尾 从1开始到第6个字符串"Sunday"
   printf("最终的目标字符串: |%s|", dest);
   return 0;
}
打印结果:
最终的目标字符串: |Toady isSunday|

06.strchr(str1,char) 返回字符串str1中字符串char第一次复现位置后面的剩余字符串
char *strchr(const char *str, int c) 
#include <stdio.h>
#include <string.h>

int main ()
{
   const char str[] = "hello world12345678";
   const char ch = '1';
   char *ret;

   ret = strchr(str, ch); // 查询字符'1' 第一次出现的位置后面的字符串

   printf("|%c| 之后的字符串是 :|%s|\n", ch, ret);
   
   return 0;
}
打印结果: |1| 之后的字符串是 :|12345678|

07.strcmp(str1,str2)  对比字符串是否一致
int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str1。
如果返回值 = 0,则表示 str1 等于 str2。

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strcmp(str1, str2); //比较两个字符串

   if(ret < 0)
   {
      printf("str1 小于 str2   res=%d",ret);
   }
   else if(ret > 0) 
   {
      printf("str1 小于 str2   res=%d",ret);
   }
   else 
   {
      printf("str1 等于 str2   res=%d",ret);
   }
   
   return 0;
}
打印结果: 
str1 大于 str2   res=1

08.strncmp(str1,str2,int n)   把 str1 和 str2 进行比较,最多比较前 n 个字节
int strncmp(const char *str1, const char *str2, size_t n) 把 str1 所指向前n个字符串和 str2 所指向的前n个字符串进行比较
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str1。
如果返回值 = 0,则表示 str1 等于 str2。

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   strcpy(str1, "ABCDef");
   strcpy(str2, "ABCDEF");

   ret = strncmp(str1, str2, 4); //比较两个字符串前4个字符

   if(ret < 0)
   {
      printf("str1 小于 str2   res=%d",ret);
   }
   else if(ret > 0) 
   {
      printf("str1 小于 str2   res=%d",ret);
   }
   else 
   {
      printf("str1 等于 str2   res=%d",ret);
   }
   
   return 0;
}
打印结果: 
str1 等于 str2   res=0


09.strncpy(str desc ,str src,int n)   把 src 所指向的字符串复制到dest最多复制n个字符当src的长度小于n时dest的剩余部分将用空字节填充
char *strncpy(char *dest, const char *src, size_t n)
dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
n -- 要从源中复制的字符数。

#include <stdio.h>
#include <string.h>

int main()
{
   char src[40];
   char dest[12];
  
   strcpy(src, "123456789");
   strncpy(dest, src, 5);

   printf("最终的目标字符串1: %s\n", dest);
   
   strncpy(dest, "123456789",7); 
   printf("最终的目标字符串2: %s\n", dest);
   return 0;
}
打印结果: 
最终的目标字符串1: 12345
最终的目标字符串2: 1234567



10.strcspn(str1,str2)  检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符
size_t strcspn(const char *str1, const char *str2)
str1 -- 要被检索的 C 字符串。
str2 -- 该字符串包含了要在 str1 中进行匹配的字符列表。
该函数返回 str1 包含 str2 中字符的 在str1的第一个字符的位置

#include <stdio.h>
#include <string.h>


int main ()
{
   int len;
   const char str1[] = "ABCDEF4960910";
   const char str2[] = "90";

   len = strcspn(str1, str2);  // 从0开始计数

   printf("第一个匹配的字符是在 %d\n", len + 1);
   
   return 0;
}
打印结果: 
第一个匹配的字符是在 8


11.strerror(int errnum) 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针
char *strerror(int errnum)  errnum -- 错误号 通常是 errno. 生成的错误字符串取决于开发平台和编译器

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main ()
{
   FILE *fp;
   printf("errno1   %d\n", errno); // 1
   fp = fopen("file.txt","r");
   if( fp == NULL ) 
   {
    printf("errno2   %d\n", errno); // 2  errno这个值会根据错误被系统填充不同的值
      printf("Error: %s\n", strerror(errno)); 
   }

   int i = 0;
   for(;i<44;i++){
   printf("errno%d = %s\n", i, strerror(i));
   }
  return 0;
}

打印结果: 
errno1   0
errno2   2
Error: No such file or directory
errno0 = No error
errno1 = Operation not permitted
errno2 = No such file or directory
errno3 = No such process
errno4 = Interrupted function call
errno5 = Input/output error
errno6 = No such device or address
errno7 = Arg list too long
errno8 = Exec format error
errno9 = Bad file descriptor
errno10 = No child processes
errno11 = Resource temporarily unavailable
errno12 = Not enough space
errno13 = Permission denied
errno14 = Bad address
errno15 = Unknown error
errno16 = Resource device
errno17 = File exists
errno18 = Improper link
errno19 = No such device
errno20 = Not a directory
errno21 = Is a directory
errno22 = Invalid argument
errno23 = Too many open files in system
errno24 = Too many open files
errno25 = Inappropriate I/O control operation
errno26 = Unknown error
errno27 = File too large
errno28 = No space left on device
errno29 = Invalid seek
errno30 = Read-only file system
errno31 = Too many links
errno32 = Broken pipe
errno33 = Domain error
errno34 = Result too large
errno35 = Unknown error
errno36 = Resource deadlock avoided
errno37 = Unknown error
errno38 = Filename too long
errno39 = No locks available
errno40 = Function not implemented
errno41 = Directory not empty
errno42 = Illegal byte sequence
errno43 = Unknown error



12.strpbrk(str1,str2) 检索字符串 str1 中第一个匹配字符串 str2 中字符的字符  找出最先匹配的字符
char *strpbrk(const char *str1, const char *str2)
该函数返回 str1 中第一个匹配字符串 str2 中字符的字符数,如果未找到字符则返回 NULL
#include <stdio.h>
#include <string.h>

int main ()
{
   const char str1[] = "abcde2fghi3jk4l";
   const char str2[] = "3i4";
   char *ret;

   ret = strpbrk(str1, str2);  // 在str1分别匹配 3  i  4
   if(ret) 
   {
      printf("第一个匹配的字符是: %c\n", *ret);
   }
   else 
   {
      printf("未找到字符");
   }
   
   return 0;
}
打印结果:
第一个匹配的字符是: i


13.strrchr(const char *str, int c) 参数 str 所指向的字符串中搜索最后一次出现字符c(一个无符号字符)的位置之后的字符串
char *strrchr(const char *str, int c) str-- C字符串    c--要搜索的字符。以 int 形式传递,但是最终会转换回 char 形式。
该函数返回 str 中最后一次出现字符 c 的位置之后的字符串。如果未找到该值,则函数返回一个空指针。
#include <stdio.h>
#include <string.h>

int main ()
{
   int len;
   const char str[] = "ABC1DEFG4HIJK7LMN9876A54B321";
   const char ch = '7';
   char *ret;

   ret = strrchr(str, ch);

   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
   
   return 0;
}
打印结果:
|7| 之后的字符串是 - |76A54B321|


14.strspn(str1,str2)   索字符串 str1 中第一个不在字符串str2中出现的字符下标
str1 -- 要被检索的 C 字符串。
str2 -- 该字符串包含了要在 str1 中进行匹配的字符列表。
该函数返回 str1 中第一个不在字符串 str2 中出现的字符下标。
#include <stdio.h>
#include <string.h>

int main ()
{
   int len;
   const char str1[] = "ACBDCDEFG019874";  //E的下标为6
   const char str2[] = "ABCD";

   len = strspn(str1, str2);

   printf("初始段匹配长度 %d\n", len );
   
   return 0;
}
打印结果:
初始段匹配长度 6


15.strstr(str1 , str2) 在字符串 str1 中查找第一次出现字符串 str2 的位置之后的字符串 返回值包含str2字符串
char *strstr(const char *haystack, const char *needle)
该函数返回在 str1 中第一次出现 str2 字符串的位置之后的字符串 返回值包含str2字符串,如果未找到则返回 null。

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[20] = "ABCD12344321DCBA";
    //char str2[10] = "41";
    char str2[10] = "44";
    char *ret;

   ret = strstr(str1, str2);
   if(ret == NULL) {
   printf("NULL ");  
   return 0;
   }
   printf("子字符串是: %s\n", ret);  
   return 0;
}
打印结果:
子字符串是: 44321DCBA


16.strtok(str1, str2)   分解字符串str为一组字符串,delim 为分隔符    strtok重复调用toNext
str -- 要被分解成一组小字符串的字符串
delim -- 包含分隔符的 C 字符串
该函数返回被分解的最后一个子字符串,如果没有可检索的字符串,则返回一个空指针


#include <string.h>
#include <stdio.h>

int main()
{
    char str[80] = "hello_world_nihao_beijing";
    char s[2] = "_";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) 
   {
      printf( "|%s|\n", token );
	
      token = strtok(NULL, s);  // 让字符串指针 指向下一个字符串?
   }
   
   return 0;
}
打印结果:
|hello|
|world|
|nihao|
|beijing|


17.strxfrm(str1 dest ,str2 src, int n) 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中
dest -- 指向存储内容的目标数组的指针,如果参数 n 为 0,则它是一个空指针。
src -- 要被转换为当前区域设置的 C 字符串。
n -- 被复制到 str1 的最大字符数
该函数返回被转换字符串的长度,不包括空结束字符

#include <stdio.h>
#include <string.h>

int main()
{
   char dest[20];
   char src[20];
   int len;

   strcpy(src, "Hello World");
   len = strxfrm(dest, src, 20);

   printf("字符串 |%s| 的长度是: |%d|", dest, len);
   
   return 0;
}
打印结果:
字符串 |Hello World| 的长度是: |11|

18.memcmp(void* str1, void* str2, int n)    把存储区 str1 和存储区 str2 的前 n 个字节进行比较
int memcmp(const void *str1, const void *str2, size_t n)) 
str1 -- 指向内存块的指针。
str2 -- 指向内存块的指针。
n -- 要被比较的字节数。
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   memcpy(str1, "aBcdef", 6);
   memcpy(str2, "AbCDEF", 6);

   ret = memcmp(str1, str2, 5);

   if(ret > 0)
   {
      printf("str1 大于 str2");
   }
   else if(ret > 0) 
   {
      printf("str1 小于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return 0;
}
打印结果:
str1 大于 str2



19.memcpy(void *str1, void *str2, int n)   从存储区 str2 复制 n 个字符到存储区 str1。
void *memcpy(void *str1, const void *str2, size_t n) 
str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
n -- 要被复制的字节数。
该函数返回一个指向目标存储区 str1 的指针。

#include <stdio.h>
#include <string.h>

int main ()
{
   const char src[50] = "hello world~";
   char dest[50];

   printf("Before memcpy dest = %s\n", dest);  //dest里面是空 乱的
   memcpy(dest, src, strlen(src)+1);
   printf("After memcpy dest = %s\n", dest);
   
   return 0;
}
打印结果:
Before memcpy dest = 叆@
After memcpy dest = hello world~



20.memmove(void *str1, void *str2, int n)   从存储区 str2 复制 n 个字符到存储区 str1。 同memcpy
void *memmove(void *str1, const void *str2, size_t n) 
从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。
如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。
如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同

#include <stdio.h>
#include <string.h>

int main ()
{
   char dest[] = "oldstring";
   const char src[]  = "newstring";

   printf("Before memmove dest = %s, src = %s\n", dest, src);
   memmove(dest, src, 9);
   printf("After memmove dest = %s, src = %s\n", dest, src);

   return 0;
}


打印结果:
Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring



21.memset(void *str, int c, int n)     复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符
void *memset(void *str, int c, size_t n)
str -- 指向要填充的内存块。
c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n -- 要被设置为该值的字节数。
该值返回一个指向存储区 str 的指针

#include <stdio.h>
#include <string.h>

int main ()
{
   char str[50];

   strcpy(str,"hello world everyone!");
   puts(str);

   memset(str,'$',7);  // 把字符串 内存空间前7个值 设置为$
   puts(str);
   
   return 0;
}

打印结果:
hello world everyone!
$$$$$$$orld everyone!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值