前言
简单记录一下C语言中字符串相关内容,主要是容易忘记,记录于此,方便自己查阅。
正文
C语言中没有字符串类型,但有字符串。
字符串常量
字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。
字符串常量是不可被修改的,一般用一对双引号(” “)括起的一串字符来表示字符串常量。
比如:
"" "Biumall" "笔友城堡(biumall.com)-记录美好生活"
“” 就是一个空的字符串常量,但是即使为空,还是存在一个终止符 NUL 的。
C 语言中,常用转义字符\0 来表示 NUL
字符串中如果有转义字符’\0′就会停止,后面的就会丢弃。
#include <stdio.h> #include <string.h> int main() { printf("%s\n", "Biumall\0笔友城堡"); printf("%lld\n", strlen("Biumall\0笔友城堡")); return 0; }
输出
Biumall 7
字符数组
用于存放字符的数组称为字符数组。
定义一个字符数组和定义一个普通数组一样。
char charArray[8] = { 'B', 'i', 'u', 'm', 'a', 'l', 'l', '\0' };
虽然存储字符串长度为5,但字符数组需要6位,末尾需要添加转义字符’\0′作为终止符。
除了上面写法,还可以使用字符常量初始化,这种更简单明了。
char charArray2[] = "Biumall";
下面打印长度
#include <stdio.h> #include <string.h> int main() { char charArray[] = { 'B', 'i', 'u', 'm', 'a', 'l', 'l', '\0' }; printf("strlen = %lld\n", strlen(charArray)); printf("sizeof = %lld\n", sizeof(charArray)); char charArray2[] = "Biumall"; printf("strlen = %lld\n", strlen(charArray2)); printf("sizeof = %lld\n", sizeof(charArray2)); return 0; }
输出结果
strlen = 7 sizeof = 8 strlen = 7 sizeof = 8
sizeof 操作符用于计算变量或类型的大小,一般单位为字节,通常用于计算内存大小。
对于char数组 : sizeof = 个数*1;//char类型占1个字节
对于int数组 : sizeof = 个数*4; //int类型占4个字节
sizeof不是函数!
#include <stdio.h> #include <string.h> int main() { int intArray[] = {1,2,3,4}; printf("intArray sizeof = %lld\n", sizeof(intArray)); char charArray[] = { '1','2','3','4'}; printf("charArray sizeof = %lld\n", sizeof(charArray)); return 0; }
intArray sizeof = 16 charArray sizeof = 4
strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;
字符串长度,也就是字符个数!
字符指针
字符指针,就是char*指针。
可以指向字符数组
也可以指向字符串常量
#include <stdio.h> #include <string.h> int main() { char charArray[8] = { 'B', 'i', 'u', 'm', 'a', 'l', 'l', '\0' }; //指向字符数组 char* strP_1 = charArray; printf("%lld\n", strlen(strP_1)); *strP_1 = 'C'; // 改变第一个字符的值为C printf("%s\n", strP_1); //指向字符串常量 char* strP_2 = "Biumall"; printf("%lld\n", strlen(strP_2)); //*strP_2 = 'C'; //错误,不可以改变 //printf("%s\n", strP_2); return 0; }
输出
7 Ciumall 7
指针指向字符常量,不可以改变其中的值,
常量存储在程序的只读数据段中,因此直接尝试修改这些字符可能会导致运行时错误或未定义行为
指针指向字符数组或动态分配的内存,是指向其第一个字符的地址
针指向的是可修改的内存(如动态分配的内存或字符数组),则可以修改它所指向的内容。
还可以给指针开辟一个地址
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char* strP; //分配地址,指向20个连续的存储空间 strP = (char*)calloc(20, sizeof(char)); //strP = (char*)malloc(20); if (NULL == strP) { printf("strP = NULL \n"); return; } printf("strP sizeof = %lld\n", sizeof(strP)); // 64位指针占8个字节 strcpy(strP, "biumall.com"); printf("%s\n", strP); //释放分配地址 free(strP); strP = NULL; return 0; }
这里用了strcpy()进行复制字符串。
相关函数还有其他。
strcpy() 复制,s1的长度必须大于等s2
strcat() 拼接 , s1长度必须大于s1+s2
strlen() 字符串长度 ,s不允许为空指针NULL
strcmp()字符串比较,如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
strchr()查找字符,返回第一个位置的指针,如果找不到返回NULL
strstr()查找字符串,返回找到后的第一个指针,如果找不到返回NULL
// 64位 #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char charArray_1[] = "biumall.com"; // 11 char charArray_2[] = "biumall"; char charArray_3[30]; printf("%lld\n", strlen(charArray_1));//11 printf("%lld\n", strlen(charArray_2));//7 printf("%lld\n", sizeof(charArray_1));//12 printf("%lld\n", sizeof(charArray_2));//8 //字符串拼接 //把charArray_1内容拷贝到charArray_3 //如果charArray_1长度大于charArray_3就会出现异常 strcpy(charArray_3, charArray_1); printf("%s\n", charArray_3); //biumall.com printf("%lld\n", strlen(charArray_3));//11 //字符串比较 //如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 int result_1 = strcmp(charArray_3, charArray_1); //0 printf("%d\n", result_1); int result_2 = strcmp(charArray_1, charArray_2); //1 printf("%d\n", result_2); int result_3 = strcmp(charArray_2, charArray_1); //-1 printf("%d\n", result_3); //字符串拼接 // charArray_2拼接在charArray_3后面 strcat(charArray_3, charArray_2); printf("%s\n", charArray_3);//biumall.combiumall printf("%lld\n", strlen(charArray_3));//18 //字符查找, //返回的是指针,可能存在找不到,返回NULL,如果找到返回从0开始计数的对应位置的指针 char* cP_1 = strchr(charArray_1, 'X'); //返回出现字符时的指针 if (NULL != cP_1) { printf("%lld\n", (cP_1 - charArray_1)); } else { printf("no find\n"); } char* cP_2 = strchr(charArray_1, 'm');//虽然有多个,但查到第一个字符时的指针 if (NULL != cP_2) { printf("%lld\n", (cP_2 - charArray_1));//3 } else { printf("no find\n"); } //字符串查找 //返回的是指针,可能存在找不到,返回NULL,如果找到返回从0开始计数的对应位置的指针 char* strP_1 = strstr(charArray_1, "biuX"); if (NULL != strP_1) { printf("%lld\n", (strP_1 - charArray_1)); } else { printf("no find\n"); } char* strP_2 = strstr(charArray_1, ".com"); if (NULL != strP_2) { printf("%lld\n", (strP_2 - charArray_1));//7 } else { printf("no find\n"); } return 0; }
小结
字符串中一旦遇到转义字符’\0’就会停止,后面的字符都会丢弃
除了字符串常量外,其他所有字符串都必须存储于字符数组或动态分配的内存中。
参考文章
《》
《