目录
一、字符串函数
1.strcpy
函数名: strcpy
功 能: 将src字符串拷贝至dest所指的地址
用 法: char *strcpy(char *dest, const char *src);
返回值: 返回参数dest的字符串起始地址strcpy将src字符串结尾'\0'一同复制到dest中;
该函数未指定复制的字节数,当dest字符串太小无法完全存储src,可能会造成缓冲溢出的错误情况,不过可以使用strncpy()来取代;程序例:
#include <stdio.h>
#include <string.h>int main()
{
char s1[20];
char s2[] = "abcdef";
strcpy(s1, s2);
printf("%s\n", s1); // 输出:abcdef
return 0;
}
2.strncpy
函数名: strncpy
功 能 : 将字符串src前n个字符拷贝到字符串dest
用 法 : char* strncpy(char* dest, const char* src, size_t n);
返回值: 返回参数dest的字符串起始地址
strncpy()不会向dest追加结束标记'\0';
src和dest所指的内存区域如果重叠,数据会重叠导致循环复制,dest必须有足够的空间放置n个字符;程序例:
#include <stdio.h>
#include <string.h>int main()
{
char string[10] = "";//初始化为'\0'
char* str1 = "abcdef";
strncpy(string, str1, 3);
printf("%s\n", string);//输出abc
return 0;
}
3.strcat
函数名: strcat
功 能: 将src字符串接到dest字符串结尾处
用 法: char *strcat(char *dest, const char *src);
返回值: 返回dest字符串起始地址strcat() 会将参数src字符串复制到参数dest所指的字符串尾部;
dest最后的结束字符'\0'会被覆盖掉,并在连接后的字符串的尾部再增加一个'\0';
dest与src所指的内存空间不能重叠,且dest要有足够的空间来容纳要复制的字符串;程序例:
#include <stdio.h>
#include <string.h>int main()
{
char des[20] = "str";
char src[] = "cat";
strcat(des, src);
printf("%s\n", des); // 输出:strcat
return 0;
}
4.strncat
函数名: strncat
功 能: 将src字符串前n个字符接到dest字符串结尾处
用 法: char *strncat(char *dest, const char *src, size_t n);
返回值: 返回dest字符串起始地址strncat()将会从字符串src的开头拷贝n个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串;
如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部;
strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0';程序例 :
#include <stdio.h>
#include <string.h>int main()
{
char des[20] = "str";
char src[] = "cat";
strcat(des, src, 2);
printf("%s\n", des); // 输出:strca
return 0;
}
5.strlen
函数名: strlen
功 能: 计算指定的字符串s的长度,不包括结束字符'\0'
用 法: size_t strlen(const char *s);
返回值: 返回字符串s的字符数strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束;
如果没有初始化字符串,将会得到一个随机值,因为查找处没有'\0',它会从首地址一直找下去,直到遇到'\0'停止;
而sizeof返回的是变量声明后所占的内存数,不是实际长度(只看内存大小),此外sizeof不是函数,仅仅是一个操作符,strlen()是函数;程序例:
#include <stdio.h>
#include <string.h>int main()
{
char* str = "abcdef";
int sl = strlen(str);
printf("%d\n", sl);//输出6
return 0;
}
6.strstr
函数名: strstr
功 能 : 检索子串在字符串中首次出现的位置
用 法 : char* strstr(char* str, char* substr);
返回值: 返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULLsubstr若是数字,所搜索的将是该数字(作为ASCII码)代表的字符;
该函数是二进制安全的;
该函数对大小写敏感。如需进行大小写不敏感的搜索,请使用 stristr()。程序例 :
#include <stdio.h>
#include <string.h>int main()
{
char des[20] = "stringstring";
char src[20] = "gst";
printf("%s\n", strstr(des, src, 2));//输出:gstring
return 0;
}
7.strcmp
函数名: strcmp
功 能 : 字符串比较
用 法 : int strcmp(const char* s1, const char* s2);
返回值: 根据ASCII码比较,若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值该函数区分大小写,如需进行大小写不敏感的字符串比较,可以使用stricmp函数
程序例 :
#include <stdio.h>
#include <string.h>int main()
{
char* a = "aBcDeF";
char* b = "AbCdEf";
char* c = "aacdef";
char* d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b)); // 输出:1
printf("strcmp(a, c) : %d\n", strcmp(a, c)); // 输出:-1
printf("strcmp(a, d) : %d\n", strcmp(a, d)); // 输出:0
return 0;
}
8.strtok
函数名: strtok
功 能 : 根据分界字符组将字符串分割成一个个片段
用 法 : char* strtok(char* s, const char* delim);
返回值: 返回下一个分割后的字符串指针,如果已无从分割则返回NULL当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为'\0'字符;
在第一次调用时,strtok()必须赋予参数s字符串,往后的调用则将参数s设置成NULL,所以将一个字符串完全分割往往需要多次调用该函数;
程序例 :#include <stdio.h>
#include <string.h>int main()
{
char s[] = "ab_cde=fg";
char* delim = "_=";
char* p;
for (strtok(s, delim); strtok(NULL, delim); )
{
;
}
printf("%s %s %s", s, s+3, s+7);//输出:ab cde fg
}
二、内存操作函数
1.memcpy
函数名: memcpy
功 能 : 实现src到dest的复制
用法 :void* memcpy(void* dest, const void* src, size_t n)
返回值 : 返回指向dest的指针如果目标区域与源区域重叠,该函数复制可能会将源区域的内容修改导致复制错误;
strcpy和memcpy主要有以下3方面的区别:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
2、复制的方法不同。strcpy不需要指定长度。它遇到被复制字符的串结束符"0"才结束,所以容易溢出;
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。#include <stdio.h>
#include <string.h>int main()
{
const char src[20] = "memcpy";
char dest[20];memcpy(dest, src, sizeof(src));
printf("dest = %s\n", dest);//输出dest = memcpyreturn 0;
}
2.memmove
函数名: memmove
功 能 : 从str2复制n个字符到str1
用法 :void* memmove(void* dest, const void* src, size_t n)
返回值 :返回指向dest的指针目标区域与源区域重叠memmove依旧可以正常复制。
#include <stdio.h>
#include <string.h>int main()
{
char str[] = "memmove hello";
memmove(str + 6, str + 8, 5);
puts(str);//输出memmovhelloloreturn 0;
}
3.memcmp
函数名: memcmp
功 能 : 把存储区 str1 和存储区 str2 的前 n 个字节进行比较
用法 :int memcmp(const void* str1, const void* str2, size_t n)
返回值 :如果返回值 < 0,则表示 str1 小于 str2;
如果返回值 > 0,则表示 str1 大于 str2;
如果返回值 = 0,则表示 str1 等于 str2。#include <stdio.h>
#include <string.h>int main()
{
char str1[15] = "ABC";
char str2[15] = "abc";
int ret;ret = memcmp(str1, str2, 5);
if (ret > 0)
{
printf("str2 小于 str1");
}
else if (ret < 0)
{
printf("str1 大于 str2");
}
else
{
printf("str1 等于 str2");
}
//str1 大于 str2return(0);
}
4.memset
函数名: memcmp
功 能 : 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符
用法 :void* memset(void* str, int c, size_t n)
返回值 :如果返回值 < 0,则表示 str1 小于 str2;n的值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
int main()
{
char str[20];strcpy(str, "hi boy");
puts(str);//输出hi boymemset(str, '$', 2);
puts(str);//$$ boy
return(0);
}