前言

简单记录一下C语言字符串相关内容,主要是容易忘记,记录于此,方便自己查阅。

正文

C语言中没有字符串类型,但有字符串。

字符串以字符串数组的形式存储的,且以空字符‘\0’为结束标志。

下面单独介绍字符串常量字符数组和字符串指针。

字符串常量

字符串常量:以 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
  1. 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
  2. strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;

    字符串长度,也就是字符个数!

字符指针

字符指针,就是char*指针。

  1. 可以指向字符数组

  2. 也可以指向字符串常量

#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
  1. 指针指向字符常量,不可以改变其中的值,

    常量存储在程序的只读数据段中,因此直接尝试修改这些字符可能会导致运行时错误或未定义行为

  2. 指针指向字符数组或动态分配的内存,是指向其第一个字符的地址

    针指向的是可修改的内存(如动态分配的内存或字符数组),则可以修改它所指向的内容。

还可以给指针开辟一个地址

#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()进行复制字符串。

相关函数还有其他。

  1. strcpy() 复制,s1的长度必须大于等s2

  2. strcat() 拼接 , s1长度必须大于s1+s2

  3. strlen() 字符串长度 ,s不允许为空指针NULL

  4. strcmp()字符串比较,如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。

  5. strchr()查找字符,返回第一个位置的指针,如果找不到返回NULL

  6. 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;
}

小结

  1. 字符串中一旦遇到转义字符’\0’就会停止,后面的字符都会丢弃

  2. 除了字符串常量外,其他所有字符串都必须存储于字符数组或动态分配的内存中。

参考文章

  1. c语言基础——–字符串指针

  2. C语言 — 字符串详解

相关文章

暂无评论

none
暂无评论...