栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言,怪题小谈

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言,怪题小谈

目录

序言:

一.越界死循环

 二.需要输入一个带有空格的字符串。

三.getchar()清理缓冲区回车

最后:


序言:

学习了C语言这么久,遇到了一些第一次见让我大吃一惊的代码,有些是因为见得少,有些是真的好奇怪,今天就来盘点一下那些“变态”的代码。

一.越界死循环
#include 
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("hehen");
	}
	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 = %cn", ch1);
	return 0;
}

 

 紧接着又需要一个字符,我就又创建了一个变量,又使用了一次getchar();此时懵懂无知的我还没意识到事情的严重性。得意的Ctrl + F5 。

后来才知道,getchar(),是去缓冲区里面拿数据,而我们在输入的时候,最后会输入一个回车,而当我们下一次使用getchar()的时候,getchar(),就会直接从缓冲区拿走那个回车。解决办法也很简单,只需要,在第二次使用之前,在使用一次getchar(),先把回车吸收掉。后面的那次,getchar(),就可以正常的等待你区向缓冲区输入以后在接收了。

 那要是缓冲区其他不需要的字符比较多怎么办?我们可以利用循环区吸收,清理缓冲区的内容。

//直到吸收完最后一个字符'n'
while (getchar() != 'n');

当吸收完最后一个字符'n'时,循环结束。

最后:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1037053.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号