C语言总结:C语言字符串练习题(十二种习题示例)
bigegpt 2024-12-03 10:23 5 浏览
本期分享C语言字符串练习题,字符串在存储上类似字符数组,今天就和大家一起学习一下字符串所涉及的一下操作练习。
C语言字符串全方位练习,涉及知识点:字符串解析、大小写判断、字符串插入、字符串删除、字符串排序、字符串转整数、字符串转浮点数、时间转换、GPS数据解析等等。
原文作者:51CTO丨DS小龙哥,链接:https://blog.51cto.com/u_11822586/5273575
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. 字符串替换
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"
};
-----------------------------------
写在最后:另外,对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
相关推荐
- 悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)
-
新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...
- 高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源
-
凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...
- 微服务架构实战:商家管理后台与sso设计,SSO客户端设计
-
SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...
- 还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑
-
在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...
- Seata源码—6.Seata AT模式的数据源代理二
-
大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...
- 30分钟了解K8S(30分钟了解微积分)
-
微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
-
一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...
- 一招解决所有依赖冲突(克服依赖)
-
背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...
- 你读过Mybatis的源码?说说它用到了几种设计模式
-
学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...
- golang对接阿里云私有Bucket上传图片、授权访问图片
-
1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...
- spring中的资源的加载(spring加载原理)
-
最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...
- Android资源使用(android资源文件)
-
Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...
- 如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)
-
深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...
- @Autowired与@Resource原理知识点详解
-
springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...
- java的redis连接工具篇(java redis client)
-
在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)