Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于字符串的问题，请教大神

回复:
user: user-0
content: 谢谢大神，知道原因啦

user: user-1
content: 函数没返回string1的首地址 #include <stdio.h> #include <stdlib.h>  char* stringCat(char* string1,char* string2) { 	char* head=string1;     while(*string1!='\0')     {         string1++;     }     while(*string2!='\0')     {         *string1=*string2 ;         string1++;         string2++;     }     *string1='\0' ;     return head ; }  int main() {     //将数字a添加到字符串后面     long a=1 ;     char string[20]="abc" ;     char stringtemp[20]={0};     puts(stringCat(string,ltoa(a,stringtemp,10)));     return 0; }

user: user-1
content: ltoa函数编辑 原型：char *ltoa(long value,char *string,int radix) 功能：把value的值转换为以NULL结束的radix进制的字符串，并把结果存在string中。radix是转换的基数值，在2到36之间。分配给string的空间必须可容纳返回的所有字节（最多33字节）。

user: user-2
content: 连接是对了，可是返回的不对，主函数的string是对的，  char *stringCat(char *string1,char *string2){ 	//将string2连接到string1后面，之后添加字符串结束符 	char *pTemp = string1; 	while(*string1 != '\0'){ 		string1++; 	} 	while(*string2 != '\0'){ 		*string1 = *string2; 		string1++; 		string2++; 	} 	*string1 = '\0'; 	return pTemp; }  int main(){ 	//将数字a添加到字符串后面 	long a = 1; 	char string[20] = "abc"; 	char stringtemp[20] = {0}; 	puts(stringCat(string,ltoa(a,stringtemp,10))); 	return 1; }

user: user-0
content: 应该不是那个strcat函数的问题，我调用用库函数里的strcat问题一样存在，我想问题是在主函数里面

user: user-3
content: *string1=`\0`;之前加一步string1++;
user-0 提问: 面向处理器结构的C程序优化

回复:
user: user-1
content: Oprofile已经不行了，用起来太麻烦，推荐perf

user: user-0
content: 引用 8 楼 chenyoufu123 的回复:Oprofile已经不行了，用起来太麻烦，推荐perf  多谢，我去了解下

user: user-0
content: 引用 8 楼 chenyoufu123 的回复:Oprofile已经不行了，用起来太麻烦，推荐perf  多谢，我去了解下

user: user-0
content: 写完了，欢迎去我空间看看。

user: user-0
content: 每个现代处理器都有硬件内存管理单元，说穿了就两个作用，提供虚地址到时地址映射和实地址到外围模块的映射。不用管它每个字段的定义有多么复杂，只要关心给出的虚地址最终变成什么实地址就行。在此我想说，powerpc的内存管理模块设计的真的是很简洁明了，相比之下x86的实在是太罗嗦了，那么多模式需要兼容。当然那也是没办法，通讯领域的处理器就不需要太多兼容性。通常我们能用到的内存管理优化是定义一个大的硬件页表，把所有需要频繁使用的地址都包含进去，这样就不会有页缺失，省了页缺失异常调用和查页表的时间。在特定场合可以提高不少效率。 这里描述下最慢的内存访问：L1/2/3缓存未命中->硬件页表未命中->缺页异常代码不在缓存->读取代码->软件页表不在缓存->读取软件页表->最终读取。同时，如果每一步里面访问的数据是多核一致的，每次前端总线还要花十几个周期通知每个核的缓存，看看是不是有脏数据。这样一圈下来，几千个时钟周期是需要的。如果频繁出现最慢的内存访问，前面的优化是非常有用的，省了几十倍的时间。具体的映射方法需要看处理器手册，就不多说了。  指令优化，这个就多了，每个处理器都有一大堆。常见的有单指令多数据流，特定的运算指令化，分支指令间化，等等，需要看每家处理器的手册，很详细。我这有个数据，快速傅立叶变化，在powerpc上如果使用软浮点，性能是1，那么用了自带的矢量运算协处理器（运算能力不强,是浮点器件的低成本替换模块）后，gcc自动编译，性能提高5倍。然后再手工写汇编优化函数库，大量使用矢量指令，又提高了14倍。70倍的提升足以显示纯指令优化的重要性。  GCC的优化等级有三四个，一般使用O2是一个较好的平衡。O3的话可能会打乱程序原有的顺序，调试的时候很麻烦。可以看下GCC的帮助，里面会对每一项优化作出解释，这里就不多说了。编译的时候，可以都试试看，可能会有百分之几的差别。  最后是性能描述工具。Linux下，用的最多的应该是KProfile/OProfile。它的原理是在固定时间打个点，看下程序跑到哪了，足够长时间后告诉你统计结果。由此可以知道程序里那些函数是热点，占用了多少比例的执行时间，还能知道具体代码的IPC是多少。IPC的意思是每周期多少条指令。在双发射的powerpc上，理论上最多是2，实际上整体能达到1.1就很好了。太低的话需要找具体原因。而这点，靠Profile就不行了，它没法精确统计缓存命中，指令周期数，分支预测命中率等等，并且精度不高，有时会产生误导。这时候就需要使用处理器自带的性能统计寄存器了。处理器手册会详细描述用法。有了这些数据，再不断改进，比较结果，最终达到想要的效果。  很重要的一点，我们不能依靠工具来作为唯一的判别手段。很多时候，需要在更高一个或者几个层次上优化。举个例子，辛辛苦苦优化某个算法，使得处理器的到最大利用，提高了20%性能，结果发现算法本身复杂度太高了，改进下算法，可能是几倍的提升。还有，在优化之前，自己首先要对数据流要有清楚的认识，然后再用工具来印证这个认识。就像设计前端数字模块，首先要在心里有大致模型，再去用描述语言实现，而不是写完代码综合下看看结果。

user: user-2
content: 为什么不用CUDA呢？ 参考国产银河计算机。

user: user-3
content: 老赵又掐秒表了

user: user-2
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  使用电脑计时有时误差会很大，因为待测程序段的运行会影响电脑时钟。 将待测程序段循环足够多次，手动掐秒表计时可能更准确。

user: user-4
content: 膜拜一下！！

user: user-0
content: 再说说ddr访问优化。通常软件工程师认为内存是一个所有地址访问时间相等的设备，是这样的么？不是。我们买内存的时候，是不是有3个性能参数，比如10-10-10?这个表示访问一个地址所需要的三个操作时间，命令，数据还有预充电。前两个好理解，第三个的意思是，我这个页或者单元下一次访问不用了，必须关闭，保持电容电压，否则再次使用这页数据就丢失了。根据这个原理，ddr地址有三个部分组成，列，行，页。如果连续的访问都是在同行同列同页，每一个只需要10单位时间；同行不同列同页，30单位；不同行同列同页，20单位。所以我们得到什么结论？相邻数据结构要放在一个页，并且绝对避免出现同行不同列同页。这个怎么算？每个处理器都有手册，去查查物理内存地址到内存管脚的映射，推导一下就行。此外，ddr还有突发模式，ddr3为例，64位带宽的话，可以一个命令跟着8次读，可以一下填满一行64字节的缓存行。而极端情况（同页访问）平均字节访问时间只有10/64，跟最差情况，30/64字节差了3倍。是不是豁然开朗了？你这么去分析程序，小伙伴们会惊呆的。当然，内存里面的技巧还很多，比如故意哈希化地址来防止最差情况访问，两个内存控制器同时开工，并且地址交织来形成流水访问，等等，都是优化的方法。不过通常我们跑的程序由于调度程序的存在，地址比较随机不需要这么优化，优化有时候反而有负面效应。  未完待续
user-0 提问: 关于configure

回复:
user: user-0
content: 引用 3 楼 zmlovelx 的回复:先cd到configure目录再./configure  然后make 我已经试过了这种方法。当我cd 后，再configure，已经不是当前目录了。

user: user-1
content: 没太搞明白跑到home目录下？--prefix不就是指定的目录吗

user: user-2
content: configure 一般用perl写的。。。。。

user: user-3
content: 不是直接执行 configure make make install 么

user: user-4
content: 切换到configure目录是关键，然后在执行./configure.

user: user-5
content: 先cd到configure目录再./configure  然后make
user-0 提问: 关于configure

回复:
user: user-1
content: 搜“跟我一起写makefile”

user: user-2
content: 确实应该先从楼上所说的文章看起，关于makefile的基本功练好。 另外给你一个例子吧，通过一个主makefile，控制调用其他子目录的makefile。这是一种途径吧。   TmCommon_Dir="TmCommon/src" ClientSDK_Dir="SPICAPScanClient/src" .PHONY: all clean all:         $(MAKE) -C $(TmCommon_Dir)         $(MAKE) -C $(ClientSDK_Dir)          clean:         cd $(TmCommon_Dir) && make clean         cd $(ClientSDK_Dir) && make clean   分别到不同目录下去调用makefile
user-0 提问: 哪位大牛会dll编程啊？我明明仿照例子敲的代码，LoadLibrary("..\\Debug\\dllTest.dll")还是提示“不能计算表达式的值”

回复:
user: user-1
content: 看下面这句有用没 要注意编译的时候可能重建debug文件，所以最好把.dll放到源文件所在的目录下或者和工程同级目录

user: user-0
content: 引用 2 楼 jerry_dqh 的回复:先用绝对路径看一下loadlibrary是否load了。 引用 1 楼 user-3 的回复:测试了一下，可能是程序和dll的路径问题  实在看不出来到底哪儿出错了。。。能不能告知一下，那些书会比较有用呢,比较急，谢谢啦！

user: user-0
content: 用了绝对路径还是不行呀

user: user-2
content: 先用绝对路径看一下loadlibrary是否load了。

user: user-3
content: 测试了一下，可能是程序和dll的路径问题
user-0 提问: LoadLibrary（“..\\Debug\\dllTest.dll”）

回复:
user: user-1
content: 或者将dllTest\Debug拷贝一份放到dllCall\dllTest文件夹下

user: user-1
content: 你的exe在 D:\MyDocuments\Documents\Visual Studio 2010\Projects\dllCall\Debug "..\\dllTest\\Debug\\dllTest.dll"表示的是（..表示上一层文件夹） D:\MyDocuments\Documents\Visual Studio 2010\Projects\dllCall\dllTest\Debug\dllTest.dll dll的路径不对，所以dll无法加载  你可以用"..\\..\\dllTest\\Debug\\dllTest.dll"

user: user-0
content: 引用 1 楼 user-1 的回复:没什么问题 1.你检查一下你的DLL中add函数导出了吗 2.你的函数和DLL的相对路径符合"..\\dllTest\\Debug\\dllTest.dll"  dll中的导出函数用的下面红色部分，相对路径也是没错的。 dllTest.dll路径：D:\MyDocuments\Documents\Visual Studio 2010\Projects\dllTest\Debug   dllCall的exe路径：D:\MyDocuments\Documents\Visual Studio 2010\Projects\dllCall\Debug  #ifndef LIB_H	//if not define,做程序1 //程序1 #define LIB_H  extern "C" int _declspec(dllexport) add(int x,int y);	 //声明用C编译、连接方式的外部函数 //__declspec(dllexport):声明函数add为DLL的导出函数 #endif

user: user-1
content: 没什么问题 1.你检查一下你的DLL中add函数导出了吗 2.你的函数和DLL的相对路径符合"..\\dllTest\\Debug\\dllTest.dll"
user-0 提问: sendto recvfrom

回复:
user: user-1
content: 估计你没了解他们是怎么通讯的。 sendto recvfrom 是udp的发送和接收。 sendto 发送的地方就是一个ip地址的某个端口。 recvfrom 接收的是从另一个ip地址的某个端口发送来的东西。 建议你去了解udp的通讯过程。

user: user-2
content: 接收和发送之前会先创建链接的，链接指向你接收和发送到的地址

user: user-3
content: 这个是socket 通信吧？

user: user-4
content: 参考 MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C http://bbs.csdn.net/topics/390374955
user-0 提问: 这个函数如何写:从一个字符串第三个位置开始，一直到该字符串结束，copy 到另一个字符串中

回复:
user: user-1
content: char s[]="12345678"; char t[20]; strcpy(t,s+2);

user: user-2
content: void CopyMemory(     _In_  PVOID Destination,     _In_  const VOID *Source,     _In_  SIZE_T Length   );
user-0 提问: 大神们，求个解答！急求啊啊啊啊啊！！C语言

回复:
user: user-1
content: 很简单嘛    。

user: user-2
content: 都可以用队列实现啊  第一个初始队列为1，如果不能整除，10入列，11入列，在判断10,11能否整除。。。直到能整除就停止了 第二个队列为1到M，先出列一个元素，当计数器为n时 该元素不入列，否则入列。。。直到操作了n-1次 就剩下最后一个元素了
user-0 提问: C语言如何判断段落结束

回复:
user: user-1
content: 对于文本文件的话统计有多少换行符 '\n'

user: user-2
content: 格式用不同的文本编辑器打开就有很大差别

user: user-3
content: 如果文档是Word文档，那么Word定义了段落结束标记。

user: user-3
content: 看文章什么格式的，如果是文本文件，那么数下换行符（\r）有多少。段落数=换行符+1

user: user-4
content: 引用 1 楼 caozhy 的回复:看文章什么格式的，如果是文本文件，那么数下换行符（\r）有多少。段落数=换行符+1+1

user: user-5
content: 遍历 统计换行符的个数
user-0 提问: 请教getchar()的问题，谢谢！

回复:
user: user-1
content: 楼主为什么要如此深究getchar函数。 图形界面是如此神奇，为什么不多多研究。

user: user-2
content: 第一个getchar()接收scanf_s("%d", &n);的回车键，第二个getchar()接收你按下的回车键

user: user-3
content: 楼主都是用的什么神教材？竟然这样教你用getchar

user: user-4
content: 有时候，输入数据是要防止回车字符的输入， 因为有时候按下回车表示结束输入，而不是要输入的内容。 那么这个时候，就要用你说的那个函数把回车字符给”吃掉“。

user: user-0
content: 我把第一个getchar()注释了，就没有了等待编程者按下键盘才返回编辑界面，计算机直接打印出所有结果，中间没有输入回车继续的过程，这是为什么，谢谢！

user: user-5
content: 简单理解就是冻结屏幕，即暂停的意思，不会让最终的程序运行结果一闪而逝

user: user-6
content: 你这段代码正好使用了getchar的最典型用法，即利用getchar()函数让程序调试运行结束后，等待编程者按下键盘才返回编辑界面。getchar有一个int型的返回值，当程序调用getchar时，程序就等着用户按键，用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止（回车字符也放在缓冲区中），当用户键入回车之后，getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码，如出错返回-1，且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符，其他字符会保留在键盘缓存区中，等待后续getchar调用读取。也就是说，后续的getchar调用不会等待用户按键，而直接读取缓冲区中的字符，直到缓冲区中的字符读完为后，才等待用户按键。 http://www.cplusplus.com/reference/cstdio/getchar/?kw=getchar
user-0 提问: C语言文件操作有内存的申请释放产生吗

回复:
user: user-1
content: 引用 楼主 a130098300 的回复:大致说一下我现在想做的： 我是做图像处理算法的，现在写了一个算法库，然后视频数据是用opencv解码的，每解一帧数据就送给算法库进行分析，然后输出结果。昨天测试发现，跑了几千帧后内存会有轻微的上涨，大概300~400K不等，然后再跑个几千帧又有轻微上涨，涨了几K。我仔细查看了算法库的源码，发现没有malloc，new之类的（算法库内部需要的内存都是在外部开辟的）。 我怀疑是opencv的解码库有内存泄露。所以我现在直接将opencv解码出来的一帧数据写到硬盘里。 然后现在每次都用fopen打开该帧数据，用fread将图像数据读到malloc的buf里，然后将buf里保存的图像数据送给算法库进行分析，分析完之后就fclose。然后再循环的fopen...  while(1) {     f_pic = fopen("pic.yuv", "rb);    fread(pic_buf, 1, width * height * 3 / 2, f_pic );         //算法库分析接口     FrameAnalysis( pic_buf, &output_result );         fclose(f_pic); }  现在这样测试，发现内存没有上涨了。但是我不知道C语言里文件的操作会不会有内存方面的问题。 请大家给评判下，这样是否可以判断我的算法库没有内存泄露方面的问题。谢谢！  看起来FrameAnalysis在单线程情况下没有泄漏

user: user-2
content: 引用 楼主 a130098300 的回复:大致说一下我现在想做的： 我是做图像处理算法的，现在写了一个算法库，然后视频数据是用opencv解码的，每解一帧数据就送给算法库进行分析，然后输出结果。昨天测试发现，跑了几千帧后内存会有轻微的上涨，大概300~400K不等，然后再跑个几千帧又有轻微上涨，涨了几K。我仔细查看了算法库的源码，发现没有malloc，new之类的（算法库内部需要的内存都是在外部开辟的）。 我怀疑是opencv的解码库有内存泄露。所以我现在直接将opencv解码出来的一帧数据写到硬盘里。 然后现在每次都用fopen打开该帧数据，用fread将图像数据读到malloc的buf里，然后将buf里保存的图像数据送给算法库进行分析，分析完之后就fclose。然后再循环的fopen...  while(1) {     f_pic = fopen("pic.yuv", "rb);    fread(pic_buf, 1, width * height * 3 / 2, f_pic );         //算法库分析接口     FrameAnalysis( pic_buf, &output_result );         fclose(f_pic); }  现在这样测试，发现内存没有上涨了。但是我不知道C语言里文件的操作会不会有内存方面的问题。 请大家给评判下，这样是否可以判断我的算法库没有内存泄露方面的问题。谢谢！这样的情况，你在存储一帧的时候，肯定某个地方使用了全局变量，检查全局变量吧！

user: user-3
content: 你还可以将确定有资源泄漏的算法库封装在一个进程中，然后每次创建此进程，跨进程调用你要实现的功能，结束此进程。

user: user-3
content: 检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-4
content: 如果是我，会如下思路： （1）确定这是否是一个内存泄露问题？ （2）你原先编写代码中，如果不复杂，首先对自己的代码进行Code Review            a. code中是否有未释放内存            b. 开源库使用方法是否存在问题  （3） 如果以上方法都没有发现，尝试一些工具：            Linux下Valgrind            Windows下有一些工具，我以前写过一篇博客：http://blog.csdn.net/cjf_iceking/article/details/7552802    最后给您的一句话：具体内存泄露在哪里，我想除非很明显，论坛中人很少有时间去帮你分析的。这个问题需要自己去认真分析，相信您会成长不少的。
user-0 提问: ubuntu求问。

回复:
user: user-1
content: 先装gcc和gdb，再配置vim

user: user-2
content: 半年前开始用Ubuntu，写c代码，刚开始在桌面建立文件，重命名时事c代码，自己加上.c，表示是c程序，然后直接在里边写。也可以去软件中心，下载一些文本编辑的软件。  如果是服务器，就用vi。在命令窗口，vi mycname.c,，然后再里边敲代码

user: user-3
content: 引用 楼主 u014737950 的回复:最近好用到ubuntu，但是不清楚应该怎么用ubuntu编辑C啊？ 搞到root权限, 安一个vim 安一个ctags 然后尽情的写代码吧, 中途可能会有很多库都缺失,不过补全库的过程也是学习的过程啊.

user: user-4
content: 编辑器：pico. vi(m) ， gedit, codeblocks, kate, eclipse 编译器：gcc/g++, makefile, CMake

user: user-5
content: 既然问了，那就推荐几个我用过的： 编辑器：vi/vim, sublime IDE: eclipse CDT, CodeBlocks  另外命令行自己编译，一般采用gcc/g++

user: user-6
content: 打开终端：先vi xxx.c(自己命名)，enter进入vi编辑界面,按i进入编辑状态，写完按esc进入命令模式，在按shift+:进入底行命令模式，然后在冒号后面输入wq再回车，命令行输入gcc xxx.c(编译链接)，然后./a.out回车就能执行了

user: user-7
content: 可以使用vi编辑器进行C的学习 建立文件需要带.c格式 例如桌面上有一个C的文件夹。 首先如下： cd Desktop cd C vi 1.c //进入vi界面下按i进行编辑 i #include<stdio.h> void main() {     printf("HEllo World!\n"); } //保存需要用:wq :wq //编译需要用到gcc编译器 gcc 1.c -o 1 ./1  //打开1.exe  大概就是这个样子。。。

user: user-8
content: vi自带的，不过初学者不太容易上手，可以使用emacs支持代码高亮，智能缩进，感觉还不错！

user: user-9
content: 引用 1 楼 ovoovo 的回复:Unix或者linux都带有一个编辑器vi/vim,用这个编辑文件，然后用gcc编译器编译就可以。 vim需要安装过吧，跑sudo apt-get install vim命令 也可以下载一个eclipse。 在ubuntu的software center里面搜索安装即可。

user: user-10
content: Unix或者linux都带有一个编辑器vi/vim,用这个编辑文件，然后用gcc编译器编译就可以。
user-0 提问: C语言一算法求助

回复:
user: user-1
content: 直接用数学方法

user: user-2
content: 楼主是不是想要这样的 #include<stdio.h>  int main() { 	int i , sum=0 ; 	for (i=100 ; i<=1000 ; i+=100) 	{ 		sum=sum+i; 	} 	printf("%d\n" , sum); 	return 0; }

user: user-3
content: 我看出一个规律： 楼主粗心大意＋不识数。

user: user-4
content: 没能看出规律。。。

user: user-5
content: 没懂有什么规律

user: user-6
content: 仅供参考 #include <stdio.h>  int main() {     int start=0;     int end=1000;     int sum=0;     for(;start<end;)     {         sum=sum+start+end;         start=start+100;         end=end-100;     }     sum+=start;     printf("%d\n",sum);     return 0; }

user: user-7
content: 100+200+200...+1000 ...是什么？给个数学公式

user: user-8
content: +200+200?

user: user-9
content: 用二分法来解决这道题， 和的最大值设成100000，最小值设成0 求中间值如果减去这些数大于0，把最小值更新为得到的中间值。 大于0则把最大值更新为得到的中间值。 循环上述操作直到差为0时终止

user: user-10
content: 这也谈得上算法？
user-0 提问: 书上的TURBO C 魔方游戏

回复:
user: user-1
content: turbo c多么坑爹的软件呀！！！！ 没有智能提示，没有颜色高亮，没有下划线的错误检查，好像还不能中文注释。 为什么还有用turbo c。 建议使用visual studio

user: user-2
content: 最开始我是用turbo c的wintc来学算法的，后来逐渐转移到gcc、vc和cfree上来了

user: user-3
content: 自从用了VS，再没有用过turbo c。

user: user-4
content: 在http://www.codeproject.com搜Rubik

user: user-5
content: 你是否用turbo c在dos下编译的？否则图形库可能不支持

user: user-6
content: 看的什么书？用的什么系统呀？Toube C有点老了吧！ 我收集了三四个魔方程序，两个是Windows下，VC++6.0或者VS2010都可以编译通过用的DirectX还有什么库，另一个Linux下的，用的OpenGL库！ 给你两个链接 http://bbs.bccn.net/viewthread.php?tid=330217&extra=page%3D1%26amp%3Bfilter%3Ddigest http://bbs.bccn.net/viewthread.php?tid=330183&extra=page%3D2%26amp%3Bfilter%3Ddigest 另外一个不好找，不过这两个也够研究的了

user: user-7
content: 如果楼主有方法或者有精力的话，建议把那些源码贴上来。让大神们在自己机器上试一下，否则给您答案就像大海捞针一样。
user-0 提问: 车载WinCE系统应用框架设计 & WinCE系统下应用崩溃原因的分析方法

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:车载WinCE系统应用框架设计, 这个不错  这是工作经验的总结  多谢！

user: user-1
content: 车载WinCE系统应用框架设计, 这个不错
user-0 提问: tcp  使用select 管理客户端

回复:
user: user-0
content: 看下思路是这样的吗？？   /////////////////////////////////////////////////////////////////////////// /*          建立一个IPV4服务器， 可以接受  V4和v6 客户端的请求*/ struct sockaddr_in  saddr; struct sockaddr_in  caddr_v4; struct sockaddr_in6 caddr_v6; unsigned int ipaddr[4] = {0}; ipaddr[2] = 0xffff0000;  sockfd = socket(AF_INET, SOCK_DGRAM, 0);  saddr.sin_family = AF_INET; saddr.sin_port = htons(4321); saddr.sin_addr_s_addr = INADDR_ANY;  bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));   while(1) {     sin_size = sizeof(caddr_v6);     len = recvform(sockfd, rbuff, sizeof(rbuff), 0, (struct sockaddr *)caddr_v6, &sin_size);      if(len >0)     {         if( memcmp(ipaddr,caddr_v6.sin6_addr.s6_addr32,12) == 0)  // ipv4         {             caddr_v4.sin_family = AF_INET;             caddr_v4.sin_port = caddr_v6.sin6_port;             caddr_v4.sin_addr.s_addr = caddr_v6.sin6_addr.s6_addr32[3];                          //...         }         else         {             //...         }     } } ////////////////////////////////////////////// /*       建立一个IPV6服务器，只能接收v6 客户端的请求  */ struct sockaddr_in6 saddr_v6; struct sockaddr_in6 caddr_v6;  sockfd = socket(AF_INET6, SOCK_DGRAM, 0);  saddr.sin6_family = AF_INET6; saddr.sin6_port = htons(4321); saddr.sin6_addr = in6addr_any;  bind(sockfd, (struct sockaddr *)&saddr_v6, sizeof(saddr_v6));  while(1) {     sin_size = sizeof(caddr_v6);     len = recvform(sockfd, rbuff, sizeof(rbuff), 0, (struct sockaddr *)caddr_v6, &sin_size);      if(len >0)     {         //...     } }

user: user-0
content: 创建一个 tcp socket 服务器  IPv4    sockfd = socket(AF_INET, SOCK_STREAM ,0);  他是不是能接收IPv4 和 IPv6类型客户端的连接请求？   创建一个TCP SOCKET 服务器 IPv6    sockfd = socket(AF_INET6, SOCK_STREAM, 0)  他是不是只能接收 IPv6类型客户端的连接请求？

user: user-0
content: 引用 1 楼 user-1 的回复:有listen又有connect。。你这到底是server端还是client端了 额， 这里写错了，，是   accept。。失误。没有编译！！！！

user: user-1
content: 有listen又有connect。。你这到底是server端还是client端了
user-0 提问: 大神们求帮忙，我这个是撞球程序，在屏幕中加的红色的横杠不能正常的碰撞检测，，，帮忙修改一下屏幕中红色横杠的碰撞检测，顺便在能加几个障碍物更好。

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: 求大神帮助，C语言考试

回复:
user: user-1
content: 我在这里告诉诸位一个秘密，关于选择题的做法，对于史上一切选择题都能搞定：三短一长选最长，三长一短选最短，两短两长选C，不长不短选A。多少次的考试，我们都是靠着这几句必胜秘诀成功度过的！像我还考上了本科学校。

user: user-2
content: 这帖子可以火

user: user-3
content: 引用 楼主 u014283393 的回复:  第五题，1小题写个： #include<math.h> 估计能得1分

user: user-4
content: 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！

user: user-5
content: 顺便说下LZ，这种事就不要召唤大神了，大神对这些题都不屑一顾的，这些题就喊我们这些虾兵蟹将就行了。

user: user-6
content: 好好学吧，最好大学期间弄个2W+行的项目，找工作有点优势。等毕业了面试的时候想学时间都不够了

user: user-7
content: 平时多看看就好了。。。。。。 楼主好运

user: user-8
content: 上课不努力，现在徒伤悲。lz挽尊。。。

user: user-9
content: 是现场么？现场的话现在该来不及了。不是现场的话，我倒是可以回去给你做一下，回味下大学生活。 你们楼上的都不要这样嘛，谁不是这样过来的呢，不要一个C学不好就断送人家学业前程嘛，人家以后说不定是很好的管理者。  顺便说下LZ，这种事就不要召唤大神了，大神对这些题都不屑一顾的，这些题就喊我们这些虾兵蟹将就行了。

user: user-9
content: 我只会   第6题   B

user: user-10
content: 明天亦是未来  唉，估计不会有人回答的

user: user-11
content: 目测不会有人回答

user: user-12
content: 我觉得是问题点数分太少了 至少也要1000分啊 否则没人回答啊

user: user-4
content: 楼主应该举手要求监考或出题老师将电子版的试卷发你手机上一份！

user: user-13
content: 流逼

user: user-14
content: 过时了吧？哈哈

user: user-15
content: 拍的内容太多了，都看不清楚了.

user: user-16
content: 楼主勇气可嘉

user: user-4
content: 当初学习C语言的时候少玩点手机，现在就会做了。

user: user-17
content: 平时不发帖子 ，考试才知道求答案
user-0 提问: 关于getchar,一个简单的问题

回复:
user: user-1
content: 引用 5 楼 u014194675 的回复:c的值确实每次都会被覆盖，但是每当c接收到一个字符，这个字符就被输出了，输出之后，才被覆盖，然后又输出。。。 最后输出computer而不是r，因为输出代码在循环里面而不是循环外面。 这个例子，不应该说通过循环，getchar()得到字符串，只是通过循环，getchar()得到字符，并输出该字符。。。  for(;(c=getchar())!='\n';)         printf("%c",c); 等价于 for(;(c=getchar())!='\n';) {         printf("%c",c); } 输出语句也是循环的，每次输出一个字符。  这位说得没错

user: user-1
content: for(表达式1;表达式2;表达式3) {循环体}

user: user-2
content: getchar()是在你按回车之后才接收输入的字符的

user: user-3
content: c的值确实每次都会被覆盖，但是每当c接收到一个字符，这个字符就被输出了，输出之后，才被覆盖，然后又输出。。。 最后输出computer而不是r，因为输出代码在循环里面而不是循环外面。 这个例子，不应该说通过循环，getchar()得到字符串，只是通过循环，getchar()得到字符，并输出该字符。。。  for(;(c=getchar())!='\n';)         printf("%c",c); 等价于 for(;(c=getchar())!='\n';) {         printf("%c",c); } 输出语句也是循环的，每次输出一个字符。

user: user-4
content: /*getchar()-Note that getchar reads from stdin and is line buffered; this means it will not return until you press ENTER. */

user: user-4
content: getchar时屏幕是stdin，阻止了printf的输出？

user: user-5
content: 执行printf()时, 把c当参数传入了. 这种传值的方式会复制一份, 后面再修改c的值也没关系了.

user: user-6
content: getchar肯定不能得到字符串，你这不循环了吗，每次接受都打印了。只是你打印没那么快显示出来，缓冲了。
user-0 提问: 麻烦前辈们帮忙看看，如下两段代码，看上去几乎功能一样，为什么结果却大大不同？？

回复:
user: user-1
content: 关于malloc再啰嗦两句： 1. 要检查它的返回值是否NULL 2. 用完之后要记得free

user: user-0
content: 引用 1 楼 user-1 的回复:在main里面return之前加一行fclose(fp)再试试？ 大哥，不好意思，这个例子我发错了，不太对，我重开一贴再来问。

user: user-1
content: 在main里面return之前加一行fclose(fp)再试试？
user-0 提问: C语言字符转换

回复:
user: user-1
content: 一开始就把最终的长度计算出来。然后从最后一个开始向前移位。复杂度较低。

user: user-2
content: 这已经是俩个字符了都 后面的需要移位

user: user-0
content: 图发错了，是这个

user: user-3
content: 仅供参考： #include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-0
content: 引用 2 楼 SKATE11 的回复:这已经是俩个字符了都 后面的需要移位 什么意思？

user: user-4
content: std::string::replace
user-0 提问: 结构体和数组在内存中的存放问题

回复:
user: user-1
content: 话不多说，直接引用 引用 3 楼 buyong 的回复:[quote=引用 楼主 xhw88398569 的回复:] 比如说: 1、struct  a{     int i;     int j;}; struct a b;//b存放在堆里吗？ 2、char   ch[10];//ch[10]存放在栈里吗？ch又是存放在哪？ 3、char ch[10];       char *str = "hello word";       ch = str;       //是把str中的每一个元素都放到对应的字符数组里吗？ ch[10]实际可用空间是12字节，如果有新的数据进栈会不会覆盖后2个字节，比如char或者int类型的数据  1 b在栈上 2 在栈上 3 str在常量区。ch = str; 能编译过？[/quote]

user: user-0
content: 引用 3 楼 buyong 的回复:[quote=引用 楼主 xhw88398569 的回复:] 比如说: 1、struct  a{     int i;     int j;}; struct a b;//b存放在堆里吗？ 2、char   ch[10];//ch[10]存放在栈里吗？ch又是存放在哪？ 3、char ch[10];       char *str = "hello word";       ch = str;       //是把str中的每一个元素都放到对应的字符数组里吗？ ch[10]实际可用空间是12字节，如果有新的数据进栈会不会覆盖后2个字节，比如char或者int类型的数据  1 b在栈上 2 在栈上 3 str在常量区。ch = str; 能编译过？[/quote]后面的那个会不会覆盖呢？

user: user-0
content: 引用 3 楼 buyong 的回复:[quote=引用 楼主 xhw88398569 的回复:] 比如说: 1、struct  a{     int i;     int j;}; struct a b;//b存放在堆里吗？ 2、char   ch[10];//ch[10]存放在栈里吗？ch又是存放在哪？ 3、char ch[10];       char *str = "hello word";       ch = str;       //是把str中的每一个元素都放到对应的字符数组里吗？ ch[10]实际可用空间是12字节，如果有新的数据进栈会不会覆盖后2个字节，比如char或者int类型的数据  1 b在栈上 2 在栈上 3 str在常量区。ch = str; 能编译过？[/quote]嗯，谢谢，好长时间不写了，没注意

user: user-0
content: 引用 1 楼 user-4 的回复:局部变量存放在栈中，静态变量、全局变量和申请内存new/malloc得到的变量存放在堆中 变量名不存放在任何位置，在程序编译时直接转换成内存地址，内存地址存放在代码中 数组不能整体赋值，对数组使用=号根本编译不过去，复制字符串必须使用函数而不能使用=  最重要的是，多读书，少空想 想象是好的，空想不是嗯，谢谢

user: user-2
content: 引用 楼主 xhw88398569 的回复:比如说: 1、struct  a{     int i;     int j;}; struct a b;//b存放在堆里吗？ 2、char   ch[10];//ch[10]存放在栈里吗？ch又是存放在哪？ 3、char ch[10];       char *str = "hello word";       ch = str;       //是把str中的每一个元素都放到对应的字符数组里吗？ ch[10]实际可用空间是12字节，如果有新的数据进栈会不会覆盖后2个字节，比如char或者int类型的数据  1 b在栈上 2 在栈上 3 str在常量区。ch = str; 能编译过？

user: user-3
content: 你都没说这些东西你是在哪里声明和定义的。是函数中，还是函数外？

user: user-4
content: 局部变量存放在栈中，静态变量、全局变量和申请内存new/malloc得到的变量存放在堆中 变量名不存放在任何位置，在程序编译时直接转换成内存地址，内存地址存放在代码中 数组不能整体赋值，对数组使用=号根本编译不过去，复制字符串必须使用函数而不能使用=  最重要的是，多读书，少空想 想象是好的，空想不是
user-0 提问: 小弟新手，求哪位大哥给我把下图的算法4.9给我注释以下

回复:
user: user-1
content: 想加注释，不知往哪加，自己又不愿意敲代码。唉。。。

user: user-0
content: 引用 8 楼 zjq9931 的回复:从这两张图上来看，这本书似乎不是好书。。。 代码风格，代码排版，很让人蛋疼。。。秦锋主编的数据结构  的确不怎么好

user: user-0
content: 引用 9 楼 zxh707wk 的回复:为什么4.9那个函数没有左边的大括号。。。你看的好仔细啊

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。嗯嗯  是啊  谢谢大哥指点啊

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-3
content: 为什么4.9那个函数没有左边的大括号。。。

user: user-4
content: 从这两张图上来看，这本书似乎不是好书。。。 代码风格，代码排版，很让人蛋疼。。。

user: user-5
content: 这个代码是用来演示内存分配用的，要看懂这代码，要先弄懂 malloc 和 free 函数的左右。 malloc是用来分配内存大小的函数。一般是这样用的 （Type * ）malloc(int size)，size表示分配的内存的大小。 书中是用来分配字符串的大小所以用了sizeof(char)来获取char类型的大小在 乘上字符数 就得到了所要分配的内存大小。 malloc 函数返回的是一个 void 指针，C\C++是强类型的语言需要类型匹配，所以这里用了强制类型转换将void * 转换为char * 用到的free这一行中 之前的if 是判断p_ch是非为空，非空则用 free函数去释放  后面的for循环是来数有多少个字符要赋值给p_ch的，所得结果记录在i中。 当i = 0 时说明要付给p_ch的是个空字符，也就不用去分配内存了。返回0 应该是说明有错误，这里应该是不可以传空字符进来的。 最后的循环是将字符一个个的赋值到p_ch中去。

user: user-6
content: 像素好高啊 什么手机啊

user: user-0
content: 引用 2 楼 user-7 的回复:能不能再懒一点不是懒，我是担心自己敲的话敲错了 你们看不懂啊

user: user-0
content: 不是懒，我是担心自己敲的话敲错了 你们看不懂啊

user: user-7
content: 能不能再懒一点

user: user-0
content: 图放错位置了......有个问题，为啥那个S2都没有初始化，在第四行却直接来个pc=s2?
user-0 提问: c语言问题，急求！！！

回复:
user: user-1
content: 参考代码： http://bbs.csdn.net/topics/390814969

user: user-2
content: 你先设计一下思路。 用自然与言描述一下，要怎么做，然后在慢慢转换成C语言。
user-0 提问: 【大一新生，写一个c语言，卡住了，求解呐~~~】进来看看，求学生成绩及排名。

回复:
user: user-1
content: 引用 9 楼 u013115035 的回复:[quote=引用 8 楼 u013115035 的回复:] 抱歉，各位，这两天有点忙，就还没回复。 因为我们的题目要求的用数组来实现的，结构就没用。 数组作为函数参数的设计方法！[/quote] 不能用结构体数组吗？

user: user-2
content: 输出每个学生的学习情况？ 楼主是想说输出前5名的学生的属性吧 如果必须用数组作为函数参数，可以是一个数组包含n个学生的同一个属性，然后依靠下标向各个函数中传值

user: user-0
content: 引用 8 楼 u013115035 的回复:抱歉，各位，这两天有点忙，就还没回复。 因为我们的题目要求的用数组来实现的，结构就没用。 数组作为函数参数的设计方法！

user: user-0
content: 抱歉，各位，这两天有点忙，就还没回复。 因为我们的题目要求的用数组来实现的，结构就没用。

user: user-3
content: 引用 4 楼 u013115035 的回复:[quote=引用 2 楼 wu4357815 的回复:] 排序不建议自己写。建议用c++中的stl算法，把存储成绩的数组改成vetor即动态数组，这样不但可以输入，而且可以动态处理多少个同学。排序用stable_sort算法即可。  c++中的stl算法我们还没学，所以还不想用，嘻嘻。 vetor,而是vector这个？？？我貌似没写vetor呀  serch1(num,a,order) {if(a[i][j]>=85&&) {}}// 这里不知道如何获取“总分在前５名的学生的学习情况”并将其输出，求解答！！！谢谢 [/quote] stl大学里本来就不学，而且就你这个问题，用上去不难

user: user-4
content: 用结构体啊，亲 struct student{    int num;//学号    int text1;//课程1成绩    int text2;//课程2成绩    int text3;//课程3成绩    int grade1;//平均分    int grade2;//总分 } 这样的话你只要建立一个结构体数组然后通过对结构体数组里的成绩进行排序在逐项输出就行了呀，大体思路就是这个样子的，还有些细节你在自己更改一下吧

user: user-0
content: 引用 2 楼 wu4357815 的回复:排序不建议自己写。建议用c++中的stl算法，把存储成绩的数组改成vetor即动态数组，这样不但可以输入，而且可以动态处理多少个同学。排序用stable_sort算法即可。  c++中的stl算法我们还没学，所以还不想用，嘻嘻。 vetor,而是vector这个？？？我貌似没写vetor呀  serch1(num,a,order) {if(a[i][j]>=85&&) {}}// 这里不知道如何获取“总分在前５名的学生的学习情况”并将其输出，求解答！！！谢谢

user: user-3
content: 上面写错了，不是vetor,而是vector

user: user-3
content: 排序不建议自己写。建议用c++中的stl算法，把存储成绩的数组改成vetor即动态数组，这样不但可以输入，而且可以动态处理多少个同学。排序用stable_sort算法即可。

user: user-0
content: main主函数还没写全。在写下面的函数被卡住了了。  float order(sum[]) {for(i=0;i<10;i++) {if(sum[i]<sum[i+1]) {t= sum[i]; sum[i]=sum[i+1];sum[i+1]=t;} order[i]=sum[i+1];//把两者中的大者赋给order数组？？ }}  serch1(num,a,order) {if(a[i][j]>=85&&) {}}//这里不知道如何获取“总分在前５名的学生的学习情况”并将其输出   serch2(num,a) {if(a[i][j]<60) printf("该成绩不及格学生的成绩为：%f",a[i][j]);}     请大神帮忙解答！~~谢谢啦~~~
user-0 提问: C语言头文件定义的疑问

回复:
user: user-0
content: 引用 2 楼 u012061345 的回复:无所谓，只要宏定义不会重名即可。个人觉得一般使用有下划线的。因为C习惯上，有下划线的名字表示是代码自用的，而非释放给用户的接口。此处，这个define guard的名字显然是代码自用的。请问是不是也不一定写成TEST_H啊，是不是定义成与文件名不同的名字也可以呢？还是说只能是将文件名变成大写的形式。。我不是很懂。

user: user-1
content: 这个随便吧。有的人愿意加下划线，有的不愿意。只要保证宏定义不重复即可。

user: user-2
content: 这玩意我一贯随便写 最近的爱好是把自己喜欢的小说名字也加进去，保证不会跟别人重名

user: user-3
content: 我习惯用有下划线的。 但是我看codeBlocks自动生成的是没有下划线的。

user: user-4
content: 都可以，只要不重名，ABCDEFG都行

user: user-5
content: 两种都可以。

user: user-6
content: 这个宏的名字是可以随便取的，但是为了说明它是头文件，所以最好——H结尾，希望能帮助你！

user: user-7
content: 引用 6 楼 guodongxiaren 的回复:请问是不是也不一定写成TEST_H啊，是不是定义成与文件名不同的名字也可以呢？还是说只能是将文件名变成大写的形式。。我不是很懂。  楼上有人说了，随便命名，只要不重名即可。但一般都是用文件名的变体，因为同一个项目中，文件名重名的可能性比较低。

user: user-7
content: 无所谓，只要宏定义不会重名即可。个人觉得一般使用有下划线的。因为C习惯上，有下划线的名字表示是代码自用的，而非释放给用户的接口。此处，这个define guard的名字显然是代码自用的。

user: user-8
content: 应该使用前面没有下划线的版本。
user-0 提问: 地址为0的指针

回复:
user: user-1
content: 因为没有读写0这块内存

user: user-2
content: 嘿嘿，用0作为一个数据结构的基地址，这样其中的成员变量的地址，就是其在数据结构中的偏移地址了。 这样做更容易获取数据结构中成员变量的偏移地址了。 另外参考下博文：http://blog.csdn.net/cjf_iceking/article/details/7570105

user: user-3
content: 结构体的那个0只是用来算偏移量而已，用pointer-偏移量才是结构体的地址。这与你提出的问题不等价的。

user: user-4
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-5
content: 当你说“从火星到木星那么远”时，你不需要站在火星上或者木星上 当指针不用于操作内存时，它就只是一个整数而已，不管它的值是0还是-1，都无所谓

user: user-6
content: 因为这个宏中只是在计算指针偏移, 并没有去访问指针指向的内存.

user: user-7
content: 操作系统不会把任何数据保存在地址0及其附近  也不会把地址0~0xfff的页面映射到物理内存 所以任何对地址0的访问都会 立刻导致段错误

user: user-8
content: 因为没有使用（读写）该指针的解引用，即没有读或者写这块内存。

user: user-9
content: 因为没有赋值
user-0 提问: C语言怎么实现从文件中读取指定行内容

回复:
user: user-1
content: 直接判断'\n'的个数不就行了吗

user: user-2
content: 引用 5 楼 judwenwen2009 的回复:使用fgets函数，fgets是每次读取一行，如果你要读取第i行，可以使用while while(i--) { fgets(buf,MAX_SIZE,fd); } 丢弃了前i-1行，在读取第i行后，退出了循环，那么buf中就保存的是第i行的内容  楼上比我的写的程序要强壮的多，应该每次使用memset来清除buf，防止上一次buf中的内容未清除。 还有如果行内容太多buf会读不到行结尾的情况。 我写的这个是最简单的。。。。什么错误处理都没考虑

user: user-3
content: 仅供参考//问题： // 1.打开一个文本文件。 // 2.查找这个文本文件的第r行的第c1－c2列？ // // 如： // 文件：a // 11111111 // 22222QQQ // 33333333 // // 查找第2行，第6-8列。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXC 16000 char ln[MAXC]; FILE *f; int r,c1,c2,n,L; void getc1c2(char *fn) {     ln[c2]=0;     printf("Text at row(%d),column(%d..%d) of file %s is [%s]\n",r,c1,c2,fn,ln+c1-1); } int main(int argc,char **argv) {     if (argc<5) {     HELP:         printf("Usage:\n    %s filename.ext r c1 c2\nto get text at row(r),column(c1..c2) of filename.ext\n",argv[0]);         return 1;     }     r=atoi(argv[2]);     c1=atoi(argv[3]);     c2=atoi(argv[4]);     if (r<=0 || c1<=0 || c2<c1 || c2>=MAXC) goto HELP;     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file %s!\n",argv[1]);         return 2;     }     n=0;     while (1) {         if (NULL==fgets(ln,MAXC,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             memset(ln+L-1,0,MAXC-L+1);             n++;             if (r==n) {getc1c2(argv[1]);break;}         } else {             n++;             if (r==n) {getc1c2(argv[1]);break;}             printf("Warning: line %d too long(>%d characters)! Ignore tails.",n,MAXC);             while (1) {                 if (NULL==fgets(ln,MAXC,f)) goto END;                 L=strlen(ln);                 if ('\n'==ln[L-1]) break;             }         }     }     END:     fclose(f);     return 0; } //C:\test\Debug>frcc a 2 6 8 //Text at row(2),column(6..8) of file a is [QQQ] //

user: user-2
content: 使用fgets函数，fgets是每次读取一行，如果你要读取第i行，可以使用while while(i--) { fgets(buf,MAX_SIZE,fd); } 丢弃了前i-1行，在读取第i行后，退出了循环，那么buf中就保存的是第i行的内容

user: user-4
content: fopen fread fclose 返回字符串如果在函数里new,要在外面delete

user: user-5
content: 使用fgets可以完成这个功能；

user: user-0
content: 楼上的，你头像好酷！

user: user-6
content: 逐字读取，根据\n符来标记行号
user-0 提问: 怎样使用extern声明另一个文件中的数组

回复:
user: user-1
content: extern struct Student stu[]; 可以不需要 N

user: user-2
content: 把N和struct Student的声明都放到一个头文件里面，然后A.c和B.c都include这个头文件，然后按1楼的那样extern就行了

user: user-3
content: 在另一个文件里添加一句：extern struct Student stu[N];
user-0 提问: 怎么样实现这样的一个函数

回复:
user: user-1
content: 可以将要获取的字符串通过出参获取到，而不是通过返回值。返回值可以用来判定是否读取成功 。

user: user-2
content: 要么使用全局数组，要么在函数中分配一段内存。两种做法都有不爽的地方。 你可以参考C语言中的ctime函数，C库函数的做法就是返回全局数组。

user: user-3
content: 假定文件中的行数必定大于等于whichLine #include<stdio.h>  #include<stdlib.h>   char* ReadSpeacialLine(char* filename, int whichLine){ 	FILE *fp; 	char *pl; 	int i; 	if((fp=fopen(filename,"r"))==NULL){ 		printf("error open %s\n",filename); 		exit(0); 	} 	i=0; 	pl=(char*)malloc(1000); 	while(i<whichLine){ 		fgets(pl,1000,fp); 		i++; 	} 	return pl; } int main(){ 	char fn[100],*pl; 	int wl; 	printf("input filename: "); 	gets(fn); 	printf("whichLine: "); 	scanf("%d",& wl); 	pl=ReadSpeacialLine(fn, wl); 	printf("%s\n",pl); 	free((void*)pl); 	return 0; }
user-0 提问: 求高手解决

回复:
user: user-1
content: dest = res; //    printf("sign: %s\n",res); //    printf( "\t%s\n", src );     puts(dest);  //这里是ok的       return dest; }  不要返回局部变量的地址

user: user-2
content: static char res[33]={'\0'};

user: user-3
content: char res[33]={'\0'}; 改成 static char res[33]={'\0'};
user-0 提问: 各位，帮帮忙啊，怎么解决文件打不开就跳出程序的问题

回复:
user: user-1
content: void copy(char x[66],char y[66],char z[25])  { 	int c; 	FILE *fp1,*fp2,*fp3;  	fp1=fopen(x,"rb"); 	fp2=fopen(y,"rb"); 	fp3=fopen(z,"wb");  	if(fp3 == NULL)  		printf("Can't open file3\n");  	if(fp1 == NULL)  	{    		printf("Can't open file1\n"); 		 		if(fp2 == NULL)     		{ 			printf("Can't open file2\n"); 			return;  //直接return 		} 	 		while((c=fgetc(fp2))!=EOF) //这里 fp2 ！= null 		{ 			fputc(c,fp3); 		} 	}	 	else 	{ 		while((c=fgetc(fp1))!=EOF) 		{ 			fputc(c,fp3); 		} 	} }   //	fclose(fp1);   //	fclose(fp2); //	fclose(fp3); //}
user-0 提问: 求助：程序排错

回复:
user: user-1
content: int fun3(int num) { 	long sum; 	int i; 	int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 	sum = num * num * 1000 + num; 	 	while(sum) 	{ 		if(a[sum % 10]) 			a[sum % 10] = 0;  		sum = sum / 10; 	}  	for(i = 0; i < 10; i++) 	{ 		if(a[i] != 0) 			return 0; 	} 	 	return 1; }  int main(int argc, char* argv[]) { 	int i;  	for(i = 100; i < 1000; i++) 	{ 		if(fun3(i)) 		{ 			printf("i = %d, i * i = %ld\n", i, i * i); 		} 	} 	return 0; }  不知道我这种解法怎样？？

user: user-0
content: 感谢，问题解决。 用WIN-TC执行源代码，没有输出结果，不知什么原因。

user: user-2
content: 为何不从123遍历到三百多呢  然后判断是不是？

user: user-3
content: 好吧，看错了，是9位数。。。  #include <stdio.h>  int check_num(int m,int n) { 	int temp[10]={0}; 	int i; 	int num; 	for(;m;m=m/10) 	{ 		temp[m%10]++; 	} 	for(;n;n=n/10) 	{ 		temp[n%10]++; 	} 	for(num=i=0;i<10;i++) 	{ 		if(temp[i]==1)num++; 	} 	if(num==9)return 1; 	return 0; }  int main() { 	int i; 	for(i=100;i<=1000;i++) 	{ 		if(check_num(i,i*i)) 		{ 			printf("sqrt(%d)=%d\n",i*i,i); 		} 	} 	return 0; }

user: user-3
content: 333要改为1000

user: user-3
content: 仅供参考 /*题目要求： 使用数字1～9填充等式：sqrt(＃＃＃＃＃＃)=＃＃＃ 每个＃内数字互不相同，即遍历数字1～9 试找出所有的解。*/  #include <stdio.h>  int check_num(int m,int n) { 	int temp[10]={0}; 	int i; 	int num; 	for(;m;m=m/10) 	{ 		temp[m%10]++; 	} 	for(;n;n=n/10) 	{ 		temp[n%10]++; 	} 	for(num=i=0;i<10;i++) 	{ 		if(temp[i]==1)num++; 	} 	if(num==6)return 1; 	return 0; }  int main() { 	int i; 	for(i=100;i<=333;i++) 	{ 		if(check_num(i,i*i)) 		{ 			printf("sqrt(%d)=%d\n",i*i,i); 		} 	} 	return 0; }

user: user-0
content: 我在打开贴子之前，就猜测有2的回复。 对CSDN有所了解。

user: user-4
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: vs2013 C debug win32已过期

回复:
user: user-1
content: 如果重新生成的时候，出现如下错误： “fatal error LNK1123: 转换到 COFF 期间失败:” 建议去看这个http://jingyan.baidu.com/article/fc07f9891c556412ffe519fa.html

user: user-2
content: 如果你的程序有变化，vs就会认为你的程序已经过期，会弹出提示框。所以楼主直接勾选“不再提示”即可。

user: user-2
content: 是可行，但是每个项目都要清理再重新生成，很不方便 引用 8 楼 StrongManTwo 的回复:在解决方案资源管理器”窗口中，右击项目名，点击清理，然后点击“重新生成”，即可解决问题

user: user-2
content: 确实有用 引用 8 楼 StrongManTwo 的回复:在解决方案资源管理器”窗口中，右击项目名，点击清理，然后点击“重新生成”，即可解决问题

user: user-3
content: 我也遇到了这个问题，下面的方法解决了，谢谢你  引用 8 楼 StrongManTwo 的回复:在解决方案资源管理器”窗口中，右击项目名，点击清理，然后点击“重新生成”，即可解决问题

user: user-4
content: 在解决方案资源管理器”窗口中，右击项目名，点击清理，然后点击“重新生成”，即可解决问题

user: user-5
content: clean + rebuild all

user: user-0
content: 很郁闷啊 重装了vs2013还是不行 然后装了vs2012结果正常了

user: user-0
content: 选了是就是第三张图 不能编译  主要问题是没法include < > include < > 就是报错

user: user-6
content: 楼主贴个代码上来，我帮你试一下！

user: user-7
content: 楼上正解，选是就能编译了

user: user-8
content: 你点下 “是” 不就完了么，你想问什么？ 你不会以为提示你 VC 版本过期了吧？ 这个的意思是说你的代码比你上次编译生成的 exe 更新，直接调试可能符号和代码不对应，重新编译下再调试就 OK 了。

user: user-9
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装
user-0 提问: RSA Crypto.lib  RSAPubKeyDeCry公钥解密问题 在线==

回复:
user: user-0
content: 数据已经是加密后的。我有合法的公钥的。我再工具上测试过了的。解密数据完全正确的。

user: user-1
content: 你有合法的私钥和公钥？

user: user-0
content: RE_DATA ox0401 说明是decrypted data is not a valid PKCS#1 data block. 来高手帮忙看看啊。
user-0 提问: vc tubro返回值问题

回复:
user: user-0
content: 很谢了....

user: user-1
content: 或者将 char *s="ABCde"; 改为 char s[]="ABCde";

user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！
user-0 提问: 求大神看代码

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-2
content: 外层循环和内层循环的循环计数器怎么都用同一个变量？
user-0 提问: 自己写的strcat编译没有问题，运行报错了

回复:
user: user-1
content: 你这个函数调用时，要确定你s所指向的数组有可以修改，并且足够空间再存下。 "hello "是字符常量，一是不可修改，二是也只有6个字符大小空间，怎么可能还能再接上个"world".

user: user-2
content: 楼上回复的有点有问题 http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.html 这是关于C++内存管理的，先看看吧

user: user-2
content: char *strp=s; strp是mystrcat()函数里面的变量，是存放在栈中的，当前函数结束后，占用的资源就释放了。所以会出现错误。 char* Strcat(char* s, const char* t) { 	char* ch = s;  	while (*ch != '\0') { 		++ch; 	}  	while ((*ch++ = *t++) != '\0') { 		 	}  	return s; }

user: user-3
content: 越界了？这样做有些危险。注意别越界就行。

user: user-4
content: 函数没问题，调用的地方有问题

user: user-5
content: 常量问题。。。

user: user-6
content: 字符串常量在常量区

user: user-7
content: 内存访问问题，你都没有为目标字符串申请足够大的内存。

user: user-8
content: 引用 7 楼 cfjtaishan 的回复:"hello "因为这个字符串是字符串常量，所以是不可以进行修改的，但是你的自定义函数里对起进行了修改，所以会出现运行出错。+++++++++++

user: user-0
content: 问题解决，做了几年的JAVA把C忘的差不多了，JAVA太多事情帮忙弄好了，刚回归C感觉要考虑的东西很多啊

user: user-0
content: 不能这样直接用字符串做参数吗？

user: user-9
content: 代码就不看了，告诉你，库函数这么使用一样不行

user: user-10
content: #include <stdio.h>  char *mystrcat(char *s, const char *t) {     char *strp=s;     while(*s!='\0')     {         s++;     }     while(*s++=*t++)     {         ;     }     return strp; }  int main() {     char firststr[64]  = {"hello"};     char secondstr[64] = {" world"};      printf("%s\n", mystrcat(firststr, secondstr));     return 0; }   只给你做了少许修改，没有做错误检测。 再一个，你传进去的是指向常量区的字符串指针，常量区的内存是不允许修改的。所以你得用用数组保存起来。再做后续操作。

user: user-11
content: "hello "因为这个字符串是字符串常量，所以是不可以进行修改的，但是你的自定义函数里对起进行了修改，所以会出现运行出错。

user: user-12
content: mystrcat("hello ", "world!")中的字符串都是常量，你的函数中对"hello "常量越界操作了 应该  #include <stdio.h>  char *mystrcat(char *s, const char *t) { 	char *strp=s; 	while(*s!='\0') 	{ 		s++; 	} 	while(*s++=*t++) 	{ 		; 	} 	return strp; }  int main(void) { 	char source[120] = "hello ";         printf("%s\n", mystrcat(source, "world!"));         return 0; }

user: user-13
content: 引用 2 楼 genffe 的回复:不能这样直接用字符串做参数吗？ 传的常量字符串怎么改变内容。。
user-0 提问: 用C语言创建多叉树问题

回复:
user: user-0
content: 谢谢，多得老师提醒。现在已经靠自己解决了

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-2
content: 你的指针都分配内存了吗？ T就没有。
user-0 提问: 为什么VC6.0跟VS2013运行后的结果不一样（在贴吧里看到的一个问题）

回复:
user: user-1
content: 因为  +i                      +i        i+              +i                    +i                +i     i+  i++ii+++++i++i+i+ii+++        i++i    ++    ++            i++i+ii+++++  ++++++i+i++++ii+     i+          +i  i+                  +i    ++    +i    i+              ++    +i          ++           +i+++++++++i++i+i+                  +++++++++i+i+++i            +i    i+          +i           ++    +i  +i    +i      +i        +i      i+                    +i    i+++i++i+++++i +i+++i    ++++i++ii+i++++i++        ++++  +i        ++              i+i++i+i    +i    ++    +i     +i                  ++            ++            ++      i+      +i    i+          +i     ++      +i++i++ii++i+ii+              +++i+++i+i++i++ii++ii+    i+        +++ii++++ii++i++i+     ++      ++          i+              ++                i+        ++        ++      i+      ++     +i      ++i+i+i++i+i++            i+      i++++ii+++i++i++      i++i+i++  ++      ++      ++     ++      i+          i+        +++i+i      i+          +i              +i  +i+i+i+ii+i+++++i+     +i      i+i++i+++i++i+            +i      ++          +i              i+  +i      +i      i+     +i  ++        ++                  i+      +i          i+              +i          +i     +++i  +++i++i++++ii++i+ii+        ++      +i          ++      +i      ++          i+    i+     ++            ++                  +i      +++ii++i+++i+i        ++  +i    +++i+++++ii++i+i+i                   +i                  ++      i+          ++          i+                      ++

user: user-2
content: printf("%d,%d,%d\n", ++n, n += 2, --n); 这样的语句中，建议最好不要出现自增和自减的运算，因为不同的编译器，计算的顺序是不一样的，有的是从前往后算的，有的是从后往前算的，所以才出现楼主所说的问题

user: user-3
content: 这个问题，高手和低手都会回答不知道，回答知道的就是广大的中间层次的人

user: user-4
content: 写出这样代码的人，如果是在实际项目中使用，肯定是 SB  结果只是教学，那就算了

user: user-5
content: 这个涉及到传参顺序和规则，自加和自减操作，依赖于编译器的实现，只能VC6和vs2013使用的不是同一版本的编译器。  纠结于这些没用什么意义。

user: user-6
content: 不一样好了 一样就麻烦了 不然楼主就会认为这个就是答案了

user: user-7
content: 不一样就对了。 如果一样，又有些人出来“分析”为什么了
user-0 提问: 求一个用c/c++编写的简单c语言编译器源代码，急，急，急！！！！

回复:
user: user-1

user: user-2
content: 引用 26 楼 zhao4zhong1 的回复:[quote=引用 25 楼 my_live_123 的回复:] gcc, tcc, ucc, lcc任选一个，都是开源的，自己google！ [/quote] 赵老师卖萌~

user: user-1
content: 引用 25 楼 my_live_123 的回复:gcc, tcc, ucc, lcc任选一个，都是开源的，自己google！

user: user-3
content: gcc, tcc, ucc, lcc任选一个，都是开源的，自己google！

user: user-4
content: 引用 23 楼 zilaishuichina 的回复:多少年前曾说，csdn应该有个 课程设计版块的了  最好还是付费交易的。像淘宝一样

user: user-5
content: 多少年前曾说，csdn应该有个 课程设计版块的了

user: user-6
content: 这时候还写个毛啊，上Ｘ宝找个店花点钱买算了。

user: user-1
content: 引用 19 楼 xcg88 的回复:赵四老师帮帮忙，一个关于文本关键字问题，催的急，感激！ 已私信您了 参考astyle源代码。

user: user-7
content: 老师有点问题

user: user-8
content: 赵四老师帮帮忙，一个关于文本关键字问题，催的急，感激！ 已私信您了

user: user-1
content: 引用 16 楼 yunchao630 的回复:[quote=引用 14 楼 zhao4zhong1 的回复:] Tiny C Compiler即tcc 引用 15 楼 zyjj_99 的回复:赵4老师神一般的存在 我想问一下 赵四老师和刘能老师是什么关系？[/quote] 亲家

user: user-9
content: 参考TinyCC（http://bellard.org/tcc/）  引用 楼主 cc13645204359 的回复:求一个用c/c++编写的简单c语言编译器源代码，急，急，急！！！！  课程设计啊，就要结课了

user: user-10
content: 引用 14 楼 zhao4zhong1 的回复:Tiny C Compiler即tcc 引用 15 楼 zyjj_99 的回复:赵4老师神一般的存在 我想问一下 赵四老师和刘能老师是什么关系？

user: user-11
content: 赵4老师神一般的存在

user: user-1
content: Tiny C Compiler即tcc

user: user-12
content: http://cn.bing.com/search?q=simple+c+compiler&qs=AS&pq=simple+c+com&sc=4-12&sp=1&FORM=QBRE&cvid=61762b260e964e0291574d3b21abfcb7

user: user-0
content: 引用 11 楼 user-13 的回复:[quote=引用 9 楼 cc13645204359 的回复:] [quote=引用 7 楼 user-13 的回复:] 都6月17号了，才想起来，估计有点来不及了。楼上说的看gcc，更加来不及。 比较靠谱点的，还是借同学的改改吧。一个年级总有几个学霸的 每个人的选题都不同啊，所以来这里求助了，最近在准备考研所以没弄这个，下星期五就要交成果了，急啊。[/quote]  这么早就开始准备了啊？  还有10多天，如果改改tcc，估计有希望，加油吧[/quote] 谢了，我去下载代码看看。

user: user-13
content: 引用 9 楼 cc13645204359 的回复:[quote=引用 7 楼 user-13 的回复:] 都6月17号了，才想起来，估计有点来不及了。楼上说的看gcc，更加来不及。 比较靠谱点的，还是借同学的改改吧。一个年级总有几个学霸的 每个人的选题都不同啊，所以来这里求助了，最近在准备考研所以没弄这个，下星期五就要交成果了，急啊。[/quote]  这么早就开始准备了啊？  还有10多天，如果改改tcc，估计有希望，加油吧

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:TinyC TinyC

user: user-0
content: 引用 7 楼 user-13 的回复:都6月17号了，才想起来，估计有点来不及了。楼上说的看gcc，更加来不及。 比较靠谱点的，还是借同学的改改吧。一个年级总有几个学霸的 每个人的选题都不同啊，所以来这里求助了，最近在准备考研所以没弄这个，下星期五就要交成果了，急啊。
user-0 提问: 图像处理的程序，关于标签化的。不知道为什么老是一直运行下去。不出结果。求各位大神指教。谢谢啦

回复:
user: user-1
content: for(;;)。。。死循环，而if(cnt==0)break;不一定是等于0，这样就跳不出去了。。 还有就是你的代码好歹多写几个大括号呀

user: user-0
content: 感谢感谢

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。  编译连接通过以后，按F10或F11键单步执行，按Shift+F11返回当前函数；或者在某行按F9设了断点后按F5执行停在该断点处。
user-0 提问: array[count]=count++时发生了什么？

回复:
user: user-0
content: 引用 2 楼 piaobotudou 的回复:你打印出来的是刚好没有被  myarray[count]=count++; 赋值的元素，所以打印的是内存被申请时的原始值 嗯，明白了，刚才怎么想了想不通，绕进去了

user: user-0
content: 引用 1 楼 falcomavin 的回复:myarray[count]=count++; count被赋值后才++，后来你打印的已经不是赋值的那个数组单元了。其实你赋值的单元式0,2,4，。。。 是不是这样，我给myarray[0]赋值为0；然后count++成了1；我打印出来的就是myarray[1]的值，但myarray1还没有被赋值。

user: user-1
content: 你打印出来的是刚好没有被  myarray[count]=count++; 赋值的元素，所以打印的是内存被申请时的原始值

user: user-2
content: myarray[count]=count++; count被赋值后才++，后来你打印的已经不是赋值的那个数组单元了。其实你赋值的单元式0,2,4，。。。
user-0 提问: 急求，二维数组进行字符串的比较题目，，，急急急！！！！

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:#define MAXS 1000 //最多字符串数 #define MAXC 256   //每个字符串最多字符数 char s[MAXS][MAXC]; if (0<=strcmp(s[1],s[2])) ...

user: user-2
content: 这几天学生作孽比较多哦。

user: user-3
content: #define MAXS 1000 //最多字符串数 #define MAXC 256   //每个字符串最多字符数 char s[MAXS][MAXC]; if (0<=strcmp(s[1],s[2])) ...

user: user-4
content: 二维数组字符串比较吧。。。书上的作业吗？

user: user-5
content: lz想干啥？？？

user: user-6
content: 题目都说不清楚
user-0 提问: 程序运行崩溃，但随意添加一行代码就好不崩溃，谁能帮忙分析下。

回复:
user: user-0
content: 问题找到了， 掉用静态库中的库函数发生了memcpy越界。 汗！！！！

user: user-0
content: 引用 8 楼 yangyunzhao 的回复:内存越界(不一定是数组越界)，或者访问已经释放的区域……，所造成的后果，一般称为未定义。 也就是说如果你代码写的有问题，你无法预知可能的结果。说不定你自己测试的时候，运气好没有问题。 到工业环境中就出问题。  千万不要抱侥幸心理，还是尽量做点代码检查吧。试试pclint  有做pclint的。

user: user-0
content: 引用 7 楼 buyong 的回复:clean + rebuild all clean + rebuild all  N 遍了。

user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  为什么现在教C/C++语言的老师都不告诉学生这句话或者都自己也不会照这句话调试程序捏！  害我在CSDN复制粘贴这句话骗了多少C/C++莘莘学子的分啊！  [/quote] 想看Release版汇编指令对应C/C++源代码第几行，请在生成Release版exe的时候设置生成.pdb文件。

user: user-2
content: 根据经验，如此莫名其妙的问题，一般是内存溢出造成的。

user: user-3
content: 俺们掐指一算，楼主该啊 不上代码。。。

user: user-4
content: LZ这是盲人摸象。 其实很简单，要么上代码，要么上debugger。 原因也很简单，LZ能折腾出来的东西，多半就是内存越界什么的。

user: user-5
content: 加了代码，就有可能改变了栈和代码段的内存布局，肯定程序是有问题的。或者rebuild一下看看

user: user-6
content: 看堆栈不就行了~~

user: user-7
content: 内存越界(不一定是数组越界)，或者访问已经释放的区域……，所造成的后果，一般称为未定义。 也就是说如果你代码写的有问题，你无法预知可能的结果。说不定你自己测试的时候，运气好没有问题。 到工业环境中就出问题。  千万不要抱侥幸心理，还是尽量做点代码检查吧。试试pclint

user: user-8
content: clean + rebuild all

user: user-9
content: 前面我也遇到过类似问题， Debug下运行结果没错，一旦Release ， 不是崩就是跑出来的结果不正确， 郁闷的是加了两句cout语句，居然就正确了  那个函数就是传进去一个三维数组，而且也没有越界访问  后来把三维数组替换成别的数据结构也达到了自己的目的 但是那个问题一直萦绕在脑海！！！

user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  为什么现在教C/C++语言的老师都不告诉学生这句话或者都自己也不会照这句话调试程序捏！  害我在CSDN复制粘贴这句话骗了多少C/C++莘莘学子的分啊！

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  为什么现在教C/C++语言的老师都不告诉学生这句话或者都自己也不会照这句话调试程序捏！

user: user-0
content: 引用 1 楼 adlay 的回复:同意内存访问越界的说法  有相关的查找调试经验或方法不？ 给介绍下吧！

user: user-10
content: show me the code

user: user-11
content: 同意内存访问越界的说法
user-0 提问: void main ( )和 main ( )

回复:
user: user-1
content: 引用 30 楼 zhao4zhong1 的回复:[quote=引用 29 楼 yangwenjun2017 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 行不行由自己当前手头上的这个编译器说了算，不由各种标准和不在自己手头上的其它编译器说了算！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！ 那我是要听你的还是不要听你的呢[/quote] 参考《仙剑奇侠传》中书中仙解决沉思鬼先迈左脚还是先迈右脚问题的办法！[/quote] 我是要听你这一句还是不要听呢

user: user-2
content: 引用 29 楼 yangwenjun2017 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 行不行由自己当前手头上的这个编译器说了算，不由各种标准和不在自己手头上的其它编译器说了算！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！ 那我是要听你的还是不要听你的呢[/quote] 参考《仙剑奇侠传》中书中仙解决沉思鬼先迈左脚还是先迈右脚问题的办法！

user: user-3
content: 引用 16 楼 Liucsdn7 的回复:[quote=引用 10 楼 u013697891 的回复:] 楼主是大学生吗，为什么学习c啊  我是高中生，对C比较有兴趣，所以就买了一些书籍，以及琢磨。打算用高一高二的空余时间掌握C。[/quote]  有钱途

user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:行不行由自己当前手头上的这个编译器说了算，不由各种标准和不在自己手头上的其它编译器说了算！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！ 那我是要听你的还是不要听你的呢

user: user-4
content: 我也不大理解，但从没去深究过。。。得多看看书了。。。

user: user-0
content: 引用 20 楼 ForestDB 的回复:早期的C，如果函数没有返回类型，那么就是int，所以main()和int main()就是一个意思。  至于main()和main(void)有没有区别，忘了。 大意是说main(void)表示没有参数，而main()可以有无数参数；而C++统一起来，都是表示没有参数。 记得不准了，LZ可以挖掘下。嗯嗯

user: user-0
content: 引用 25 楼 luotuo44 的回复:没必要纠结这个问题 嗯嗯

user: user-5
content: 没必要纠结这个问题

user: user-6
content: 引用 23 楼 zhongniangyou 的回复:[quote=引用 16 楼 Liucsdn7 的回复:] [quote=引用 10 楼 u013697891 的回复:] 楼主是大学生吗，为什么学习c啊  我是高中生，对C比较有兴趣，所以就买了一些书籍，以及琢磨。打算用高一高二的空余时间掌握C。[/quote]  有钱途[/quote]  哇擦，高中就玩编程。

user: user-7
content: 因为你看的《C程序设计语言》虽然经典，但是毕竟老了。不是按C99标准来的

user: user-8
content: 书的问题，坚持标准吧

user: user-9
content: 早期的C，如果函数没有返回类型，那么就是int，所以main()和int main()就是一个意思。  至于main()和main(void)有没有区别，忘了。 大意是说main(void)表示没有参数，而main()可以有无数参数；而C++统一起来，都是表示没有参数。 记得不准了，LZ可以挖掘下。

user: user-10
content: best wishes toyou

user: user-11
content: 引用 17 楼 Liucsdn7 的回复:[quote=引用 14 楼 user-11 的回复:]  现在明白了，标准只有两个，具体的要看你手头的编译器。[/quote] 如果你考虑可移植性的话， 不能考虑某编译器特有的。

user: user-0
content: 引用 14 楼 user-11 的回复: 现在明白了，标准只有两个，具体的要看你手头的编译器。

user: user-0
content: 引用 10 楼 u013697891 的回复:楼主是大学生吗，为什么学习c啊  我是高中生，对C比较有兴趣，所以就买了一些书籍，以及琢磨。打算用高一高二的空余时间掌握C。

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:windows下和linux下是有不同的。之前在windows下编程，都基本上用void main(void)，目前在linux下编程一律使用了int main(void)形式（当然如果需要系统参数时，将main函数的参数补上）。  嗯！

user: user-11

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:行不行由自己当前手头上的这个编译器说了算，不由各种标准和不在自己手头上的其它编译器说了算！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！ 受教了！非常感谢

user: user-0
content: 受教了！非常感谢