Question: 帮我编译C语言稍微复杂点的运算，

引用 8 楼 u013697891 的回复:没见过这种格式啊谁能解释下     long count = 5L;     float ship_cost = 2.5F; C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  integer-constant :  decimal-constant integer-suffixopt octal-constant integer-suffixopt hexadecimal-constant integer-suffixopt 'c-char-sequence'  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffixopt long-suffix unsigned-suffixopt  unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal  To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit  To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the “x” does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i  To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value  C++ Floating-Point Constants Floating-point constants specify values that must have a fractional part. These values contain decimal points (.) and can contain exponents.  Syntax  floating-constant :  fractional-constant exponent-partopt floating-suffixopt digit-sequence exponent-part floating-suffixopt  fractional-constant :  digit-sequenceopt . digit-sequence digit-sequence .  exponent-part :  e signopt digit-sequence E signopt digit-sequence  sign : one of  + –  digit-sequence :  digit digit-sequence digit  floating-suffix :one of  f l F L  Floating-point constants have a “mantissa,” which specifies the value of the number, an “exponent,” which specifies the magnitude of the number, and an optional suffix that specifies the constant’s type. The mantissa is specified as a sequence of digits followed by a period, followed by an optional sequence of digits representing the fractional part of the number. For example:  18.46 38.  The exponent, if present, specifies the magnitude of the number as a power of 10, as shown in the following example:  18.46e0      // 18.46 18.46e1      // 184.6  If an exponent is present, the trailing decimal point is unnecessary in whole numbers such as 18E0.  Floating-point constants default to type double. By using the suffixes f or l (or F or L — the suffix is not case sensitive), the constant can be specified as float or long double, respectively.  Although long double and double have the same representation, they are not the same type. For example, you can have overloaded functions like  void func( double );  and   void func( long double );

感觉C,C++ 标准，对格式化输出（printf等），输出浮点数的输出格式，没有严格规定，是在引入混乱。。

引用 5 楼 cao_julians 的回复:CODE BLOCKS 中的编译器是可以更换的。 CODE BLOCKS 只是一个编程平台，其编译器可以按程序员的要求选择，你应该查一下编译器的厂家、版本，查一下编译器编译开关设置等++ minGw对 long double 的表示方法和其他编译器可能会不一致而已 输出方法（格式）可能也不同，并且和项目的设置有关。  浮点数 float,double,long double 大约有这么几种方式输出 =>1) %f,%lf,%Lf     // MS，Borland 一般是这样的 minGw 也可以设置为这种方式输出 =>2) %hf,%f,%lf     // 还可以设置为这种方式 =>3)%f,%f,(%lf ?? %Lf) //有时候会是这么一种方式、、、、比较多，比较乱，就不列举了

楼主想干啥呢

为什么不用GMP库呢？

，那就换个编译器试试啊？

CODE BLOCKS  不支持 long  double  害我不成功

楼主是想看看大家的编译器坏没坏么

你是想干嘛？


Question: 关于冒泡法算法

#include<stdio.h> #include<stdlib.h>  void bubblesort(int a[], int n) {    	int exchange; 	int i, j, k; 	for (i = 0; i < n; i++) 	{    		exchange = 0; 		for ( j = 1; j < n - i; j++) 		{  			if (a[j - 1] > a[j]) 			{ 				k = a[j]; 				a[j] = a[j - 1]; 				a[j - 1] = k; 				exchange = 1; 			} 		}  		if (exchange != 1) 			break; 	} }  int main() {    	int b[6] = {1, 23, 12, 34, 22, 14}; 	bubblesort(b, 6);  	for (int i = 0; i < 6; i++) 		printf("%d\n", b[i]); 	 	return 0; }

感谢各位大神帮忙，终于搞懂了~

void bubblesort(int a[], int n) { 	int exchange; 	int i,j,k; 	for(i=0; i<n-1; i++) { 		exchange = 0; 		for(j=1; j<n-i; j++) { 			if(a[j-1] > a[j]) { 				k = a[j]; 				a[j] = a[j - 1]; 				a[j - 1] = k; 				exchange = 1; 			} 		} 		if(exchange != 1) 			break; 	} 	for(i=0; i<n; i++) 		printf("%5d", a[i]); 	printf("\n"); }

引用 5 楼 hahahahaboyboy 的回复:加了括号好像还是不行 二楼的程序难道不行吗？

#include <iostream> using namespace std;  // 冒泡排序 void BubbleSort(int data[], int count) { 	int aux = 0; 	bool swap_flag = true;  	for (int i = 0; i < count && swap_flag; ++i) 	{ 		swap_flag = false; 		for (int j = count - 1; j > i; --j) 		{ 			if (data[j] < data[j - 1]) 			{ 				aux = data[j - 1]; 				data[j - 1] = data[j]; 				data[j] = aux;  				swap_flag = true; 			} 		} 	} }  int main() { 	int array[] = {9, 6, 3, 8, 7, 1, 5, 2, 4};  	BubbleSort(array, 9);  	for(int i = 0; i < 9; ++i) 		cout << array[i] << endl;  	return 0; }

#include<stdio.h> #include<stdlib.h> void bubblesort(int a[],int n) {   int exchange;     int i,j,k; 	for(i=0;i<n;i++) 	{    		exchange=0; 		for(j=1;j<n-i;j++) 		{  			if(a[j-1]>a[j]) 			{ 				k=a[j]; 			a[j]=a[j-1]; 			a[j-1]=k; 			exchange=1; 			} 		} 		//if(exchange!=1) 		//	exit(0); 	} 	printf("排序后："); 	for(i=0;i<n;i++) 		printf("%5d",a[i]); 	printf("\n"); } int main() {    	int i,b[6]={1,23,12,34,22,14}; 	printf("排序前："); 	for(i=0;i<6;i++) 		printf("%5d",b[i]); 	printf("\n"); 	bubblesort(b,6); 	return 0; }

之前没有排版不好意思，这个版本比较清晰~

加了括号好像还是不行

加个是exchange 用来判断是否排序完成

楼主为啥要加一个 exchange 啊？

# include <stdio.h> # include <stdlib.h>  void bubblesort(int a[],int n) {    	int exchange; 	int i, j, k; 	for(i=0; i<n; i++) 	{   		exchange = 0; 		for(j=1; j<n-i; j++) 		{  			if(a[j-1] > a[j]) 			{ 				k = a[j]; 				a[j] = a[j-1]; 				a[j-1] = k; 				exchange = 1; 			} 		} //		if(exchange != 1) //			exit(0); 	} 	for(i=0; i<n; i++) 		printf("%5d", a[i]); 	printf("\n"); }  int main(void) {   	int i, b[6] = {1, 23, 12, 34, 22, 14}; 	for(i=0; i<6; i++) 		printf("%5d", b[i]);  	printf("\n");    	bubblesort(b, 6); 	 	return 0; }

这代码排版的，真是难看。好像是少了{} 吧   for(i=0;i<n;i++) { 	for(j=1;j<n-i;j++) 	{ 		if(a[j-1]>a[j]) 		{   		    k=a[j];   		    a[j]=a[j-1];   		    a[j-1]=k;   		    exchange=1;                ｝   	} }


Question: 数据结构课程设计家谱管理，求大神帮助，网上找的源代码错误太多啦

弄本C语言描述的数据结构书翻翻

这是树的代码吧。。。

简单一些的用链表 复杂一些的用树结构 注：     计划生育做得好可以用四叉树     不然用八叉树，  要说代码，我也觉得除非是学生， 不然不会花时间给你写这个用不上的东西 还是自己实现练练手吧

估计不会有人直接回答的，这个网上一搜有不少，还是自己找一个错误少的慢慢改吧，这样还能学到一些东西

《算法精解（C语言描述）》


Question: 求帮助完善一下这个碟片出租管理系统

建议用MFC再做一遍，不会耗费太多时间。  演示的时候也是一目了然。

急求，来好心人啊


Question: 《天下第一》客户端代码和 DEMO 已经上传到 goolge code

A* 是这个源代码里面技术含量最低的一段代码

static PathFind* pathFind = NULL;  PathFind* PathFind::getTheOnlyInstance() {     if (!pathFind)     {         pathFind = new PathFind();     }      return pathFind; }  // A*初始化 Astar* PathFind::newAstar() {     Astar* astar = (Astar*)malloc(sizeof(Astar));     astar->openHead = (AstartListNode*)malloc(sizeof(AstartListNode));     astar->closedHead = (AstartListNode*)malloc(sizeof(AstartListNode));     astar->openHead->next = NULL;     astar->closedHead->next = NULL;     return astar; }  // A*释放 void PathFind::deleteAstar(Astar* astar) {     while (astar->openHead != NULL)     {         AstartListNode* t = astar->openHead;         astar->openHead = astar->openHead->next;         free(t);         t = NULL;     }      while (astar->closedHead != NULL)     {         AstartListNode* t = astar->closedHead;         astar->closedHead = astar->closedHead->next;         free(t);         t = NULL;     }      free(astar); }  // 结点初始化 void PathFind::AstarNodeInit(AstartListNode* current, AstartListNode* father, int x, int y, int endX, int endY) {     current->x = x;     current->y = y;     current->father = father;     current->next = NULL;      if (father != NULL)     {         current->f = father->f + 1;     }     else     {         current->f = 0;     }      current->g = abs(endX - x) + abs(endY - y);     current->h = current->f + current->g; }  // 取得成本最小的结点 AstartListNode* PathFind::AstarGetMinCostList(Astar* astar) {     AstartListNode* min = astar->openHead->next;     AstartListNode* current = min->next;      while (current != NULL)     {         if (current->h < min->h)         {             min = current;         }          current = current->next;     }      return min; }  // 添加结点到链表 void PathFind::AstarAddNode(AstartListNode* head, AstartListNode* node) {     while (head->next != NULL)     {         head = head->next;     }      head->next = node; }  // 从链表中删除结点 void PathFind::AstarRemoveNode(AstartListNode* head, AstartListNode* node) {     AstartListNode* current = head;     head = head->next;      while (head != NULL)     {         if (head == node)         {             current->next = head->next;             head->next = NULL;             break;         }         else         {             current = head;             head = head->next;         }     } }  // 检查Tile是否在链表中 bool PathFind::AstarCheckNodeInList(int x, int y, AstartListNode* head) {     bool result = false;     head = head->next;      while (head != NULL)     {         if (head->x == x && head->y == y)         {             result = true;             break;         }         else         {             head = head->next;         }     }      return result; }  // 检查Tile是否是地图的路障 bool PathFind::AstarIsBlock(int x, int y) {     if (x >= 0 && x < tiledMap->getMapSize().width && y >= 0 && y < tiledMap->getMapSize().height)     {             CCTMXLayer* mapLayer = tiledMap->layerNamed("mainCityLayer");         unsigned int gid = mapLayer->tileGIDAt(ccp(x, y));          CCDictionary* tileProperty = tiledMap->propertiesForGID(gid);         int v = ((CCString*)tileProperty->objectForKey("walk"))->intValue();          if (v == 0)         {             return true;         }     }     else     {         return false;     }      return false; }  bool PathFind::AStarSearch(CCTMXTiledMap* tiledMap, int startX, int startY, int endX, int endY) {     astarPathCount = 0;     astarPathList.clear();      this->tiledMap = tiledMap;      this->startX = startX;     this->startY = startY;     this->endX = endX;     this->endY = endY;      if (AstarIsBlock(endX, endY))     {         return false;     }      int offsetX[] = {0, 0, -1, 1, -1, -1, 1, 1};     int offsetY[] = {1, -1, 0, 0, 1, -1, 1, -1};          Astar* astar = newAstar();      AstartListNode* currentNode = NULL;     AstartListNode* startNode = (AstartListNode*)malloc(sizeof(AstartListNode));     AstarNodeInit(startNode, NULL, startX, startY, endX, endY);     // 把起始结点加入OpenList     AstarAddNode(astar->openHead, startNode);      // 如查OpenList不为空     while (astar->openHead->next != NULL)     {         // 取得成本最小的结点         currentNode = AstarGetMinCostList(astar);          // 如果当前结点是目标结点         if (currentNode->x == endX && currentNode->y == endY)         {             break;         }         else         {             // 把当前结点添加到Closed表中             AstarAddNode(astar->closedHead, currentNode);             // 把当前结点从Open表中删除             AstarRemoveNode(astar->openHead, currentNode);              for (int i = 0; i < 8; i++)             {                 int x = currentNode->x + offsetX[i];                 int y = currentNode->y + offsetY[i];                  if (x < 0 || x >= tiledMap->getMapSize().width || y < 0 || y >= tiledMap->getMapSize().height)                 {                     continue;                 }                 else                 {                     if (!AstarCheckNodeInList(x, y, astar->openHead)                         && !AstarCheckNodeInList(x, y, astar->closedHead)                         && !AstarIsBlock(x, y)                        )                     {                         AstartListNode* endNode = (AstartListNode*)malloc(sizeof(AstartListNode));                         AstarNodeInit(endNode, currentNode, x, y, endX, endY);                         AstarAddNode(astar->openHead, endNode);                     }                 }             }         }     }      if (astar->openHead->next == NULL && (currentNode->x != endX || currentNode->y != endY))     {         astarPathCount = 0;         return false;     }     else     {         while (currentNode != NULL)         {             CCPoint tilePoint;             tilePoint.x = currentNode->x;             tilePoint.y = currentNode->y;                          CCTMXLayer* mapLayer = tiledMap->layerNamed("mainCityLayer");             CCSprite* tile = mapLayer->tileAt(ccp(tilePoint.x, tilePoint.y));             astarPathList.push_front(tilePoint);             currentNode = currentNode->father;             astarPathCount++;         }          return true;     }      deleteAstar(astar);     return false; }

期待《诛仙》单机版 剧情+3D格斗 发现很多人都在期待呢......

谷歌又打不开了  一开始看到天下第一，我还以为是宇宙第一高手日伪呢

建议楼主尽早添加类似KOF中那种很养眼的女角色！

支持一下吧，楼主精神可嘉

老板是李天一？

在这里也发现三爷了，必须支持一下。


Question: C和win32是什么关系？？？

引用 10 楼 zhucz333 的回复:这个问题，感觉楼主对C win32 API win32汇编等等名词还没有区分清楚  win32 API 就是windows提供的一套系统接口，可以是汇编语言实现，也可以是C语言实现，或者其它语言什么的，那不是我们关注的，对于API的用户而言，只是使用其功能，可以理解为黑盒子上的几个接口而已。 win32 汇编我的理解应该是在汇编语言下使用API，没有别的什么，和C环境使用win32 API的道理一样，没有什么特殊的 我懂了，接口不同，但其实都是一样的API。是这样吧？

顾名思义 http://www.baidu.com/s?wd=api%E7%9A%84%E6%84%8F%E6%80%9D&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=6&rsv_sug4=48&rsv_sug1=6&oq=API%E7%9A%84&rsv_sug2=1&f=3&rsp=0&inputT=6890

引用 7 楼 asdas434123 的回复:之前对api概念很模糊，是不是这样，API有用C写的也有用汇编写的，C和汇编都有自己的api？ 更合理的说法是：API的C语言接口，API的汇编语音接口。

被称为“大师”了。窃喜中……

机械制造能不能实现汽车的离合器的功能？？？机械制造是不是不用管橡胶和金属材料，不用记那么多齿轮和标准零件参数？？相对来说比金属冶炼简单？

引用 2 楼 asdas434123 的回复:[quote=引用 1 楼 zjq9931 的回复:] [quote=引用 楼主 asdas434123 的回复:] C语言里能不能实现win32的api函数编写出来功能？？？C是不是不用定义数据段和资源，不用记那么多API函数和参数？？相对来说比win32汇编简单？ win32是一个平台。 只要编译器支持这个头文件包含：window.h API函数，是windows提供的编程接口，不是C语音的库函数，必须要用的。 C语音没有实现界面的库函数。要使用平台，系统提供的编程接口才行。所以api函数是必须要学的。  如果用java 则有自己的一套实现界面的方案.swing接口。跨平台。 [/quote] 还一个疑问，以下引用大师的话：计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 上面的汇编语言指的就是win32汇编吧？[/quote] 如果是用来分析代码的话，肯定是的。

机械制造和汽车是什么关系？？？

引用 1 楼 zjq9931 的回复:[quote=引用 楼主 asdas434123 的回复:] C语言里能不能实现win32的api函数编写出来功能？？？C是不是不用定义数据段和资源，不用记那么多API函数和参数？？相对来说比win32汇编简单？ win32是一个平台。 只要编译器支持这个头文件包含：window.h API函数，是windows提供的编程接口，不是C语音的库函数，必须要用的。 C语音没有实现界面的库函数。要使用平台，系统提供的编程接口才行。所以api函数是必须要学的。  如果用java 则有自己的一套实现界面的方案.swing接口。跨平台。 [/quote] 还一个疑问，以下引用大师的话：计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 上面的汇编语言指的就是win32汇编吧？

引用 楼主 asdas434123 的回复:C语言里能不能实现win32的api函数编写出来功能？？？C是不是不用定义数据段和资源，不用记那么多API函数和参数？？相对来说比win32汇编简单？ win32是一个平台。 只要编译器支持这个头文件包含：window.h API函数，是windows提供的编程接口，不是C语音的库函数，必须要用的。 C语音没有实现界面的库函数。要使用平台，系统提供的编程接口才行。所以api函数是必须要学的。  如果用java 则有自己的一套实现界面的方案.swing接口。跨平台。


Question: 求帮忙改下这个代码！  我改了好久也不懂

非常感谢你的帮忙！

void FindRecord(RECORD* pHead) { 	while (1) 	{ 		FindMenue(); 		switch (FindMenuRes()) 		{ 		case '0': 			return; 		case '1': 		{ 					char name[20] = "";  					printf("\t\t请输入学生姓名:"); 					fflush(stdin);//清空缓存 					gets(name); 					//用于显示姓名为name的所有结点信息 					FindByName(pHead, name); 		} 			break; 		case '2': 		{ 					char num[20] = "";  					printf("\t\t请输入学生学号:"); 					fflush(stdin);//清空缓存 					gets(num);	 //用于显示学号为num的所有结点信息 					FindByNum(pHead, num); 		} 			break; 		case '3': 		{ 					char spec[21] = ""; 					printf("请输入学生专业："); 					fflush(stdin); 					gets(spec); 					FindBySpec(pHead, spec); 		} 			break; 		case '4': 		{ 					int clas_1; 					char clas[40]; 					printf("请输入学生年级："); 					fflush(stdin); 					scanf("%d", &clas_1); 					itoa(clas_1, clas, 4); 					FindByclas(pHead, clas); 		} 			break;  		default: 			printf("请选择[0-4]:"); 			system("cls"); 		} 	} }  void FindMenue(void) { 	system("cls"); 	printf("\t\t\t--------查找菜单---------\n"); 	printf("\t\t\t1.按姓名查找。\n"); 	printf("\t\t\t2.按学号查找。\n"); 	printf("\t\t\t2.按专业查找。\n"); 	printf("\t\t\t2.按班级查找。\n"); 	printf("\t\t\t0.返回主菜单。\n"); 	printf("\t\t\t-------------------------\n"); 	printf("\t\t请选择:"); }  char FindMenuRes(void) { 	char sel[100] = ""; 	gets(sel); 	if (strlen(sel) != 1 		|| sel[0] > '4' 		|| sel[0] < '0') 	{ 		return -1; 	} 	else 	{ 		return sel[0]; 	} }


Question: 请问windows下怎么使用cl.exe来编译文件

引用 9 楼 ADF1230 的回复:类似这样的目录中 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts  类似这样的文件 VS2013 x86 Native Tools Command Prompt  找到了，谢谢！！！

看看这篇文章吧： http://ilanever.com/article/sitedetail.html?id=194

看你的样子还没上初中吧，这么小就开始学编程将来前途无量啊

装个linux 虚拟机，用linux学习比较好

引用 8 楼 Zzy_ZhangZeyu_ 的回复:[quote=引用 2 楼 shimachao 的回复:] 你装vs2010之类的IDE没，它提供了一个控制台窗口给你用命名行。如下图    我就喜欢楼主这种爱折腾的少年，和以前的我一样。 请问怎么从VS中打开这个窗口我，我找了半天也没找到[/quote] 在开始菜单里 搜索“studio” 就出来了

引用 2 楼 shimachao 的回复:你装vs2010之类的IDE没，它提供了一个控制台窗口给你用命名行。如下图    我就喜欢楼主这种爱折腾的少年，和以前的我一样。 请问怎么从VS中打开这个窗口我，我找了半天也没找到

makefile脚本。

我就是想练练makefile,之前一直用的IDE，那玩意什么事都帮我做好了，现在我打算自己试试

到vs里面打开那里命令提示   如何想知道cl怎么用 用msdn查cl。exe就是了

C/C++ 编译器选项                                 -优化-  /O1 最小化空间                          /O2 最大化速度 /Ob<n> 内联扩展(默认 n=0)               /Od 禁用优化(默认) /Og 启用全局优化                        /Oi[-] 启用内部函数 /Os 优选代码空间                        /Ot 优选代码速度 /Ox 最大化优化                          /Oy[-] 启用帧指针省略                               -代码生成-  /GF 启用只读字符串池                    /Gm[-] 启用最小重新生成 /Gy[-] 分隔链接器函数                   /GS[-] 启用安全检查 /GR[-] 启用 C++ RTTI                    /GX[-] 启用 C++ EH (与 /EHsc 相同) /EHs 启用 C++ EH (没有 SEH 异常)        /EHa 启用 C++ EH (w/ SEH 异常) /EHc 外部“C”默认为 nothrow /fp:<except[-]|fast|precise|strict> 选择浮点模式:     except[-] - 在生成代码时考虑浮点异常     fast -“fast”浮点模式；结果可预测性比较低     precise -“precise”浮点模式；结果可预测     strict -“strict” 浮点模式(意味着 /fp:except) /GL[-] 启用链接时代码生成               /GA 为 Windows 应用程序进行优化 /Ge 对所有函数强制堆栈检查              /Gs[num] 控制堆栈检查调用 /Gh 启用 _penter 函数调用               /GH 启用 _pexit 函数调用 /GT 生成纤程安全 TLS 访问               /RTC1 启用快速检查(/RTCsu) /RTCc 转换为较小的类型检查              /RTCs 堆栈帧运行时检查 /RTCu 未初始化的局部用法检查 /clr[:option] 为公共语言运行库编译，其中 option 是:     pure - 生成只包含 IL 的输出文件(没有本机可执行代码)     safe - 生成只包含 IL 的可验证输出文件     oldSyntax - 接受 Visual C++ 2002/2003 的托管扩展语法     initialAppDomain - 启用 Visual C++ 2002 的初始 AppDomain 行为     noAssembly - 不产生程序集           /Gd __cdecl 调用约定 /Gr __fastcall 调用约定                 /Gz __stdcall 调用约定 /GZ 启用堆栈检查(/RTCs)                 /QIfist[-] 使用 FIST 而不是 ftol() /hotpatch 确保可热修补映像的函数填充 /arch:<SSE|SSE2> CPU 结构的最低要求，为以下内容之一:     SSE - 启用支持 SSE 的 CPU 可用的指令     SSE2 - 启用支持 SSE2 的 CPU 可用的指令                                -输出文件-  /Fa[file] 命名程序集列表文件            /FA[scu] 配置程序集列表 /Fd[file] 命名 .PDB 文件                /Fe<file> 命名可执行文件 /Fm[file] 命名映射文件                  /Fo<file> 命名对象文件 /Fp<file> 命名预编译头文件              /Fr[file] 命名源浏览器文件 /FR[file] 命名扩展 .SBR 文件 /doc[file] 处理 XML 文档注释，并可选择命名 .xdc 文件                                -预处理器-  /AI<dir> 添加到程序集搜索路径           /FU<file> 强制使用程序集/模块 /C 不抽出注释                           /D<name>{=|#}<text> 定义宏 /E 将预处理定向到 stdout                /EP 预处理到标准输出，没有 #line /P 预处理到文件                         /Fx 将插入的代码合并到文件中 /FI<file> 命名强制包含文件              /U<name> 移除预定义的宏 /u 移除所有预定义的宏                   /I<dir> 添加到包含搜索路径 /X 忽略“标准位置”                                  -语言-  /Zi 启用调试信息                        /Z7 启用旧式调试信息 /Zp[n] 在 n 字节边界上包装结构          /Za 禁用扩展 /Ze 启用扩展(默认)                      /Zl 忽略 .OBJ 中的默认库名 /Zg 生成函数原型                        /Zs 只进行语法检查 /vd{0|1|2} 禁用/启用 vtordisp           /vm<x> 指向成员的指针类型 /Zc:arg1[,arg2] C++ 语言一致性，这里的参数可以是:     forScope[-] - 对范围规则强制使用标准 C++     wchar_t[-] - wchar_t 是本机类型，不是 typedef /ZI 启用“编辑并继续”调试信息          /openmp 启用 OpenMP 2.0 语言扩展                                - 杂项 -  @<file> 选项响应文件                    /?, /help 打印此帮助消息 /bigobj 生成扩展的对象格式              /c 只编译，不链接 /errorReport:option 将内部编译器错误报告给 Microsoft     none - 不发送报告                       prompt - 提示立即发送报告     queue - 在下一次管理员登录时，提示发送报告(默认)     send - 自动发送报告                 /FC 诊断中使用完整路径名 /H<num> 最大外部名称长度                /J 默认 char 类型是 unsigned /nologo 取消显示版权消息                /showIncludes 显示包含文件名 /Tc<source file> 将文件编译为 .c        /Tp<source file> 将文件编译为 .cpp /TC 将所有文件编译为 .c                 /TP 将所有文件编译为 .cpp /V<string> 设置版本字符串               /w 禁用所有警告 /wd<n> 禁用警告 n                       /we<n> 将警告 n 视为错误 /wo<n> 发出一次警告 n                   /w<l><n> 为 n 设置警告等级 1-4 /W<n> 设置警告等级(默认 n=1)            /Wall 启用所有警告 /WL 启用单行诊断                        /WX 将警告视为错误 /Yc[file] 创建 .PCH 文件                /Yd 将调试信息放在每个 .OBJ 中 /Yl[sym] 为调试库插入 .PCH 引用         /Yu[file] 使用 .PCH 文件 /Y- 禁用所有 PCH 选项                   /Zm<n> 最大内存分配(默认为 %) /Wp64 启用 64 位端口定位警告                                  -链接-  /LD 创建 .DLL                           /LDd 创建 .DLL 调试库 /LN 创建 .netmodule                     /F<num> 设置堆栈大小 /link [链接器选项和库]                  /MD 与 MSVCRT.LIB 链接 /MT 与 LIBCMT.LIB 链接                  /MDd 与 MSVCRTD.LIB 调试库链接 /MTd 与 LIBCMTD.LIB 调试库链接                           -代码分析-  /analyze[:WX-] 启用代码分析     WX- - 即使调用了 /WX，也不应将代码分析警告视为错误

引用 2 楼 shimachao 的回复:你装vs2010之类的IDE没，它提供了一个控制台窗口给你用命名行。如下图    我就喜欢楼主这种爱折腾的少年，和以前的我一样。 +1

……没错，要先跑到CMD下，然后运行cl.exe。  你确定要这么做？看你“双击”这个动作，应该对命令行不是很了解吧？通常编译器的参数都有好几百个，你确定能搞定？另外还有链接器……即使是大神，也不喜欢手动敲这玩意吧？命令行编译大家都用make批处理工具。


Question: Linux 怎么用shell写个守护进程

引用 楼主 xiaomi163 的回复:写一个daemon  shell脚本： 脚本启动后，脚本死循环的形式在后台运行，当前启动脚本的终端关闭后，脚本仍能够正常运行。 ./shell.bin &

引用 2 楼 chenbin0522 的回复:#!/bin/bash  exec 2>&1 exec /opt/program -para   晕，看错标题，我以为是写daemon tools的run脚本。

nohup ./youshell.sh &

顶1L，&可以使脚本后台执行，nohup可以使得进程脱离shell（即退出登录脚本仍然执行）


Question: C语言新手求助 急！！！

属于数组越界了

仅供参考//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

那把数据的值开大一点呢？？虽然会造成内存浪费， 但可以等以后自己技术厉害一点了， 在回来该啊！！！！！！！

引用 4 楼 whustyle 的回复:xinxi[20][5]最好不要用char类型定义，应为你是希望存储20个人5类信息，改成结构体吧 struct Friends{     char No[30];     char Name[10];     char Sex[10];     int Age;     char Tel[20]; }xinxi[20] 我不会用结构体，能帮忙把完整的代码发给我吗？万分感谢

应该是数组越界了

引用 1 楼 91program 的回复:应该是数组越界了 引用 2 楼 crestine 的回复:char xinxi[20][5];  scanf_s("%s", &xinxi[i][j]); /*注意这时候是把用户输入的数据按照 %s (即字符串)的形式放到 &xinxi[i][j] 里面， 但是 &xinxi[i][j] 又是什么呢？它是一个二维字符数组中某个元素的地址，只能装一个字节的数据。 你把一个字符串装进一个只能容纳单个字符的内存空间里，不出错才怪。 */   那我要怎么修改那？


Question: 请教一个补码运算的问题

引用 4 楼 u010486937 的回复:128的补码是10000000b（即128） -128的补码也是10000000b按位取反（此时为01111111b)再加1（此时为10000000） 由于char只能保存-128到127之间的数据，所以依据结果的补码（10000000b)可知结果为-128

是的，char 的取值（-128，127）， 128，原码10000000，在计算机中补码表示10000000，但signed char表示出来的是-128， 同理，如果-128-1，即-129，原码10000001，在计算机中补码表示为01111111，sighed char  打印出来（%d）是127  0- （-128）计算出是128，故结果 -128

我想应该是-128，

这种运算溢出的结果应该属于未定义行为吧


Question: 求C语言插入图片函数和音乐函数

和具体的平台相关，什么平台？

什么叫插入？

图片不知道，音乐只知道背景音乐——http://blog.csdn.net/u012421456/article/details/18887643


Question: printf.c: 没有那个文件或目录

路径问题吧。。。

看看这个

在glibc的调试包中

#4说的对，我也遇到这样的情况了，改成n(next)，不进入函数就好了，又不要调试printf函数，所以在printf函数语句之前用next调试命令，不进入printf函数。

贴源码啊，估计是lz把文件目录搞错了

文件名或路径是否正确？

贴源代码

LZ想step into printf函数，当然得有printf的定义文件了。


Question: 能不能再if语句中给数组赋初值

“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

引用 9 楼 u012421456 的回复:不可以吗？可以参考

引用 13 楼 lin5161678 的回复:引用 9 楼 u012421456 的回复:不可以吗？C语言不可以的 不要和C++ 混淆了 我刚才仔细看了看，的确是C++可以，C不可以，新手又犯错误了，唉，谢谢指点啊

不可以  原因是 if()这里只能写语句  而声明不是语句  不符合语法 所以不行

引用 8 楼 lpcads 的回复:[quote=引用 1 楼 u013163564 的回复:] c语言所有的变量定义都要放在函数开头，谢谢 目测老谭和 (或) TC 的受害者。[/quote] 好吧，是我的错，但在VC6.0中c后缀确实只可以在函数前面使用，刚在linux中使用gcc的时候是可以的，我不知道其他版本会不会有这样的问题

引用 8 楼 lpcads 的回复:[quote=引用 1 楼 u013163564 的回复:] c语言所有的变量定义都要放在函数开头，谢谢 目测老谭和 (或) TC 的受害者。[/quote] 目测你写C文件的时候后缀是.cpp的，谢谢

作用域的问题。如果在if/else都加上{}就很容易明白了。

不可以吗？

引用 1 楼 u013163564 的回复:c语言所有的变量定义都要放在函数开头，谢谢 目测老谭和 (或) TC 的受害者。

不可以。  LZ的问题可以这样解决： int days[][12]= {{31,28,31,30,31,30,31,30,31,30,31,30}, {31,29,31,30,31,30,31,30,31,30,31,30}};  number_of_days_in_month = days[is_leap(year)][month];

int a[12]={31,28,31,30,31,30,31,30,31,30,31,30}; if(leap(y,m,d))  a[1] = 29;

引用 4 楼 a515360208 的回复:标准C的变量声明必须放在最前面、、、、、、、  从c99标准开始，变量声明就已经可以不在语句之前了。楼主换了个新版本的编译器吧。

标准C的变量声明必须放在最前面、、、、、、、

引用 1 楼 u013163564 的回复:c语言所有的变量定义都要放在函数开头，谢谢不用好吗，在while语句里也可以定义变量啊！只是它的变量的俢域范围不一样而已！

a的作用域只在if的内部。像下面这样的代码：if (1) {     int a = 1;     printf("\n %d",a); } else {     int a = 2;     printf("\n %d", a); }  这样是可以的。但如果在这个语句的下面加上  printf("\n %d", a); 这样都会报上面的错误！

c语言所有的变量定义都要放在函数开头，谢谢


Question: 串的基本操作

LZ请给分。


Question: 关于sscanf

你自己解决了，接分^_^ 引用 1 楼 qin_lin_sb 的回复:找到原因了，忘了取地址了 sscanf(str,  "(%u,%u):(%u,%u):%u", &begx, &begy, &endx, &endy, &type) ;

sscanf用的不多吧


Question: 这个程序怎么读不进数据？？？C语言

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

void init() {     int a[N]={0},i,j,sq=(int)sqrt(N)+1;     for(i=0;i<sq;i++)     {         if(a[i]==0)         {             j=2;             while(i*j<N)  a[j++*i]=1;         }     }     for(j=0,i=2;i<N;i++)     {         if(a[i]==0)            prime[j++]=i;     } } 函数中第一个for循环出现问题了，应该是死循环了，所以你在函数后面调用的scanf就没有作用了

#include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <math.h>  int N = 200; int prime[200]; int Isprime(int n) { 	for(int i=2;i<=sqrt(N*1.0);i++) 	{ 		if(n%i==0)  return 0; 	} 	return 1; }  void init() { 	int a[200]; 	ZeroMemory(a,_countof(a)); 	 	int sq=(int)sqrt(N*1.0); 	int i,j=0; 	for(i=0;i<sq+1;i++) 	{ 		if(a[i]==0) 		{ 			j=2; 			 			while(i*j<N)   				a[j++*i]=1; 		} 	} 	for(j=0,i=2;i<N;i++) 	{ 		if(a[i]==0) 			prime[j++]=i; 	} }  void solve() { 	int a,i,count=0; 	scanf("%d",&a); 	if(Isprime(a)) 	{ 		printf("(%d,1)\n",a); 	} 	else 	{ 		for(i=2;i<(sqrt(N*1.0)+1);i++) 		{ 			if(a%i==0) 			{ 				while(a%i==0) 				{ 					count++; 				} 				printf("(%d,%d)",i,count); 			} 		} 	} }   int Isprime(int n); void solve(); void init();   int main() {  	int T,t;  	init(); 	scanf("%d\n",&T); 	for (t=0;t<T;t++) 	{ 		printf("case #%d:\n",t); 		solve(); 	} 	return 0; }  我只是让你能调试成功，while(i*j<N)  a[j++*i]=1;数组肯定会越界的，你在好好看看吧


Question: 栈怎么实现图的深度优先遍历的非递归算法

先自己百度谷歌一下 不至于这点东西网上都没有！


C99以上才支持可变长度数组的定义吧。

引用 楼主 qq1282456555 的回复:strnlen_s函数返回的值算是是什么。不可以当变量用吗strnlen_s返回的数值能用于定义数组维数吗  char a[1 + strnlen_s(a,sizeof(a)) + 1 ];  书上这么写的 但是我打出来是错误的

引用 3 楼 modyaj 的回复:返回值是右值  不能作为变量使用

返回的是字符长的长度值，可以迭代使用，不能作为左值。  引用 楼主 qq1282456555 的回复:strnlen_s函数返回的值算是是什么。不可以当变量用吗

返回值是右值  不能作为变量使用

返回值当变量使用？strlen_s(xxxxx) = n?这样吗？

size_t __cdecl strnlen(const char *str, size_t maxsize) {     size_t n;      /* Note that we do not check if s == NULL, because we do not      * return errno_t...      */      for (n = 0; n < maxsize && *str; n++, str++)         ;      return n; }  返回的是字符串的长度（不超过指定最大值，超过，则返回指定值），可以像strlen一样在语句中使用 如 int i = xxx(strnlen_s(strxxx, 512)); xxx函数返回一个int值


Question: 51单片机子函数直接调用数组需要多少个机械周期

uint 不是C51数据类型，这要看你如何定义uint 这和数据长度，数据所在区域有关， 外部RAM， 包括芯片内部的XRAM，需要 通过DPTR读写 指令执行时间比较长 Data 区域的。可以用 R0，R1两个指针读写，执行时间比较短

看转换成的汇编指令，根据汇编指令来算周期


Question: 字符常量使用的作用域问题。

我的理解，你想通过setstring的形参作用域传递地址值，并且你的指针常量定义的作用域在代码块内，这样它的存储类型是自动变量，会随着作用域消失的。 总结： 1，你没有返回值，函数的形参作用域，随代码块执行后没有了。所以你不能把你定义的常量返回给变量ButtonText 。 2，你的常量定义的存储类型是自动变量。setstring函数执行后会被其他值覆盖。  你可以把程序改成这样就可以，打印出“1234”的字符串了。 代码： #include<stdio.h> #include<stdlib.h> char* setstring(char *Text);   int main(){          char* ButtonText;     ButtonText = setstring(ButtonText);         printf(ButtonText);          system("pause");     return EXIT_SUCCESS;     }      char* setstring(char *text) {  static char tmptext[]="1234";   //用static 改变变量的存储类型为静态的     text = tmptext;     return text; }

用** tmptexT

当然会消失，tmptext是局部变量，函数调用结束后就释放了。

tmptext是局部变量，所谓局部变量就是该变量只作用在它最内层的大括号，出了距离其最近的大括号则变量被释放。在这里，出了函数setstring后，tmptext即被释放，所以text将指向一个野指针

setstring(char *)中的tmptext改为：char  *tmptext="1234”。就可以了。数组在该函数中是局部变量，不能正确返回。

1.你的setstring函数传进去的是char* ButtonText这个变量的值，而不是地址。 2. tmptext数组是指向常量的指针。text = tmptext;你是想将tmptext的地址赋给text，这是不行的，text是局部变量，退出setstring函数后主函数的text并没有改变   建议你看看《c和指针》 在这里发帖倒不如用这些时间去看看书

另外，多线程的话，会错得一塌糊涂。

这个其实就是测不准原理的，人择原理在起作用了。 不是得不到，而是得到一个不可用的数据。 不使用，数据是1234没错 用了，可能就不是1234了。  使用的过程，改变了被使用的数据，这个改变过程，不是你能够控制的。

1）1234 不会马上消失，但是会胡乱变化，不是你想要的。。 不是函数退出就会消失，而是当你使用的时候，非常可能，得不到1234。 2）这种写法是错误的，没有达到set的目的，和函数名不符，会造成逻辑混乱。 程序写的是逻辑，所以函数名要有意义，并且要名副其实。 PS： 这么做就够了 char* setstring(char *text, int n) {      return strncpy(text, "1234",min(n,4));//<==>strncpy(text, "1234",min(n,4));return text; } //或者 char* setstring(char *text) {     return strncpy(text, "1234",4);//其实可以strncpy(text, "1234");的，不过处于代码安全考虑，改用strncpy  }


Question: C语言学了刚好想写个俄罗斯方块练练手，没想到出问题了

//接上帖 /*  *显示指定的方块  */ void show_box(int x,int y,int box_numb,int color) {     int i,ii,ls_x=x;     if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/         box_numb=MAX_BOX/2;     setfillstyle(SOLID_FILL,color); /*********************************  *   移位来判断第哪一位是1  *   方块是每1行用半个字节来表示  *   128d=1000 0000b  *********************************/     for(ii=0;ii<2;ii++)     {         int mask=128;         for(i=0;i<8;i++)         {             if(i%4==0 && i!=0)              /*表示转到方块的下一行了*/             {                 y+=BSIZE;                 x=ls_x;             }                        if((shapes[box_numb].box[ii])&mask)             {                 bar(x,y,x+BSIZE,y+BSIZE);                 line(x,y,x+BSIZE,y);                 line(x,y,x,y+BSIZE);                 line(x,y+BSIZE,x+BSIZE,y+BSIZE);                 line(x+BSIZE,y,x+BSIZE,y+BSIZE);             }             x+=BSIZE;             mask/=2;         }         y+=BSIZE;         x=ls_x;     } }   void main() {     int GameOver=0;     int key,nextbox;     int Currentaction=0;/*标记当前动作状态*/     int gd=VGA,gm=VGAHI,errorcode;      initgraph(&gd,&gm,"D:\\BC\\BGI");     errorcode = graphresult();     if (errorcode != grOk)     {         printf("\nNotice:Graphics error: %s\n", grapherrormsg(errorcode));         printf("Press any key to quit!");         getchar();         exit(1);     }     setbkcolor(BgColor);     setcolor(FgColor);     randomize();    //初始化随机数生成器     SetTimer(newtimer);      initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*初始化*/       nextbox=MkNextBox(-1);      show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);     show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color);     show_intro(Sys_x,Curbox_y+320);     getchar();  //按任意键开始游戏     while(1)     {         /* Currentaction=0;         flag_newbox=false;         检测是否有按键*/         if (bioskey(1)){key=bioskey(0);     }         else            {           key=0;      }          switch(key)         {             case VK_LEFT:                 if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft))                 {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=MoveLeft;}                 break;             case VK_RIGHT:                 if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight))                 {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=MoveRight;}                 break;             case VK_DOWN:                 if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))                 {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown;}                 else flag_newbox=true;                 break;             case VK_UP:/*旋转方块*/                 if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll))                 {EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].next;                     Currentaction=MoveRoll;                 }                 break;              case VK_ESC:                 GameOver=1;                 break;             default:                 break;         }          if(Currentaction)         {   /*表示当前有动作,移动或转动*/             show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);             Currentaction=0;         }              /*按了往下键，但不能下移,就产生新方块*/         if(flag_newbox)         {             /*这时相当于方块到底部了,把其中出现点满一行的清去，置0*/             ErasePreBox(LeftWin_x,Sys_y+200,nextbox);             nextbox=MkNextBox(nextbox);             show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color);             if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))/*刚一开始,游戏结束*/             {                 show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);                 GameOver=1;             }             else             {                 flag_newbox=false;             }             Currentaction=0;         }         else    /*自由下落*/         {             if (Currentaction==MoveDown || TimerCounter> (20-speed*2))             {                 if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))                 {                     EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;                     show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);                 }                 TimerCounter=0;             }         }          if(GameOver )/*|| flag_newbox==-1*/         {             printf("game over,thank you! your score is %d",score);             getchar();             break;         }     }     getchar();  //按任意键退出界面     KillTimer();     closegraph(); }

//接上帖 /*   删除一行满的情况  *   这里的y为具体哪一行为满  */ int DelFullRow(int y) {     /*该行游戏板往下移一行*/     int n,top=0;                /*top保存的是当前最高点,出现一行全空就表示为最点了,移动是到最高点结束*/     register m,totoal;     for(n=y;n>=0;n--)/*从当前行往上看*/     {         totoal=0;         for(m=0;m<Horizontal_boxs;m++)         {             if(!Table_board[n][m].var)totoal++;             /*没占有方格+1*/             if(Table_board[n][m].var!=Table_board[n-1][m].var)  /*上行不等于下行就把上行传给下行 xor关系*/             {                 Table_board[n][m].var=Table_board[n-1][m].var;                 Table_board[n][m].color=Table_board[n-1][m].color;             }         }         if(totoal==Horizontal_boxs)                     /*发现上面有连续的空行提前结束*/         {             top=n;             break;         }     }     return(top);                /*返回最高点*/ }   /*找到一行满的情况*/ void setFullRow(int t_boardy) {     int n,full_numb=0,top=0;            /*top保存的是当前方块的最高点*/     register m; /* t_boardy 口       5          口       6    口口口口口口   7 n  口口口口口口   8  */     for(n=t_boardy+3;n>=t_boardy;n--)     {         if(n<0 || n>=Vertical_boxs ){continue;} /*超过低线了*/         for(m=0;m<Horizontal_boxs;m++)          /*水平的方向*/         {             if(!Table_board[n+full_numb][m].var)break;      /*发现有一个是空就跳过该行*/         }         if(m==Horizontal_boxs)                  /*找到满行了*/         {             if(n==t_boardy+3)                   /*第一次献给了n,最高的*/                 top=DelFullRow(n+full_numb);        /*清除游戏板里的该行,并下移数据*/             else                 DelFullRow(n+full_numb);             full_numb++;                        /*统计找到的行数*/          }     }     if(full_numb)     {         int oldx,x=Sys_x,y=BSIZE*top+Sys_y;         oldx=x;         score=score+full_numb*10;              /*加分数*/         /*这里相当于重显调色板*/         for(n=top;n<t_boardy+4;n++)         {             if(n>=Vertical_boxs)continue;   /*超过低线了*/             for(m=0;m<Horizontal_boxs;m++)  /*水平的方向*/             {                 if(Table_board[n][m].var)                     setfillstyle(SOLID_FILL,Table_board[n][m].color);/*Table_board[n][m].color*/                 else                     setfillstyle(SOLID_FILL,BgColor);                  bar(x,y,x+BSIZE,y+BSIZE);                 line(x,y,x+BSIZE,y);                 line(x,y,x,y+BSIZE);                 line(x,y+BSIZE,x+BSIZE,y+BSIZE);                 line(x+BSIZE,y,x+BSIZE,y+BSIZE);                 x+=BSIZE;             }             y+=BSIZE;             x=oldx;         }         ShowScore(score);         if(speed!=score/speed_step)           {speed=score/speed_step; ShowLevel(speed);}         else           {ShowLevel(speed);}     } }   /*  * 将新形状的方块放置在游戏板上，并返回此方块号  */ int MkNextBox(int box_numb) {      int mask=128,t_boardx,t_boardy,n,m;     t_boardx=(Curbox_x-Sys_x)/BSIZE;     t_boardy=(Curbox_y-Sys_y)/BSIZE;     for(n=0;n<4;n++)     {         for(m=0;m<4;m++)         {             if( ((shapes[current_box_numb].box[n/2]) & mask) )             {                 Table_board[t_boardy+n][t_boardx+m].var=1;/*这里设置游戏板*/                 Table_board[t_boardy+n][t_boardx+m].color=shapes[current_box_numb].color;/*这里设置游戏板*/             }             mask=mask/(2);             if(mask==0)mask=128;         }     }     setFullRow(t_boardy);     Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/*再次初始化座标*/     if(box_numb==-1) box_numb=rand()%MAX_BOX;     current_box_numb=box_numb;     flag_newbox=false;     return(rand()%MAX_BOX); }  /*  *  擦除(x,y)位置开始的编号为box_numb的box.  */ void EraseBox(int x,int y,int box_numb) {     int mask=128,t_boardx,t_boardy,n,m;     setfillstyle(SOLID_FILL,BgColor);     for(n=0;n<4;n++)     {         for(m=0;m<4;m++)    /*看最左边四个单元*/         {             if( ((shapes[box_numb].box[n/2]) & mask) )/*最左边有方块并且当前游戏板也有方块*/             {                 bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);                 line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE);                 line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE,y+n*BSIZE+BSIZE);                 line(x+m*BSIZE,y+n*BSIZE+BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);                 line(x+m*BSIZE+BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);             }             mask=mask/(2);             if(mask==0)mask=128;         }     }  }     void ErasePreBox(int x,int y,int box_numb) {     int mask=128,t_boardx,t_boardy,n,m;     setfillstyle(SOLID_FILL,BgColor);     for(n=0;n<4;n++)     {         for(m=0;m<4;m++)    /*看最左边四个单元*/         {             if( ((shapes[box_numb].box[n/2]) & mask) )/*最左边有方块并且当前游戏板也有方块*/             {                 bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);              }             mask=mask/(2);             if(mask==0)mask=128;         }     }  }  /* 判断是否可以移动  * x,y为当前方块位置  * box_numb为方块号  * direction 方向标志  *  返回true 和false  #define MoveLeft -1  #define MoveRight 1  #define MoveDown 0  */ int MoveAble(int x,int y,int box_numb,int direction) {     int n,m,t_boardx,t_boardy;          /*t_boardx 当前方块最左边在游戏板的位置*/     int mask = 128;     if(direction==MoveLeft)             /*如果向左移*/     {         //mask=128;         x-=BSIZE;         t_boardx=(x-Sys_x)/BSIZE;         t_boardy=(y-Sys_y)/BSIZE;         for(n=0;n<4;n++)         {             for(m=0;m<4;m++)    /*看最左边四个单元*/             {                 if((shapes[box_numb].box[n/2]) & mask)/*最左边有方块并且当前游戏板也有方块*/                 {                     if((x+BSIZE*m)<Sys_x)return(false);/*碰到最左边了*/                     else if(Table_board[t_boardy+n][t_boardx+m].var) /*左移一个方块后，此4*4的区域与游戏板有冲突*/                     {                         return(false);                     }                 }                 mask=mask/(2);                 if(mask==0)mask=128;             }         }         return(true);     }     else if(direction==MoveRight)       /*如果向右移*/     {         x+=BSIZE;         t_boardx=(x-Sys_x)/BSIZE;         t_boardy=(y-Sys_y)/BSIZE;         //mask=128;         for(n=0;n<4;n++)         {             for(m=0;m<4;m++)    /*看最右边四个单元*/             {                 if((shapes[box_numb].box[n/2]) & mask)/*最右边有方块并且当前游戏板也有方块*/                 {                     if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/                     else if( Table_board[t_boardy+n][t_boardx+m].var)                     {                         return(false);                     }                 }                 mask=mask/(2);                 if(mask==0)mask=128;             }         }         return(true);     }     else if(direction==MoveDown)        /*如果向下移*/     {         y+=BSIZE;         t_boardx=(x-Sys_x)/BSIZE;         t_boardy=(y-Sys_y)/BSIZE;         //mask=128;         for(n=0;n<4;n++)         {             for(m=0;m<4;m++)    /*看最下边四个单元*/             {                 if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/                 {                     if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) ||  Table_board[t_boardy+n][t_boardx+m].var)                     {                         flag_newbox=true;                         break;                     }                 }                 mask=mask/(2);                 /*mask依次为:10000000,01000000,00100000,00010000                              00001000,00000100,00000010/00000001                  */                 if(mask==0)mask=128;             }         }         if(flag_newbox)         {             return(false);         }         else             return(true);     }     else if(direction==MoveRoll)        /*转动*/     {         t_boardx=(x-Sys_x)/BSIZE;         t_boardy=(y-Sys_y)/BSIZE;         //mask=128;         for(n=0;n<4;n++)         {             for(m=0;m<4;m++)    /*看最下边四个单元*/             {                 if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/                 {                     if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) )return(false);/*碰到最下边了*/                     if((x+BSIZE*n)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最左边了*/                     if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/                      else if( Table_board[t_boardy+n][t_boardx+m].var)                     {                         return(false);                     }                 }                 mask=mask/(2);                 if(mask==0)mask=128;             }         }         return(true);     }     else     {         return(false);     }  } //未完待续

/*  *俄罗斯方块源程序  */ #include <stdio.h> #include <stdlib.h> #include <dos.h> #include <graphics.h> #include <bios.h>  #ifdef __cplusplus     #define __CPPARGS ... #else     #define __CPPARGS #endif  /*定义按键码*/ #define VK_LEFT  0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN  0x5000 #define VK_UP    0x4800 #define VK_ESC   0x011b  /*设置中断号*/ #define TIMER 0x1c  /*定义常量*/ #define MAX_BOX 19          /*总共有19种各形态的方块*/ #define BSIZE 20            /*方块的边长是20个象素*/ #define Sys_x 160           /*显示方块界面的左上角x座标*/ #define Sys_y 25            /*显示方块界面的左上角y座标*/ #define Horizontal_boxs 10  /*水平的方向以方块为单位的长度*/ #define Vertical_boxs 15    /*垂直的方向以方块为单位的长度,也就说长是15个方块*/ #define Begin_boxs_x Horizontal_boxs/2  /*产生第一个方块时出现的起始位置*/  #define FgColor CYAN    //前景色 #define BgColor BLACK   //背景颜色  #define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46        /*右边状态栏的x座标*/  #define false 0 #define true 1  /*移动的方向*/ #define MoveLeft 1 #define MoveRight 2 #define MoveDown 3 #define MoveRoll 4  /*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/ /*定义全局变量*/ int current_box_numb;   /*保存当前方块编号*/ int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/*x,y是保存方块的当前坐标的*/ int flag_newbox=false;  /*是否要产生新方块的标记0*/ int speed=0;            /*下落速度*/ int score=0;            /*总分*/ int speed_step=30;       /*每等级所需要分数*/ void interrupt (*oldtimer)(__CPPARGS);/* 指向原来时钟中断处理过程入口的中断处理函数指针 */  struct BOARD            /*游戏底板结构,表示每个点所具有的属性*/ {     int var;            /*当前状态 只有0和1,1表示此点已被占用*/     int color;          /*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/ }Table_board[Vertical_boxs][Horizontal_boxs];  /*方块结构*/ struct SHAPE {     char box[2];            /*一个字节等于8位,每4位来表示一个方块的一行                               如:box[0]="0x88",box[1]="0xc0"表示的是:                               1000                               1000                               1100                               0000*/     int color;              /*每个方块的颜色*/     int next;               /*下个方块的编号*/ };   /*初始化方块内容.即定义MAX_BOX个SHAPE类型的结构数组，并初始化*/ struct SHAPE shapes[MAX_BOX]= { /*  *   口     口口口   口口      口  *   口     口         口  口口口  *   口口              口  */     {0x88,  0xc0,   CYAN,   1},     {0xe8,  0x0,    CYAN,   2},     {0xc4,  0x40,   CYAN,   3},     {0x2e,  0x0,    CYAN,   0},  /*  *   口        口口 口口口  *   口 口     口       口  * 口口 口口口 口  */     {0x44,  0xc0,   MAGENTA,  5},     {0x8e,  0x0,    MAGENTA,  6},     {0xc8,  0x80,   MAGENTA,  7},     {0xe2,  0x0,    MAGENTA,  4},  /*  *   口  *   口口         口口  *     口       口口  */     {0x8c,  0x40,   YELLOW, 9},     {0x6c,  0x0,    YELLOW, 8},  /*  *   口        口口  * 口口          口口  * 口  */     {0x4c,  0x80,   BROWN,  11},     {0xc6,  0x0,    BROWN,  10},  /*  *   口       口                口  * 口口口     口口   口口口   口口  *            口       口       口  */     {0x4e,  0x0,    WHITE,  13},     {0x8c,  0x80,   WHITE,  14},     {0xe4,  0x0,    WHITE,  15},     {0x4c,  0x40,   WHITE,  12},  /* 口  * 口  * 口       口口口口  * 口  */     {0x88,  0x88,   RED,    17},     {0xf0,  0x0,    RED,    16},  /*  * 口口  * 口口  */     {0xcc,  0x0,    BLUE,   18} };   unsigned int TimerCounter=0;  /*定时计数器变量*/  /* 新的时钟中断处理函数 */ void interrupt newtimer(__CPPARGS) {     (*oldtimer)();   /* call the old routine */     TimerCounter++;/* increase the global counter */ }  //时钟中断处理 void SetTimer(void interrupt(*IntProc)(__CPPARGS)) {     oldtimer=getvect(TIMER);    //获取中断号为TIMER的中断处理函数的入口地址     disable();  //关中断,以屏蔽其他中断     setvect(TIMER,IntProc); //设置中断向量，调用中断处理函数     enable();  //开中断，以响应其他中断 }   /* 恢复原有的时钟中断处理过程 */ void KillTimer() {     disable();     setvect(TIMER,oldtimer);     enable(); }   //显示帮助信息 void show_intro(int xs,int ys) {  char stemp[50];  setcolor (WHITE);  //设置边框为白色  rectangle(xs,ys,xs+239,ys+100);  sprintf(stemp," -Roll  -Downwards");  stemp[0]=24;   //↑  stemp[8]=25;  //↓  setcolor(YELLOW);  //设置文本颜色为黄色  outtextxy(xs+40,ys+30,stemp);   sprintf(stemp," -Turn Left   -Turn Right");  stemp[0]=27;   //←  stemp[13]=26;  //→   outtextxy(xs+40,ys+45,stemp);  outtextxy(xs+40,ys+60,"Esc-Exit ");  setcolor(FgColor); }  //显示分数 void ShowScore(int score) {     int x,y;     char score_str[5];/*保存游戏得分*/     setfillstyle(SOLID_FILL,BgColor);     x=LeftWin_x;     y=100;     bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);     sprintf(score_str,"%3d",score);     outtextxy(x,y,"SCORE");     outtextxy(x,y+10,score_str); }  //显示级别 void ShowLevel(int speed) {     int x,y;     char speed_str[5];/*保存速度值*/     setfillstyle(SOLID_FILL,BgColor);     x=LeftWin_x;     y=150;     bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);     /*确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口, 再按规定图模和颜色填充。*/     sprintf(speed_str,"%3d",speed+1);     outtextxy(x,y,"Level");     outtextxy(x,y+10,speed_str);     /*输出字符串指针speed_str所指的文本在规定的(x, y)位置*/     outtextxy(x,y+50,"Nextbox"); }   /**********初始化界面*******  *参数说明:  *      x,y为左上角坐标  *      m,n对应于Vertical_boxs,Horizontal_boxs  *      分别表示纵横方向上方块的个数(以方块为单位)  *      BSIZE Sys_x Sys_y  **********************************/ void initialize(int x,int y,int m,int n) {      int i,j,oldx;     oldx=x;     for(j=0;j<n;j++)     {         for(i=0;i<m;i++)         {              Table_board[j][i].var=0;             Table_board[j][i].color=BgColor;             line(x,y,x+BSIZE,y);             line(x,y,x,y+BSIZE);             line(x,y+BSIZE,x+BSIZE,y+BSIZE);             line(x+BSIZE,y,x+BSIZE,y+BSIZE);             x+=BSIZE;         }         y+=BSIZE;         x=oldx;     }     Curbox_x=x;     Curbox_y=y;/*x,y是保存方块的当前坐标的*/     flag_newbox=false;  /*是否要产生新方块的标记0*/     speed=0;            /*下落速度*/     score=0;            /*总分*/     ShowScore(score);     ShowLevel(speed);  } //未完待续

引用 5 楼 chenxue0821 的回复:你free(p)以后  还怎么进行p=p->pre  完全正确

引用 4 楼 dragon1118 的回复:1. 双向链表为全局变量，那么是否有多个线程同时对该链表做操作，如果有请加锁。 2. 代码中：  for ( p = end->pre;; p = p->pre)     {        /* 使用指针前，至少要判断是是否为空，如果不能接受空指针，则需要打出断言，否则进行容错处理 */         if (n==p->y)                                       //问题就出在这，p居然没有地址         {             p->pre->next = p->next;             p->next->pre = p->pre;            //删除节点             free(p);             c++;         }         if (10==c)             break;     }  恩恩，好的，谢谢你哦

引用 5 楼 chenxue0821 的回复:你free(p)以后  还怎么进行p=p->pre 厉害诶，我怎么没注意这个0.0，对诶，但是要删掉看来我要找其他的方法咯，3Q啦

引用 6 楼 xmlored 的回复:不会，但是推荐你去VC/MFC区去问问发错地方了，不好意思

不会，但是推荐你去VC/MFC区去问问

你free(p)以后  还怎么进行p=p->pre

引用 2 楼 dayang1017 的回复:node * p定义完指针后并没有初始化也没有赋值，它是一个野指针，自然不存在p->这种操作。最起码要p=new node吧？   额，不好意思哦，这个这样我也试过，是不行的，会和我发的代码一样的bug，没有地址，直接退

回复11-13楼，呵呵，你真的辛苦了~~TC的？话说，我真的只是想自己写一个俄罗斯方块~~~


Question: 关于被调函数里面 的main（）函数问题

不是说被调函数里不能调用main（）主函数吗？

# include<stdio.h>  int i = 0;  int main(void) { 	printf("天气不错!\n"); 	i++; 	if(i<5) 		main();  	return 0; }   main函数可以递归调用，但一般没什么必要

C语言的 main 除了作为程序入口之外 没什么特殊的 可以随意调用 没有不能调用的说法  而调用main 的确可能会造成递归 要理清思路 准备好出口

引用 2 楼 weeplonly 的回复:不是的这处的main（）是什么意思啊？在被调函数里这么用？我没见过？运行没错 虽说main不是关键字什么的，但起码写个函数也不应该把名字起作main啊。这里没什么意思，能正确运行已经很意外了。

main函数里怎么写？

学习了！！！！

不是的这处的main（）是什么意思啊？在被调函数里这么用？我没见过？运行没错

main又不是让你调用的，找本基础书好好看吧。

main函数体位于程序代码末尾，无返回值，主要控制程序执行顺序，根据用户输入数值，并赋值给n，后面的跳转语句通过n的值决定执行哪个函数；main函数为程序入口函数，程序中必须存在的，否则编译器不知道从何处开始执行代码；而且main函数与自定义函数无区别，可以在自定义函数中调用，像之前几位说的，注意递归

帮我看一下这个程序告诉我main（）是干嘛的？ #include<stdio.h> #include<stdlib.h> #include <string.h>  struct course { 	int num; 	char name[20]; 	char kind[10]; 	int time; 	int ttime; 	int etime; 	int mark; 	int term; }; struct student { 	int snum; 	int cnum; 	char cname[20]; };   /*课程信息录入*/ void insert() { 	void main(); 	FILE *fp; 	struct course c; 	int count; 	int i; 	if((fp=fopen("course.txt","a+"))==NULL) 	{ 		printf("cannot open file\n"); 	} 	printf("\n请输入课程门数:\n"); 	scanf("%d",&count); 	printf("课程编号  课程名称  课程性质  总学时  授课学时  实验或上机学时  学分  开课学期:\n"); 	for(i=0;i<count;i++) 	{     	scanf("%d %s %s %d %d %d %d %d",&c.num,&c.name,&c.kind,&c.time,&c.ttime,&c.etime,&c.mark,&c.term);     	fprintf(fp,"%d %s %s %d %d %d %d %d\n",c.num,c.name,c.kind,c.time,c.ttime,c.etime,c.mark,c.term); 	} 	fclose(fp); 	main(); }  /*课程信息浏览*/ void browser() { 	void main(); 	FILE *fp; 	struct course c; 	int a; 	if((fp=fopen("course.txt","r"))==NULL) 	{ 		printf("\nCannot open course!\n"); 	} 	printf("课程编号  课程名称  课程性质  总学时  授课学时  实验或上机学时  学分  开课学期:\n"); 	for(;!feof(fp);) 	{ 		fscanf(fp,"%d %s %s %d %d %d %d %d\n",&c.num,&c.name,&c.kind,&c.time,&c.ttime,&c.etime,&c.mark,&c.term); 		printf("%5d%12s%9s%9d%9d%11d%11d%11d\n",c.num,c.name,c.kind,c.time,c.ttime,c.etime,c.mark,c.term); 	} 	fclose(fp); 	printf("\n1-返回主菜单；2-退出选课系统\n"); 	scanf("%d",&a); 	if(a==1)     	main(); 	else 		exit(0); }  /*课程信息查询*/ void search() { 	void main(); 	FILE *fp; 	struct course c; 	int score; 	char kind[10]; 	int a; 	int b; 	printf("1.按学分查询,2.按课程性质查询.\n"); 	printf("请选择查询方式，输入选项数字："); 	scanf("%d",&b); 	if(b==1) 	{     	printf("\n请输入您要查询的学分:\n");     	scanf("%d",&score);      	if((fp=fopen("course.txt","r"))==NULL) 		{     		printf("\nCannot open course!\n"); 		}     	printf("课程编号  课程名称  课程性质  总学时  授课学时  实验或上机学时  学分  开课学期:\n");     	for(;!feof(fp);) 		{     	fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.time,&c.ttime,&c.etime,&c.mark,&c.term);     		if(c.mark==score) 		printf("%5d%12s%9s%9d%9d%11d%11d%11d\n",c.num,c.name,c.kind,c.time,c.ttime,c.etime,c.mark,c.term); 		} 	} 	else if(b==2){ 		printf("\n请输入您要查询的课程性质:\n");     	scanf("%s",&kind);      	if((fp=fopen("course.txt","r"))==NULL) 		{     		printf("\nCannot open course!\n"); 		}     	printf("课程编号  课程名称  课程性质  总学时  授课学时  实验或上机学时  学分 开课学期:\n");     	for(;!feof(fp);) 		{ 	fscanf(fp,"%d%s%s%d%d%d%d%d\n",&c.num,&c.name,&c.kind,&c.time,&c.ttime,&c.etime,&c.mark,&c.term); 		if(strcmp(c.kind,kind)==0) 		printf("%5d%12s%9s%9d%9d%11d%11d%11d\n",c.num,c.name,c.kind,c.time,c.ttime,c.etime,c.mark,c.term); 		} 	} 	else{ 		printf("输入错误！"); 		exit(1); 	} 	fclose(fp); 	printf("\n1-返回主菜单；2-退出选课系统\n"); 	scanf("%d",&a); 	if(a==1)     	main(); 	else 		exit(0); }  /*统计选课情况*/ void xuanke_information() { 	void main(); 	int total=0; 	int a; 	FILE *fp; 	struct student s; 	if((fp=fopen("student.txt","r"))==NULL) 	{ 		printf("\nCannot open student!\n"); 	} 	printf("   学号    课程编号    课程名称\n"); 	for(;!feof(fp);) 	{ 		fscanf(fp,"%d%d%s\n",&s.snum,&s.cnum,&s.cname); 			total++; 			printf("%7d%9d%13s\n",s.snum,s.cnum,s.cname); 	} 	printf("\n选课学生总人数为：%d 人",total); 	fclose(fp); 	printf("\n1-返回主菜单；2-退出选课系统\n"); 	scanf("%d",&a); 	if(a==1)     	main(); 	else 		exit(0); }  /*学生选修课程*/ void xuan_ke() { 	void main();     struct student s; 	struct course c; 	int a; 	FILE *fp; 	printf("\n请输入您的学号及您要选择的课程编号:"); 	scanf("%d%d",&s.snum,&s.cnum); 	if((fp=fopen("course.txt","r"))==NULL) 	{ 		printf("\nCannot open course!\n"); 	} 	for(;!feof(fp);) 	{ 		fscanf(fp,"%d %s %s %d %d %d %d %d\n",&c.num,&c.name,&c.kind,&c.time,&c.ttime,&c.etime,&c.mark,&c.term); 		if(s.cnum==c.num) 			break; 	} 	fclose(fp); 	if((fp=fopen("student.txt","a+"))==NULL) 	{ 		printf("\nCannot open student!\n"); 	} 	fprintf(fp,"%d %d %s\n",s.snum,s.cnum,c.name); 	fclose(fp); 	printf("\n1-返回主菜单；2-退出选课系统\n"); 	scanf("%d",&a); 	if(a==1)     	main(); 	else 		exit(0); }  /*主菜单*/ void main() { 	int n,w=0; 	printf("********************************************************************************\n"); 	printf("                                学生选课系统菜单                                \n"); 	printf("********************************************************************************\n"); 	printf("                                1-录入选课信息                                  \n"); 	printf("                                2-浏览选课信息                                  \n"); 	printf("                                3-查询选课信息                                  \n"); 	printf("                                4-统计选课情况                                  \n"); 	printf("                                5-进入选课操作                                  \n"); 	printf("                                0-退出选课系统                                  \n"); 	printf("********************************************************************************\n"); 	printf("                     请选择输入选择的功能:"); 	scanf("%d",&n);  	do 	{ 		if(n>5||n<0) 		{ 			printf("\n输入错误！请重新输入！\n"); 			scanf("%d",&n); 		} 		else w=1; 	}while(w==0);  	switch(n) 	{ 	case 1:insert();break; 	case 2:browser();break; 	case 3:search();break; 	case 4:xuanke_information();break; 	case 5:xuan_ke();break; 	case 0:exit(0); 	}  }

递归调用main？？还是别这样比较好


Question: 串口发送指令的问题

这种写法很有问题，应该改为用环形缓冲区结构来维护串口数据的接收，数据包的处理应该放到中断外面去。


Question: c语言的编译器

最新的gcc或者VC。

gcc

装个虚拟机用 gcc

我的资源例有这个完整绿色版

引用 4 楼 lqj529 的回复:谢谢！是吗？我这里提示vc++6.0不兼容的喔 我的是完整绿色版，你可以试试吧可执行文件MSDEV.EXE稍微改一下名字试试（如果你还想继续用这个），不过不推荐使用这个，太老了，许多新的标准都不支持

谢谢！是吗？我这里提示vc++6.0不兼容的喔

QT，虚拟机

VC6.0可以的，我现在win8.1还装着VC6.0呢！不过不怎么用了，可以使用C-Free，这儿有地址——http://download.csdn.net/detail/u012421456/7374337，也可以装过VS。建议2010及以上版本

威力强大的大型装备，可以选VS2013，微软官网上找，而且强力推荐 如果是Linux下工作，选择gcc吧


Question: 求助！！！！

ACM的题目吧

有没什么比较不容易考虑到的特殊情况？

我觉得应该是贪心算法


Question: 数据结构程序设计马上要答辩，很着急，求大神帮忙啊55555

如果自己写了代码没？如果没有，以后想干什么？

参考Linux下sed awk grep的源代码。

这么问一般不会有人直接回答的， 可以看这个搜索，然后把前边两个结合一下——http://www.baidu.com/s?ie=utf-8&bs=文本查找与替换工具&f=8&rsv_bp=1&wd=数据结构程序设计文本查找与替换工具&rsv_sug3=16&rsv_sug4=3313&rsv_sug2=0&inputT=8392


Question: 解一元三次方程遇到问题！

就是调试有误


Question: 驱动卸载蓝屏，符号链接读取出错

引用 1 楼 user-1 的回复:最好把其他部分放出来， 这些代码看不出问题。 或者你简化一下， 自己测试看看是那块的问题 其他地方都没有调用到的样子。。我就是加载、卸载。他就不行。


Question: 请前辈指点，为什么老是编译错误？

不好意思，我没学过，不知道是C语言还是C#，感谢您的回复，我去试一下，可行的话，回来给分，谢谢

你的程序在vs2013上面是编译成功的！ 还有，你的问题是C#语言，应该发在.NET技术区的C#板块。

我已经搞定了，感谢 Falleyes 的回答

我装了VS2010编译还是失败啊 用了SharpDevelop也是编译失败

哪位可以加我QQ帮我处理一下啊？处理好马上送分啊,谢谢啦 29010889

这段 C# 代码没什么问题啊 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;  namespace Lrc_Trimer {     class Program     {         static void Main(string[] args)         {             Console.WriteLine("---------\n本程序可以将*.lrc中的时间标签去除，并批量装换为*.txt\nDidier制作\n----------\n任意键继续");             Console.ReadKey();             //一些提示语句             FileStream Read = null;             FileStream Write = null;             bool ok = false ;             int x = 0;             //定义一些变量和类             string[] filenames = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.lrc");             if (filenames == null)                  return;             //以字符串数组的形式获取所有lrc文件名，要是没有就直接退出             foreach (string i in filenames)             //用foreach语句对每个文件进行处理             {                    Read = File.Open(i, FileMode.Open);                 Write = File.Open (i.Replace("lrc","txt"),FileMode.OpenOrCreate );                 //创建.txt，并初始化读写流                while (x > -1)                //"粗略"判断是否读到了结尾                {                     x = Read.ReadByte();                     //读一个字节                     switch (x)                      {                         case 91:                             ok = false;                             //读到“[”，意味着时间标志开始，关闭bool值ok。隐含着跳过这个字节                             break;                         case 93:                             ok = true;                             //读到“]”，意味着时间标志结束，打开bool值ok。隐含着跳过这个字节                             break;                         default :                             if (ok == true & x != -1)                             {                                 Write.WriteByte(Convert.ToByte(x));                              }                             //通过写入bool值ok来判断是否要将字节转存到txt文件。是用x!=-1精确判断是否读到了末尾                             break;                     }                }                x = 0;                //重要！清除x=-1，否则会出乱子             }             //foreach这样的神句帮助我们遍历并处理所有lrc文件         }     } }


Question: 关于数组和if循环函数的一个小问题

谢谢你的帮助，很全面的解释了它，这个问题我也想到了，但是如果只是单个的这个程序，改成全局变量是简单的。如果说是在一个更大的程序，比如一个已经成型的管理系统里面，那么这个全局变量的定义是不是应该放在主函数的下面，这个函数的外面？

不是你说的    ”感觉要么是之前注册的用户名和密码根本没有存到数组里，那个比较没意义，要么就是判断的方式有问题。“      这种问题，而是你一些基础知识没有打扎实：   原因就在 你没有注意那些 char 变量的作用范围是哪里，char在xuanze（）这个函数内部定义的，也就是说他的变量的作用域是函数内部，详细解释一下：    在你选择了1后，写入用户名和密码后，它就将这些信息全部存入char这些数组变量中，然后会怎样，你又调用了xuanze()这个函数，相当于你在函数内部递归了xuanze()函数，同样它会在这个嵌套的xuanze()内部在定义一次char 数组这些变量，和外面那个xuanze（）函数定义的是同名char变量，这些都是局部变量，但是外层的char 数组已经在注册过程中已经赋值，但是嵌套的xuanze()函数内部重新定义的char 数组变量中用户名和密码根本就没赋值，相当于在嵌套xuanze()内部你只完成了登录过程，完成的是s1,s2登录过程中的赋值，然后他会将这些信息和在嵌套的xuanze()函数内部定义的yhmtmp和tmp1作比较，但是嵌套xuanze()函数的yhmtmp个tmp1根本没有赋值，肯定会用户名和密码不匹配的情况： 解决方法： 把那些局部变量char数组和 int全部定义为全局变量，放在函数外部定义，就能通过了，我试过了，能得到你要的结果。

要善于调试。

一般这样的变量可以现在xxxx.h头文件用extern  char   xxx[n]   先声明在头文件，然后需要在xxx.cpp中使用时，直接定义使用；


Question: 关于指针数组

引用 1 楼 user-2 的回复:if(strcmp(a[i],a[j])==1)             {                 temp=a[j];                 a[j]=a[i];             } 一针见血，我忘了   a[j]=a[i];把它换回去了

不是指针问题 是你排序算法问题 不难看出你想用冒泡排序吧#include <stdio.h> #include<stdlib.h> #include<string.h> void sort(char  *a[4],int n) {     int i,j,flag;     char * temp;     for(i=0;i<n-1;i++)     { 		temp=a[i]; 		flag=i;         for(j=i+1;j<n;j++)         {             if(strcmp(temp,a[j])>0)             {                 temp=a[j]; 				flag=j;             }                      } 		if(i!=flag) 		{ 			temp=a[i]; 			a[i]=a[flag]; 			a[flag]=temp; 		}     } }  int main() {     char * str[4]={"sfdsf","reef","erscsd","axad"};      sort(str,4);      int i;     for(i=0;i<4;i++)     {         printf("%s\n",str[i]);     } 	getchar(); 	getchar();     return 0; }


Question: none,一个简单的内核

楼主强大啊

弓虽丁页

求联系方式，新手求交流

赞个

弓虽丁页！

人才啊

必须顶一个


Question: 哪位大神能解释一下Kruskal最小生成树的输出 Find_Root这个函数？

并查集的查找操作。你这个代码里面不是有解释嘛。


Question: 本人大二，请前辈们给指条明路。

引用 23 楼 u012941377 的回复:引用 9 楼 ForestDB 的回复:都开了哪些课？开了C语言 数电 模电 数据结构 计算机组成原理 微机原理 离散数学 数电、模电，，，软件工程学这些。。。。。。 哪个方向好要根据你自身情况和你的兴趣爱好来判断，你觉得哪个好理解，学得好，就往哪个方向去钻研它。

引用 23 楼 u012941377 的回复:引用 9 楼 ForestDB 的回复:都开了哪些课？开了C语言 数电 模电 数据结构 计算机组成原理 微机原理 离散数学 都很基础也很重要的课。

引用 3 楼 u010486937 的回复:研究C语言以后可以开发Linux应用，嵌入式，操作系统内核 学习C++，windows编程，以后写游戏或者开发大型项目 学习win32汇编，搞破解，逆向工程 学习Java，搞各种安卓开发 web,数据库什么的，全在自己的个人兴趣了 还有，编程无所谓最好的方向，这个世界在不断的改变，做自己最感兴趣的东西就是了   说得漂亮！给赞！

首先对多个方向都需要了解一下，然后分析一下，根据自己的兴趣和爱好，以及对这个方向的认识。 其实，主要是楼主对各个方向都不很了解吧，才有如此的彷徨和不知所措吧。

引用 楼主 u012941377 的回复:我今年大二，专业是软件工程。 总感觉我们开的课程很多，我想往一个方向去钻研它，请前辈们帮忙指点下，那个方向比较好点，我不怕辛苦，不怕麻烦。+1

都是基础课，学学总是有好处的。关键是自己要多动手，多看书，课堂上那点东西只是引子。

都说的什么啊，大二不是泡妹子的时候么？学个毛的C++啊，完全是浪费青春

引用 3 楼 u010486937 的回复:研究C语言以后可以开发Linux应用，嵌入式，操作系统内核 学习C++，windows编程，以后写游戏或者开发大型项目 学习win32汇编，搞破解，逆向工程 学习Java，搞各种安卓开发 web,数据库什么的，全在自己的个人兴趣了 还有，编程无所谓最好的方向，这个世界在不断的改变，做自己最感兴趣的东西就是了冥币收入多些

引用 24 楼 u012941377 的回复:引用 16 楼 IT_dreamer1993 的回复:和lz一样也是大二，学的也是se，我们大三分方向，lz学校也应该分吧我们老师说不分的 那就看lz你对那一块感兴趣，是底层还是上层。。。

努力把基础知识学好，跟楼主一起努力！

引用 1 楼 shimachao 的回复:学好专业课，专业基础课。大二大三的课程都很有用。没有基础，以后想飞也飞不起来。  楼主说的很对，我深有体会

前期基础一定要打扎实，程序设计，算法数据结构、操作系统数据库、网络之类，以后无论干什么这些都是有帮助的

才大二的话我觉得应该多接触些东西，课虽然多，但是能了解的东西也就更多，大一大二是扩展知识面的时候，大二下就可以考虑选择一个方向了。学习应该是一个做“工”字的过程，先扩展知识面，然后专注一个方向深入学，最后再次扩展知识的时候会豁然开朗。选择的方向一定要是你感兴趣的，喜欢的。比如对底层比较感兴趣，可以着重C语言，数据结构，汇编，操作系统等计算机基础课程。喜欢做网页，做游戏，黑客，病毒？想到你觉得能用编程实现的让你觉得很有用的东西，关键是你要用你的技能实现什么东西。选定了就要坚持，一定要坚持，就算别人觉得没什么用，只要你有兴趣，就坚持下去

学长您好。  我感觉可以先 努力把C学好，最主要是就是C的指针，建议看看C和指针这本书 C++很变态的，没有3 5年我感觉学不好 数据结构，算法 弄明白就好 到时候开java就好了 然后自学下Linux&Unix C语言视频 看看郝斌老师的 Linux可以看鸟叔的私房菜。

和lz一样也是大二，学的也是se，我们大三分方向，lz学校也应该分吧

我建议你接触一下Linux。 初学者建议玩玩Ubuntu。 你可以先在虚拟机里装一个体验一下，但最好安装在实体机里。 分出个15G的磁盘来，足够了。

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  注意以上内容不含“软件工程”。

软件工程可以做管理和开发，看你能力和兴趣了


Question: 从键盘输入一个字符串，统计并输出字符串中字符、数字、和其他符号的个数，为什么数不出结果？求解决谢谢！！

char[N]，这样不对

输入字符数组构成的字符串，不用加取地址符也可以的

你的代码有2个问题： 1. main 函数里面，不是 scanf("%s",a) ，应该是 scanf("%s",&a)  2. fun 函数里面，不是 for(i=0;*p!='\0';i++) ，应该是 for(;*p!='\0';p++) 实际上，完全没必要搞这个 i 出来。  #include <stdio.h> #include <stdlib.h> #define N 100 void fun(char *p) { 	int k=0,j=0,g=0; 	for(;*p!='\0';p++) 	{ 		if((*p >= 'a' && *p <= 'z' )|| (*p >= 'A' && *p <= 'Z')) 			j++; 		else if(*p >= '0' && *p <= '9') 			k++; 		else  			g++; 	} 	printf("%d\n%d\n%d\n",j,k,g); } void main() {     	char a[N]; 	printf("输入一个字符串:\n"); 	scanf("%s",&a); 	fun(a); 	system("pause"); }


Question: 数据结构（c语言，不是c++）

《算法精解（C语言描述）》

http://bbs.csdn.net/topics/390623576  直接找人要答案，而且相对消耗时间，一般不会有人直接给答案的

就是《数据结构》严蔚敏  的课程设计

《数据结构》 严蔚敏


Question: c语言写的一个分割优酷MP4文件程序

还有版主关注。。哈哈，那就有空给大家写写原理吧！！谢谢大家的关注。。。太荣幸了！

下次吧。下次有空了，写一篇文章简单的解释一下。。。。

分享原理，当然能分析代码最好

讲一下原理，分享一下。

源代码是公司的，不能给外人看的，呵呵，可执行程序可以发给你试试

求源代码！我想看看

楼主辛苦了，下次写个格式工厂


Question: 二叉树的中序遍历 除了 构建线索二叉树还 有什么用？

找书把基础看了，光看资料，别人给的都是别人学过，简化的。有的东西没说。


Question: printf格式修改符

想要从本质上理解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和汇编的对应关系。” 不是一回事！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495  将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”：  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。

计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  理解和讨论之前请先学会如何观察！

有这工夫还不如看看printf格式修改符处理对应的源代码（下列文件的随便哪个都行）： C:\Microsoft SDK\src\crt\output.c C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\src\crt\output.c C:\MSVC20\SAMPLES\win32\output\OUTPUT.C C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\OUTPUT.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\output.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\output.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c


Question: linux不就是unix的一种吗？为什么招聘的时候，要招unix程序员呢？

学习了！！！

挂节点是个符号链接文件，linux 文件系统通过挂节点，把所有硬盘软盘等外部存储起，以及硬盘分区，组合成一个大的文件系统。 每个硬盘和硬盘分区，软盘，光驱是一个个子文件系统。 挂节点，(不一定就是一个完整的文件系统??)，他只是一个符号链接。 但是所有子文件系统，都是通过挂节点，挂接到主文件系统上的,......除了根文件系统/。  linux识别硬盘，硬盘分区，可以通过设备文件来识别。 有对应的目录，，，也许还有对应的配置文件。。 由于没用过linux，具体例子举不出来

楼主，可以透露下Linux程序员，的薪水么？我正在看鸟哥的Linux私房菜，貌似可以回答了以上问题！  就是不知道，学Linux有木有钱途而已！

1. 要知道一个目录下可以有多个目录，我的是 其中的一个父目录，可以挂在到某个分区上，  比如 楼上有人说的，将某个目录挂在到可移动盘（u盘上）。  一旦这个父目录挂在后，那么是否该父目录的所有子目录及其数据都 是这个分区即 例子上的可移动盘 联系起来  ，即所谓的mount  。   很明显则不是，比如： / 挂在分区1， /home挂在分区2.  所以说明，子目录是可以挂在另一个分区的。  为此结论： 父目录在分区1， 不代表子目录和父目录在同一个分区。  那么数据呢？    数据应该是只能在同一个分区。   再比如， 一个目录有多个文件，有的文件可以挂在到分区1上，有的由于分区大小，  那么就可能放到其他分区上去。  文件是否可以挂在？ 没有资料显示呼？

确切的说，linux是类unix

引用 8 楼 luotuo44 的回复:Linux并不是Unix的一种。Linux的实现源码和Unix的源码没有什么关系。之所以很多人认为Linux是Unix的一种，可能是觉得C程序很容易在Linux和Unix之间移植，或者说Linux和Unix提供了很多相同的系统API。其实，这是因为Linux和Unix都遵循了POSIX标准。所以他们有很多相同的系统API，并且很容易移植。这个道理就像遵循C标准库写出来的代码，很容易在各个编译器和平台上编译。  6 楼问题

引用 6 楼 caddor2011 的回复:[quote=引用 2 楼 FightForProgrammer 的回复:] 正在看《鸟哥的linux私房菜》，推荐lz去看。你的问题都能解决 引用 4 楼 zmlovelx 的回复:mount可以随便mount,  想一下u盘挂载就知道了，可以手动挂在任何一个普通文件夹下，但是数据还是存储在u 盘中的。  我的理解是文件不能拆分到不同分区中。  正在看鸟哥的书，正是看了它的书，有了疑惑，  1. 要知道一个目录下可以有多个目录，我的是 其中的一个父目录，可以挂在到某个分区上，  比如 楼上有人说的，将某个目录挂在到可移动盘（u盘上）。  一旦这个父目录挂在后，那么是否该父目录的所有子目录及其数据都 是这个分区即 例子上的可移动盘 联系起来  ，即所谓的mount  。  注意 ，关键字“所有“  2. mbr512个字节？是怎么得出的，我的理解是446+64 == 510 ,帖子里有个错误，不是500，是510才对。主分区的分区信息，会不会存在  对应的分区里？   因为鸟哥提到， 逻辑分区的信息存在扩展分区里，所以一旦扩展分区破坏，所以所有逻辑分区都挂了。  于是，我就想：那么 主分区的分区信息，是否也存在 mbr 即 主分区本身里。  当然对于问题2. 可能意义不大。  我最想知道的是第一点。  我一直无法正确的理解 ，挂在这个概念。    [/quote]  顶起来。

引用 2 楼 FightForProgrammer 的回复:正在看《鸟哥的linux私房菜》，推荐lz去看。你的问题都能解决 引用 4 楼 zmlovelx 的回复:mount可以随便mount,  想一下u盘挂载就知道了，可以手动挂在任何一个普通文件夹下，但是数据还是存储在u 盘中的。  我的理解是文件不能拆分到不同分区中。  正在看鸟哥的书，正是看了它的书，有了疑惑，  1. 要知道一个目录下可以有多个目录，我的是 其中的一个父目录，可以挂在到某个分区上，  比如 楼上有人说的，将某个目录挂在到可移动盘（u盘上）。  一旦这个父目录挂在后，那么是否该父目录的所有子目录及其数据都 是这个分区即 例子上的可移动盘 联系起来  ，即所谓的mount  。  注意 ，关键字“所有“  2. mbr512个字节？是怎么得出的，我的理解是446+64 == 510 ,帖子里有个错误，不是500，是510才对。主分区的分区信息，会不会存在  对应的分区里？   因为鸟哥提到， 逻辑分区的信息存在扩展分区里，所以一旦扩展分区破坏，所以所有逻辑分区都挂了。  于是，我就想：那么 主分区的分区信息，是否也存在 mbr 即 主分区本身里。  当然对于问题2. 可能意义不大。  我最想知道的是第一点。  我一直无法正确的理解 ，挂在这个概念。

linux从广义上说可以算1种unix，但unix不只是linux，所以可能想找会unix中不是linux部分的。

正在看《鸟哥的linux私房菜》，推荐lz去看。你的问题都能解决

linux不是unix的变种，linux没有参照任何unix的源代码，但是说linux是unix like的一点不为过。linux基本使用了和unix一致的系统调用接口，这使得为unix编写的程序，只需要重新编译就可以用于linux。  如果是MBR方式的磁盘分区，那么第一个扇区保存着分区信息，MBR最多支持4个分区，包括主分区和扩展分区。而逻辑驱动器的分区信息则不在这里。  同一个目录下可以有不同的挂载点，但是一个文件应该不能拆分。


Question: 一个段诡异的C语言代码

学好C真的不容易的，不知道哪里就会出错

跑了跑，确实有这样的问题~~  看到楼上有的回复说没问题，有些有问题。 是由于编译器不同的原因吧？ 想知道是用的什么编译器。

引用 13 楼 yuanhong2910 的回复:这个地方其实是有另一个bug的 unsigned short a,b;   // a, b各占两个字节  scanf("%d%d",&a,&b);  //scanf 是按4个字节去读的，会把未使用的内存写爆 在#include<stdio.h>下面加一个int m；后就没问题了，代码如下： #include<stdio.h> int m; int n; unsigned short a,b; int main() { scanf("%d",&n); for(int k=0;k<n;k++) { scanf("%d%d",&a,&b); printf("fg\n");  } return 0; } 另外，没改之前的那段代码，在scanf执行之后n的值变为0了，所以只循环一次。只是不知道n是如何变为0的。我加个int m；是为了改变编译器分配给n的地址，果然如我所料，这个新的地址不会因为scanf语句而使这个地址内存储的n值变化。 可能是编译器的bug？也是因为我没有规范使用。不知道这个问题有没有价值，会不会太转牛角尖。

引用 16 楼 bigwatercar 的回复:[quote=引用 13 楼 yuanhong2910 的回复:] 这个地方其实是有另一个bug的 unsigned short a,b;   // a, b各占两个字节  scanf("%d%d",&a,&b);  //scanf 是按4个字节去读的，会把未使用的内存写爆   分析的有道理， LZ的scanf格式化字符串本身也有问题，根本没办法接收两个输入。加个空格或者逗号试试[/quote]  恩恩，是这样的，改为scanf("%hu%hu",&a,&b);就对了。对scanf机制理解不够，导致出错。非常感谢以上各位赐教

引用 1 楼 r_Jimy 的回复:表示用DEV C++，测试一切正常，不知楼主用的什么环境？ 用的VC++ 6.0,

引用 13 楼 yuanhong2910 的回复:这个地方其实是有另一个bug的 unsigned short a,b;   // a, b各占两个字节  scanf("%d%d",&a,&b);  //scanf 是按4个字节去读的，会把未使用的内存写爆   分析的有道理， LZ的scanf格式化字符串本身也有问题，根本没办法接收两个输入。加个空格或者逗号试试

引用 13 楼 yuanhong2910 的回复:这个地方其实是有另一个bug的 unsigned short a,b;   // a, b各占两个字节  scanf("%d%d",&a,&b);  //scanf 是按4个字节去读的，会把未使用的内存写爆  确实是这样 这是个坑！

也许你可以试试volatle int n;

关于scanf，楼主可以看看这个——http://blog.csdn.net/u012421456?viewmode=contents

引用 19 楼 u010505007 的回复:[quote=引用 13 楼 yuanhong2910 的回复:] 这个地方其实是有另一个bug的 unsigned short a,b;   // a, b各占两个字节  scanf("%d%d",&a,&b);  //scanf 是按4个字节去读的，会把未使用的内存写爆 在#include<stdio.h>下面加一个int m；后就没问题了，代码如下： #include<stdio.h> int m; int n; unsigned short a,b; int main() { scanf("%d",&n); for(int k=0;k<n;k++) { scanf("%d%d",&a,&b); printf("fg\n");  } return 0; } 另外，没改之前的那段代码，在scanf执行之后n的值变为0了，所以只循环一次。只是不知道n是如何变为0的。我加个int m；是为了改变编译器分配给n的地址，果然如我所料，这个新的地址不会因为scanf语句而使这个地址内存储的n值变化。 可能是编译器的bug？也是因为我没有规范使用。不知道这个问题有没有价值，会不会太转牛角尖。[/quote] 挺简单的，调试的时候把a, b, n的地址输出出来就知道了，很容易分析。三种方法： 1. 直接%p输出&a, &b, &n地址。 2. 调试时反汇编直接看地址。 3. 在&n的地址设置 内存断点，停止时看怎么改的。

表示用VS2010也没有问题，不知道楼主是出了什么问题

请检查scanf的返回值!

应该是输入的问题吧，我先是直接跑，也是能循环一次就结束了，不管你输入n是多少，但是我在输入n之后加了句printf，然后在printf那儿打了个断点，就正常了。。 会不会是缓存的问题？但是输入的时候回车了啊。。。。。

简单的问题 目测楼主scanf("%d%d",&a,&b);出入的是如1,2所以你的n不论为多少都是一次，如果你按照scanf的格式12输入，是没问题的；如果想输入成1，2可以改为scanf("%d,%d",&a,&b);

clean + rebuild

你怎么输入的？看着没什么问题

表示用DEV C++，测试一切正常，不知楼主用的什么环境？

scanf("%d%d",&a,&b);

楼主什么编译器啊


引用 5 楼 jerry_dqh 的回复:[quote=引用 4 楼 wangli1000000 的回复:] [quote=引用 3 楼 jerry_dqh 的回复:] [quote=引用 2 楼 wangli1000000 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 啥意思，是指控制台窗口可以拖大拖小的那个消息 ？  嗯，就是。[/quote] 控制台没有处理消息的消息循环，网上搜索一下系统hook相关的。[/quote]   请看一下，case WINDOW_BUFFER_SIZE_EVENT:  是不是控制台窗口可以拖大拖小的消息？  #include <windows.h> #include <stdio.h>   VOID ErrorExit(LPSTR); VOID KeyEventProc(KEY_EVENT_RECORD);  VOID MouseEventProc(MOUSE_EVENT_RECORD);  VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);     int main(VOID)  {      HANDLE hStdin;      DWORD cNumRead, fdwMode, fdwSaveOldMode, i;      INPUT_RECORD irInBuf[128];      int counter=0;        // Get the standard input handle.         hStdin = GetStdHandle(STD_INPUT_HANDLE);      if (hStdin == INVALID_HANDLE_VALUE)          ErrorExit(TEXT("GetStdHandle"));         // Save the current input mode, to be restored on exit.         if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )          ErrorExit(TEXT("GetConsoleMode"));         // Enable the window and mouse input events.         fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;      if (! SetConsoleMode(hStdin, fdwMode) )          ErrorExit(TEXT("SetConsoleMode"));         // Loop to read and handle the input events.         while (counter++ <= 100)      {          // Wait for the events.             if (! ReadConsoleInput(                  hStdin,      // input buffer handle                  irInBuf,     // buffer to read into                  128,         // size of read buffer                  &cNumRead) ) // number of records read              ErrorExit(TEXT("ReadConsoleInput"));             // Dispatch the events to the appropriate handler.             for (i = 0; i < cNumRead; i++)          {             switch(irInBuf[i].EventType)              {                  case KEY_EVENT: // keyboard input                      KeyEventProc(irInBuf[i].Event.KeyEvent);                      break;                     case MOUSE_EVENT: // mouse input                      MouseEventProc(irInBuf[i].Event.MouseEvent);                      break;                     case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing                      ResizeEventProc(                          irInBuf[i].Event.WindowBufferSizeEvent);                      break;                     case FOCUS_EVENT:  // disregard focus events                     case MENU_EVENT:   // disregard menu events                      break;                     default:                      ErrorExit(TEXT("Unknown event type"));                      break;              }          }     }         return 0;  }   VOID ErrorExit (LPSTR lpszMessage)  {      fprintf(stderr, "%s\n", lpszMessage);      ExitProcess(0);  }   VOID KeyEventProc(KEY_EVENT_RECORD ker) {     printf("Key event: ");       if(ker.bKeyDown)         printf("key pressed\n");     else printf("key released\n"); }   VOID MouseEventProc(MOUSE_EVENT_RECORD mer) { #ifndef MOUSE_HWHEELED #define MOUSE_HWHEELED 0x0008 #endif     printf("Mouse event: ");       switch(mer.dwEventFlags)     {         case 0:             printf("button press\n");             break;         case DOUBLE_CLICK:             printf("double click\n");             break;         case MOUSE_HWHEELED:             printf("horizontal mouse wheel\n");             break;         case MOUSE_MOVED:             printf("mouse moved\n");             break;         case MOUSE_WHEELED:             printf("vertical mouse wheel\n");             break;         default:             printf("unknown\n");             break;     } }   VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr) {     printf("Resize event\n"); 	 } [/quote] 这个消息不是，是改变窗口buffer缓冲大小的，比如可以缓冲100行，还是可以缓冲200行，超过的就不能在窗口中显示了。 搜索了一下，你可能不要自己处理，看SetConsoleWindowInfo这个函数是否能设置console窗口的大小。[/quote]   我说的不是设置控制台窗口大小，我说的是当鼠标在窗口边上时，拖动鼠标改变窗口大小。SetConsoleWindowInfo函数是设置console窗口大小的。

引用 4 楼 wangli1000000 的回复:[quote=引用 3 楼 jerry_dqh 的回复:] [quote=引用 2 楼 wangli1000000 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 啥意思，是指控制台窗口可以拖大拖小的那个消息 ？  嗯，就是。[/quote] 控制台没有处理消息的消息循环，网上搜索一下系统hook相关的。[/quote]   请看一下，case WINDOW_BUFFER_SIZE_EVENT:  是不是控制台窗口可以拖大拖小的消息？  #include <windows.h> #include <stdio.h>   VOID ErrorExit(LPSTR); VOID KeyEventProc(KEY_EVENT_RECORD);  VOID MouseEventProc(MOUSE_EVENT_RECORD);  VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);     int main(VOID)  {      HANDLE hStdin;      DWORD cNumRead, fdwMode, fdwSaveOldMode, i;      INPUT_RECORD irInBuf[128];      int counter=0;        // Get the standard input handle.         hStdin = GetStdHandle(STD_INPUT_HANDLE);      if (hStdin == INVALID_HANDLE_VALUE)          ErrorExit(TEXT("GetStdHandle"));         // Save the current input mode, to be restored on exit.         if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )          ErrorExit(TEXT("GetConsoleMode"));         // Enable the window and mouse input events.         fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;      if (! SetConsoleMode(hStdin, fdwMode) )          ErrorExit(TEXT("SetConsoleMode"));         // Loop to read and handle the input events.         while (counter++ <= 100)      {          // Wait for the events.             if (! ReadConsoleInput(                  hStdin,      // input buffer handle                  irInBuf,     // buffer to read into                  128,         // size of read buffer                  &cNumRead) ) // number of records read              ErrorExit(TEXT("ReadConsoleInput"));             // Dispatch the events to the appropriate handler.             for (i = 0; i < cNumRead; i++)          {             switch(irInBuf[i].EventType)              {                  case KEY_EVENT: // keyboard input                      KeyEventProc(irInBuf[i].Event.KeyEvent);                      break;                     case MOUSE_EVENT: // mouse input                      MouseEventProc(irInBuf[i].Event.MouseEvent);                      break;                     case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing                      ResizeEventProc(                          irInBuf[i].Event.WindowBufferSizeEvent);                      break;                     case FOCUS_EVENT:  // disregard focus events                     case MENU_EVENT:   // disregard menu events                      break;                     default:                      ErrorExit(TEXT("Unknown event type"));                      break;              }          }     }         return 0;  }   VOID ErrorExit (LPSTR lpszMessage)  {      fprintf(stderr, "%s\n", lpszMessage);      ExitProcess(0);  }   VOID KeyEventProc(KEY_EVENT_RECORD ker) {     printf("Key event: ");       if(ker.bKeyDown)         printf("key pressed\n");     else printf("key released\n"); }   VOID MouseEventProc(MOUSE_EVENT_RECORD mer) { #ifndef MOUSE_HWHEELED #define MOUSE_HWHEELED 0x0008 #endif     printf("Mouse event: ");       switch(mer.dwEventFlags)     {         case 0:             printf("button press\n");             break;         case DOUBLE_CLICK:             printf("double click\n");             break;         case MOUSE_HWHEELED:             printf("horizontal mouse wheel\n");             break;         case MOUSE_MOVED:             printf("mouse moved\n");             break;         case MOUSE_WHEELED:             printf("vertical mouse wheel\n");             break;         default:             printf("unknown\n");             break;     } }   VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr) {     printf("Resize event\n"); 	 } [/quote] 这个消息不是，是改变窗口buffer缓冲大小的，比如可以缓冲100行，还是可以缓冲200行，超过的就不能在窗口中显示了。 搜索了一下，你可能不要自己处理，看SetConsoleWindowInfo这个函数是否能设置console窗口的大小。

引用 3 楼 jerry_dqh 的回复:[quote=引用 2 楼 wangli1000000 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 啥意思，是指控制台窗口可以拖大拖小的那个消息 ？  嗯，就是。[/quote] 控制台没有处理消息的消息循环，网上搜索一下系统hook相关的。[/quote]   请看一下，case WINDOW_BUFFER_SIZE_EVENT:  是不是控制台窗口可以拖大拖小的消息？  #include <windows.h> #include <stdio.h>   VOID ErrorExit(LPSTR); VOID KeyEventProc(KEY_EVENT_RECORD);  VOID MouseEventProc(MOUSE_EVENT_RECORD);  VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);     int main(VOID)  {      HANDLE hStdin;      DWORD cNumRead, fdwMode, fdwSaveOldMode, i;      INPUT_RECORD irInBuf[128];      int counter=0;        // Get the standard input handle.         hStdin = GetStdHandle(STD_INPUT_HANDLE);      if (hStdin == INVALID_HANDLE_VALUE)          ErrorExit(TEXT("GetStdHandle"));         // Save the current input mode, to be restored on exit.         if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )          ErrorExit(TEXT("GetConsoleMode"));         // Enable the window and mouse input events.         fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;      if (! SetConsoleMode(hStdin, fdwMode) )          ErrorExit(TEXT("SetConsoleMode"));         // Loop to read and handle the input events.         while (counter++ <= 100)      {          // Wait for the events.             if (! ReadConsoleInput(                  hStdin,      // input buffer handle                  irInBuf,     // buffer to read into                  128,         // size of read buffer                  &cNumRead) ) // number of records read              ErrorExit(TEXT("ReadConsoleInput"));             // Dispatch the events to the appropriate handler.             for (i = 0; i < cNumRead; i++)          {             switch(irInBuf[i].EventType)              {                  case KEY_EVENT: // keyboard input                      KeyEventProc(irInBuf[i].Event.KeyEvent);                      break;                     case MOUSE_EVENT: // mouse input                      MouseEventProc(irInBuf[i].Event.MouseEvent);                      break;                     case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing                      ResizeEventProc(                          irInBuf[i].Event.WindowBufferSizeEvent);                      break;                     case FOCUS_EVENT:  // disregard focus events                     case MENU_EVENT:   // disregard menu events                      break;                     default:                      ErrorExit(TEXT("Unknown event type"));                      break;              }          }     }         return 0;  }   VOID ErrorExit (LPSTR lpszMessage)  {      fprintf(stderr, "%s\n", lpszMessage);      ExitProcess(0);  }   VOID KeyEventProc(KEY_EVENT_RECORD ker) {     printf("Key event: ");       if(ker.bKeyDown)         printf("key pressed\n");     else printf("key released\n"); }   VOID MouseEventProc(MOUSE_EVENT_RECORD mer) { #ifndef MOUSE_HWHEELED #define MOUSE_HWHEELED 0x0008 #endif     printf("Mouse event: ");       switch(mer.dwEventFlags)     {         case 0:             printf("button press\n");             break;         case DOUBLE_CLICK:             printf("double click\n");             break;         case MOUSE_HWHEELED:             printf("horizontal mouse wheel\n");             break;         case MOUSE_MOVED:             printf("mouse moved\n");             break;         case MOUSE_WHEELED:             printf("vertical mouse wheel\n");             break;         default:             printf("unknown\n");             break;     } }   VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr) {     printf("Resize event\n"); 	 }

引用 2 楼 wangli1000000 的回复:[quote=引用 1 楼 jerry_dqh 的回复:] 啥意思，是指控制台窗口可以拖大拖小的那个消息 ？  嗯，就是。[/quote] 控制台没有处理消息的消息循环，网上搜索一下系统hook相关的。

引用 1 楼 jerry_dqh 的回复:啥意思，是指控制台窗口可以拖大拖小的那个消息 ？  嗯，就是。

啥意思，是指控制台窗口可以拖大拖小的那个消息 ？


Question: 一个关于结构体的问题

char*只是一个字符指针，他可以指向一个内存空间，如果是向他指向的空间录入（写入）的话就要保证这个空间是可写的（指向一个字符数组就可以，指向一个字符串常量值就不可以写，只能读取）

引用 2 楼 u010515100 的回复:[quote=引用 1 楼 max_min_ 的回复:] 名字没有分配足够的内存空间吧！ malloc一下 或者用栈空间 char last_name[20]; 内存好像是没分配，主要我是看书这样做的。 是否代表书有错误？ [/quote]  书上没有问题，书上这样是把常量字符串"Busheker"的地址赋值给last_name了， 也就是说让last_name这个指针指向了"Busheker"，是有地址指向了

由于未初始化, 可能是内存访问越界导致.

引用 1 楼 max_min_ 的回复:名字没有分配足够的内存空间吧！ malloc一下 或者用栈空间 char last_name[20]; 内存好像是没分配，主要我是看书这样做的。 是否代表书有错误？


Question: 【新手求教】字符数组

引用 3 楼 moyac 的回复:……，第二个问题，是我自己想错了，恩，知道怎么解决了 OK

只有一个if语句啊。 你说的是，不明白这里？  if(c == '\n') {     s[i] = '\n';     i ++; }  因为，上面跳出循环的情况，有一种是：c!='\n'，所以下面这样处理完全没有问题啊。 如果不明白，可以跟踪一下就理解了。 引用 2 楼 moyac 的回复:int getline(char s[], int lim){ int c, i ; for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i ++){ s[i] = c; } if(c == '\n'){ s[i] = '\n'; i ++; } s[i] = '\0'; return i ; } 这里面不是用了两句if语句嘛，不太能理解这一小部分的代码

为什么copy函数里的参数是longest而不是写longest[]，不是数组吗？ ----------------- 因为形参里面是longest []，所以传参的时候就直接传数组名。 数组名可以代表数组的首地址，数组名代表这个数组。不用在后面加上[]。 如果学过java里面的数组，这里就比较好理解： java里面的数组这样声明： int[] a;就表示 a是一个数组。反正记住，使用时表示一个数组，用数组名就可以了。不用后面带中括号。带中括号的情况都是下标，表示数组中的一个元素的用法。  第二个问，没有看明白你想问什么。


Question: [新人求助]关于Vistual studio编译器的问题！！！！！

表示学了一个月， 还没有遇到过！！！！！！！！！！！

第一，上一次的exe运行还没结束，可以从任务管理器中检查； 第二，开了360之类的东西。

原因可能比较复杂，可能是你的电脑有360或是别的杀毒软件，,360和一些杀毒软件的有些设置会防止修改exe文件。这样编译的时候就会有问题了。 还有一个原因就是有病毒在修改这个exe文件，这样，你编译的时候就无法修改这一个文件了。 所以，检查一下，看是否是这些原因吧。 引用 15 楼 Splendid8023 的回复:[quote=引用 14 楼 zjq9931 的回复:] [quote=引用 7 楼 Splendid8023 的回复:] [quote=引用 1 楼 zjq9931 的回复:] 根据提示，看样子是你运行后，没有关闭。然后改了源码，再次编译。造成的。 关闭运行的结果窗口，在编译就可以了。求助啊[/quote] 删除这个工程的DEBUG文件夹。再试试。[/quote]删除是有用，但不能一直这么弄啊？有其他办法吗？[/quote]

引用 12 楼 ACMtop 的回复:VC 6 高级开发者都足够用了【不是我说的】，不用赶时髦  vc6的stl是硬伤

引用 7 楼 Splendid8023 的回复:[quote=引用 1 楼 zjq9931 的回复:] 根据提示，看样子是你运行后，没有关闭。然后改了源码，再次编译。造成的。 关闭运行的结果窗口，在编译就可以了。求助啊[/quote] 删除这个工程的DEBUG文件夹。再试试。

可能是没有关闭。打开资源管理器，看helloworld进程还在不在运行，在的话就关闭它。

引用 14 楼 zjq9931 的回复:[quote=引用 7 楼 Splendid8023 的回复:] [quote=引用 1 楼 zjq9931 的回复:] 根据提示，看样子是你运行后，没有关闭。然后改了源码，再次编译。造成的。 关闭运行的结果窗口，在编译就可以了。求助啊[/quote] 删除这个工程的DEBUG文件夹。再试试。[/quote]删除是有用，但不能一直这么弄啊？有其他办法吗？

VC 6 高级开发者都足够用了【不是我说的】，不用赶时髦

引用 10 楼 q191201771 的回复:任务管理器看下还有没有hello world进程吧。没有，我都是直接把x掉的，为什么编译不起来啊，但是把程序放在那里不动，过几分钟就能编译成功了，求教啊！

任务管理器看下还有没有hello world进程吧。

不清楚，楼主你要不试一下新建一个工程项目，把代码再敲进去试试？还不行就不清楚了，可以尝试着修复一下VS

引用 5 楼 u012421456 的回复:楼上说得对，按说楼主该可以成功的， 看来楼主是初学者，编译器也不太熟，唉，现在的软件越来越复杂，新手入门操作起来也有些问题，建议楼主如果有时间，可以看些讲的详细的视频，还是不行啊，会不会是电脑系统的问题啊

引用 1 楼 zjq9931 的回复:根据提示，看样子是你运行后，没有关闭。然后改了源码，再次编译。造成的。 关闭运行的结果窗口，在编译就可以了。求助啊

真的关掉了，还是这样子，但是把程序放在那边不碰它，过几分钟就能编译成功了，为什么啊？

HelloWorld.exe 没有退出。

关闭了，还是没用啊

cmd窗口没关，关了再编译就行了


Question: 为什么回显的汉字不对，或者说getch（）两次怎么得到的是同一个值。。。。

引用 2 楼 u012834851 的回复:谢谢楼上，我自己的程序写的太没逻辑了  放在这上面叫我自己也懒得看   后来查了下好像是我编译器没装好  。看了楼上的程序很有收获。 赵4出品， 必属精品！

仅供参考#include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() {     cprintf("\r\nPassword:");     i=0;pw[i]=0;     while (1) {         ch=getch();         if (ch==13 || i>=39) break;         switch (ch) {         case 27:             cprintf("\rPassword: %40s"," ");             cprintf("\rPassword: ");             i=0;pw[i]=0;             break;         case 8:             if (i>0) {                 i--;                 pw[i]=0;                 cprintf("\b \b");             }             break;         default:             pw[i]=ch;             i++;             pw[i]=0;             cprintf("*");             break;         }     }     cprintf("\r\n");     f=fopen("password.txt","w");     fprintf(f,"%s\n",pw);     fclose(f); }


Question: 关于C-Free编译问题

没看懂，运行后当然显示计算结果，编译的时候出问题了吗？上图

显示什么，我怎么没读懂，是我的理解能力太差还是。。。

你的问题是？？

运行后就显示什么啊？这个程序实在是，，，  这是我的C-Free结果——

换种编译器试试

int main() {int a = 15,b = 37; printf("%d",a+b); return 0;}


Question: 请问如何在windows下模拟linux里面手动编译

引用 8 楼 ForestDB 的回复:cl.exe /output test main.c shell中的()，是在子shell中执行命令的意思。 非常感谢！！！

引用 2 楼 zmlovelx 的回复:cygwin也可以 或者直接用vc下的命令行，如cl.exe == 谢谢了，大哥  在请问一下下面这两条命令有什么区别，为什么执行效果不同？ cpp1.exe | cpp2.exe < data.txt > output.txt (cpp1.exe | cpp2.exe) < data.txt > output.txt  我想要的结果是cpp1和cpp2两个程序连在一起，然后data.txt作为cpp1的输入, output.txt作为cpp2的输出。

我觉得最好安装一个vmware，然后在里面装rhel。然后在windows下用xshell去连接。 这样最正式

还可以参考一下MSDN里面 vcbuild msbuild 相关内容。

1、cygwin是在windows下模拟linux的一套软件，可以熟悉linux的人很快上手windows上的开发  2、直接基于vc也可以，建立源文件，可以直接编译，也可以建立makefile。在vc++的命令行中，用cl是编译，用link是链接，用nmake是针对makefile进行编译链接

用MinGW可以，得配置一下环境变量

cygwin也可以 或者直接用vc下的命令行，如cl.exe ==

可以自己装一个MinGW


Question: 求一个windows下用于两个PC间串口通信的C/C++程序

记得以前有个 串口精灵 什么的工具，可以搜一下

试试vspd


Question: C语言能开发一套网络彩票自动投注程序吗

引用 12 楼 PDD123 的回复:[quote=引用 11 楼 slsywa1984 的回复:] [quote=引用 10 楼 PDD123 的回复:] 安全完善的自动投注程序需要彩票销售的系统给你提供接口和权限，然后你按照相关的规则编程。  否则你就只能通过现有的网上投注网站，模拟相关动作来实现自动投注。两种方法： 1.类似前段时间的抢票软件，这种方法我也没有学习。 2.直接用程序模拟网站各个页面的交互，按照规则直接发送消息。  是這個意思，開發這樣的軟件用C語言還是C++，要學多久才能到這個水平 [/quote] 用C或者C++都可以实现，建议学习C++，因为现在的主流是C++，有很多编译器都有一些控件库，制作界面很容易。[/quote]  謝謝。

引用 10 楼 PDD123 的回复:安全完善的自动投注程序需要彩票销售的系统给你提供接口和权限，然后你按照相关的规则编程。  否则你就只能通过现有的网上投注网站，模拟相关动作来实现自动投注。两种方法： 1.类似前段时间的抢票软件，这种方法我也没有学习。 2.直接用程序模拟网站各个页面的交互，按照规则直接发送消息。  是這個意思，開發這樣的軟件用C語言還是C++，要學多久才能到這個水平

引用 11 楼 slsywa1984 的回复:[quote=引用 10 楼 PDD123 的回复:] 安全完善的自动投注程序需要彩票销售的系统给你提供接口和权限，然后你按照相关的规则编程。  否则你就只能通过现有的网上投注网站，模拟相关动作来实现自动投注。两种方法： 1.类似前段时间的抢票软件，这种方法我也没有学习。 2.直接用程序模拟网站各个页面的交互，按照规则直接发送消息。  是這個意思，開發這樣的軟件用C語言還是C++，要學多久才能到這個水平 [/quote] 用C或者C++都可以实现，建议学习C++，因为现在的主流是C++，有很多编译器都有一些控件库，制作界面很容易。

引用 8 楼 slsywa1984 的回复:[quote=引用 2 楼 CC_Cathy 的回复:] 对彩票不是很了解，自助投注程序 是自己生成彩票的号码吗？  不是隨機生成號碼那種，是通過軟件鏈接網站的投注動作，形成自動投注代替手動按鈕，而且判斷各種開獎形態執行不同的投注方案。[/quote] http://www.autohotkey.com

引用 2 楼 CC_Cathy 的回复:对彩票不是很了解，自助投注程序 是自己生成彩票的号码吗？  不是隨機生成號碼那種，是通過軟件鏈接網站的投注動作，形成自動投注代替手動按鈕，而且判斷各種開獎形態執行不同的投注方案。

引用 5 楼 zhao4zhong1 的回复:仅供参考：//要求1:从给出来的不同的六组数字中，从每组任意挑选一个数字，最后组成一个六个数字的数组。 //将所有的数组全部列出来。 //同时，排除全部为偶数、全部为奇数的数组。 //排除四个数字递增连续（比如8、9、10、11）的数组。 //如下： //第一个数字从这12个数字中挑选：,1,3,2,4,5,6,7,8,9,10,11,12 //第二个数字从这17个数字中挑选：,8,7,5,9,6,4,11,10,12,13,3,14,17,2,16,15,18 //第三个数字从这21个数字中挑选：,13,10,15,16,18,11,14,12,7,19,21,17,8,22,9,20,6,23,5,24,25 //第四个数字从这20个数字中挑选：,22,23,18,20,16,17,15,21,14,26,19,24,27,25,12,13,11,10,28,29 //第五个数字从这19个数字中挑选：,26,25,27,29,30,28,23,24,20,22,19,31,21,17,18,32,13,15,16 //第六个数字从这14个数字中挑选：,32,33,30,31,29,28,27,26,25,24,23,22,18,21 //要求2: //请输入第1个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第2个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第3个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第4个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第5个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第6个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //然后回车，输出结果到cp.txt //要求3: //保证同一组数据的数都不相同。 //比如，第一个数为6时，第二个数或其他的数都不能再为6；第二个数为10时，第三个数或其他的数都不能再为10，以此类推…… //要求4: //增加一个条件：在产生的每个数组A1A2A3A4A5A6中，要求A1<A2<A3<A4<A5<A6 #include <stdio.h> #include <stdlib.h> #include <string.h> int v[6]; int n[6]={12,17,21,20,19,14}; int d[6][30]={       {1,3,2,4,5,6,7,8,9,10,11,12},       {8,7,5,9,6,4,11,10,12,13,3,14,17,2,16,15,18},       {13,10,15,16,18,11,14,12,7,19,21,17,8,22,9,20,6,23,5,24,25},       {22,23,18,20,16,17,15,21,14,26,19,24,27,25,12,13,11,10,28,29},       {26,25,27,29,30,28,23,24,20,22,19,31,21,17,18,32,13,15,16},       {32,33,30,31,29,28,27,26,25,24,23,22,18,21}, }; int i,j,i0,i1,i2,i3,i4,i5,s; char ln[100],*t; FILE *f; int main() {     for (i=0;i<6;i++) {         printf("请输入第%d个数字的选择范围：",i+1);         fgets(ln,100,stdin);         j=0;         t=strtok(ln," ");         while (1) {             if (NULL==t) break;             if (0==t[0]) continue;//跳过多个空格间隔时取出的空串             d[i][j]=atoi(t);             j++;             if (j>=30) break;             t=strtok(NULL," ");         }         n[i]=j;     }     f=fopen("cp.txt","w");     if (NULL==f) {         printf("无法生成cp.txt!\n");         return 1;     }     printf("正在生成cp.txt...");     for (i0=0;i0<n[0];i0++) {     for (i1=0;i1<n[1];i1++) {     for (i2=0;i2<n[2];i2++) {     for (i3=0;i3<n[3];i3++) {     for (i4=0;i4<n[4];i4++) {     for (i5=0;i5<n[5];i5++) {         v[0]=d[0][i0];         v[1]=d[1][i1];         v[2]=d[2][i2];         v[3]=d[3][i3];         v[4]=d[4][i4];         v[5]=d[5][i5];         if (0==(v[0]%2)          && 0==(v[1]%2)          && 0==(v[2]%2)          && 0==(v[3]%2)          && 0==(v[4]%2)          && 0==(v[5]%2)) continue;//排除全部为偶数         if (1==(v[0]%2)          && 1==(v[1]%2)          && 1==(v[2]%2)          && 1==(v[3]%2)          && 1==(v[4]%2)          && 1==(v[5]%2)) continue;//排除全部为奇数         for (i=0;i<5;i++) {             for (j=i+1;j<6;j++) {                 if (v[i]==v[j]) goto NEXT;//保证同一组数据的数都不相同             }         }     NEXT:         if (i>=5) {             for (i=0;i<5;i++) for (j=i+1;j<6;j++) if (v[i]>v[j]) {s=v[i];v[i]=v[j];v[j]=s;}//从小到大排序             if ((v[0]+1==v[1]               && v[1]+1==v[2]               && v[2]+1==v[3])              || (v[1]+1==v[2]               && v[2]+1==v[3]               && v[3]+1==v[4])              || (v[2]+1==v[3]               && v[3]+1==v[4]               && v[4]+1==v[5])) continue;//排除四个数字递增连续             fprintf(f,"%2d,%2d,%2d,%2d,%2d,%2d\n",v[0],v[1],v[2],v[3],v[4],v[5]);         }     }}}}}}     fclose(f);     printf("\n生成cp.txt完毕\n");     return 0; } //如果文件in.txt的内容为 //1 3 2 4 5 6 7 8 9 10 11 12 //8 7 5 9 6 4 11 10 12 13 3 14 17 2 16 15 18 //13 10 15 16 18 11 14 12 7 19 21 17 8 22 9 20 6 23 5 24 25 //22 23 18 20 16 17 15 21 14 26 19 24 27 25 12 13 11 10 28 29 //26 25 27 29 30 28 23 24 20 22 19 31 21 17 18 32 13 15 16 //32 33 30 31 29 28 27 26 25 24 23 22 18 21 //可以在cmd窗口里面输入命令 //cp <in.txt //得到要求1对应的结果 //BTW:中了一定要分我六成啊！嘿嘿！(^=^)    不是隨機生成號碼那種，是通過軟件鏈接網站的投注動作，形成自動投注代替手動按鈕，而且判斷各種開獎形態執行不同的投注方案。

引用 4 楼 qisini373 的回复:自动投注系统  指的是什么？ 如果是自动生成号码  很简单  如果是 自动买彩票  需要提供接口吧  不是隨機生成號碼那種，是通過軟件鏈接網站的投注動作，形成自動投注代替手動按鈕，而且判斷各種開獎形態執行不同的投注方案。

关键是给你开放接口。否则你就是骗钱的

对彩票不是很了解，自助投注程序 是自己生成彩票的号码吗？

没人来吗？执着在线等。。


Question: 类型 ：STRING	大小：可变	长度最大：255	 字符串类型，第一字节指明长度，其后是字符串内容

引用 9 楼 u011362822 的回复: typedef struct {     unsigned char length;     char* data; }STRING;   没注意楼主说的长度最大255，已改正； 在我的项目中，我用到了很多这种结构体，很实用； 嗯，谢谢啦！

typedef struct {     int length;     char* data; }STRING;   这样就行了

引用 4 楼 twj5817 的回复:typedef struct {    char  length;    char* m_str; } STRING; 这样写吧，然后需要用到的时候就指定length，动态申请m_str的空间吧，但是这个最大长度应该就不止255了吧？支持此楼做法。不过感觉把长度改成无符号char会好一些（范围0~255），然后第二个元素就是一个字符指针，可以根据第一个信息动态开辟相应长度的空间（注意结束符还需要额外的一个字节）

引用 1 楼 starytx 的回复:定义成char *就可以了，不用指定长度，只要你确定好结束符'\0'就可以了 呵呵

typedef struct {    USHORT length;    char* m_str; } STRING;

可以写出来看看吗？因为题目要求这个要第一字节制定长度，想了半天都不知道要怎么弄才好了

定义成char *就可以了，不用指定长度，只要你确定好结束符'\0'就可以了


Question: 求助

这个和你的要求差不多，自己改改吧，不多动手，很难进步 http://blog.csdn.net/u012421456/article/details/26170519

你应该写出你的程序，然后在这里改错。不应该甚么都没有。