仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3346|回复: 6
打印 上一主题 下一主题

[C++基础] 来讲讲:12个风趣的C言语问答

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 11:05:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;
1,gets()办法

  Q:以下代码有个被埋没住的成绩,你能找到它吗?
  1. #include<stdio.h>intmain(void){charbuff[10];memset(buff,0,sizeof(buff));gets(buff);printf("
  2. Thebufferenteredis[%s]
  3. ",buff);return0;}
复制代码
  A:这个不显眼的成绩就是利用了gets()办法。此办法承受一个string范例参数,可是却没有检测此数值是不是有充足的空间来拷贝数据。以是这里我们一样平常用fgets()办法未来的更好。
2,strcpy()办法

  Q:暗码防护是很基础的功效,看看可否弄定上面这段代码?
  1. #include<stdio.h>intmain(intargc,char*argv[]){intflag=0;charpasswd[10];memset(passwd,0,sizeof(passwd));strcpy(passwd,argv[1]);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
  2. Passwordcracked
  3. ");}else{printf("
  4. Incorrectpasswd
  5. ");}return0;}
复制代码
3,main()办法的前往范例

  Q:叨教上面这段代码可否经由过程编译?假如能的话,那末这段代码中隐含甚么成绩吗?
  1. #include<stdio.h>voidmain(void){char*ptr=(char*)malloc(10);if(NULL==ptr){printf("
  2. Mallocfailed
  3. ");return;}else{//Dosomeprocessingfree(ptr);}return;}
复制代码
  A:谜底是代码能经由过程编译,可是会留下针对main()办法的前往范例的告诫。main()办法的真正前往范例应当为int而非void。这是由于int前往范例可以让程序前往形态值。特别是当这段程序作为其他使用的从属程序时这个形态值将加倍主要。
4,内存保守

  Q:叨教以下代码有内存保守吗?
  1. #include<stdio.h>voidmain(void){char*ptr=(char*)malloc(10);if(NULL==ptr){printf("
  2. Mallocfailed
  3. ");return;}else{//Dosomeprocessing}return;}
复制代码
  A:好,固然下面的代码没有对指针ptr举行内存开释,但实践上即便是程序停止也不会形成内存保守,由于当程序停止时一切一入手下手被占有的内存就全体清空了。但假如下面这段代码是在while轮回内里那将会形成严峻的成绩。
  Note:假如你必要懂得更多关于内存保守的成绩和怎样利用工具检测内存保守,你能够参考这篇文章Valgrind
5,free()办法

  Q:以下代码当用户输出freeze时会奔溃,而假如输出zebra则运转一般,这是为何?
  1. #include<stdio.h>intmain(intargc,char*argv[]){char*ptr=(char*)malloc(10);if(NULL==ptr){printf("
  2. Mallocfailed
  3. ");return-1;}elseif(argc==1){printf("
  4. Usage
  5. ");}else{memset(ptr,0,10);strncpy(ptr,argv[1],9);while(*ptr!=z){if(*ptr==)break;elseptr++;}if(*ptr==z){printf("
  6. Stringcontainsz
  7. ");//Dosomemoreprocessing}free(ptr);}return0;}
复制代码
  A:成绩的本源是由于代码在while轮回中改动了ptr指针的地点。当输出为zebra时,while轮回乃至在实行第一遍前就停止了,以是free()开释的内存地点就是一入手下手malloc()分派的地点。可是当输出freeze时,ptr纪录的地点在while轮回中被变动,由于将会是毛病的地点传送到free()办法中引发溃散。
6,atexitwith_exit

  Q:在以下代码,atexit()办法并没有被挪用,你晓得为何吗?
  1. #include<stdio.h>voidfunc(void){printf("
  2. Cleanupfunctioncalled
  3. ");return;}intmain(void){inti=0;atexit(func);for(;i<0xffffff;i++);_exit(0);}
复制代码
  A:这是由于利用了_exit()办法。此办法并没有挪用扫除数据相干的办法,好比atexit()等。
7,void*与C布局体

  Q:可否计划一个办法承受恣意范例的参数然后前往整数?同时是不是有举措传送多个如许的参数?
  A:一个能承受恣意范例参数的办法像上面这个模样:
  1. intfunc(void*ptr)
复制代码
  假如必要传送多个参数,那末我们能够传送一个包括这些参数的布局体
8,*与++操纵符

  Q:以下代码将输入甚么?为何?
  1. #include<stdio.h>intmain(void){char*ptr="Linux";printf("
  2. [%c]
  3. ",*ptr++);printf("
  4. [%c]
  5. ",*ptr);return0;}
复制代码
  A:以上的输入将是:
  1. [L][i]
复制代码
  由于++与*的优先级一样,以是*ptr++将会从右向左操纵。依照这个逻辑,ptr++会先实行然后实行*ptr。以是第一个了局是L。也由于++被实行了,以是下一个printf()了局是i。
9,MakingchangesinCodesegment

  Q:以下代码运转时必定会溃散,你能说出缘故原由吗?
  1. #include<stdio.h>intmain(void){char*ptr="Linux";*ptr=T;printf("
  2. [%s]
  3. ",ptr);return0;}
复制代码
  A:这是由于,经由过程*ptr=T,此行代码实验变动只读内存存储的字符串Linux。此操纵固然行欠亨以是才会形成溃散。
10,Processthatchangesitsownname

  Q:你可否写一个程序在它运转时修正它的称号?
  A:以下代码能够完成
  1. #include<stdio.h>intmain(intargc,char*argv[]){intflag=0;charpasswd[10];memset(passwd,0,sizeof(passwd));strcpy(passwd,argv[1]);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
  2. Passwordcracked
  3. ");}else{printf("
  4. Incorrectpasswd
  5. ");}return0;}0
复制代码
11,部分变量的前往地点

  Q:上面的代码有成绩吗?假如有,怎样修正?
  1. #include<stdio.h>intmain(intargc,char*argv[]){intflag=0;charpasswd[10];memset(passwd,0,sizeof(passwd));strcpy(passwd,argv[1]);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
  2. Passwordcracked
  3. ");}else{printf("
  4. Incorrectpasswd
  5. ");}return0;}1
复制代码
  A:固然下面的代码偶然运转会很好,可是在办法inc()中有很严峻的隐患。当inc()办法实行后,再次利用部分变量的地点就会形成不成估计的了局。办理之道就是传送变量a的地点给main()。
12,处置printf()参数

  Q:以下代码输入叨教是甚么?
  1. #include<stdio.h>intmain(intargc,char*argv[]){intflag=0;charpasswd[10];memset(passwd,0,sizeof(passwd));strcpy(passwd,argv[1]);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
  2. Passwordcracked
  3. ");}else{printf("
  4. Incorrectpasswd
  5. ");}return0;}2
复制代码
  A:输入将是
  1. #include<stdio.h>intmain(intargc,char*argv[]){intflag=0;charpasswd[10];memset(passwd,0,sizeof(passwd));strcpy(passwd,argv[1]);if(0==strcmp("LinuxGeek",passwd)){flag=1;}if(flag){printf("
  2. Passwordcracked
  3. ");}else{printf("
  4. Incorrectpasswd
  5. ");}return0;}3
复制代码
  这是由于参数都是从右向左处置的,然后打印出来倒是从左向右。
英文原文:c-interview-questions
使用gcc或g++进行编译,使用gdb进行调试;
乐观 该用户已被删除
沙发
发表于 2015-1-18 07:47:59 | 只看该作者
关于用类来控制C++的内存分配,应该算是C++的一个高级技法。写的好的C++程序,基本看不到delete与new。因为这些内存的分配,销毁都让一特殊的类去管理。
透明 该用户已被删除
板凳
发表于 2015-1-26 12:53:27 | 只看该作者
虽然还不明确软件技术包含的具体内容,但从C++语言这门课程开始,已发现程序设计的乐趣,在学习C++语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。
因胸联盟 该用户已被删除
地板
发表于 2015-2-10 06:35:09 | 只看该作者
最后一部分:算是高级一些的主题,总感觉书的这一部分翻译的不太好,读起来完全没有前面几章顺畅,像多重继承什么的,如果觉得太难理解,看的时候放一放,改天等你用到的时候,再来看看是怎么回事。
深爱那片海 该用户已被删除
5#
发表于 2015-3-1 02:03:41 | 只看该作者
从2月21号开始看的,算下来已经1个多月了,每天看2-3个小时左右。本身C的基础挺好的,几本经典的C语言书都看过。
精灵巫婆 该用户已被删除
6#
发表于 2015-3-10 12:28:34 | 只看该作者
慢慢得,你会发现你得问题强人基本解决不了,不是你超过他,而是你们关注领域不同,这个时候,你自己也成为强人了,嘿嘿!!
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-24 02:11:52 | 只看该作者
只有全面撑握了这些东西. 然后你学了语法..就要经常锻炼 . 写不好没关系. 哪怕再小的程序.. 你写写改改
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-28 16:32

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表