今天我们来学习字符类型的函数
重点介绍处理字符和字符串的库函数的使用和注意事项
求字符串长度 strlen
长度不受限制的字符串函数 strcpy strcat strcmp
长度受限制的字符串函数介绍 strncpy strncat strncmp
字符串查找 strstr strtok
错误信息报告 strerror
以上是我们今天要学习的函数,好,让我们开始逐一介绍
strlen
函数介绍
size_t strlen ( const char * str );
这个函数是用来计算字符串长度的,字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。
上代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[]="dtduyahgkjfjav";
int len = strlen(str);
printf("%d",len);
return 0;
}
这样就算出来了。
现在大家来看这样一个代码
#include <stdio.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
仔细看这段代码。分别计算了两个字符串的长度,很明显,str1长于str2,所以这段代码的运行结果应该是<
答案揭晓:
恰恰相反,这是为什么呢?
原因是strlen的返回值类型是size_t,这是无符号类型,自然都是正数了。
模拟实现
#include<stdio.h>
int my_strlen(char* str)
{
int cnt = 0;
while (*str != '\0')
{
str++;
cnt++;
}
return cnt;
}
int main()
{
char arr[] = "asdfghjkl";
int len = my_strlen(arr);
printf("%d ", len);
return 0;
}
strcpy
char* strcpy ( char * destination , const char * source )
sgrcpy的用法是将一个字符串的字符复制到另一个字符串里。
直接上代码让大家直观感受:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "sbdakdlnjfefe";
char arr2[20] = "0";
strcpy(arr2, arr1);//将arr1中的内容拷贝到arr2中
printf("%s", arr2);
return 0;
}
注意事项:
模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char* str)
{
int cnt = 0;
while (*str != '\0')
{
str++;
cnt++;
}
return cnt;
}
int main()
{
char arr[] = "asdfghjkl";
int len = my_strlen(arr);
printf("%d ", len);
return 0;
}
strcat
char * strcat ( char * destination , const char * source );
这个库函数实现的是给一个字符串追加上另一端字符串
上代码:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
拼接成功,hello world
有一个问题,两个字符串的追加,一定是在末尾吗,编译器是怎么判断字符串的末尾的,其实,追加是往\0后边加。
看这个代码:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello\0xxxxxxxxx";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s", arr1);return 0;
}
按照我们之前想的,world应该加到先后边,但是我们看输出面板
依旧是helloworld,因为我们主动在world后边加了一个'\0',所以,可以得到,字符串的追加是从\0开始的.
注意事项:
模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "dsfd";
char arr2[20] = "ldmd";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcmp
int strcmp ( const char * p tr1 , const char * p tr2 );
这个函数用来比较两个字符串的大小
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "efewgg";
char arr2[] = "efwfe";
int ret = strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
模拟实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(char* dest, char* src)
{
assert(dest && src);
while (*dest=*src)
{
if (*dest == '\0')
{
return 0;
}
dest++;
src++;
}
if (*dest < *src)
{
return -1;
}
else
{
return 1;
}
}
int main()
{
char arr1[20] = "dfghjkla";
char arr2[20] = "asdfghjl";
int ret = my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
strncpy strncmp strncat
char * strncpy ( char * destination , const char * source , size_t num );
这个函数和strcpy长得很像,其实功能也差不多,区别就是它是可控的
strcpy
strcmp
strcat
这三个函数,都是长度不受限制的字符串函数
现在我们要说的是长度受限制的字符串函数
strncpy
strncmp
strncat
有数字的限制
话不多说直接上代码
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "efewgg";
char arr2[5] = { 0 };
strncpy(arr2, arr1, 3 );
printf("%s", arr2);
return 0;
}
加了数字3的控制,只拷贝了3个字符
其他两个函数也是一样,大家举一反三就可以理解了。
strstr
char * strstr ( const char * str1 , const char * str2 );
这个函数的作用是在字符串str1中找到字符串str2第一次出现的位置,如果没有,返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[5] = "bcd";
char *p=strstr(arr1, arr2);
if (p == NULL)
{
printf("找不到!\n");
}
else
{
printf("%s\n", p);
}
return 0;
}
模拟实现
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
char* s1 = NULL;
char* s2 = NULL;
char* cp = (char*)str1;
while (*cp)
{
s1 = cp;
s2 = (char*)str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdebcdf";
char arr2[] = "bcd";
char* p = my_strstr(arr1, arr2);
if (p == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", p);
}
return 0;
}
strcok
char * strtok ( char * str , const char * sep )
这个函数的作用就是根据特殊符号分割字符串
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "lwenchao@yeah.net";
char buf[30] = { 0 };//lwenchao@yeah.net
strcpy(buf, arr);
const char* p = "@.";
char* str = strtok(buf, p);
printf("%s\n", str);
str = strtok(NULL, p);
printf("%s\n", str);
str = strtok(NULL, p);
printf("%s\n", str);
return 0;
}
根据@和 . 将字符串分割成了三部分。
strerror
char * strerror ( int errnum );
返回错误码,所对应的错误信息。
让我们上代码来测试一波
#include<stdio.h>
#include<string.h>
#include <errno.h>//必须包含的头文件
int main()
{
char* p = strerror(0);
printf("%s\n", p);
p=strerror(1);
printf("%s\n", p);
p = strerror(2);
printf("%s\n", p);
p = strerror(3);
printf("%s\n", p);
return 0;
}
为什么会输出这些东西呢?
每一个错误码,都有一个错误信息,strerror函数就是告诉你错在了哪里
其实,C语言在调用函数的时候,如果调用失败,会把错误码存放在一个叫errno的变量中。
当我们想知道错在哪了时,就可以调用错误码翻译成错误信息
好的字符串函数就介绍完了,下棋借着东风接着讲述内存函数。