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!