欢迎来到HDUISA wiki,如果这是你的第一次到来,请点击此处注册

C语言导读部分
C语言入门须知

初学c语言,初次接触信息安全。可能会有许许多多的问题想要问,这里我将一些常见的问题总结归纳一下。顺便说一说自己的一些经验建议。

初学c语言可能会有许多问题,也许非常简单,甚至幼稚。这个不奇怪,毕竟是初学。这里我总结一些常见的问题,希望不要再问了。

为什么学c语言?

边上有一大排的入门,但是我们总是要求没有基础的新生从c语言开始入门学习。也许有些人不是非常理解吧,这里我稍微解释一下,为什么要学c语言。

首先,我们需要清楚,学习信息安全,成为黑客的道路是无比困难,没有捷径,无法速成的。如果是抱着想在一个较短的时间里面成为一个大黑客的想法的人,只能很抱歉的说这里不适合。无论学习什么方向,都要花费漫长的时间

无论是学习逆向还是渗透还是其它的方向,都是从最基础的编程开始的。编程是一名黑客的基本功。我们所有的学习都是从最基本的编程开始的。我们平时面对最多的也是代码。

那么,在许许多多的编程语言中,我们为什么偏偏选择c语言呢?

1.c语言是一门历史古老,却有依然流行的语言。c语言诞生与1972年。在2015年的世界编程语言排行榜上,依然占据着第二的位置。看看这个排行榜上的其他语言,排第三的c++要叫c语言爸爸。而java,python之类看到c语言得叫爷爷。windows,linux,unix之类的操作系统都是使用c语言写成的。毫不夸张的说,c语言是庞大的计算机世界的根基。

2.c语言是面向过程的。相对于其他面向对象的java,c++,python等语言。面向过程的语言更加容易学习。毕竟,面向对象的概念对于初次接触编程的新手来说不是一个好理解的东西。

3.c语言更加接近计算机的底层。类似python,java等语言为了方便使用,往往将一些计算机底层的细节给隐藏了起来。虽然这样会让我们使用更加方便,但是却不利于我们深入了解计算机。而学习c语言能够让我们更加深入的理解,什么是程序,计算机是如何工作的。

c语言还有许多其他语言所不具有的魅力。所以我们都认为c语言是作为初学者入门最好的语言。c语言是打开计算机世界大门的钥匙

c语言用什么编译器?

首先cfree,vs之类的其实都不是编译器。这些东西叫ide(集成开发环境)。而gcc。MS C之类才是编译器。除此之外还有链接器等等的。这里我们不介绍编译原理,其中的区别可以自己去了解。现在我们需要选择的其实是ide。

那么,选什么ide比价好呢?这里我们介绍几款不错的ide以及它们的优缺点。

  • Visual Studio2012 - Visual Studio2015

隔壁windows入门强力推荐的一款ide。由微软推出。并且保持这每年一款的速度持续的更新着。可以说是绝大多数windows开发者的选择

优点:vs的调试能力确实是强悍,而且功能相当的多。可以算是一款巨无霸一般的ide。完善的功能,具有对c语言库以及windows平台非常完备的支持。是相当不错的ide

缺点:这东西实在是太大了。软件本身就要相当的空间,而且每一个工程都相当的巨大。运行的时候相当消耗系统资源。而且功能实在是太多,许多功能初学者完全不会用到,无数的功能反而会使得初学者失去方向,无所适从。

建议: 1.推荐对c语言,以及它编译开发过程有一定了解的人使用vs进行编程。

2在第一次使用vs前百度一下 → “vs如何创建工程”

3.建议初学者使用vs2012版本。2015等强制使用scanf_s函数对于初学者来说可能比较迷惑

  • clion

jetbrain的clion是一款出色的ide,在各种方面的表现丝毫不逊色于vs,而且跨平台。虽然在windows下安装默认不带编译器很坑爹。但是确实非常酷炫。已经成为协会众多linux党的首选ide(windows上斗不过vs,逃~~)

优点:狂拽酷炫吊炸天,丝毫不逊色于vs的功能和完善的插件系统。

缺点:这东西是java写的,低配电脑请慎重

建议:推荐电脑配置不差的linux用户选择。你问我windows用户为啥不推荐?因为windwos下有vs这个宇宙第一的ide

  • code blocks

评价挺不错的的一款ide。天生为了跨平台而设计,所以linux上也能使用

优点:相比vs,code blocks更加的小巧。功能虽然没有vs完善,但是对于初学c语言的新手来说也足够了。而且跨平台,而vs只能在windows下使用。

缺点:调试功能相比vs还是差了点,而且个人认为长得比较丑。

建议:如果信奉linux大法,或者是电脑配置不到家,不喜欢庞大vs的话,可以尝试选择code blocks

  • cfree

这东西已经比较的旧了,bug其实也不少。不过使用确实简单

优点:小,特别的小。而且创建程序之类的工作特别的简单。非常适合什么都不会的小白。简单的操作可以让新手专注与学习c语言本身而不是ide。

缺点:这东西已经比较古老了,而且bug也不少。最大的缺点是这东西的调试功能实在是差的可以。

建议: 1.如果你是什么都不懂,一点没有接触过编程的小白,那么就从用cfree开始吧。成功编译执行第一个Hello World程序比什么都重要。不要在ide上花太多时间。

2.如果已经对c语言有一定了解,开始使用调试功能的话,就可以放弃cfree换一个ide了。这东西只适合入门过度使用

  • eclipse

这东西也可以写c/c++。不过其实更多的是拿他写java。有兴趣的可以去试试用它

  • dev c++

这东西和cfree是差不多时代的东西。也已经有相当久没更新了。不过听说最近又有开源社区来维护它了。我自己没有深入的使用过。所以不能做太多的评价。仅有少数几次使用没有给我留下很好的印象

建议:有人强制要求吗?为什么好死不死的选它?下载又麻烦,而且不算好。

  • gcc

这个东西才是货真价实的编译器。当然纯粹的命令操作会让初学者心生畏惧。当然如果打算入坑linux,建议深入学习。

优点:编译器和ide没有可比性,cb之类都是依靠gcc编译的。作为linux系统必备品,学习linux绕不来它

缺点:毕竟只是编译器,功能什么的肯定比不上ide。纯命令对新手来说还是有些麻烦。

建议:还是从ide开始吧。想深入了解c语言编译以及优化的。或者励志于linux内核研究的,可以学习一下。

  • vc++ 6.0

哎,怎么说呢。这东西最后的更新时间是1998年。那个时候被我形容为古老的cfree都不知道有没有出生呢。vc6.0已经名副其实的成为古董了。这东西对最新,不,即使是在15年前,它对c语言标准的支持都是有问题的。更不要说现在了。而且bug众多

优点:这个真没有

缺点:到处都是

建议:既然已经落后于时代,被淘汰了的东西。就不要再用它了。强烈不推荐使用。再有谁问能不能用vc6.0的都自觉面壁去

介绍了好多ide。不存在哪个最好,最适合自己的才是最好的。不要在ide上花费太多的精力。希望刚刚开始c语言的新手更多的关注语言本身而不是ide。

学完c语言要花多久?

c语言的学习是没有尽头的。所以不要再问学完要多久,或者什么程度算是精通之类的问题了。先把手头的c语言入门书看完吧。如果将来的某一天,发现自己因为c语言功底不足的时候,再回来继续学习c语言。所有的基础知识都是如此,当发现自己基础功底不够时,请重新回头学习。

学c语言看什么书比较好?

对于这个问题,我最推荐的书是《c prime plus》这本书也算的上是c语言入门的经典书了吧。相比起某些书来说,讲解的足够深入,足够的细致。应该算最适合入门的c语言书了。至少相比一些21天开头,或者大言不惭的说出从入门精通这种谎话的书是好上不少。

学长,这个代码怎么不能跑啊?

经常看到这种问题,然后就是一大坨的代码砸了过来。这种时候,我们的心情其实是崩溃的。

首先,自己的问题最好是自己解决。

1.你有看过编译失败后ide给你返回的错误信息吗?

编译器的基本功能就是在编译失败后返回错误信息。不要告诉我英语看不懂,或者是不理解含义。原样打到百度里就有解答的问题就不要舍近求远的问人了Orz。百度永远是最好的老师。而大神终归有不在是时候。如果实在不知道那些错误是怎么回事,提问的时候也请一起发给对方,没有人会有耐心一行一行的分析你那写的并不好的代码。

2.你有调试过吗?

调试是排除程序错误很有效的手段,如果不会调试,请赶紧去百度学习一下。即使调试不能找到错误,也可以帮助定位有问题的代码。这对提问也是很有帮助的。 重要的事情说3遍:学会调试,学会调试,学会调试

3.你有写注释吗?

请在提问之前写清楚你的代码是干什么用的。实现怎样的功能。并且写清楚注释。否则在我眼里,那代码和下面这段没什么区别

size_t __cdecl aaaa(const char *a1)
{
  const char *v1; 
  char v2; 
  int v3; 
  int v4; 

  v1 = a1;
  if ( !((unsigned __int8)a1 & 3) )
    goto main_loop;
  do
  {
    v2 = *v1++;
    if ( !v2 )
      return v1 - 1 - a1;
  }
  while ( (unsigned __int8)v1 & 3 );
  while ( 1 )
  {
    do
    {
main_loop:
      v3 = (*(_DWORD *)v1 + 2130640639) ^ ~*(_DWORD *)v1;
      v1 += 4;
    }
    while ( !(v3 & 0x81010100) );
    v4 = *((_DWORD *)v1 - 1);
    if ( !(_BYTE)v4 )
      break;
    if ( !BYTE1(v4) )
      return v1 - 3 - a1;
    if ( !(v4 & 0xFF0000) )
      return v1 - 2 - a1;
    if ( !(v4 & 0xFF000000) )
      return v1 - 1 - a1;
  }
  return v1 - 4 - a1;
}

(来猜猜这代码是干什么用的)

如果都已经做到了。相信即使是一个非常困难,复杂的问题。大神也会非常乐意为你解决的。

打印/导出