Question: C语言学到什么程度算好？

引用 26 楼 nadleeh123 的回复:[quote=引用 楼主 w82076322 的回复:] 大一，专科，计算机专业 学校大一上学期开设C语言，下学期开设java。 现在开学十几周，已经学完了C语言的指针结构体和文件操作，但是都不是特别深入，平时随着老师讲课读了《C语言入门经典（第四版）》，刚刚买了《数据结构与算法分析:C语言描述》打算自己研读，在专业课上也写了几个一两百行的小玩意。 现在求教各位，我该如何安排接下来的C语言学习？下学期就要开设JAVA了，我该如何平衡C和java的学习？  学到你看到一段C代码，脑袋里能在10秒钟内就能还原出一段汇编[/quote] 这个技能要怎么修炼？多对应着C代码看汇编？

艺多不压身。

C是王道，JAVA了解了解就得了。

算法才是核心啊，只是我学不会！

引用 23 楼 zhao4zhong1 的回复:新大悲咒： 计算机组成原理→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看很多人说指针到后面java就被取代了，那还有必要研究透彻么？而且我本人是打算在web方向发展的

引用 20 楼 Sharing_Li 的回复:先确定你对IT这行哪个领域感兴趣，然后有针对的学习。web方向

引用 楼主 w82076322 的回复:大一，专科，计算机专业 学校大一上学期开设C语言，下学期开设java。 现在开学十几周，已经学完了C语言的指针结构体和文件操作，但是都不是特别深入，平时随着老师讲课读了《C语言入门经典（第四版）》，刚刚买了《数据结构与算法分析:C语言描述》打算自己研读，在专业课上也写了几个一两百行的小玩意。 现在求教各位，我该如何安排接下来的C语言学习？下学期就要开设JAVA了，我该如何平衡C和java的学习？  学到你看到一段C代码，脑袋里能在10秒钟内就能还原出一段汇编

这个问题其实我一直也想弄明白，我工作两年了，但是到现在还没弄懂这个问题， 我之前学习C语言的时候，主要是多做一些实际的东西， 我在学校的时候写过U盘美化啊，文件破坏啦，还应别的 MM要求给写的偷作业的程序，都是C语言写的。 ，如果要代码的话，可以问我要。 如果出来工作的话，主要就是项目驱动了，虽然也做过C相关的项目，所以知道大部分大牛（我接触到的）都是会C/C++的。 关于java和C的关系的话，现在C一般都是用于一些对效率或者内存或者其他方式要求特殊的场景（硬件相关的除外）。java这些语言用的可能比较多些。

C语言就那么点特性，很快就能学完。 编程技术和掌握一门语言是两码事。

引用 4 楼 w82076322 的回复:引用 2 楼 shimachao 的回复:用C刷完数据结构估计就差不多了。那要不要再单独刷java的数据结构？C++要不要学呢？ 数据结构比较适合用C来刷，java就不必用来刷数据结构了。你下学期学java的时候好好学java就行了。java主营业。C主内功。这是个人看法。 学习java你会遇到面向对象的概念，很有意思的。

引用 18 楼 w82076322 的回复:引用 16 楼 shimachao 的回复:[quote=引用 4 楼 w82076322 的回复:] [quote=引用 2 楼 shimachao 的回复:] 用C刷完数据结构估计就差不多了。那要不要再单独刷java的数据结构？C++要不要学呢？ 数据结构比较适合用C来刷，java就不必用来刷数据结构了。你下学期学java的时候好好学java就行了。java主营业。C主内功。这是个人看法。 学习java你会遇到面向对象的概念，很有意思的。[/quote] 什么叫做【主营业】[/quote] sorry写错了，应该是主应用

先确定你对IT这行哪个领域感兴趣，然后有针对的学习。

该如何平衡C和java的学习

引用 16 楼 shimachao 的回复:引用 4 楼 w82076322 的回复:[quote=引用 2 楼 shimachao 的回复:] 用C刷完数据结构估计就差不多了。那要不要再单独刷java的数据结构？C++要不要学呢？ 数据结构比较适合用C来刷，java就不必用来刷数据结构了。你下学期学java的时候好好学java就行了。java主营业。C主内功。这是个人看法。 学习java你会遇到面向对象的概念，很有意思的。[/quote] 什么叫做【主营业】

引用 14 楼 Adol1111 的回复:[quote=引用 11 楼 w82076322 的回复:] [quote=引用 10 楼 Adol1111 的回复:] 数据结构和算法是一种思想，它不属于一种语言。换一种语言只不过是换一种具体的写法而已。没必要每种语言都重新学一遍。 ………………因为才大一，所以目前还在纠结将来怎么弄发展。我个人比较偏好web端的项目，比如网站啊，APP啊，比较喜欢这类东西。不知道我应该学习哪些东西（哪种语言，哪些脚本语言，哪种系统或其他知识）才能使我个人去研发？[/quote] Web的话比较常用的后台语言就是Java、C#、PHP，三选一就好了。当然会涉及很多框架、设计模式什么的，好好学吧。  还有就是必须了解一个数据库，比如mysql、sql server、oracle等等，还有XML相关的操作。因为网站的主要功能无非就是增删改查，这是必须的。  但除了了解这些，最好要熟悉Ajax、原生Js、Jquery，Html，简单的CSS（复杂的交给美工），这些必须全部都会，至少要能写一些简单的，了解如何调试Js，总之会比较麻烦点，东西有点多。关于这些基础学习，可以去W3CSchool看看。  [/quote]好的，谢谢！

引用 11 楼 w82076322 的回复:[quote=引用 10 楼 Adol1111 的回复:] 数据结构和算法是一种思想，它不属于一种语言。换一种语言只不过是换一种具体的写法而已。没必要每种语言都重新学一遍。 ………………因为才大一，所以目前还在纠结将来怎么弄发展。我个人比较偏好web端的项目，比如网站啊，APP啊，比较喜欢这类东西。不知道我应该学习哪些东西（哪种语言，哪些脚本语言，哪种系统或其他知识）才能使我个人去研发？[/quote] Web的话比较常用的后台语言就是Java、C#、PHP，三选一就好了。当然会涉及很多框架、设计模式什么的，好好学吧。  还有就是必须了解一个数据库，比如mysql、sql server、oracle等等，还有XML相关的操作。因为网站的主要功能无非就是增删改查，这是必须的。  但除了了解这些，最好要熟悉Ajax、原生Js、Jquery，Html，简单的CSS（复杂的交给美工），这些必须全部都会，至少要能写一些简单的，了解如何调试Js，总之会比较麻烦点，东西有点多。关于这些基础学习，可以去W3CSchool看看。

C作为编程语言,你的指针，表达式，比较精通了，就差不多了。 函数，相信，一般没有难度，库（包括文件等IO）也不是C的核心。 只要指针，表达式懂了，函数，库 没有多少难度。  剩下的就是，算法数据结构这些和C不想干的东西了。 代码敲多了，就行了。  C就指针，难一点。 运算符多一点，所以表达式比较复杂。  学好语言，怎么使用，就和语言没关系了。

越好越好。如果暂时不感兴趣或用不到就放放。

引用 10 楼 Adol1111 的回复:数据结构和算法是一种思想，它不属于一种语言。换一种语言只不过是换一种具体的写法而已。没必要每种语言都重新学一遍。 ………………因为才大一，所以目前还在纠结将来怎么弄发展。我个人比较偏好web端的项目，比如网站啊，APP啊，比较喜欢这类东西。不知道我应该学习哪些东西（哪种语言，哪些脚本语言，哪种系统或其他知识）才能使我个人去研发？


Question: 一个关于标准C的文件操作函数的很纠结的问题

好吧，丢人了，这块知识不熟，还以为是什么自己不理解的代码错误呢！ 谢谢了！

if((fp_destine = fopen(destine,"w")) = NULL) //是==  最好这么写 if( NULL==(fp_destine = fopen(destine,"w")))


Question: 关于算法！

http://blog.csdn.net/xlm289348/article/details/9190999  排序详解

要人解释每一行代码的意思，我觉得就是这样的学习方式让楼主“不知道该定义些什么，该用什么语句，怎么样的思想” 没人能代替你思考，除了抢你工作让你失业的竞争对手

这个一百度不是一大堆么？ 而且基础C书籍上不是解释的很清楚么？


Question: 求大神看看这个代码哪错了：A+B ProblemIX

这不是计数排序嘛。 是基数排序中的一趟排序。

你的代码没问题啊 能跑出自己需要的结果，是不是你在输入数组a，b的时候 输入格式不对啊？代码我觉得写的太拖沓。


Question: ==========关于书上的一段话表示怀疑==============

引用 13 楼 zhaokai115 的回复:也许他用的机器一个byte只有4位。。。。。    [quote=引用 11 楼 sinservice 的回复:] 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。[/quote] 0x78563412

书没错啊，value的低8位是不变，高位清零。楼主应该自己动手写代码实验一下的

楼主没错,书也没错 是上帝错了

引用 3 楼 truelove12 的回复:[quote=引用 2 楼 max_min_ 的回复:] 是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1  多谢版主大人了，这书我马上就扔垃圾箱里去了。 太多错误了，把关键字default直接译成默认，明明是左移操作翻译成右移。 总之错误太多，一看就知道是一个只懂英文不懂c的人翻译的，哎。。。  书名《C语言入门经典第4版》[/quote]  找版主赔你一本书吧！看12楼

引用 12 楼 max_min_ 的回复:我的错！没仔细看上面是两段话  书上说 value是一个整数变量 value=value&0xFF; 其作用是使最右边的8位保持不变，其它位都设置为0 楼主说 我理解是0xff，二进制表示为11111111. 位与运算相同位都是1的情况下才是1.  都是对的啊！书上8位保持不变，1与1还是1,0与1还是0啊，所以不变！ 其他为都是x与0所以都是0啊  大哥，人家的书已经扔了！

版主，搞笑的？

可能是盗版书籍

书没错误！ value & 0xff 指value的32位与二进制0000 ...省略... 1111 1111相与 value的高24位与0相与，必定为0，所以叫清零 低8位与1 &， 如果value中低八位中某位为0，与1后 还是0，  某位为1， 与1后 还是为1， 所以叫保留低8位

完了，版主残害了一个身残志坚的有痣青年

看起来是正确的啊！

去把书捡回来吧…… 这段话完全正确，与1操作就是用来从一个二进制串里提取某一段的，百度一下“掩码”

引用 13 楼 zhaokai115 的回复:也许他用的机器一个byte只有4位。。。。。    [quote=引用 11 楼 sinservice 的回复:] 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。[/quote]  对于标准C/C++，这是不可能的事情

引用 13 楼 zhaokai115 的回复:也许他用的机器一个byte只有4位。。。。。    [quote=引用 11 楼 sinservice 的回复:] 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。[/quote]  那真是见鬼了。

也许他用的机器一个byte只有4位。。。。。    引用 11 楼 sinservice 的回复:书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。

引用 2 楼 max_min_ 的回复:是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1 你一定是故意的

引用 7 楼 user-17 的回复:[quote=引用 6 楼 a345485527 的回复:] [quote=引用 3 楼 truelove12 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1  多谢版主大人了，这书我马上就扔垃圾箱里去了。 太多错误了，把关键字default直接译成默认，明明是左移操作翻译成右移。 总之错误太多，一看就知道是一个只懂英文不懂c的人翻译的，哎。。。  书名《C语言入门经典第4版》[/quote] 这是什么情况，我眼花了？ 一个数&1结果不变，&0结果是0，所以书上没有问题[/quote]我也这么觉得[/quote] 同花了。。

引用value是一个整数变量 value=value&0xFF; 其作用是使最右边的8位保持不变，其它位都设置为0  这段话看起来是对的。

引用 6 楼 a345485527 的回复:[quote=引用 3 楼 truelove12 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1  多谢版主大人了，这书我马上就扔垃圾箱里去了。 太多错误了，把关键字default直接译成默认，明明是左移操作翻译成右移。 总之错误太多，一看就知道是一个只懂英文不懂c的人翻译的，哎。。。  书名《C语言入门经典第4版》[/quote] 这是什么情况，我眼花了？ 一个数&1结果不变，&0结果是0，所以书上没有问题[/quote]我也这么觉得


Question: 请教各位大神，cygwin下makefile中的recipe for target 'all' failed是什么原因？

想请问下楼主解决这个问题了吗

lz想生成sys文件吗。

出现以下信息： Makefile:15: recipe for target 'all' failed make: *** [all] Error 1 的原因是运行可执行文件（即执行./$(TARGET)这行）后返回的不是0 ，也即tdd.exe结束运行时返回的不是0 。  前面信息是tdd.exe打印的： Unity test run 1 of 1 .ledDriver/ledDriverTest.c:24:TEST(ledDriver, ledsOffAfterCreate):FAIL: Start here  ----------------------- 1 Tests 1 Failures 0 Ignored FAIL  LZ应检查该测试用例为何失败。

./$(TARGET) 这句话 干啥？执行生成的可执行文件？ 这样不可以吧？没见过这种用法的


Question: c语言排序树的问题

引用 3 楼 buyong 的回复:void insert_bst(BTREE t, int item){//递归构造二叉排序树 这是传值，不行 C语言传指针： void insert_bst(BTREE* pt, int item){//递归构造二叉排序树恩恩，自己慢慢调调好了，发现正是这个问题。

引用 1 楼 u011013370 的回复:24行调试的时候显示就有问题，是我自己添加想看看t有没有传递给in_order函数  具体一点  什么问题


Question: 编译通不过。错在哪？

引用 3 楼 cainiao366 的回复:试问这个程序好像不能得到楼主想要的功能 多谢提醒，改了之后OK了。 //lianxi7a.c 编写一个打开两个文件的程序。可以使用命令行参数或者请求用户输入来获得文件名 // a．让程序打印第一个文件的第一行、第二个文件的第一行、第一个文件的第二行、第二个文件的第二行，依此类推，直到打印完行数较多的文件的最后一行。 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) {     FILE *fp1,*fp2; 	int ch1,ch2; 	 	if(argc != 3) 	{ 	    printf("Error!\n"); 		exit(EXIT_FAILURE); 	} 	if((fp1 = fopen(argv[1],"r")) == NULL) 	{ 	    fprintf(stderr,"Can't open %s\n",argv[1]); 		exit(EXIT_FAILURE); 	} 	if((fp2 = fopen(argv[2],"r")) == NULL) 	{ 	    fprintf(stderr,"Can't open %s\n",argv[2]); 		exit(EXIT_FAILURE); 	} 	ch1 = getc(fp1); 	ch2 = getc(fp2); 	while(ch1 != EOF || ch2 != EOF) 	{ 	    while(ch1 != '\n' && ch1 != EOF) 		{     		putc(ch1,stdout); 			ch1 = getc(fp1); 		} 	   	if(ch1 == '\n') 	    { 	        putc(ch1,stdout); 		    ch1 = getc(fp1); 	    } 		while(ch2 != '\n' && ch2 != EOF) 		{     		putc(ch2,stdout); 			ch2 = getc(fp2); 		} 		if(ch2 == '\n') 		{     		putc(ch2,stdout); 			ch2 = getc(fp2); 		} 	} 	return 0; }

试问这个程序好像不能得到楼主想要的功能

引用 1 楼 user-3 的回复:编译通不过是由于下面这条语句导致的             ptc(ch2,stdout); ptc未定义，应该为             putc(ch2,stdout);  同意，楼主太不小心了，记得给我也加分啊。


Question: 新手报到，求C语言教学视频

同意楼上，郝斌老师的视频讲得确实很清楚。

http://yun.baidu.com/s/123J42 郝斌老师的，讲的挺好，看看吧

programming paradigm，斯坦福

看多遍不如自己写一段代码。

视频毛多肉少。   费时间，还是自己看书，敲代码。

个人经验是看书比较好。看视频一般只是入门阶段，想要精通还是看书比较好。推荐C Primer Plus

个人认为看视频没用。。 读书吧。


Question: this 指针是read only吗？

引用 2 楼 user-7 的回复:一个对象的this指针并不是对象本身的一部分，不会影响sizeof的结果。this指针是类的一个自动生成、自动隐藏的私有成员，存在于类的非静态成员函数中，指向被调用函数所在的对象的地址。说他是只读是正确的。 补习什么叫“成员”去。

this是rvalue，根本上就只能read，你要非认为read only那就read only吧。

说点题外话，面试宝典这种书，面试前两天翻翻就行了 不能当做学习用书

1) this指针和对象无关,不是对象的一部分。  只是在非静态成员函数的调用过程中，隐式传递的一个参数，是调用该函数的那个对象的地址。 在该函数调用过程中 this指针是不可修改的，指针的值，也是不会改变的。  对于成员函数的定义来数，是该函数的隐藏的第一个参数。 实际参数表里的参数，是更后面的参数。  其他地方不存在this指针。 也不是类的成员变量，类中一般没有这个数据。  2） D,E 只怕都是对的。  3）代码事例：    class A{    int x; public :    int getX()const{        //访问函数，隐藏参数 this，是函数的第一个参数；       //定义形式为 const A *const this;         return this->x;    }     void setX(int val){      // 修改函数，隐藏参数 this，是函数的第一个参数；      // 定义形式为 A *const this;           this->x =val;    }; };  int main{   A a;   int v=10;   v = a.getX(); // this == &a;   a.setX(v);    // this == &a;    A &r =a;    v = r.getX(); // this == &r == &a;   r.setX(v);    // this == &r == &a;    A *p = &a;      v = p->getX(); // this == p == &a;   p->setX(v);    // this == p == &a;     return 0;      }

上联：说你行你就行不行也行 下联：说不行就不行行也不行 横批：不服不行

面试就是对人的摧残

this是一个指针常量.


Question: 着急求教c语言中的位域计算

struct       {         char A:1;         char B:2;         char C:3;               }testStruct; 结构体变量testStruct占用一个字节，A、B、C分别占用该字节的1位、2位和3位。即00 000 00 0，a.x = 2;那么根据联合体的特性，x的第一个字节的形式为：00 000 01 0

000 01 0 A=0; B=1; C=0;  引用 楼主 xlz669112 的回复:union testUnion{ 	struct   	{ 		char A:1; 		char B:2; 		char C:3; 		 	}testStruct; 	int x; };  void func2() { 	testUnion a;  	a.x=2; 	printf("%d",a.testStruct.C); }


Question: 结构体，错误。。。error C2275: 'student' : illegal use of this type as an exp

楼主先去看看声明和定义的区别吧

#include <STDIO.H> /*  *  *    项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *      *    日期：2013-12-12  *  *  *  */ struct student{     char name;     int number;     int score1;     int score2;     int score3; }stu[5];//上面只是定义了这个一个结构体，下面这里才是定义五个学生；   void main(void){     int i;//最好这样定义    for(i=0;i<5;i++){//i要从0开始，因为你定义的5个学生从stu[0]开始；         printf("请输入第%d个学生的姓名",i+1);//printf（）函数输出i，前面对应的是         scanf("%s",&stu[i].name);//%c是一个字符，%s才是字符串。     } }

引用 4 楼 turingo 的回复:问题很多，都帮你改好了：   #include <stdio.h> /*  *  *  *   *    项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *    *      *     *    日期：2013-12-12  *      *  *       *  *        *  *         */ struct student {     char name[20];     int number;     int score1;     int score2;     int score3;  };  int main() {        struct student stus[6];     int i;     for (i=0;i<6;i++)     {         printf("请输入第%d个学生的姓名",i);         scanf("%s",stus[i].name);     }     return 0; }    [quote=引用 楼主 u013096814 的回复:] #include <STDIO.H> /*  *  *	项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *	  *	日期：2013-12-12  *  *  *  */ struct student { 	char name; 	int number; 	int score1; 	int score2; 	int score3;  };  void main() 	{	for (int i=1;i<6;i++) 	{ 		printf("请输入第%个学生的姓名",i); 		scanf("%c",&student[i].name); 	} }    结构体，错误。。。error C2275: 'student' : illegal use of this type as an exp[/quote] good

问题很多，都帮你改好了：   #include <stdio.h> /*  *  *  *   *    项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *    *      *     *    日期：2013-12-12  *      *  *       *  *        *  *         */ struct student {     char name[20];     int number;     int score1;     int score2;     int score3;  };  int main() {        struct student stus[6];     int i;     for (i=0;i<6;i++)     {         printf("请输入第%d个学生的姓名",i);         scanf("%s",stus[i].name);     }     return 0; }  引用 楼主 u013096814 的回复:#include <STDIO.H> /*  *  *	项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *	  *	日期：2013-12-12  *  *  *  */ struct student { 	char name; 	int number; 	int score1; 	int score2; 	int score3;  };  void main() 	{	for (int i=1;i<6;i++) 	{ 		printf("请输入第%个学生的姓名",i); 		scanf("%c",&student[i].name); 	} }    结构体，错误。。。error C2275: 'student' : illegal use of this type as an exp

struct student {     char name;     int number;     int score1;     int score2;     int score3;   };//////这样是定义中自定义类型  就像int等数据类型 只不过这是自定义的 ///你觉得int[i]这样能能用吗？肯定不能啊  同样 ///你得定义变量   student s[10]; ///这样才能用   仔细想想自定义数据类型是什么意思


Question: 请问两人聊天的程序服务器端和客户端该如何通信

Server/Client代码参考实例，网上应该一片吧、、

server和每个client会有唯一的通道号连接，发送的时候把通道号记下来

服务器端的多线程编程+自定义通信协议

引用 1 楼 a345485527 的回复:群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？

epoll or iocp,查查网络模型

群发？把所有socket存起来，一起发出去

引用 11 楼 derekrose 的回复:只能一个收一个发？ 不知道，还是有点糊涂。能不能有段服务器的代码？

只能一个收一个发？

将每个和服务器建立连接的客户端id和对应的socket保存起来。需要给哪个客户端转发信息时通过id来查找对应的scoket句柄，然后发送即可

客户端的id是不是socket

引用 6 楼 user-8 的回复:[quote=引用 3 楼 chyun7290 的回复:] [quote=引用 1 楼 a345485527 的回复:] 群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？[/quote] 肯定通过每个客户端发送消息体中对应发送客户端对应的id识别啊！[/quote] 请问能不能给段小代码

引用 5 楼 chyun7290 的回复:那我如何找b的socket呢？只有一个accept,谁请求就返回谁，难道每个ip绑定的socket只用建立一次。 accept返回后，把返回的socket和其对应的客户端id存起来，用数组，链表,或者map都可以 这样服务器就保存了所有与之连接的客户端，客户端断开后在把它从数组里面删掉 服务器只需要遍历存储所有socket的数组就可以找到客户端B对应的socket了

引用 3 楼 chyun7290 的回复:[quote=引用 1 楼 a345485527 的回复:] 群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？[/quote] 肯定通过每个客户端发送消息体中对应发送客户端对应的id识别啊！

引用 3 楼 chyun7290 的回复:[quote=引用 1 楼 a345485527 的回复:] 群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？[/quote] 可以自己定义通信的协议，客户A指明想要把这条数据发给谁，服务器收到后对其进行解析，发现是发给B的，就找到B的socket，然后再把A的数据转发一下


Question: C语言音乐播放器

引用 48 楼 u014065169 的回复:介意让我看一下源码吗？/  源码地址：http://zyplayer.com/workShare/my-music-player-lbyy 我写的一个网站，毕业了C找不到工作，转Java了~写了个小网站

引用 48 楼 u014065169 的回复:介意让我看一下源码吗？/ 源码在这里，http://123.57.75.37/workShare http://123.57.75.37/workShare/my-music-player-lbyy 我自己写的一网站，地址可能会改变~~俺的qq：806783409

引用 34 楼 q745401990 的回复:不错哦， 楼主愿意把源码分享出来吗？ 源码已分享 地址：http://123.57.75.37/workShare （我自己写的一个网站，才刚起步，可能以后会变~~~）

楼主好厉害。膜拜

竟然是去年的帖子

向跨年挖坟者致敬！

引用 6 楼 u010047583 的回复:[quote=引用 3 楼 max_min_ 的回复:] 简单介绍下过程中使用的比较好的技术！ 用到了多线程下载歌曲和歌词，还有自己写的歌词文件分析代码、网页分析代码，还有就是链表、频繁的文件操作、各种控件的使用，调用另一个程序来播放指定的MV资源，基本就这些了，还有些细节的。。。[/quote] lz你真是个人才啊！ 引用 8 楼 u010047583 的回复:[quote=引用 4 楼 booirror 的回复:] 不错，楼主前途无量啊 还不是找不到工作~！~找个实习单位都还没找到。。。[/quote] 别灰心，是金子总会发光的！！！

支持原创，楼主牛人一个！

原创要收藏起来。

楼主真牛人，赞一个

引用 40 楼 u010047583 的回复:[quote=引用 39 楼 hsyyqq 的回复:] 楼主把这个链接当简历去面试吧 入职很多年的人也不一定写的出来。 真的么？？我感觉还是比较简单的。。。[/quote]界面的创建我是用的如鹏网的一个插件，但狠多东西还是自学的，可加群讨论！

在某吧见到过你，给个赞吧。。

楼主，界面是怎么做的

引用 39 楼 hsyyqq 的回复:楼主把这个链接当简历去面试吧 入职很多年的人也不一定写的出来。 真的么？？我感觉还是比较简单的。。。

楼主把这个链接当简历去面试吧 入职很多年的人也不一定写的出来。

好强大啊

来北京找工作肯定能找到的你。我也是明年毕业也准备找工作了！一起加油！期待。。。

好吧，就下载和模糊搜歌的功能还算不错。  其他的ff音频解码 基本都提供了播放器该有的功能。  另外一款好的应用，界面也要好看。  楼主加油。

很不错，我现在写个播放器还磕磕绊绊的


Question: 底层程序中如何取一个数组中一部分的数据

用指针写一个循环；或者用memcpy这个函数

楼主所谓的底层程序是什么意思？

char* p = buf; p += 199; // 第200个数据的地址  另外，要注意char[256]的有效下标是0到255。所以你其实需要199到255。

memcpy


Question: 二维数组和一维数组（字符串）strcmp的使用？

多了一次i++，跳过了i=5的情况：  #include<stdio.h> #include<string.h> int main() {     char name[10][20]={0};     char *p;     char name1[20];     int i;     p=name1;     strcpy(name[5],"大中国");      strcpy(name1,"大中国");     printf("%s\n",p);     for(i=0;i<10;i++)     {         if(strcmp(name1,name[i])==0)         {             printf("zhaodaole\n");             break;         }     }     printf("i=%d\n",i);     return(0); }  引用 楼主 u012510962 的回复:以前一般都是用strcmp进行一维数组的比较，刚刚用它进行一维和二维的比较就出了错，求前辈指教！！  #include<stdio.h> #include<string.h> int main() { char name[10][20]={0}; char *p; char name1[20]; int i; p=name1; strcpy(name[5],"大中国");  strcpy(name1,"大中国"); printf("%s\n",p); for(i=0;i<10;i++) { if(strcmp(name1,name[i])==0) { printf("zhaodaole\n"); break; } else { i++; } } printf("i=%d\n",i); return(0); }  上面这个程序当执行“if(strcmp(name1,name[i])==0)”当i=5时，应该会跳出来吧？可是事实不是这样的。 求高手指教啊！！ 谢谢！！


Question: c语言配列地址问题求高手帮忙

只是一个地址啊，他本身又没有存储空间，怎么交换

你是想交换地址 还是···

*(ary+1)取的是ary[1]的数据  ary+1取的是 &ary[1]的地址.怎么就没这样的运算了.

楼主对内存的概念还一无所知。

地址是不能这样运算的。ary+j=tmp要改成*(ary+j)=*tmp还差不多。


Question: c语言问题求高手帮忙解答

char* message[]={"warning","syntax error","illegal value", "bus error","segmentation fault"}; 这里卖弄的几个字符串本身就是常量字符串，你是不能改变他们的。 你的第一种方法只是改变了指向他们的指针的值，并不是字串本身，所以是可行的，而第二种方法试图去改写常量字符串，结果肯定是失败啊

Strcpy的原型是：char *strcpy(char *dest, const char *src); 第二个参数是const，应该是不能改变的，而你的交换改变了第二个参数。 个人认为。


Question: 求助，有点被多维数组，指针给搞晕了

引用http://download.csdn.net/detail/chenlei76/771659#comment 谢啦

http://http://download.csdn.net/detail/chenlei76/771659#comment 传送门，仔细读一下

开debugger看，从根源上理解。

引用多级指针，该变量str1就是一个二维指针。str1是一个指针数组，即数组的元素都是一个char*类型的指针变量。char **str = strl; int **p;是一个二维指针（野指针）。 int (*p1)[2];是一个数组指针，即指向一个列数为2的二维数组，行数不定。其实该变量p1是一个一维指针。 你这个说的好像不对吧

最后一句是输出“zxv”不好意思写错了

#include <stdio.h>//大致用法自己稍微归纳下，也不知道对不对！大家一起讨论下吧！欢迎大家指正 void main(void){     char *strl[5]={"aaaaa","cc","we","zxv","asdassad"}; //指针数组，只是指针是指向char类型的字符串。 	int b[3]={10,9,8};//一维数组。 	int a[2][3]={{1,2,3},{4,5,6}};//二维数组。 	char **p;//指向指针的指针。 	int (*p1)[3]; //数组指针。 	int (*p3)[3]; //数组指针。 	int *p2[2]; //指针数组，指针是指向int类型。  	p1 = a; //数值指针赋值，指针P1指向二维数组a[2][3] 	p3 = &b;//数值指针赋值，指针P3指向一维数组b[3] 	p2[0] = a[0]; //指针数组赋值，将指针数组p2[2]中的第一个元素指向二维数组中的第一行 	p2[1] = a[1]; //指针数组赋值，将指针数组p2[2]中的第二个元素指向二维数组中的第二行 	p=strl; //指向指针的指针赋值，将指向指针的指针指向str1[0]的地址  	/*指针数组的用法*/ 	printf("%s\n",strl[0]);//这样调用才是对的。相当于strl里面有5个字符串分别放入str[0]到str[4]  	/*数组指针的用法，指向二维数组*/ 	printf("%d\n",p1);//这样输出的P1指向的地址也就是a[0][0]的地址 	printf("%d\n",*p1);//这个同样是a[0][0]的地址 	printf("%d\n",&a[0][0]);// 这个可以验证上句话的真伪 	printf("%d\n",(*p1)[0]);//这个输出的a[0][0] 	printf("%d\n",(*p1)[4]);//这个输出的是a[1][1] 	printf("%d\n",(*p1[1]+1));//也可以这么使用  	/*数组指针的用法，指向一维数组*/ 	printf("%d\n",(*p3)[2]); //等价于b[2]； 	printf("%d\n",*((*p3)+2)); //等价于b[2]；	  	/*指针数组的用法，指向二维数组*/ 	printf("%d\n",*p2[0]); // 等价于a[0][0]； 	printf("%d\n",*p2[0]+1); // 等价于a[0][1]；  	/*指向指针的指针用法，指向指针数组*/ 	printf("%d\n",*p); //这是指向str1[0]的地址 	printf("%d\n",strl[0]); // 下面可以验证上述观点。 	printf("%s\n",*p);//输出字符串"aaaa" 	printf("%s\n",*(p+3));//输出字符串"aaaa" } 只是自己的愚见。。

char *strl[5]={"aaaaa","cc","we","zxv","asdassad"}; 多级指针，该变量str1就是一个二维指针。str1是一个指针数组，即数组的元素都是一个char*类型的指针变量。char **str = strl; int **p;是一个二维指针（野指针）。 int (*p1)[2];是一个数组指针，即指向一个列数为2的二维数组，行数不定。其实该变量p1是一个一维指针。

多级指针很少超过两级。 我从来不用多维数组，因为和一维的没区别。写个类把业务逻辑包装好就行了。


Question: 字节对齐问题

如果在嵌入式领域开发，对字节对齐看的比较重要。所以，如果按照arm的4字节对齐，那么该值为12.不够4字节的会填充，即在最后一个结构体成员j后填充3个字节，以符合4字节对齐。

结果应该是12,  int 占4个字节,也就是8,   char占1个字节   也就是8+1=9,因为要补齐到结构中最大类型字节的倍数,最大类型为4,而9不是4的倍数,所以要补齐12才行.

struct X{ int i; int j; char k; }x; sizeof(x) = ? 这个问题就是个对齐的问题，如上述改为如下： struct X{ char i; int j; char k; }x; sizeof(x) = ? 和 struct X{ char i; char k; int j; }x; sizeof(x) = ? 这两个结果一样的？具体为什么可以去调试一下就懂了 要想节约最好按字符类型占空间的大小排列

要掌握它的字节数，最好用紧凑模式，可以这样写：  #pragma  pack (push,1) struct X { int i; int j; char k; }x;  #pragma pack(pop)   那么sizeof(x)就是4+4+1了。  引用 楼主 u013137832 的回复:struct X { int i; int j; char k; }x; sizeof(x) = ? 想这一类的问题平时怎么解决？看了一些资料不是很懂

看完这篇就全明白了： http://blog.csdn.net/21aspnet/article/details/6729724


Question: 栈检验括号序列，用文件

12楼还建议要删除以下行: s.top=s.base+s.stacksize;  否则出错.可用以下测试用例验证: (((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))))))))))

虽然LZ已结帖,但函数Push的错误不只是少了括号. 以下行有错: s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 第一次执行以上语句后s.base指向增大为INITSTACKSIZE+INCREMENT的内存,但以后再执行以上语句s.base指向的内存没有增大. 可用以下测试用例来暴露这个错误: (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([[[[[  12楼建议把此行改为: s.base=(char*)realloc(s.base,(s.stacksize+INCREMENT)*sizeof(char));  另外,INCREMENT定义为10不够存放一个结构Stack,至少应改为: #define INCREMENT sizeof(Stack)

仅供参考#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }

我在入栈函数处if语句少了括号，谢谢大家提醒。void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 	{ 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	} 	*s.top++=c; }

LZ程序只要修改Push函数即可： void Push(Stack &s,char c) {   if((s.top-s.base)>=s.stacksize)   {     s.base=(char*)realloc(s.base,(s.stacksize+INCREMENT)*sizeof(char));//改 s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char));     s.stacksize+=INCREMENT;   }   if(!s.base)     exit(0);   //删 s.top=s.base+s.stacksize;   //删 s.stacksize+=INCREMENT;   *s.top++=c; }

如我在10楼的答案，栈的结构不正确，另外楼掉了一个p++。  引用 7 楼 user-4 的回复:帮你改了，记得给分。 #define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { //	char *top; 	char *base; 	unsigned int count;//元素个数 	unsigned int stacksize;//内存空间 }Stack; void Push(Stack &s,char c) { 	if(/*(s.top-s.base)*/s.count>=s.stacksize) 	{ 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 		if(!s.base) 			exit(0); 		s.stacksize+=INCREMENT; 	} //	s.top=s.base+s.stacksize;  	*(s.base+s.count) = c; 	s.count ++; //	*s.top++=c; } bool Pop(Stack &s,char &c) { //	if(s.top==s.base) //		exit(0); 	if(s.count == 0) 		return false; 	c = *(s.base+s.count-1); 	s.count --; //	c=*--s.top; 	return true; } int StackEmpty(Stack s) { //	if(s.top==s.base) 	if(s.count == 0) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.count = 0; //	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }

#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	*s.top++=c; } void Pop(Stack &s,char &c) { 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   } 		  p++;                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 } 		break;        default: p++;break; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }

初步查看是你的stack数据结构有问题，第二次pop的时候直接输出的是字符'\0'  引用 6 楼 u013133423 的回复:[quote=引用 5 楼 turingo 的回复:] 你的文件内容是：  {[()[()]]  确实是右边少了一个}  [quote=引用 4 楼 u013133423 的回复:] [quote=引用 3 楼 turingo 的回复:] 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊[/quote][/quote]就是要“{[()[()]]”，看图，显示不对啊[/quote]

堆栈指针运算错误。在push的时候。

引用 5 楼 turingo 的回复:你的文件内容是：  {[()[()]]  确实是右边少了一个}  [quote=引用 4 楼 u013133423 的回复:] [quote=引用 3 楼 turingo 的回复:] 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊[/quote][/quote]就是要“{[()[()]]”，看图，显示不对啊

你的文件内容是：  {[()[()]]  确实是右边少了一个}  引用 4 楼 u013133423 的回复:[quote=引用 3 楼 turingo 的回复:] 直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊[/quote]

引用 3 楼 turingo 的回复:直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  [quote=引用 2 楼 u013133423 的回复:] [quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote][/quote]我编译时没错啊，你运行之前先建立一个文件，然后用程序打开文件啊

直接编译你所贴的代码就有不少错误，先逐条修正好，再看逻辑部分。  引用 2 楼 u013133423 的回复:[quote=引用 1 楼 turingo 的回复:] 可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！[/quote]

引用 1 楼 turingo 的回复:可否先把语法错误都改好？  [quote=引用 楼主 u013133423 的回复:] 请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }  [/quote]看不出来哪里错啦！

可否先把语法错误都改好？  引用 楼主 u013133423 的回复:请帮我改代码，不要只说大概，为什么打开内容为“{[()[()]]”的“xxx.txt”文件，程序显示“括号不匹配！”，应该为“缺乏右括号啊”#define INITSTACKSIZE 50 #define INCREMENT 10 #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct { 	char *top; 	char *base; 	int stacksize; }Stack; void Push(Stack &s,char c) { 	if((s.top-s.base)>=s.stacksize) 		s.base=(char*)realloc(s.base,(INITSTACKSIZE+INCREMENT)*sizeof(char)); 	if(!s.base) 		exit(0); 	s.top=s.base+s.stacksize; 	s.stacksize+=INCREMENT; 	*s.top++=c; } void Pop(Stack &s,char &c) { 	if(s.top==s.base) 		exit(0); 	c=*--s.top; } int StackEmpty(Stack s) { 	if(s.top==s.base) 		return 1; 	else 		return 0; } void InitStack(Stack &a) { 	a.base=(char*)malloc(INITSTACKSIZE*sizeof(char)); 	if(!a.base) 	{ 		printf("分配空间失败!\n"); 		exit(-1); 	} 	a.top=a.base; 	a.stacksize=INITSTACKSIZE; } int main() {    	FILE *fp; 	Stack s; 	char a[100],b[100],e; 	char *p; 	printf("请输入您要读取的文件名:\n"); 	gets(a); 	fp=fopen(a,"r"); 	if(fp==NULL) 	{ 		printf("打开文件失败!\n"); 		exit(0); 	} 	else 	{ 		printf("文件打开成功!\n"); 	} 		fscanf(fp,"%s",b); 	fclose(fp); puts(b); 	InitStack(s); 	p=b;  while(*p) // 没到串尾      switch(*p)      {        case '(':        case '[':        case '{':Push(s,*p++); // 左括号入栈，且p++                 break;        case ')':        case ']':        case '}':if(!StackEmpty(s)) // 栈不空                 {                   Pop(s,e); // 弹出栈顶元素                   if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))                   { // 出现3种匹配情况之外的情况                     printf("左右括号不配对\n");                     exit(0);                   }                 }                 else // 栈空                 {                   printf("缺乏左括号\n");                   exit(0);                 }        default: p++; // 其它字符不处理，指针向后移      }    if(StackEmpty(s)) // 字符串结束时栈空      printf("括号匹配\n");    else      printf("缺乏右括号\n"); 	 	return 0; }


Question: [急]用栈检验括号序列（文件操作）

#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }

栈的实现有问题...

引用 3 楼 max_min_ 的回复:引用 2 楼 u013133423 的回复:[quote=引用 1 楼 user-4 的回复:] debug过了有什么问题吗？不会啊，你帮我看看。   fclose(fp); //这个丢到函数结尾看看[/quote]fscanf函数不是在文件关闭之前已将文件内容读到内存了吗(存到数组b)？

引用 2 楼 u013133423 的回复:引用 1 楼 user-4 的回复:debug过了有什么问题吗？不会啊，你帮我看看。   fclose(fp); //这个丢到函数结尾看看

debug过了有什么问题吗？


Question: 【求助】数据结构，c语言的链表的排序问题

引用 6 楼 u013095718 的回复:[quote=引用 1 楼 user-4 的回复:] 代码中有malloc函数，所以单步调试不了？？ 什么情况  我用的是vc6.0，然后初学，所以每次单步调试到malloc函数，就会弹出一个对话框，Please Enter The Path For DBGHEAP.C.，然后就不知道咋办了……  求大神指教！[/quote] Skip it！

引用 2 楼 yulinlang 的回复:两个问题：  1.     //将链表各结点地址赋给数组P[10]     while(ptr!=NULL)     {         p[i] = ptr;         ptr = ptr->next;     } 循环中i无变化，所以仅仅为p[0]赋值 考虑改为：  while(ptr!=NULL) {         p[i++] = ptr;         ptr = ptr->next; }   2      //根据数组P，重新排列链表     i=0;     head->next = p[i];     while(p[i]->next!=NULL)     {         p[i]->next = p[i+1];         i++;     }      因为数组已排序，原来的结点顺序已打乱，尾结点可能出现在数组的任意位置，所以这样是不对的 考虑改为     //根据数组P，重新排列链表     i=0;     head->next = p[i];     while(i < 9) {         p[i]->next = p[i+1];         i++;     }     p[i]->next = NULL;  第一个问题是手误，程序运行错误和这个问题无关，第二个问题确实没考虑到，我再去试试

引用 3 楼 N_sev7 的回复:“代码中有malloc函数，所以单步调试不了” 这是什么理论 我用的是vc6.0，然后初学，所以每次单步调试到malloc函数，就会弹出一个对话框，Please Enter The Path For DBGHEAP.C.，然后就不知道咋办了……  求大神指教！

引用 1 楼 user-4 的回复:代码中有malloc函数，所以单步调试不了？？ 什么情况  我用的是vc6.0，然后初学，所以每次单步调试到malloc函数，就会弹出一个对话框，Please Enter The Path For DBGHEAP.C.，然后就不知道咋办了……  求大神指教！

_CrtDumpMemoryLeaks Dumps all of the memory blocks in the debug heap when a memory leak has occurred (debug version only).  int _CrtDumpMemoryLeaks( void );  Routine Required Header Compatibility  _CrtDumpMemoryLeaks <crtdbg.h> Win NT, Win 95    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBCD.LIB Single thread static library, debug version  LIBCMTD.LIB Multithread static library, debug version  MSVCRTD.LIB Import library for MSVCRTD.DLL, debug version    Return Value  _CrtDumpMemoryLeaks returns TRUE if a memory leak is found; otherwise, the function returns FALSE.  Remarks  The _CrtDumpMemoryLeaks function determines whether a memory leak has occurred since the start of program execution. When a leak is found, the debug header information for all of the objects in the heap is dumped in a user-readable form. When _DEBUG is not defined, calls to _CrtDumpMemoryLeaks are removed during preprocessing.  _CrtDumpMemoryLeaks is frequently called at the end of program execution to verify that all memory allocated by the application has been freed. The function can be called automatically at program termination by turning on the _CRTDBG_LEAK_CHECK_DF bit field of the _crtDbgFlag flag using the _CrtSetDbgFlag function.  _CrtDumpMemoryLeaks calls _CrtMemCheckpoint to obtain the current state of the heap and then scans the state for blocks that have not been freed. When an unfreed block is encountered, _CrtDumpMemoryLeaks calls _CrtMemDumpAllObjectsSince to dump information for all of the objects allocated in the heap from the start of program execution.   By default, internal C run-time blocks (_CRT_BLOCK) are not included in memory dump operations. The _CrtSetDbgFlag function can be used to turn on the _CRTDBG_CHECK_CRT_DF bit of _crtDbgFlag to include these blocks in the leak detection process.  For more information about heap state functions and the _CrtMemState structure, see the Heap State Reporting Functions. For information about how memory blocks are allocated, initialized, and managed in the debug version of the base heap, see Memory Management and the Debug Heap.  Example  /*****************************************************************  *  EXAMPLE  1                                                   *  *  This simple program illustrates the basic debugging features *  *  of the C runtime libraries, and the kind of debug output     *  *  that these features generate.                                *  *****************************************************************/  #include <stdio.h> #include <string.h> #include <malloc.h> #include <crtdbg.h>  // This routine place comments at the head of a section of debug output void OutputHeading( const char * explanation ) {    _RPT1( _CRT_WARN, "\n\n%s:\n**************************************\ ************************************\n", explanation ); }  // The following macros set and clear, respectively, given bits // of the C runtime library debug flag, as specified by a bitmask. #ifdef   _DEBUG #define  SET_CRT_DEBUG_FIELD(a) \             _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) #define  CLEAR_CRT_DEBUG_FIELD(a) \             _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) #else #define  SET_CRT_DEBUG_FIELD(a)   ((void) 0) #define  CLEAR_CRT_DEBUG_FIELD(a) ((void) 0) #endif   void main( ) {    char *p1, *p2;    _CrtMemState s1, s2, s3;     // Send all reports to STDOUT    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );     // Allocate 2 memory blocks and store a string in each    p1 = malloc( 34 );    strcpy( p1, "This is the p1 string (34 bytes)." );     p2 = malloc( 34 );    strcpy( p2, "This is the p2 string (34 bytes)." );      OutputHeading(        "Use _ASSERTE to check that the two strings are identical" );    _ASSERTE( strcmp( p1, p2 ) == 0 );     OutputHeading(        "Use a _RPT macro to report the string contents as a warning" );    _RPT2( _CRT_WARN, "p1 points to '%s' and \np2 points to '%s'\n", p1, p2 );     OutputHeading(        "Use _CRTMemDumpAllObjectsSince to check the p1 and p2 allocations" );    _CrtMemDumpAllObjectsSince( NULL );     free( p2 );     OutputHeading(        "Having freed p2, dump allocation information about p1 only" );    _CrtMemDumpAllObjectsSince( NULL );     // Store a memory checkpoint in the s1 memory-state structure    _CrtMemCheckpoint( &s1 );     // Allocate another block, pointed to by p2    p2 = malloc( 38 );    strcpy( p2, "This new p2 string occupies 38 bytes.");     // Store a 2nd memory checkpoint in s2    _CrtMemCheckpoint( &s2 );     OutputHeading(        "Dump the changes that occurred between two memory checkpoints" );    if ( _CrtMemDifference( &s3, &s1, &s2 ) )       _CrtMemDumpStatistics( &s3 );     // Free p2 again and store a new memory checkpoint in s2    free( p2 );    _CrtMemCheckpoint( &s2 );     OutputHeading(        "Now the memory state at the two checkpoints is the same" );    if ( _CrtMemDifference( &s3, &s1, &s2 ) )       _CrtMemDumpStatistics( &s3 );     strcpy( p1, "This new p1 string is over 34 bytes" );    OutputHeading( "Free p1 after overwriting the end of the allocation" );    free( p1 );     // Set the debug-heap flag so that freed blocks are kept on the    // linked list, to catch any inadvertent use of freed memory    SET_CRT_DEBUG_FIELD( _CRTDBG_DELAY_FREE_MEM_DF );     p1 = malloc( 10 );    free( p1 );    strcpy( p1, "Oops" );     OutputHeading( "Perform a memory check after corrupting freed memory" );    _CrtCheckMemory( );     // Use explicit calls to _malloc_dbg to save file name and line number    // information, and also to allocate Client type blocks for tracking    p1 = _malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );    p2 = _malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );    strcpy( p1, "p1 points to a Normal allocation block" );    strcpy( p2, "p2 points to a Client allocation block" );     // You must use _free_dbg to free a Client block    OutputHeading(        "Using free( ) to free a Client block causes an assertion failure" );    free( p1 );    free( p2 );     p1 = malloc( 10 );    OutputHeading( "Examine outstanding allocations (dump memory leaks)" );    _CrtDumpMemoryLeaks( );     // Set the debug-heap flag so that memory leaks are reported when    // the process terminates. Then, exit.    OutputHeading( "Program exits without freeing a memory block" );    SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF ); }  Output  Use _ASSERTE to check that the two strings are identical: ************************************************************************** C:\DEV\EXAMPLE1.C(56) : Assertion failed: strcmp( p1, p2 ) == 0   Use a _RPT macro to report the string contents as a warning: ************************************************************************** p1 points to 'This is the p1 string (34 bytes).' and  p2 points to 'This is the p2 string (34 bytes).'   Use _CRTMemDumpAllObjectsSince to check the p1 and p2 allocations: ************************************************************************** Dumping objects -> {13} normal block at 0x00660B5C, 34 bytes long  Data: <This is the p2 s> 54 68 69 73 20 69 73 20 74 68 65 20 70 32 20 73  {12} normal block at 0x00660B10, 34 bytes long  Data: <This is the p1 s> 54 68 69 73 20 69 73 20 74 68 65 20 70 31 20 73  Object dump complete.   Having freed p2, dump allocation information about p1 only: ************************************************************************** Dumping objects -> {12} normal block at 0x00660B10, 34 bytes long  Data: <This is the p1 s> 54 68 69 73 20 69 73 20 74 68 65 20 70 31 20 73  Object dump complete.   Dump the changes that occurred between two memory checkpoints: ************************************************************************** 0 bytes in 0 Free Blocks. 38 bytes in 1 Normal Blocks. 0 bytes in 0 CRT Blocks. 0 bytes in 0 IgnoreClient Blocks. 0 bytes in 0 (null) Blocks. Largest number used: 4 bytes. Total allocations: 38 bytes.   Now the memory state at the two checkpoints is the same: **************************************************************************   Free p1 after overwriting the end of the allocation: ************************************************************************** memory check error at 0x00660B32 = 0x73, should be 0xFD. memory check error at 0x00660B33 = 0x00, should be 0xFD. DAMAGE: after Normal block (#12) at 0x00660B10.   Perform a memory check after corrupting freed memory: ************************************************************************** memory check error at 0x00660B10 = 0x4F, should be 0xDD. memory check error at 0x00660B11 = 0x6F, should be 0xDD. memory check error at 0x00660B12 = 0x70, should be 0xDD. memory check error at 0x00660B13 = 0x73, should be 0xDD. memory check error at 0x00660B14 = 0x00, should be 0xDD. DAMAGE: on top of Free block at 0x00660B10. DAMAGED located at 0x00660B10 is 10 bytes long.   Using free( ) to free a Client block causes an assertion failure: ************************************************************************** dbgheap.c(1039) : Assertion failed: pHead->nBlockUse == nBlockUse   Examine outstanding allocations (dump memory leaks): ************************************************************************** Detected memory leaks! Dumping objects -> {18} normal block at 0x00660BE4, 10 bytes long  Data: <          > CD CD CD CD CD CD CD CD CD CD  Object dump complete.   Program exits without freeing a memory block: ************************************************************************** Detected memory leaks! Dumping objects -> {18} normal block at 0x00660BE4, 10 bytes long  Data: <          > CD CD CD CD CD CD CD CD CD CD  Object dump complete.

“代码中有malloc函数，所以单步调试不了” 这是什么理论

代码中有malloc函数，所以单步调试不了？？ 什么情况

引用 4 楼 zhao4zhong1 的回复:仅供参考//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //  谢谢啦，很详细清晰，我去研究下


Question: 计算器程序遇到困难就帮忙……衷心感谢

引用 4 楼 u011873193 的回复:引用 2 楼 zhao4zhong1 的回复:单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。单步调试和设断点调试是程序员必须掌握的技能之一。这个没用过，不会用…… VS IDE中，编译链接通过后，按F11，然后根据需要按F11，F10，Shift+F11

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


Question: 数组

sizeof 实际上，可以认为是预编译运算符。 不能看作，真正的 C或者C++ 语言的运算符。 sizeof 中的表达式，不需要真正求值。

看了大家的回答，自己又学到了一点，谢谢各位！

第一个是 整个数组的字节  4*100=400 第二个只是一个INT元素的字节  所以是4

a[100]是一个int元素而已，所以是4个字节。  引用 楼主 u012515459 的回复:#include"stdio.h" void main(void) { 	int a[100]; 	printf("%3d",sizeof(a)); 	printf("%3d",sizeof(a[100])); } 为什么第一个值是400，第二个值是4，求解答？

引用 3 楼 u012515459 的回复:数组的下标最大不应该是99吗？a代表的是数组的首地址，sizeof（a）的感觉应该是4啊，c语言新手，还求大神多指点？ 对数组使用sizeof的时候，得到数组的大小。

第一个表示整个数组大小，因为指针指向一个数组，第二个表示一个元素大小

sizeof只需表达式的类型，不需要计算。a[100]的类型是int

引用 楼主 u012515459 的回复:#include"stdio.h" void main(void) { 	int a[100]; 	printf("%3d",sizeof(a)); 	printf("%3d",sizeof(a[100])); } 为什么第一个值是400，第二个值是4，求解答？ sizeof(a) == 4*100;a是一个拥有100个int元素的数组； sizeof*(a[100]) == 4;a[100]就相当于a中的其中一个int元素

引用 4 楼 u012515459 的回复:数组的下标最大不应该是99吗？a代表的是数组的首地址，sizeof（a）的感觉应该是4啊，c语言新手，还求大神多指点？ sizeof (a[100]) 这里的a[100] 没进行求值 不求值 自然没有什么越界的问题

sizeof Operator sizeof expression  The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.  The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses).  When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.  For related information, see Operators.  Example  // Example of the sizeof keyword size_t  i = sizeof( int );   struct align_depends {     char c;     int i; }; size_t size = sizeof(align_depends);  // The value of size depends on                                     //  the value set with /Zp or                                     //  #pragma pack  int  array[] = { 1, 2, 3, 4, 5 };     // sizeof( array ) is 20                                        // sizeof( array[0] ) is 4  size_t  sizearr =                        // Count of items in array    sizeof( array ) / sizeof( array[0] );

引用 5 楼 Automation_dmu 的回复:不要混淆数组和指针的概念，当作为函数参数时，数组名退化为数组首元素的地址，但是sizeof 例外，在sizeof里数组名的语义是数组。  引用 4 楼 u012515459 的回复:数组的下标最大不应该是99吗？a代表的是数组的首地址，sizeof（a）的感觉应该是4啊，c语言新手，还求大神多指点？+1 In main, the name array is an array so you get the size in bytes of the array with sizeof. However, an array decays to a pointer when passed to a function, so you get sizeof(int*) inside the function.  void foo ( char a[100] );和 void foo ( char * a );是一样的，都是传递了数组的首地址而已。  但是注意，sizeof不是函数，在main函数内部使用sizeof(array)，这里的array是一个实实在在的数组，所以第一个printf("%3d",sizeof(a));打印400是没问题的。  第二个，我也不太明白，确实是越界了，我的想法是sizeof不会去检查是否越界，直接检查变量的类型，然后得出长度。   ------------------------------

不要混淆数组和指针的概念，当作为函数参数是，数组名退化为数组首元素的地址，但是sizeof 例外，在sizeof里数组名的语义是数组。  引用 4 楼 u012515459 的回复:数组的下标最大不应该是99吗？a代表的是数组的首地址，sizeof（a）的感觉应该是4啊，c语言新手，还求大神多指点？


Question: 关于二维数组作指针 如何调用问题

void convert(int *a[3]);  调用时直接用 convert(a); 多维数组做参数，除最高维外，都必须指定大小

main()函数里面调用convert()函数的时候，只需要直接传递数组a[]的首地址，也就是a就可以了。convert(a)。


引用 5 楼 ysmz4 的回复:[quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 函数的new object 和 std::auto_ptr<object>是什么关系？std::auto_ptr<object>到底是什么类型？ 模板类我不太懂[/quote] return的东西会复制初始化为返回值。自己找构造函数去。

这是一个函数定义，实现上就是New一个对象出来，编译器会隐式的传给auto_ptr构造函数。

引用 12 楼 jiandingzhe 的回复:[quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 能这么写吗？返回对象的类型和声明的返回类型不一致啊[/quote]  sure

引用 3 楼 derekrose 的回复:[quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 能这么写吗？返回对象的类型和声明的返回类型不一致啊

引用 8 楼 ysmz4 的回复:[quote=引用 6 楼 a345485527 的回复:] [quote=引用 5 楼 ysmz4 的回复:] [quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 函数的new object 和 std::auto_ptr<object>是什么关系？std::auto_ptr<object>到底是什么类型？ 模板类我不太懂[/quote]  std::auto_ptr<***>是标准库提供的智能指针，***是你要存放的类型。 这个指针时管理资源用的，可以是我们new之后不必调用delete 具体可以参考effective c++[/quote] std::auto_ptr<object> sourse(){     return new object; }难道说std::auto_ptr<object>和object类型是等同的吗[/quote] 不是，它是对指向object的指针的封装，一种RAII机制 读一下《effective c++》第三版，条款13，20分钟就能理解

引用 6 楼 a345485527 的回复:[quote=引用 5 楼 ysmz4 的回复:] [quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 函数的new object 和 std::auto_ptr<object>是什么关系？std::auto_ptr<object>到底是什么类型？ 模板类我不太懂[/quote]  std::auto_ptr<***>是标准库提供的智能指针，***是你要存放的类型。 这个指针时管理资源用的，可以是我们new之后不必调用delete 具体可以参考effective c++[/quote] std::auto_ptr<object> sourse(){     return new object; }难道说std::auto_ptr<object>和object类型是等同的吗

引用 5 楼 ysmz4 的回复:[quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 函数的new object 和 std::auto_ptr<object>是什么关系？std::auto_ptr<object>到底是什么类型？ 模板类我不太懂[/quote]  去找一找auto_ptr的例子看看吧

引用 5 楼 ysmz4 的回复:[quote=引用 3 楼 derekrose 的回复:] [quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 函数的new object 和 std::auto_ptr<object>是什么关系？std::auto_ptr<object>到底是什么类型？ 模板类我不太懂[/quote]  std::auto_ptr<***>是标准库提供的智能指针，***是你要存放的类型。 这个指针时管理资源用的，可以是我们new之后不必调用delete 具体可以参考effective c++

引用 3 楼 derekrose 的回复:[quote=引用 2 楼 ysmz4 的回复:] [quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; } [/quote] 函数的new object 和 std::auto_ptr<object>是什么关系？std::auto_ptr<object>到底是什么类型？ 模板类我不太懂

引用 3 楼 derekrose 的回复:不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; }  +1  楼主眼花了

引用 2 楼 ysmz4 的回复:[quote=引用 1 楼 derekrose 的回复:] 你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）[/quote] 不，这是一个函数的实现，你再好好看看  std::auto_ptr<object> sourse(){     return new object; }

引用 1 楼 derekrose 的回复:你具体哪里不懂 我感觉说的挺清楚的 std::auto_ptr<object>sourse(){return new object;} 我理解是：类（智能指针）std::auto_ptr包含了类object，后面sourse(){return new object;}不知道什么意思 又比如std::auto_ptr<object>p (new object);就是名字叫p的auto_ptr包含了object，并且创建了空间（未初始化）

你具体哪里不懂 我感觉说的挺清楚的


Question: 如把把下面代码改纯C语言，译出EXE到纯DOS系统运行？？

使用通用易跨平台的函数编写。  最好是c语言标准的函数和类型。

自己写个CString类， 用 C流 FILE*， fopen,fread,fwrite,fscanf,fprintf,fclose 　  ,或者代号IO函数 _creat,creat,open,_open,read,write,_read,_write,close,_colse　，　， 或者FCB IO函数（不记得有没有了）， 也可以用Dos int21 文件操作 替换API HANDLE 文件操作 CreateFile,ReadFile,WriteFile,CLoseHandle

上面两位老大，能改一份C代码学一下不？谢谢：）

就读写文件嘛，用标准的C函数fopen什么的就可以完成的操作。

不行的，DOS下没有CreateFile等API，你必须按照DOS的规则来编写你的程序，而且需要用Turbo C进行编译。  引用 楼主 BDYCAD 的回复:// ErasePUPD.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" //#include "windef.h" //#include "afx.h" #include "atlstr.h" #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <io.h> #include <iostream> //#include "winbase.h" //#include < sys\stat.h>  //#include < afx.h>  CString BC_ReadFile(char* FilePath){ 	CString OutString=""; 	HANDLE pfile;  	pfile = ::CreateFile(FilePath,GENERIC_READ,0,NULL,OPEN_EXISTING/*文件必须已经存在。由设备提出要求*/ 		,FILE_ATTRIBUTE_NORMAL/*默认属性*//*|FILE_FLAG_DELETE_ON_CLOSE关闭了上一次打开的句柄后，将文件删除。特别适合临时文件*/,NULL);//用这个函数比OpenFile好 	if ( pfile == INVALID_HANDLE_VALUE)    	{          		//MessageBox( NULL,"打开文件失败" ,"Error",MB_OK);    		CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放。 		return OutString;  	}  	DWORD filesize=GetFileSize(pfile,NULL); 	char* buffer=new char[filesize+1]; // 最后一位为 '/0',C-Style 字符串的结束符。  	DWORD readsize; 	ReadFile(pfile,buffer,filesize,&readsize,NULL); 	buffer[filesize]='\0'; 	OutString=buffer; 	//MessageBox(NULL,buffer,"Buffer Size",MB_OK); // 善后工作  	delete[] buffer; // 注意是delete[] 而不是 delete  	CloseHandle(pfile); // 关闭句柄。 	return OutString; } bool BC_WriteFile(char* FilePath,CString InWriteStr) { 	DeleteFile(FilePath);//如果要写进的文件存在，先进行删除 	CString OutString=""; 	HANDLE pfile;  	pfile = ::CreateFile(FilePath,GENERIC_WRITE,0,NULL,CREATE_NEW /*创建文件；如文件存在则会出错*/ 		,FILE_ATTRIBUTE_NORMAL/*默认属性*//*|FILE_FLAG_DELETE_ON_CLOSE关闭了上一次打开的句柄后，将文件删除。特别适合临时文件*/,NULL);//用这个函数比OpenFile好 	if ( pfile == INVALID_HANDLE_VALUE)    	{          		//MessageBox( NULL,"打开文件失败" ,"Error",MB_OK);    		CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放。 		return FALSE;  	} 	DWORD filesize=InWriteStr.GetLength();//GetFileSize(pfile,NULL); 	char* buffer=new char[filesize+1]; // 最后一位为 '/0',C-Style 字符串的结束符。  	for (int i=0;InWriteStr.GetLength()>i;i++) 	{ 		buffer[i]=InWriteStr.GetAt(i); 	} 	buffer[filesize]='\0'; 	DWORD readsize; 	WriteFile(pfile,buffer,filesize,&readsize,NULL); 	delete[] buffer; // 注意是delete[] 而不是 delete  	CloseHandle(pfile); // 关闭句柄。 	return TRUE; } CString EditPltData(CString InString){ 	CString OutString=""; 	if (InString.GetLength()>45) 	{ 		InString=InString.Mid(45,InString.GetLength()-54); 		int forlen=InString.GetLength(); 		CString Ncstring=""; 		CString Tmpstr1,Tmpstr2="PU;PD;"; 		char Gchar[7]; 		Gchar[6]='\0'; 		for (int i=0;forlen>i;i++) 		{ 			Gchar[0]=InString.GetAt(i); 			Gchar[1]=InString.GetAt(i+1); 			Gchar[2]=InString.GetAt(i+2); 			Gchar[3]=InString.GetAt(i+3); 			Gchar[4]=InString.GetAt(i+4); 			Gchar[5]=InString.GetAt(i+5); 			Tmpstr1=Gchar; 			if (Tmpstr1==Tmpstr2){//如果这6个字符是PU;PD跳过。 				i=i+5; 				continue; 			} 			OutString=OutString+InString.GetAt(i); 		} 	} 	return OutString; } bool PLTFileDeletePUPD(char* InFilePath/*读入的文件包含路径*/,char* OutFilePath /*写出的文件包含路径*/){ 	CString ReadStr=BC_ReadFile(InFilePath);//读文件 	CString NewStr=EditPltData(ReadStr);//编辑文件内容 	BC_WriteFile(OutFilePath,NewStr);//写出文件 	return TRUE; } int _tmain(int argc, _TCHAR* argv[]) { 	PLTFileDeletePUPD("c:\\work\\TEMP0.PLT","c:\\work\\BDYCUT0.PLT"); 	return 0; } 这是本人近来编写的VC代码，用VC6.0可以编译出EXE运行，但是把EXE文件搬到纯DOS系统时，不让运行，上来请教一下各位，怎么改写存纯C的？本人自学VC ，因为学的不太全面，见笑了。

不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。


Question: 请教下高手，C语言下一步做什么？

c专家编程。

<<数据结构与算法分析-C语言描述>> <<算法导论>>

我是来看看大家怎么说的，我也很迷茫

数据结构、、、

我来看各位大神的回复！

[数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf 栈，队列，链表，树。还算有个理解 图就难了

下一步可以学习数据结构和算法，工具用Code::Blocks(http://www.codeblocks.org/)，它是跨平台的。  引用 楼主 u013125216 的回复:C程序设计_第三版_谭浩强 C和指计 C Primer Plus(第五版)中文版 看完了也按自己的思路（为什么说自己的思路呢，因为只是我自己感觉那些题和我编程后结果虽然是差不了多少的，以我目前的水平也只能认了）做了7，8成编程习题 下一步要做什么？ 学生管理系统？还是联系人管理系统？ 我曾经编过学生管理系统（增加学生，删除，保存成文件，读取文件等等用链表操作）。 顺便问一下在LINUX下的C和C++用个编程套件好啊？像WINdows下的VC6.0

《Linux C编程一站式学习》

当当一下这本书如何，《C语言课程设计案例精编》。 或者向C++前进。

我看了78成，你说的第三本书，也踏踏实实的做了联系，等做完后我打算再把真这本书的内容总结一遍 顺便把大话数据结构看个大概，再总结一下数据结构顺便了解一下操作系统原理，我是个工作2年的新手，希望多交流

根据所学做一个简单的自己感兴趣的东西，慢慢探索慢慢发现不足，进步很快的

<Linux内核情景分析>

c有很多好书可以看， 也可以涉猎些 操作系统  网络 这块的 linux下工具：vim qtcreator  eclipse  code::bloks emacs ==


Question: window C的内嵌汇编转linux C 的内嵌汇编

我是这样想的，DECODE_YUYV_MMX_line  这个函数里的发错了，不知道谁能确定一下能那样改不？

引用 11 楼 zhao4zhong1 的回复:-msse3  Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation  ？  这个我是这个加的    gcc asm.c  -o asm -mmmx  又试了 gcc asm.c  -o asm -msse3 错误还是依旧

引用 8 楼 derekrose 的回复:通不过编译 报错？asm.c:274:9: 以下是报错 error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter asm.c:274:9: error: invalid 'asm': operand number missing after %-letter

是啊，都通过不了

通不过编译 报错？

void DECODE_YUYV_MMX_line(TARGB32* pDstLine,const TUInt8* pYUYV,long width) {     long expand8_width=(width>>3)<<3;          if (expand8_width>0)     {         __asm__ volatile(             "mov     %ecx,(%2)\n\t"             "mov     %eax,(%0)\n\t"             "mov     %edx,(%1)\n\t"             "lea     %eax,[%eax+%ecx*2]\n\t"             "lea     %edx,[%edx+%ecx*4]\n\t"             "neg     %ecx\n\t"                        "loop_beign:\n\t"             // YUYV_Loader_MMX(%eax+%ecx*2)             // YUV422ToRGB32_MMX(%edx+%ecx*4,movq)              "add     %ecx,8\n\t"             "jnz     loop_beign\n\t"              "mov     (%0),%eax\n\t"             "mov     (%1),%edx\n\t"             :"=r"(pYUYV),"=r"(pDstLine),"=r"(expand8_width)             :             :"memory","%eax","%edx","%ecx");     }      //处理边界     DECODE_YUYV_Common_line(pDstLine,pYUYV,width-expand8_width); }  void DECODE_YUYV_MMX(const TUInt8* pYUYV,const TPicRegion* DstPic) {     assert((DstPic->width & 1)==0);           long YUV_byte_width=(DstPic->width>>1)<<2,y;     TARGB32* pDstLine=DstPic->pdata;      for (y=0;y<DstPic->height;++y)     {         DECODE_YUYV_MMX_line(pDstLine,pYUYV,DstPic->width);         pYUYV+=YUV_byte_width;         pDstLine+=DstPic->byte_width>>2;     }         // asm emms     __asm__ volatile ("emms" ::: "memory"); }

引用 5 楼 zhao4zhong1 的回复:gcc-inline-asm.pdf这个我看了，但是初学，问题很多。 下面是我关于这个方面的改变  //一次处理8个颜色输出 #define YUV422ToRGB32_MMX(out_RGB_reg,WriteCode)                                                 \    /*input :  mm0 = Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0    */                                                \    /*         mm1 = 00 u3 00 u2 00 u1 00 u0    */                                                \    /*         mm2 = 00 v3 00 v2 00 v1 00 v0    */                                                \    /*output : [out_RGB_reg -- out_RGB_reg+8*4]                 */                                \                                                                                \       __asm__ volatile(   "psubusb     %%mm0,(%0)\n\t"        /* %%mm0 : Y -= 16                       */      \                           "psubsw      %%mm1,(%1)\n\t"       /* %%mm1 : u -= 128                      */      \                           "movq        %%mm7,%%mm0\n\t"                                                              \                           "psubsw      %%mm2,(%1)\n\t"       /* %%mm2 : v -= 128                      */      \                           "pand        %%mm0,(%2)\n\t"    /* %%mm0 = 00 Y6 00 Y4 00 Y2 00 Y0       */      \                           "psllw       %%mm1,3\n\t"                 /* %%mm1 : u *= 8                        */      \                           "psllw       %%mm2,3\n\t"                 /* %%mm2 : v *= 8                        */      \                           "psrlw       %%mm7,8\n\t"                 /* %%mm7 = 00 Y7 00 Y5 00 Y3 00 Y1       */      \                           "movq        %%mm3,%%mm1\n\t"                                                              \                           "movq        %%mm4,%%mm2\n\t"                                                              \                                                                                \                           "pmulhw      %%mm1,(%5)\n\t"   /* %%mm1 = u * U_green                   */      \                           "psllw       %%mm0,3\n\t"                 /* y*=8                                */      \                           "pmulhw      %%mm2,(%6)\n\t"   /* %%mm2 = v * V_green                   */      \                           "psllw       %%mm7,3\n\t"                 /* y*=8                                */      \                           "pmulhw      %%mm3,(%4)\n\t"                                                   \                           "paddsw      %%mm1,%%mm2\n\t"                                                              \                           "pmulhw      %%mm4,(%7)\n\t"                                                    \                           "movq        %%mm2,%%mm3\n\t"                                                              \                           "pmulhw      %%mm0,(%3)\n\t"                                                  \                           "movq        %%mm6,%%mm4\n\t"                                                              \                           "pmulhw      %%mm7,(%3)\n\t"                                                  \                           "movq        %%mm5,%%mm1\n\t"                                                              \                           "paddsw      %%mm3,%%mm0\n\t"               /* %%mm3 = B6 B4 B2 B0       */                  \                           "paddsw      %%mm2,%%mm7\n\t"               /* %%mm2 = B7 B5 B3 B1       */                  \                           "paddsw      %%mm4,%%mm0\n\t"               /* %%mm4 = R6 R4 R2 R0       */                  \                           "paddsw      %%mm6,%%mm7\n\t"               /* %%mm6 = R7 R5 R3 R1       */                  \                           "paddsw      %%mm1,%%mm0\n\t"               /* %%mm1 = G6 G4 G2 G0       */                  \                           "paddsw      %%mm5,%%mm7\n\t"               /* %%mm5 = G7 G5 G3 G1       */                  \                                                                                \                           "packuswb    %%mm3,%%mm4\n\t"               /* %%mm3 = R6 R4 R2 R0 B6 B4 B2 B0 to [0-255] */ \                           "packuswb    %%mm2,%%mm6\n\t"               /* %%mm2 = R7 R5 R3 R1 B7 B5 B3 B1 to [0-255] */ \                           "packuswb    %%mm5,%%mm1\n\t"               /* %%mm5 = G6 G4 G2 G0 G7 G5 G3 G1 to [0-255] */ \                           "movq        %%mm4,%%mm3\n\t"                                                              \                           "punpcklbw   %%mm3,%%mm2\n\t"               /* %%mm3 = B7 B6 B5 B4 B3 B2 B1 B0     */        \                           "punpckldq   %%mm1,%%mm5\n\t"               /* %%mm1 = G7 G5 G3 G1 xx xx xx xx     */        \                           "punpckhbw   %%mm4,%%mm2\n\t"               /* %%mm4 = R7 R6 R5 R4 R3 R2 R1 R0     */        \                           "punpckhbw   %%mm5,%%mm1\n\t"               /* %%mm5 = G7 G6 G5 G4 G3 G2 G1 G0     */        \                                                                                \             /*out*/                                                                          \                           "pcmpeqb     %%mm2,%%mm2\n\t"               /* %%mm2 = FF FF FF FF FF FF FF FF     */        \                                                                                \                           "movq        %%mm0,%%mm3\n\t"                                                              \                           "movq        %%mm7,%%mm4\n\t"                                                              \                           "punpcklbw   %%mm0,%%mm5\n\t"             /* %%mm0 = G3 B3 G2 B2 G1 B1 G0 B0       */        \                           "punpcklbw   %%mm7,%%mm2\n\t"             /* %%mm7 = FF R3 FF R2 FF R1 FF R0       */        \                           "movq        %%mm1,%%mm0\n\t"                                                              \                           "movq        %%mm6,%%mm3\n\t"                                                              \                           "punpcklwd   %%mm0,%%mm7\n\t"             /* %%mm0 = FF R1 G1 B1 FF R0 G0 B0       */        \                           "punpckhwd   %%mm1,%%mm7\n\t"             /* %%mm1 = FF R3 G3 B3 FF R2 G2 B2       */        \                           "WriteCode   [out_RGB_reg],%%mm0\n\t"                                                    \                           "movq        %%mm7,%%mm4\n\t"                                                              \                           "punpckhbw   %%mm6,%%mm5\n\t"             /* %%mm6 = G7 B7 G6 B6 G5 B5 G4 B4       */        \                           "WriteCode   [out_RGB_reg+8],%%mm1\n\t"                                                  \                           "punpckhbw   %%mm7,%%mm2\n\t"             /* %%mm7 = FF R7 FF R6 FF R5 FF R4      */         \                           "movq        %%mm0,%%mm6\n\t"                                                              \                           "punpcklwd   %%mm6,%%mm7\n\t"             /* %%mm6 = FF R5 G5 B5 FF R4 G4 B4      */         \                           "punpckhwd   %%mm0,%%mm7\n\t"             /* %%mm0 = FF R7 G7 B7 FF R6 G6 B6      */         \                           "WriteCode  [out_RGB_reg+8*2],%%mm6\n\t"                                                 \                           "WriteCode  [out_RGB_reg+8*3],%%mm0\n\t"                                               \                           :"r"(csMMX_16_b),"r"(csMMX_128_w),"r"(csMMX_0x00FF_w),"r"(csMMX_Y_coeff_w),"r"(csMMX_U_blue_w),"r"(csMMX_U_green_w),"r"(csMMX_V_green_w),"r"(csMMX_V_red_w)\                           :\                           :"memory", "%eax");    #define YUYV_Loader_MMX(in_yuv_reg)                                                         \    __asm__ volatile ("movq        %%mm0,[in_yuv_reg  ]\n\t" /*%%mm0=V1 Y3 U1 Y2 V0 Y1 U0 Y0  */                \                      "movq        %%mm4,[in_yuv_reg+8]\n\t" /*%%mm4=V3 Y7 U3 Y6 V2 Y5 U2 Y4  */                \                      "movq        %%mm1,%%mm0           \n\t"                                                  \                      "movq        %%mm5,%%mm4           \n\t"                                                  \                      "psrlw       %%mm1,8             \n\t" /*%%mm1=00 V1 00 U1 00 V0 00 U0  */                \                      "psrlw       %%mm5,8             \n\t" /*%%mm5=00 V3 00 U3 00 V2 00 U2  */                \                      "pand        %%mm0,(%0)\n\t" /*%%mm0=00 Y3 00 Y2 00 Y1 00 Y0  */                \                      "pand        %%mm4,(%0)\n\t" /*%%mm4=00 Y7 00 Y6 00 Y5 00 Y4  */                \                      "packuswb    %%mm1,%%mm5           \n\t" /*%%mm1=V3 U3 V2 U2 V1 U1 V0 U0  */                \                      "movq        %%mm2,%%mm1           \n\t"                                                  \                      "packuswb    %%mm0,%%mm4           \n\t" /*%%mm0=Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0  */                \                      "psllw       %%mm1,8             \n\t" /*%%mm1=U3 00 U2 00 U1 00 U0 00  */                \                      "psrlw       %%mm2,8             \n\t" /*%%mm2=00 V3 00 V2 00 V1 00 V0  */                \                      "psrlw       %%mm1,8             \n\t" /*mm1=00 U3 00 U2 00 U1 00 U0  */                \                      : "r" (csMMX_0x00FF_w)\                      :\                      :"memory" );

gcc-inline-asm.pdf

#define YUV422ToRGB32_MMX(out_RGB_reg,WriteCode)                                                 \    /*input :  mm0 = Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0    */                                                \    /*         mm1 = 00 u3 00 u2 00 u1 00 u0    */                                                \    /*         mm2 = 00 v3 00 v2 00 v1 00 v0    */                                                \    /*output : [out_RGB_reg -- out_RGB_reg+8*4]                 */                                \                                                                                \           asm   psubusb     mm0,csMMX_16_b        /* mm0 : Y -= 16                       */      \           asm   psubsw      mm1,csMMX_128_w       /* mm1 : u -= 128                      */      \           asm   movq        mm7,mm0                                                              \           asm   psubsw      mm2,csMMX_128_w       /* mm2 : v -= 128                      */      \           asm   pand        mm0,csMMX_0x00FF_w    /* mm0 = 00 Y6 00 Y4 00 Y2 00 Y0       */      \           asm   psllw       mm1,3                 /* mm1 : u *= 8                        */      \           asm   psllw       mm2,3                 /* mm2 : v *= 8                        */      \           asm   psrlw       mm7,8                 /* mm7 = 00 Y7 00 Y5 00 Y3 00 Y1       */      \           asm   movq        mm3,mm1                                                              \           asm   movq        mm4,mm2                                                              \                                                                                \           asm   pmulhw      mm1,csMMX_U_green_w   /* mm1 = u * U_green                   */      \           asm   psllw       mm0,3                 /* y*=8                                */      \           asm   pmulhw      mm2,csMMX_V_green_w   /* mm2 = v * V_green                   */      \           asm   psllw       mm7,3                 /* y*=8                                */      \           asm   pmulhw      mm3,csMMX_U_blue_w                                                   \           asm   paddsw      mm1,mm2                                                              \           asm   pmulhw      mm4,csMMX_V_red_w                                                    \           asm   movq        mm2,mm3                                                              \           asm   pmulhw      mm0,csMMX_Y_coeff_w                                                  \           asm   movq        mm6,mm4                                                              \           asm   pmulhw      mm7,csMMX_Y_coeff_w                                                  \           asm   movq        mm5,mm1                                                              \           asm   paddsw      mm3,mm0               /* mm3 = B6 B4 B2 B0       */                  \           asm   paddsw      mm2,mm7               /* mm2 = B7 B5 B3 B1       */                  \           asm   paddsw      mm4,mm0               /* mm4 = R6 R4 R2 R0       */                  \           asm   paddsw      mm6,mm7               /* mm6 = R7 R5 R3 R1       */                  \           asm   paddsw      mm1,mm0               /* mm1 = G6 G4 G2 G0       */                  \           asm   paddsw      mm5,mm7               /* mm5 = G7 G5 G3 G1       */                  \                                                                                \           asm   packuswb    mm3,mm4               /* mm3 = R6 R4 R2 R0 B6 B4 B2 B0 to [0-255] */ \           asm   packuswb    mm2,mm6               /* mm2 = R7 R5 R3 R1 B7 B5 B3 B1 to [0-255] */ \           asm   packuswb    mm5,mm1               /* mm5 = G6 G4 G2 G0 G7 G5 G3 G1 to [0-255] */ \           asm   movq        mm4,mm3                                                              \           asm   punpcklbw   mm3,mm2               /* mm3 = B7 B6 B5 B4 B3 B2 B1 B0     */        \           asm   punpckldq   mm1,mm5               /* mm1 = G7 G5 G3 G1 xx xx xx xx     */        \           asm   punpckhbw   mm4,mm2               /* mm4 = R7 R6 R5 R4 R3 R2 R1 R0     */        \           asm   punpckhbw   mm5,mm1               /* mm5 = G7 G6 G5 G4 G3 G2 G1 G0     */        \                                                                                \                 /*out*/                                                                          \           asm   pcmpeqb     mm2,mm2               /* mm2 = FF FF FF FF FF FF FF FF     */        \                                                                                \           asm   movq        mm0,mm3                                                              \           asm   movq        mm7,mm4                                                              \           asm   punpcklbw   mm0,mm5             /* mm0 = G3 B3 G2 B2 G1 B1 G0 B0       */        \           asm   punpcklbw   mm7,mm2             /* mm7 = FF R3 FF R2 FF R1 FF R0       */        \           asm   movq        mm1,mm0                                                              \           asm   movq        mm6,mm3                                                              \           asm   punpcklwd   mm0,mm7             /* mm0 = FF R1 G1 B1 FF R0 G0 B0       */        \           asm   punpckhwd   mm1,mm7             /* mm1 = FF R3 G3 B3 FF R2 G2 B2       */        \           asm   WriteCode   [out_RGB_reg],mm0                                                    \           asm   movq        mm7,mm4                                                              \           asm   punpckhbw   mm6,mm5             /* mm6 = G7 B7 G6 B6 G5 B5 G4 B4       */        \           asm   WriteCode   [out_RGB_reg+8],mm1                                                  \           asm   punpckhbw   mm7,mm2             /* mm7 = FF R7 FF R6 FF R5 FF R4      */         \           asm   movq        mm0,mm6                                                              \           asm   punpcklwd   mm6,mm7             /* mm6 = FF R5 G5 B5 FF R4 G4 B4      */         \           asm   punpckhwd   mm0,mm7             /* mm0 = FF R7 G7 B7 FF R6 G6 B6      */         \           asm   WriteCode  [out_RGB_reg+8*2],mm6                                                 \           asm   WriteCode  [out_RGB_reg+8*3],mm0                                           //YUV视频格式到RGB32格式的转换函数，MMX指令实现版本     #define YUYV_Loader_MMX(in_yuv_reg)                                                         \           asm   movq        mm0,[in_yuv_reg  ] /*mm0=V1 Y3 U1 Y2 V0 Y1 U0 Y0  */                \           asm   movq        mm4,[in_yuv_reg+8] /*mm4=V3 Y7 U3 Y6 V2 Y5 U2 Y4  */                \           asm   movq        mm1,mm0                                                             \           asm   movq        mm5,mm4                                                             \           asm   psrlw       mm1,8              /*mm1=00 V1 00 U1 00 V0 00 U0  */                \           asm   psrlw       mm5,8              /*mm5=00 V3 00 U3 00 V2 00 U2  */                \           asm   pand        mm0,csMMX_0x00FF_w /*mm0=00 Y3 00 Y2 00 Y1 00 Y0  */                \           asm   pand        mm4,csMMX_0x00FF_w /*mm4=00 Y7 00 Y6 00 Y5 00 Y4  */                \           asm   packuswb    mm1,mm5            /*mm1=V3 U3 V2 U2 V1 U1 V0 U0  */                \           asm   movq        mm2,mm1                                                             \           asm   packuswb    mm0,mm4            /*mm0=Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0  */                \           asm   psllw       mm1,8              /*mm1=U3 00 U2 00 U1 00 U0 00  */                \           asm   psrlw       mm2,8              /*mm2=00 V3 00 V2 00 V1 00 V0  */                \           asm   psrlw       mm1,8              /*mm1=00 U3 00 U2 00 U1 00 U0  */                          void DECODE_YUYV_MMX_line(TARGB32* pDstLine,const TUInt8* pYUYV,long width)     {         long expand8_width=(width>>3)<<3;                  if (expand8_width>0)         {             asm             {                 mov     ecx,expand8_width                 mov     eax,pYUYV                 mov     edx,pDstLine                 lea     eax,[eax+ecx*2]                 lea     edx,[edx+ecx*4]                 neg     ecx                                loop_beign:                 YUYV_Loader_MMX(eax+ecx*2)                 YUV422ToRGB32_MMX(edx+ecx*4,movq)                  add     ecx,8                 jnz     loop_beign                  mov     pYUYV,eax                 mov     pDstLine,edx             }         }          //处理边界         DECODE_YUYV_Common_line(pDstLine,pYUYV,width-expand8_width);     }  void DECODE_YUYV_MMX(const TUInt8* pYUYV,const TPicRegion* DstPic) {           long YUV_byte_width=(DstPic->width>>1)<<2,y;     TARGB32* pDstLine=DstPic->pdata;      for (y=0;y<DstPic->height;++y)     {         DECODE_YUYV_MMX_line(pDstLine,pYUYV,DstPic->width);         pYUYV+=YUV_byte_width;         pDstLine+=DstPic->byte_width>>2;     }         asm emms } 这个是我修改后的，会产生问题： asm.c: In function ‘DECODE_YUYV_MMX_line’: asm.c:423:13: error: expected ‘(’ before ‘{’ token asm.c:424:17: error: unknown type name ‘mov’ asm.c:425:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘mov’ asm.c: In function ‘DECODE_YUYV_MMX’: asm.c:459:9: error: expected ‘(’ before ‘emms’ asm.c:459:9: error: ‘emms’ undeclared (first use in this function) asm.c:459:9: note: each undeclared identifier is reported only once for each function it appears in asm.c:460:1: error: expected ‘;’ before ‘}’ token asm.c: In function ‘DECODE_YUYV_MMX_line’: asm.c:495:1: error: expected declaration or statement at end of input

现在手写汇编已经不能提高运行效率了，编译器更懂怎么针对cpu进行优化 除非代码写的烂，编译器没办法优化。

直接拷贝过去，不行吗？

续接上面的函数主体  void DECODE_YUYV_MMX_line(TARGB32* pDstLine,const TUInt8* pYUYV,long width)     {         long expand8_width=(width>>3)<<3;                  if (expand8_width>0)         {             asm             {                 mov     ecx,expand8_width                 mov     eax,pYUYV                 mov     edx,pDstLine                 lea     eax,[eax+ecx*2]                 lea     edx,[edx+ecx*4]                 neg     ecx                                loop_beign:                 YUYV_Loader_MMX(eax+ecx*2)                 YUV422ToRGB32_MMX(edx+ecx*4,movq)                  add     ecx,8                 jnz     loop_beign                  mov     pYUYV,eax                 mov     pDstLine,edx             }         }          //处理边界         DECODE_YUYV_Common_line(pDstLine,pYUYV,width-expand8_width);     }  void DECODE_YUYV_MMX(const TUInt8* pYUYV,const TPicRegion& DstPic) {     assert((DstPic.width & 1)==0);           long YUV_byte_width=(DstPic.width>>1)<<2;     TARGB32* pDstLine=DstPic.pdata;      for (long y=0;y<DstPic.height;++y)     {         DECODE_YUYV_MMX_line(pDstLine,pYUYV,DstPic.width);         pYUYV+=YUV_byte_width;         ((TUInt8*&)pDstLine)+=DstPic.byte_width;     }         asm emms }

现在改成功了，但是总题就在于没有实现应有的功能

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。


Question: 各位大神 如何准确测定printf需要的时间呢

所以我说是输出流的事情，不知道楼主想要测什么  引用 10 楼 zhao4zhong1 的回复:[quote=引用 7 楼 yiyefangzhou24 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] echo %time% yourprog.exe >output.txt echo %time% 你这个是整个程序的运行时间把？而且一个printf函数的时间恐怕只有到毫秒级的数量级[/quote] 我的意思是printf重定向到文件的速度远大于不重定向到文件而输出到console中的时间，如果console不断上卷的话，会更慢。[/quote]

写3000次print测下时间／3000，不准是肯定的，cpu，io不可能只做你这个事情

引用 7 楼 yiyefangzhou24 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] echo %time% yourprog.exe >output.txt echo %time% 你这个是整个程序的运行时间把？而且一个printf函数的时间恐怕只有到毫秒级的数量级[/quote] 我的意思是printf重定向到文件的速度远大于不重定向到文件而输出到console中的时间，如果console不断上卷的话，会更慢。

gettimeofday

用write啊，时间统计有gettimeofday啊，反正你就是统计墙上时钟时间，又不统计cpu的us和sys.

引用 6 楼 zhao4zhong1 的回复:echo %time% yourprog.exe >output.txt echo %time% 你这个是整个程序的运行时间把？而且一个printf函数的时间恐怕只有到毫秒级的数量级

什么叫测的时间不准？printf只是把输出推进输出流，他就返回了，你看到的输出是输出流做的事情，研究一下输入输出流的原理

我的意思是，同样用上述方法；测得的printf时间不准。为什么呢。谢谢。

CTime类

别用printf


Question: 睡眠理发师问题 的想法乱套了!求纠正

自顶 自顶 求大神帮我解答

自顶 求大神帮我解答


Question: 用scanf的一个问题,

真是太感谢了,这么多人帮助我. 首先,我这个问题是只想在输入时超出缓冲长度的时候让它重新输入.但scanf这个函数无论读入字符数量限定与否,只要输入的类型正确且没有遇EOF,它的返回值都是1.所以想单纯用scanf的返回值来判断是否输入了过多的字符是不可能的了.  最终以最短小代码的4楼,赢的了我崇拜~~  引用 4 楼 angel_su 的回复:你可以加读一个字符判断，限定是必要的，防止输入太长数组越界操作...  scanf("%2s%c",sex, &c); while (c != '\n') {     fflush(stdin);     scanf("%2s%c",sex, &c);  } 这代码的想法别出心裁.真是太棒了.判断输入字符后面 的字符是否是换行,如果不是换行,那肯定是多输入了某些东西.代码矮小精悍.完成了最实用的功能.

$ cat test.c && gcc -o demo.exe test.c && ./demo.exe 5 #include <stdio.h> #include <string.h> #include <stdlib.h>  int main(int argc, char** args) {       unsigned int n;       char* buf,ws, format[32];       if(argc == 2)       {          if(sscanf(args[1], "%i", &n) != 1 || 0 == n)             return -1;           buf = (char*) malloc(n+1);          sprintf(format, "%%%is%%c", n);          if(buf)          {            do            {              if(scanf(format, buf, &ws) == 2)              {                 if(strlen(buf) == n && ws == '\n')                 {                   break;                 }              }               fflush(stdin);            }while(1);            printf("you finally get: %s", buf);            free(buf);          }       }       return 0; } //123 //1234 //123456 //12345 //you finally get: 12345

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

不好使是你没说清楚你想干嘛 什么是你所谓的规定字符

1、用scanf("%2s",sex)直接限定； 这办法没好使,                  char sex[3]                 printf("性别："); 		while(scanf("%2s",sex)!=1)  fflush(stdin);

1、用scanf("%2s",sex)直接限定； 2、最好是用getch/getchar一个字符一个字符的判断。  引用 楼主 xgywd 的回复:     char sex[3]     while(scanf("%s",sex)!=1)  fflush(stdin);  我想对输入的字符数进行检查,如果超过规定的字符就刷新重输入,但我这样做不行.具体怎么做才好呢.