C语言,怪题小谈

简介: 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。有没有想到呢?


b5e6a7afd2d947a389a69a2d7eadf2fa.png


我的第一反应也是,哎妈呀,数组访问越界了吗,这有什么好看的呀。程序肯定会崩溃呀。


但是事实并非如此。我们可以调试一下我们的代码看看代码的变量是怎样变化的,造成了死循环。





看到这里大家大胆的想一想,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;
}


7ed0606e928f4a9ebfb858270a1cf065.png


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



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



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

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

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


最后:


相关文章
|
4天前
|
C语言
C语言之文字游戏
C语言之文字游戏
|
4天前
|
存储 算法 搜索推荐
C语言探秘
C语言探秘
|
9月前
|
存储 Java 编译器
c语言学习第一课-初识c语言
c语言学习第一课-初识c语言
79 0
c语言学习第一课-初识c语言
|
11月前
|
程序员 编译器 C语言
初识C语言(5)C语言一些基本常识
初识C语言(5)C语言一些基本常识
43 0
|
存储 Java C语言
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(一)
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(一)
|
存储 编译器 C语言
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(二)
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(二)
|
C语言
C语言学习第六天
C语言学习第六天
42 0
|
C语言
c语言学习第四天
c语言学习第四天
70 0
c语言学习第四天
|
C语言
C语言学习(四)下集
C语言学习(四)下集
68 0
C语言学习(四)下集
|
存储 C语言 C++
C语言学习(四) 上集
C语言学习(四)上集
73 0
C语言学习(四) 上集