C语言-字符串处理

1. 前言

字符串在C语言里使用非常多,因为很多数据处理都是文本,也就是字符串,特别是设备交互、web网页交互返回的几乎都是文本数据。

字符串本身属于字符数组、只不过和字符数组区别是,字符串结尾有’\0’。 字符串因为规定结尾有'\0',在计算长度、拷贝、查找、拼接操作都很方便。

2. 字符串的定义

char buff[]="我是一个字符串";
char a[]="1234567890";
char b[]="abc";
char c[]={'a','b','c','\0'};

在普通的字符数组结尾加一个 \0 就变成了字符串。

3. 处理字符串里字母大小写

将字符串里所有大写字母全部换成小写字母。或者小写字母全部换成大写字母。可以通过形参进行区分。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(char *str,int flag);
int main()
{
	char buff[100];
	printf("从键盘上输入字符串:");
	scanf("%s",buff);
	printf("源字符串:%s\n",buff);
	func(buff,0);
	printf("大写转换小写:%s\n",buff);
	func(buff,1);
	printf("小写转大写:%s\n",buff);
	return 0;
}

//函数功能: 大写小写转换
//flag=0表示大写转换小写  =1表示小写转大写
void func(char *str,int flag)
{
	int data;
	while(*str!='\0')
	{
		if(flag)
		{
			if(*str>='a'&& *str<='z') //小写
			{
				*str=*str-32;
			}
		}
		else
		{
			if(*str>='A'&& *str<='Z') //小写
			{
				*str=*str+32;
			}
		}
		str++;
	}
}

4. 从键盘上录入2个字符串,判断是否相等

#include <stdio.h>
int main()
{
	char str1[100];
	char str2[100];
	int i=0;
	/*1. 录入数据*/
	printf("输入字符串1:");
	scanf("%s",str1);
	printf("输入字符串2:");
	scanf("%s",str2);
	/*2. 比较字符串*/
	while(str1[i]!='\0'||str2[i]!='\0')
	{
		if(str1[i]!=str2[i])break;
		i++;
	}
	if(str1[i]=='\0'&&str2[i]=='\0')
	{
		printf("字符串相等.\n");
	}
	else
	{
		printf("字符串不相等.\n");
	}
	return 0;
}

5. 从键盘上录入一个字符串,按照小到大的顺序排序

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

int main()
{
	char str1[100];
	int len=0;
	int i,j;
	int tmp;
	printf("输入要排序的字符串:");
	scanf("%s",str1);
	len=strlen(str1);
	//开始排序
	for(i=0;i<len-1;i++)
	{
		for(j=0;j<len-1-i;j++)
		{
			if(str1[j]>str1[j+1])
			{
				tmp=str1[j];
				str1[j]=str1[j+1];
				str1[j+1]=tmp;
			}
		}
	}
	printf("排序之后的字符串:%s\n",str1);
	return 0;
}

6. 从键盘上输入一个整数:将整数转为字符串输出

比如:int a; scanf(“%d”,&a); 使用字符串形式打印出a的值。

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

int main()
{
	char str[100];
	char str1[100];
	int data=0;
	int j=0,i=0;
	printf("从键盘上输入整数:");
	scanf("%d",&data);
	// 123 -->'1' '2' '3'
	while(data)
	{
		str[i++]=data%10+'0';
		data=data/10;
	}
	for(j=0;j<i;j++)
	{
		str1[j]=str[i-j-1];
	}
	str1[j]='\0';
	printf("str1=%s\n",str1);
	return 0;
}

7. 从键盘上输入一个字符串,转为整数输出

#include <stdio.h>
#include <string.h>
int main()
{
	//"123"
	char str[100];
	int data=0;
	int i=0;
	printf("从键盘上输入字符串:");
	scanf("%s",str);
	while(str[i]!='\0')
	{
		data*=10;//data=0 data=10 data=120
		data+=str[i]-'0';//data=1 data=12 data=123
		i++;
	}
	printf("data=%d\n",data);
	return 0;
}

8. 字符串删除

从键盘上录入一个字符串,删除字符串里指定的单词,输出结果。

比如:原字符串 ”akjbcds123dfjvbf123fdvbfd123”

删除单词:“123”

输出的结果:”akjbcdsdfjvbffdvbfd”

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

int main()
{
	char str1[100];
	char str2[100];
	int i=0,j=0;
	int str2_len=0;
	/*1. 录入数据*/
	printf("输入源字符串:");
	scanf("%s",str1);
	printf("输入要删除的字符串:");
	scanf("%s",str2);
	/*2. 计算要删除字符串的长度*/
	str2_len=strlen(str2);
				
	/*3. 查找字符串*/
	for(i=0;str1[i]!='\0';i++)
	{
		//比较字符串
		for(j=0;str2[j]!='\0';j++)
		{
			if(str1[i+j]!=str2[j])break;
		}
		if(str2[j]=='\0')
		{
			//4. 删除字符串---后面向前面覆盖
			for(j=i;str1[j]!='\0';j++)
			{
				str1[j]=str1[j+str2_len];
			}
			str1[j]='\0';
			i--;
		}
	}
	//5. 输出结果
	printf("str1=%s\n",str1);
	return 0;
}

9. 字符串插入

从键盘上录入一个字符串,从指定位置插入一个字符串,再输出结果。

比如:原字符串“1234567890”

(1). 从指定位置插入新的单词。 比如 从第2个下标插入一个“ABC”字符串。

结果: “123ABC4567890”

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

int main()
{
	char str1[100];
	char str2[100];
	int addr=0;
	int str1_len;
	int str2_len;
	int i;
	/*1. 录入数据*/
	printf("录入源字符串:");
	scanf("%s",str1);
	printf("录入要插入的字符串:");
	scanf("%s",str2);
	printf("输入要插入的下标位置:");
	scanf("%d",&addr);
	str1_len=strlen(str1); //3
	str2_len=strlen(str2); //2
	
	/*2. 完成插入*/
	//完成数据移动
	for(i=str1_len-1;i>=addr;i--)
	{
		str1[i+str2_len]=str1[i];
	}
	//数据替换
	for(i=0;i<str2_len;i++)
	{
		str1[i+addr]=str2[i];
	}
	str1[str1_len+str2_len]='\0';
	/*3. 输出数据*/
	printf("str1=%s\n",str1);
	return 0;
}

10. 字符串替换

从键盘上录入一个字符串,将指定单词替换成想要的单词。

比如:原字符串“123jfvfdj123dkfvbfdvdf”

想要将“123”替换成“888”或者“8888”或者“88”

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

int main()
{
	char str1[100];
	char str2[100];
	char str3[100];
	int str1_len=0;
	int str2_len=0;
	int str3_len=0;
	int i,j;
	int cnt=0;
	/*1.准备数据*/
	printf("输入源字符串:");
	scanf("%s",str1);
	printf("输入查找的字符串:");
	scanf("%s",str2);
	printf("输入替换的字符串:");
	scanf("%s",str3);
	/*2. 计算长度*/
	str1_len=strlen(str1);
	str2_len=strlen(str2);
	str3_len=strlen(str3);
	/*3. 字符串替换*/
	for(i=0;i<str1_len;i++)
	{
		//查找字符串
		for(j=0;j<str2_len;j++)
		{
			if(str1[i+j]!=str2[j])break;
		}
		//如果查找成功就进行替换
		if(j==str2_len)
		{
			//总长度变短了
			if(str2_len>str3_len)
			{
				cnt=str2_len-str3_len; //差值
				//完成数据向前移动--覆盖
				for(j=i+str2_len-cnt;j<str1_len;j++)
				{
					str1[j]=str1[j+cnt];
				}
				str1[str1_len-cnt]='\0';
			}
			//总长度变长了
			else if(str2_len<str3_len)
			{
				cnt=str3_len-str2_len; //差值
				//完成数据向后移动
				for(j=str1_len;j>=i+str2_len;j--)
				{
					str1[j+cnt]=str1[j];
				}
				str1[str1_len+cnt]='\0';
			}
			//替换
			for(j=0;j<str3_len;j++)
			{
				str1[i+j]=str3[j];
			}
			//重新计算长度
			str1_len=strlen(str1);
		}
	}
	/*4. 完成字符串打印*/
	printf("str1=%s\n",str1);
	return 0;
}
上一篇:QT乱翻书-QStringDemo


下一篇:matlab修改读取mat文件后的变量名