注意:可点击这个链接C语言你想知道的函数里面都有
目录
字符函数、字符串函数
求字符串长度
strlen
长度不受限制的字符串函数
strcpy
strcat
strcmp
长度受限制的字符串函数介绍
strncpy
strncat
strncmp
字符串查找
strstr
strtok
错误信息报告
strerror
内存操作函数
memcpy
memmove
memcmp
memset
字符函数和字符串函数
strlen函数
函数声明:size_t strlen ( const char * str );
作用:获取字符串长度
返回值:字符串的长度
注意事项:
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,是无符号的(返回的是字符串的长度)
/* strlen example */
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[256];
printf ("Enter a sentence: ");
gets (szInput);
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
strcpy函数
函数声明:char* strcpy(char * destination, const char * source );
作用:复制字符串(将source指向的 C 字符串复制到目标指向的数组destination中,包括终止的 ‘\0’ 字符(并在该点停止)。为避免溢出,目标指向的数组的大小应足够长,以包含与源相同的 C 字符串(包括终止空字符),并且不应在内存中与源重叠。)(将source复制到destination)
返回值:返回形参destination
注意事项:
1.源字符串必须以 ‘\0’ 结束。
2.会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变。(也就是目标空间内容不能是常量字符串,或者被const锁定的也不行)
/* strcpy example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]="Sample string";
char str2[40];
char str3[40];
strcpy (str2,str1);
strcpy (str3,"copy successful");
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
return 0;
}
strcat函数
函数声明:char * strcat ( char * destination, const char * source );
作用:连接字符串(将源字符串的副本追加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。)(将source追加到destination)
返回值:返回形参destination
注意事项:
1.源字符串必须以 ‘\0’ 结束。目标字符也是要以‘\0’结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。
/* strcat example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
}
strcmp函数
函数声明:int strcmp ( const char * str1, const char * str2 );
作用:比较两个字符串(将 C 字符串 str1 与 C 字符串 str2 进行比较。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止空字符。)
返回值:返回看注意事项
注意事项:
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
#include <stdio.h>
#include <string.h>
int main ()
{
char key[] = "apple";
char buffer[80];
do {
printf ("Guess my favorite fruit? ");
fflush (stdout);
scanf ("%79s",buffer);
} while (strcmp (key,buffer) != 0);
puts ("Correct answer!");
return 0;
}
strncpy函数
函数声明:char * strncpy ( char * destination, const char * source, size_t num );
作用:将源的第一个字符数复制到目标。如果在复制 num 个字符之前找到源 C 字符串的末尾(由 ‘\0’字符表示),则目标将填充零(也就是’\0’),直到总共写入 num 个字符为止。(将source复制到destination)
返回值:返回形参destination
注意事项:
1.拷贝num个字符从源字符串到目标空间。
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
3.这个和strcpy的区别就是可以指定源被复制的字节个数,char的大小是一个字节,也就是可以指定被复制的字符的个数。
/* strncpy example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]= "To be or not to be";
char str2[40];
char str3[40];
/* copy to sized buffer (overflow safe): */
strncpy ( str2, str1, sizeof(str2) );
/* partial copy (only 5 chars): */
strncpy ( str3, str2, 5 );
str3[5] = '\0'; /* null character manually added */
puts (str1);
puts (str2);
puts (str3);
return 0;
}
strncat函数
函数声明:char * strncat ( char * destination, const char * source, size_t num );
作用:从字符串追加字符(将source追加到destination)
返回值:返回形参destination
注意事项:
1.将源的第一个数字字符追加到目标,外加一个终止空字符。
2.如果源中 C 字符串的长度小于 num,则仅复制终止空字符之前的内容。
3.和strcat的区别就是可以指定追加字符的个数。
/* strncat example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[20];
char str2[20];
strcpy (str1,"To be ");
strcpy (str2,"or not to be");
strncat (str1, str2, 6);
puts (str1);
return 0;
}
strncmp函数
函数声明:int strncmp ( const char * str1, const char * str2, size_t num );
作用:比较两个字符串的字符(将 C 字符串 str1 的字符数与 C 字符串 str2 的字符数进行比较。此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同,直到达到终止的空字符。)
返回值:和strcmp类似
注意事项:
1.比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
2.与strcmp的区别就是这个函数可以指定比较字符的个数。
/* strncmp example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
int n;
puts ("Looking for R2 astromech droids...");
for (n=0 ; n<3 ; n++)
if (strncmp (str[n],"R2xx",2) == 0)
{
printf ("found %s\n",str[n]);
}
return 0;
}
strstr函数
函数声明:char * strstr ( const char *str1, const char * str2);
作用:查找子字符串(返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。)(也就是查找str2在str1中有没有)
返回值:返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针(NULL)。
注意事项:
1.返回值要搞清楚。
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
if (pch != NULL)
strncpy (pch,"sample",6);
puts (str);
return 0;
}
strtok函数
函数声明:char * strtok ( char * str, const char * sep );
作用:将字符串分割(sep就写入要分割的位置所要识别的字符)
返回值:
1.如果找到令牌(sep里所包含的字符),则指向令牌开头的指针。
2.当在正在扫描的字符串中到达字符串的末尾(即空字符’\0’)时,始终返回空指针。
注意事项:
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "zpengwei@yeah.net@666#777";
char copy[30];
strcpy(copy, arr);
char sep[] = "@.#";
char* ret = NULL;
for (ret = strtok(copy, sep); ret != NULL; ret=strtok(NULL, sep))
//这种方式更好,可以自己识别查询次数
{
printf("%s\n", ret);
}
//char* ret = strtok(copy, sep);
//printf("%s\n", ret);
//
//ret = strtok(NULL, sep);
//printf("%s\n", ret);
//ret = strtok(NULL, sep);
//printf("%s\n", ret);
return 0;
}
strerror函数
函数声明:char * strerror ( int errnum );
作用:获取指向错误消息字符串的指针
返回值:指向描述错误错误的字符串的指针
注意事项:
1.库函数在执行的时候,发生了错位,将一个错误码存放在errno这个变量中,errno是C语言提供的一个全局变量
2.而strerror函数就可以将错误码翻译成对应的错误信息,也就是一个字符串。
3.在发现代码有问题的时候,我们不知道是什么原因,那么我们就可以利用这个函数来确定我们错误的原因。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
//C语言中可以操作文件
//操作文件的步骤
//1. 打开文件
//2. 读/写
//3. 关闭文件
FILE* pf = fopen("data.txt", "r");
//fopen函数打开文件,r是只读的意思
//如果读取失败就会返回空指针
//并且错误码会传给errno,用strerror函数就可以把错误码转换成错误信息
if (pf == NULL)
{
printf("fopen: %s\n", strerror(errno));
perror("fopen");//这个函数和我上面写的printf函数作用一样
//,但是格式更完整,他自己就有fopen:
//fopen: xxxxxx
return 1;
}
//读文件
//...
//关闭文件
fclose(pf);
return 0;
}
内存操作函数
memcpy函数
函数声明: void * memcpy ( void * destination, const void * source, size_t num );
**作用:**复制内存块(显而易见,memcpy复制的是内存块,而strcpy复制的是字符串,也就是说memcpy可以复制字符串,整型数组,结构体等)将字节数的值从源指向的位置直接复制到目标指向的内存块。
**返回值:**返回形参destination。
注意事项:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。(source和destination不能有重叠,这是标准规定,但是现在在某些编译器里是可以重叠的,为了写的代码适应所有的编译器,建议不要重叠)
/* memcpy example */
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main ()
{
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, strlen(myname)+1 );
person.age = 46;
/* using memcpy to copy structure: */
memcpy ( &person_copy, &person, sizeof(person) );
printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
return 0;
}
memmove函数
函数声明: void * memmove ( void * destination, const void * source, size_t num );
**作用:**移动内存块(这个函数和memcpy唯一的区别就是这个函数的source和destination可以重叠)
**返回值:**返回形参destination。
注意事项:
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
/* memmove example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}
memcmp函数
函数声明: int memcmp ( const void * ptr1, const void * ptr2, size_t num );
作用:
1.比较两个内存块(显而易见这个函数与strcmp的区别就是strcmp只能比较字符串,而memcmp函数可以比较字符串,整型数组,结构体等)
2.将 ptr1 指向的内存块的前 num 字节数与 ptr2 指向的第一个字节数进行比较,如果它们都匹配,则返回零,如果不匹配,则返回一个不同于零的值,表示哪个值更大。
返回值:
返回一个整数值,该值指示内存块内容之间的关系:
返回值 表明
<0 两个内存块中不匹配的第一个字节在 PTR1 中的值低于 PTR2 中的值(如果评估为无符号字符值)
0 两个内存块的内容相等
>0 两个内存块中不匹配的第一个字节在 PTR1 中的值大于在 PTR2 中的值(如果评估为无符号字符值)
注意事项:
1.与 strcmp 不同,该函数在找到空字符后不会停止比较。
/* memcmp example */
#include <stdio.h>
#include <string.h>
int main ()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
return 0;
}