Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 为什么这个程序只执行一次两次循环而已

回复:
user: user-0
content: 你写的这个程序也是不能退出循环的，我给你看一下 运行结果 无论怎么改，程序总是出错，总是不能自动跳出循环

user: user-1
content: 我试了你的程序，没出现你说的循环退不出啦啊！我改了下 #include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { 	char key[5] = "" ; 	int count = 0 ; 	printf("输入字符串\n"); 	do  	{			 		if (3==count) 		{ 			printf("I am sorry,bye-bye!\n");  			return 0 ;	 		}  		gets(key); 		if (strcmp(key,"DGIT")!=0 && count<2) 		{ 			printf("Invalid password.Try again!\n"); 		} 		count++; 		 	} while (strcmp(key,"DGIT")!=0);  	printf("Now,you can do something!\n");	  	return 0 ; }

user: user-0
content: #include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char key[5]; int count=0; printf("输入字符串\n"); gets(key); count++;	 while (strcmp(key,"DGIT")!=0) { printf("Invalid password.Try again!\n");     gets(key);     count++; if (count==3)    {    	printf("I am sorry,bye-bye!\n"); break;	    }  } printf("Now,you can do something!\n");	 }    我就搞不懂了，连续输了五次 1 2 3 4 5都是这样，循环一直不退，查看了一下程序思路有没有错，也没错，但循环就是不退出，这是怎么回事，求大神指导。谢谢。

user: user-0
content: #include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { 	char key[5]; 	int count=0; 	printf("输入字符串\n"); 	gets(key); 	if ((strcmp(key,"DGIT"))==0) 	printf("Now,you can do something\n!"); 	else  	printf("Invalid password.Try again!\n"); 	count++; 	gets(key);     for (count=1;strcmp(key,"DGIT")!=0&&count<3;count++)     {     	printf("Invalid password.Try again!\n"); 	    gets(key);     }     if (count<4)     printf("Now,you can do something\n!");     else      printf("I am sorry,bye-bye!\n"); 	 }  为什么这个循环在count>3的时候不能自动退出呢？

user: user-2
content: if (count==3) ｛     printf("I am sorry,bye-bye!\n");     break;	 ｝

user: user-2
content: if (count=3) ==

user: user-2
content: if (count=3) ==

user: user-3
content: 以后将常量写在==左边，象这样： if (3==count) ... 好处是万一少写一个=，编译会报错。

user: user-4
content: if木有大括号，随便你写成什么，都是执行一次，你说能执行两次，是如何实现的？

user: user-4
content: if木有大括号，随便你写成什么，都是执行一次，你说能执行两次，是如何实现的？

user: user-5
content: if (count=3) 改成 if (count==3)

user: user-5
content: if (count=3) 改成 if (count==3)

user: user-5
content: if (count=3) 改成 if (count==3)

user: user-6
content: 细心！！。。。
user-0 提问: 文件写入与读取实际大小与需求的大小不一样

回复:
user: user-0
content: 引用 2 楼 lewisgre 的回复:[quote=引用 1 楼 turingo 的回复:] 写入的字节数少了本身就说明写入未成功。 确实是没有写入成功，写进去的就是8K[/quote]  虽然没找到原因，最后还是用多次写入的方式弄好了

user: user-1
content: 也许需要用一个循环进行读写吧

user: user-2
content: 不建议一次写106K这么大，尤其是嵌入式系统，你可以分16次，每次写8K试试看。  引用 2 楼 lewisgre 的回复:[quote=引用 1 楼 turingo 的回复:] 写入的字节数少了本身就说明写入未成功。 确实是没有写入成功，写进去的就是8K[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:写入的字节数少了本身就说明写入未成功。 确实是没有写入成功，写进去的就是8K

user: user-2
content: 写入的字节数少了本身就说明写入未成功。

user: user-2
content: 赵兄，很久不见 引用 4 楼 zhao4zhong1 的回复:[quote=引用 3 楼 turingo 的回复:] 不建议一次写106K这么大，尤其是嵌入式系统，你可以分16次，每次写8K试试看。  [quote=引用 2 楼 lewisgre 的回复:] [quote=引用 1 楼 turingo 的回复:] 写入的字节数少了本身就说明写入未成功。 确实是没有写入成功，写进去的就是8K[/quote][/quote] 说这话的人必然是过来人啊！[/quote]

user: user-3
content: 引用 3 楼 turingo 的回复:不建议一次写106K这么大，尤其是嵌入式系统，你可以分16次，每次写8K试试看。  [quote=引用 2 楼 lewisgre 的回复:] [quote=引用 1 楼 turingo 的回复:] 写入的字节数少了本身就说明写入未成功。 确实是没有写入成功，写进去的就是8K[/quote][/quote] 说这话的人必然是过来人啊！
user-0 提问: 网络校验和算法

回复:
user: user-0
content: 手工转这么写：  sum += (*（unsigned char*）ipPayload) << 8 & 0xFF00; 但是无论是RFC上还是网上搜的算法都是这么写：sum+=*(UCHAR *)buffer;  没看到有转换啊，就这个地方很不理解。    引用 3 楼 turingo 的回复:大小端是OK的，不过数据流肯定是以字节为单位的，需要手工转。  引用 2 楼 piaomiaoweiting 的回复:会不会是因为网络字节序都是大端的，一个8位的加上一个16位的，相加时，8位的就已经转为abcd abcd 0000 0000了，所以不需要左移8位了。

user: user-1
content: 大小端是OK的，不过数据流肯定是以字节为单位的，需要手工转。  引用 2 楼 piaomiaoweiting 的回复:会不会是因为网络字节序都是大端的，一个8位的加上一个16位的，相加时，8位的就已经转为abcd abcd 0000 0000了，所以不需要左移8位了。

user: user-0
content: 会不会是因为网络字节序都是大端的，一个8位的加上一个16位的，相加时，8位的就已经转为abcd abcd 0000 0000了，所以不需要左移8位了。

user: user-1
content: 可能是2个字节合成一个16位的数，这样奇数字节为低8位，偶数字节为高8位，所以需要左移。
user-0 提问: unsigned int类型变量赋值给char类型

回复:
user: user-1
content: 输出的是'\xff'，这个字符是不可见的，所以看起来像是空格。

user: user-2
content: 都溢出了怎么赋值，int是4字节，char是一个字节，怎么把4升的水倒进1升的瓶子里？除了漏掉3升还能怎么样？

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: 这个问题是很考基本功底的，需要考虑到大端小端和字长的截取，可能在不同的机器上输出的结果不一样，如果你有一台大端的机器的话，可以看看。 一般输出的话就是oxff，即65535

user: user-1
content: %x打印是会扩展为整型的  引用 4 楼 u013163178 的回复:[quote=引用 2 楼 turingo 的回复:] 输出的是'\xff'，这个字符是不可见的，所以看起来像是空格。#include<stdio.h> int main() { 		unsigned a = 65535; 		char b = (char)a; 		printf("%x\n",b); 		return 0; }//打印出来的却是ffffffff[/quote]

user: user-5
content: 居然会有这种愚蠢的题目。 首先，对于C99来说，char类型的比特数不一定非得是8，但至少是8。这将影响转换后的结果。 其次，char可能等价于signed char，也可能等价于unsigned char，这也直接影响转换后的结果。 最后，转换后，输出什么，取决于你用什么方式输出。 如果char和signed char等价，那么，结果将是实现定义的。 如果char和unsigned char等价，那么，结果是用65535不停地加上比UCHAR_MAX大1的数（未必非得是256），直到能够用unsigned char表示。

user: user-6
content: 引用 4 楼 u013163178 的回复:[quote=引用 2 楼 turingo 的回复:] 输出的是'\xff'，这个字符是不可见的，所以看起来像是空格。#include<stdio.h> int main() { 		unsigned a = 65535; 		char b = (char)a; 		printf("%x\n",b); 		return 0; }//打印出来的却是ffffffff[/quote] 因为是带符号的，ff 前面会被扩展为 int 的长度，因此是 ffffffff，所有负数都会被补上6个f 使用 unsigned char %x 输出就只有 ff

user: user-7
content: 引用 2 楼 turingo 的回复:输出的是'\xff'，这个字符是不可见的，所以看起来像是空格。#include<stdio.h> int main() { 		unsigned a = 65535; 		char b = (char)a; 		printf("%x\n",b); 		return 0; }//打印出来的却是ffffffff

user: user-8
content: unsigned int 65535 = 0xffff, 赋值给char = 0xff, 由于0xff不是可打印字符,所以感觉也没有显示.
user-0 提问: socket编程端口复用问题

回复:
user: user-1
content: 楼主，您的问题解决了么？ 我也出现类似的问题。我在客户端，创建两个socket， 其他端口复用功能，然后把他们与同一个端口绑定，绑定第二个时就出错了 Socket client1 = null； Socket client2= null； client1.setReuseAddress(true); client1 2.setReuseAddress(true); bindpoint = new InetSocketAddress(InetAddress.getByName("192.168.1.111"),8000); csocket1.bind(bindpoint ); csocket2.bind(bindpoint );  //这里就提出出错

user: user-2
content: 错误信息很明确，地址不能复用。

user: user-3
content: 一般来说，一个端口释放后会等待两分钟之后才能再被使用，SO_REUSEADDR是让端口释放后立即就可以被再次使用。 SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket(TCP连接中,先调用close()的一方会进入TIME_WAIT状态)，才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。  SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口，即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现，若不设置此选项，则bind时将出错。      SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例，只要每个实例捆绑一个不同的本地IP地址即可。对于TCP，我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。      SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上，只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。      SO_REUSEADDR允许完全重复的捆绑：当一个IP地址和端口绑定到某个套接口上时，还允许此IP地址和端口捆绑到另一个套接口上。一般来说，这个特性仅在支持多播的系统上才有，而且只对UDP套接口而言（TCP不支持多播）。

user: user-4
content: 先搞清楚SO_REUSEADDR 是干嘛的

user: user-4
content: What exactly does SO_REUSEADDR do?    This socket option tells the kernel that even if this port is busy (in   the TIME_WAIT state), go ahead and reuse it anyway.  If it is busy,   but with another state, you will still get an address already in use   error.  It is useful if your server has been shut down, and then   restarted right away while sockets are still active on its port.  You   should be aware that if any unexpected data comes in, it may confuse   your server, but while this is possible, it is not likely.

user: user-5
content: 看来楼主用的是TCP吧？ TCP是不支持处于连接状态的，相同的IP和端口重复绑定的。一般TCP的SO_REUSEADDR用于服务器， 以便服务器崩溃重启时， 可直接Bind处于TIME_WAIT状态的端口。 不知道楼主的目的， 也许UDP的多播、广播能解决楼主的问题
user-0 提问: 【求帮助】求大家帮我看看，归并排序。结果不正确

回复:
user: user-0
content: 发现问题了。如图  请问： 为何目标数组的下标需要从begin开始而不是从0开始呢？ 我觉得我的temp数组里每次都是存放了从头到尾的所有的值的啊？

user: user-0
content: 程序运行的结果不对。。但是我检查不出是哪里错了。。。
user-0 提问: 大一的一道c语言题

回复:
user: user-1
content: bool isLetter(char c) { 	if (c >= 'a' && c <= 'z' || 		c >= 'A' && c <= 'Z') 	{ 		return true; 	} 	return false; }  void countWordNum(const char * words ,int *pNum ,int nNum) { 	const char *pB = words;		// 指向单词的首字符 	const char *pE = words;		// 指向单词的末字符的下一个字符 	size_t nLen = strlen(words); 	while(*pE ) 	{ 		while (*pB && !isLetter(*pB)) 		{ 			pB++; 		} 		pE = pB+1; 		while (*pE && isLetter(*pE) ) 		{ 			pE++; 		} 		if (*pE == 0) 		{ 			pNum[strlen(pB)-1]++; 			break; 		} 		else if (pE-pB < nNum) 		{ 			pNum[pE-pB-1]++; 		} 		pB = pE+1; 		pE = pB; 	} }  int main() { 	const char*str = "i love  you too."; 	int n[20] = {0};	// 假设每个单词的长度不超过20 	countWordNum(str ,n ,20); 	for (int i = 0; i != 20; ++i) 	{ 		if (n[i] > 0) 		{ 			printf("长度为%d的单词有%d个\n" ,i+1 ,n[i]); 		} 	} 	return 0; }

user: user-0
content: Cont是你自己定义的吗，要同时输出一段材料的结果怎么办，要怎么循环

user: user-2
content: 首先：我们可以知道单词与单词之间是有空串的存在。 那么我们就可以编写程序如果遇到  “ ”串就令一个单词计数的变量+1； 如果遇到‘\0’的话那么就可以让这次的计数结束；  主要算法如下： int cont,i=0; char a[100]; while(a[i])    //这里巧妙地地方是'\0'的ASCII码恰好也是0所以当遇到\0是自动跳出循环 {     if(a[i]<='Z'&&a[i]>='a'||a[i]<='z'&&a[i]>='a') {          i++;         continue; } if(a[i]==' ') {    cont ++; } }        最后再输出这个cont 的数值就行了
user-0 提问: 硬件的一些常识性的知识去哪里查询

回复:
user: user-1
content: 谷歌怎么用，网上有一些方法，可以看看，我也提供个地址http://84.15.64.35/

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:“高效地使用各大搜索网站提供的各种高级搜索功能，快速搜到自己所需的信息。”是一项技能。 http://www.baidu.com/gaoji/advanced.html这个牛，赵老师又让我膜拜了一把

user: user-2
content: 水源的人气才是最高的。

user: user-0
content: 引用 5 楼 user-6 的回复:1)搜 Flash Controller, 了解完之后. 2)搜 SPI.  我的建议是这种专业性比较强的,首选上wiki英文版.地址: http://en.wikipedia.org/wiki/Main_Page wiki没有,再选baidu/google.想看通维基，英文要加强，非常感谢回复

user: user-0
content: 引用 3 楼 u012421456 的回复:http://www.baidu.com/s?wd=Quad+SPI+Flash+Controller%3AQSPIC%E6%98%AF%E4%BB%80%E4%B9%88%E6%8E%A7%E5%88%B6%E5%99%A8&ie=UTF-8&tn=98597150_hao_pg&lans=132 不好意思，上面那个百度搜索结果传错了非常感谢，有时候就是拓展几个字就好搜索

user: user-0
content: 引用 1 楼 luciferisnotsatan 的回复:baidu收不到可以理解，google也不行？ google前两条就是中英文PDF http://gg.eeload.com/#newwindow=1&q=Quad+SPI+Flash+Controller多谢指点，我这里谷歌打不开

user: user-3
content: 需要一些基本的经验，然后才知道如何去搜索。 Quad SPI Flash Controller，我的理解是： SPI FLASH支持Quad的快速读取方式，也就是说一次可以读取4个字节。  引用 楼主 liaocao2010 的回复:虽然这个问题不好在这里提，但是CSDN里面c语言板块的活跃度最高吧。  我经常会遇到一些硬件的常识不知道的，去百度谷歌又没有说明，例如Quad SPI Flash Controller:QSPIC是什么控制器？在CSDN里面搜索也没有  忘过来人指点一下，硬件的一些常识去哪里了解

user: user-1
content: http://www.baidu.com/s?wd=Quad+SPI+Flash+Controller%3AQSPIC%E6%98%AF%E4%BB%80%E4%B9%88%E6%8E%A7%E5%88%B6%E5%99%A8&ie=UTF-8&tn=98597150_hao_pg&lans=132 不好意思，上面那个百度搜索结果传错了

user: user-1
content: 不是写着呢？   Flash Controller  可看看这里——http://www.docin.com/p-834162690.html 百度其实也可以搜到的，不知道楼主是怎么搜的，http://Quad SPI Flash Controller:QSPIC是什么控制器 当然谷歌更好 CSDN搜索就不要用了

user: user-4
content: baidu收不到可以理解，google也不行？ google前两条就是中英文PDF http://gg.eeload.com/#newwindow=1&q=Quad+SPI+Flash+Controller

user: user-5
content: “高效地使用各大搜索网站提供的各种高级搜索功能，快速搜到自己所需的信息。”是一项技能。 http://www.baidu.com/gaoji/advanced.html

user: user-6
content: 1)搜 Flash Controller, 了解完之后. 2)搜 SPI.  我的建议是这种专业性比较强的,首选上wiki英文版.地址: http://en.wikipedia.org/wiki/Main_Page wiki没有,再选baidu/google.
user-0 提问: '\t''\b'的作用

回复:
user: user-1
content: linux平台下，gcc编译后运行正常，是你期望的结果

user: user-0
content: 好的，原来是这样，书上的解释说是：退格，将当前位置移到前一列。所以我想不明白。 现在明白了，谢谢各位！

user: user-2
content: \b 是Backspace，前一个是 \t 制表符，不是8个空格，所以直接去掉了\t，不是去掉了1/8个\t

user: user-3
content: \b是退格 相当于键盘上的backspace键。  相当于删除上一个字符，所以table键就被删除了。
user-0 提问: C#调C语言DLL，不能获取非托管区（C语言）结构体的属性的值

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·…… 文本对接在小样本足够可以，但是大样本速度是软肋

user: user-0
content: 引用 3 楼 my_live_123 的回复:因为找不到类型定义的信息  你好，              DecisionTreeNode Tree1 = new DecisionTreeNode();     ReadImage.C4_5_main( ref Tree1); 已经定义了啊，结构体也声明过了，那么类型是那块没有定义

user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

user: user-2
content: 因为找不到类型定义的信息

user: user-0
content: 引用 1 楼 user-3 的回复:[Out] out TreeNode treenode  应该在函数申明那还是在函数调用那里呢

user: user-3
content: [Out] out TreeNode treenode

user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: 新人求助如何读写使得两个字符串读取不会发生前者吃掉后者的一部分字符

回复:
user: user-0
content: 赵四老师这个办法可以，我已经修改了读入文件部分： fprintf(fp, "%s %s %s %s\n",p->english_word, p->character_word, p->soundmark_word, p->chinese_word); 		fprintf(fp,"%s\n",p->english_phrase);  		fprintf(fp,"%s\n",p->example_sentence);文件中基本信息在一行，凡是带空格的字符串单独一行

user: user-1
content: l楼主能说清楚点吗？不知道是什么意思

user: user-2
content: 比如  scanf("%s",pNewDic->english_word); 改为  scanf("%29s",pNewDic->english_word);

user: user-3
content: 没有明白你的问题，你再具体点陈述下什么症状

user: user-4
content: 你要告诉计算机，你什么时候将前一个字符串读完了，它什么时候才能去读第二个字符串
user-0 提问: 谁能详解C中for循坏堆栈的变化

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 首先堆和栈是两个不同的概念，堆空间一般用于程序动态的申请及释放，栈则供函数调用存储当前的入参、局部变量、返回地址等，一般每个函数调用在栈中的空间分配都以“栈帧”的概念来标识。 而for循环只是一个代码段，其执行的代码存储在独立的代码段(区)，不是堆也不是栈，代码需要使用到的变量及空间等都从堆和栈中存取。 简单说for循环里面存储的只是命令，命令执行时要使用到堆和栈中的数据。是这样一个关系吧。。。

user: user-3
content: 对于一个空for，堆栈无任何变化。如果有调用其他函数，定义了新变量，申请释放空间等操作，栈会有变化  你可能想问的是for是如何一步步执行的

user: user-4
content: 参考 http://www.cnblogs.com/lds85930/archive/2007/07/22/827453.html

user: user-5
content: 没变化。。。。。。
user-0 提问: 怎么用C语言实现包含所有元素的所有组合

回复:
user: user-1
content: 烦请楼主补全此示例： 例如:数组arr={1,11,111,1111}  包含所有元素的组合结果为:

user: user-1
content: 引用 13 楼 u011997922 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] 烦请楼主补全此示例： 例如:数组arr={18,27,39}  包含所有元素的组合结果为: {18,27,39}   {18,2739}  {1827,39}  {1839,27} {182739}[/quote] 烦请楼主补全此示例： 例如:数组arr={1,27,309,4273}  包含所有元素的组合结果为:

user: user-0
content: 我想弄一个物流提送货自动配载功能，思路是先把所有要提送的货物组合然后再根据各种约束挑选车辆和行车路径最后计算出各种组合的花费，选出比较合理的方案。不知大家可有相似的事例提供或者方案。

user: user-0
content: 嗯,不过是要包含所有元素的所有组合,不能有重复的元素

user: user-2
content: 好難阿< 剛開始以為很簡單

user: user-0
content: 引用 17 楼 u010936098 的回复:10这个数量就已经不小了。 要知道处理全子集就已经是指数级的算法了，而全子集相当于2分组，而你这个是1..N分组 象这类问题你应该考虑如何去求满意解而不是求最做优解。 有什么好的方法可以求得满意解?

user: user-3
content: 引用 15 楼 u011997922 的回复:[quote=引用 14 楼 my_live_123 的回复:] 集合的组合：计数还可以n个元素，2^n - 1种组合，如果列举话，指数数量级，当n很大时，这是惊人的！楼主三思 这个我已经考虑到了.10以内就可以了[/quote] 10这个数量就已经不小了。 要知道处理全子集就已经是指数级的算法了，而全子集相当于2分组，而你这个是1..N分组 象这类问题你应该考虑如何去求满意解而不是求最做优解。

user: user-4
content: 引用 15 楼 u011997922 的回复:[quote=引用 14 楼 my_live_123 的回复:] 集合的组合：计数还可以n个元素，2^n - 1种组合，如果列举话，指数数量级，当n很大时，这是惊人的！楼主三思 这个我已经考虑到了.10以内就可以了[/quote] 可以尝试下递归

user: user-0
content: 引用 14 楼 my_live_123 的回复:集合的组合：计数还可以n个元素，2^n - 1种组合，如果列举话，指数数量级，当n很大时，这是惊人的！楼主三思 这个我已经考虑到了.10以内就可以了

user: user-4
content: 集合的组合：计数还可以n个元素，2^n - 1种组合，如果列举话，指数数量级，当n很大时，这是惊人的！楼主三思

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:烦请楼主补全此示例： 例如:数组arr={18,27,39}  包含所有元素的组合结果为: {18,27,39}   {18,2739}  {1827,39}  {1839,27} {182739}

user: user-1
content: 烦请楼主补全此示例： 例如:数组arr={18,27,39}  包含所有元素的组合结果为:

user: user-0
content: 引用 9 楼 u010936098 的回复:样是行不通的，枚举法是指数级的算法，数据量稍大一点就不得了。 可有什么好办法,我是分区域来组合降低数据量.

user: user-5
content: 先全排列123,然后在里面插入逗号,可以插入一个u逗号,i也可以h插入两个逗号, 要求逗号不可以插 最前面,也不可以插咋最后面.

user: user-3
content: 引用 4 楼 u011997922 的回复:我想弄一个物流提送货自动配载功能，思路是先把所有要提送的货物组合然后再根据各种约束挑选车辆和行车路径最后计算出各种组合的花费，选出比较合理的方案。不知大家可有相似的事例提供或者方案。  这样是行不通的，枚举法是指数级的算法，数据量稍大一点就不得了。

user: user-0
content: 可能是描述不准，看示例理解。哈哈。。。

user: user-6
content: 我也感觉楼主的命题有问题..... {1, 2, 3} 算上逗号..... 这组合好多呀

user: user-1
content: 楼主此命题有误。

user: user-7
content: 其实这就是一个简单的组合问题，思路如下： 比如：{1,2,3}  C(0,3) + C(1, 3) + C(3,3) = 5 =  2^3 - C(2,3) 这里需要考虑到C(2,3)跟C(1,3)是一样的，你只要去重就可以了，在这里你只需要定义一个C(m,n)函数就可以了

user: user-8
content: 楼主需要的是列出所有组合的算法吧？？
user-0 提问: C语言渣渣问题T^T，求大神

回复:
user: user-1
content: 在switch前 把 return 的ch打印出来

user: user-2
content: 二楼说得对，menu（）中的 scanf("%c",&ch); 会把缓冲区的回车键\n 当输入的，加个循环判断去掉回车，详细看C Primer Plus有关输入输出的地方

user: user-0
content: 引用 4 楼 futurebc 的回复:引用printf("姓名:");         scanf("%s",&s[i].name);这里有问题  search()里面 的if判断都有问题 引用scanf("%s",&filename);这里filename是个指针，没指向，不用字符数组？ 引用case'10':write();break;         case'11':read();break;这里'10','11' 是个错误的东西  最后，一个个把警告解决吧在最前面的还有错。。。我找不出来了。。。是主函数和菜单函数衔接转换的地方。。。我输入了两个学生信息，然后最好一个学生的总分和平均分主动变成了下一次主函数的选项。。。。一直跟我说Wrong choice...怎么转换回主函数。。。还有。。学生信息怎么保存不了。。。是哪个版块有问题。。。求大神解答

user: user-2
content: 引用printf("姓名:");         scanf("%s",&s[i].name);这里有问题  search()里面 的if判断都有问题 引用scanf("%s",&filename);这里filename是个指针，没指向，不用字符数组？ 引用case'10':write();break;         case'11':read();break;这里'10','11' 是个错误的东西  最后，一个个把警告解决吧

user: user-0
content: 引用 2 楼 nwcfafniw 的回复:在scanf后面加一个getchar试试吧。。回车符留在输入缓冲里了。。 哪个scanf???????????..........

user: user-3
content: 在scanf后面加一个getchar试试吧。。回车符留在输入缓冲里了。。

user: user-0
content: 为什么调试没有查出错误，运行起来就不能用了，只能用1的选项，其他的选项都直接出现Wrong choiceT^T,求大神
user-0 提问: 新手，求杨辉三角【等边三角形】C语言题，求程序和思路！！

回复:
user: user-1
content: 第N层最多N个数，用MAX_BUF来控制，SEP_W来控制宽度，感觉层数太大也没用，屏幕显示不下。 代码仅供参考！ #include <stdio.h> #include <stdlib.h> #define SEP_W 8 #define MAX_BUF 20  void primt_yang(int lev) {     int buf[MAX_BUF];     int  anchor =lev-1;     printf("%*d\n",lev*SEP_W/2,1);     buf[anchor--]=1;     for(int i=1,pos=anchor;i<lev;i++,pos=--anchor)     {         printf("%*d",(lev-i)*SEP_W/2,1);         buf[pos++]    =1;         for(int j=0;j<i-1;++j)         {             buf[pos]+=buf[pos+1];             printf("%*d",SEP_W,buf[pos++]);         }         printf("%*d\n",SEP_W,1);     } }   int main(int   argc,   char*   argv[])  {     primt_yang(10);     return 0;  }

user: user-2
content: #define LEVEL 8    int main(int   argc,   char*   argv[])     {    	int a[LEVEL+1]; 	int i = 0; 	int c;   	for(i=0;i<=LEVEL;i++)   	{   		a[i]=1;   		for(c=i-1;c>=1;a[c--]+=a[c-1]);   		{ 			printf("%*d",(LEVEL-i)*3+1,a[0]);  		} 		for(c=1;c<=i;printf("%6d",a[c++]));   		{ 			printf("\n");  		} 	}   	     return 0; 	 }

user: user-3
content: #include <stdio.h> #define MAXN 10 unsigned __int64 y[MAXN][MAXN]; int i,j; char s[60]; void main() {     printf("%30s\n","1  ");     printf("%33s\n","1     1  ");     y[1][0]=1ui64;y[1][1]=1ui64;     for (i=2;i<MAXN;i++) {         y[i][0]=1ui64;sprintf(s,"1  ");         for (j=1;j<=i-1;j++) {             y[i][j]=y[i-1][j-1]+y[i-1][j];             sprintf(s,"%s   %-3I64u",s,y[i][j]);         }         y[i][i]=1ui64;sprintf(s,"%s   1  ",s);         printf("%*s\n",30+i*3,s);     } } //                           1 //                        1     1 //                     1     2     1 //                  1     3     3     1 //               1     4     6     4     1 //            1     5     10    10    5     1 //         1     6     15    20    15    6     1 //      1     7     21    35    35    21    7     1 //   1     8     28    56    70    56    28    8     1 //1     9     36    84    126   126   84    36    9     1
user-0 提问: C和指针课后习题疑问

回复:
user: user-1
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  以管理员身份运行 以XP兼容模式运行  关闭UAC、防火墙、杀毒软件。

user: user-2
content: 还用啥子6.0.块换了吧。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 谢谢老师，我现在也因为这个调试问题发愁，我用的VC++6.0，跟Windows7不兼容，调试不了，我每次找不到问题，就用Printf把每句打印出来，很是麻烦！！！

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

user: user-3
content: 粗心大意了吧 * dst++== * str++; 赋值咋能用俩等号呢，要改成* dst++=* str++;  debug跟踪调试一下，编程需要细心耐心~~
user-0 提问: 很久以来，关于malloc的疑惑

回复:
user: user-1
content: Polynode *head,*rear,*s; 这样只是定义了几个指针变量，那么这些指针指向哪里呢？学习指针就要时刻问自己：这个指针指向哪里呢？你可以让他指向一个对象，比如head = &xxx;这就是让head保存了xxx的地址，也就是指向了他。如果只是单纯定义了指针没有说明指向，这样的指针是不能使用的（俗称的野指针）。让head=malloc就是让他指向新开辟的内存空间的首地址，才可以正常使用

user: user-2
content: 很久以来，还是要把基础打好。。。

user: user-3
content: 基本概念.. 1) 如楼上所言，head本身是个指针变量，变量本身的空间在栈上 2) head没有初始化之前，指向的地址都不明确，对其指向的内容赋值(楼主所说的直接对head->num=x进行赋值）后果是无法预料的，很大几率会宕掉 3) head=(Polynode *)malloc(sizeof(Polynode));   malloc在堆上申请了一块内存空间，空间大小是Polynode大小，供存放一个Polynode结构体数据，把head指向这个地址，然后就可以通过Head对这块地址进行操作了(如结构体赋值啥的) 4) 堆上申请的内存注意用完后要释放

user: user-0
content: 非常感谢大家的指点与教导~~

user: user-4
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

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

user: user-5
content: 指针n本身只占4个字节，这四个字节是用来保存一个地址的，所以地址的最大值是INT_MAX

user: user-6
content: 一个萝卜一个坑,现在你有了一个萝卜(指针),需要一个坑(内存). 好了现在有很多坑(很多内存),你需要抢一个给你自己的萝卜(malloc). 成功后你就可以在自己的坑里削自己的萝卜,想咋削就咋削(修改自己的内存内容). 最后记住,坑用完了,还回去就行了(free).

user: user-7
content: 引用 4 楼 mujiok2003 的回复:head本身的空间在栈上， 不需要分配。 “不需要分配”---> “不需要显式分申请/释放, 空间分配自动进行”。

user: user-7
content: head本身的空间在栈上， 不需要分配。

user: user-7
content: malloc的结果是个地址， 不是为了存放head,而是让head的值是这个地址（指向这个地址）。

user: user-8
content: 很久以来，每个学习C语言的人应该在学习指针的第一节课就被告诉指针先初始化再使用

user: user-9
content: 既然是很久以来，那么你在学指针的时候，没看到过使用指针前必须要分配空间的相关知识么？
user-0 提问: 新手学C语言

回复:
user: user-1
content: 多抄，先会抄，在会写！

user: user-2
content: 引用 7 楼 sholber 的回复:赵四老湿推荐谭浩强、VC和TC，还有BC++。 完全彻底地污蔑！ 本ID啥时候推荐谭浩强了？

user: user-3
content: 如果完全一点基础都没有的话，那就找本零基础的书 遇到问题百度，google，真的好用

user: user-4
content: Pointers on C

user: user-5
content: 参考我的博文 http://blog.csdn.net/turingo/article/details/8115042

user: user-6
content: 我也在自学，慢慢写些简单的挺有意思的，慢慢来把

user: user-7
content: 书山有路勤为径，学海无涯苦作舟。 有的方法可能适合于A，却不见得适合B。 找些大多数人都看过的书，把基础先练扎实，内功修好了，以后大有好处。 我觉得边做边看书比单纯看书效果要好，或者多做练习题，也可以想些生活中的实际问题来联系实现他，由易到难，一步一步来，急不得。同时不要死抠某些问题，要知道很多问题是和编译器相关的，所以过分纠结就是在浪费时间。

user: user-8
content: 赵四老湿推荐谭浩强、VC和TC，还有BC++。

user: user-2
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”  先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-9
content: 多做,多练,多思考....无捷径...  码农是在一次次的犯错中成熟的....除非你是天才,天才别论.

user: user-10
content: 你这是在寻找武林秘籍么？

user: user-11
content: 别做程序员。
user-0 提问: 请教大神，纯C语言能编写出DLL格式的COM组件吗？

回复:
user: user-1
content: 引用 1 楼 turingo 的回复:参考 http://www.west263.com/info/html/chengxusheji/C-C--/20080403/51515.html 我今天忽然点了你这个连接，发现也是 C++ 的，不知道从哪采集来的。

user: user-1
content: http://www.codeproject.com/Articles/13601/COM-in-plain-C

user: user-1
content: 能。com最麻烦的是注册表，其他倒没什么。

user: user-2
content: 参考 http://www.west263.com/info/html/chengxusheji/C-C--/20080403/51515.html

user: user-0
content: 谢谢楼上几们，对我很有帮助，虽然看不懂，但是起马有了研究的对象
user-0 提问: 请指教，c语言如何打印这类三角形！能力有限，网上没找到这种案例啊！！！

回复:
user: user-1
content: #include "stdio.h" void main() { 	int a[20][20]; 	int i,j,n; 	printf("请输入n："); 	scanf("%d",&n); 	for(i=0;i<n;i++) 		a[i][i]=i+1; 	for(i=1;i<n;i++) 		for(j=1;i-j>=0;j++) 			a[i][i-j]=a[i][i-j+1]+n-j; 	for(i=0;i<n;i++) 		for(j=0;j<=i;j++) 		{ 			printf("%3d",a[i][j]); 			if(i==j)printf("\n"); 		} 	system("pause"); }

user: user-0
content: 学过数组之后写的程序  #include <stdio.h>  main() {   int h,l,n,a[81][81],s=0;   puts("输入");    scanf("%d",&n);   for(l=n;l>=1;l--)     for(h=l;h>=1;h--)       a[h][l]=++s;   for(h=n;h>=1;h--)   {       printf("\n");       for(l=h;l<=n;l++)         printf("%d ",a[h][l]);   } }

user: user-2
content: #include<stdio.h>  int count(int i) { 	if (i ==1) 		return 1; 	else 		return i+count(i-1); }  void main() {	 	int n,i,j,num,*arr,nest_count=0;  	printf("please input a number:"); 	scanf("%d",&n); 	arr= malloc(sizeof(int)*count(n));   	for(i=1;i<=n;i++) 	{ 		int first = i; 		int nn = n;  		for(j=0;j<i;j++) 		{ 			arr[nest_count] = first; 			nest_count++; 			first = first + (nn--)-1;			 		} 	}  	num=count(n); 	j=1; 	while(j != n+1) 	{ 		num=count(j)-1; 		for(i=0;i<j;i++) 		{ 			printf("%d ",arr[num]); 			num--; 		} 		printf("\n"); 		j++; 	} 	printf("\n");   	free(arr); }

user: user-3
content: #include<stdio.h>  int h(int a[][6],int j,int i,int s); int l=0; int main() { 	int a[6][6],n,i,j;     scanf("%d",&n); 	j = n; 	a[0][0]=1; 	for(i=0;i<n;++i) 	{ 		if(i==0) h(a,j,i,0); 		else  		{ 			--j; 			h(a,j,i,l); 		} 	} 	for(i = 0;i<n;++i) 	{ 		for(j = 0;j<=i;++j) 		{ 			printf("%d",a[i][j]); 		} 		printf("\n"); 	} 	return 0; }  int h(int a[][6],int j,int i,int s) { 	int x,y; 	if(i==0) 	{ 		 		for(x=1,y=1;x<j;++x,++y) 		{ 			a[x][y]=a[x-1][y-1] + 1; 		} 		l=a[x-1][y-1]; 	} 	else  	{         for(y=0;y<j;++y,++i) 		{ 			if(y==0) a[i][y] = s+1; 			else 			{ 				a[i][y]=a[i-1][y-1] + 1; 			} 		} 		l = a[i-1][y-1];  	} 	return 0; }

user: user-4
content: 看了一下数字，第二行第一个数是从1+行数得到，其它行刚好差1，行内数刚好从前一个数递减 void print_tri(int lev) {     for(auto line=0,st=1;line<lev;++line)     {         for(auto col=0,cur=st,hs=lev-line;col<=line;col++,++hs)         {             cout<<cur<<"\t";             cur -= hs;         }         cout<<endl;         st+=lev-line;     } }
user-0 提问: 求高手帮忙写个代码？ 谢谢

回复:
user: user-1
content: 我要得分#include<stdio.h>  int main() { 		int state = 0; 		int i; 		char buffer[4]; 		int n; 		scanf("%d",&n); 		sprintf(buffer,"%d",n); 		for(i = 2;i >= 0; --i) 		{ 				if(buffer[i] != '0') 				{ 						state = 1; 				} 				if(state == 1) 						printf("%c",buffer[i]); 		} 		putchar('\n'); 		return 0; }

user: user-2
content: 自己写的话应该不难吧！

user: user-3
content: 引用 2 楼 starytx 的回复:仅供参考，也可以转化为字符串，然后逆序处理。 unsigned int reverseNum(unsigned int n) { 	unsigned int m = n; 	unsigned int k = 0; 	while (m > 0) 	{ 		k *= 10; 		k += m%10; 		m = m/10; 	} 	return k; }+1

user: user-4
content: 仅供参考，也可以转化为字符串，然后逆序处理。 unsigned int reverseNum(unsigned int n) { 	unsigned int m = n; 	unsigned int k = 0; 	while (m > 0) 	{ 		k *= 10; 		k += m%10; 		m = m/10; 	} 	return k; }

user: user-5
content: 貌似初中计算机竞赛题。有什么困难？
user-0 提问: 数组无法保存颜色值，里面的元素会自动清零

回复:
user: user-0
content: 引用 4 楼 turingo 的回复: 使用数组里面的颜色时，我发现只有将数组定义前加上const才能显示出来，是怎么回事啊，求这位大哥教教

user: user-1
content: 1、你所看到的是0x1f，其实它在内存中确实是0x001f 2、传的时候可以用memcpy  引用 楼主 liaocao2010 的回复:我定义了这样的数组   u16  color_temp[224] = {0}; u16 i = 0;  while(i<224) {    color_temp[i] = 0x001f;    i++; }   问题来了，我要数组每个元素保存的都是0x001f 但是结果它会自动去掉0，保存的都是0x1f，这就没法用了啊 我保存的颜色值要一次性传给显存，如果数组不行，那有其他办法也好。 求高人指点

user: user-0
content: 再补充一个问题，外部调用数组显示颜色的时候，必须在数组前加const，这是为什么，有解决办法么  引用 1 楼 user-3 的回复:0x001f == 0x1f 这两个在u16的内存中是一样的但是我用的时候，必须要用到0x001f  引用 2 楼 zyaiwx 的回复:去掉0有问题吗？去掉0有很大的问题，颜色值是分高低位的，没有0就没有高低位了

user: user-2
content: 去掉0有问题吗？

user: user-3
content: 0x001f == 0x1f 这两个在u16的内存中是一样的
user-0 提问: 新人求教啊，字符串查找子字符串的问题

回复:
user: user-0
content: 引用 3 楼 turingo 的回复:参考 http://blog.sina.com.cn/s/blog_5f67441501015pyz.html 谢谢帮助

user: user-0
content: 引用 2 楼 zyaiwx 的回复:找两次。要是如果只出现两个，反向查找，一次找到 嘿嘿，显然我是需要找N次。网上查找了一个代码http://blog.csdn.net/arcsinsin/article/details/12162743很不错，期望后面的人看到这个有用。

user: user-0
content: 引用 1 楼 user-3 的回复:先找到第一个，然后在此基础上后移一位再找 char * pFind = strstr(str ,substr); pFind = strstr(pFind+1 ,substr); 方法可行，谢谢

user: user-1
content: 参考 http://blog.sina.com.cn/s/blog_5f67441501015pyz.html

user: user-2
content: 找两次。要是如果只出现两个，反向查找，一次找到

user: user-3
content: 先找到第一个，然后在此基础上后移一位再找 char * pFind = strstr(str ,substr); pFind = strstr(pFind+1 ,substr);
user-0 提问: 判定星期几并返回整形

回复:
user: user-1
content: 如果你是在 Windows 平台，那么有个最简单的方法： FILETIME ft = { 0 }; // 这里举例为2014年12月1日20:00 // 主要是年月日以及小时最好大于0以确保结果准确 SYSTEMTIME st = { 2014, 12, 0, 1, 20, 0, 0, 0 }; SystemTimeToFileTime(&st, &ft); FileTimeToSystemTime(&ft, &st); // 经过这么一倒腾 st.wDayOfWeek 就包含了星期 // 0 为周日，1~6 为周一到周六

user: user-2
content: 引用 4 楼 ccc212153 的回复:s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;网上常见的一个公式而已，days是该天在这一年中的第几天。也可以用蔡勒公式来计算。关于公式可以搜一下，既然是公式就用就行了，人家推导出来的。 // 计算某年月日是星期几,0:周日，1：周一..... int getWeek(int yr ,int mn ,int day) { 	int M = mn; 	if (mn == 1 || mn == 2)		// 如果是1月或2月，要作为上年的13,14月来处理 	{ 		M += 12; 		yr--;		// 上一年 	} 	int nC = yr/100;	// 世纪数-1（年数前两位） 	int y = yr%100;		// 年数后两位 	int d = day;		// 天 	int W = nC/4 - 2*nC + y + y/4 + (13 * (M+1) / 5) + d - 1 ;	// 蔡勒公式,里边的除法都取整数部分 	return W%7; }

user: user-0
content: 引用 1 楼 starytx 的回复:仅供参考，至于你说的是一周的第几天，自行设置，你可以认为一周从周日开始，也可以从周一开始，本例是从周日开始 int getWeek(int yr ,int mn ,int day) { 	int days = 0; 	int s = 0; 	int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};  	if (yr%4==0||yr%100==0||yr%400==0)  		mont[2]=29; 	else mont[2]=28; 	for (int i=0;i<mn;i++) 		days+=mont[i];  	days+=day;  	s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;  	return s%7; }  int main() { 	int day,mn,yr,days=0,k;  	int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};  	char wek[][9] = { "星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; 	printf("请输入日期 (年-月-日):"); 	scanf("%d-%d-%d",&yr,&mn,&day);  	k = getWeek(yr,mn,day); 	printf("%d-%d-%d 是 %s.",yr,mn,day,wek[k]);  	return 0; }   s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;

user: user-0
content: s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;  能解释下这句吗？谢谢

user: user-3
content: UINT DayOfWeek[] = {    LOCALE_SDAYNAME7,   // Sunday    LOCALE_SDAYNAME1,       LOCALE_SDAYNAME2,    LOCALE_SDAYNAME3,    LOCALE_SDAYNAME4,     LOCALE_SDAYNAME5,     LOCALE_SDAYNAME6   // Saturday };  TCHAR strWeekday[256]; CTime time(CTime::GetCurrentTime());   // Initialize CTime with current time ::GetLocaleInfo(LOCALE_USER_DEFAULT,   // Get string for day of the week from system    DayOfWeek[time.GetDayOfWeek()-1],   // Get day of week from CTime    strWeekday, sizeof(strWeekday));  TRACE("%s\n", strWeekday);               // Print out day of the week

user: user-2
content: 仅供参考，至于你说的是一周的第几天，自行设置，你可以认为一周从周日开始，也可以从周一开始，本例是从周日开始 int getWeek(int yr ,int mn ,int day) { 	int days = 0; 	int s = 0; 	int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};  	if (yr%4==0||yr%100==0||yr%400==0)  		mont[2]=29; 	else mont[2]=28; 	for (int i=0;i<mn;i++) 		days+=mont[i];  	days+=day;  	s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;  	return s%7; }  int main() { 	int day,mn,yr,days=0,k;  	int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};  	char wek[][9] = { "星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; 	printf("请输入日期 (年-月-日):"); 	scanf("%d-%d-%d",&yr,&mn,&day);  	k = getWeek(yr,mn,day); 	printf("%d-%d-%d 是 %s.",yr,mn,day,wek[k]);  	return 0; }
user-0 提问: 新手提问getchar 函数

回复:
user: user-1
content: getchar 由宏实现：#define getchar() getc(stdin）。getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止（回车字符也放在缓冲区中）.当用户键入回车之后，getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的字符的ASCII码，如出错返回-1，且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符，其他字符会保留在键盘缓存区中，等待后续getchar调用读取.也就是说，后续的getchar调用不会等待用户按键，而直接读取缓冲区中的字符，直到缓冲区中的字符读完为后，才等待用户按键.

user: user-2
content: getchar每次只从输入缓冲区读取一个字符而已。

user: user-3
content: getchar()只是读入一个字节

user: user-4
content: 这样理解 你输入的一串数字会被放入一个缓冲区，第一个由于有while，getchar会一直读，直到取完为止，读一个，输出一个
user-0 提问: 新手求助

回复:
user: user-1
content: 首先说一下别忘了给我分 很简单，k=(++i)+(++i)+(++i);我给你分析一下。 首先：我们知道++n是自加运算，不同于n++，++n直接自身加1不需要临时变量。 其次：k=(++i)+(++i)+(++i);运算的时候从左到右为：           第一步执行第一个++i, 此时所有的i变为4，           第二步 执行第二个++i，此时所有i变为5，           第三步： 执行前两个++i相加！，这两个++i的结果相加之后赋给一个内存中临时变量，此时为10           第四步执行最后一个++i，值为6，第五步：执行上一个内存中临时变量的值与这个6相加。10+6 = 16.

user: user-2
content: i=6是确定的，k的答案不一定，看编译器了 16就是先做了两个i++之后i=5相加得到10，再加上6, 如果++i 全完成后再加就得到18了 4+5+6也没错，有这种可能
user-0 提问: 请教一个PCLint的问题，谢谢！

回复:
user: user-0
content: 其实是可以检查出来的，是我看错了错误的行了，这里不会报错误了

user: user-1
content: lint 还没聪明到能识别出大于等于10时，会return

user: user-2
content: PClint只是静态检查，在这个函数中i可能大于10，超过数组的界限了，Pclint判断有越界的可能性。可以for (.. i<10..)或者忽略掉此处的这个错误，让pclint忽略此处的这个检查

user: user-3
content: 改为：  for(i = 0; i < 10; i++) {     a[i] = 1; }

user: user-4
content: void f() {     int a[10] = {0};     int i = 0;     for(i = 0; i < 20; i++)     {         if(i >= 10)         {             return;             break;  //这里加上跳出循环试试         }          a[i] = 1;  //为什么这里还会报661数组越界错误呢，要怎么修改呢？谢谢     } }

user: user-5
content: lint是静态检查. 话说既然已经知道问题所在,为啥不改改code.   for(i = 0; i < 10; i++) {     a[i] = 1; }
user-0 提问: 求助：c语言调用mysql存储过程的问题

回复:
user: user-1
content: 这个问题如果去mysql论坛问，更靠谱，我觉得。（真相是我没实际弄过mysql）

user: user-0
content: 函数是这么写的： bool sql_procedure() {        char szSql[64]="call _DBI_Factionlist_FacName('95954',@code)";       if((result!=NULL)        {                   mysql_free_result(result);                   result = NULL;         }        int ret = mysql_real_query(connection , szSql , strlen(szSql));       if(( ret)       {             printf("%s\n",mysql_error(connection));             return false;         }          ret = mysql_query( connection , " SELECT @Code" );          if(ret)          {                  printf("%s\n", mysql_error( connnection ));                   return false;            }             result = mysql_store_result(connnect);            row = mysql_fetch_row(result);           printf("%s\n", row[0]);            return true; }  麻烦你再帮我分析分析

user: user-1
content: 有可能返回的结果集为空 有可能返回的结果集太大（行数太多） 有可能返回的结果集中当前记录的某个字段为NULL 有可能……
user-0 提问: 所有传递给函数的参数都是通过传值方式进行的？？

回复:
user: user-1
content: 然也。看看产生的汇编就明白了

user: user-2
content: 所有传递给函数的参数都是通过传值方式进行的  YES

user: user-3
content: 是的 所谓传地址 其实也是传值而已

user: user-4
content: 出了C++里的引用，所有参数传递都是这样的：复制一份实参的值，作为副本在函数中使用，所以不会影响实参的值，如果想通过形参改变实参的值，只能传这个值的地址（指针，如果实参是指针，要改变指向，就需要传入指针的地址，也就是指针的指针），因为通过地址（指针）可以改变地址里保存的内容。

user: user-5
content: c++里面的引用跟地址也比较类似

user: user-6
content: 书里写得不错，但其实也是废话，计算机除了数值运算、传递，还能干什么捏？

user: user-7
content: 是的，地址也是值。  引用 楼主 xialibaran 的回复:所有传递给函数的参数都是通过传值方式进行的？？这件话怎么理解？在《c和指针》这本书150页提到这句话。如图。  最好那句话说的怎么理解？？是不是说地址也终归是值？

user: user-8
content: 在C里面是这样的，C++里还可以传引用。

user: user-9
content: 变量                       变量值 指针变量              指针值

user: user-10
content: 广义上讲都是传值~

user: user-11
content: 地址也是值啊。比如地址：0X00AA  它不就是所谓的“值”么。 只不过这个值和一般的值对编译器来说不同而已。  总的来说，这种经典的书你需要多看几遍，就会有自己的理解，这里说了也不是你真正自己的理解。
user-0 提问: 100分求CCF计算机软件能力认证考试历届真题

回复:
user: user-0
content: 这个我也找到了，不过只有第一次的。不过还是谢谢！

user: user-1
content: 参考 http://wenku.baidu.com/link?url=KXAjAYDkUOD8IzIqVVK2zgT78F4bE7Env3bYG2Uobq19vVRA9p0_QjBXumgGiCw74dleh8iZ7oywX7JPhlvl76gtlQ_PiHXx3TY70yKzwmW
user-0 提问: if(1000

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-2
content: 知识点： 运算符的优先级和结合行 布尔值与整型数直接的转换。

user: user-3
content: 根据运算符的结合性，除了三个运算符是从右至左结合的（单目、三目、赋值），其他都是从左至右结合的，所以：if(1000<i<100)等于if(（1000<1)<100),1000<1返回0，if(0<100)为false，

user: user-4
content: 真够闲的！！！

user: user-5
content: 按照顺序执行。<操作符的返回值为bool类型的，为1或者0.所以你的程序肯定执行到if里面了。

user: user-6
content: 按照规则来讲，是不可以这么写的 但是非要研究他，自己可以跟踪调试看看 不管这个条件是真是假，都会执行if下面的语句

user: user-7
content: 何必浪费时间研究没有意义的语句？

user: user-8
content: if里边不能这么写——1000<i<100 正像二楼所说的 这个知识，谭浩强的书上也有说明的

user: user-9
content: 1000<i<100//有这么写的吗

user: user-10
content: 闲着蛋疼

user: user-11
content: 参见  运算符的结合行

user: user-12
content: 研究如此高端的代码，大有可为啊

user: user-13
content: 1     .file   "t.c"   2     .section    .rodata   3 .LC0:   4     .string "111111111111"   5     .text   6     .globl  main   7     .type   main, @function   8 main:   9     pushl   %ebp  10     movl    %esp, %ebp  11     andl    $-16, %esp  12     subl    $32, %esp  13     movb    $109, 31(%esp)               a=109  14     movl    $.LC0, (%esp)  15     call    puts                                      printf("111111111111\n");    16     movl    $0, %eax  17     leave  18     ret  19     .size   main, .-main  20     .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"  21     .section    .note.GNU-stack,"",@progbits   看看反汇编，根本没有if的相关代码，直接输出1111111。gcc认为1000<i<100是一个无意义的数学表达式，直接给忽略掉了

user: user-14
content: 编译器虽然不会报错（也可能有些版本的编译器会给出warning），但是这段程序无法达到你编程的意义，而且你这个判断的表达式也略奇葩了，存在什么数大于1000然后还小于100的（写反了吧，少年？）。

user: user-15
content: 如果非要看个究竟,看反汇编出来的汇编语言.

user: user-16
content: 1000 < i 结果不是0就是1，总是比100小，最终总是为1（真）。  or  1000 < i && i < 100

user: user-0
content: 想了想应该是这样的：按顺序逐次比较，中间过程中的比较结果只有两种：真1 假0，然后用1或0再次和下一个数进行比较，知道判断结束，根据最后一次的比较真1假0 ，得出最后的输出结果。

user: user-0
content: 结果是显示1111111111111
user-0 提问: UG二次开发，STL模型

回复:
user: user-0
content: 我是想遍历所有点，找到脸部正前方方向上的坐标绝对值最大点。感觉也应该可以找到。但是看不到效果。不知道错在哪里了。您有相关代码可以共享吗？我不会写程序。

user: user-1
content: 在足够远处构建平面，使用两实体间最短距离函数，感觉应该可以解决
user-0 提问: 音频解码问题

回复:
user: user-0
content: 为什么我用官网的压缩工具压缩后出现了下面这个东西

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=VC%E6%BA%90%E4%BB%A3%E7%A0%81%20g.729&rsv_pq=b7d45aba00008bdb&rsv_t=8e4eLkllsz5RoYorHtsvXcs3FBkEoR71vGmSse74yCVAccmr9Q8Plp3I9VM&rsv_enter=0&rsv_sug3=12&rsv_sug4=205&rsv_sug1=7&inputT=10314  谢谢你，不过我在网上找的源码编译后，对pcm压缩后根本不是g729，也不能对g729解码，而且网上的程序都是一个，可能是我使用的方法不对所以我才来请教的

user: user-1
content: http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=VC%E6%BA%90%E4%BB%A3%E7%A0%81%20g.729&rsv_pq=b7d45aba00008bdb&rsv_t=8e4eLkllsz5RoYorHtsvXcs3FBkEoR71vGmSse74yCVAccmr9Q8Plp3I9VM&rsv_enter=0&rsv_sug3=12&rsv_sug4=205&rsv_sug1=7&inputT=10314
user-0 提问: C语言中字符串截取问题

回复:
user: user-1
content: 1楼正解，没分配内存

user: user-0
content: 引用 1 楼 user-2 的回复:strGetRealmBuf 没分配 ？  法克。还真是。我把这个buf换成数组接受就对了。。  							while(*strRealm != 0x22) 							{ 								strGetRealmBuf[count] = *strRealm; 								count++; 								strRealm++; 								//strGetRealmBuf++;

user: user-2
content: strGetRealmBuf 没分配 ？
user-0 提问: 关于函数调用的问题，求帮忙！

回复:
user: user-1
content: 函数 数组的参数 会被编译成  指针的 数组的个数情报会丢失的。 即使 实参 传入不同个数的数组也能编译成功的。  比如 int sum(int a[5]) 会被编译成 int sum(int *a);  这种情况下，你即使传入a[3]  也可以的   二维数组也是同样的道理， 第一维的个数会丢失的。
user-0 提问: C中全局int变量和局部int变量在内存中占多少个字节？

回复:
user: user-1
content: 你们老师自己不会教，他的本意是想让你们理解 “变量的存储” 全局变量在静态区，存储地址按照声明的顺序增加。 局部变量存储在栈区，存储地址按照声明的顺序递减。 你只要理解存储在哪里，会按什么样的顺序存储就行了。  你们老师纯属吃饱了撑的非得以为自己是编译器，按照自己想法教，但也不能说他错，算是着重点不分吧。

user: user-2
content: 老师说错了  根本没有这种大小关系

user: user-3
content: 研究这个地址有什么意义呢？真心不懂

user: user-4
content: x、y的地址相减是得到的结果是00000003的原因在于VS的编译器在DEBUG版的程序的栈的变量之间插入了校验数据，用于检测栈是否被破坏。  http://bbs.pediy.com/showthread.php?p=906375

user: user-5
content: 楼主可知sizeof为何物？？？？？

user: user-6
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-7
content: 都是sizeof int

user: user-8
content: 替我吐你们老师一脸口水，误人子弟

user: user-0
content: 引用 2 楼 zxh707wk 的回复:不要用变量的地址来算变量的大小 什么意思啊。。。

user: user-9
content: 不要用变量的地址来算变量的大小

user: user-10
content: 这个是编译器优化决定的，没有什么规律的。

user: user-11
content: 尼玛，速度换了正经老师。 生命只有一次啊。

user: user-12
content: 这种老师也是醉了…… 正经的C语言知识讲不清楚，这种无根无据的歪门邪道知识倒是滔滔不绝。

user: user-0
content: 引用 5 楼 zhouchongzxc 的回复:看看所输出的汇编语言代码 应该能够找到答案。 菜鸟不懂汇编语言怎么办。。。

user: user-13
content: 看看所输出的汇编语言代码 应该能够找到答案。

user: user-14
content: 1L已经说的很清楚了，这个是编译器决定的。
user-0 提问: 这段代码为什么是这个结果？

回复:
user: user-1
content: scanf_s 最后一个参数没有提供

user: user-2
content: 引用 1 楼 liaocao2010 的回复:vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时，必须提供一个数字以表明最多读取多少位字符。 例如 scanf_s("%s",buf,5),表示最多读取4个字符，因为buf[4]要放'\0' scanf_s最后一个参数是缓冲区的大小，表示最多读取n-1个字符.  百度里摘录+1,lz没看函数说明吗

user: user-3
content: vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时，必须提供一个数字以表明最多读取多少位字符。 例如 scanf_s("%s",buf,5),表示最多读取4个字符，因为buf[4]要放'\0' scanf_s最后一个参数是缓冲区的大小，表示最多读取n-1个字符.  百度里摘录

user: user-3
content: 引用 2 楼 zxh707wk 的回复:[quote=引用 1 楼 liaocao2010 的回复:]  vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时，必须提供一个数字以表明最多读取多少位字符。 例如 scanf_s("%s",buf,5),表示最多读取4个字符，因为buf[4]要放'\0' scanf_s最后一个参数是缓冲区的大小，表示最多读取n-1个字符.  百度里摘录+1,lz没看函数说明吗[/quote]我是沙发，不是楼主
user-0 提问: 关于const指针和位操作运算符的问题.

回复:
user: user-1
content: const int a = 10;  int *pa = (int *)&a;  N1570：6.5.4里明确指出，在一个表达式的前面放一个括住的类型名，表达式的值就被转换为那种类型。a的类型是const int；&a的类型是const int *；(int *) & a的类型是int *。 顺便说一下，通过指针修改一个const int是未定义的行为。

user: user-2
content: 楼主，我搜到了你的第一个问题的答案 http://bbs.csdn.net/topics/90085527 对于(int*)强制类型转换，编译器产生一个副本，把a值保存在 副本里。*pa = 10改动的只是内存副本中的内容，a的实际取值还是从常量表里读取

user: user-3
content: 用clang编译 得到的结果也是 9 10  他应该可以解释为  ：  const int a ＝ 10 ；／／ 其实就是 ＃define a 10     所以你用a的时候其实都是10   其实并不是这样，至少clang不是这样。

user: user-4
content: 因为你用的是VC，我用的是gcc，所以以下内容仅供参考  第一个问题： 首先要明确的是，声明为const的局部变量只对编译器有意义，也就是说这里的const仅用于编译时的类型检查，而如果你的程序通过一些取巧的方式来修改这个cosnt的局部变量，程序运行时是不会有任何感知的。接下来回答你的两个小问题 1、因为a是const的，所以 &a 返回的类型是 const int * ，被你强制转换成 int * 后，就能赋给pa了。这种类型不兼容的情况gcc默认只会抛出一个警告。 2、在gcc下，输出的结果是“9 9“。  第二个问题： 有点晕，但你的temp应该初始化为0，而且在while循环内应该是 temp|=(y&1);
user-0 提问: 用&取地址时，为什么可以对诸如"Hello"的字符串常量使用，却不能对#define PI 3.1415926的浮点型常量使用？

回复:
user: user-1
content: "Hello"占用了内存，所以有内存地址。而仅仅是一个值的话，是不占用内存的。没有占用内存，当然就没有内存地址可言。 如果是const double PI = 3.1415925；那么PI就是一个变量，需要占用内存，此时就有地址可言了。

user: user-2
content: 编译期 运行期

user: user-3
content: #4一语道破

user: user-4
content: 分配了实实在在的内存，才能取到地址， #define PI 3.14....   在预处理阶段PI就直接被替换成3.14..了，程序是看不到PI的，它所知道的就是3.14...这个常量数字 const double PI = 3.1415925，PI是一个变量，double型的，编译器为其分配了空间，只不过由于有const修饰这个空间只读 hello，字符串常量，编译器为其在文字常区分配空间，同样只可读 想要完全了解，写一个简单的，然后反汇编

user: user-5
content: &PI 经过编译预处理后变成了 &3.1415925 而"Hello"是在内存中连续存放的

user: user-6
content: 因为 #define PI 3.1415926 不是常量，是宏定义 过了编译阶段，在程序运行阶段，是不存在的

user: user-0
content: 引用 2 楼 zhouchongzxc 的回复:这个很简单的吧  	movl	$10, %edx  你知道 10 会放在哪里吗？ 小弟菜鸟请指教	movl	$10, %edx是什么意思。。。看不懂

user: user-7
content: 这个很简单的吧  	movl	$10, %edx  你知道 10 会放在哪里吗？

user: user-0
content: 经过试验发现 用#define 定义的PI 不能使用&符号取地址， 而用const double PI = 3.1415925；就可以。请问是为什么呢？
user-0 提问: 一道C语言田忌赛马的题目。

回复:
user: user-0
content: 引用 4 楼 zhouchongzxc 的回复:如果 第一场 1 赢了 2 第二场 2 赢了 1  该怎么处理呢？  两场都不算？  如果 第一场 1 赢了 2 第二场 2 赢了 3 第三场 3 赢了 1    又该怎么办呢？  用“有向图”可以吗？不考虑这种情况，据说不会出现的

user: user-1
content: 1. 构造一个N*N的矩阵A, 如果i胜过j, 则A(i,j) =1, 否则A(i, j) = 0 2. 计算B = A + A^2 + A^3 + ... + A*N 若B(i, j) > 0，说明i直接或间接胜过j, 即i应该排在j前面；若B(i,i)>0，说明i处在一个循环战胜中。  i的次序是可以确定, 当且仅当同时满足以下2个条件： 1) B(i,i) ==0 2) 满足B(i,j)>0的j个数为x(i),满足B(k,i)>0的k个数为y(i), x(i)+y(i) == N-1

user: user-2
content: 如果 第一场 1 赢了 2 第二场 2 赢了 1  该怎么处理呢？  两场都不算？  如果 第一场 1 赢了 2 第二场 2 赢了 3 第三场 3 赢了 1    又该怎么办呢？  用“有向图”可以吗？

user: user-0
content: 引用 2 楼 truelance 的回复:1. 构造一个N*N的矩阵A, 如果i胜过j, 则A(i,j) =1, 否则A(i, j) = 0 2. 计算B = A + A^2 + A^3 + ... + A*N 若B(i, j) > 0，说明i直接或间接胜过j, 即i应该排在j前面；若B(i,i)>0，说明i处在一个循环战胜中。  i的次序是可以确定, 当且仅当同时满足以下2个条件： 1) B(i,i) ==0 2) 满足B(i,j)>0的j个数为x(i),满足B(k,i)>0的k个数为y(i), x(i)+y(i) == N-1 能说说计算B的原因吗？我好像不是很理解你说的，为什么要建立N*N的矩阵？还有比赛结果是我输入的，矩阵要怎么读写进去？

user: user-0
content: 没有人来回答下吗
user-0 提问: 我这种情况有没有必要把C编程环境转移到LINUX？

回复:
user: user-1
content: 《Linux C编程一站式学习》

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

user: user-2
content: 像往linux方向发展，怎么不使用linux呢，使用linux怎么能不是使用vim呢，所以楼主看着办吧

user: user-3
content: 直接使用vim，然后学一下Makefile文件。

user: user-0
content: 引用 4 楼 liutingxun 的回复:如果你是处于学习阶段，觉得配一个Linux环境很麻烦的话。可以建议你使用codeblocks + mingw.这是在windows下模拟Linux环境编程。直接生成的是EXE文件。或者eclipse + cygwin,也是类似的效果。但是因为毕竟是模拟的，所以像在Linux下的内核函数，比如Poll之类的函数，是没法实现的。  如果真要在Linux下编程，写小程序可以用VIM，再在网上找一下.vimrc的配置文件，可以配一个很炫酷的环境出来。如果要用IDE的话，可以建议使用codeblocks,这是一个跨平台的神器。KDE桌面环境的话，可以使用KDEVELOP。都是很好用的。Eclipse+ CDT感觉用起来很卡，很慢。很详细，谢谢。我用了KDEVELOP，挺好用的，就是如果有scanf()的程序，下面的运行框里就是正在启动：/home/yaoli/projects/c/build/c 不知道要从哪里进行输入呢？

user: user-4
content: 很有必要 因为你要往linux发展， 那肯定不是写 与平台无关的 纯算法程序了。

user: user-5
content: 有吧，嘿嘿！

user: user-6
content: 如果你是处于学习阶段，觉得配一个Linux环境很麻烦的话。可以建议你使用codeblocks + mingw.这是在windows下模拟Linux环境编程。直接生成的是EXE文件。或者eclipse + cygwin,也是类似的效果。但是因为毕竟是模拟的，所以像在Linux下的内核函数，比如Poll之类的函数，是没法实现的。  如果真要在Linux下编程，写小程序可以用VIM，再在网上找一下.vimrc的配置文件，可以配一个很炫酷的环境出来。如果要用IDE的话，可以建议使用codeblocks,这是一个跨平台的神器。KDE桌面环境的话，可以使用KDEVELOP。都是很好用的。Eclipse+ CDT感觉用起来很卡，很慢。

user: user-7
content: 引用 楼主 mosquitoh 的回复:现在在win7下用VS2013编C，觉得非常方便和人性化。但是我把我的方向定在往LINUX发展，不知道有没有必要把C编程环境转移到LINUX？IDE用ECLIPSE怎么样？ 都linux了，还eclipse啊，直接vim。