当前位置:网站首页>C语言,怪题小谈
C语言,怪题小谈
2022-08-11 11:07:00 【C语言的前男友】
目录
序言:
学习了C语言这么久,遇到了一些第一次见让我大吃一惊的代码,有些是因为见得少,有些是真的好奇怪,今天就来盘点一下那些“变态”的代码。
一.越界死循环
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
大家可以看一下这段代码的的运行结果是什么?
在VS2022,的x86环境下Debug的版本是死循环的打印hehe。有没有想到呢?
我的第一反应也是,哎妈呀,数组访问越界了吗,这有什么好看的呀。程序肯定会崩溃呀。
但是事实并非如此。我们可以调试一下我们的代码看看代码的变量是怎样变化的,造成了死循环。
看到这里大家大胆的想一想,arr[12]和循环变量 i,是不是使用的同一块内存空间呢?
大家继续往后看,
没错他俩就是使用的一块空间, 在最后接近循环结束条件时,语句arr[12]=0;也会将i赋值位0;这样就使得永远无法达到循环结束条件,就陷入了死循环。
下面来看一看,arr数组和循环变量i在内存中的分布关系。
二.需要输入一个带有空格的字符串。
第一次因为不知道有gets()这个函数,真把我搞头疼了,硬生生的使用scanf输入,遇到空格就如停止输入了,
后面学会用gets()了,
但是其实使用scanf也是可以完成的,受到了一位大佬的指点。
int main()
{
char str[100];
scanf("%[^\n]", str);
printf("%s", str);
return 0;
}
//首先,scanf在接手字符串时,默认碰到空格就会结束,
//但是我们这里改变限制,改成遇见回车才结束。
scanf("%[^\n]", str);
首先,scanf在接手字符串时,默认碰到空格就会结束,但是我们这里改变限制,改成遇见回车才结束。
这里的限制不仅可以是回车,还可以是其他字符,
还挺有意思的吧,你学废了吗?学会的扣1,没学会的扣眼珠子。
三.getchar()清理缓冲区回车
第一次使用getchar()感觉还蛮好用的。
int main()
{
int ch1 = 'a';
ch1=getchar();
printf("ch = %c\n", ch1);
return 0;
}
紧接着又需要一个字符,我就又创建了一个变量,又使用了一次getchar();此时懵懂无知的我还没意识到事情的严重性。得意的Ctrl + F5 。
后来才知道,getchar(),是去缓冲区里面拿数据,而我们在输入的时候,最后会输入一个回车,而当我们下一次使用getchar()的时候,getchar(),就会直接从缓冲区拿走那个回车。解决办法也很简单,只需要,在第二次使用之前,在使用一次getchar(),先把回车吸收掉。后面的那次,getchar(),就可以正常的等待你区向缓冲区输入以后在接收了。
那要是缓冲区其他不需要的字符比较多怎么办?我们可以利用循环区吸收,清理缓冲区的内容。
//直到吸收完最后一个字符'\n'
while (getchar() != '\n');
当吸收完最后一个字符'\n'时,循环结束。
最后:
边栏推荐
- 4. 继承
- 宝塔计划任务执行周期设置【秒】为定时单位【或者更小】
- centos linux 下安装mysql 8.0
- 解决 Pocess finished with exit code 1 Class not found 和 Command line is too long. Shorten the command
- Cholesterol-PEG-FITC, Fluorescein-PEG-CLS, Cholesterol-PEG-Fluorescein water-soluble
- darknet 结构体汇总
- openresty概述及Lua语言的嵌入
- Spark Core
- 1.MySQL ----数据库的基础操作
- 好的架构是进化来的,不是设计来的
猜你喜欢
随机推荐
3. static成员
7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇
Neural network visualization has 3 d version of the, the United States to fall!(open source)
Analyzes how Flink task than YARN container memory limit
天花板级微服务大佬总结出这份451页笔记告诉你微服务就该这么学
和为s的连续正数序列
Neuropathic pain classification picture Daquan, neuropathic pain classification
Some time function records commonly used in mysql
本地开发好的 SAP UI5 应用部署到 ABAP 服务器时,中文字符变成乱码的原因分析和解决方案
LeetCode·每日一题·1417.重新格式化字符串·模拟
如何解决 “主节点故障恢复的自动化” 问题?
go语言学习:并发编程(定时器/select/并发安全锁)
I got the P8 "top" distributed architecture manual that went viral on Ali's intranet
a-upload上传图片
如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?
【2022】【论文笔记】基于激光直写氧化石墨烯纸的超薄THz偏转——
Getting Started with Chrome Plug-in Development - Nanny Level Raiders
或命名“狙击手” 长安全新皮卡申报图
从零开始配置 vim(12)——主题配置
Cholesterol-PEG-FITC,Fluorescein-PEG-CLS,胆固醇-聚乙二醇-荧光素水溶性