C语言:从键盘输入一个长度不定的字符串[C_004]
目录
背景:
Solution:
方案一:那就不要字符串
方案二:动态申请内存
背景:
在很多时候,会遇到从外部按要求输入字符串的情形,有些是明确了长度,有些只是给定了最大长度,而有些没有规定长度。对于那些给定的最大长度很长的情况,虽然我们可以定义一个很长的字符串,但是这样显得很机械,也很浪费内存空间,而对于没有规定最大长度的,我们甚至无法处理。
对于上述情况,本文提供两个解决途经。
Solution:
方案一:那就不要字符串
虽然在遇到问题时不能逃避,但我们也同样不能一味地和问题死磕,目的是解决问题,而上述的字符串本身,相较于我们正在处理的大问题,它便不是问题了。即,倘若可以不把输入全部以字符串的形式读到内存再处理,而是逐个读取,一边读取一边处理,那么上述问题便不存在了。
所以,在这种情况下,读字符串的问题便成了改变算法的问题。当然,在很多情况下,我们是需要把数据全部加载才能完成处理,或者有些情况是逐个读取并处理的算法比全部读取后再处理的算法复杂得多,这样的话字符串这个问题就跳不过了,所以有了方案二,直接解决字符串本身。
方案二:动态申请内存
之所以有这个问题,无非就两点:
1、具体需要读取的字符串长度不定,无法定义字符串。
2、如果定义一个很长的字符串,一是浪费内存,二是当数据很大时,依然有溢出的风险。
具体解决方法如下:
1、先申请一个较小的空间,如N*sizeof(char)。
2、从标准输入中逐个获取字符,放到申请的空间下,直到取到标准输入的末尾。
3、当字符串长度达到N-1时,重新申请一个长度为N=N+step的空间,将方才的字符串放到最前面,后面继续放入从标准输入中读取的字符。
4、重复步骤2和步骤3.
上述方法有两大好处:
1、既完成了不定长度字符串的读取,还不浪费内存,最多就浪费step字节,而step是自定义的,可以很小。
2、绝对不会造成溢出。
代码如下:
#include <stdio.h>
#include <string.h>int main()
{char* str = NULL;char temp;//每次申请内存的大小增幅int step = 5;//申请内存的大小int allStrLen = 5;str = malloc(allStrLen * sizeof(char));if (str == NULL) {printf("Failed to request memory!\n\r");return 1;}memset(str, 0, allStrLen);int loc = 0;while ((temp = getchar()) != '\n' && temp != EOF) {if (loc < allStrLen - 1) {*(str + loc) = temp;loc++;continue;}char* tempStr = malloc(allStrLen * sizeof(char));if (tempStr == NULL) {printf("The requested memory is too large!\n\r");free(str);return 1;}memset(tempStr, 0, allStrLen);memcpy(tempStr, str, loc * sizeof(char));free(str);allStrLen += step;str = malloc(allStrLen * sizeof(char));if (str == NULL) {printf("The input is too long. Failed to request memory!\n\r");return 1;}memset(str, 0, allStrLen);memcpy(str, tempStr, loc * sizeof(char));*(str + loc) = temp;loc++;free(tempStr);}printf("Final Input:\n\r%s\n\r", str);free(str);system("pause");return 0;
}
结果如图:
C语言:从键盘输入一个长度不定的字符串[C_004]相关推荐
- python输入一个三位数、输出它的逆序数值_c语言 从键盘输入一个三位数,输出该数的逆序数。c语言中从键盘输入一个三位整数...
c语言 从键盘输入一个三位数,输出该数的逆序数. c语言中从键盘输入一个三位整数 www.zhiqu.org 时间: 2020-12-08 c语言中从键盘输入一个三位数,输出该数的逆序数,可以 ...
- c语言从键盘输入一个百分制成绩score,C语言 基础练习40题
一.题目 1.输入2个整数,求两数的平方和并输出. 2. 输入一个圆半径(r)当r>=0时,计算并输出圆的面积和周长,否则,输出提示信息. 3.函数y=f(x)可表示为: 4.编写一个程序,从4 ...
- c语言从键盘输入一个整数判断是否为素数,键盘输入一个正整数,程式设计判断其是否为素数(即质数)...
键盘输入一个正整数,程式设计判断其是否为素数(即质数)以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 键盘输入一个正整数 ...
- C语言:从键盘输入一个正整数,将该数倒序输出。
/*从键盘输入一个正整数,将该数倒序输出.*/#include<stdio.h>int main() {int num,c;printf("请输入一个正整数:\n"); ...
- 输入一个四位数将其加密后输出c语言,从键盘输入一个四位数-按如下规则加密后输出...
<从键盘输入一个四位数-按如下规则加密后输出>由会员分享,可在线阅读,更多相关<从键盘输入一个四位数-按如下规则加密后输出(3页珍藏版)>请在人人文库网上搜索. 1.作业31. ...
- c语言从键盘输入一个不超过8位的正的十六进制数字符串,蓝桥基础练习 十六进制转十进制...
问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A.B.C.D.E.F表示. 样例输入 FFFF 样例输出 6 ...
- c语言从键盘输入一个百分制成绩score,C语言程序设计实验实验指导书及答案
1 <C语言程序设计>实验指导书 常熟理工学院 电气与自动化工程学院实验一 熟悉C程序运行环境 班级 学号 姓名 成绩 一.实验目的 1. 熟悉C语言Visual C++6.0调试环境. ...
- C语言 输入一个长度小于80的字符串,将字符串中的字母字符滤掉掉,并统计新生成串中包含的字符个数。
C语言实现:输入一个长度小于80的字符串,修改此字符串,将字符串中的字母字符滤掉掉,并统计新生成串中包含的字符个数.主函数如下,请实现函数fun. 主函数代码: #include <stdio. ...
- python输入一个英文句子、统计单词个数_C语言编程求一个英文句子中的单词数和最长单词的位置、长度及输出这个单词。c++编程 从键盘输入一个英文...
C语言编程求一个英文句子中的单词数和最长单词的位置.长度及输出这个单词. c++编程 从键盘输入一个英文 www.zhiqu.org 时间: 2020-11-23 我刚做了一关于英文句子里面每 ...
最新文章
- 做自适应网站专业乐云seo_乐云分享新站SEO优化实践经验,收录和排名持续稳定上升方...
- Android网络优化之HttpClient
- MATLAB 练习题 金币
- 计算机组成原理课后习题答案一
- Selenium Webdriver元素定位的八种常用方式
- 前端学习(2589):前端权限的设计思路
- 深度学习(05)--典型CNN结构(VGG13,16,19)
- 二逼了吧,你竟然在中断里面休眠
- 网页信息上传服务器,Unity 连接网页服务器 获取数据上传数据
- 神经网络常见问题和技巧(持续更新)
- 向日葵显示无法连接到服务器,请修复电信卡使用向日葵远程无法连接服务问题!!!...
- 分布式系统设计模式 - 预写日志(Write Ahead Log)
- 【Vue基础知识总结 6,我的支付宝3面+美团4面+拼多多四面
- iOS Charts库绘制曲线
- 【FPGA学习笔记】SignalTap II软件的使用
- 部署IIS网站HTTPS访问
- Xshell实现Windows上传文件到Linux主机的方法
- vscode插件(个人正在用的)
- Java编写的教室管理系统 带详细设计报告 功能非常齐全 完整源码
- 数据可视化编程题练习