天天看点

C语言之字符串一、字符串的几种定义方式及输出二、字符串的存储方式三、计算字符串中字符的个数(strlen)四、字符串几种常用的API

一、字符串的几种定义方式及输出

1.第一种方式

#include<stdio.h>

int main()
{
	int i;
	char str[5] = {'a','b','c','d','e'};
	for(i=0;i<sizeof(str)/sizeof(str[0]);i++){
		printf("%c", str[i]);
	}
	
	return 0;
}
           

2.第二种方式

#include<stdio.h>

int main()
{
	int i;
	char str2[5] = "abcde";
	for(i=0;i<sizeof(str2)/sizeof(str2[0]);i++){
		printf("%c", str2[i]);
	}
	
	return 0;
}
           

3.第三种方式

#include<stdio.h>

int main()
{
	int i;
	char str3[] = "abcde";	//数组元素个数不写,会根据真实大小默认分配 
	for(i=0;i<sizeof(str3)/sizeof(str3[0]);i++){
		printf("%c", str3[i]);
	}
	
	return 0;
}
           

4.第四种方式(推荐)

#include<stdio.h>

int main()
{
	//数组名就是地址(大多数情况下) 
	char *pstr = "hello world";
	printf("%s\n",pstr);	//字符串用格式占位符%s表示 

	return 0;
}
           

二、字符串的存储方式

字符串在内存中,除了有效字符以外,还会自动在后面补一个‘\0’,作为字符串的结束标志

三、计算字符串中字符的个数(strlen)

#include<stdio.h>
#include<string.h>

int main()
{
	char str[] = "abcde";
		
	printf("str的真实字母个数为:%d",strlen(str));
		
	return 0;
}
           

注:计算字符串长度时,不能用sizeof来计算字符串中有效字符的个数,应该用strlen,strlen在计算字符串大小的时候,遇到’\0’后,就结束计数

四、字符串几种常用的API

1.输出字符串:puts()、printf()

#include<stdio.h>
#include<string.h>

int main()
{
	char *str = "abcde";
	
	puts(str);
	printf("%s",str);
		
	return 0;
}
           

2.获取字符串:gets()、scanf()

#include<stdio.h>
#include<string.h>

int main()
{
	char str[128] = {'\0'};
	printf("请输入字符串:\n");
	scanf("%s",pstr);
	gets(pstr);
	
		
	return 0;
}
           

注:避免书写了野指针

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *pstr;	//野指针,会造成非法内存访问,会出现段错误
	pstr = (char *)malloc(128);	//解决野指针的方法 
	printf("请输入字符串:\n");
	//scanf("%s",pstr);
	gets(pstr);
	puts(pstr);
			
	return 0;
}
           

3.计算字符串长度:strlen()

#include<stdio.h>
#include<string.h>

int main()
{
	char str[] = "abcde";
		
	printf("str的真实字母个数为:%d",strlen(str));
		
	return 0;
}
           

4.字符串初始化;memset()

menset(初始化的对象,初始化成什么,初始化多大的空间);

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *pstr;	//野指针,会造成非法内存访问,会出现段错误
	pstr = (char *)malloc(128);	//申请了空间
	menset(pstr,'\0',128);	//初始化,把每一个元素都初始化为'\0' 
	
	printf("请输入字符串:\n");
	//scanf("%s",pstr);
	gets(pstr);
	puts(pstr);
			
	return 0;
}
           

注:一旦用了malloc就要注注意内存泄漏的问题

5.字符串拷贝:strcpy()、strncpy()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *str1 = "abcde";
	char str2[128] = {'\0'};

	strcpy(str2,str1);	//将str1的内容完全拷贝到str2 
	printf("复制字符串完毕,%s\n",str2);
	
	memset(str2,'\0',sizeof(str2)/sizeof(str2[0]));//重置字符串
	strncpy(str2,str1,2);//选择性拷贝
	printf("复制字符串的2个字符为,%s\n",str2); 
				
	return 0;
}
           

6.字符串拼接:strcat()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char str1[128] = "abcde";
	char *str2 = "12345";
	
	strcat(str1,str2);
	puts(str1);
			
	return 0;
}
           

7.字符串比较:strcmp()

str1 > str2        输出结果为:1 
str1 = str2        输出结果为:0
str1 < str2        输出结果为:-1 
           
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	int ret1,ret2,ret3;
	char *str1 = "1234";
	char *str2 = "123";
		
	char *str3 = "123";
	char *str4 = "123";
		
	char *str5 = "123";
	char *str6 = "1234";
	
	ret1 = strcmp(str1,str2);
	ret2 = strcmp(str3,str4);
	ret3 = strcmp(str5,str6);
	
	printf("ret = %d\n",ret1);
	printf("ret = %d\n",ret2);
	printf("ret = %d\n",ret3);
			
	return 0;
		
}
           

8.查找子字符串:strchr()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *str = "12345";
	char c = '3';
	char *p = NULL;
	
	p = strchr(str,c);
	if(p == NULL){
		printf("没有找到"); 
	}else{
		puts(p);
	}
	
	return 0;
		
}
           

注:找的是字符

9.查找子串:strstr()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *str = "12345";
	char *substr= "34";
	char *p = NULL;
	
	p = strstr(str,substr);
	
	if(p == NULL){
		printf("没有找到"); 
	}else{
		printf("找到\n");
		puts(p);
	}
	
	return 0;
		
}
           

注;找的是字符串

10.转为小写:strlwr()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char str[] = "HELLO WORLD";	//window下要定义成数组的形态
	puts(strlwr(str));

	return 0;
		
}
           

11.转为大写:strupr()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char str[] = "hello world";	//window下要定义成数组的形态
	puts(strupr(str));

	return 0;
		
}
           

12.字符串分割:strtok()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *p;
	char str[] = "luo,xian,yi";
	p = strtok(str,",");
	printf("获取到第1个串:p=%s\n",p);
	
	//获取第2个串的方法很奇葩,跟第1次不一样,目标字符串改成NULL
	p = strtok(NULL,","); 
	printf("获取到第2个串:p=%s\n",p);
	
	//获取第3个串的方法很奇葩,跟第2次一样 
	p = strtok(NULL,","); 
	printf("获取到第3个串:p=%s\n",p);
	

	return 0;
		
}
           

优化后的代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char *p;
	char str[] = "luo,xian,yi";
	p = strtok(str,",");
	int i = 2;
	
	if(p != NULL){
		printf("获取到第1个串:p=%s\n",p);
	}
	while(1){
		p = strtok(NULL,",");
		if(p != NULL){
			printf("获取到第%d个串:p=%s\n",i,p);
		}else{
			printf("没有子串了\n",p);
			break;
		}
		i++;		
	}
	
	return 0;
		
}
           

继续阅读