Question: 买了本《windows程序设计》用哪个软件编写好啊？

引用 5 楼 cyycxz 的回复:引用 3 楼 luoweifu 的回复:可以看你的书用的是什么或推荐什么开发环境，用与书配套的开发环境学起来会比较顺利（特别是新手）。还有就是看你的书是基于哪个标准的，如果是C++11标准（11年的新标准），在VS2010下有些新的类是不支持的，可以用VS2013。如果是基于98标准那就无所胃了。下面是书子底下小备注：从本书原版出版至今已有十多年过去了，微软的visual studio也早已不是当年的样子。读者的机器上或许已经安装了最新的visual studio 2008甚至2010测试版。本书中提到的有关visual c++ developer studio的内容已经多半不适用了，编程的方式也有些面目全非。我就是看到这个才觉得用VS2010不太合适，好像书里的范例是在VC6.0上运行的 不知道你看完了序了没，我记得上面有说是已经重新编辑并在win7 VS2008测试过，完全可以运行。 我说的是第五版珍藏版，代码在配套光盘里。

嗯，现在的不少书都还是这个，这是Vc++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443

Visual C++ 6.0

那你就用VC6.0吧，这是这经典的一个版本！如果想最新的C++知识，推荐一本书《C++Primer（第五版）》，如果语言不太好，可以买中文版的（翻译的挺好，本人在用）。不过了解一些老的C++类也还是有用的，因为工作后公司很可能有很多以前开发的程序都是基于老标准的。

引用 5 楼 cyycxz 的回复:引用 3 楼 luoweifu 的回复:可以看你的书用的是什么或推荐什么开发环境，用与书配套的开发环境学起来会比较顺利（特别是新手）。还有就是看你的书是基于哪个标准的，如果是C++11标准（11年的新标准），在VS2010下有些新的类是不支持的，可以用VS2013。如果是基于98标准那就无所胃了。下面是书子底下小备注：从本书原版出版至今已有十多年过去了，微软的visual studio也早已不是当年的样子。读者的机器上或许已经安装了最新的visual studio 2008甚至2010测试版。本书中提到的有关visual c++ developer studio的内容已经多半不适用了，编程的方式也有些面目全非。我就是看到这个才觉得用VS2010不太合适，好像书里的范例是在VC6.0上运行的  1. 就用vs2010,哪些头文件找不到？可以自行百度的搜索答案 2. 用vc6

书上用哪个你就用哪个呗

引用 1 楼 user-7 的回复:不应该啊，和这个没关系吧不是吧

不应该啊，和这个没关系吧


Question: 快速排序的代码有不明白的地方，标题长长长长长长长

至于那个 if( i < j )，你注意上面的while有两个循环条件，因此while结束后，可能是因为不符合第一个条件结束的，也可能是不符合第二个条件结束的，这里if( i < j )就是判断是不是第一个条件导致while结束的

引用 3 楼 Forthe2012 的回复:[quote=引用 2 楼 czarten 的回复:] R[j]关键字小于X  注释的是上面那句= =  指针，这里的指针不是你想的那个指针，只是一种形象的说法，因为用i和j两个数字标记数组中的位置，就像两根指针一样 上面的那句是R[J]>=X啊。 还有，i，j是数组的下标吗？我觉得下标的话应该这样写啊（顺便那部分代码我觉得应该这样写） if(x<R[j]) 		{ 			/*交换R[i]和R[j]，交换后i指针加1*/ 			R[i]=R[j]; 			i++; 		}[/quote]  while(R[j]>=x) 也就是，只要R[j]>=x，就一直循环 所以当while循环结束的时候，就是R[j]<x了

是R[J]<X

引用 2 楼 czarten 的回复:R[j]关键字小于X  注释的是上面那句= =  指针，这里的指针不是你想的那个指针，只是一种形象的说法，因为用i和j两个数字标记数组中的位置，就像两根指针一样 上面的那句是R[J]>=X啊。 还有，i，j是数组的下标吗？我觉得下标的话应该这样写啊（顺便那部分代码我觉得应该这样写） if(x<R[j]) 		{ 			/*交换R[i]和R[j]，交换后i指针加1*/ 			R[i]=R[j]; 			i++; 		}

请教各位CSDN高人。 也许问题太不起眼了...


Question: 求助！！c语言中把一个txt文件读入到一个结构体内的问题

建议的很正确 结果正确

引用 2 楼 turingo 的回复:用fgets读取第一行，其数据不做处理就好了。  引用 1 楼 u012494310 的回复:大神在哪里？？？？恩恩，我自己试了一下可以了，谢谢你啦

引用 2 楼 turingo 的回复:用fgets读取第一行，其数据不做处理就好了。  引用 1 楼 u012494310 的回复:大神在哪里？？？？可以直接帮我填上去吗？？？？不太明白，初学者。。谢谢了

大神在哪里？？？？


Question: Ubuntu上不了网

NAT 不要设置 IP

重启一下试试呢

你的网卡配置不正确。。。设置IP DNS

ip地址不对


Question: 请高手帮忙看看我程序有啥问题？我觉得挺好的，但有些结果不对。

国际大学生程序设计竞赛的问题，一般得先用数学知识考虑一下，而不是直接用计算机暴力解决  问题：求n的阶乘最后一位非0数字，n是1到1000的数字。  规律： 1输出1 2输出2【1乘以2（对10取模）】 3输出6【2乘以3（对10取模）】 4输出4【6乘以4（对10取模），保留个位为4】 5输出2【4乘以5对10取模后，保留个位为2】 6输出2【2乘以6对10取模后，保留个位为2】  看出规律来了吗？  算法： n输出：（n-1的输出结果 乘以 n）对10取模后的个位数字 连阶乘的运算都省了，效率非常高，而且还不会溢出

仅供参考#include <iostream> #include <string> #include <algorithm> using namespace std; int COMPARE(string number1, string number2) {     int i,j;      int length1 = number1.size();     int length2 = number2.size();      if(number1.size() == 0) number1 = "0";     if(number2.size() == 0) number2 = "0";      j = 0;     for(i = 0; i < length1; ++i) {         if(number1[i] == '0') ++j;         else break;     }     number1 = number1.substr(j);      j = 0;     for(i = 0; i < length2; ++i) {         if(number2[i] == '0') ++j;         else break;     }     number2 = number2.substr(j);      length1 = number1.size();     length2 = number2.size();      if(length1 > length2) {         return 1;     } else if(length1 == length2) {         if(number1.compare(number2) > 0) {             return 1;         } else if(number1.compare(number2) == 0) {             return 0;         } else {             return -1;         }     } else {         return -1;     }      return 0; } string PLUS(string number1,string number2) {     int i;     int length1 = number1.size();     int length2 = number2.size();      string result="";      reverse(number1.begin(), number1.end());     reverse(number2.begin(), number2.end());      for(i = 0; i < length1 && i < length2; i++) {         char c = (char)(number1[i] + number2[i] - 48);         result = result + c;     }      while(i < length1) {         result = result + number1[i];         ++i;     }      while(i < length2) {         result = result + number2[i];         ++i;     }      int carry = 0;     for(i = 0; i < (int)result.size(); ++i) {         int value = result[i] - 48 + carry;         result[i] = (char)(value % 10 + 48);         carry = value / 10;     }      if(carry !=0 ) {         result = result + (char)(carry + 48);     }      for(i = result.size() - 1; i >= 0; i--) {         if(result[i] != '0') break;     }      result = result.substr(0, i + 1);      reverse(result.begin(), result.end());     if(result.length() == 0) result = "0";     return result; } string MINUS(string number1,string number2) {     int i;     string result = "";      int length1 = number1.size();     int length2 = number2.size();      if(COMPARE(number2,number1) > 0) {         return "-" + MINUS(number2, number1);     }      reverse(number1.begin(),number1.end());     reverse(number2.begin(),number2.end());      for(i = 0; i < length1 && i < length2; i++) {         char c = number1[i] - number2[i] + 48;         result = result + c;     }      if(i < length1) {         for(; i < length1; i++) {             result = result + number1[i];         }     }      int carry = 0;     for(i = 0; i < (int)result.length(); i++) {         int value = result[i] - 48 + carry;         if(value < 0) {             value = value + 10;             carry = -1;         } else carry = 0;         result[i]=(char)(value + 48);     }      for(i = result.size() - 1; i >= 0; i--) {         if(result[i] != '0')break;     }      result = result.substr(0, i+1);      reverse(result.begin(), result.end());     if(result.length()==0) result = "0";     return result; } string MULTIPLY(string number1, string number2) {     int i, j;     int *iresult;     int length1 = number1.size();     int length2 = number2.size();     string result = "";      reverse(number1.begin(), number1.end());     reverse(number2.begin(), number2.end());      iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));     memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));      for(i = 0; i < length1; i++) {         for(j = 0; j < length2; j++) {             iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));         }     }      int carry = 0;     for(i = 0; i < length1 + length2; i++) {         int value = iresult[i] + carry;         iresult[i] = value % 10;         carry = value / 10;     }      for(i = length1 + length2 - 1; i >= 0; i--) {         if(iresult[i] != 0)break;     }      for(; i >= 0; i--) {         result = result + (char)(iresult[i]+48);     }      free(iresult);      if(result == "") result = "0";     return result; } string factorial(string n) {     string temp = "1";     string i;     for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1")) {         temp = MULTIPLY(temp, i);     }     return temp; } int main(void) {     cout << factorial("1000") << endl;     return 0; }

Mark一下，蛮有趣的问题，考虑一下再回来回复

把int转换成字符串类型，对每一位进行比较可以么？

引用 12 楼 panasonic0804 的回复:Last no zero num of (250!) is: 2 Last no zero num of (251!) is: 4 不好意思，这两个数字好像不对  我的程序输出的结果是： Last non zero digit of (250!) is: 8 Last non zero digit of (251!) is: 8 感觉#21的应该是正确的……

按7楼思路简单写了个代码，500和1000验证是对的   int total2=0; int total3=0; int total7=0;  void get_value(int i ) { 	while (i%2==0) 	{ 		total2++; 		i=i/2; 	} 	while (i%5==0) 	{ 		i=i/5; 		total2--; 	} 	int remain = i%10; 	switch (remain) 	{ 		case 3: 			total3++; 			break; 		case 7: 			total7++; 			break; 		case 9: 			total3+=2; 			break;  	} }  int calc_number(int n) { 	int num3[]={1,3,9,7}; 	int num7[]={1,7,9,3}; 	int num2[]={6,2,4,8}; 	total2=0; 	total3=0; 	total7=0;  	for (int i =1;i<=n;i++) 	{ 		if (i%2==0 || i%5==0) 			get_value(i); 		else if (i%10==3) 			total3++; 		else if (i%10==7) 			total7++; 		else if (i%10==9) 			total3+=2;  	}    	printf("%d! ,total2=%d,total3=%d,total7=%d ",n,total2,total3,total7); 	total2 = total2%4; 	total3%=4; 	total7%=4;  	int res = num2[total2]* num3[total3]*num7[total7]%10; 	printf("res=%d \n ",res); 	return res; }

7楼思路应该是正确的，

不好意思，#20的代码有些问题 #include <stdio.h> void main() { 	long lastEffectNumber = 1; 	for (int nn = 1; nn <= 1000; nn++) { 		lastEffectNumber *= nn; 		while (lastEffectNumber % 10 == 0) { lastEffectNumber /= 10;} 		lastEffectNumber %= 1000*10; 		printf("Last non zero digit of (%d!) is: %d\n", nn, lastEffectNumber % 10); 	} } 完整输出： http://my.bccn.net/paste/1148/

乘积溢出的时候结果就不对了

引用 楼主 soft_hardd 的回复:int sum_r(int input_num) {          if (input_num < 1 || input_num > 1000) 	{ 		return 0; 	} 	if (input_num == 1 || input_num == 2) 	{ 		return input_num;         } 	else 	{ 		return get_last_r(get_last_r(input_num*(input_num-1)) * sum_r(input_num-2)); 	} }  问题出在当前有效位和下一个数有效相乘时结果正好为10的倍数时，所获得结果有效位是无效的。例如12 x 15时。

Last no zero num of (1!) is: 1 Last no zero num of (2!) is: 2 Last no zero num of (3!) is: 6 Last no zero num of (4!) is: 4 Last no zero num of (5!) is: 2 Last no zero num of (6!) is: 2 Last no zero num of (7!) is: 4 Last no zero num of (8!) is: 2 Last no zero num of (9!) is: 8 Last no zero num of (10!) is: 8 Last no zero num of (11!) is: 8 Last no zero num of (12!) is: 6 Last no zero num of (13!) is: 8 Last no zero num of (14!) is: 2 Last no zero num of (15!) is: 8 Last no zero num of (16!) is: 8 Last no zero num of (17!) is: 6 Last no zero num of (18!) is: 8 Last no zero num of (19!) is: 2 Last no zero num of (20!) is: 4 Last no zero num of (21!) is: 4 Last no zero num of (22!) is: 8 Last no zero num of (23!) is: 4 Last no zero num of (24!) is: 6 Last no zero num of (25!) is: 4 Last no zero num of (26!) is: 4 Last no zero num of (27!) is: 8 Last no zero num of (28!) is: 4 Last no zero num of (29!) is: 6 Last no zero num of (30!) is: 8 Last no zero num of (31!) is: 8 Last no zero num of (32!) is: 6 Last no zero num of (33!) is: 8 Last no zero num of (34!) is: 2 Last no zero num of (35!) is: 2 Last no zero num of (36!) is: 2 Last no zero num of (37!) is: 4 Last no zero num of (38!) is: 2 Last no zero num of (39!) is: 8 Last no zero num of (40!) is: 2 ... Last no zero num of (100!) is: 4 ... Last no zero num of (200!) is: 2 Last no zero num of (201!) is: 2 Last no zero num of (202!) is: 4 Last no zero num of (203!) is: 2 Last no zero num of (204!) is: 8 Last no zero num of (205!) is: 4 Last no zero num of (206!) is: 4 Last no zero num of (207!) is: 8 Last no zero num of (208!) is: 4 Last no zero num of (209!) is: 6 Last no zero num of (210!) is: 6 Last no zero num of (211!) is: 6 Last no zero num of (212!) is: 2 Last no zero num of (213!) is: 6 Last no zero num of (214!) is: 4 Last no zero num of (215!) is: 6 Last no zero num of (216!) is: 6 Last no zero num of (217!) is: 2 Last no zero num of (218!) is: 6 Last no zero num of (219!) is: 4 Last no zero num of (220!) is: 8 Last no zero num of (221!) is: 8 Last no zero num of (222!) is: 6 Last no zero num of (223!) is: 8 Last no zero num of (224!) is: 2 Last no zero num of (225!) is: 2 Last no zero num of (226!) is: 2 Last no zero num of (227!) is: 4 Last no zero num of (228!) is: 2 Last no zero num of (229!) is: 8 Last no zero num of (230!) is: 4 Last no zero num of (231!) is: 4 Last no zero num of (232!) is: 8 Last no zero num of (233!) is: 4 Last no zero num of (234!) is: 6 Last no zero num of (235!) is: 6 Last no zero num of (236!) is: 6 Last no zero num of (237!) is: 2 Last no zero num of (238!) is: 6 Last no zero num of (239!) is: 4 Last no zero num of (240!) is: 6 Last no zero num of (241!) is: 6 Last no zero num of (242!) is: 2 Last no zero num of (243!) is: 6 Last no zero num of (244!) is: 4 Last no zero num of (245!) is: 8 Last no zero num of (246!) is: 8 Last no zero num of (247!) is: 6 Last no zero num of (248!) is: 8 Last no zero num of (249!) is: 2 Last no zero num of (250!) is: 2 Last no zero num of (251!) is: 4 Last no zero num of (252!) is: 6 Last no zero num of (253!) is: 8 Last no zero num of (254!) is: 2 Last no zero num of (255!) is: 6 Last no zero num of (256!) is: 6 Last no zero num of (257!) is: 2 Last no zero num of (258!) is: 6 Last no zero num of (259!) is: 4 Last no zero num of (260!) is: 4 Last no zero num of (261!) is: 4 Last no zero num of (262!) is: 8 Last no zero num of (263!) is: 4 Last no zero num of (264!) is: 6 Last no zero num of (265!) is: 4 Last no zero num of (266!) is: 4 Last no zero num of (267!) is: 8 Last no zero num of (268!) is: 4 Last no zero num of (269!) is: 6 Last no zero num of (270!) is: 2 Last no zero num of (271!) is: 2 Last no zero num of (272!) is: 4 Last no zero num of (273!) is: 2 Last no zero num of (274!) is: 8 Last no zero num of (275!) is: 2 Last no zero num of (276!) is: 2 Last no zero num of (277!) is: 4 Last no zero num of (278!) is: 2 Last no zero num of (279!) is: 8 Last no zero num of (280!) is: 4 Last no zero num of (281!) is: 4 Last no zero num of (282!) is: 8 Last no zero num of (283!) is: 4 Last no zero num of (284!) is: 6 Last no zero num of (285!) is: 6 Last no zero num of (286!) is: 6 Last no zero num of (287!) is: 2 Last no zero num of (288!) is: 6 Last no zero num of (289!) is: 4 Last no zero num of (290!) is: 6 Last no zero num of (291!) is: 6 Last no zero num of (292!) is: 2 Last no zero num of (293!) is: 6 Last no zero num of (294!) is: 4 Last no zero num of (295!) is: 8 Last no zero num of (296!) is: 8 Last no zero num of (297!) is: 6 Last no zero num of (298!) is: 8 Last no zero num of (299!) is: 2 Last no zero num of (300!) is: 6 .... Last no zero num of (400!) is: 8 ... Last no zero num of (500!) is: 4 ... Last no zero num of (600!) is: 6 ..... Last no zero num of (700!) is: 4 ... Last no zero num of (799!) is: 2 Last no zero num of (800!) is: 6 Last no zero num of (801!) is: 6 ... Last no zero num of (899!) is: 8 Last no zero num of (900!) is: 2 Last no zero num of (901!) is: 2 Last no zero num of (902!) is: 4 Last no zero num of (903!) is: 2 Last no zero num of (904!) is: 8 Last no zero num of (905!) is: 4 Last no zero num of (906!) is: 4 Last no zero num of (907!) is: 8 Last no zero num of (908!) is: 4 Last no zero num of (909!) is: 6 Last no zero num of (910!) is: 6 Last no zero num of (911!) is: 6 Last no zero num of (912!) is: 2 Last no zero num of (913!) is: 6 Last no zero num of (914!) is: 4 Last no zero num of (915!) is: 6 Last no zero num of (916!) is: 6 Last no zero num of (917!) is: 2 Last no zero num of (918!) is: 6 Last no zero num of (919!) is: 4 Last no zero num of (920!) is: 8 Last no zero num of (921!) is: 8 Last no zero num of (922!) is: 6 Last no zero num of (923!) is: 8 Last no zero num of (924!) is: 2 Last no zero num of (925!) is: 6 Last no zero num of (926!) is: 6 Last no zero num of (927!) is: 2 Last no zero num of (928!) is: 6 Last no zero num of (929!) is: 4 Last no zero num of (930!) is: 2 Last no zero num of (931!) is: 2 Last no zero num of (932!) is: 4 Last no zero num of (933!) is: 2 Last no zero num of (934!) is: 8 Last no zero num of (935!) is: 8 Last no zero num of (936!) is: 8 Last no zero num of (937!) is: 6 Last no zero num of (938!) is: 8 Last no zero num of (939!) is: 2 Last no zero num of (940!) is: 8 Last no zero num of (941!) is: 8 Last no zero num of (942!) is: 6 Last no zero num of (943!) is: 8 Last no zero num of (944!) is: 2 Last no zero num of (945!) is: 4 Last no zero num of (946!) is: 4 Last no zero num of (947!) is: 8 Last no zero num of (948!) is: 4 Last no zero num of (949!) is: 6 Last no zero num of (950!) is: 2 Last no zero num of (951!) is: 2 Last no zero num of (952!) is: 4 Last no zero num of (953!) is: 2 Last no zero num of (954!) is: 8 Last no zero num of (955!) is: 4 Last no zero num of (956!) is: 4 Last no zero num of (957!) is: 8 Last no zero num of (958!) is: 4 Last no zero num of (959!) is: 6 Last no zero num of (960!) is: 6 Last no zero num of (961!) is: 6 Last no zero num of (962!) is: 2 Last no zero num of (963!) is: 6 Last no zero num of (964!) is: 4 Last no zero num of (965!) is: 6 Last no zero num of (966!) is: 6 Last no zero num of (967!) is: 2 Last no zero num of (968!) is: 6 Last no zero num of (969!) is: 4 Last no zero num of (970!) is: 8 Last no zero num of (971!) is: 8 Last no zero num of (972!) is: 6 Last no zero num of (973!) is: 8 Last no zero num of (974!) is: 2 Last no zero num of (975!) is: 2 Last no zero num of (976!) is: 2 Last no zero num of (977!) is: 4 Last no zero num of (978!) is: 2 Last no zero num of (979!) is: 8 Last no zero num of (980!) is: 4 Last no zero num of (981!) is: 4 Last no zero num of (982!) is: 8 Last no zero num of (983!) is: 4 Last no zero num of (984!) is: 6 Last no zero num of (985!) is: 6 Last no zero num of (986!) is: 6 Last no zero num of (987!) is: 2 Last no zero num of (988!) is: 6 Last no zero num of (989!) is: 4 Last no zero num of (990!) is: 6 Last no zero num of (991!) is: 6 Last no zero num of (992!) is: 2 Last no zero num of (993!) is: 6 Last no zero num of (994!) is: 4 Last no zero num of (995!) is: 8 Last no zero num of (996!) is: 8 Last no zero num of (997!) is: 6 Last no zero num of (998!) is: 8 Last no zero num of (999!) is: 2 Last no zero num of (1000!) is: 2

引用 2 楼 A3872215 的回复:我语文不好 这句没看懂  ：“求n的阶乘最后一位非0数字”  我觉得意思是 因为1到n之间有很多10的倍数，所以n的阶乘肯定是后面一串0，要求的是最低的非0位

直接计算的话,要算出每一个数是2，5 几次幂的倍数  并滤掉 2，5因子 求出不含 2，5因子的个位数 然后根据去掉末尾的0后，2的因子个数，  计算出结果中2因子乘积的个位数，和滤掉 2，5因子后乘积的个位数相乘， 算出个位数。 不过，效率不高

int get_last_r(int num) {         int rslt = 1;         while(!(rslt=num%10)) num = num / 10;         return rslt; } 楼主，你这个函数应该是求num的最低位吧。如果是，那么while(!(rslt=num%10)) num = num / 10;算法可疑。你可举例num=100.你的rslt结果是1而不是0.

（num3[b %4] *num7[c%3]*num9[d%2] *num2[e%4]） %10

这个，这么算不会出现溢出  计算 排除2，5因子以后，因子序列 中个位是 1，3，7，9 的个数a,b,c,d 然后计算 因子2的比因子5多多少,得到因子2的个数e  剩余因子2的个数e =总的因子2 个数- 总的因子 5 个数 +总的因子10的个数  1）1，3，7，9 个数  参与形成个位数 2）2^k 的倍数中除以2^k后    个位数是 1，3，7，9 个数这些数个位为2 和5结合形成0 或者保留为2的幂，所以其中的 1，3，7，9 参与形成个位数                                         3）5^k 的倍数中除以5^k后，个位数是 1，3，7，9 个数；这些数个位为5 和2结合形成0 所以 1，3，7，9 参与形成个位数                                         4）10^k 的倍数中除以10^k  个位数是 1，3，7，9 个数 //这些数末位为0 所以1，3，7，9 参与形成个位数  结果是 1^a *3^b*7^c*9^d *2^ e =3^b*7^c*9^d *2^ e 的个位数  = num3[b %4] *num7[c%3]*num9[d%2] *num2[e%4]) %10  num3[]={3,9,7,1} num7[]={7,9,1} num9[]={9,1} num2[]={2,4,6,8};    因为： 1的幂序列的个位数1 3的幂序列的个位数3，9，7，1   7的幂序列的个位数7，9，1 9的幂序列的个位数9，1 2的幂序列的个位数 是2，4，8，6.。。。。。  这里，如何防止多统计或者漏统计，是这个算法的核心

2和5相乘就有0了啊, 那不是4!才是最后一个吗

引用 2 楼 A3872215 的回复:我语文不好 这句没看懂  ：“求n的阶乘最后一位非0数字” lz出来解释一下吧

看楼主是用的递归求的阶乘，但是input>30的时候会溢出啊，你确定1~70验证是对的？


Question: 堆栈问题

什么时候会出问题

引用 1 楼 user-1 的回复:debug？？是呀~但是现在还没解决、菜鸟苦逼了

debug？？


Question: C语言中前导空格后继空格等概念

这不是C语言专业词汇 应该是个人的称呼

C语言没这种概念。

引用 3 楼 user-3 的回复:编程中没有空格限制。。   还有没有其他什么类似这种的概念呢？ 感觉只看了基础教程，还有好多东西不知道。。。。 看程序的时候经常会遇到很难理解的段落，就像这次的“前导空格”看了好久都没明白，于是问了网上，才了解到“前导空格”。

编程中没有空格限制。。


Question: error C2143: 语法错误 : 缺少“｛”(在“类型”的前面)

引用 楼主 eknas111 的回复:编译头文件的时候 总是报错 第21行  #ifndef UTIL_H #define UTIL_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <math.h> #include <time.h> #include "param.h" #define BLOCK_WIDTH 16 #define BLOCK_HEIGHT 16 #define MAX_INT 255*BLOCK_WIDTH*BLOCK_HEIGHT+1 #define ODD 0 #define EVEN 1 #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a)<(b))?(a):(b)) #define swap(a,b,tmp) ((tmp)=(a),(a)=(b),(b)=(tmp)) #define abs(x) ((x) <0 ? -(x) : (x)) #define cint(x) ((x)+(x)%2) #define MAX_DISP 7 typedef u_char **BLOCK; typedef struct {    char   x;    char   y; } MV; typedef struct {    MV     mv;    char   f; } MVF; typedef struct {    MV   mv;    int   mae; } ME; #ifdef OPC typedef struct {    double a;    double p;    double c; } OP; extern   OP   op; extern double ls; extern double op_m; int merr_update; #endif const double mult_p[16],mult_ls[16];  //For UCBDS, HEX, CDS, a more precise in counting the no. of search point. int searchedpt[MAX_DISP*2+1][MAX_DISP*2+1];  //For method 33, FS with different number of pels in the SAD. extern int no_of_pel; int pel_loc[16][16];  extern   int   im_width, im_height, mv_width, mv_height; extern   int   im_width2, im_height2, mv_width, mv_height; extern   int   re_width,re_height,re_width2,re_height2; extern const u_char KK[16], LL[16]; void pgm_header(char *name, int width, int height); void g_alloc(u_char ***buf, int width, int height, int size); u_char *block_alloc(int width, int height); void block_free(void **buf); MV **mv_alloc(int width, int height); MVF **mvf_alloc(int width, int height); ME **me_alloc(int width, int height); void readframe(FILE *fp, u_char *frame, int width, int height); void res_image(u_char *ref, u_char *res, MV **mv); void hres_image(u_char *ref, u_char *res, MV **imv, MV **hmv); void fres_image(u_char *ref, u_char *res, MVF **mvt, MVF **mvb); void writeframe(FILE *fp, u_char *frame, int width, int height); int gradx(u_char *a_block, int x, int y, int width); int grady(u_char *a_block, int x, int y, int width); int mean_abs_err(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height); int num_of_pels4mean_abs_err(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int numpel); int half_stop_mean_abs_err(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int merr); int liu_abs_err(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int px, int py); int npd_mean_abs_err(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int merr); void merr_p_update(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int merr); int pdcf(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height); int smean_abs_err1(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int space); int smean_abs_err2(u_char *a_block, u_char *b_block, int x, int y, int m, int n, int width, int height, int space); double mean_squ_err(u_char *a_block, u_char *b_block, int width, int height); int abs_var(u_char *block, int x, int y, int h_length); void sub_block(BLOCK a_block, BLOCK s_block, int x, int y, int height); void interpolate_frame(u_char *ipol_image, u_char *image, int width, int height); void mult1_16(int x, int d, int *p); void gen_mult(int x, int d, int *p); BLOCK sub_alloc(int height); void sort_me(ME *buf, int no, int to); void insert_me(ME **buf, int no); void bi_insert_me(ME **buf, int no); char med(char a, char b, char c); void alloc_fail(void); void fopen_err(void); void init_searchedpt(void); int count_searchedpt(void); void print_searchedpt(void); #endif 神马编译给你报错,运行时段错误这种,自己仔细老老实实的找,这是基本功,只要你想从事这行怎么也跑不掉

你定义的BLOCK为一个二级指针类型，那么看你的使用该类型时是否是类型匹配的。你的排版太密集，没有详看。

typedef是为现有类型创建一个新的名字，typedef u_char **BLOCK这句话显然不对， 应该是typedef 类型名 新类型名,你是要 typedef unsigned char **BLOCK吗？

实在没有耐力把你的那段代码看完，太费劲！

括号没有配对呗，好好检查一下

util.h(21): error C2143: 语法错误 : 缺少“{”(在“*”的前面)

详细的错误信息，光这一句....让大家猜迷啊...

第21行是 typedef u_char **BLOCK;

鬼知道你的21行在哪


Question: 用vi编译器输入源代码保存后怎么运行呢

vi就好想Windows下的记事本，只是用来编辑代码的。你如果想运行编辑后的代码，需要先使用g++或其它编译器，把它编译成可执行文件，再运行

这样的话，建议你： sudo apt-get install codeblocks 然后在Code::Blocks环境下学习和调试C代码。  引用 楼主 u013907296 的回复:比如hello world，输完后怎么让它显示出来呢大神不要嫌弃，新手啊

学习编程还是用VS来学习。。

1、vi是编辑器，不加编译器 2、先编译 按: 然后输入 !g++ % 3、:!./a.out


Question: fread一个一个读不成功，请大虾讲解：）

引用 5 楼 u012903205 的回复:[quote=引用 1 楼 gqjjqg 的回复:]  int i = 6; while(i--)           {             if ( feof(fp2) ) { break; }           // 我错了，这个要取地址，另外 这里读取出来的数据是反序，输出时 也反序输出应该就好了。           fread(&b[i],sizeof(char), 1, fp2);//一次一个地读             //这里先省略一次一个地写fwrite(b,1,1,XX)             //printf("数据已经读取到%s\n", b);              }   我按照你的改了后也不对，编译器报错的[/quote]  对不起，回复的仓促了，改了。

引用 4 楼 ovoovo 的回复:一个汉字占两字节，你试试一次读两字节看看。 再一个，你的b，分配内存大一点。  我想一个一个读，然后一次性读倒是可以的

fread一次性读取可以的，没有出现错误

引用 1 楼 gqjjqg 的回复: int i = 6; while(i--)           {             if ( feof(fp2) ) { break; }             fread(b[i],sizeof(char), 1, fp2);//一次一个地读             //这里先省略一次一个地写fwrite(b,1,1,XX)             //printf("数据已经读取到%s\n", b);              }   我按照你的改了后也不对，编译器报错的

一个汉字占两字节，你试试一次读两字节看看。 再一个，你的b，分配内存大一点。

fread貌似是二进制文件专用吧。。我目前也复习到这里了，

本人认为事 字符编码 的问题 因为 你文档是汉字，用 字符就 ok 老师教我们的时候，一般是用fwrite写入，再用 fread读取，这样不容易出现乱码。


Question: gcc的宏定义参数可以为函数调用？？求指教～

引用 5 楼 bluesky12312388 的回复:是gcc对宏的扩展。  参考http://book.51cto.com/art/201007/213547.htm 谢谢！

引用 6 楼 gqjjqg 的回复:少些兼容性不好的代码，对大家都好... 是我要用别人的代码，呵呵

少些兼容性不好的代码，对大家都好...

这是 gcc 的用法，VC 曾经盼望已久的用法。

也不对，似乎是括号的问题，不知道是什么个讲法，切换了c99也还是这样…

似乎是宏定义中不能嵌套变量定义的问题…gcc中可以通过。有什么说法么？

#define MAX(x,y) 之前加个声明试试  int temp(int a,int b);


Question: 谁能帮忙解释下这个程序,是如何判断一个数是质数,谢谢!

引用 1 楼 user-3 的回复:这算法不是算质数的把？ 给个数8，返回应该是true，显然不对  是算质数的，不过直接从3开始试，忽略掉2了 我估计调用这函数的外层把2判断掉了

while (square < candidate && (candidate % divisor))  square是divisor的平方，square<candidate 就是 divisor<根号candidate candidate % divisor就是原数能不能整除divisor，能整除的话其值为0，跳出while循环  整个过程就是，candidate为原数，然后用3,5,7……依次去试除原数，一直试到根号candidate为止，后面不用试了，这个懂吧？  如果中途出现了某个divisor可以整除原数，或是divisor超过了根号candidate，那么就可以确定是不是质数了，循环跳出    话说这程序怎么写得莫名其妙，毫无可读性

这个程序没什么复杂的吧。不过质数是什么数呢？忘光了，呵呵

这算法不是算质数的把？ 给个数8，返回应该是true，显然不对


Question: IOCP 实现时，句柄关闭 问题

就这几行代码来说 在循环里建立的 它的目的不过是建立后打印哈建立结果  然后不用了 就管了啊 不然其他地方关闭很费事

不想操作该线程句柄就关了，线程还是跑起在。


Question: udp 多线程 c++ 聊天

一个send对应一个recv，一个recv对应一个send，贴出编译错误提示吧

UDP不可靠、基于包； TCP可靠、基于流。

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

是怎么样的错误情况？服务端没收到还是客户端未发送？找个抓包工具先看看。

请在线程函数中下断点, 单步执行, 看运行到哪里了

问题好笼统的说！！


Question: GCC+Emacs如何调试运行C语言程序？

;;启动gdb-many-windows时加载的钩子函数，改变many-windows的默认布局，这个钩子函数不能勾在gdb-setup-windows，因为此时assamble-buffer还没完成初始化，不能set到window   (defadvice gdb-frame-handler-1 (after activate)     (if gdb-use-separate-io-buffer         (advice_separate_io)       (advice_no_separate_io)))      ;;生成没有单独IO窗口的gdb布局   (defun advice_no_separate_io()   ;;默认的生成gdb-assembler-buffer的函数本身也会设计调用gdb-frame-handler-1，加入此条件发生避免无限递归调用     (if (not (gdb-get-buffer 'gdb-assembler-buffer))         (progn       (shrink-window-horizontally ( / (window-width) 3))          (other-window 1)       (split-window-horizontally)          (other-window 1)       (gdb-set-window-buffer (gdb-stack-buffer-name))          (other-window 1)       (split-window-horizontally)          (other-window 1)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))          (split-window-horizontally  (/ ( * (window-width) 2) 3))          (other-window 1)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-registers-buffer))          (other-window 1)       (toggle-current-window-dedication)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-memory-buffer))       (toggle-current-window-dedication)          (other-window 2)       )))      ;;生成有单独IO窗口的gdb布局   (defun advice_separate_io()   ;;默认的生成gdb-assembler-buffer的函数本身也会设计调用gdb-frame-handler-1，加入此条件发生避免无限递归调用     (if (not (gdb-get-buffer 'gdb-assembler-buffer))         (progn       (split-window-horizontally)       (enlarge-window-horizontally ( / (window-width) 3))       (other-window 1)          ;;此处不能使用(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-inferior-io))代替，       ;;因为在打开gdb-use-separate-io-buffer的状态时，它还会额外调用一些函数将gdb的input，output定位到该buffer       (gdb-set-window-buffer (gdb-inferior-io-name))          (other-window 1)       (split-window-horizontally)          (other-window 1)       (gdb-set-window-buffer (gdb-stack-buffer-name))          (other-window 1)          (other-window 1)       (toggle-current-window-dedication)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))       (toggle-current-window-dedication)          (split-window-horizontally  (/ ( * (window-width) 2) 3))          (other-window 1)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-registers-buffer))          (other-window 1)       (toggle-current-window-dedication)       (gdb-set-window-buffer (gdb-get-buffer-create 'gdb-memory-buffer))       (toggle-current-window-dedication)          (other-window 2)       )))

linux下面调试痛苦是可想而知的，要有心理准备，经历痛苦之后就成为了高手。

gdb很好用，花点时间是值得的。

gdb是调试的核心，你可以用vim/emacs或者是eclipse去配置调试的GUI  引用 楼主 GongZiXiaoBai_ 的回复:在CentOS下如何调试运行C语言程序？除了GDB还有没有更好的方法？ 感觉在Windows下VS平台调试运行很直观，到每一步可以看到变量地址和变量值，Linux下有没有类似的操作？


Question: 初学者的弱弱的问题

踏踏实实看本书，边看边写。这样收获也不小了

还是看书吧，找本基础的c语言教材，先走一遍下来。

参考书： C语言程序开发范例宝典(第2版) C语言经典编程282例 网上书店或淘宝有。

书 C Primer Plus 或者 谭浩强的 视频 赫斌C语言

下个小巧的编程器吧，minGW studio 学编程一定要多动手，不管是看视频还是看书还是其他方式，动手进行编程实验才是最最重要的，不动手敲代码编程实验永远别指望学会C语言！

先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

C语言视频：  http://www.tudou.com/home/93506222  建议你去看看，适合新手。从内存角度去讲解的。

到底是想学C还是想学C++？

直接看书吧， 《C和指针》

C语言推荐郝斌老师的视频——http://www.xuexi111.com/jiaocheng/shipin/26243.html，C++推荐孙鑫的——http://club.topsage.com/thread-156290-1-1.html


Question: 数据库 float问题

引用 3 楼 caozhy 的回复:你有没有为float分配空间，输入的是否合法。 恩恩，最后又找到错误了。谢谢啊。大版主

引用 1 楼 turingo 的回复:可以把float转为字符串进行数据库存取。  [quote=引用 楼主 u012620726 的回复:] 我想把一个结构体中的数据 存到 数据库中， 当scanf输入float类型的时候就报错了。Memory fault(coredump)；这个问题怎么解决啊[/quote] 就是啊，最后还是转成字符串来读取了。。

你有没有为float分配空间，输入的是否合法。

引用这个问题怎么解决啊 先找到coredump的原因

可以把float转为字符串进行数据库存取。  引用 楼主 u012620726 的回复:我想把一个结构体中的数据 存到 数据库中， 当scanf输入float类型的时候就报错了。Memory fault(coredump)；这个问题怎么解决啊


Question: 怎样使用api来控制u盘的拔插？

被弹出的U盘需要物理拔除, 再物理插入才可以.

usb总线重新枚举需要把设备的电源断开。

需要重新插入U盘才行。  引用 楼主 wangbaomi 的回复:我用CM_Request_Device_Eject函数  把U盘弹出后，怎样重新找回U盘呢？  该用哪个api？


Question: 请教各位大神一个问题

那边给钱多就学哪个

借助一些教程资料自己下功夫学吧，每天保证一定的代码量，这里教程比较全： http://www.xiaodianlv.com/group/cyvyan/

无所谓什么语言……只要学会一门其它的就好学了……重在坚持！！！

恩恩 我还是先入手的事python然后在反过来学C

python容易上手的！C语言相对来说复杂点

谁说c语言是最基础的了 不一定啊楼主 不要先入为主

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

推荐先学C语言，其他语言在工作的就很容易学了。

引用 1 楼 user-9 的回复:每种通用语言都有不同的适用范围和特点 没有任何一门语言必须以另一门语言为前提，实际上如果你在一门语言上学艺不精，反而会影响你学习另一门语言 所以不管你学哪种语言，在精通之前，忘记这世上存在其他语言 +1

据说学好C了再学其它就好学了，对于学C，我推荐郝斌老师的视频，浅显易懂，适合入门，这是地址——http://www.xuexi111.com/jiaocheng/shipin/26243.html 你可以下载一两个看看

谢谢你啦，感谢感谢 坚持就是最好的


Question: C语言菜鸟一枚 在线求救！！！

引用 7 楼 u013892653 的回复:[quote=引用 6 楼 nadleeh123 的回复:] [quote=引用 楼主 u013892653 的回复:] 各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答…… 请用scanf_s scanf这种没有丝毫差错判断的函数拿来干嘛?[/quote] scanf_s这个命令只能在vs上使用不是吗？[/quote] C11标准转正了

引用 6 楼 nadleeh123 的回复:[quote=引用 楼主 u013892653 的回复:] 各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答…… 请用scanf_s scanf这种没有丝毫差错判断的函数拿来干嘛?[/quote] scanf_s这个命令只能在vs上使用不是吗？

引用 楼主 u013892653 的回复:各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答…… 请用scanf_s scanf这种没有丝毫差错判断的函数拿来干嘛?

意思就是重新建一个project来运行？    顺便一小问：请问怎么生成exe文件啊？

exe损坏了估计，把项目从新生成一下。或者重新新建一个

……提醒大大：可以点击放大的说...

重新build一下

图片中的文字看不清楚  引用 楼主 u013892653 的回复:各位大大好 小弟现在正开始学习C语言 用的是vs 2013 今天在复习代码的时候遇到一个很奇怪的问题希望大家求教      请问这是怎么回事== 昨天运行这个代码还妥妥的，怎么今天就不能了？ hello world有没问题…… 求老鸟解答……


Question: 为什么计算机采用最高位1为负数，0为正数这种规则？有什么深层次的原因吗？

引用 9 楼 u013106556 的回复:[quote=引用 6 楼 czarten 的回复:] 人眼看来最直观的方案是原码 但原码有两个0，正0和负0，因此“看起来直观”的代价是计算混乱  另外一个方案是移码，移码的问题在于，由于每个数都自带一个偏移量，当两数相加或相减时，偏移量就会出问题，同样计算麻烦  再就是补码了，补码你一开始会觉得很难理解，不明白为什么规定成这样，其实理解了之后也是很直观的：就是一个正数不断增大，增大到破表就变成了负数，相当于最大的数+1等于最小的数，也就是把整个值域连成了一个环，你玩过贪吃蛇吗，蛇从左边出界会从右边进来  补码的逆天之处在于，它的加减法可以无视两数符号，正数+正数，负数+负数，正数+负数，负数+正数，都是一样的算法，而其它方案就要根据两数符号采取不同的步骤，因此“人眼不直观”带来的好处是“机器容易算”  但是，补码乘除法就没那么方便了，不过其它码的乘除法也没方便到哪去，因此补码是最佳选择受教了，许多细节需要自己仔细琢磨。。。[/quote] 补码就是只需要完成加法的电路，就能实现加减法。

计算机组成原理, 再去复习复习.

最高位1为负数，0为正数这种规则的最简单解释是：系统扩充位数的时候比较便利，只需要用最高位填充就可以保持不变。 如果你要问为什么是补码，请参照上面的答案。

引用 6 楼 czarten 的回复:人眼看来最直观的方案是原码 但原码有两个0，正0和负0，因此“看起来直观”的代价是计算混乱  另外一个方案是移码，移码的问题在于，由于每个数都自带一个偏移量，当两数相加或相减时，偏移量就会出问题，同样计算麻烦  再就是补码了，补码你一开始会觉得很难理解，不明白为什么规定成这样，其实理解了之后也是很直观的：就是一个正数不断增大，增大到破表就变成了负数，相当于最大的数+1等于最小的数，也就是把整个值域连成了一个环，你玩过贪吃蛇吗，蛇从左边出界会从右边进来  补码的逆天之处在于，它的加减法可以无视两数符号，正数+正数，负数+负数，正数+负数，负数+正数，都是一样的算法，而其它方案就要根据两数符号采取不同的步骤，因此“人眼不直观”带来的好处是“机器容易算”  但是，补码乘除法就没那么方便了，不过其它码的乘除法也没方便到哪去，因此补码是最佳选择受教了，许多细节需要自己仔细琢磨。。。

引用 5 楼 zhao4zhong1 的回复:王八的屁股——龟腚！（规定）可能确实这样。。

引用 1 楼 user-9 的回复:你有什么更好的办法来标识正负数吗？没有，呵呵。可能自己没理解到采用这种方法的便利之处吧。

王八的屁股——龟腚！（规定）

baidu一下"补码"

有助于有符号和无符号的转换？

兼顾效率和封闭性的人为约定，除非你有更合适的方法。  引用 楼主 u013106556 的回复:看到8位char类型的数据范围为-128~127,其推导设定采用最高位1为负数，0为正数这种规则，是人为规定的还是什么原因？

你有什么更好的办法来标识正负数吗？


Question: 学c新手，求指出错误

要么把max放在main之前，要么在前面写上max的定义，就好了

max 函数已经被minwindef.h中定义，不能再作为函数名

Max函数要在Main之前定义一下下。。。

这个真是低级错误啊。int max(int A[100]);main前要有函数的定义，main是一个主函数，要调用其它的函数之前，必须要在它上面有定义过。

已知： 有max函数 int A[100] main函数中调用max    数组作为实参传递可以直接传递数组名就行，比如max（A）    数组作为形参接收可以直接max（int A[]）或者max(int *A)  两种情况在max中使用的时候都可以以下标方式访问。虽然两种表示不一样，但是对于形参A，都是一个指针，因为数组名作为函数参数传递的时候会退化成指针。

以下程序应该是楼主想要的，请参考   #include "stdio.h"  int max(int A[100]);  int main(void) {     int a[100];     int i;     printf("产生的100个随机数分别为：\n");      /* 产生100个0~99的整型随机数，并存储在一维数组中 */     for(i=0;i<100;i++)     {         a[i]=rand()%99;           /* a从10-99之间取值，即a是两位数 */         printf("%d    ",a[i]);     }     printf("\n");          max(a);              return 0; }      int max(int A[100])               /* 常规算法 */ {     int m=A[0], j;     for(j=1;j<100;j++)     {         if (m<A[j])          m=A[j];     }     printf("%d\n",m);     return m; }

引用 1 楼 baichi4141 的回复:第一：  local 局部 function 函数 definitions 定义 are 是 illegal 非法的  第二：  int max(int (A[100])) if m<A[j]  没见过这两种写法+1

函数输入不对？?

引用 6 楼 u013890716 的回复:/* 减半递推计算法和递归函数调用 */      void MAX(int A[],int p,int q) 	{ 		if(p=q)  int n=A[p]; 		else  		{ 			int M1=MAX(A,p,(p+q)/2); 			int M2=MAX(A,(p+q)/2,q); 			if (M1>M2) n=M1; 			else n=M2; 		} 		printf("方法1最大值:%d", n); 	    printf("\n\n\n"); 	 	}     MAX(a[],0,99);  请告诉我定义有什么问题，之前一直学的用的都是c++,今天下午才接触c语言  1.if(p=q)等号错了 2.你在if里面定义的n，当然不能在else里用，你可以把int n拿到外面，然后if和else里分别赋值  另外你是如何做到一直用C++却不懂C语言基础的

同是菜鸟  可否一起学习

引用 4 楼 u013890716 的回复:求问C语言怎样定义数组为参量的函数，可以给个例子吗 在C/C++中，数组除了定义之外不能整体操作，大部分对数组的操作都是使用指向数组首元素的指针和数组长度两个参数 建议初学者不要要求语言提供自己想要的功能，而是去了解语言有哪些功能之后思考如何使用

求问C语言怎样定义数组为参量的函数，可以给个例子吗

把max函数定义在main函数之前。

int max(int A[])


Question: matlab 与c混编

折腾过一段时间，貌似没啥用。


Question: win32 程序DialogBox使用问题

问题已经解决

资源的头文件里没有定义

能把代码贴出来吗？

问题没有解决，等待回答


Question: C语言  有关素数  自己的代码效率好低= =

参考http://blog.csdn.net/turingo/article/details/8161061  引用 楼主 u013850910 的回复: 希望大神提供一下代码 能给个解释更好了

#include <stdio.h> #include <stdlib.h>  int odd [1000] ; int odd_count = 0 ; int even [1000] ; int even_count = 0; int total = 0 ; int Abs(int val){ return val>0?val:(-val) ;} int isPrimer(int val) {     int res = 1;     int i = 0;     if(val<2)res = 0;     for(i = 2 ; i*i <= val ;i++)     {         if(val%i == 0) {res = 0 ;break;};     }     return res ; } void input(){     total = 0 ;     odd_count = 0 ;     even_count = 0;     scanf("%d",&total) ;     int tmp ;     while(total--)     {         scanf("%d",&tmp) ;         if(tmp%2==0)even[even_count++] = tmp ;         else odd[odd_count++] = tmp ;     } } int reSolve() {     int res = 0 ;     int i=0,j=0 ;     for(i = 0 ; i < odd_count ; i++)     {         for(j=0;j<even_count ;j++)         {             int temp = odd[i]-even[j] ;             temp = Abs(temp) ;             if(isPrimer(Abs(odd[i]-even[j]))&&isPrimer(Abs(odd[i]+even[j])))             {                 res ++;             }         }     }     return res; }  int main() {     input();     printf("%d",reSolve());     return 0; }  仅供参考

引用 1 楼 KenZhang1031 的回复:很容易证明： 两数之和为质数（也就是素数）的必要条件是一个为奇数，另一个为偶数，且两数互质。 证明： 两奇数之和一定不是质数 a=2m-1,b=2n-1，那么a+b=2m+2n-2=2(m+n-1)，可见不是质数 两偶数同样的可以证明。 因此必须要一奇数一偶数。 证明：不互质的两数和不是质数 a=km,b=kn，k>1, 那么a+b=k(m+n)，至少有因子k，不是质数。  因此：先判定两数不满足“一个为奇数，另一个为偶数，且两数互质”条件就一定不是了，满足条件的再去判定和以及差是否为质数（因为只是必要条件，不是充分条件，所以要做判断），用AKS算法判定，只需O((1og n) )的时间就能算出，如果是1000个，那么远远满足1秒的时间。  大神能给写个代码吗  我新手...。。


Question: 特殊回文数求帮助

引用 1 楼 naoshi 的回复:输入2答案就不对了  答案对啊。。

输入2答案就不对了

引用 3 楼 KenZhang1031 的回复:10010不是回文数(反过来是01001，很明显不回文)，if((z==a+b+c+d+e+f)&&(a==f && b==e && c==d))要改为： if((z==a+b+c+d+e+f)&& (a!=0) &&(a==f && b==e && c==d))的确，结果那块看错了== 感谢，经点拨已经解决。


Question: 帮忙看一下这个程序有啥问题？

顶起来 求大家帮忙啊

#include<stdio.h> main() {     int a[11],i,pos,x;//不明白为什么要11个     printf("input numbers:");     for(i=0;i<10;i++)                scanf(" %d",&a[i]); //%d前面不要空格       for(i=0;i<10;i++)         printf(" %d",a[i]);     printf("\n");     printf("input a insert number:");     scanf("%d",&x);     for(i=0;i<10;i++)     {         if(x < a[i]&&x > a[i-1])//关键是这一句错了，i=0的时候,a[i-1]就越界了         {             pos = i;             for(int s=10;s>=i;s--)             {                a[s+1] = a[s];             }             a[pos] = x;         }        }     printf("the final numbers are:");     for(i=0;i<11;i++)         printf(" %d",a[i]);     printf("\n");   }

这个。。。lz程序本身设计的有问题吧，你输入一个和你输入的十个数中一个相同的数，亦或输入一个不再这十个数所包括的范围内的一个数，结果都不正确 lz是用VC6.0吗


Question: 杨辉三角形 代码求解

引用 2 楼 w82076322 的回复:[quote=引用 1 楼 u012421456 的回复:] lz代码问题不少啊！第六行你怎么给 n 赋值啊，你不是打算输入吗？第十行该是a[i][0]吧 还有让我不解的是第14、15行怎么i和j从3和2开始啊？（个人见解，如有不对，敬请lz和楼下各位点明，万分感激） 这是我搜到的，经过改写的代码  第六行那叫做参数的初始化。 从3和2开始，是因为 —————————— 1 1 1 1 2 1 —————————— 头两行和第一列都已经赋值为1了。[/quote] 你这是不行的，当你输入一或2 程序将报错 #include "stdafx.h" #include "YHTriAngle.h"    YHTriAngle::YHTriAngle(int i) : n(i) , p(NULL) { //构建杨辉三角形 	p = new int*[n]; 	for (int i = 0; i < n; i++){ 		p[i] = new int[i + 1]; 		p[i][0] = 1; 		p[i][i] = 1; 		for (int j = 1; j < i; j++) 			p[i][j] = 0; 	} 	for (int i = 2; i < n;i++)         for (int j = 1; j < i; j++) 		    p[i][j] = p[i - 1][j - 1]  +p[i - 1][j]; }   YHTriAngle::~YHTriAngle(void) { 	for (int i = 0; i < n; i++) 		delete[]p[i]; 	delete[]p; }   // 显示杨辉三角 void YHTriAngle::show() { 	for (int i = 0; i < n; i++){ 		for (int j = 0; j <=i; j++) 			cout << setw(4) << p[i][j]; 		cout << endl; 	} } 你把这个改成c风格就行了，既然你有输入，那为什么不在输入过后再赋值呢 赋值在输出前，错了都不好发现啊

1.数组初始化时应该赋初值0，后来打印出来的比较大的数应该就是没初始化好，后面的程序可能出错导致未修改，所以每次的值可能会不同。而且数组下标是从0开始的啊，楼主怎么上来就a[1][1]; 2.这样定死了就不能输入1或者2的情况了啊。 3.打印的时候直接在第一循环里就可以了，没必要再专门设一个循环。下面是我小修改过的程序。 #include<stdio.h> int main() {     int a[34][34]={0};     int i=0,j=0;     int n=0;     printf("请输入杨辉三角的层数:");     scanf("%d",&n);     for(i=0;i<n;i++)     {     	 a[i][0]=1;     	 a[i][i]=1;    	     for(j=0;j<=i;j++) 	     { 	     	a[i+1][j+1]=a[i][j]+a[i][j+1];  	        printf("%d ",a[i][j]); 	     }		 	     printf("\n");      }    	return 0; }

引用 4 楼 derekrose 的回复:1.什么是参数？   2.什么是初始化 int a; cin >> a;是不是初始化？答复1，我用语错误。应该是变量初始化。 查了一下cin >> a的C语言写法，这段代码不是初始化。只有定义的时候的赋值才是初始化。  另求版主解决一楼的问题。

引用 4 楼 derekrose 的回复:[quote=引用 2 楼 w82076322 的回复:] [quote=引用 1 楼 u012421456 的回复:] lz代码问题不少啊！第六行你怎么给 n 赋值啊，你不是打算输入吗？第十行该是a[i][0]吧 还有让我不解的是第14、15行怎么i和j从3和2开始啊？（个人见解，如有不对，敬请lz和楼下各位点明，万分感激） 这是我搜到的，经过改写的代码  第六行那叫做参数的初始化。 从3和2开始，是因为 —————————— 1 1 1 1 2 1 —————————— 头两行和第一列都已经赋值为1了。[/quote]  1.什么是参数？   2.什么是初始化 int a; cin >> a;是不是初始化？[/quote]请使用纯C。。CPP我看不懂==

引用 2 楼 w82076322 的回复:[quote=引用 1 楼 u012421456 的回复:] lz代码问题不少啊！第六行你怎么给 n 赋值啊，你不是打算输入吗？第十行该是a[i][0]吧 还有让我不解的是第14、15行怎么i和j从3和2开始啊？（个人见解，如有不对，敬请lz和楼下各位点明，万分感激） 这是我搜到的，经过改写的代码  第六行那叫做参数的初始化。 从3和2开始，是因为 —————————— 1 1 1 1 2 1 —————————— 头两行和第一列都已经赋值为1了。[/quote]  1.什么是参数？   2.什么是初始化 int a; cin >> a;是不是初始化？

引用 2 楼 w82076322 的回复:第六行那叫做参数的初始化。 从3和2开始，是因为 —————————— 1 1 1 1 2 1 —————————— 头两行和第一列都已经赋值为1了。 哦，原来如此，  lz你的代码从输入3就不行啊

引用 1 楼 u012421456 的回复:lz代码问题不少啊！第六行你怎么给 n 赋值啊，你不是打算输入吗？第十行该是a[i][0]吧 还有让我不解的是第14、15行怎么i和j从3和2开始啊？（个人见解，如有不对，敬请lz和楼下各位点明，万分感激） 这是我搜到的，经过改写的代码  第六行那叫做参数的初始化。 从3和2开始，是因为 —————————— 1 1 1 1 2 1 —————————— 头两行和第一列都已经赋值为1了。

lz代码问题不少啊！第六行你怎么给 n 赋值啊，你不是打算输入吗？第十行该是a[i][0]吧 还有让我不解的是第14、15行怎么i和j从3和2开始啊？（个人见解，如有不对，敬请lz和楼下各位点明，万分感激） 这是我搜到的，经过改写的代码——#include  <stdio.h>   int main(void)  {  	int i, j, n =0 , a[34][34] = {0};  	printf("请输入你想要的杨辉三角的层数："); 	scanf("%d", &n); 	     for(i=0; i<34; i++)  		a[i][0] = 1;        	for(i=1; i<34; i++)  		for(j=1; j<=i; j++)  			a[i][j] = a[i-1][j-1] + a[i-1][j]; 		 	for(i=0; i<n; i++)    	{  		for(j=0; j<=i; j++)  			printf("%6d", a[i][j]);  		printf("\n");  	}  	return 0; }


Question: fflush()为什么不能清除屏幕内容？

引用 4 楼 u013854998 的回复:非常感谢各位，我想我找到方法了，   #include <stdio.h> #include <unistd.h>  int  main(void) { 	int i; 	for (i=0; i <= 100; i++){ 		printf ("\rComplete Percent:%d%%", i); 		fflush (stdout); 		sleep (1); 	} 	printf ("\n"); }    确实，这也是一个方法，呵呵。

试试 #include <stdio.h> #include <unistd.h>  int  main(void) {   printf("Games Loading %3d%%",0);   fflush(stdout);     for(int i=0; i <= 100; ++i)   {     sleep(1);     printf("\b\b\b\b%3d%%",i);     fflush(stdout);     }   puts("");   return 0; }

引用 楼主 u013854998 的回复: #include <stdio.h> #include <unistd.h>  int  main(void) { 	for(int i=0; i <= 100; ++i) 	{ 		printf("Games Loading %d%%\n",i); 		fflush(stdout);////////////// 		sleep(1); 	} 	return 0; }    //求解答　。。。。 //程序愿意是想在单行实现百分比显示的。 // // // fflush函数是用来刷io缓冲区的，不是用来清屏的。 http://www.cplusplus.com/reference/cstdio/fflush/  要实现你的意图，可以利用'\b'转义，或者system("cls")，或者conio.h

因为fflush不是干这个的。 试试system("cls") 或者system("clear");


Question: 程序运行显示不正常~~输入之后显示为零

我想问的是这样改了符合lz的要求吗？具体lz看看吧

我四楼的话 你试了吗

引用 5 楼 u012421456 的回复:其实在相对简单的程序里这些不重要，当然，最好输入2.00额~~什么意思？输入2.00也不行

引用 1 楼 user-5 的回复:你输入2.0试一下啊不成啊~~

引用 2 楼 missheaven2011 的回复:hours 被你定义为 float 类型 scanf("%lf",&hours)，取的是 double类型，再存入hours，导致hours值为 0 可改为 scanf("%f",&hours)  或 double hours；scanf()函数自动把float类型增益成double类型~~所以用%lf~~换成%f也不行啊~~还有其他的错误么？

程序本身是没有问题的，只是输出的时候应该使用%f,%lf是输出双精度浮点型的数。如下 #include<stdio.h> #define BASE 10.00 #define TIME 40.00 #define ADD 1.50 #define RATE1 0.15 #define RATE2 0.20 #define RATE3 0.25 #define LIMIT1 300 #define LIMIT2 450 int main() { 	float tax,gross,hours; 	printf("input the work hours of a week:\n"); 	while(scanf("%f",&hours)==1) 	{ 		if(hours<=TIME) 		{ 			hours=hours; 		} 		else 		{ 			hours=TIME+(hours-TIME*ADD); 		} 		gross=hours*BASE; 		printf("gross income:\t\t%f\n",gross); 		if(gross<=LIMIT1) 		{ 			tax=gross*RATE1; 		} 		else if(gross<=LIMIT2) 		{ 			tax=LIMIT1*RATE1+(gross-LIMIT1)*RATE2; 		} 		else 		{ 			tax=LIMIT1*RATE1+(LIMIT2-LIMIT1)*RATE2+(gross-LIMIT2)*RATE3; 		} 		printf("tax:\t\t%f\n",tax); 		printf("net income:\t\t%f\n",gross-tax); 	} 	printf("Done!\n"); 	return 0; }

引用 14 楼 pokerLee 的回复:[quote=引用 13 楼 u012421456 的回复:] 这个。。。可能吧！ lz这是VC++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443，我编译你的程序时用的就是这个，安装很简单，也很快，你可以试试 当然，我建议lz可以先用原来的编译器从新建一个项目、 文件，然后把原来的代码拷到新建的文件里试试（个人见解）谢谢~~错误找到了~~原来是三个printf()里的格式控制符应该改成%f~~谢谢兄台了~~无以为报~~只能给你点分了~~谢谢了~~[/quote] 找到原因就好！惭愧，没帮上多大的忙！ 至于分。。。分什么的最喜欢了

引用 13 楼 u012421456 的回复:这个。。。可能吧！ lz这是VC++6.0完整绿色版——http://download.csdn.net/detail/u012421456/6897443，我编译你的程序时用的就是这个，安装很简单，也很快，你可以试试 当然，我建议lz可以先用原来的编译器从新建一个项目、 文件，然后把原来的代码拷到新建的文件里试试（个人见解）谢谢~~错误找到了~~原来是三个printf()里的格式控制符应该改成%f~~谢谢兄台了~~无以为报~~只能给你点分了~~谢谢了~~

引用 11 楼 u012421456 的回复:我想问的是这样改了符合lz的要求吗？具体lz看看吧 我怀疑是编译器的问题~~有可能是编译器的是么？？ 这个是我的运行结果~~

其实在相对简单的程序里这些不重要，当然，最好输入2.00

lz把12行的float改成double试试，看那结果是不是你想要的，输入2和2.0好像不影响

while(scanf("%f",&hours)==1) 应该涉及到类型提升和截断问题..

你输入2.0试一下啊


Question: 请教帮忙

刚才看了个贴子说这样改： 把“project->配置属性->c/c++->代码生成->基本运行时检查 设置为默认值，就没有这样的错误了。关于MSDN的解释是在堆栈外面读写某数据。错误是名为RTC1的编译器检测的。又看了更多的技术文章，发现这样的错误是程序员在项目到了一定大的时候，它占用的堆栈量就比较大。我也深有体会。因为自己本来编写一个类，运行时没有错，但是在添加成员属性的时候，在其它方式不变的情况下就容易发生这样的错误。所以据此我猜应该是VS2005（2008）在内部就限定了堆栈的大小，当项目足够大的时候，就会溢出。 自己改完后，运行了一下，发现拓扑的最后一个数字输出有误，如下图： 本应该是999的，结果变为0了。

strcat(ch_qz,str); ///合并 这个确实有问题，请问师兄，这个怎么改啊？谢谢！

谢谢，我试试单步调试。

这个自己单步调试就知道  浏览了一下，下面这句可能有问题。 strcat(ch_qz,str); ///合并


Question: 这段代码是如何理解

引用 6 楼 KenZhang1031 的回复:为什么USB0_BDTPAGE3得到的是0？这里tBDTtable没有明确，USB0_BDTPAGE3也是未知的。 [quote=引用 5 楼 lovehuan54 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] 比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. [quote=引用 3 楼 lovehuan54 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote][/quote] 恩，这个明白了。 但是对应到这个问题中的代码就不是很理解了，按照这里的运算USB0_BDTPAGE3得到的是0.看来是需要配合实际的场景才能理解了。[/quote][/quote] 对对，是我想错了。

为什么USB0_BDTPAGE3得到的是0？这里tBDTtable没有明确，USB0_BDTPAGE3也是未知的。 引用 5 楼 lovehuan54 的回复:[quote=引用 4 楼 KenZhang1031 的回复:] 比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. [quote=引用 3 楼 lovehuan54 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote][/quote] 恩，这个明白了。 但是对应到这个问题中的代码就不是很理解了，按照这里的运算USB0_BDTPAGE3得到的是0.看来是需要配合实际的场景才能理解了。[/quote]

引用 4 楼 KenZhang1031 的回复:比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. [quote=引用 3 楼 lovehuan54 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote][/quote] 恩，这个明白了。 但是对应到这个问题中的代码就不是很理解了，按照这里的运算USB0_BDTPAGE3得到的是0.看来是需要配合实际的场景才能理解了。

比如地址是32位的0x12345678，右移8位转uint8就是得到0x56,同理右移16和32位分别得到0x34和0x12，就是把32位地址的高3字节分别取出来. 引用 3 楼 lovehuan54 的回复:[quote=引用 1 楼 KenZhang1031 的回复:] 要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。[/quote]

引用 1 楼 KenZhang1031 的回复:要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。 请教这段代码的意思， 尤其是对数组首地址进行移位操作。疑问有个： 1，把数组首地址强转为uint32然后右移8位得到的是什么？ 2，再强转为uint8是什么意思？ 3，底下的右移16和右移24又分别是什么作用？  才疏学浅，望赐教！ 谢谢。

引用 1 楼 KenZhang1031 的回复:要理解代码要去看寄存器USB0_BDTPAGE0-USB0_BDTPAGE2的说明，但从语法上说，这段代码没问题。估计是USB有一段按照一定规则的结构表，该表的首地址放在这三个寄存器中。 数组首地址进行位运算没什么问题，你说的VC上试会报错，那应该不是位运算的问题。  NB啊，你的理解完全是正确的，刚看了数据手册明白了。


Question: 关于C读文件strcmp函数比较字符串

感谢 ，又学到了不少。

因为字符串是以数字0结尾的('\0')。定义短了以后结尾的0被下一个数据姓名冲掉了，计算机在输出时一直输出到姓名结尾的0处才会停

小心中文字符编码

出错原因是struct Student中的char Sno[8]长度不够，要改为char Sno[8+1];  还要修改以下行：   if(L==NULL){ //if(L!=NULL){     printf("电脑空间不足!\n");  Status Search_PutoutStudent(LinkList L){                 //根据学号输出学生的信息   char sno[8+1];//char sno[8];;   Student *s=L->next;//Student *s=L;;    while(s!=NULL && strcmp(s->Sno,sno)) //while(s->next!=NULL && strcmp(s->next->Sno,sno))    printf("学号\t姓名\t性别\t年龄\t系别\n");//printf("学号\t姓名\n性别\t年龄\t系别\n");

为什么字符串定义短了，但是输出时却是学号和姓名连在一起输出了？  大神 求解答！！


Question: 符合/无符合 匹配

一般来说, 应该是你的定义去适应它的.

//int i; DWORD i;

之所以报警告，应该是SystemInfo.dwNumberOfProcessors是无符号类型的数据变量； 遇到这种情况，建议将i变量变成unsigned类型

(int)SystemInfo.dwNumberOfProcessors，在SystemInfo.dwNumberOfProcessors如果很大的情况下有可能溢出，如果这样，i定义成无符号是不是要好些。


Question: 周五的考试题 大家帮忙看看

#include <cstdlib> #include <iostream> #include <iomanip> /* run this program using the console pauser or add your own getch, system("pause") or input loop */  using namespace std;  double check_input() { 	double input_value; 	cin>>input_value; 	if ((input_value<0) || (input_value > 1000)) { 		cout << "Incorrect input, please enter a value between $0 and $1000: $"; 		cin>>input_value; 	} 	return input_value; }  int main(int argc, char** argv) { 	double input_quarter, prev_balance; 	double mon1[3];							// monthly puchases for each store, going in order of Sears, Canadian Tire and The Bay 	double mon2[3]; 	double mon3[3]; 	string q1[3] = {"January", "February", "March"}; 	string q2[3] = {"April", "May", "June"}; 	string q3[3] = {"July", "August", "September"}; 	string q4[3] = {"October", "November", "December"}; 	string temp_month; 	double input_array[3];										// temp input_array to store inputs before being transfered to mon1, mon2 or mon3 	double sears_total, canadian_tire_total, the_bay_total, minimum_payment, quarterly_total, balance_owing; 	int go_again; 	 	do { 		cout <<"Please enter the yearly quarter from one of the following (1,2,3,4): "; 		cin >> input_quarter; 		while((input_quarter < 1) || (input_quarter > 4)) { 			cout << "Wrong input. Pleae input one of the following '1,2,3,4': "; 			cin>> input_quarter; 		} 		 		cout <<"Please enter prev balance between $0 - $1000: $"; 		prev_balance = check_input(); 		 	 		for (int j = 0; j < 3; j++) {							// selects month 		 			if (input_quarter == 1) 							// selects month based on year quarter 				temp_month = q1[j]; 			else if (input_quarter == 2) 				temp_month = q2[j]; 			else if (input_quarter == 3) 				temp_month = q3[j]; 			else  				temp_month = q4[j]; 			 			cout<<"\nPlease input Sears purchases for "<<temp_month<<": "; 			input_array[0] = check_input(); 			cout<<"\nPlease input Canadian Tire purchases for "<<temp_month<<": "; 			input_array[1] = check_input(); 			cout<<"\nPlease input The Bay purchases for "<<temp_month<<": "; 			input_array[2] = check_input(); 			if (j == 0) {								// monthly purchases for the 1st month in curretn quarter in order of Sears, Canadian Tire, and The Bay 				for (int k = 0; k < 3; k++) 					mon1[k] = input_array[k]; 			} 			if (j == 1) {									// monthly purchases for the 2nd month in curretn quarter in order of Sears, Canadian Tire, and The Bay 				for (int k = 0; k < 3; k++) 					mon2[k] = input_array[k]; 			} 			else {		        								// monthly purchases for the 3rd month in curretn quarter in order of Sears, Canadian Tire, and The Bay 				for (int k = 0; k < 3; k++) 					mon3[k] = input_array[k]; 			} 		} 		 		sears_total = mon1[0]+mon2[0]+mon3[0]; 		canadian_tire_total = mon1[1]+mon2[1]+mon3[1]; 		the_bay_total = mon1[2]+mon2[2]+mon3[2]; 		quarterly_total = sears_total + canadian_tire_total + the_bay_total; 		balance_owing = prev_balance + quarterly_total; 		minimum_payment = balance_owing*0.1; 		 		cout << "\n\n\nMonth\t\tSears\t\tCanadian Tire\t\tThe Bay"<<endl; 		for (int j = 0; j < 3; j++) { 			if (input_quarter == 1) 				temp_month = q1[j]; 			else if (input_quarter == 2) 				temp_month = q2[j]; 			else if (input_quarter == 3) 				temp_month = q3[j]; 			else  				temp_month = q4[j]; 			 			if (j == 0) 				cout <<fixed<<setprecision(2)<<temp_month<<"\t\t$"<<mon1[0]<<"\t\t   $"<<mon1[1]<<"\t\t    $"<<mon1[2]<<endl;	// fixed<<setprecision(2) truncates minimum_payment after decimal point 			if (j == 1) 				cout <<fixed<<setprecision(2)<<temp_month<<"\t\t$"<<mon2[0]<<"\t\t   $"<<mon2[1]<<"\t\t    $"<<mon2[2]<<endl; 			if (j == 2) 				cout <<fixed<<setprecision(2)<<temp_month<<"\t\t$"<<mon3[0]<<"\t\t   $"<<mon3[1]<<"\t\t    $"<<mon3[2]<<endl; 		} 		cout<<"Total\t\t$"<<sears_total<<"\t\t  $"<<canadian_tire_total<<"\t\t    $"<<the_bay_total<<endl; 		cout<<"\nQuarterly Total: $"<<quarterly_total<<endl; 		cout <<"Balance Owing: $"<< balance_owing<<endl; 		cout<<"Minimum Payment: $"<<fixed<<setprecision(2)<<minimum_payment<<endl;	 		 		cout << "\nDo you want to do another quarter? (1 for yes, 2 for no): "; 		cin>> go_again; 		while ((go_again < 1) || (go_again > 2)) { 			cout<<"Incorrect input, please enter 1 or 2: "; 			cin>> go_again; 		} 	}while(go_again == 1); 		 	return EXIT_SUCCESS; }

引用 楼主 u013670102 的回复:You work for the Zippy Credit Card Company and have been assigned to develop a C program that will do the following:  A. Prompt an operator to input two values:   o The number (1-4) of the current quarter of the year (The 1st quarter is January to March)   o A previous balance owing between $0 - $1,000  B. Will then prompt for monthly total purchases from each of three stores, for each month of the current quarter. The store names are Sears, Canadian Tire, and The Bay. Monthly purchases must be between $0 - $1,000  C. Will output:    o Monthly purchases from each store    o A quarterly total for each store    o An overall quarterly total for all three stores    o A new balance owing    o A minimum 10% payment (calculated from the new balance owing)  Sample Output (2nd Quarter):  Month     Sears       Canadian Tire     The Bay April     $100.10     $103.94           $15.00 May       $93.40      $120.00           $140.75 June      $140.00     $20.05            $86.39 Total     $333.50     $243.99           $242.14  Quarterly Total: $819.63 Previous Balance: $983.54 Balance Owing: $1803.17 Minimum Payment: $180.32  D. After outputting the results for the specified quarter the program will prompt the operator to either do another quarter (i.e. loop back to step A) or exit the program.  Evaluation Criteria: Program must compile without errors or warnings Comments are clear and appropriate 10% Variable names and initialization follow good practices 10% Prompts are clear 10% Invalid entries are handled appropriately 10% Program calculates correctly 30% The output is appropriately formatted 30%说中文!


Question: C语言为什么读取不同的输入方式的文本文件排序后输出的结果不一样？问题出在哪里？

第二个可能最后有空行

全选看看有没有什么不干净的字符……

是不是最后多了个换行？


Question: 递归调用的问题

t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 引用 3 楼 u013803262 的回复:f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？

f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？

这是一个对正数求阶乘的算，每次递归得到f(n-1)对应的阶乘，第n次阶乘等数第n个数乘以n-1之前的阶乘

求讲原理

引用 8 楼 u013803262 的回复:[quote=引用 7 楼 KenZhang1031 的回复:] 比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 [quote=引用 6 楼 u013803262 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote][/quote 那就是这种的咯 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote] 谢谢，我懂了

我描述得应该很清楚了啊，是遇到result=n*fact（n-1）去掉用fact(n-1),f(n-2),...,f(1),f(0)，直到n为0，然后f(0)，f(1),f(2),...f(n)一层层的返回。 引用 8 楼 u013803262 的回复:[quote=引用 7 楼 KenZhang1031 的回复:] 比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 [quote=引用 6 楼 u013803262 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote][/quote 那就是这种的咯 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote]

引用 7 楼 KenZhang1031 的回复:比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 [quote=引用 6 楼 u013803262 的回复:] [quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote][/quote 那就是这种的咯 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？

比如f(3),第一次遇到3*f(2)，会调用f(2)，遇到2*f(1)，会调用f(1)，又会遇到1*f(0)，会调用f(0)，此时n==0，返回1，返回到f(1)=1*f(0)这层，如此类推层层返回。也就是说从顶层层层递归调用，到最底层时，反过来层层返回，因此递归深度很大时，很耗内存，每层递归都要开辟新的栈帧。 引用 6 楼 u013803262 的回复:[quote=引用 4 楼 KenZhang1031 的回复:] t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？[/quote]

引用 4 楼 KenZhang1031 的回复:t是局部变量，而每递归调用一次函数都会使用一份栈帧，因此fact(n)的t和fact(n-1)的t是位于不同的栈里，不是一个东西。 [quote=引用 3 楼 u013803262 的回复:] f=n*fact(n-1); 这句话每执行一次不会吧地址里t的值给冲掉么？[/quote] 那个return（f）是返回的result=n*（n-1）*（n-2）.....1是一次返回 还是一次次返回result=n*fact（n-1）见到这个fact（n-1）再去调用的？


Question: 数据结构——括号匹配，编译没问题，运行时输入以后就没反应了，什么问题？

引用 1 楼 user-1 的回复: //if(s.base = s.top ) return 1; if(s.base == s.top ) return 1;   还有好几个这样的例子。

引用 3 楼 user-1 的回复:帮你修正了， 逻辑再严谨点， 仔细点就好。   #include <stdio.h> #include <stdlib.h> #include <malloc.h>  #define STACK_INIT_SIZE 100 #define STACKINCREAMENT 10  typedef struct {   char *base;   char *top;   int stacksize; }Stack;  int Initstack(Stack &s) {   s.base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));   if(!s.base)  return 0;   s.top = s.base;   s.stacksize = STACK_INIT_SIZE;   return 1;  }   int Pushstack(Stack &s,char c) {   if(s.top - s.base >= s.stacksize)   {     s.base = (char*)realloc(s.base,(STACKINCREAMENT+s.stacksize)*sizeof(char));     if(!s.base) return 0;     s.top = s.base + s.stacksize;     s.stacksize += STACKINCREAMENT;   }   *s.top++ = c;   return 1; }  void Destroystack(Stack &s) {   free(s.base);   s.base = s.top = NULL;   s.stacksize = 0; }  bool Popstack(Stack &s,char &e) {   if(s.top == s.base) return false;   e = * --s.top;   return true; }  bool Isempty(Stack &s) {   return s.base == s.top; }  bool Topstack(Stack& s, char & t) {   if(s.base < s.top)    {     t = s.top[-1];     return true;   }   return false; }  int main() {   char e, top;   bool done = false;   Stack s;   Initstack(s);   int c;   printf("please input something:\n");   while(!done && (c=getchar())!= EOF && c != '\n')   {     switch(c)     {       case '[':       case '(':         Pushstack(s,c);         break;       case ']':         if(Topstack(s, top))          {           if(top == '[')              Popstack(s,e);           else             done = true;         }         break;       case ')':         if(Topstack(s, top))          {           if(top == '(')              Popstack(s,e);           else             done = true;         }         break;     }   }   if(Isempty(s)) printf("Match success!\n");   else printf("Match failed!\n");   Destroystack(s);   //system("pause");   return 0; }   s.top[-1]就是返回栈顶元素么？为什么是这个样子的，那个-1不代表下标，而是代表减1么？


Question: 十进制转换成16进制的时候出来问题，求帮助，谢谢

呵呵，容易，字符串转10进制用scanf，再转16进制字串用printf，完事 unsinged int num sscanf(changing,"%u",&num); sprintf(changed,"%x",num);

表示没看懂啊

问题是什么？

再给你个长的。 #include <stdio.h>  int main( ) {     long long a = 1234567890123456789; 	printf( "NonCap = %llx; Cap = %llX.\n", a, a ); 	return 0; }

进制转换这样最方便。 #include <stdio.h>  int main( ) {     int a = 1234567890; 	printf( "NonCap = %x; Cap = %X.\n", a, a ); 	return 0; }


Question: 杭电1902，输出格式问题？什么意思啊？怎么弄啊？我都错了N遍了。

怎么没人啊。

Sample Input 4 1 2 3 4 5 1 2 3 4 5 0     Sample Output 10 15


Question: 多线程并发服务器线程创建函数malloc参数问题

做了个程序实验了一下。5L是对的，你的每个threadArg变量在while循环回来之后都被释放掉了。于是每个线程得到的参数可能会访问同一个位置，里面参数是否正确取决于后面的程序有没有继续使用堆栈。如果你后面传输的东西是需要在新线程里用到的，建议建个数据结构分配内存。如果就用一下数值本身，可以考虑使用传值的方式~

搜“内存池”，“线程池”，“连接池”

引用 5 楼 xihu1364 的回复:[quote=引用 4 楼 bbs2241 的回复:] [quote=引用 3 楼 xihu1364 的回复:] [quote=引用 2 楼 bbs2241 的回复:] int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB   ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...[/quote]  pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg) 参数都进栈了，那还有多线程问题。  ThreadFunction中直接将threadArg强转会int不就可以了[/quote]   呵呵，你知道进栈了，是进了什么吗？是threadArg的地址而不是值 如：threadArg的地址 0x11111111 其对应的值是3  进入ThreadFunction栈中了，但是还没执行ThreadFunction，这是while进入下次循环，threadArg已经析构，threadArg的地址还在，（内存地址肯定还在那）但是值可能被其他程序修改。 当ThreadFunction执行的时候，按你说的，int* p = （int*）pParam 这时候 p是指向0x11111111 而*p还是会等于3吗？？ 这个就不一定了  不知道 你能看懂不[/quote] 你也没认真看，bbs2241说的是改为pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)。(void *)threadArg当然不会有事。

引用 2 楼 bbs2241 的回复:int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB 这个方法确实行的通，但是用int型值当做指针来用，恐怕有危险吧 PS:刚才引用1楼引用错了

引用 1 楼 xihu1364 的回复:int threadArg是局部变量  当while进入下一次循环，这个变量就被销毁了，创建的线程去读这个变量是未定义行为 这个方法确实行的通，但是用int型值当做指针来用，恐怕有危险吧

引用 3 楼 xihu1364 的回复:[quote=引用 2 楼 bbs2241 的回复:] int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB  ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...[/quote]  pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg) 参数都进栈了，那还有多线程问题。  ThreadFunction中直接将threadArg强转会int不就可以了

引用 2 楼 bbs2241 的回复:int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB  ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...

2 楼正解, 5楼还没看明白.

引用 4 楼 bbs2241 的回复:[quote=引用 3 楼 xihu1364 的回复:] [quote=引用 2 楼 bbs2241 的回复:] int threadArg = connfd; pthread_create(&tid, NULL, ThreadFunction, &threadArg)  既然是int变量直接传就好了 pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg)  也可以使用线程局部存储TLB   ... 进入下次while循环局部变量已经销毁，创建的线程去使用销毁的变量，不会有事？ 看到创建线程的时候是传的变量的地址，不是值...[/quote]  pthread_create(&tid, NULL, ThreadFunction, (void *)threadArg) 参数都进栈了，那还有多线程问题。  ThreadFunction中直接将threadArg强转会int不就可以了[/quote]   呵呵，你知道进栈了，是进了什么吗？是threadArg的地址而不是值 如：threadArg的地址 0x11111111 其对应的值是3  进入ThreadFunction栈中了，但是还没执行ThreadFunction，这是while进入下次循环，threadArg已经析构，threadArg的地址还在，（内存地址肯定还在那）但是值可能被其他程序修改。 当ThreadFunction执行的时候，按你说的，int* p = （int*）pParam 这时候 p是指向0x11111111 而*p还是会等于3吗？？ 这个就不一定了  不知道 你能看懂不


Question: 杭电acm1902题，过不去啊，我是真心不懂，谁来帮帮我个菜鸟。

#include <stdio.h> int main(void) {     int n,sum,a;     while(scanf("%d",&n)==1);     {         if(n!=0)     {         sum=0;        while(n--)        {            scanf("%d",&a);            sum+=a;        }        printf("\n%d",sum);     }      }      return 0; } 改成这样后，我觉得人生都悲剧了。是我还没看懂，对吧。

哦，虽然我还是不太懂我哪里错了，但还是谢谢啦，我去试试。

来人啊~~~~~~~~~~~~~~~

//改成这样 #include <stdio.h> int main(void) {     int n,sum,a;     while (scanf("%d",&n) == 1) {     if(n!=0)     {         sum=0;        while(n--)        {            scanf("%d",&a);            sum+=a;        }        printf("%d\n",sum);     }     else     {        break;      } }     return 0; }


Question: 模块间的函数调用报错

没将dll编译入你的exe？

戒了吧

接分

我知道了。在项目依赖项和项目生成顺序中的设置。  谁来评论下，我好结贴。


Question: 汉诺塔

刚刚说错了...没看懂楼主意思...为什么只能连续输入3层！！！！！！  该说的楼上已经说了，只有第一次需要传入常量，后面的内容，是根据上一次传入的值，然后再按该方法重新排序交换的。所以不能每次都传入常量，这样就没区别了。

引用 6 楼 czarten 的回复:最开始调用的是han(3,'a','b','c');对吧？ 这时在han(int num,char a,char b,char c)里，参数a='a',b='b',c='c' 然后在函数内部又调用了han(num-1,a,c,b);也就是han(num-1,'a','c','b')对吧 好，所以在这一次调用中，对应的参数就是a='a',b='c',c='b'了，明白了吗？  说简单点，不是每次调用都a='a',b='b',c='c'的  如果觉得搞不清楚，把han(int num,char a,char b,char c)改成han(int num,char x,char y,char z)，就比较清楚了  接上，han(int num,char x,char y,char z)这个函数，调用的时候，y可能等于'b'（最初的调用）,y也可能等于'c'（第二次调用），也就是说y等于什么是不一定的，所以要用变量

是const char&

抱歉 看错了  你传什么都无所谓的，但这里用值传递会有拷贝，递归深了也不好，还是用引用吧const char*

引用 2 楼 mousestuman 的回复:我不是楼上这么说的意思，我的问题是递归调用时的实参为什么是变量而不是常量，比如： han(num-1,a,c,b);为什么不能写成han(num-1,'a','c','b'); ？ 请问'a'，‘b’,'c'穿进去，怎么计算？

void han(int num,const char a,const char b,const char c) {     if(num==1)         printf("%c->%c\n",a,c);     else     {         han(num-1,a,c,b);         printf("%c->%c\n",a,c);         han(num-1,b,a,c);     } } 这是你的意思吗？也许这样更好，表示ABC不能被修改


Question: 头文件中的static变量

baichi4141 讲的准确清晰，赞一个。

引用 10 楼 M_o_n_e_y 的回复:[quote=引用 9 楼 baichi4141 的回复:] [quote=引用 8 楼 M_o_n_e_y 的回复:] [quote=引用 3 楼 baichi4141 的回复:] 楼主有一个基本概念没有理解，就是“预编译”和“编译”的区别 说的简单一点，编译是把源代码变成机器命令，预编译则是对源代码进行一些简单处理，这是完全独立的两个阶段 #include是预编译指令，作用是把指定文件的内容复制到当前文件当前行处 static是一个关键字，它的作用由语言标准规定，在编译时起到特定的作用 由此可以看出，static跟#include完全没有任何关系，在编译器编译源代码前，#include就已经完成其任务，编译器在处理static时，根本不知道当前这行代码是否被#include过多少次  所以“static修饰外部变量，会将外部变量的作用域限制在本文件之内，而将其include的文件访问不到这个变量”这个想法是错误的，static限定的“本文件”是“所有预编译指令执行后的文件”。如果你在一个头文件里定义了static全局变量，在几个源文件中包含这个头文件，结果就是这几个源文件分别都有了一个static全局变量 这就是不管你在其他几个源文件里怎么改，负责输出的那个源文件输出的值永远不变的原因，因为这几个源文件都有一个叫这个名字的变量，这几个变量彼此之间没有任何关系小弟还是对第二种输出结果（在头文件定义的变量被3个文件修改了）还是有疑惑。小弟的理解是这样的：#include将代码copy进来到那三个c文件，形成的临时文件中都各有各自的test_include呀，那么编译的时候应该编译的是copy（预编译）完成以后的临时文件，则，test_include应该是各自文件里面的，三个文件互不影响其它文件的test_include。[/quote] #include之后每个源文件编译之后的模块都有一个同名变量，没用static所以这个变量对其他源文件编译之后的模块就是可见的 我不熟悉C语言中关于声明和定义的标准所以没有说，从结果来看似乎是你用的C编译器将这些源于同一个头文件的同名变量整合成一个变量了 在C++语言中，你这种写法直接通不过编译，报错“多个模块有同名全局变量”[/quote]我用的vc++6.0写的代码。C++我没试过。[/quote]  cal.h文件删除static后，clean一下工程，再重新编译，应该就编译不过了。 报错和C++都是一样的。

引用 11 楼 M_o_n_e_y 的回复:[quote=引用 5 楼 Adol1111 的回复:] 即使在头文件里，进行了特殊处理，全局变量还是全局变量。 在大型项目中，非常容易出问题。  而且头文件中定义变量最好是用extern 而不是static ，这两者是有差异的！！  static允许其他地方有重复，而extern不可以。  简单说就是，C/C++的文件都是单独编译的，每一个编译后的文件由连接器组成一个可执行文件。 对于static来说，每个引用该头文件的编译单元都允许有一份，但组成的最终文件不冲突。 而extern来说，是完全共享的，所有引用都是外部的，所以a文件改了，b文件也会受影响。请看8楼和3楼，然后指教小弟，为何两次输出的结果是如此。谢谢。[/quote] 都说了说static的作用域是本文件了，你在main.c以外的文件里修改这个变量，是不影响main.c中的test_include 所以最后输出结果都是相同的。 如果你想看到变化的话，改成extern（extern不能再定义时初始化，不然extern就无效了，头文件声明，在main.c中赋值）

每个文件 #include "cal.h" 后都定义了 static	int	test_include = 100;  所以互不影响。  如 1F 所说不应该使用这种写法，哪个文件要用static变量就在哪个文件定义，不应放入头文件

确定无疑，gcc编译器不能通过编译。理论上也不能通过编译。 应该是你的编译器蛋疼了。

第一次输出 100 100 100是因为两个文件中有各自的 “test_include” 变量，因为你加了static，所以每个文件“stack.c”“main.c”访问的是自己的“test_include”变量。你调用的push、pop改变了stack.c中的test_include变量，没有改变main.c中的！ 如果你把输出函数写在stack.c中，然后在main.c中调用，你就会发现输出变化了。  至于去掉static以后，为什么你还能编译，这个我不能理解。在gcc编译器应该编译不了了，命名冲突，两个变量用了同一个名字。

引用 3 楼 baichi4141 的回复:楼主有一个基本概念没有理解，就是“预编译”和“编译”的区别 说的简单一点，编译是把源代码变成机器命令，预编译则是对源代码进行一些简单处理，这是完全独立的两个阶段 #include是预编译指令，作用是把指定文件的内容复制到当前文件当前行处 static是一个关键字，它的作用由语言标准规定，在编译时起到特定的作用 由此可以看出，static跟#include完全没有任何关系，在编译器编译源代码前，#include就已经完成其任务，编译器在处理static时，根本不知道当前这行代码是否被#include过多少次  所以“static修饰外部变量，会将外部变量的作用域限制在本文件之内，而将其include的文件访问不到这个变量”这个想法是错误的，static限定的“本文件”是“所有预编译指令执行后的文件”。如果你在一个头文件里定义了static全局变量，在几个源文件中包含这个头文件，结果就是这几个源文件分别都有了一个static全局变量 这就是不管你在其他几个源文件里怎么改，负责输出的那个源文件输出的值永远不变的原因，因为这几个源文件都有一个叫这个名字的变量，这几个变量彼此之间没有任何关系小弟还是对第二种输出结果（在头文件定义的变量被3个文件修改了）还是有疑惑。小弟的理解是这样的：#include将代码copy进来到那三个c文件，形成的临时文件中都各有各自的test_include呀，那么编译的时候应该编译的是copy（预编译）完成以后的临时文件，则，test_include应该是各自文件里面的，三个文件互不影响其它文件的test_include。

引用 2 楼 haolly 的回复:static 变量 不是只能在static函数中使用吗？ 一般都是在头文件中用extern声明的，然后在c文件中定义。static 变量 不是只能在static函数中使用吗？这句话何解？

引用 1 楼 user-9 的回复:就绝对不可以在头文件里定义变量，不管是否加static 研究其出错细节，基本属浪费生命。请指教！

引用 5 楼 Adol1111 的回复:即使在头文件里，进行了特殊处理，全局变量还是全局变量。 在大型项目中，非常容易出问题。  而且头文件中定义变量最好是用extern 而不是static ，这两者是有差异的！！  static允许其他地方有重复，而extern不可以。  简单说就是，C/C++的文件都是单独编译的，每一个编译后的文件由连接器组成一个可执行文件。 对于static来说，每个引用该头文件的编译单元都允许有一份，但组成的最终文件不冲突。 而extern来说，是完全共享的，所有引用都是外部的，所以a文件改了，b文件也会受影响。请看8楼和3楼，然后指教小弟，为何两次输出的结果是如此。谢谢。

引用 9 楼 baichi4141 的回复:[quote=引用 8 楼 M_o_n_e_y 的回复:] [quote=引用 3 楼 baichi4141 的回复:] 楼主有一个基本概念没有理解，就是“预编译”和“编译”的区别 说的简单一点，编译是把源代码变成机器命令，预编译则是对源代码进行一些简单处理，这是完全独立的两个阶段 #include是预编译指令，作用是把指定文件的内容复制到当前文件当前行处 static是一个关键字，它的作用由语言标准规定，在编译时起到特定的作用 由此可以看出，static跟#include完全没有任何关系，在编译器编译源代码前，#include就已经完成其任务，编译器在处理static时，根本不知道当前这行代码是否被#include过多少次  所以“static修饰外部变量，会将外部变量的作用域限制在本文件之内，而将其include的文件访问不到这个变量”这个想法是错误的，static限定的“本文件”是“所有预编译指令执行后的文件”。如果你在一个头文件里定义了static全局变量，在几个源文件中包含这个头文件，结果就是这几个源文件分别都有了一个static全局变量 这就是不管你在其他几个源文件里怎么改，负责输出的那个源文件输出的值永远不变的原因，因为这几个源文件都有一个叫这个名字的变量，这几个变量彼此之间没有任何关系小弟还是对第二种输出结果（在头文件定义的变量被3个文件修改了）还是有疑惑。小弟的理解是这样的：#include将代码copy进来到那三个c文件，形成的临时文件中都各有各自的test_include呀，那么编译的时候应该编译的是copy（预编译）完成以后的临时文件，则，test_include应该是各自文件里面的，三个文件互不影响其它文件的test_include。[/quote] #include之后每个源文件编译之后的模块都有一个同名变量，没用static所以这个变量对其他源文件编译之后的模块就是可见的 我不熟悉C语言中关于声明和定义的标准所以没有说，从结果来看似乎是你用的C编译器将这些源于同一个头文件的同名变量整合成一个变量了 在C++语言中，你这种写法直接通不过编译，报错“多个模块有同名全局变量”[/quote]我用的vc++6.0写的代码。C++我没试过。

引用 8 楼 M_o_n_e_y 的回复:[quote=引用 3 楼 baichi4141 的回复:] 楼主有一个基本概念没有理解，就是“预编译”和“编译”的区别 说的简单一点，编译是把源代码变成机器命令，预编译则是对源代码进行一些简单处理，这是完全独立的两个阶段 #include是预编译指令，作用是把指定文件的内容复制到当前文件当前行处 static是一个关键字，它的作用由语言标准规定，在编译时起到特定的作用 由此可以看出，static跟#include完全没有任何关系，在编译器编译源代码前，#include就已经完成其任务，编译器在处理static时，根本不知道当前这行代码是否被#include过多少次  所以“static修饰外部变量，会将外部变量的作用域限制在本文件之内，而将其include的文件访问不到这个变量”这个想法是错误的，static限定的“本文件”是“所有预编译指令执行后的文件”。如果你在一个头文件里定义了static全局变量，在几个源文件中包含这个头文件，结果就是这几个源文件分别都有了一个static全局变量 这就是不管你在其他几个源文件里怎么改，负责输出的那个源文件输出的值永远不变的原因，因为这几个源文件都有一个叫这个名字的变量，这几个变量彼此之间没有任何关系小弟还是对第二种输出结果（在头文件定义的变量被3个文件修改了）还是有疑惑。小弟的理解是这样的：#include将代码copy进来到那三个c文件，形成的临时文件中都各有各自的test_include呀，那么编译的时候应该编译的是copy（预编译）完成以后的临时文件，则，test_include应该是各自文件里面的，三个文件互不影响其它文件的test_include。[/quote] #include之后每个源文件编译之后的模块都有一个同名变量，没用static所以这个变量对其他源文件编译之后的模块就是可见的 我不熟悉C语言中关于声明和定义的标准所以没有说，从结果来看似乎是你用的C编译器将这些源于同一个头文件的同名变量整合成一个变量了 在C++语言中，你这种写法直接通不过编译，报错“多个模块有同名全局变量”

1.首先最好不要在头文件中定义变量，除非其它模块需要调用，即是用extern定义，告诉编译器这个变量是可以被其它模块调用。 2.static是模块内的调用，不允许外部调用


Question: error: invalid type argument of '->' (have 'Course')

嗯 ，试了一下，确实是点。Thank you!

引用 1 楼 czarten 的回复:sql.elem[sc->Cno]->Ccredit第二个->改成点试试？ 我觉得sql.elem[sc->Cno]应该不是指针类型，而是Course类型吧，用点

sql.elem[sc->Cno]->Ccredit第二个->改成点试试？


Question: 新手学程序

# include <iostream.h> # include <cmath>  int yushu(int x, int y) { 	int k; 	if (x < y) 	{ 		k = x; 		x = y; 		y = k; 	}  	if(x%y == 0) 		return abs(y); 	else     		return yushu(y, x%y);    } int main(void) { 	int x, y, z, t;  	cout<<"请输入x = "; 	cin>>x; 	cout<<"请输入y = "; 	cin>>y; 	z = yushu(x,y); 	t = (x*y) / z; 	cout<<x<<"与"<<y<<"的最小公倍数为："<<t<<endl; 	cout<<x<<"与"<<y<<"的最大公约数为："<<z<<endl;  	return 0; } lz，其实这个你可以搜到的

算法：辗转相除

#include <stdio.h> int gcd(int a, int b) { 	if (b == 0)   return a; 	return gcd(b, a%b); } int lcm(int a, int b) { 	return a*b / gcd(a, b); } int main(void) { 	int x, y; 	int GCD, LCM; 	scanf("%d%d", &x, &y); 	GCD = gcd(x, y); 	LCM = lcm(x, y); 	printf("GCD=%d,LCM=%d\n", GCD, LCM); 	return 0; }


Question: 这是我的代码，问题是我驶入21 11后出现不可想象的问题； 数组里面得出来的数正确，比较两个输出结果 求大神提示

不是回复你了么？ a[i]=n%m; -> a[i]='0'+n%m


Question: 用calloc分完内存然后赋值之后再free但是只有2个值没了为什么？怎么能吧4个INT都free了？

正确理解free的语义。这里是个野指针，行为未定义

free是通知操作系统，这地我不用了，你可以拿回去了 操作系统说：“嗯，知道了。”但不会马上就拿走，因为它不急着用 等操作系统需要用这块地的时候，才会拿走

#include<stdio.h> #include<malloc.h> int main() { int *pInt,i; pInt=(int*)calloc(4,sizeof(int)); for(i=1;i<5;++i) { *pInt=10*i; printf("%d\n",*pInt); ++pInt; } for(i=1;i<5;++i) { --pInt; } printf("free\n"); free(pInt); int *pp = malloc(10000); memset(pp,0,10000); for(i=1;i<5;++i) { printf("%d\n",*pInt); ++pInt; } getchar(); return 0; }

1.free()只是说p指向的内存是无用的(系统收回了此段内存),在free时,通常并不同时释放进程占用的内存页,相反,它仅仅将这部分内存在malloc内部结构中标记为可再分配. 2.要明白free动作,它只是告诉系统,这块内存我(当前进程)使用完毕,可以收回并分配给其他进程使用.这里有两点:它不改写里面的值,所以,在一定的几率下,free后依然可以获得原来的值。 3.calloc()函数用来分配一个能容纳n个元素,每个元素长度为size的内存空间 4.函数calloc() 会将所分配的内存空间中的每一位都初始化为零

其实你用malloc测试也是一样的。 这并不是释放不完全，而是释放的内存没有填充别的内容，所以保存的是原来的状态，本质上在堆中已经认为是释放过的了，以后分配时可以再分配到这段空间中的。

要纠正一个观念，free并不带代表清空内存，而是通知操作系统该段内存已经不被占用了，可以重新进行分配了。所以，free之后该段内存的内容已经是一个未定义的，可能跟以前相同也可能不同，毫无意义。


Question: 请教前辈一个小问题

2楼正解。 在main函数开始就调用函数得到系统时间，然后就printf(....);出来

引用 1 楼 czarten 的回复:自己printf呀 是不是lz想输出系统时间啊——http://zhidao.baidu.com/link?url=WxGArTK3V6Fr4PRh8MlnpYIyfHIt_q24SCLQ9JNj0rv3qs5EZUQa5-sT9aFesxwA4BCvs6G8AKiyNXRPrUKvoq

自己printf呀


Question: 行编辑器——getchar()的小问题么？

引用 1 楼 xiayuanzhong 的回复:- 若这里去掉&& ch != '\n',不是应该可以接受多行了么？ - 是的，如果去掉'\n'就需要用Ctrl+Z来判断输入结束。原来如此，是先回车再Ctrl+Z最后再回车，非常感谢


Question: 文字排序问题

应该是分词吧？ 首先你得定义一个词典

//把“海中上国”排列成“中国上海”的形式输出 #include <stdio.h> #include <locale.h> int main() {     _wsetlocale(LC_ALL,L"chs");     wprintf(L"%c%c%c%c\n",L"海中上国"[1],L"海中上国"[3],L"海中上国"[2],L"海中上国"[0]);     return 0; } //中国上海 //

数组的查找？ 栈？

难道是移动字符??

估计是出栈入栈吧 要不队列


Question: 弱弱地问一个很简单的问题

楼上的各位，太感谢了~~

按照4楼的程序就可以，不过一般计数建议使用static静态变量

引用 5 楼 haolly 的回复: while(i<MAXSIZE) INPUT list.a[i]; i++  你的size是什么？ 你说我的吗？size记录输入的次数

仅供参考 #include <stdio.h> #define MAXSIZE 100 typedef int datatype; typedef struct { 	datatype a[MAXSIZE]; 	int size; }sequence_list; int main() { 	sequence_list se; 	se.size=0; 	while(se.size<MAXSIZE) 	{ 		scanf("%d",&se.a[se.size]); 		se.size++; 	} 	return 0; }

再给你推荐一篇博文更加有助于你理解：链接如下 http://blog.csdn.net/hackbuteer1/article/details/6706562

呵，没看懂你到底要问什么？ 对你的 typedef int datatype 表示不解。你要问的是一个关于结构体和链表么？

#include <stdio.h> #include <stdlib.h>  int main(void) {     char  array[32];          int  ch;     int   i = 0;          while ((ch = getchar()) != EOF)     {         array[i] = ch;         ++i;     }          if (array[--i] == '\n')     {         array[i] = '\0';     }          fprintf(stderr, "%s  %d\n", array, i);          system("pause");  } 你可以在输入最后输入一个回车 然后在Windows下按CTRL+Z键 即可停止输入 如果不想保留最后的\n可以去掉 而如果仅仅是输入一行不会保留换行则可以在while判断里加入 (ch = getchar()) != '\n'的判断


Question: 怎么解？

lz要不看看这个——http://bbs.csdn.net/topics/10250801 看能有启发不

算法没有发现问题，main没有类型没有返回值，可能会报个警告或错误。建议： int main() {      return 0; }

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

t是f（a，8）的返回值 int型  可以和 int数组元素比较 递归求数组最大值的一种方法

引用 4 楼 u013803262 的回复:[quote=引用 3 楼 u010957746 的回复:] return t>a[n-1]? t:a[n-1]; 这是什么情况？ 在那个return t>a[n-1]? t:a[n-1] t是f（a，8）怎么和数组元素比较？[/quote]  首先，这个代码是递归。和你之前问的问题类似。代码的实现目的是取数组的最大值。 然后，f(a,8)就是返回的数组元素的int值，当然可以和数组元素比较。 可以这样想，f(a,8)的返回值是f(a,7)和a[7]的取大；f(a,7)的返回值是f(a,6)和a[6]的取大；……而f(a,1)就直接是a[0]了。 从f(a,1)的返回值一路返回回去，就完成了对数组取大的目标

引用 4 楼 u013803262 的回复:[quote=引用 3 楼 u010957746 的回复:] return t>a[n-1]? t:a[n-1]; 这是什么情况？ 在那个return t>a[n-1]? t:a[n-1] t是f（a，8）怎么和数组元素比较？[/quote]仔细又看了下，没看懂。

引用 3 楼 u010957746 的回复:return t>a[n-1]? t:a[n-1]; 这是什么情况？ 在那个return t>a[n-1]? t:a[n-1] t是f（a，8）怎么和数组元素比较？

return t>a[n-1]? t:a[n-1]; 这是什么情况？

在那个return t>a[n-1]? t:a[n-1] t不是等于f(a,8)么怎么和a【8】这个数组值比较？


Question: 指针字符用scanf函数接收之后，printf函数输出会报错

总体错误就是没有分配空间。具体细节及原因是这样的 char *str="123";属于一个字符指针，这个等式的含义是为 把字符常量“123”的首地址赋值给 字符指针变量。 你想啊，既然是常量，怎么能用scanf 呢，因为常量是不允许 进行 写的操作的，只能进行读的操作。 所以没有给str 分配空间。 建议你使用malloc 函数 为你的str 分配内存 具体语句：str=（char *）malloc(sizeof(char)*100); 之后再用scanf("%s",str); 个人拙见，大神无喷。

char *str; 改为 char str[1024]={0};

指针未分配空间

给str1赋值内存空间就好了，

你的指针都没分配空间，直接赋值当然会crash了


Question: 刚进公司，遇到读写文件的问题无法解决了？求大神帮助。

我付稿费。。。。

没有人帮我把代码写一下吗？

上边忘记说文件里边的  文件内读取的密码长度由你的read返回那个值定，自己数不了的

1：加密后的字符串为乱码是很正常的，是对还是错必须拿以前的密文做对比，密码长度需要由函数返回 2：（linux下c所有系统的）str开头函数的是以\0为截断标志，密码类函数中千万别用，那是给自己找不自在，使用memcopy 。 c++写的少，没去研究

二进制文件不是有函数size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )   /* fwrite example : write buffer */ #include <stdio.h>  int main () {   FILE * pFile;   char buffer[] = { 'x' , 'y' , 'z' };   pFile = fopen ("myfile.bin", "wb");   fwrite (buffer , sizeof(char), sizeof(buffer), pFile);   fclose (pFile);   return 0; }

引用 13 楼 ADF1230 的回复:[quote=引用 7 楼 u011730237 的回复:] [quote=引用 5 楼 ADF1230 的回复:] 不要用文本，对你的需求来说，你应该是这样的加解密函数：  // set encrypt // returned error code unsigned int Encrypt(unsigned char* pSrcBuffer,int nSrcLength, int unsigned short Key,unsigned char** ppDstBuffer,int* pDstLength);  // set decode // returned error code unsigned int Decrypt(unsigned char* pSrcBuffer,int nSrcLength, int unsigned short Key,unsigned char** ppDstBuffer,int* pDstLength);  你的意思就不是能这样加密文件吗？我加密的是字符串对吗？[/quote]  我的意思是你的代码里面不要出现strlen,strcpy这样的字符串操作函数。全部用unsigned char去操作。[/quote]  获取长度，只能用for循环来操作了。

引用 7 楼 u011730237 的回复:[quote=引用 5 楼 ADF1230 的回复:] 不要用文本，对你的需求来说，你应该是这样的加解密函数：  // set encrypt // returned error code unsigned int Encrypt(unsigned char* pSrcBuffer,int nSrcLength, int unsigned short Key,unsigned char** ppDstBuffer,int* pDstLength);  // set decode // returned error code unsigned int Decrypt(unsigned char* pSrcBuffer,int nSrcLength, int unsigned short Key,unsigned char** ppDstBuffer,int* pDstLength);  你的意思就不是能这样加密文件吗？我加密的是字符串对吗？[/quote]  我的意思是你的代码里面不要出现strlen,strcpy这样的字符串操作函数。全部用unsigned char去操作。

还是没有人为我解答。

引用 10 楼 wulijian 的回复:二进制读写不用加'\0',文本模式加'\0'  char* Pdata = new char[strlen(data)]; 你这里data是字符串？如果是二进制数据，strlen获取可能是错误的  那我应该怎么操作呢？？求大神具体一点，我时时在线，没有理解我的意思，可以继续咨询我了，谢谢了。

能不能来一个大神 給我讲讲 我发问的都有问题吗？

帖子帖子不要沉啊，，，，，，，，，

引用 5 楼 ADF1230 的回复:不要用文本，对你的需求来说，你应该是这样的加解密函数：  // set encrypt // returned error code unsigned int Encrypt(unsigned char* pSrcBuffer,int nSrcLength, int unsigned short Key,unsigned char** ppDstBuffer,int* pDstLength);  // set decode // returned error code unsigned int Decrypt(unsigned char* pSrcBuffer,int nSrcLength, int unsigned short Key,unsigned char** ppDstBuffer,int* pDstLength);  你的意思就不是能这样加密文件吗？我加密的是字符串对吗？

string做为结构体成员，不能直接内存操作，string本身是一个类。

正在学习C，围观长知识。。。

引用 1 楼 zhuobattle 的回复:string做为结构体成员，不能直接内存操作，string本身是一个类。 你就这样回答完了吗？

引用 2 楼 user-7 的回复:LZ先想清楚二进制读写和文本读写有什么不同。  你告诉一下啊，这么简单的几个字，求你发发慈悲，多发点字体啊。

LZ先想清楚二进制读写和文本读写有什么不同。


Question: if与else if的条件范围

已经解决了。。是输入的问题。。代码没问题。。谢谢大家了

引用 2 楼 ronixy 的回复:输入数据是没有负数的，但是当输入一个L1到L2之间的数时，有时候会return INF，输入大于L3的数时，有时候会return C2，不是应该顺序执行吗，怎么会随便return呢？  别“有时候”呀，输入相同输出总相同吧，你给一组有问题的输入看看 另外L1，L2，L3是不是固定值？会不会出现L3<L2之类的？

DSD DSAFDFDF

else那边L有可能小于0  引用 楼主 ronixy 的回复:if(L > 0 && L <= L1)          //    if(L > 0 && L <= L1)            return C1;                //        return C1;     else if(L > L1 && L <= L2)    //    else if(L <= L2)         return C2;                //       return C2;     else if(L > L2 && L <= L3)    //    else if(L <= L3)         return C3;                //       return C3;     else                          //    else         return INF;               //        return INF;  为什么左边正确右边错误？

首先L1<L2<L3 在这个前提下，如果还有问题，建议跟踪下。


Question: 菜鸟求助   如何实现两个实函数相加

你没学过数据结构吗?那还谈个毛啊

用matlab

这是……积分？？


Question: 文本比较算法，给点建议

引用 21 楼 u013061236 的回复: 看LZ的需求，基本上是要在B中查找与A的最大匹配位置吧 最大匹配，次大匹配，第三大匹配.......无匹配！ 把A整个拆分了

引用 20 楼 hepeizhong2010 的回复:[quote=引用 19 楼 N_sev7 的回复:] [quote=引用 17 楼 lm_whales 的回复:] 可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了 没太明白，其实我的数据是位流， 不是字节流， 所以单纯的比较字节的话是不行的 [/quote] 把短的位流移位7次，不就得到8个字节流的字符串了么 然后8个字符串分别用KMP去匹配就好了[/quote] 我就是这样处理的，只不过还有其他要求，比如得到的中间文件（A串所有的子串在B中的位置）等 还有中间文件要压缩，争取做到最小

看LZ的需求，基本上是要在B中查找与A的最大匹配位置吧

引用 19 楼 N_sev7 的回复:[quote=引用 17 楼 lm_whales 的回复:] 可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了 没太明白，其实我的数据是位流， 不是字节流， 所以单纯的比较字节的话是不行的 [/quote] 把短的位流移位7次，不就得到8个字节流的字符串了么 然后8个字符串分别用KMP去匹配就好了

引用 17 楼 lm_whales 的回复:可以先分8次匹配，每次用字节模式匹配处理需要时,额外检测下，两头两个字节，就可以了 没太明白，其实我的数据是位流， 不是字节流， 所以单纯的比较字节的话是不行的

引用 16 楼 xiayuanzhong 的回复:你可以看看HexWorkshop的“文件重新同步比较”功能，有时候很准，有时候就很不准。 估计是没有一个好的算法能实现这个功能。 自己写了一个二分+KMP的算法实现了已经 不过当两个文件差别特别大时， 基本上就有些跑不动的感觉了 有待优化

仅供参考//有一个二进制文件，要求每隔50bits，删除后面的12bits。 #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *fi,*fo; char buf[31]; char obf[31]; int bn,n; void filter() {//对buf中前n个字节中的位，每隔50bits，忽略12bits，结果放在obf中,且将bn设置为obf中的字节数。     char bit[249];     char obt[249];     char b8[33];     char b88[33];     int i,j;     char *e;      for (i=0;i<n;i++) {         _itoa(buf[i],b8,2);         sprintf(b88,"%032s",b8);         sprintf(bit+i*8,"%s",b88+24);     }      j=0;     for (i=0;i<n*8;i++) {         if (i%62<50) {             obt[j]=bit[i];             j++;         }     }     if (j%8) {         bn=(j/8+1)*8;     } else {         bn=j;     }     for (i=j;i<bn;i++) obt[i]='0';     obt[bn]=0;     bn=bn/8;     for (i=0;i<bn;i++) {         strncpy(b8,obt+i*8,8);b8[8]=0;         obf[i]=(char)strtol(b8,&e,2);     } } int main() {     fi=fopen("in.bin","rb");     if (NULL==fi) {         printf("Can not open file in.bin!\n");         return 1;     }     fo=fopen("out.bin","wb");     if (NULL==fo) {         fclose(fi);         printf("Can not open file out.bin!\n");         return 2;     }     while (1) {         n=fread(buf,1,31,fi);         if (0==n) break;         filter();         fwrite(obf,1,bn,fo);     }     fclose(fo);     fclose(fi);     return 0; }

引用 3 楼 zhuobattle 的回复:[quote=引用 2 楼 N_sev7 的回复:] [quote=引用 1 楼 zhuobattle 的回复:] 文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。 这个不是那么简单 比如，原始文件为：10011010       最新文件为：010011010 因为原始文件多了一个Bit，导致后面很多不一样，但是，实际上呢 ，唯一不一样的地方只是新文件多了最前面的一个Bit而已  还是要谢谢你的回答[/quote] 找到xor差值最小的那个情况？[/quote]  难道一位以为的移动着去异或么？页可能文件中间出现不一样的！而且我需要将不同和相同的地方做标记，比如说哪里不一样，不一样的内容是什么，多大，如果一样，那么一样的位置在哪里，多大块一样的！  请问还有好的想法没？谢谢

引用 2 楼 N_sev7 的回复:[quote=引用 1 楼 zhuobattle 的回复:] 文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。 这个不是那么简单 比如，原始文件为：10011010       最新文件为：010011010 因为原始文件多了一个Bit，导致后面很多不一样，但是，实际上呢 ，唯一不一样的地方只是新文件多了最前面的一个Bit而已  还是要谢谢你的回答[/quote] 找到xor差值最小的那个情况？

引用 1 楼 zhuobattle 的回复:文件不大的话，全部读入。 文件较大，则分段读入。 对两块内存做XOR，0的部分就说明相等，1的部分说明有差异。 这个不是那么简单 比如，原始文件为：10011010       最新文件为：010011010 因为原始文件多了一个Bit，导致后面很多不一样，但是，实际上呢 ，唯一不一样的地方只是新文件多了最前面的一个Bit而已  还是要谢谢你的回答

引用 13 楼 misakamm 的回复:这个叫“最短编辑距离”，但实际应用里面，会使用分行的方式和局部贪心的做法降低时空复杂度 是炮姐吗??

引用 8 楼 richyhuang 的回复:[quote=引用 7 楼 user-9 的回复:] 首先你要定义差异 你不能说多了一个字符“我认为”差异就很小。 有的时候多一个字符，一样完全变了。 对于计算机也一样，我觉的楼主这个应该先定义patten再进行比较。[/quote]  其实，我就是用KMP迭代去找的

引用 7 楼 user-9 的回复:首先你要定义差异 你不能说多了一个字符“我认为”差异就很小。 A:10011010 B:010011010 我的比较结果就两条记录 第一条记录 B的第一个Bit 0单独做标记 B的后面的所有Bits是一条记录，记录和A的从0开始到第七位一样  可能我表述的不太对吧 上面是我想要做的！

引用 6 楼 ForestDB 的回复:最大匹配？？ 嗯，就像文件比较工具一样，一般文件比较工具都是字节为最小单位，我这只是需要将字节转为Bit流进行比较 比如上面的例子中的 A:10011010 B:010011010 我的比较结果就两条记录 第一条记录 B的第一个Bit 0单独做标记 B的后面的所有Bits是一条记录，记录和A的从0开始到第七位一样

引用 8 楼 richyhuang 的回复:[quote=引用 7 楼 user-9 的回复:] 首先你要定义差异 你不能说多了一个字符“我认为”差异就很小。 有的时候多一个字符，一样完全变了。 对于计算机也一样，我觉的楼主这个应该先定义patten再进行比较。[/quote]  楼主其实已经说了在比特的的前提下进行比较，但是还是会有很多问题，如何制定差异，必须要有一个度量方法，计算机不会模糊处理


Question: 求能正确运行的程序

目测楼主不小心按了shift。。。倒数第二行 printf("%d!=%ld",n,y); }

倒数第二行那个分号是个中文分号

# include <stdio.h>  long fac(int n) { 	long mul; 	int i; 	for(i=1; i<=n; i++); 	{ 		if(n == 0) 			mul = 1; 		else 			mul = n*fac(n-1); 		return mul; 	} }  void main() { 	long y; 	int n; 	scanf("%d", &n); 	y = fac(n); 	printf("%d != %ld", n, y);  //这一行的 ）和 ；都是全角，改为半角即可 }


Question: 求助~~~DHCP源码增加自己的option

问题解决了吗？我刚好在源码中添加了自己的option

楼主把源码分享一下，谢谢

引用 8 楼 hey_girl_ 的回复:[quote=引用 7 楼 derekrose 的回复:] 有没有试试search一下这些数据在哪里被用到 https://fossies.org/dox/dhcp-4.2.6/tables_8c_source.html 在这个网址，可以搜索代码里的一些关键字，可是，还没找到有用的函数[/quote]

引用 7 楼 derekrose 的回复:有没有试试search一下这些数据在哪里被用到 https://fossies.org/dox/dhcp-4.2.6/tables_8c_source.html 在这个网址，可以搜索代码里的一些关键字，可是，还没找到有用的函数

有没有试试search一下这些数据在哪里被用到

引用 4 楼 derekrose 的回复:option option-name code option-code = option-type; The option-name must be unique from server defined options and consist of alphanumeric characters and “-“. The option-code is typically between 128 and 254. Supported option-types include boolean, integer, string, text and IPv4 or IPv6 address, and domain list, as well as arrays, records, and encapsulation. 额。。这个我也有看到，可是这只是option的格式，并不是处理option的函数。 而且在\dhcp-4.2.6\common\tables.c文件里，有每个option的定义，可是，我不知道在哪处理这些数据

引用 3 楼 hey_girl_ 的回复:[quote=引用 楼主 hey_girl_ 的回复:] 大神们，有木有研究过DHCP源码的，我想在dhcp协议中，加入一条自定义的option，该怎么做？！ 一直在看源码，可惜，本人愚钝，一直木有找到处理option的函数。。。。。 请问，请问你知不知道类似的函数[/quote] 额。。这个我也有看到，可是这只是option的格式，并不是处理option的函数。 而且在\dhcp-4.2.6\common\tables.c文件里，有每个option的定义，可是，我不知道在哪处理这些数据

引用 楼主 hey_girl_ 的回复:大神们，有木有研究过DHCP源码的，我想在dhcp协议中，加入一条自定义的option，该怎么做？！ 一直在看源码，可惜，本人愚钝，一直木有找到处理option的函数。。。。。 请问，请问你知不知道类似的函数

看源码，找到已有的option怎么处理的，依葫芦画瓢。


Question: 金字塔图案

lz可以看看这两个——http://zhidao.baidu.com/link?url=AdCD1ete2ad88SR37SeSNvgLDhfVwecoLMy7BZmlFo1lz8IkM1goFjwAGubKv4NA2yX-BSwyXj0aP-jsCZ2C-a http://bbs.csdn.net/topics/390699220

引用 楼主 u013391418 的回复:我想知道怎么能随意变行数 lz的意思是想知道答案是怎么输出的？


Question: 这段代码哪出问题了？编译完执行不了

引用 4 楼 huoqingna2332 的回复:你定义的str是const类型的，你的初始化不正确，因为const char是不允许被修改的。   所以异常抛出 是在strcyp(s,t) 这个语句抛出的异常。   你可以改成  char *str="abcde123fgh8"; char test[1024]; memset(test, 0, sizeof(test)); strcpy(test, str); deldigit(test); 非常感谢，这个也可以

引用 3 楼 zhuobattle 的回复: //问题出在这里 char *str="abcde123fgh8";//字串是存在静态数据存储区的， //不能修改,要改成如下形式 char str[20] ="abcde123fgh8";  deldigit(str); 非常谢谢，对于这个变量定义出来是静态的这个我真不知道。

引用 5 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ 这个确实比较另类的方法

引用 5 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ 赵老师不要误人子弟啊

printf(“%s” ,s);

printf(“%s”, t);


Question: 如何用C语音修改文件内容

提醒：无fopen(...,"...b")不用fseek！  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

可以在写入之前使用fseek(fp, -1,1);

因为你在文件中读取一个字符后文件位置向后移动了一个字符，再写的时候是把下一个字符替换了，你应该把文件位置向前移动一个字符

1. 如果没记错，fgetc执行后，文件操作的位置已经移位了，需要使用fseek移回去，然后再写入数据。 2. 小写转大写可以使用strupr。 3. 建议把文件所有数据都读出来，使用strupr转大写，再把文件操作位置移动到开头， 再把转换后的数据写入。

引用 4 楼 u013797412 的回复:if(isXiao(ch)) { 	ch -= 32; 	fseek(fp, -1,SEEK_CUR); 	fputc(ch,fp); 	fseek(fp, 0,SEEK_CUR); } 谢谢指点，还帮我改出个错误。

引用 6 楼 user-5 的回复:如果是对一个文件又读又写，注意读写的位置。 建议搞两个文件，一个读，一个写，简单点。  FILE * src = fopen("org.dat", "r"); FILE * dst = fopen("org.dat.tmp", "w"); char c; while ((c = fgetc(src)) != EOF) {   if (islower(c))     c += 32;   fputc(c, dst); } fclose(src); fclose(dst); rename("org.dat.tmp", "org.dat"); 谢谢指点，这种方法可以。


Question: 求一组字符串中ASCII码最大的字符  有问题啊

1 #include<stdio.h>   2 #include<string.h>   3   4 void main()   5 {   6         char c[11];   7         char a[11];   8         int len;   9         int i, j;  10         char max;  11         i       = 0;  12         scanf("%s", c);  13         while(c[i]!='\0'){  14                 a[i]=c[i];  15                 i++;  16         }  17         max     = a[0];  18         len=strlen(c);  19         for(j=1; j<len; j++){  20                 if(a[0]<a[j]){  21                         a[0]=a[j];  22                         }  23         }  24         printf("%c\n", a[0]);  25 }

引用 6 楼 user-5 的回复:一次不能输入超过10个字符。恩   就是这个问题  不知道怎么控制一次输入小于等于10个字符啊

引用 8 楼 ZXvivian 的回复:[quote=引用 7 楼 ZXvivian 的回复:] 声明时最好同时初始化，这里使用字符串操作时需要包含string.h头文件，代码如下 #include <stdio.h> #include "string.h" int main() { 	char c[11]={0}; 	int a[10]={0},len=0; 	int i=0,j=0,max=0; 	while(fgets(c,11,stdin)!=EOF) 	{ 		while(c[i]!='\0') 		{ 			a[i]=c[i]; 			i++; 		} 		max=a[0]; 		len=strlen(c); 		for(j=1;j<len;j++) 		{ 			if(a[0]<a[j]) 			{ 				a[0]=a[j]; 			} 		} 		printf("%c",a[0]); 	} 	return 0; } 上面准备用红字体的。。点错了 #include <stdio.h> #include "string.h" int main() { 	char c[11]={0}; 	int a[10]={0},len=0; 	int i=0,j=0,max=0; 	while(fgets(c,11,stdin)!=EOF) 	{ 		while(c[i]!='\0') 		{ 			a[i]=c[i]; 			i++; 		} 		max=a[0]; 		len=strlen(c); 		for(j=1;j<len;j++) 		{ 			if(a[0]<a[j]) 			{ 				a[0]=a[j]; 			} 		} 		printf("%c",a[0]); 	} 	return 0; }[/quote]  引用 8 楼 ZXvivian 的回复:[quote=引用 7 楼 ZXvivian 的回复:] 声明时最好同时初始化，这里使用字符串操作时需要包含string.h头文件，代码如下 #include <stdio.h> #include "string.h" int main() { 	char c[11]={0}; 	int a[10]={0},len=0; 	int i=0,j=0,max=0; 	while(fgets(c,11,stdin)!=EOF) 	{ 		while(c[i]!='\0') 		{ 			a[i]=c[i]; 			i++; 		} 		max=a[0]; 		len=strlen(c); 		for(j=1;j<len;j++) 		{ 			if(a[0]<a[j]) 			{ 				a[0]=a[j]; 			} 		} 		printf("%c",a[0]); 	} 	return 0; } 上面准备用红字体的。。点错了 #include <stdio.h> #include "string.h" int main() { 	char c[11]={0}; 	int a[10]={0},len=0; 	int i=0,j=0,max=0; 	while(fgets(c,11,stdin)!=EOF) 	{ 		while(c[i]!='\0') 		{ 			a[i]=c[i]; 			i++; 		} 		max=a[0]; 		len=strlen(c); 		for(j=1;j<len;j++) 		{ 			if(a[0]<a[j]) 			{ 				a[0]=a[j]; 			} 		} 		printf("%c",a[0]); 	} 	return 0; }[/quote] 恩  题目是“多组输入，每组一行，每行一个字符串（由可打印字符组成，长度不超过10).”   用fgets输入的话   如果输入超过了10个字符   会自动进行下一次的判断大小  也就是会输出两个最大的ascII码字符   还是有问题啊

引用 7 楼 ZXvivian 的回复:声明时最好同时初始化，这里使用字符串操作时需要包含string.h头文件，代码如下 #include <stdio.h> #include "string.h" int main() { 	char c[11]={0}; 	int a[10]={0},len=0; 	int i=0,j=0,max=0; 	while(fgets(c,11,stdin)!=EOF) 	{ 		while(c[i]!='\0') 		{ 			a[i]=c[i]; 			i++; 		} 		max=a[0]; 		len=strlen(c); 		for(j=1;j<len;j++) 		{ 			if(a[0]<a[j]) 			{ 				a[0]=a[j]; 			} 		} 		printf("%c",a[0]); 	} 	return 0; } 上面准备用红字体的。。点错了 #include <stdio.h> #include "string.h" int main() { 	char c[11]={0}; 	int a[10]={0},len=0; 	int i=0,j=0,max=0; 	while(fgets(c,11,stdin)!=EOF) 	{ 		while(c[i]!='\0') 		{ 			a[i]=c[i]; 			i++; 		} 		max=a[0]; 		len=strlen(c); 		for(j=1;j<len;j++) 		{ 			if(a[0]<a[j]) 			{ 				a[0]=a[j]; 			} 		} 		printf("%c",a[0]); 	} 	return 0; }

纠正： fgets(c,11,stdin)

scanf遇到空白符就结束读取了     while(scanf("%s",c)!=EOF)               {  while(c[i]!='\0')  改成:     	while(fgets(buf,11,stdin)))               {  while(c[i]!='\n')

引用 2 楼 bolvdandan 的回复:引用 1 楼 Automation_dmu 的回复:i没有初始化。恩  对  我用但是如果字符串中间有一个空格还是不好处理啊 用gets_s处理。 while(gets_s(c, sizeof(c))) 另外，你的代码不需要a数组，直接对c处理即可。  //注意这里会判断你的输入是否超过c的长度，所以用_s这批函数安全。 while(gets_s(c, sizeof(c))) 	{ 		 		len = (int)strlen(c); 		max=c[0]; 		 		for(j=1;j<len;j++) 		{ 			if(max < c[j]) 			{ 				max = c[j]; 			} 		} 		printf("%s, max = %c\n",c, max); 	}

i没有初始化。

一次不能输入超过10个字符。


Question: fprinf不能输出

你的打开方式是二进制，所以输出要用fwrite才行。 如果打开使用的是""w+""，就可以输出了。

读操作后进行写操作，或者写操作后进行读操作，中间必须用fseek隔开


Question: 中缀表达式转化为后缀表达式，出现错误，多次查找未果，遂求有人解决一哈

else if('#'==c) 		{ 			break; 		} 		else 		{ 			printf("出错：输入格式错误\n"); 			return -1;  		} 		scanf("%c",&c);//错误 	}

不能自己Debug吗？ 比如简单的3+2

输入中缀表达式后不能输出后缀表达式


Question: 有人搞过纯Ｃ　的　ＩＯＣＰ　么？

《windows网络编程技术》    这上面有 呵呵


Question: MFC ini文件

引用 3 楼 user-1 的回复:#井号可以注释 哦 ;分号也可以谢谢

#井号可以注释 哦 ;分号也可以

引用 1 楼 user-1 的回复:“ ;this is a exercise about ini file  ” 这三行,不需要,你可以试试会不会出错  只需要这三行 [connection] ip=192.168.11.2 port=9999嗯，双引号是没有的，ini文件不是可以有注释吗，;不是它的注释行开始标志吗


Question: 嵌入式中 以下代码 是否必须？

对于认为可以有可以无的代码，建议反汇编看看。

volatile都没说个球。

引用 7 楼 nadleeh123 的回复:[quote=引用 楼主 u013797574 的回复:] void lcd_data_byte(char a) {char z = a; CARRY = 0;  lcd_data((a>>4)&0x0f);   a = z;               //防止a被改变， a在什么情况下会改变呢？  lcd_data(a&0x0f);  }  如注释，如果在嵌入式编程当中，这样的操作可否省略，如果不可省略，那a在什么情况下会改变呢？  嵌入式中位运算典型的是在操作寄存器，这段代码类似于从A状态到B状态，然后再回到A状态。保存一下是必须的。[/quote]这个说法比较靠谱

如果 所谓的a 被改变指的是  怕函数lcd_data 改变参数a的值 那就只是多虑 基础没学好的节奏

引用 楼主 u013797574 的回复:void lcd_data_byte(char a) {char z = a; CARRY = 0;  lcd_data((a>>4)&0x0f);   a = z;               //防止a被改变， a在什么情况下会改变呢？  lcd_data(a&0x0f);  }  如注释，如果在嵌入式编程当中，这样的操作可否省略，如果不可省略，那a在什么情况下会改变呢？  嵌入式中位运算典型的是在操作寄存器，这段代码类似于从A状态到B状态，然后再回到A状态。保存一下是必须的。

看这段代码突然想起了程序员经典注释的一条：本行代码神奇勿动  想到一种可能性，就是在嵌入式设备中，如果设置了优化选项，默认传递参数会采用寄存器而不是栈。这里的a是传递参数，在实际操作过程中，如果lcd_data对寄存器进行了操作（假设lcd_data是内联函数）或者有多次寄存器缓冲过程，则可能导致a的值转变。不过显然是lcd_data函数不过关，不应该在这里做防御。

很明确告诉LZ: 这些是垃圾代码 如果a是一个全局变量，那么这么做是很有必要的，但现在a是一个参数。 很明显这是一个新手在模仿老代码的写作风格，但又没搞懂全局变量和参数的区别。

有一种可能：在执行这个函数时发生了高优先级的中断，在堆栈中改变了a的值 这种操作感觉很像黑客，一般程序不会这样做的

不会变，可以去掉。

按c语言来说，不会变。原作者是大拿么？他可能多虑了

也许是延时的

多此一举  z = a;   a = z;  z 毫无用处

看你优化等级　呵呵  我纳闷是什么ＬＣＤ模块，写数据怎么半字节的写呢？

你这个代码看不出，跟具体的硬件相关，从这个函数来看，a,z都是局部变量，存在栈中，一般不会改变。


Question: C语言动画设计

参考http://www.hur.cn/Soft/2011/12113.html  引用 楼主 u013823819 的回复:求C语言动画程序，在tc2.0下可运行，课程设计用，谢谢啦。

去图书馆查。


Question: C语句 可以出现的位置

谢谢楼上各位的回复！   我查了些资料，没有找到具体的定义，不知道标准里有没有。   测试后发现在函数之外，只能有声明和初始化。访问变量的语句即使放在大括号{}之内，即块内部也是不行的。编译器认为是在声明变量，报 expected a declaration 的错误。   以前没想过这些问题，恰好昨天遇到了。

引用 5 楼 u013194225 的回复:一个很有意思的现象,b 不定义数据类型,也可使用. #include <stdio.h>  int a[10]= {0,10}; b=20;//  gcc -std=c99     warning: type defaults to 'int' in declaration of 'b' [enabled by default]| // a[1]=10; int main(void) {     a[1]=10;//     for(int i=0; i<10; i++)     {         printf("%d\n",a[i]);      }     printf("%d\n",b);     return 0; } 没办法，C的历史遗留问题太多了

unsigned int a[10] = {0, 10};   void main(void) {   }

语句都得放在块内部  有限制的

引用 楼主 chu_ge 的回复:#include"xxxx.h"  unsigned int a[10]; a[1]=10;  void main(void) {   }     如上的一段测试程序，会报语法错误，是不是因为a[1]=10;语句不会执行到？ C语言似乎对语句能出现的位置没有限制，有没有人对这个点比较熟悉的解释一下，谢谢了。 c的语句都必须位于函数内，a[1]=10;已经位于函数外了，这个是不正确的，放到main函数里面。

报的什么错误


Question: socket 的recv函数返回0

引用 7 楼 anfaee 的回复:[quote=引用 4 楼 luotuo44 的回复:] 返回0说明断开了连接，要先调用close，再重新连接  调用close(socket);关闭后再重亲连接会提示"Bad file descriptor" ！[/quote] close后要再次socket，才能调用connect

close之后再创建一个新的socket啊。

学习了、顺带领分

引用 3 楼 yanran_hill 的回复:1 服务器端修改一下代码,去白度一下setsockopt SO_REUSEADDR 2 recv返回0以后,要调用close(...)  服务端的代码是别人已经做好的不能改，调用close(socket);关闭后再重亲连接会提示"Bad file descriptor" ！

引用 4 楼 luotuo44 的回复:返回0说明断开了连接，要先调用close，再重新连接  调用close(socket);关闭后再重亲连接会提示"Bad file descriptor" ！

引用 2 楼 neustar1 的回复:关闭套接字，重新连接  调用了 shutdown(socket, SHUT_RDWR); close(socket); 后在连的话提示"Bad file descriptor"

现象：说明服务器主动断开了客户端的连接 客户端应该调用close关闭，然后再连接  原因： 服务器主动关闭，会进入WAIT_TIME状态，需要等待2MSL的时间，导致客户端重连出现“Transport endpoint is already connected”  也可以在服务器端设置端口重用 setsockopt SO_REUSEADDR

返回0说明断开了连接，要先调用close，再重新连接

关闭套接字，重新连接

用异步套接字吧


Question: 文件数据操作

1.文件头应该记录下数据条数，和每条数据的起始地址表 2.读取第一条数据后，数据条数减一，和修改起始地址表 3.读取最后一条后，数据条数减一即可了 4.具体细节问题，debug

实在不明白楼主要问啥，你读数据的话，那就调用fread或者fscanf读呗，从末尾读，顶多就是加个fseek，你删除数据到底是想把它从文件删除，还是想怎么的啊？如果是想从文件删除，两种方式，一种是文件加载到内存进行处理，处理完再回写到文件中。或者建一个临时文件，临时缓存数据。


Question: 我是大一c语言初学者，想学高级语言，但是在vc6.0中显示不存在

graphics.h和高级语言有什么关系？何况那个库不能用在现代系统上。 你想画图？可以看看GD、Cairo、SDL库。或者干脆看看那些图形界面库，比如Qt、Gtk；或者干脆直接用windows API。

笑到最后的，都是那些能坚持下来的

引用 楼主 u013821760 的回复:问问大神，我该怎么半 既然是初学者，干嘛不先把c学好，别看着别人能用vc做几个条条框框就感觉自己弱爆了么，淡定的学下去，慢慢的你就会发现，其实你已经走在他们前面了。。。

亲，技术也要与时进步。  学GUI, LINUX 下建议QT/DirectFB Windows下建议直接GDI/GDI+或者.net。

引用 10 楼 M_o_n_e_y 的回复:[quote=引用 4 楼 dbzhang800 的回复:] [quote=引用 楼主 u013821760 的回复:] 问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6[/quote]我还想请教：如何去掉，做到什么样的程度才算有资格用IDE。谢谢[/quote] 我是对IDE这种东西深恶痛绝，尤其微软的！！！

无论你看的书,还是你用的编译器都是20年前的老古董了.

前期先把语言基础打好...!

引用 4 楼 dbzhang800 的回复:[quote=引用 楼主 u013821760 的回复:] 问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6[/quote]我还想请教：如何去掉，做到什么样的程度才算有资格用IDE。谢谢

引用 4 楼 dbzhang800 的回复:[quote=引用 楼主 u013821760 的回复:] 问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6[/quote]是滴。

引用 1 楼 N_sev7 的回复:graphics.h 是TC里面的图形库，如果要用的话应该用TC来编译，VC++有他自己的另外图形库。                                                                     ---摘自《百度百科》 一楼正解！ 我也是个新手，从我个人的角度看，建议你学C语言看郝斌老师的视频，学VC可以看孙鑫的视频，这是地址——郝斌（http://www.xuexi111.com/jiaocheng/shipin/26243.html），孙鑫（http://club.topsage.com/thread-156290-1-1.html） lz可以先看看简单介绍

引用 1 楼 N_sev7 的回复:graphics.h 是TC里面的图形库，如果要用的话应该用TC来编译，VC++有他自己的另外图形库。                                                                     ---摘自《百度百科》 TC就是Turbo C++。

凉伴......

引用 楼主 u013821760 的回复:问问大神，我该怎么半 如果真想学的话，第一步应该是  丢掉你看的这种书，丢掉VC6

而且高级语言跟图形有毛关系

百度 easyX  或者  炮姐写的ege 里面的图形库头文件就是这个