设为首页 加入收藏

TOP

浅谈C的应用与常见error(一)
2015-11-19 23:06:52 】 浏览:10098
Tags:浅谈 应用 常见 error
我下面所写的都是用“.c”后缀的。“.c”后缀是c源文件的后缀,“.cpp”后缀是c++源文件的后缀。c++继承了 c语言的一些特性,所以有些bug在“.cpp”里是可以通过的。
  1、scanf()你真的了解了么?;
    scanf()是有返回值的,返回值类型是int,这个你知道么?它返回了成功读入输入信息的个数。
    那么我们可以利用它来做什么呢?
    非零即真,这句话你一定听说过,而且不止一次。那么我们看一下下面的代码。
    int a;
   while (scanf("%d", &a) == 0)
   {
   printf("请输入合法字符:");
   }
    这样写代码是不是好一点,再输入的同时判断了输入的是否正确。但这会使你进入一个死循环。为什么会这样呢?
      我们在输入时,我们的键值需要一块缓冲区在存放键值,如果输入的键值不被scanf()接受,那么它会一直在缓冲区中,那么再仔细看一看上面的代码,你是不是明白了呢。
    解决这个问题并不难,只要将输入的键值接受,他就不会在缓冲区中影响你的程序了。看看下面的代码,有没有豁然开朗,哇,scanf()还可以这么使用!
   int a;
   while (scanf("%d", &a) == 0)
   {
   getchar();
   printf("请输入合法字符:");
   }
    2、你还在纠结while(),for();
    初学者可能会纠结什么场合用while(),什么场合用for()。
    在我看来,这根本不存不值得我去纠结,我们应该想的是使用哪个可以使程序更简单,别人更容易看懂。
    while(),for()的本质都是循环,只是形式不一样而已。
    int i = 0;            int i;
    while (i<10)           for (i=0; i<10; i++)
    {                {
      i++;
    }                }
    上面的代码当然是for()更简明一写,但1、中的例子却是使用while()。for()比while()在语句要多一些,这是你需要的么?
    根据每个人的代码风格不同,不能统一要求使用for()或者while()。建议初学者可以两个都试一下,感觉他们之间的不同,写出漂亮的代码。
  3、switch()你会使用么?
    switch(n)
    {
    case 1:
      break;
    case 2:
      break;
    default:
    }
    你一直这么使用么?
    我们都知道case 后面不加break,会一直执行下面的代码,直到代码全不执行完或者遇到break。
    利用这个特性,我们是不是可以做一些其他的事,比如加法,一年有十二个月,我想算出4月6号是今年的第几天,你想到怎么使用了么?我们看一下下面的代码。
    switch (month-1)
   {
    case 11: sumMonth += 30;
    case 10: sumMonth += 31;
    case 9: sumMonth += 30;
    case 8: sumMonth += 31;
    case 7: sumMonth += 31;
    case 6: sumMonth += 30;
    case 5: sumMonth += 31;
    case 4: sumMonth += 30;
    case 3: sumMonth += 31;
    case 2:
   if ((i%4==0 && i%100!=0) || i%400==0)
   {
  sumMonth += 29;
   }
   else
    {
   sumMonth += 28;
   }
    case 1: sumMonth += 31;
}
    你看懂了么?只是提供一个思路,将我们思维打开,你会看见另一片天空。
    你在case中定义过变量么?
    case中为什么不能定义变量呢?
   int a;
   switch (a)
  {
  case 1:
  int b;
  break;
  case 2:
  b = 0;
  break;
  }
    你这么任性,编译器怎么办!
    那我们为什么不规定case 1定义的变量只能在case 1中使用呢?在6、变量作用域中你将会找到答案。
    当然,我们不应该只局限于switch(),if() else也一样可以完成多重选择的任务,不过switch()内置3-999个标签,使用switch()的程序运行速度可能稍快一些,代码也更简洁。
  
  4、if()的使用
    我们都知道if()用于判断。那么当你判断两个字符相等时,你会怎么写?
    int a;
   if (a == 5)
    如果是我,我会写成
    int a;
   if (5 == a)
    功能是一样的,何必这么麻烦?我们在做一个项目时,不可能十行代码调试半个小时,当我们思维在键盘上飞舞时,我才体会到一个程序员的快乐。在我们正在体验这种快乐时,手误在所难免,如果写成if(a=5),这个错误够你找两天的。但是if(5=a),编译器就可以帮你找到。
    当你想判断两个字符串是否相等时,你会不会这样写?
    char c_c1[10] = "acdefg";
    char c_c2[10] = "qwerty";
    if (c_c1 == c_c2)或者if (c_c1[10] == c_c2[10])
    总之都是不对的。字符串,数组,指针后面还会有所涉及,这里不做详谈。
    比较两个字符串我们用到了C函数库中提供的strcmp()函数,它包含在头文件中。strcmp()返回了一个int类型的值,-1,0,1。0代表两个字符串相等,-1,1是由于字符之间的比较(ASCII)决定的。下面我看一个例子。
    char c_ch[10] = "qwertyui"  //最多可以存放9个字符,最后一位是”\0“
    char *p_ch = "adfgf"
    strcmp(c_ch, p_ch);  //strcmp()中的两个参数是两个字符串的地址
    strcmp("qwertyui", "adfgf");  //这样也是可以的,字符串存放的也是首字母的地址,后面会提到。
    
  5、你知道头文件的作用么?
  我们写代码都习惯把#include 最先写上,但你知道它的作用么?
  #include :文件包含
  当预处理器发现#include 指令后,就会寻找 <>中的文件名并把这个文件包含到你写的程序代码,替换源文件(就是你写的文件)中的#include。虽然你只写了一行代码,但是编译器却
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C编译器剖析-汇编代码生成寄存器.. 下一篇Object-C学习札记 NSString常用方..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目