赞
踩
本期分享C语言字符串练习题,字符串在存储上类似字符数组,今天就和大家一起学习一下字符串所涉及的一下操作练习。
C语言字符串全方位练习,涉及知识点:字符串解析、大小写判断、字符串插入、字符串删除、字符串排序、字符串转整数、字符串转浮点数、时间转换、GPS数据解析等等。
原文作者:51CTO丨DS小龙哥,链接:https://blog.51cto.com/u_11822586/5273575
从键盘上输入一个字符串, 计算字符串里有多少个空格、小写字母、大写字母、数字。
- #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;
- }
- 示例:
- #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;
- }
字符串插入: “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;
- }
字符串查找: “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;
- }
字符串删除: “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;
- }
从键盘上输入一个字符串”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;
- }
整数转字符串。输入一个整数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;
- }
- }
浮点数转字符串。输入一个浮点数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;
- }
- }
字符串转浮点数。输入一个字符串: “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;
- }
时间转换(秒与标准时间的转换)。
在代码里加入: #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;
- }
- }
- 提取最基本的数据:
- (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"
- };
-----------------------------------
写在最后:另外,对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
C语言C++编程学习交流圈子,QQ群:946108597【点击进入】微信公众号:C语言编程学习基地
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。