当前位置:网站首页>C语言,怪题小谈

C语言,怪题小谈

2022-08-11 11:07:00 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'时,循环结束。

最后:

原网站

版权声明
本文为[C语言的前男友]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_63943454/article/details/126222672