淘宝客做的好的几个网站,网站设计中怎么显示链接内容,什么是体验营销,wordpress模板如何前言#xff1a;
其实在c语言当中是没有字符串这一概念的#xff0c;不像c里面有string类型用来存放字符串。在c语言中我们只能把字符串放在字符串常量以及字符数组中。
1.常见字符串函数
1.1strlen
size_t strlen ( const char * str );作用#xff1a;用来求字符串中 …前言
其实在c语言当中是没有字符串这一概念的不像c里面有string类型用来存放字符串。在c语言中我们只能把字符串放在字符串常量以及字符数组中。
1.常见字符串函数
1.1strlen
size_t strlen ( const char * str );作用用来求字符串中 \0 前面出现的字符个数不包 含 \0 )。
这里我们要注意的是在定义字符数组的时候我们需要给‘\0’留出空间因为编译器会在字符串后面加一个‘\0’。
#includestdio.h
#includestring.h
int main() {char arr[5] asdfg;printf(%zd\n, strlen(arr));return 0;
} 我们可以看到如果我们没有手动在字符串后面加一个‘\0并且还没有预留出一个位置用来编译器自动放‘\0的时候strlen在计算字符串大小的时候就会出错。
所以在使用strlen的时候我们要注意字符串末尾是否有‘\0要么是自己手动添加要么是留出位置空间给编译器自动添加。
当然这种不初始化空间大小方式也可以编译器会自动给留出空间放’\0
char arr[] asdfg;
printf(%zd\n, strlen(arr));
还需要注意的是strlen函数的返回值类型是size_t而不是int.
size_t和int有什么区别呢
size_t是无符号整数也就意味着没有负数这一概念. 1.2.strcpy
char* strcpy(char * destination, const char * source );
这个是字符串复制函数将source指向地址的字符覆盖destination指针指向的地址的元素以source字符串的‘\0结束。
要注意的是
1.目标字符串的空间一定要足够。
2.源字符串一定以’\0结尾。
3.会将源字符串中的 \0 拷贝到目标空间 1.3.strcat
char * strcat ( char * destination, const char * source );字符串追加函数用来在目标字符串后面接上源字符串
通俗的来说就是达到“abcdefabcdef这一目的。 注意
1.源字符串必须以 \0 结束。
2.目标空间必须有足够的大能容纳下源字符串的内容。
3.目标空间必须可修改。
4.字符串不可以自己给自己追加。
为什么不可以自己给自己追加呢
首先我们要知道strcat函数追加的原理是在目标字符串的‘\0处开始追加直到源字符串的’\0被追加过去后马上停止。也就意味着如果是自己追加自己在开始追加的时候就把目标字符串的‘\0’给覆盖了由于目标字符串和源字符串是一个东西所以发现源字符串的’\0‘找不到了。所以就会出错。
1.4.strcmp
int strcmp ( const char * str1, const char * str2 )
字符串比较函数标准规定 第一个字符串大于第二个字符串则返回大于0的数字 第一个字符串等于第二个字符串则返回0 第一个字符串小于第二个字符串则返回小于0的数字。
那如何比较呢
其实就是从第一个字符串开始比较字典序大小遇到不一样的就停止。
const char* str1 abcdef;
const char* str2 abc;const char* str3 abcdef;
const char* str4 abd;const char* str5 abc;
const char* str6 abc;
printf(%d\n, strcmp(str1, str2));
printf(%d\n, strcmp(str3, str4)); 以上都是我们比较常用的一些字符串函数下面来介绍一些升级版的字符串函数。
1.5.strncmp
char * strncpy ( char * destination, const char * source, size_t num );
我们发现它跟strcmp函数很像而且同样也是实现字符串的比较功能但是strncmp可以控制比较的长度第三个参数表示只比较前num个字符的大小。
const char* str1 abcdef;
const char* str2 abc;
printf(%d\n, strncmp(str1, str2,3)); 1.6.strncat
char * strncat ( char * destination, const char * source, size_t num );跟strcat函数很像而且同样也是实现字符串的追加功能但是前者可以控制追加的长度第三个参数表示只追加源字符串前num个字符。
char arr1[20] xxxxxxxxx;
char arr2[5] asdff;
printf(%s\n, strncat(arr1, arr2,2)); 1.7.strncpy
拷贝num个字符从源字符串到目标空间。如果源字符串的长度小于num则拷贝完源字符串之后在目标的后边追加0直到num个。
1.8.strstr
char * strstr ( const char *str1, const char * str2);
查找字符串str1里面有没有出现str2所指字符串如果有返回首次出现的位置。
#include stdio.h
#include string.h
int main ()
{char str[] This is a simple string;char * pch;pch strstr (str,simple);strncpy (pch,sample,6);puts (str);return 0;
} 1.9.strtok
char * strtok ( char * str, const char * sep );这个函数大家见的可能比较少这是分割函数。
就是将一个字符串按照一个分割符集合去分割成各个部分。
1.sep参数是个字符串定义了用作分隔符的字符集合 。
2.第一个参数指定一个字符串它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
3.strtok函数找到str中的下一个标记并将其用 \0 结尾返回一个指向这个标记的指针。注 strtok函数会改变被操作的字符串所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。
4.strtok函数的第一个参数不为 NULL 函数将找到str中第一个标记strtok函数将保存它在字符串 中的位置。
5.strtok函数的第一个参数为 NULL 函数将在同一个字符串中被保存的位置开始查找下一个标 记。
6.如果字符串中不存在更多的标记则返回 NULL 指针。
使用strtok将字符串分割 char str[] - This, a sample string.;char * pch;printf (Splitting string \%s\ into tokens:\n,str);pch strtok (str, ,.-);while (pch ! NULL){printf (%s\n,pch);pch strtok (NULL, ,.-);}char *p zhangpengweibitedu.tech;const char* sep .;char arr[30];char *str NULL;strcpy(arr, p);//将数据拷贝一份处理arr数组的内容for(strstrtok(arr, sep); str ! NULL; strstrtok(NULL, sep)){printf(%s\n, str);}strtok 函数会返回分割后的子字符串的指针如果没有可分割的字符串返回 NULL。请注意在每次调用 strtok 函数时第一个参数传入 NULL以便获取剩余的分割字符串。
2.常见内存函数
什么叫内存函数
内存函数是指在 C 语言中用来操作内存的一组函数。这些函数允许开发者对内存进行分配、拷贝、比较和设置等操作以满足程序的需求。
常见的内存函数包括
malloc用于动态分配指定大小的内存空间。calloc用于动态分配指定数量和大小的内存空间并将分配的内存初始化为零。realloc用于重新调整之前动态分配的内存空间的大小。free用于释放之前动态分配的内存空间。memcpy用于将源内存区域的内容复制到目标内存区域。memcmp用于比较两个内存区域的内容是否相同。memset用于将指定内存区域的内容设置为指定的值。memmove:用于在内存中移动一块数据的内容。
这里我只讲后面几个。 2.1.memcpy
void * memcpy ( void * destination, const void * source, size_t num );函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠复制的结果都是未定义的。
不同于strcpy,memcpy可以复制任何类型的数据。
#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;
}2.2.memmove
memmove 是一个 C 语言库函数用于在内存中移动一块数据的内容。它的函数原型如下
void *memmove(void *dest, const void *src, size_t n);
1.dest 是目标内存区域的指针数据将被复制到此处。
2.src 是源内存区域的指针要复制的数据来自此处。
3.n 是要复制的字节数。
memmove 函数将源内存区域中的数据复制到目标内存区域。与 memcpy 不同的是memmove 函数可处理源和目标内存区域重叠的情况确保数据被正确复制。
#include stdio.h
#include string.hint main() {char str[10] Hello;// 使用 memmove 将字符 o 移动到字符串开头memmove(str, str4, 2);printf(%s\n, str); // 输出结果 oHellreturn 0;
} 2.3.memcmp
内存比较函数比较从ptr1和ptr2指针开始的num个字节在num个字节之前遇到不相等的就停下返回值和strcmp一致。
int memcmp ( const void * ptr1,const void * ptr2,size_t num );char buffer1[] DWgaOtP12df0;char buffer2[] DWGAOTP12DF0;int n;nmemcmp ( buffer1, buffer2, sizeof(buffer1) );if (n0) printf (%s is greater than %s.\n,buffer1,buffer2);else if (n0) printf (%s is less than %s.\n,buffer1,buffer2);else printf (%s is the same as %s.\n,buffer1,buffer2);