下面是自我测试
- | "hello word"字符串,我只要"word"怎么实现
- | “hello wang"与"hello li”,我想要比较这两个字符串前面4个字符是不是一样的,怎么弄
- | 我想把"hello word"的一段"hello"复制到另一个字符数组怎么弄
- | 我想把"hello wang"的"hello"替换成"hi"怎么实现
- | 字符串连接函数
- | str2的前N个字符连接到str1后面
- | 比较两个字符串的ASCLL码大小
- | 将str2复制到str1里面
- | 将str2前N个字符复制到str1里面
- | 返回str1与str2第一个匹配的字符的下标
- | 返回字符串长度
- | 比较str2是不是str1的子字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
1:memchr()
{
1:void *memchr(const void *str, int c, size_t n)
2:str=字符串的前 n 个字节
3:c = 所需寻找的字符
4:n = 查找的长度
返回值:第一次出现字符 c的地址
作用:截取字符串
}
2:memcmp()
{
1:int memcmp(const void *str1, const void *str2, size_t n))
2:把str1和str2的前n个字节进行比较
返回值:与strcmp类似
}
3:memcpy()
{
1: void *memcpy(void *str1, const void *str2, size_t n)
2: const类型str2复制前n个字符到str1 //注意str1最好是未赋值的空间.因为赋值后的空间就不能改了!
作用:截取前N字节!
//为保准str2的数据不被破坏,str2为const类型!
}
4;memmove()效果与memcpy一致!
{
1:void *memmove(void *str1, const void *str2, size_t n);
2:memmove()比memcpy()更安全
//注意:str1不能有内容,否则str1就是""的const类型,从而不能被写入数据!
}
5:memset()
{
1:void *memset(void *str, char c, size_t n)
2:str的前n个字符都用字符c替换!
//注意:汉字是2字节字符!
}
6:strcat()
{
1: char *strcat(char *str1, const char *str2)
2: str2接在str1后面!
//注意内存溢出
}
7:strncat()
{
1:char *strncat(char *str1, const char *str2, size_t n);
2:将str2的前N个字节接在str1的后米
}
8:strchr()与memchr()的区别
{
1:memchar是指代大小不确定的空间
2:strchar是指代大小已经知道的字符串
3:char *strchr(const char *str, int c)
4:返回str第一次出现字符c的地址!
}
9:strcmp //注意比较的是ASCLL之和,小写字符的ASC > 大写字母ASC
10:strcoll //与strcmp的效果用法一致!
11;strcpy(char * str1,const char* str2) //将str2复制到str1;
12;strncpy(char * str1,const char* str2,int n) //将str2的前n字节复制到str1;
13:strcspn()
{
参数一:char * str1;
参数二:char * str2;
返回值;返回与str1第一个匹配的字符的下标
}
14:strerror(errno)
{
printf("%s",strerror(errno)); //打印错误号对应的错误信息!
}
15:strlen() 以\0结尾返回字符串长度
16:strpbrk(const char * str1,const char * str2)
{
返回值:第一个与str1匹配到的str2地址,然而strcspn是返回str1的匹配字符的地址
}
17:strrchr(char * str,char Eng)
{
返回值:返回str中最后一次出现Eng的地址;
}
18:strspn(const char *str1, const char *str2)
{
注意:
const char *str1 --> 表示字符串
char * str1 --> 可能表示字符串,可能表示字符
返回值:str1中第一个匹配str2的字符的下标!
}
19:strstr(const char *str1, const char *str2)
{
如果str2是str1的子字符串,则返回子字符串第一次出现的地址!
如果str2不是str1的子字符串,则返回一个空指针 = (NULL);
}
20:strtok(const char *str1, const char *str2)
{
根据str2作为划分界限,将str1切分划出一个小字符串!
并将小字符串的地址作为返回值返回;
此时原str1字符串不变
如果需要在变化的基础上再分 --> strtok(NULL,str2)
当返回值 == 空指针 == NULL时,表示str1不可再分!
}
注意:
有指针指向的字符数组是const类型,不能
没有指针指向的字符数组
*/
void Str_Text1()
{
char *Str = "hello word!";
char* Frist_Show;
Frist_Show = memchr(Str, 'o', strlen(Str));
printf("字符%c后面的字符串是%s",Frist_Show[0],Frist_Show);
}
void Str_Text2()
{
char* Name1 = "yqj";
char* Name2 = "zyj";
int Sign = memcmp(Name1, Name2, 1);
if (Sign >0)
{
printf("yqj的姓Y > zyj的姓Z");
}
else
{
printf("yqj的姓Y < zyj的姓Z");
}
}
void Str_Text3()
{
char Name1[10] = {NULL};
char* Name2 = "zyj";
memcpy(Name1, Name2, 2);
printf("姓氏:%s", Name1);
}
void Str_Text4()
{
char Name1[10];
char* Name2 = "zyj";
memcpy(Name1, Name2, strlen(Name2));
//输出str1
for (size_t i = 0; i < strlen(Name2); i++)
{
printf("%c", Name1[i]);
}
}
void Str_Text5()
{
char Name1[10] = "zyj";
memset(Name1, 'A', 2);
puts(Name1);
}
void Str_Text6()
{
char Name1[20] = "zyj";
char Name2[20] = "yqj";
strcat(Name1, Name2);
puts(Name1);
}
void Str_Text7()
{
char Name1[20] = "zyj";
char Name2[20] = "yqj";
strncat(Name1, Name2,4);
puts(Name1);
}
void Str_Text8()
{
char Name1[20] = "hello word";
char* p;
p = strchr(Name1, ' ');
printf("'%c'后续的字符串是%s",p[0],p);
}
void Str_Text9()
{
char Name1[20] = "hello word";
char Name2[20] = "Hello word";
if (strcmp(Name1,Name2) == 1 )
{
printf("hello word > Hello word");
}
else
{
printf("hello word < Hello word");
}
}
void Str_Text10()
{
char Name1[20] = "hello word";
char Name2[20] = "Hello word";
if (strcoll(Name1, Name2) == 1)
{
printf("hello word > Hello word");
}
else
{
printf("hello word < Hello word");
}
}
void Str_Text11()
{
char Name[20];
char Name1[20] = "hello word";
strcpy(Name, Name1);
printf("%s", Name);
}
void Str_Text12()
{
char Name[20] = {NULL};
char Name1[20] = "hello word";
strncpy(Name, Name1,5);
for (size_t i = 0; i < strlen(Name); i++)
{
printf("%c", Name[i]);
}
}
void Str_Text13()
{
char Name[20] = "Hello word";
char Name1[20] = "hello word";
int Sign = strcspn(Name, Name1);
printf("第一个匹配到的字符下标是:%d --> 字符是:%c" ,Sign,Name[Sign]);
}
void Str_Text14()
{
FILE* fp = NULL;
fp = fopen("xxx.txt", "r");
if (fp == NULL)
{
printf("ERROR:%s", strerror(errno));
}
}
void Str_Text15()
{
char* Engs = "zyj";
printf("字符串长度:%d", strlen(Engs));
}
void Str_Text16()
{
char* Engs1 = "abcdf4567";
char* Engs2 = "lj4g";
char *Eng;
Eng = strpbrk(Engs1, Engs2);
printf("匹配到的字符是%c", Eng[0]);
}
void Str_Text17()
{
char* Engs = "www.baidu.com";
char* p;
p = strrchr(Engs,'.');
printf("'%c'最后一次出现的位置后的字符串是:%s", p[0], p);
}
void Str_Text18()
{
char* Engs1 = "HELLO WORD";
char* Engs2 = "HELLO Word!";
size_t Sub;
Sub = strspn(Engs1, Engs2);
printf("第一个未匹配到的字符是第%d个字符,对应的字符是%c",Sub,Engs1[Sub-1]);
}
void Str_Text19()
{
char* Engs1 = "hello the word!";
char* Engs2 = "then";
char* p;
p = strstr(Engs1,Engs2);
printf("%s", p);
}
void Str_Text20()
{
char Engs1[20]= "www.baidu.com";
char Engs2[2] = ".";
char* p = NULL;
p = strtok(Engs1, Engs2);
while (p!=NULL)
{
printf("\n%s", p);
p = strtok(NULL, Engs2);
}
}
void STRING_TEXT()
{
//memchr()的使用方法
//Str_Text1();
//memcmp()的使用方法
//Str_Text2();
//memcpy()的使用方法
//Str_Text3();
//memmove()的使用方法
//Str_Text4();
//memset()的使用方法
//Str_Text5();
//strcat()使用方法
//Str_Text6();
//strncat()使用方法
//Str_Text7();
//strchr()使用方法
//Str_Text8();
//strcmp()使用方法
//Str_Text9();
//ctrcoll()使用方法
//Str_Text10();
//strcpy()使用方法
//Str_Text11();
//strncpy()使用方法
//Str_Text12();
//strcspn()使用方法
//Str_Text13();
//strerror(errno)使用方法
//Str_Text14();
//strlen()使用方法
//Str_Text15();
//strpbrk()使用方法
//Str_Text16();
//strrchr()使用方法
//Str_Text17();
//strspn()使用方法
//Str_Text18();
//strstr()使用方法
//Str_Text19();
//strtok()使用方法
//Str_Text20();
}