C语言学习笔记——字符串

字符串

本质是字符数组

定义方法:

#include 

int main()
{
	//定义字符串的第一种方式,类比整数数组
	char str[5] = {'a','b','c','d','e'};
	for(int i=0;i

字符串的存储方式:

#include 

int main()  //字符串在内存中,除了有效字符以外,还会自动在后面补一个'\0',作为字符串的结束标志
{
	int a[] = {1,2,3};  //整型数组,连续的空间,整个数组的大小是元素个数*元素类型大小
	
	printf("a数组的大小是:%d\n",sizeof(a));
	printf("数组的元素大小是:%d\n",sizeof(a[0]));
	printf("数组个数:%d\n",sizeof(a)/sizeof(a[0]));
	
	char a2[3] = {'a','b','c'};
	
	printf("a2数组的大小是:%d\n",sizeof(a2));
	printf("数组的元素大小是:%d\n",sizeof(a2[0]));
	printf("数组个数:%d\n",sizeof(a2)/sizeof(a2[0]));
	
	char a3[3] = "abc";
	printf("a3数组的大小是:%d\n",sizeof(a3));
	printf("数组的元素大小是:%d\n",sizeof(a3[0]));
	printf("数组个数:%d\n",sizeof(a3)/sizeof(a3[0]));
	
	char a4[] = "abc"; //不写数组长度,数组的大小会根据初始化时元素个数来确定
	printf("a4数组的大小是:%d\n",sizeof(a4));
	printf("数组的元素大小是:%d\n",sizeof(a4[0]));
	printf("数组个数:%d\n",sizeof(a4)/sizeof(a4[0])); //结果为4,多了一个字符,原因是 '\0' 代表字符串的结束标志
	
	int i = 0;
	while(a4[i] != '\0'){
		printf("%c",a4[i]);
		i++;
	}
	
	return 0;
}

sizeof 和 strlen在字符串计算中的区别:

#include 
#include 

//不能用sizeof来计算字符串中有效字符的个数
//应该用strlen,它在计算字符串大小的时候,遇到'\0'后结束计数

int main()
{
	int a[] = {1,2,3};
	printf("数组元素的个数是:%d\n",sizeof(a)/sizeof(a[0]));
	
	char a2[128] = "hello";
	printf("数组元素的个数是:%d\n",sizeof(a2)/sizeof(a2[0]));
	printf("数组中有效元素个数:%d\n",strlen(a2));
	return 0;
	
}

字符串几种常用的API:

1.puts ——输出字符串,与printf类似

#include 
#include 

int main()
{
	char *str = "hello world";
	
	puts(str);
	printf("%s\n",str);
	
	return 0;
	
}

2.gets/scanf ——获取字符串

char str[128] = {'\0'}; 在内存中申请了128byte, 初始化为'\0'

char *pstr :定义了一个指针,存放别的地址,是一个野指针

#include 
#include 

int main()
{
	// char *pstr; 野指针,造成非法内存访问,会出现段错误
	//char pstr[128] = {'\0'}; 可行的第一种方法
	
	char *pstr = null;
	pstr = (char *)malloc(128); //第二种方法,必须要开辟空间,内存是否合法
	printf("请输入字符串:\n");
	scanf("%s",pstr);
	puts(pstr);
	
	return 0;
	
}

3.strlen / sizeof ——计算长度

4.memset ——初始化

#include 
#include 

int main()
{
	// char *pstr; 野指针,造成非法内存访问,会出现段错误
	//char pstr[128] = {'\0'}; 申请空间;初始化,把每个元素初始化为'\0'
	
	char *pstr = NULL; 
	pstr = (char *)malloc(128); //1.申请空间 2.一旦用了malloc,一定要注意内存泄露的问题 3.malloc可能会失败要对返回值做判断	
	if(pstr == NULL){
		printf("申请内存失败\n");
		exit(-1);
	}
	memset(pstr,'/0',128);      //2.把每一项都初始化为'\0'
    //memset函数,有三个参数:初始化对象;初始化成什么字符;多大空间	
	
	printf("请输入字符串:\n");
	scanf("%s",pstr);
	puts(pstr);
	
	return 0;
	
}

5.strcpy / strncpy ——拷贝

strcpy原型声明:char *strcpy(char* dest, const char *src);

作用:把 src 所指向的字符串复制到 dest。

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

#include 
#include 

int main()
{
	char src[40];
	char dest[100];
	
	memset(dest,'\0',sizeof(dest));
	strcpy(src,"hello");
	strcpy(dest,src);
	
	printf("最终的字符串:%s\n",dest);
	
	return 0;
	
}

strncpy原型声明:char *strncpy(char *dest, const char *src, size_t n)

作用:把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。

有三个参数:

dest -- 指向用于存储复制内容的目标数组。

src -- 要复制的字符串。

n -- 要从源中复制的字符数

#include 
#include 

int main()
{
	char src[40];
	char dest[100];
	
	memset(dest,'\0',sizeof(dest));
	strcpy(src,"syzdsb");
	strncpy(dest,src,6);
	
	printf("最终的字符串:%s\n",dest);
	
	return 0;
	
}

6.strcat ——拼接

 strcat() 函数的声明:char *strcat(char *dest, const char *src)

作用:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

有两个参数:

dest:指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串;

src:指向要追加的字符串,该字符串不会覆盖目标字符。

#include 
#include 

int main()
{
	char src[40];
	char dest[40];
	
	strcpy(dest,"好好学习");
	strcpy(src,"天天向上");
	strcat(dest,src);
	
	printf("最终的字符串:%s\n",dest);
	
	return 0;
	
}

7.strmp ——字符串的比较

strcmp() 函数的声明:int strcmp(const char *str1, const char *str2)

有两个参数:

str1:进行比较的第一个字符串;

str2:进行比较的第二个字符串

返回值:

若str1

若str1=str2,返回值等于0;

若str1>str2,返回值大于0;

#include 
#include 

int main()
{
	char *str1 = "abc";  //是按 ASCII 值大小相比较
	char *str2 = "abcd";
	int ret = strcmp(str1,str2);
	printf("%d\n",ret);
	
	return 0;
	
}

8.strchr ——字符串的检索

strchr() 函数的声明:char *strchr(const char *str, int c)

作用:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置

有两个参数:

str:要被检索的c字符串

c:在str中要搜索的字符

返回值:该函数返回在字符串 str 中第一次出现字符 c 的指针,如果未找到该字符则返回 NULL

#include 
#include 

int main()
{
	char *str = "qieerbushe";
	char c = 'e';
	
	char *p = NULL;
	p = strchr(str,c);
	puts(p);
	
	return 0;
	
}

9.strstr——查找子串

strstr() 函数的声明:char *strstr(const char *haystack, const char *needle)

作用:在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'

两个参数:

haystack -- 要被检索的 C 字符串;

needle -- 在 haystack 字符串内要搜索的小字符串。

返回值:该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null

#include 
#include 

int main()
{
	char *str = "qieerbushe";
	char *substr = "bu";
	
	char *p = NULL;
	p = strstr(str,substr);
	puts(p);
	
	return 0;
	
}

10.strlwr ——转为小写

strlwr()函数的声明:char *strlwr(char *str);

作用:将字符串中的字符转换为小写

参数:str:要转换的字符串

返回值:返回转换后的小写字符串,就是将str返回

#include 
#include 

int main()
{
	char str[] = "QIEERBUSHE"; //Windows环境下不能定义为char *str = “”,会崩溃,而在Linux中可以
	puts(strlwr(str));
	
	return 0;
	
}

11.strupr ——转化为大写

strupr()函数的声明:char *strupr(char *str)

作用:将字符串中的字符转换为大写

参数:str:要转换的字符串

返回值:返回转换后的大写字符串

#include 
#include 

int main()
{
	char str[] = "qieerbushe"; 
	puts(strupr(str));
	
	return 0;
	
}

12.strtok ——字符串分割

strtok() 函数的声明:char *strtok(char *str, const char *delim)

作用:分解字符串 str 为一组字符串,delim 为分隔符

参数:

str -- 要被分解成一组小字符串的字符串;

delim -- 包含分隔符的 C 字符串;

返回值:该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

#include 
#include 

int main()
{
	char str[] = "qie,er,bu,she";
	char *p = NULL;
  /*p = strtok(str,",");
	printf("获取的第一个串p=%s\n",p);
	
	p = strtok(NULL,",");
	printf("获取的第二个串p=%s\n",p);  第二次开始目标字符串改成NULL*/
	
	p = strtok(str,",");
	while( p != NULL ){
		printf("%s\n",p);
		
		p = strtok(NULL,",");
	}
	
	return 0;
}

你可能感兴趣的:(c语言)