C语言:字符函数和字符串函数的使用

strlen 字符串长度

长度不受限制的字符串函数
strcpy 字符串拷贝
strcat 字符串追加(拼接)
strcmp字符串比较

长度受限制的字符串函数(本身不考虑’\0’)
strncpy 字符串拷贝
strncat 字符串追加(拼接)
strncmp 字符串比较

字符串查找
strstr 在一个字符串中查找另一个字符串
strtok 在字符串中截取字符串or字符

错误码描述
strerror

strlen 求字符串长度

字符串以’\0’结尾,
strlen求字符串的长度是返回字符串中’\0’前面出现的字符个数(不包括’\0’)
使用很简单,如下:

#include<stdio.h>
#include<string.h>//字符串函数的头文件
int main()
{
 const char *str = "abcdef";
 int len = strlen(str);
 printf("%d\n", len);
 return 0;
}
  • 如何比较两个字符串的长度?

在这里插入图片描述
上图显然是错误的,直接看就可以求出str1>str2
之所以出现上图的结果,原因是:str1、str2都是无符号数,所以它们永远大于0
所以,字符串比较直接求长度然后比较就好,代码如下:

 #include<stdio.h>
 #include<string.h>
 int main()
 {
 char *str1 = "abcdef";
 char *str2 = "cccc";
 if (strlen(str2) > strlen(str1))
 {
  printf("str2>str1\n");
 }
 else
 {
  printf("str1>str2\n");
 }
 return 0;
}

在这里插入图片描述

strcpy 字符串拷贝

char* strcpy(char* destination, const char* source);

源字符串必须以’\0’结尾,所以会将源字符串中的’\0’也拷到目标空间中
且目标空间可变
使用如下:

 char str1[20] = "abcdef";//目标空间必须可变,所以不能用 char *str1来定义了
 char *str2 = "hijk";
 printf("before:%s\n", str1);
 strcpy(str1, str2);//把str2拷贝到str1中
 printf("after:%s\n", str1);//结果是hijk

在这里插入图片描述

strcat 字符串追加(拼接)

不能自己给自己拼接

char* strcat ( char* destination, const char* source );
使用如下:

 char str1[20] = "abcdef";
 char *str2 = "hijk";
 printf("before:%s\n", str1);
 strcat(str1, str2);
 printf("after:%s\n", str1);

在这里插入图片描述

strcmp字符串比较

从左往右比较,比较的是字符的ASCII,与长度无关
int strcmp(const char* str1, const char* str2);
'\0’的ASCII比字符的ASCII小

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字(1)
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字(-1)

使用如下:

 const char *str1 = "abcdef";
 const char *str2 = "hijk";
 int ret = strcmp(str1, str2);
 printf("%d\n", ret);

a的ASCII比hdASCII小,所以直接返回-1在这里插入图片描述
注:判断两字符串是否相等,比较后是否为0

if0==strcmp(str1,str2)//一定要写 ==0
{
    printf("str1==str2\n");
}
else
 {
  printf("str1!=str2\n");
 }

strncpy 字符串拷贝

char* strncpy(char* destination, const char* source, size_t num);
//指定了要拷num元素

本身不考虑’\0’,所以拷几个元素就在源字符串从头覆盖几个元素,(strcpy中源字符串必须以’\0’结尾)
在这里插入图片描述

strncat 字符串追加(拼接)

char* strncat ( char* destination, const char* source, size_t num );
使用如下:

 char str1[20] = "abcd";
 const char *str2 = "hij";
 printf("before:%s\n", str1);
 strncat(str1, str2, 2);
 printf("after:%s\n", str1);

在这里插入图片描述

  • 可以给自己给自己拼接
    在这里插入图片描述

strncmp字符串比较

可以指定范围比较
int strncmp ( const char * str1, const char * str2, size_t num );

使用如下:(假如比较前4个)

 const char* str1 = "ab cd";
 const char* str2 = "ab def";
 int ret = strncmp(str1, str2, 4);
 printf("%d\n", ret);

d的ASCII比C大,所以结果为-1
在这里插入图片描述

strstr 查找子串

 const char* str = "abcdefghij";
 const char* str1 = "cde";
 char* ret = strstr(str, str1);//求str1是否为str的子串,找到之后,从子串起始位置开始返回
 char* ret1 = strstr(str, "bcd");//查找bcd是否为str的子串,...
 printf("ret:%s\n", ret);
 printf("ret1:%s\n", ret1);

在这里插入图片描述

strtok 字符串截取

char * strtok ( char * str, const char * delimiters );//参数一:字符串 参数二:分隔符

  • 调用一次strtok截取一个子串,第二次调用strtok,将第一个参数设置为NULL
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  • 如果字符串中不存在更多的标记,则返回NULL指针

使用如下:


 char str[] = "he_llo world,!";
 char* ch = strtok(str, " _,");//用多种分隔符截取(跟分隔符顺序没有关系)
 while (ch != NULL)
 {
  printf("%s\n", ch);
  ch = strtok(NULL, " _,");// 继续截取子串
 }

在这里插入图片描述

strerror

char * strerror ( int errnum );//参数为错误码

  • 通过strerror可以将错误码显示为错误码描述
  • 打开失败时,errno会被设置:没有错误,为0;有错误,errno会设置成对应的错误码(用strerror知道错误码描述)
  • 头文件是<errno.h>

在这里插入图片描述

  • 在VS2013平台上,有43个错误码
  • main函数的返回值叫进程的退出码
发布了73 篇原创文章 · 获赞 2 · 访问量 2869

猜你喜欢

转载自blog.csdn.net/weixin_43219708/article/details/103368676