C语言编程题目(1)字符串格式化操作 手机键盘次数统计
题目如下:
本来遇到一些问题,还好都解决了。这里记录一下:
0x01 回顾gets、fgets、scanf函数的使用和区别
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(void) 5 { 6 char buffer[201]; 7 char *ptr; 8 ptr = gets(buffer); 9 printf("buffer length = %d, or %d, buffer = '%s',ptr = '%s'.\n",strlen(buffer),strlen(ptr),buffer,ptr);
10 return 0; 11 }
我们输入的字符串为'hello world!',共12个字符,完整的显示出来;值得注意的是gets函数返回值是一个字符串指针,指向输入的字符串,也就是buffer数组的首地址。
1 int main(void) 2 { 3 char buffer[65]; 4 char *ptr; 5 ptr = fgets(buffer,sizeof(buffer),stdin); 6 printf("buffer length = %d, or %d, buffer = '%s',ptr = '%s'.\n",strlen(buffer),strlen(ptr),buffer,ptr); 7 return 0; 8 }
我们输入的字符串为'hello world!',明明只有12个字符,却显示字符串长度竟然为13,打印字符串竟然意外换行(单引号另起一行可以看出),可见fgets函数和gets函数区别在于fgets可以读取最后的换行符为结尾使得buffer = “hello world!\n\0”,长度包括\n所占的一个字符。
其次,值得注意的是fgets函数控制输入字符的最大数目(fgets接受的第二个参数是输入字符的最大数目),这和gets函数相比具有较高的安全性,避免了缓冲区溢出的可能性:因为我把参数2设为sizeof(buffer)就完全不用担心输入长度超过buffer大小带来的溢出风险。而且,fgets函数第三个参数指定了从哪里读入一行字符(到换行符\n结束读),可以从打开的文件指针fp读出一行,也可以使用stdin从控制端输入。
1 int main() 2 { 3 char buffer[65]; 4 scanf("%s",buffer); 5 printf("buffer length = %d ,buffer = '%s'.\n",strlen(buffer),buffer); 6 return 0; 7 }
能看出来,scanf函数读取字符串以空格或者换行符为结尾,依次不适合用来读取带空格的长字符串。但是当已知输入字符串每行格式为固定形式的时候,可以定义好scanf格式化参数来分别接收分隔开的参数。例如学籍信息输入学生信息记录为:
学生姓名 学号 性别 专业 班级 ,拿上个例子继续优化scanf如下:
1 int main() 2 { 3 char buffer[65],buffer2[65]; 4 scanf("%s %s",buffer,buffer2); 5 printf("buffer length = %d ,buffer2 length = %d ,buffer = '%s',buffer2 = '%s'.\n",strlen(buffer),strlen(buffer2),buffer,buffer2); 6 return 0; 7 }
0x02 题目的解
先定义两个函数,一个函数根据输入的字符,对照键盘,得到打印字符需要的次数。另一个函数接受字符串参数,每个字符都调用第一个函数得到数字,值加和并返回直到末尾字符 '#' 。
1 int char_conv(char c) 2 { 3 if(c == 'a'||c == 'd'||c == 'g'||c == 'j'|| c == 'm'||c == 'p'||c == 't'||c == 'w'||c == ' ') 4 return 1; 5 else if(c == 'b'||c == 'e'||c == 'h'||c == 'k'||c == 'n'||c == 'q'||c == 'u'||c == 'x') 6 return 2; 7 else if(c == 'c'||c == 'f'||c == 'i'||c == 'l'||c == 'o'||c == 'r'||c == 'v'||c == 'y') 8 return 3; 9 else if(c == 's'||c == 'z') 10 return 4; 11 else 12 return 0; 13 } 14 15 int string_conv(const char *src , int length) 16 { 17 char temp='\0'; 18 int index = 0,mark=0; 19 while(index < length) 20 { 21 temp = src[index]; 22 if(temp == '#') 23 break; 24 mark += char_conv(temp); 25 index++; 26 } 27 return mark; 28 }
其次,确定主函数结构,使用gets函数接受字符串,并保存指针地址为ptr,调用已定义的函数计算出每个字符串的键盘敲击次数存入数组array;最后遍历array并打印:
1 int main() 2 { 3 int N=0,i=0; 4 char buffer[201],*ptr; 5 int array[10]; //假设最多输出10个字符串 6 7 8 scanf("%d",&N); 9 getchar(); //这行出乎人意料的重要,你可以注释掉这一行看看执行效果…… 10 for(i=0;i<N;i++) 11 { 12 ptr = gets(buffer); 13 array[i] = string_conv(ptr,strlen(buffer)); 14 memset(buffer,0,sizeof(buffer)); 15 } 16 i = 0; 17 while(i<N) 18 { 19 printf("%d\n",array[i]); 20 i++; 21 } 22 return 0; 23 }
运行结果:
原文地址:https://www.cnblogs.com/Higgerw/p/11422220.html
- 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的
- C#中?与??的区别
- 隐藏在程序旮旯中的“安全问题”
- 调用PostgreSQL存储过程,找不到函数名的问题
- C#调用C和C++函数的一点区别
- EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
- 合并求取分组记录的第一条数据
- 一个脑洞“颇大”的恶搞链接
- SQL 行列转换简单示例
- SQLSERVER 2012计算上一条,下一条数据的函数
- 使用命名管道实现进程间通信
- 获取SqlServer存储过程定义的3种方法
- 【自然框架】开源社区活动,会员注册的第一份代码!
- CentOS 7 安装Mono 和 MonoDevelop
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 逐行阅读Spring5.X源码(十二)AOP源码分析,难!面试官都不一定懂!
- 逐行阅读Spring5.X源码(十三)spring事务源码分析
- 线程池ThreadPoolExecutor 源码分析,面试官也就那么回事,他怎么敢!
- Spug - 轻量级自动化运维平台
- Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
- 优雅的drop掉mysql库中1TB大表
- 《剑指offer》第19天:股票交易(校对)
- SwiftyUserDefaults-封装系统本地化的框架推荐
- “使用多target来构建大量相似App”,唐巧大神理论验证(附工程代码地址)
- 小结:Swift、OC语言中多target在代码中如何区分
- 点击按钮每次都能实现图片的旋转和切换(swift)
- 多线程之NSOperation小结
- 判断一个坐标点是否在封闭曲线内的方法(swift)
- OC循环方法推荐-块循环遍历(比for循环好用)
- oc工程中oc、swift混编代码打包成静态framework踩坑笔记