首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 测试你的C语言功底?
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:05:20 楼主
    C/C++ code
    测试你的C语言功底?   在实际的教学中,我们发现很少有真正精通了C语言编程的学员,一般都有或多或少概念不是完全清楚的问题,特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义指向函数的指针类型,这也是导致学习VC++困难的一个原因。下面有几个简单测试将能发现你对C语言的掌握情况。 1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等? (环境是vc6Debug方式下) #include<stdio.h> void test() { int t; scanf("%d",&t); 在这里加入代码 } main() { int m; test(); printf("m=%d",m); } 2、请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么? #include <stdio.h> int main() { int i = 0; int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (i = 0; i <= 10; i++) { name[i] = 0; printf("ok\n"); } return 0; } 3、实现多参函数   大家对C语言中最熟悉的函数就是“printf”吧?这是在HelloWorld例子里就见过了。那么你真正了解它吗?请设计一个类似于printf的函数的多参函数int Add(…); 这个函数的功能: 例如Add(4, 5, 0); 返回9 Add(4, 5, 6, 0);返回15…………可以输入大于0个参数(参数类型为整型)。
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:10:441楼 得分:0
    1,0
    2,数组越界修改了i
    3,多参的例子一搜一大堆,用。。。省略参数法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:19:132楼 得分:0
    引用 1 楼 andy_cai 的回复:
    1,0
    2,数组越界修改了i
    3,多参的例子一搜一大堆,用。。。省略参数法

    2、请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:32:003楼 得分:0
    2在绝大多数情况下,是死循环。
    因为变量i正好被放在在name[10]的位置,每次运行到i = 10时,i就被清0了。
    如果编译器不把i放在那个位置,就不会出现死循环了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:35:594楼 得分:0
    第1题,我觉得不论在那里,加什么代码都不可做到输入与输出相等。
    因为main函数里的m是随机值。
    test函数没有参数,test()里变量的生存空间都在test函数内,不会影响到main()。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:39:225楼 得分:0
    C/C++ code
    //某培训学校的题目.

    菜鸟飘过
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • caimps
    • 等级:
    发表于:2008-07-23 20:45:326楼 得分:0
    引用 3 楼 chenhj_wo 的回复:
    2在绝大多数情况下,是死循环。
    因为变量i正好被放在在name[10]的位置,每次运行到i = 10时,i就被清0了。
    如果编译器不把i放在那个位置,就不会出现死循环了。


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:56:377楼 得分:0
    第二个是死循环,
    打印出&i、&name+1的地址相等,

    编译器怎么放变量的,知道的说下,谢谢!!

    第一题,怎么做??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 20:58:468楼 得分:0
    第一题,我觉的无解
    第二题,不是死循环
    第三题,可变参数问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 21:32:139楼 得分:0
    功底一般!~o(∩_∩)o...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 21:38:5610楼 得分:0
    1#: 不知道是怎么回事情, 有高人请快快现身
    2#:虽然有定义int name[10] 的10个整形元素, 但是name【10】就是name[9]后面的第11个元素。这个在使用上是有风险的, 因为它有可能修改其他数据在内存中的存储。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 21:42:2211楼 得分:0
    我在TC2.0上试运行的时候, 只有打印11个OK, 根本不是什么死循环。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 21:48:2812楼 得分:0
    第一个不知道,第二个不可能是死循环,数组越界而已,第三个我认为写一个多参函数,给每个
    参数付默认值=0,int add(int a=0,int b=0,int c=0,int d=0,int e=0,int f=0)
                            {
                                  return a+b+c+d+e+f;
                            }
    菜鸟而已,别喷我。希望有达人来解决第一题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 22:01:1813楼 得分:0
    测试你的C语言功底?

    为什么叫这个标题???????

    没多大关系吧....
    假如我从来没有用过vc6.0....那是不是说明...不会C?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 22:08:0414楼 得分:0
    第一个题目 有解,因系统不同而不同 ,
    主要思想是使用指针找到 m的地址或者加入汇编指令

    第二个题目 内存地址低减的情况下回出现死循环,

    第三个  省略号
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 22:22:4515楼 得分:0
    引用 14 楼 haohaokingXP 的回复:
    第一个题目 有解,因系统不同而不同 ,
    主要思想是使用指针找到 m的地址或者加入汇编指令


    地址分配是随机的吧?怎么确定
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 22:26:1116楼 得分:0
    第一题考试的应该就是覆盖堆栈内的参数。。

    第二个依据i和数组的排列顺序

    第三个就很简单了,va_list。。随便搜下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 22:27:0917楼 得分:0
    引用 15 楼 cavalier_man 的回复:
    引用 14 楼 haohaokingXP 的回复:
    第一个题目 有解,因系统不同而不同 ,
    主要思想是使用指针找到 m的地址或者加入汇编指令


    地址分配是随机的吧?怎么确定


    C栈的每个对象相对位置是固定的
    不像JAVA,在堆上动态生成后由栈内引用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 23:06:2618楼 得分:0
    1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
    文字游戏, 直接在test函数里面输入以后马上打印出这个输入的结果
    void test()
    {
      int t;
      scanf("%d",&t);
      printf("%d",t);
      exit(0);
      //在这里加入代码
    }
    2.请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
    我觉得是buffer Overflow
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 23:09:3019楼 得分:0
    第二题:
    程序执行死循环,由于地址是由大到小分配的,在为变量i分配完地址后,紧接着为name[10]分配连续10个INT类型的空间
    但是i变量地址后并不是a[0],而是a[9].数组各元素的地址分配也是按照下标由大到小分配的。所以数组元素是倒置存放的。
    在for循环里,a[10]就代表a[9]后面的数据,而a[9]后面真正存储的是变量i=0,所以在执行a[10]语句后,就把i变量重新赋0。
    从而进入死循环状态
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 23:11:0620楼 得分:0
    第二踢不是死循环 下面是我把原代码防到linux下运行的结果
    [root@linux sss]# cc 7232.c
    7232.c:13:2: warning: no newline at end of file
    [root@linux sss]# ./a.out
    ok
    ok
    ok
    ok
    ok
    ok
    ok
    ok
    ok
    ok
    ok
    [root@linux sss]#


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 23:48:1721楼 得分:0
    引用 18 楼 jy01807853 的回复:
    1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
    文字游戏, 直接在test函数里面输入以后马上打印出这个输入的结果
    void test()
    {
      int t;
      scanf("%d",&t);
      printf("%d",t);
      exit(0);
      //在这里加入代码
    }
    2.请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
    我觉得是buffer Overflow

    第一题我也正有此意啊,有时思想要单纯,人要灵活!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 23:48:2222楼 得分:0
    引用 18 楼 jy01807853 的回复:
    1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
    文字游戏, 直接在test函数里面输入以后马上打印出这个输入的结果
    void test()
    {
      int t;
      scanf("%d",&t);
      printf("%d",t);
      exit(0);
      //在这里加入代码
    }


    第一题我也正有此意啊,有时思想要单纯,人要灵活!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 23:53:5323楼 得分:0
    1.我认为在函数里面动态分配个内存,可以实现
    2.有可能是死循环,也有可能不是
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mscf
    • 等级:
    发表于:2008-07-24 00:00:3824楼 得分:0
    改日来测
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 01:03:3125楼 得分:0
    第一题:
      用栈溢出,和上边说的第二题差不多,用T的值覆盖m 的值。
          void test()
    {
      int t;
      scanf("%d",&t);
      int *p = &t
      p += N;//N 为m 与 t 的偏移量,单步追踪到 test 里面然后自己观察内存分布
      *p = t;
    }
    main()
    {
      int m;
      test();
      printf("m=%d",m);
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tobylee999
    • 等级:
    发表于:2008-07-24 02:41:5426楼 得分:0
    真是高人呀,佩服题1如下实现的:
    printf("%d",t);
    exit(0);

    当然,知道去栈上找地址的也不错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    发表于:2008-07-24 08:11:0127楼 得分:0
    楼主有点呆...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 08:17:3328楼 得分:0
    第二题我刚看到的时候也认为是死循环
    但是我用这个程序测试了一下
    好像不是死循环(要是死循环的话 那个cycle??好像应该打印不出来吧)
    #include <stdio.h>
    int main()
    {
      int i = 0;
      int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

      for (i = 0; i <= 10; i++)
      {
        name[i] = 0;

        printf("ok\n");
      }
      printf("cycle??");
      getch();
      return 0;
    }

    请各位指导
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 08:55:2529楼 得分:0
    先mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 08:59:3930楼 得分:0
    这题不怎么样,被lz的大话唬住了。
    取消mark。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 09:01:1531楼 得分:0
    第二题我刚看到的时候也认为是死循环
    但是我用这个程序测试了一下
    好像不是死循环(要是死循环的话 那个cycle??好像应该打印不出来吧)
    #include <stdio.h>
    int main()
    {
      int i = 0;
      int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

      for (i = 0; i <= 10; i++)
      {
        name[i] = 0;

        printf("ok\n");
      }
      printf("cycle??");
      getch();
      return 0;
    }

    请各位指导

      ----  不要加优化选项, 否则编译器会把变量i优化到寄存器里面去 ..........
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 09:02:4332楼 得分:0
    学习到好多新东西,继续关注
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fengwu__
    • 等级:
    发表于:2008-07-24 09:26:2333楼 得分:0
    关注。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hjessica
    • 等级:
    发表于:2008-07-24 09:31:1934楼 得分:0
    引用 27 楼 fetag 的回复:
    楼主有点呆...


    楼主有点傻.
    1)
    a,如果是文字游戏没意思,程序员没那么多花花肠子。
    b,程序不可能实现,没输入,没返回值的。如果你愿意在程序执行的时候去,调试内存地址,那我也没办法。如果说可以,那我倒要学习下了。
    2)
    越界,就这么简单。不要和我说什么死循环,内存从大到小还是从小到大分配,那是编译器的事情。与我C语言功底有啥关系?

    3)
    C/C++ code