C语言中意想不到的地方——第七周作业
C语言中意想不到的地方
最近,知道了一些C语言中很奇怪的情况,或者说是让人意向不到的地方吧,就在这里分享给大家。
程序一
#include"stdio.h"int main(){char st[5];printf("input a string:\n");scanf("%s",st);printf("%s\n",st);return 0;}
在这个程序里,经凭借眼睛看,你认为st最多可以接受多少字符?5个?4个?在程序最多输入几个字符?同样是和st接受的字符相同?
但是实际的结果可能要让你失望了,都不是。你可以在你的编译器实验一下,会有让你意想不到的结果。当让不同的编译器之间的结果也会有所不同。我分别在Microsoft visual C++和Dev C++中尝试了一下。
visual C++中当输入的数字数目不大于9时程序都够正常运行,如图1,但是大于或等于9时虽然任然能够将输入的字符打印出来,却会出现一个对话框显示“出现了一个问题,导致程序停止正常工作。请关闭程序”如图2所示。
图1 程序一在visua C++l中正常运行 图2 程序一在visual C++中运行异常
在Dev C++中当输入字符小于等于16时能够正常运行,如图3所示,等于17时会再次让你输入字符,如图4所示。大于17时虽然任然能够将输入的字符打印出来,却会出现一个对话框显示“出现了一个问题,导致程序停止正常工作。请关闭程序”如图5所示。
图3 程序一在Dev C++中正常运行 图4 程序一在Dev C++中运行异常1
图5 程序一在Dev C++中运行异常2
其实这样的程序是错误的,要避免这个问题,可以将程序改成如下,就不会出现之前的问题了。
#include "stdio.h"int main(){char ch[5];printf("input a string\n");for(int i=0;i<4;i++)scanf("%c",&ch[i]);ch[4]='\0';printf("%s\n",ch);return 0;}
程序二
#include "stdio.h"#include int main(){char st[5],t[]="1234567890123";strcpy(st,t);printf("%s\n",st);scanf("%s",t);printf("%s\n",t);return 0;}
在这个程序中一样打印出来的st并不是想像中的那样,而是将数组t中的内容全部打印出来了。而对于接下来的操作不同的编译器呈现出来的结果是不一样的。
在Visual C++中接下来只要输入字符就会出现一个对话框显示“出现了一个问题,导致程序停止正常工作。请关闭程序”虽然也能答应出来,如图6所示。
图5 程序二在visual C++中运行异常
在Dev C++中当输入的字符数小于或等于46时,能够正常运行,如图7所示。并没有任何异常,而当输入的数目等于47时打印出来之后可以再次输入,如图8所示。当输入的字符大于47时虽然也能将输入的数据打印出来,但是会出现“出现了一个问题,导致程序停止正常工作。请关闭程序”的提示,如图9所示。
图7 程序二在Dev C++中正常运行 图8 程序二在Dev C++中运行异常1
图9 程序二在Dev C++中运行异常2/p>
变换程序
1、将代码第4行改为:
char t[]="1234567890123",st[5];
会发现在visual C++中输入字符小于等于16时,能够正常运行,如图10所示。输入字符大于17时,会出现“出现了一个问题,导致程序停止正常工作。请关闭程序”的提示,如图11所示。
图10 程序二变换程序1在visual C++中正常运行 图11 程序二变换程序1在visual C++中运行异常
2、将第7行的代码注释掉,会发现输出的t并不是我们想要的:1234567890123。在visual C++中输出90123如图12所示,在Dev C++中输出67890123如图13所示。
图12 程序二变换程序2在visual C++中运行 图13 程序二变换程序2在Dev C++中运行
程序三
#include "stdio.h"#include "string.h"int main(){char *field="abcd";char s[6];for(int i=0;i<strlen(field);++i){s[i]=field[i];}printf("%s\n",s);}
在该程序中打印出来的结果并不是想要的abcd,在DevC++中在abcd后会随机的出现一个字符。 如图14,15所示为两次运行的结果。
图14 程序三在Dev C++中第一次运行 图15 程序三在在Dev C++中第二次运行
以上三个的问题出现的主要的原因都是由于堆栈被破坏或者是没能理解堆栈分配问题造成的。
转载于:https://www.cnblogs.com/shely-Wangfan/p/5398259.html
C语言中意想不到的地方——第七周作业相关推荐
- 2019年春季学期第七周作业
A Q 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 2019春第七周作业 我在这个课程的目标是 尽可能了解并且应用指针及文件和数组的知识 这个作业在那个具体方面帮助我实现目标 大致掌 ...
- 学号20189220余超 2018-2019-2 《密码与安全新技术专题》第七周作业
学号20189220 余超 2018-2019-2 <密码与安全新技术专题>第七周作业--论文学习及报告总结 课程:<密码与安全新技术专题> 班级: 1892 姓名: 余超 学 ...
- 2017-2018-2 20179215《密码与安全新技术》第七周作业
2017-2018-2 20179215 <密码与安全新技术> 第七周作业 课程:<密码与安全新技术> 班级: 201792 姓名: 袁琳 学号:20179215 上课教师:谢 ...
- 厚基础Linux——第七周作业
文章目录 厚基础Linux--第七周作业 1.自建yum仓库,分别为网络源和本地源 环境规划 技术要求 需求分析 server端 client端 操作步骤 系统安装 server操作步骤 clinet ...
- 20189200余超 2018-2019-2 移动平台应用开发实践第七周作业
20189200余超 2018-2019-2 移动平台应用开发实践第七周作业 布局 在这一节中首先学习了java的页面布局,在此基础之上来进行了编程. 图片如下: 代码如下: *** 使用代码进行登录 ...
- 2019春第七周作业
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 要求我们掌握指针,可以更好的运用它 我在这个课程的目标是 学懂C语言,会编程一些简单的小应用 这个作业在那个具体方面帮助我实现目标 这 ...
- 20162302 第七周作业
20162302 2016-2017-2 <程序设计与数据结构>第七周学习总结 教材学习总结 复习以前的内容,修正代码中的错误 学习多态的用法 学习接口的相关内容,并创建多态引用 教材学习 ...
- 20169211《移动平台开发实践》第七周作业
教材学习内容总结 一.常见控件 Android控件的可见属性:所有的Android控件都具有这个属性,可以通过android:visibility进行指定,可选值有三种,visible.invisib ...
- 数据压缩第七周作业——JPEG编解码
目录 一.实验目的 二.实验原理 1.JPEG编码器:编辑 2.JPEG解码器 3.JPEG文件解析 三.实验内容 (1)调试和理解JPEG解码器程序 (2)理解程序设置 1.结构体理解 2.梳理代 ...
- 上海海事大学自动化专业C语言课程代码参考(第七周)
想不到这么快就到了新的一周,写上周的作业仿佛就在两天前 正好今天是1024程序员节,写C语言作业非常应景 这周的作业主要是循环,话不多说,直接开始吧! 目录 上机实验 4-1 求1到100的 ...
最新文章
- 闲鱼:3月24日至3月30日冻结涉欺诈用户1.8万个
- 花一天时间踩了node npm的一个坑
- 解决iPhone、iPad 或 iPod touch 无法连接Wi-Fi网络问题
- 便利蜂门店网络与 Rust 落地实践
- 阿里云软件著作权怎么登记申请?(注册步骤详细教程)
- 用pe做2012服务器系统教程,微软WDS网络启动PE做系统的服务器配置和PE修改教程...
- axis调用webservice
- 多媒体视频开发_(30)使用ffmpeg在视频中进行抽帧
- 代做matlab程序价格,代做data collection、Matlab设计代写、Matlab代做、代做Matlab编程代写R语言程序|代做R语言编程...
- 三层交换机原理及实验操作
- Java英语单词(5000个)
- ADC标准 INLDNL(1)
- Eclipse插件TPTP-程序Profile与分析工具详细教程
- 动力学矩阵法计算石墨烯声子谱
- 信息安全实训笔记1——身份认证技术
- 无穷微积分牵手“知识共享”,如虎添翼,所向无敌
- 拼多多数据分析面试题大合集(20个)
- java中break的用法
- Win10无法搜索应用解决
- 宇宙第一 IDE 霸主,换人了?