C语言总结_字符串练全方位练习

162 阅读7分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

C语言字符串全方位练习,涉及知识点:字符串解析、大小写判断、字符串插入、字符串删除、字符串排序、字符串转整数、字符串转浮点数、时间转换、GPS数据解析等等。

1. 计算空格、大小写字母

从键盘上输入一个字符串, 计算字符串里有多少个空格、小写字母、大写字母、数字。

 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 int main(int argc,char **argv)
 {
     int len=0;
     int i;
     char str[100];
     int cnt[5]={0};  //初始化赋值
     //scanf("%s",str); //从键盘上录入字符串,字符串结尾: '\0'
     //gets(str);       //从键盘上录入字符串
     fgets(str,100,stdin); //从键盘上录入字符串 (标准输入)
     
     //空格、小写字母、大写字母、数字 其他数据
     
     /*1. 计算字符串的长度*/
     while(str[len]!='\0')len++;
     printf("len1=%d\n",len);
     printf("len2=%d\n",strlen(str)); //计算字符串长度
     
     /*2. 处理字符串*/
     for(i=0;i<len;i++)
     {
         if(str[i]==' ')cnt[0]++;
         else if(str[i]>='a'&&str[i]<='z')cnt[1]++;
         else if(str[i]>='A'&&str[i]<='Z')cnt[2]++;
         else if(str[i]>='0'&&str[i]<='9')cnt[3]++;
         else cnt[4]++;
     }
     
     /*3. 打印结果*/
     printf("空格:%d\n",cnt[0]);
     printf("小写:%d\n",cnt[1]);
     printf("大写:%d\n",cnt[2]);
     printf("数字:%d\n",cnt[3]);
     printf("其他:%d\n",cnt[4]);
     return 0;
 }

2. 字符串排序

 示例:
 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 ​
 int main(int argc,char **argv)
 {
     int len=0;
     int i,j;
     char tmp;
     char str[100];
     fgets(str,100,stdin); //从键盘上录入字符串 (标准输入)
         
     /*1. 计算字符串的长度*/
     len=strlen(str); //计算字符串长度
     
     /*2. 字符串排序*/
     for(i=0;i<len-1;i++)
     {
         for(j=0;j<len-1-i;j++)
         {
             if(str[j]<str[j+1])
             {
                 tmp=str[j];
                 str[j]=str[j+1];
                 str[j+1]=tmp;   
             }
         }
     }
     
     /*3. 打印结果*/
     printf("%s\n",str); //打印字符串(标准输出)
     puts(str);     //打印字符串(标准输出)
     fputs(str,stdout);  //打印字符串(标准输出)
     return 0;
 }

3. 字符串插入

字符串插入: “1234567890” 在第2个位置后面插入”ABC” 最终结果: “12ABC34567890”

 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 int main(int argc,char **argv)
 {
     int i,j;
     int src_len;
     int new_len;
     /*
     123456789
     12    3456789
     */
     char src_str[100]="123456789";  
     char new_str[]="abcd";
     int addr=2; //插入的位置
     
     /*1. 计算字符串的长度*/
     src_len=strlen(src_str); //"123"
     new_len=strlen(new_str);
     
     /*2. 字符串移动*/
     for(i=src_len-1;i>addr-1;i--)
     {
         src_str[i+new_len]=src_str[i]; //向后移动 new_len
     }
     
     /*3. 插入新的数据*/
     for(i=0;i<new_len;i++)src_str[addr+i]=new_str[i];
     
     /*4. 打印字符串*/
     src_str[src_len+new_len]='\0'; //在字符串结尾添加'\0'
     printf("src_str=%s\n",src_str);
     return 0;
 }

4. 字符串查找

字符串查找: “123456123abc123hbc” 查找字符串”123”的数量。数量是3

 ​
 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 ​
 int main(int argc,char **argv)
 {
     char src_str[100];
     char find_str[10];
     int src_len=0,find_len=0;
     int i,j;
     int cnt=0;
     
     /*1. 录入字符串*/
     printf("输入源字符串:"); //123dufvdfv123dfljvb
     fgets(src_str,100,stdin); //从键盘上录入源字符串
     //scanf("%s",src_str);
     
     printf("输入查找的字符串:"); //123
     fgets(find_str,10,stdin); //从键盘上录入源字符串
     //scanf("%s",find_str);
     
     /*2. 计算长度*/
     src_len=strlen(src_str);
     src_str[src_len-1]='\0';
     src_len-=1; //src_len=src_len-1;
     
     find_len=strlen(find_str); //"123\n" =4
     find_str[find_len-1]='\0';
     find_len-=1;
     
     printf("源字符串:%s,%d\n",src_str,src_len);
     printf("查找的字符串:%s,%d\n",find_str,find_len);
     
     /*3. 查找字符串*/
     for(i=0;i<src_len-find_len+1;i++)
     {
         for(j=0;j<find_len;j++)
         {
             //只有一次不相等就退出 //123kdfvfd  123
             if(src_str[i+j]!=find_str[j])break;
         }
         if(j==find_len) //条件成立表示查找成功
         {
             cnt++;
             i+=find_len-1;//向后移动
         }
     }
     
     /*4. 打印查找结果*/
     printf("cnt=%d\n",cnt);
     return 0;
 }

5. 字符串删除

字符串删除: “1234567890” 删除”456” 最终结果: “1237890”

 示例:
 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 ​
 int main(int argc,char **argv)
 {
     char src_str[100];
     char del_str[10];
     int src_len=0,del_len=0;
     int i,j;
     int cnt=0;
     
     /*1. 录入字符串*/
     printf("输入源字符串:"); //123dufvdfv123dfljvb
     fgets(src_str,100,stdin); //从键盘上录入源字符串
     
     printf("输入查找的字符串:"); //123
     fgets(del_str,10,stdin); //从键盘上录入源字符串
     
     /*2. 计算长度*/
     src_len=strlen(src_str);
     src_str[src_len-1]='\0';
     src_len-=1; //src_len=src_len-1;
     
     del_len=strlen(del_str); //"123\n" =4
     del_str[del_len-1]='\0';
     del_len-=1;
     
     printf("源字符串:%s,%d\n",src_str,src_len);
     printf("删除字符串:%s,%d\n",del_str,del_len);
 ​
     /*3. 查找*/
     for(i=0;i<src_len-del_len+1;i++)
     {
         for(j=0;j<del_len;j++)
         {
             if(src_str[i+j]!=del_str[j])break;
         }
         if(j==del_len)
         {
             cnt++;
             /*4.删除*/
             for(j=i;j<src_len-del_len;j++)
             {
                 src_str[j]=src_str[j+del_len];
             }
             src_len-=del_len;
             i-=1; //继续在当前位置查找
         }
     }
     src_str[src_len]='\0';
     printf("src_str=%s\n",src_str);
     printf("cnt=%d\n",cnt);
     return 0;
 }

6. 字符串替换

 字符串”1234567890”
 将456替换为”888”
  最终: “1238887890”
 需要考虑3种情况

7. 字符串转整数。

从键盘上输入一个字符串”12345”, 得到整数: 12345;

 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 int string_to_int(char str[]);
 int main(int argc,char **argv)
 {
     int data;
     char str[]="125abcd";
     data=string_to_int(str);
     printf("data=%d\n",data);
     return 0;
 }
 ​
 /*
 函数功能: 字符串转为整数
 字符转为整数: -48 或者 -'0'
 ​
 1234
 */
 int string_to_int(char str[])
 {
     int value=0; //存放转换之后的结果
     int i=0;
     while((str[i]!='\0')&&(str[i]>='0'&&str[i]<='9'))
     {
         value*=10;
         value+=str[i]-'0';
         i++;
     }   
     return value;
 }

8. 整数转字符串

整数转字符串。输入一个整数1234,得到字符串: "1234"

 1234%10=4  1234/10=123 123%10=3 123/10=12
 示例:
 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 void int_to_string(char str[],int data);
 ​
 int main(int argc,char **argv)
 {
     char str[100];
     int_to_string(str,12345);
     printf("str=%s\n",str);
     return 0;
 }
 ​
 /*
 函数功能: 整数转为字符串
 函数参数:
     char str[]  //存放转换之后的整数(字符串)
     int data    //待转换的整数
 */
 void int_to_string(char str[],int data)
 {
     int i=0,j;
     char tmp;
     /*1. 将整数转为字符串*/
     while(data)
     {
         str[i]=data%10+'0';
         data/=10;
         i++;
     }
     str[i]='\0';
     
     /*2. 交换顺序*/
     for(j=0;j<i/2;j++)
     {
         tmp=str[j];
         str[j]=str[i-j-1];
         str[i-j-1]=tmp;
     }
 }

9. 浮点数转字符串

浮点数转字符串。输入一个浮点数123.456 得到字符串"123.456"

 示例:
 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 void float_to_string(char str[],float data);
 ​
 int main(int argc,char **argv)
 {
     char str[100];
     float_to_string(str,12345.123);
     printf("str=%s\n",str);
     return 0;
 }
 ​
 /*
 函数功能: 浮点数转为字符串
 函数参数:
     char str[]  //存放转换之后的 浮点数(字符串)
     int data    //待转换的 浮点数
 */
 void float_to_string(char str[],float data)
 {
     int i=0,j;
     char tmp;
     int addr;
     int int_data=data; //得到整数 12345
     int float_data=(data-int_data)*1000000;// 0.123456 *1000000 =123456
 ​
     /*1. 将整数部分转为字符串*/
     while(int_data)
     {
         str[i]=int_data%10+'0';
         int_data/=10;
         i++;
     }
     str[i]='.'; //添加小数点
     
     /*2. 交换顺序: 整数*/
     for(j=0;j<i/2;j++)
     {
         tmp=str[j];
         str[j]=str[i-j-1];
         str[i-j-1]=tmp;
     }
     
    /*3. 将浮点数部分转为字符串*/
    i++; //跨过小数点
    addr=i;
    while(float_data)
    {
         str[i]=float_data%10+'0';
         float_data/=10;
         i++;
    }
     str[i]='\0';
     
     /*4. 交换顺序: 小数部分*/
     for(j=0;j<3;j++)
     {
         tmp=str[addr+j];
         str[addr+j]=str[i-j-1];
         str[i-j-1]=tmp;
     }
 }

10.字符串转浮点数

字符串转浮点数。输入一个字符串: "123.456" 得到浮点数类型: 123.456

 #include <stdio.h>  //标准输入输出
 #include <string.h> //字符串处理头文件
 float string_to_float(char str[]);
 int main(int argc,char **argv)
 {
     float data;
     char str[]="123.456";
     data=string_to_float(str);
     printf("data=%f\n",data);
     return 0;
 }
 ​
 /*
 函数功能: 字符串转为浮点数
 字符转为整数: -48 或者 -'0'
 */
 float string_to_float(char str[])
 {
     int int_value=0; //存放转换之后的结果
     int float_value=0; 
     int i=0;
     float data;
     int cnt=0; //记录小数部分的数量
     int tmp=1;
     
     /*1. 整数部分*/
     while((str[i]!='\0')&&(str[i]>='0'&&str[i]<='9'))
     {
         int_value*=10;
         int_value+=str[i]-'0';
         i++;
     }
     
     /*2. 浮点数部分*/
     i++; //跨过小数点
     while((str[i]!='\0')&&(str[i]>='0'&&str[i]<='9'))
     {
         float_value*=10;
         float_value+=str[i]-'0';
         i++;
         cnt++;
     }
     
     for(i=0;i<cnt;i++)tmp*=10;
     
     data=int_value; //整数部分  
     data+=float_value/(tmp*1.0);
     return data;
 }

11. 时间转换

时间转换(秒与标准时间的转换)。 在代码里加入: #include <time.h> 头文件。‘ 调用time_t time(time_t *t);函数获取本地时间。 示例: unsigned int sec=time(NULL); //sec是获取到的秒单位时间 该时间是从1970年开始计算的。 什么是标准时间? 得到年-月-日 时:分:秒 本身: 数字电子钟。 RTC: 实时时钟。

#include <time.h>
time_t time(time_t *t);

Linux下日期修改:  
[root@wbyq code]# date -s "2018-12-24 21:09:20"
示例:
#include <stdio.h>  //标准输入输出
#include <string.h> //字符串处理头文件
#include <time.h>

int get_year(int year);
void sec_to_time(int sec);
void Get_Week(int sec);

//定义时间结构
int tm_sec;         /* seconds */
int tm_min;         /* minutes */
int tm_hour;        /* hours */
int tm_mday;        /* day of the month */
int tm_mon;         /* month */
int tm_year;        /* year */
int tm_wday;        /* day of the week */
int tm_yday;        /* day in the year */

int mon_p[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int mon_r[12]={31,29,31,30,31,30,31,31,30,31,30,31};

int main(int argc,char **argv)
{
	int sec1;
	int sec2;
	while(1)
	{
		sec1=time(NULL);//获取当前计算机系统的秒单位时间
		if(sec1!=sec2)
		{
			sec2=sec1;
			sec_to_time(sec2+8*60*60);
			printf("%d-%d-%d %d:%d:%d\n",
				  tm_year,
			      tm_mon,
				  tm_mday,
				  tm_hour,
				  tm_min,
				  tm_sec
				  );
		    printf("当前时间是当前年的第%d天\n",tm_yday);
		}
	}
	return 0;
}


/*
函数功能: 秒转标准时间
*/
void sec_to_time(int sec)
{
	int i;
	Get_Week(sec);
	
	/*1. 得到年份*/
	tm_year=1970;//基础年份
	while(sec>=365*24*60*60)
	{
		if(get_year(tm_year)) //闰年
		{
			if(sec>=366*24*60*60)
			{
				sec-=366*24*60*60; //减去一年
				tm_year++; //增加一年
			}
			else break;
		}
		else //平年
		{
			sec-=365*24*60*60; //减去一年
			tm_year++; //增加一年
		}
	}
	
	/*计算当前时间是一年中的第几天*/
	tm_yday=sec/(24*60*60);
	
	/*2. 得到月份*/
	tm_mon=1;
	for(i=0;i<12;i++)
	{
		if(get_year(tm_year)) //闰年
		{
			if(sec>=mon_r[i]*24*60*60)
			{
				sec-=mon_r[i]*24*60*60;
				tm_mon++;
			}
			else break;
		}
		else //平年
		{
			if(sec>=mon_p[i]*24*60*60)
			{
				sec-=mon_p[i]*24*60*60;
				tm_mon++;
			}
			else break;
		}
	}
	/*3. 天数*/
	tm_mday=1;
	while(sec>=24*60*60)
	{
		tm_mday++;
		sec-=24*60*60;
	}
	
	/*4. 小时*/
	tm_hour=0;
	while(sec>=60*60)
	{
		tm_hour++;
		sec-=60*60;
	}
	/*5. 分钟*/
	tm_min=0;
	while(sec>=60)
	{
		tm_min++;
		sec-=60;
	}
	/*6. 秒*/
	tm_sec=sec;
}

/*
函数功能: 获取年份状态: 平年和闰年
函数参数: year填年份
返回值: 0表示平年 1表示闰年
*/
int get_year(int year)
{
	if((year%400==0)||(year%4==0&&year%100!=0))
	{
		return 1;
	}
	return 0;
}

/*
函数功能: 获取星期
*/
void Get_Week(int sec)
{
	int day=sec/(24*60*60);
	switch(day%7)
	{
	case 0:
		printf("星期4\n");    
		break;
	case 1:
		printf("星期5\n");    
		break;
	case 2:
		printf("星期6\n");    
		break;
	case 3:
		printf("星期日\n");    
		break;
	case 4:
		printf("星期1\n");    
		break;
	case 5:
		printf("星期2\n");    
		break;
	case 6:
		printf("星期3\n");    
		break;
	}
}

12. GPS数据解析

 提取最基本的数据:
 (1) UTC时间
 (2) 海拔高度
 (3) 经纬度
 //GPS返回的数据格式如下
     char gps_data[]=
     {
         "$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F \
         $GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D \
         $GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37 \
         $BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A \
         $GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B \
         $GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C \
         $GPGSV,3,3,10,31,50,287,36,32,66,018,*7F \
         $BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62 \
         $GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D \
         $GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14 \
         $GNZDA,114955.000,06,11,2017,00,00*47 \
         $GPTXT,01,01,01,ANTENNA OK*35"
     };