C语言,怪题小谈

目录

序言:

一.越界死循环

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

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

最后:


序言:

学习了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'时,循环结束。

最后:

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的代码爱吃辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值