Question: OJ超时求助..后序遍历层次遍历两道题都卡点超时

OJ中定义静态大数组的话不要放到main函数里面（因为这时数组是在栈上分配的，很容易超出栈的内存范围），可以将这个大数组作为全局变量定义到main函数外面，这时变量就是定义在全局数据区（不会占用栈空间）。 有些OJ在遇到代码中声明了静态大数组时会报错，导致编译通不过。所以一般情况下，如果需要分配很大的数组最好采用动态内存分配。

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

引用 7 楼 u014254473 的回复:[quote=引用 6 楼 zycxnanwang 的回复:] [quote=引用 5 楼 u014254473 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 囧，试了一下，还是超时.... 还有什么办法吗>.<[/quote] 晚上， 没事，把你那题AC了，你百度一下顺序存储二叉树的思路，再看看我的代码，估计就差不多了 算法的复杂度不能太高！  #include<iostream> using namespace std; #include<cstdio> #define N 100000  int order[N]; //存储二叉树 int map[N]; //一个映射 int times = 1; int n;  int postOrder(int head) { 	if (order[head * 2] != -1) postOrder(head * 2); 	if (order[head * 2 + 1] != -1) postOrder(head * 2 + 1);  	if (times == n) 		printf("%d\n", order[head]); 	else printf("%d ", order[head]);  	times++; 	return 0; }  int main() { 	//freopen("E:/in.txt", "r", stdin);  	 scanf("%d", &n);  	int num, left, right, temp; 	for (int i = 0; i < n; i++) 	{ 		scanf("%d%d%d", &num, &left, &right); 		if (num == 1) 		{ 			order[1] = 1; 			map[1] = 1; 		}  		temp = map[num];  		if (left != -1) 		{ 			order[2 * temp] = left; 			map[left] = 2 * temp; 		} 		else order[2 * temp] = -1;  		if (right != -1) 		{ 			order[2 * temp + 1] = right; 			map[right] = 2 * temp + 1; 		} 		else order[2 * temp + 1] = -1; 	}  	for (int i = 1; i < n; i++) 		printf("%d ", map[i]); 	printf("%d\n", map[n]);  	postOrder(1); //	fclose(stdin); 	return 0; }[/quote]  我把你的代码交上去，9个run time error，一个超时....哪里ac了....  我之前跟你写的差不多，递归写的，超时两个点，就改成非递归了，还超时两个点.....  [/quote] 我是无语了。。。。。感觉被鄙视了。。。，楼主， 第一个1039题， 血红血红的正确。。。。

引用 6 楼 zycxnanwang 的回复:[quote=引用 5 楼 u014254473 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 囧，试了一下，还是超时.... 还有什么办法吗>.<[/quote] 晚上， 没事，把你那题AC了，你百度一下顺序存储二叉树的思路，再看看我的代码，估计就差不多了 算法的复杂度不能太高！  #include<iostream> using namespace std; #include<cstdio> #define N 100000  int order[N]; //存储二叉树 int map[N]; //一个映射 int times = 1; int n;  int postOrder(int head) { 	if (order[head * 2] != -1) postOrder(head * 2); 	if (order[head * 2 + 1] != -1) postOrder(head * 2 + 1);  	if (times == n) 		printf("%d\n", order[head]); 	else printf("%d ", order[head]);  	times++; 	return 0; }  int main() { 	//freopen("E:/in.txt", "r", stdin);  	 scanf("%d", &n);  	int num, left, right, temp; 	for (int i = 0; i < n; i++) 	{ 		scanf("%d%d%d", &num, &left, &right); 		if (num == 1) 		{ 			order[1] = 1; 			map[1] = 1; 		}  		temp = map[num];  		if (left != -1) 		{ 			order[2 * temp] = left; 			map[left] = 2 * temp; 		} 		else order[2 * temp] = -1;  		if (right != -1) 		{ 			order[2 * temp + 1] = right; 			map[right] = 2 * temp + 1; 		} 		else order[2 * temp + 1] = -1; 	}  	for (int i = 1; i < n; i++) 		printf("%d ", map[i]); 	printf("%d\n", map[n]);  	postOrder(1); //	fclose(stdin); 	return 0; }[/quote]  我把你的代码交上去，9个run time error，一个超时....哪里ac了....  我之前跟你写的差不多，递归写的，超时两个点，就改成非递归了，还超时两个点.....

这么大的数组肯定不要定义在栈上，应该动态分配

引用 5 楼 u014254473 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 囧，试了一下，还是超时.... 还有什么办法吗>.<[/quote] 晚上， 没事，把你那题AC了，你百度一下顺序存储二叉树的思路，再看看我的代码，估计就差不多了 算法的复杂度不能太高！  #include<iostream> using namespace std; #include<cstdio> #define N 100000  int order[N]; //存储二叉树 int map[N]; //一个映射 int times = 1; int n;  int postOrder(int head) { 	if (order[head * 2] != -1) postOrder(head * 2); 	if (order[head * 2 + 1] != -1) postOrder(head * 2 + 1);  	if (times == n) 		printf("%d\n", order[head]); 	else printf("%d ", order[head]);  	times++; 	return 0; }  int main() { 	//freopen("E:/in.txt", "r", stdin);  	 scanf("%d", &n);  	int num, left, right, temp; 	for (int i = 0; i < n; i++) 	{ 		scanf("%d%d%d", &num, &left, &right); 		if (num == 1) 		{ 			order[1] = 1; 			map[1] = 1; 		}  		temp = map[num];  		if (left != -1) 		{ 			order[2 * temp] = left; 			map[left] = 2 * temp; 		} 		else order[2 * temp] = -1;  		if (right != -1) 		{ 			order[2 * temp + 1] = right; 			map[right] = 2 * temp + 1; 		} 		else order[2 * temp + 1] = -1; 	}  	for (int i = 1; i < n; i++) 		printf("%d ", map[i]); 	printf("%d\n", map[n]);  	postOrder(1); //	fclose(stdin); 	return 0; }

引用 1 楼 zycxnanwang 的回复:数组定义的也太大了，……，这种方法肯定不行！ 遍历用递归这是标准方法，没有最好了， 第二个多定义了几个数组也是为了快，空间换时间... 数据规模时题目要求的.....  非递归还超时，问题出在哪呢....0.0

引用 4 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 囧，试了一下，还是超时.... 还有什么办法吗>.<


Question: 问一道题好嘛/(ㄒoㄒ)/~~

楼主要不先估计一下闰年的密度，先算出一个下界来再向上枚举。求两个年份之间的闰年数应该是常数复杂度的

比如说输入2005 25，求第25个闰年，你可以从2005开始，每次开始得到一个闰年后对25减1，并且把这个闰年先用一个变量保存，知道一直把25减到0，说明是从2005开始的第25个闰年，打印变量保存的年份。至于数字3，可以用一个循环来做。

把大致思路说一下就好%>_<%


Question: GUI 组件间的父子关系是必要的吗？如果不支持父子关系，有什么效果是无法实现或不容易实现的吗？

应该没有无法实现的，但会导致很多功能不得不面对复杂得多的问题。 比如复合组件本身附带“子组件”概念的这种。 消息拦截逻辑也会变得很恶心。

父子窗口便以管理、查找、控制等，有些类库比如VCL，父窗口显示的时候也会显示所有的子控件窗口，父窗口销毁的时候会自动销毁所有的子窗口控件。子窗口的（0,0）坐标是相对于父窗口的客户区的。父子窗口在任务栏只有一个图标，两个独立的窗口是各有图标的。

很多GUI操作要求对父控件调用后, 会影响子控件, 比如可选...可见.. 你绝对不想隐藏窗口后, 只隐藏了窗口边框, 窗口内容还看得到

没有父子关系，就做不到子窗口只能在父窗口范围内移动吗？

比如子窗口只能在父窗口范围内移动

你用的是什么组件？？


Question: 二维数组初始化

引用 5 楼 adusuccessfully 的回复:貌似一维数组可以，二维数组不能这样赋值~~~  都不鞥，没写的全是 false 。  如果期望全是false，那么都可以。

貌似一维数组可以，二维数组不能这样赋值~~~

需要写个循环，每个元素都赋值true  或者用memset填充

这样只是初始下标为3,3的元素

每一个元素都得赋值。

for (int i=0;i<3;i++) for (int j=0;j<3;j++) board_empty[i][j]=true;


Question: *(p+2)='a'；这种赋值是否可行？

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

你的p是指向常量的字符串，修改会导致出错  如果要修改，改成char p[]="hello";  这样是在栈上分配的，可修改

char *p="hello";表示指向常量区的常量字符串。 大部分编译器都不允许对该区域进行写操作。 改成在堆或者栈上申请的字符串才行。


Question: 并集怎么写？？？

仅供参考：#include <algorithm> #include <iostream> #include <functional> #include <cstring> using namespace std; int main() {     char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;     char *Vowels   = "aeiou" ;     char *AlphaNum = "0123456789abcdef" ;     char result[45] ;     char *last ;      int lenA  = strlen(Alphabet) ;     int lenV  = strlen(Vowels  ) ;     int lenAN = strlen(AlphaNum) ;      cout << "Alphabet = " << Alphabet << endl ;     cout << "Vowels   = " << Vowels   << endl ;     cout << "AlphaNum = " << AlphaNum << endl ;      cout << "\nusing non-predicate versions" << endl ;      //non-predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //non-predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      cout << "\nusing predicate versions" << endl ;      //predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result  , less<char>()) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result  , less<char>()) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result  , less<char>()) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result  , less<char>()) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      return 0 ; }

#include<stdio.h> int main() { 	int a[100],b[100],c[100]; 	int i,j; 	int m=0,n=0; 	int k=0,x=0; 	bool d; 	printf("请输入数组A：\n"); 	for(i=0;i<=100;i++) 	{ 		scanf("%d",&a[i]); 		if(a[i]<0) 			break; 		m++; 	}        	printf("请输入数组B：\n"); 	for(i=0;i<=100;i++) 	{ 		scanf("%d",&b[i]); 		if(b[i]<0) 			break; 		n++; 	} 	printf("A,B交集:"); 	for(i=0;i<m;i++) 	{ 		for(j=0;j<n;j++) 		{ 			if(a[i]==b[j]) 			{    				printf("%d ",a[i]); 			} 		} 	} 	printf("A,B并集: "); 	for(i=0;i<m;i++) 	{ 		printf("%d ",a[i]); 	} 	for(j=0;j<n;j++) 	{ 		d = true; 		for(i=0;i<m;i++) 		{    			if (a[i] == b[j]) 			{ 				d = false; 				break; 			} 		} 		if (d) 			printf("%d ",b[j]); 	} }

思路：先输出a中的，然后扉b中各数，若该数在a中没有，就输出


Question: 可以直接给字符指针赋值一个字符串吗？

不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

你用strcpy才是你说的修改了随机值指向的内存里的内容 直接=赋值改变的只是指针的指向，是可以的

不会有问题。 str是一个变量，可以存储任何指向char的地址。 M跟“hello world”一样，编译器会为这个字符串分配合适的空间，存入字符换。这一串空间有起始地址。 把该起始地址复制给str。 str就指向了确定的位置，即“hello world”的起始位置了

引用 5楼u014523360 的回复:定义的时候，这么写：const char* ...因为字符串字面量表达式的结果是一个常见^_^量的地址常量地址

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

引用 1 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898  嗯，试过了，就是用字符串替换掉了，char * str = “hello world”，请问这样的写法有问题吗？

你的理解应该有错。str内部确实是个随机值。因为正是那个随机值。str才是指向的随机值对应的内存啊。所以一旦你赋值了。str就指向你的宏定义M对应字符串常量的值了。（字符串其实就是一个地址而已） str值：00000001；//随机值，这时不知道指向哪。。 “hello world”首地址；11111111； （你应该知道，既然指针是变量，那么指针也是有地址的。不信printf("%x",&str) 区别printf(%x,str)   ） char *str=“hello world”； 这时str值变为：11111111；//指向hello world

字符串常量是一个不可更改的值，所以应该赋给const char * 才对，不过赋给char*也可以，只要你不通过这个指针来试图修改指向的字符串就行

引用 9 楼 paschen 的回复:没问题，这里只是指针赋值，而不是修改指针指向的内容  本应该用const char* =  xxx  可以用char*是由于历史原因  这才是最正确的答案


Question: 强制类型转换失败，什么原因列？

比某某老师强。~~ 。开个玩笑啦~

4 楼正解啊。  int testFunc(int * pIntA) { 	if (NULL == pIntA) 	{ 		return ERROR; 	}  	int *pcTestA1; 	pcTestA1 = (int *)malloc(sizeof(int));  	if(NULL == pcTestA1) 	{ 		return ERROR; 	} 	pIntA = pcTestA1;  	*pIntA = 0x1000;         free(pcTestA1); 	return OK; } 函数写成这样就没有问题。多谢指点。

pcTestA = (char *)malloc(sizeof(char)); 后，pcTestA所指向的位置只有1个字节（(sizeof(char)）的空间可以合法使用 *pIntA = 0x1000; 强转后，要使用的空间为sizeof(int)个字节，一般比1大，用到了不该用的，很可能要出问题

，赵4老师说的是啊，自己单步调试想一想吧。

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

不好意思，自己把错误去掉了，//*pIntA = 0x1000; 但是具体是什么原因列？为啥不能给int * pIntA 赋值列，一直没有想明白。


Question: c   线性查找数组元素  问题求解

return以后就不会执行之后的代码了。 只要你要查找的key在array前100个元素里面，那么就不会return -1; 如果找不到key的话就会返回-1了

从函数实现上看，如果下标0~99元素都不为key，才返回-1，否则返回下标号

只会返回一次，第一个return 执行之后， 后面的代码不会执行到


Question: 召唤大神  隐式函数申明

感动的稀里哗啦，谢谢推荐的书！

《程序员的自我修养——链接、装载与库》


Question: error C2065: 'o' : undeclared identifier编译出现该情况，怎么解决？

main函数里的for循环，i = 0,看好了是数字零，不是字母o

1.0写成了o 2.main前面少了void 3.你的NONO函数只有声明没有实现 4.用rand之前要srand一下  #include<stdlib.h> #include<stdio.h> #include<time.h> void fun(int a[], int n, int*max, int*d) { 	int i; 	*max = a[0]; *d = 0; 	for (i = 1; i<n; i++) 	if (*max<a[i]) 	{ 		*max = a[i]; 		*d = i; 	} }  void NONO() {  }  void main() { 	int i, x[20], max, index, n = 10;  	srand(time(NULL)); 	for (i = 0; i<n; i++) 	{ 		x[i] = rand() % 50; printf("%4d", x[i]); 	} 	printf("\n"); 	fun(x, n, &max, &index); 	printf("Max=%5d,index=%4d\n", max, index); 	NONO(); }

等级考试的改错题，应该有一半多的可以看编译错误或较高解决

for(i=o;i<n;i++) 这里应该是 0 吧， 而不是o

各路大神，小弟在此请教各位！速显神通把！


Question: 报这个错，具体是什么原因，hu不是已近被填入内容了吗？

首先，*hu++加加这样是不行的，hu代表是个常量，常量是不支持自加自减得，比如说数字3，你就不能3++，或者3--。可以这样hu[i++]来替换*hu++,实际效果是一样的。  *p++ = *q++,这个是可以复制第一个对象的，原因在于，后置++，是先进行运算，再进行++，即是说++的优先级高于*，也是还是这样。等价于，*p = *q,q++,p++;这个很重要

引用 6 楼 家人是最好的礼物的回复:我想你的意思是*(hu++)应该要先hu++再进行取值操作吧。不然就是（*hu）++了，就算能运行结果也不是预期的。 嗯嗯，我查了下++的优先级高于*的，不用括号也可以的。但是现在我又有了疑问:这种*p++，得到的是是p所指向的下一个对象，那么这句:*p++ = *q++这种他们指向的第一个对象就不能赋值了，而是直接把二个对象赋值了过去。但是运行程序时，能打印出来第一个，这是为什么？

先把vc6.0换了再说

数组不支持++运算  你可以 char* p = hu;  然后对p进行运算

你的hu是个数组，不支持++操作，你得用一个指针指向它，然后对指针才能++ 你的cp函数里的A和B之所以可以++，是因为数组传参会退化成指针。

include<stdio.h> void cp(char *A,char *B,int count) { 	do 	{ 		*(A++)=*(B++); 	} 	while (count--); } int main() { 	int i=0; 	char *t=NULL; 	char string[]={'1','2','3','4','5','6','7'}; 	char hu[10]; 	while （i＜=7） 	     hu[i++]='\0'; 	cp(hu,string,6); 	t=hu; 	while (*t!='\0') 	       printf("%c",*(t++));     putchar('\n');     return 0; }

为什么要换vc.60，有什么影响？谢谢啊


Question: 我用lex+yacc做计算器,gcc说yylex()找不到,编译错误?

遇到同样的问题，郁闷中。。。


Question: 结构指定初始化问题

谢谢各位，明白了！……

c-free5.0版本已经可以支持c99标准，但不一定全部支持

不要纠结这些可有可无的语法技巧。

“使用点运算符+成员名的方法，对指定成员初始化”是一种语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。


Question: 求教：求字符串中各字符的数量 输入方法改变就不行了

谁跟你说这几个函数是一模一样的了？ ch=getchar()等价于scanf("%c", &ch)

这几个函数作用是不同的，参数也是不一样的，返回值代表的含义也不同  你只是单纯把getchar换成其他的怎么会行呢

getchar（）跟gets（）或者scanf（）一样吗？


Question: 请教大神一个程序，关于选择法排序

上面说错了 for(j=i+1; j<10; ++j)  {     if (a[k] < a[j])           k = j; } if (k!=i)  // 在for 循环外部 {      t = a[k];      a[k] = a[i];      a[i] = t; }

k = i; for(j=i+k; j<10; j++)  而不是 for(j=i+1; j<10; j++)

单步跟踪程序运行，观察分析原因，看是执行是否符合你期望的逻辑

各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/


Question: 求助 fwrite

在ASCII吗中，’/0’对应0；输出数字0，而按照字符输出时，就是空什么都没有。在文件中也不是空格

引用 7 楼 qq_36210087 的回复:[quote=引用 5 楼 yuelengdihai 的回复:] for(i=0;i<5;i++) 25     { 26         if(fwrite(&z[i],sizeof(z),1,fp)!=1) 27             printf("file write error\n"); 28     }这样试试 没有错 传入'/0' 在文件里面显示的是空格吗？[/quote]

引用 5 楼 yuelengdihai 的回复:for(i=0;i<5;i++) 25     { 26         if(fwrite(&z[i],sizeof(z),1,fp)!=1) 27             printf("file write error\n"); 28     }这样试试 没有错 传入'/0' 在文件里面显示的是空格吗？

引用 4 楼 zhao4zhong1 的回复:电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。没有错 传入'/0' 在文件里面显示的是空格吗？

写入文件时 末尾多出了几个空格 数组z[5],里面就两个‘8’ 三个‘0’

不知你说什么  参看：http://en.cppreference.com/w/c/io/fwrite

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


Question: 在使用文件描述符和printf时发生的奇怪的现象

查看到这个博客http://www.cnblogs.com/fanzhidongyzby/p/3519838.html 然后自己试验了一下，果真如此。  对问题一，这是编译器对printf 的一种优化，对于printf的参数如果是以'\n'结束的纯字符串，printf会被优化为puts函数，而字符串的结尾'\n'符号被消除。除此之外，都会正常生成call printf指令。  第一个printf 反汇编结果为 callq  <_IO_printf> 第二个为 callq  <_IO_puts>  查看源代码，发现 ldbl_strong_alias (__printf, printf); 我理解的意思就是将printf绑定到符号__printf。 而在__printf 实现中，调用 vfprintf (stdout, format, arg); 直接使用的就是 stdout。  而在ioputs.c中， weak_alias (_IO_puts, puts) 将puts绑定到_IO_puts符号  这两个printf 确实是由差别的，第二个问题还没有找出原因。

提醒：printf是有源代码的。

然后发现，只要是 printf 带了可变参数，就是预期的情况，会输出，即strace 查看的系统调用就是write 到 fd(此处为3)，主要不带可变参数，直接输出字符串，就会出现上述问题。  帖子中fd的值写错了。


Question: nginx缓存cache模块相关，nginx reload的时候cache模块怎么停止扫描磁盘

还没有人来回答我吗，好伤心


引用 9 楼 fefe82 的回复:[quote=引用 8 楼 sinat_36023721 的回复:] [quote=引用 6 楼 fefe82 的回复:] [quote=引用 5 楼 sinat_36023721 的回复:] [quote=引用 4楼fefe82 的回复:]utf8 没有 0x00 。'w' 也是一个字节。  你会不会是 utf-16  utf-16 的话，不要用 strlen 取长度是utf16.那该怎么取长度，我打印了看的，如果是“我的w我的”，gbk长度是9即inlen为9，转换成unicode后长度变成了7……[/quote]  iconv 不是有一个 outlen 的输出嘛 ..[/quote]   我的意思是我转换完的文本再用strlen测长度只有7。。。。用printf按%c打印，00的后面也没有内容。[/quote]  utf16 的不能用 strlen 。strlen 只适用于“已零为结束的字符串”。utf16 编码串不是。%s 同理。  这里只能自己写一个长度检测的函数。 打印的话，还得转回 gbk 或 utf8 。[/quote]  C11 现在有 char16_t 用于存储 utf16 的字符（串），但是貌似还没有相应的 strlen ，printf 也不接受。

引用 8 楼 sinat_36023721 的回复:[quote=引用 6 楼 fefe82 的回复:] [quote=引用 5 楼 sinat_36023721 的回复:] [quote=引用 4楼fefe82 的回复:]utf8 没有 0x00 。'w' 也是一个字节。  你会不会是 utf-16  utf-16 的话，不要用 strlen 取长度是utf16.那该怎么取长度，我打印了看的，如果是“我的w我的”，gbk长度是9即inlen为9，转换成unicode后长度变成了7……[/quote]  iconv 不是有一个 outlen 的输出嘛 ..[/quote]   我的意思是我转换完的文本再用strlen测长度只有7。。。。用printf按%c打印，00的后面也没有内容。[/quote]  utf16 的不能用 strlen 。strlen 只适用于“已零为结束的字符串”。utf16 编码串不是。%s 同理。  这里只能自己写一个长度检测的函数。 打印的话，还得转回 gbk 或 utf8 。

引用 6 楼 fefe82 的回复:[quote=引用 5 楼 sinat_36023721 的回复:] [quote=引用 4楼fefe82 的回复:]utf8 没有 0x00 。'w' 也是一个字节。  你会不会是 utf-16  utf-16 的话，不要用 strlen 取长度是utf16.那该怎么取长度，我打印了看的，如果是“我的w我的”，gbk长度是9即inlen为9，转换成unicode后长度变成了7……[/quote]  iconv 不是有一个 outlen 的输出嘛 ..[/quote]   我的意思是我转换完的文本再用strlen测长度只有7。。。。用printf按%c打印，00的后面也没有内容。

引用 6楼fefe82 的回复:[quote=引用 5 楼 sinat_36023721 的回复:] [quote=引用 4楼fefe82 的回复:]utf8 没有 0x00 。'w' 也是一个字节。  你会不会是 utf-16  utf-16 的话，不要用 strlen 取长度是utf16.那该怎么取长度，我打印了看的，如果是“我的w我的”，gbk长度是9即inlen为9，转换成unicode后长度变成了7……[/quote]  iconv 不是有一个 outlen 的输出嘛 ..[/quote]outlen我是直接定长145

引用 5 楼 sinat_36023721 的回复:[quote=引用 4楼fefe82 的回复:]utf8 没有 0x00 。'w' 也是一个字节。  你会不会是 utf-16  utf-16 的话，不要用 strlen 取长度是utf16.那该怎么取长度，我打印了看的，如果是“我的w我的”，gbk长度是9即inlen为9，转换成unicode后长度变成了7……[/quote]  iconv 不是有一个 outlen 的输出嘛 ..

引用 4楼fefe82 的回复:utf8 没有 0x00 。'w' 也是一个字节。  你会不会是 utf-16  utf-16 的话，不要用 strlen 取长度是utf16.那该怎么取长度，我打印了看的，如果是“我的w我的”，gbk长度是9即inlen为9，转换成unicode后长度变成了7……

outbuf 的空间要先申请好.

不过我是转成UTF-8

outlen的长度一般要是inlen长度的3倍.  size_t outLen = inLen * 3 + 1; 我是这样处理的.

//iconv_linux下字符集编码转换轻松实现 (1) iconv_t iconv_open(const char *tocode, const char *fromcode); //此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。 (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft); //此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd); //此函数用于关闭转换句柄,释放资源。  //例子1: 用C语言实现的转换示例程序  /* f.c : 代码转换示例C程序 */ #include <iconv.h> #define OUTLEN 255 main() { char *in_utf8 = "姝ｅ?ㄥ??瑁?"; char *in_gb2312 = "正在安装"; char out[OUTLEN];  /*unicode码转为gb2312码*/ rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN); printf("unicode-->gb2312 out=%sn",out); //gb2312码转为unicode码  rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN); printf("gb2312-->unicode out=%sn",out); } /*代码转换:从一种编码转为另一种编码*/ int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) { iconv_t cd; int rc; char **pin = &inbuf; char **pout = &outbuf;  cd = iconv_open(to_charset,from_charset); if (cd==0) return -1; memset(outbuf,0,outlen); if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1; iconv_close(cd); return 0; } /*UNICODE码转为GB2312码*/ int u2g(char *inbuf,int inlen,char *outbuf,int outlen) { return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen); } /*GB2312码转为UNICODE码*/ int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) { return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); }  //例子2: 用C++语言实现的转换示例程序  /* f.cpp : 代码转换示例C++程序 */ #include <iconv.h> #include <iostream>  #define OUTLEN 255  using namespace std;  // 代码转换操作类  class CodeConverter {  private: iconv_t cd; public:  // 构造 CodeConverter(const char *from_charset,const char *to_charset) { cd = iconv_open(to_charset,from_charset); }   // 析构 ~CodeConverter() { iconv_close(cd); }   // 转换输出 int convert(char *inbuf,int inlen,char *outbuf,int outlen) { char **pin = &inbuf; char **pout = &outbuf;  memset(outbuf,0,outlen); return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen); } };  int main(int argc, char **argv) { char *in_utf8 = "姝ｅ?ㄥ??瑁?"; char *in_gb2312 = "正在安装"; char out[OUTLEN];  // utf-8-->gb2312 CodeConverter cc = CodeConverter("utf-8","gb2312"); cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN); cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;  // gb2312-->utf-8 CodeConverter cc2 = CodeConverter("gb2312","utf-8"); cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN); cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl; }    二、利用iconv命令进行编码转换  iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。  用法： iconv [选项...] [文件...]  有如下选项可用:  输入/输出格式规范： -f, --from-code=名称 原始文本编码 -t, --to-code=名称 输出编码  信息： -l, --list 列举所有已知的字符集  输出控制： -c 从输出中忽略无效的字符 -o, --output=FILE 输出文件 -s, --silent 关闭警告 --verbose 打印进度信息  -?, --help 给出该系统求助列表 --usage 给出简要的用法信息 -V, --version 打印程序版本号  例子: iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt 这个命令读取aaa.txt文件，从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。  小结: Linux为我们提供了强大的编码转换工具,给我们带来了方便。

strlen, wcslen, _mbslen, _mbstrlen Get the length of a string.  size_t strlen( const char *string );  size_t wcslen( const wchar_t *string );  size_t _mbslen( const unsigned char *string );  size_t _mbstrlen( const char *string );  Routine Required Header Compatibility  strlen <string.h> ANSI, Win 95, Win NT  wcslen <string.h> or <wchar.h> ANSI, Win 95, Win NT  _mbslen <mbstring.h> Win 95, Win NT  _mbstrlen <stdlib.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error.  Parameter  string  Null-terminated string  Remarks  Each of these functions returns the number of characters in string, not including the terminating null character. wcslen is a wide-character version of strlen; the argument of wcslen is a wide-character string. wcslen and strlen behave identically otherwise.   Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tcslen strlen strlen wcslen  _tcsclen strlen _mbslen wcslen    _mbslen and _mbstrlen return the number of multibyte characters in a multibyte-character string. _mbslen recognizes multibyte-character sequences according to the multibyte code page currently in use; it does not test for multibyte-character validity. _mbstrlen tests for multibyte-character validity and recognizes multibyte-character sequences according to the LC_CTYPE category setting of the current locale. For more information about the LC_CTYPE category, see setlocale.  Example  /*  STRLEN.C */  #include <string.h> #include <stdio.h> #include <conio.h> #include <dos.h>  void main( void ) {    char buffer[61] = "How long am I?";    int  len;    len = strlen( buffer );    printf( "'%s' is %d characters long\n", buffer, len ); }   Output  'How long am I?' is 14 characters long   String Manipulation Routines |  Locale Routines  See Also   setlocale, strcat, strcmp, strcoll Functions, strcpy, strrchr, _strset, strspn  printf, wprintf Print formatted output to the standard output stream.  int printf( const char *format [, argument]... );  int wprintf( const wchar_t *format [, argument]... );  Routine Required Header Compatibility  printf <stdio.h> ANSI, Win 95, Win NT  wprintf <stdio.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns the number of characters printed, or a negative value if an error occurs.  Parameters  format  Format control  argument  Optional arguments  Remarks  The printf function formats and prints a series of characters and values to the standard output stream, stdout. If arguments follow the format string, the format string must contain specifications that determine the output format for the arguments. printf and fprintf behave identically except that printf writes output to stdout rather than to a destination of type FILE.  wprintf is a wide-character version of printf; format is a wide-character string. wprintf and printf behave identically otherwise.   Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tprintf printf printf wprintf    The format argument consists of ordinary characters, escape sequences, and (if arguments follow format) format specifications. The ordinary characters and escape sequences are copied to stdout in order of their appearance. For example, the line  printf("Line one\n\t\tLine two\n");   produces the output  Line one         Line two  Format specifications always begin with a percent sign (%) and are read left to right. When printf encounters the first format specification (if any), it converts the value of the first argument after format and outputs it accordingly. The second format specification causes the second argument to be converted and output, and so on. If there are more arguments than there are format specifications, the extra arguments are ignored. The results are undefined if there are not enough arguments for all the format specifications.  Example  /* PRINTF.C: This program uses the printf and wprintf functions  * to produce formatted output.  */  #include <stdio.h>  void main( void ) {    char   ch = 'h', *string = "computer";    int    count = -9234;    double fp = 251.7366;    wchar_t wch = L'w', *wstring = L"Unicode";     /* Display integers. */    printf( "Integer formats:\n"            "\tDecimal: %d  Justified: %.6d  Unsigned: %u\n",            count, count, count, count );     printf( "Decimal %d as:\n\tHex: %Xh  C hex: 0x%x  Octal: %o\n",             count, count, count, count );     /* Display in different radixes. */    printf( "Digits 10 equal:\n\tHex: %i  Octal: %i  Decimal: %i\n",             0x10, 010, 10 );     /* Display characters. */     printf("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch);    wprintf(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch);     /* Display strings. */     printf("Strings in field (1):\n%25s\n%25.4hs\n\t%S%25.3ls\n",    string, string, wstring, wstring);    wprintf(L"Strings in field (2):\n%25S\n%25.4hs\n\t%s%25.3ls\n",        string, string, wstring, wstring);     /* Display real numbers. */    printf( "Real numbers:\n\t%f %.2f %e %E\n", fp, fp, fp, fp );     /* Display pointer. */    printf( "\nAddress as:\t%p\n", &count);     /* Count characters printed. */    printf( "\nDisplay to here:\n" );    printf( "1234567890123456%n78901234567890\n", &count );    printf( "\tNumber displayed: %d\n\n", count ); }   Output  Integer formats:    Decimal: -9234  Justified: -009234  Unsigned: 4294958062 Decimal -9234 as:    Hex: FFFFDBEEh  C hex: 0xffffdbee  Octal: 37777755756 Digits 10 equal:    Hex: 16  Octal: 8  Decimal: 10 Characters in field (1):          h    h    w    w Characters in field (2):          h    h    w    w Strings in field (1):                  computer                      comp    Unicode                      Uni Strings in field (2):                  computer                      comp    Unicode                      Uni Real numbers:    251.736600 251.74 2.517366e+002 2.517366E+002  Address as:   0012FFAC  Display to here: 123456789012345678901234567890    Number displayed: 16   Floating-Point Support Routines |  Stream I/O Routines |  Locale Routines  See Also   fopen, fprintf, scanf, sprintf, vprintf Functions


Question: 数组排序问题求解决

中间应该要是这样吧：              hold = a[i];             a[i] = a[i+1];             a[i + 1]=hold;

=是赋值啊，你直接这样赋值，其中一个变量的值早就没了。你交换值还有用么。

仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

a[i]^=a[i+1]; a[i+1]^=a[i]; a[i]^=a[i+1]; 就可以了，异或交换2个变量，无需第三个变量

你两个手都放满了东西，现在你想换两个手拿的东西，你不把其中一个手的东西放到别的地方能交换吗？

你得先把其中一个值存下来才行 http://blog.163.com/eng_2005@126/blog/static/17209075820111129512486/


Question: linux下一个进程开300个线程的问题

引用 10 楼 q3733353520 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] [quote=引用 7 楼 u010370871 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师[/quote] 不知道，因为我也没实际使用过。[/quote][/quote] 知之为知之，不知为不知，是知也。

我这个主要不是考虑服务器端问题，服务器端没什么压力，主要是我客户端要开很多线程去通过服务器端访问设备，而且必须是一个进程开很多线程，主要是不清楚并发时客户端进程是否会压力很大，我也模拟不了

我这个不适合用epoll主要是因为对每个设备有个持续的交互完成一系列的动作，而且几次交互才能完成一条指令用epoll状态机我不好维护，数据会有很频繁持续的交互但是时间也就2分钟而已

引用 2楼slmax1 的回复:我目前的项目与你的有点相似, 不过我是这样处理的. 线程不与设备对应,线程只处理设备发来的信息.一个信息由一个线程处理. 处理完成后,线程休眠,有新的信息来,由主线程分配任务给处理线程.这样处理比较合理，多了一层线程管控处理

搜“epoll”

引用 3 楼 xian_wwq 的回复:多线程模型可以方便高效的解决小规模的服务请求，但面对大规模的服务请求，多线程模型并不是最佳方案。 lz可以参考这篇文章 http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/  文章不错..

引用 8 楼 zhao4zhong1 的回复:[quote=引用 7 楼 u010370871 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师[/quote] 不知道，因为我也没实际使用过。[/quote]

如果300个设备的数据量不是很多，通信也不是特别频繁，300个线程大多处在休眠状态，所谓的线程切换的损失，就完全可以忍受。

引用 7 楼 u010370871 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师[/quote] 不知道，因为我也没实际使用过。

引用 5 楼 zhao4zhong1 的回复:搜“epoll” 多线程的东西epoll跟select是基本吧，赵老师

补充一下每个设备我都回开一个线程与其对应


Question: 为什么我创建的二叉树链表不能完全执行，是哪出错了？求帮助

也可输入3 6 0 7 5 0 6 0 0 3 0 0 4 0 0 输出为6 5 6 7 3 3 4 ，到底这输入是什么规率，我也没搞懂啊！！！

我是为了让你看下效果才随便输入的，如果问题是这个的话，我也不会问了， 它就是没报错，但也没输出，我觉得是create那个函数的问题，但又找不到问题出在哪。。

看来你根本没搞懂。  你要输入的话。应该是输入：1 2 0 0 3 0 0 类似这样的才行

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

没报错，就是没结果，   一直输入，不会有输出。

你报的什么错？

仅供参考：#include <iostream> #include <stack> #include <queue> #include <locale.h> using namespace std; typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int CreateBiTree(BiTree &T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         T = NULL;     } else {         T = (BiTree)malloc(sizeof(BiTNode));         T->data = data;         //生成根结点         CreateBiTree(T->lchild);//构造左子树         CreateBiTree(T->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈             stack.pop();             p = p->rchild;          //访问右子树         }     } } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈，访问根节点             printf("%c ",p->data);             stack.pop();             p = p->rchild;          //访问右子树         }     } }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     stack<BiTreePost> stack;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack.push(BT);             p = p->lchild;         }         while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点             BT = stack.top();             stack.pop();//退栈             printf("%c ",BT->biTree->data);         }         if (!stack.empty()) {//遍历右子树             BT = stack.top();             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     } }  void LevelOrder(BiTree T) {//层次遍历     if (T == NULL) return;     BiTree p = T;     queue<BiTree> queue;//队列     queue.push(p);//根节点入队     while (!queue.empty()) {    //队列不空循环         p = queue.front();      //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         queue.pop();            //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue.push(p->lchild);         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue.push(p->rchild);         }     } } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G

引用 1 楼 qq423399099 的回复:1.create函数return的应该是*T 2.接收也应该是T = create(&T); 3.你的PreOderTraverse是啥，应该是InOderTraverse吧？  #include<stdio.h> #include<stdlib.h> #include<malloc.h>  typedef int data; typedef int ElemType;  typedef struct tree { 	ElemType data; 	struct tree *Lchild, *Rchild; }Bitree;  Bitree *create(Bitree **T) { 	ElemType i; 	scanf_s("%d", &i); 	if (i == 0) 		*T = NULL; 	else 	{ 		*T = (Bitree *)malloc(sizeof(Bitree)); 		(*T)->data = i; 		//printf("  %d", (*T)->data); 		create(&((*T)->Lchild)); 		create(&((*T)->Rchild)); 	} 	return *T; }  int InOderTraverse(Bitree *T) { 	if (T) 	{ 		InOderTraverse(T->Lchild); 		printf("%d ", T->data); 		InOderTraverse(T->Rchild); 	} 	return 1; }  int main() { 	Bitree *T; 	T = create(&T); 	InOderTraverse(T);  	system("pause"); 	return 0; }  不行，还是一样的问题，InOderTraverse是中序，复制黏贴的时候没注意！ 你编译通过了？


Question: 数据结构！！！基础

引用 9 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  特别佩服牛人们读人家代码还能找到错误。。。

引用 11 楼 paschen的回复:[quote=引用 8 楼 xinye1230 的回复:] [quote=引用 7 楼 user-5 的回复:] 把改过后的代码和报错信息一起粘 贴过来，才能帮你 #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;   typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList void CreateList_L(LinkList &L,int n) {     int i;     LinkList p;     L=(LinkList)malloc(sizeof(LNode));     L->next=NULL;     for(i=n;i>0;--i)     {         p=(LinkList)malloc(sizeof(LNode));         scanf("%d",&p->data); 		getchar();         L->next=p->next;         p->next=L;     } } Status GetElem_L(LinkList L,int i,ElemType &e) {     int j;     LinkList p;     p=L->next;j=1;     while(p&&j<i)     {         p=p->next;         ++j;     }     if(!p||j>i)         return ERROR;     e=p->data;     return OK; } Status ListInsert_L(LinkList L,int i,ElemType &e) {     int j;     LinkList p,s;     p=L;j=0;     while(p&&j<i-1)     {         p=p->next;         ++j;     }     if(!p||j>i-1)         return ERROR;     s=(LinkList)malloc(sizeof(LNode));     s->data=e;     s->next=p->next;     p->next=s;     return OK; } Status ListDelete_L(LinkList &L,int i,ElemType &e) {     int j;     LinkList p,q;     p=L;j=0;     while(p->next&&j<i-1)     {         p=p->next;         ++j;     }     if(!(p->next)||j>i-1)         return ERROR;     q=p->next;     p->next=q->next;     e=q->data;     free(q);     return OK;   }   void main() {     LinkList p,L;     int n;     scanf("%d",&n); 	getchar();     CreateList_L(L,n);     p=L->next;     while(p)     {         printf("%d ",p->data);         p=p->next;     }     printf("\n");     int i;     ElemType e;     scanf("%d",&i); 	getchar();     GetElem_L(L,i,e);     printf("%d\n",e);     scanf("%d %d",&i,&e); 	getchar();     ListInsert_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n");     scanf("%d",&i); 	getchar();     ListDelete_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n"); } e:\c\pp.c(17) : error C2143: syntax error : missing ';' before 'type' e:\c\pp.c(17) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(17) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(17) : error C2059: syntax error : '&' e:\c\pp.c(17) : error C2059: syntax error : ')' e:\c\pp.c(32) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(32) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(32) : error C2059: syntax error : '&' e:\c\pp.c(32) : error C2059: syntax error : ')' e:\c\pp.c(47) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(47) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(47) : error C2059: syntax error : '&' e:\c\pp.c(47) : error C2059: syntax error : ')' e:\c\pp.c(65) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(65) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(65) : error C2059: syntax error : '&' e:\c\pp.c(65) : error C2059: syntax error : ')' e:\c\pp.c(91) : warning C4013: 'CreateList_L' undefined; assuming extern returning int e:\c\pp.c(99) : error C2143: syntax error : missing ';' before 'type' e:\c\pp.c(100) : error C2275: 'ElemType' : illegal use of this type as an expression         e:\c\pp.c(11) : see declaration of 'ElemType' e:\c\pp.c(100) : error C2146: syntax error : missing ';' before identifier 'e' e:\c\pp.c(100) : error C2065: 'e' : undeclared identifier e:\c\pp.c(101) : error C2065: 'i' : undeclared identifier e:\c\pp.c(103) : warning C4013: 'GetElem_L' undefined; assuming extern returning int e:\c\pp.c(107) : warning C4013: 'ListInsert_L' undefined; assuming extern returning int e:\c\pp.c(115) : warning C4013: 'ListDelete_L' undefined; assuming extern returning int 执行 cl.exe 时出错.  pp.obj - 1 error(s), 0 warning(s)  这是我学数据结构的第一个代码   我自己也不知道是什么意思，完全不懂[/quote]   typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList  这句后面少了分号[/quote] 谢谢，我知道了。

引用 10 楼 小灸舞的回复:typedef这里最后少了个分号，导致一坨错误 跑起来以后，如果还有错误可以单步调试。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;  typedef struct LNode{ 	ElemType data; 	struct LNode *next; }LNode, *LinkList; void CreateList_L(LinkList &L, int n) { 	int i; 	LinkList p; 	L = (LinkList)malloc(sizeof(LNode)); 	L->next = NULL; 	for (i = n; i > 0; --i) 	{ 		p = (LinkList)malloc(sizeof(LNode)); 		scanf("%d", &p->data); 		getchar(); 		L->next = p->next; 		p->next = L; 	} } Status GetElem_L(LinkList L, int i, ElemType &e) { 	int j; 	LinkList p; 	p = L->next; j = 1; 	while (p&&j<i) 	{ 		p = p->next; 		++j; 	} 	if (!p || j>i) 		return ERROR; 	e = p->data; 	return OK; } Status ListInsert_L(LinkList L, int i, ElemType &e) { 	int j; 	LinkList p, s; 	p = L; j = 0; 	while (p&&j<i - 1) 	{ 		p = p->next; 		++j; 	} 	if (!p || j>i - 1) 		return ERROR; 	s = (LinkList)malloc(sizeof(LNode)); 	s->data = e; 	s->next = p->next; 	p->next = s; 	return OK; } Status ListDelete_L(LinkList &L, int i, ElemType &e) { 	int j; 	LinkList p, q; 	p = L; j = 0; 	while (p->next&&j<i - 1) 	{ 		p = p->next; 		++j; 	} 	if (!(p->next) || j>i - 1) 		return ERROR; 	q = p->next; 	p->next = q->next; 	e = q->data; 	free(q); 	return OK;  }  void main() { 	LinkList p, L; 	int n; 	scanf("%d", &n); 	getchar(); 	CreateList_L(L, n); 	p = L->next; 	while (p) 	{ 		printf("%d ", p->data); 		p = p->next; 	} 	printf("\n"); 	int i; 	ElemType e; 	scanf("%d", &i); 	getchar(); 	GetElem_L(L, i, e); 	printf("%d\n", e); 	scanf("%d %d", &i, &e); 	getchar(); 	ListInsert_L(L, i, e); 	for(p = L->next; p; p = p->next) 	{ 		printf("%d ", p->data); 	} 	printf("\n"); 	scanf("%d", &i); 	getchar(); 	ListDelete_L(L, i, e); 	for (p = L->next; p; p = p->next) 	{ 		printf("%d ", p->data); 	} 	printf("\n"); }  谢谢，对我太有帮助了

引用 8 楼 xinye1230 的回复:[quote=引用 7 楼 user-5 的回复:] 把改过后的代码和报错信息一起粘 贴过来，才能帮你 #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;   typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList void CreateList_L(LinkList &L,int n) {     int i;     LinkList p;     L=(LinkList)malloc(sizeof(LNode));     L->next=NULL;     for(i=n;i>0;--i)     {         p=(LinkList)malloc(sizeof(LNode));         scanf("%d",&p->data); 		getchar();         L->next=p->next;         p->next=L;     } } Status GetElem_L(LinkList L,int i,ElemType &e) {     int j;     LinkList p;     p=L->next;j=1;     while(p&&j<i)     {         p=p->next;         ++j;     }     if(!p||j>i)         return ERROR;     e=p->data;     return OK; } Status ListInsert_L(LinkList L,int i,ElemType &e) {     int j;     LinkList p,s;     p=L;j=0;     while(p&&j<i-1)     {         p=p->next;         ++j;     }     if(!p||j>i-1)         return ERROR;     s=(LinkList)malloc(sizeof(LNode));     s->data=e;     s->next=p->next;     p->next=s;     return OK; } Status ListDelete_L(LinkList &L,int i,ElemType &e) {     int j;     LinkList p,q;     p=L;j=0;     while(p->next&&j<i-1)     {         p=p->next;         ++j;     }     if(!(p->next)||j>i-1)         return ERROR;     q=p->next;     p->next=q->next;     e=q->data;     free(q);     return OK;   }   void main() {     LinkList p,L;     int n;     scanf("%d",&n); 	getchar();     CreateList_L(L,n);     p=L->next;     while(p)     {         printf("%d ",p->data);         p=p->next;     }     printf("\n");     int i;     ElemType e;     scanf("%d",&i); 	getchar();     GetElem_L(L,i,e);     printf("%d\n",e);     scanf("%d %d",&i,&e); 	getchar();     ListInsert_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n");     scanf("%d",&i); 	getchar();     ListDelete_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n"); } e:\c\pp.c(17) : error C2143: syntax error : missing ';' before 'type' e:\c\pp.c(17) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(17) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(17) : error C2059: syntax error : '&' e:\c\pp.c(17) : error C2059: syntax error : ')' e:\c\pp.c(32) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(32) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(32) : error C2059: syntax error : '&' e:\c\pp.c(32) : error C2059: syntax error : ')' e:\c\pp.c(47) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(47) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(47) : error C2059: syntax error : '&' e:\c\pp.c(47) : error C2059: syntax error : ')' e:\c\pp.c(65) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(65) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(65) : error C2059: syntax error : '&' e:\c\pp.c(65) : error C2059: syntax error : ')' e:\c\pp.c(91) : warning C4013: 'CreateList_L' undefined; assuming extern returning int e:\c\pp.c(99) : error C2143: syntax error : missing ';' before 'type' e:\c\pp.c(100) : error C2275: 'ElemType' : illegal use of this type as an expression         e:\c\pp.c(11) : see declaration of 'ElemType' e:\c\pp.c(100) : error C2146: syntax error : missing ';' before identifier 'e' e:\c\pp.c(100) : error C2065: 'e' : undeclared identifier e:\c\pp.c(101) : error C2065: 'i' : undeclared identifier e:\c\pp.c(103) : warning C4013: 'GetElem_L' undefined; assuming extern returning int e:\c\pp.c(107) : warning C4013: 'ListInsert_L' undefined; assuming extern returning int e:\c\pp.c(115) : warning C4013: 'ListDelete_L' undefined; assuming extern returning int 执行 cl.exe 时出错.  pp.obj - 1 error(s), 0 warning(s)  这是我学数据结构的第一个代码   我自己也不知道是什么意思，完全不懂[/quote]   typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList  这句后面少了分号

引用 7 楼 user-5 的回复:把改过后的代码和报错信息一起粘 贴过来，才能帮你 #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;   typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList void CreateList_L(LinkList &L,int n) {     int i;     LinkList p;     L=(LinkList)malloc(sizeof(LNode));     L->next=NULL;     for(i=n;i>0;--i)     {         p=(LinkList)malloc(sizeof(LNode));         scanf("%d",&p->data); 		getchar();         L->next=p->next;         p->next=L;     } } Status GetElem_L(LinkList L,int i,ElemType &e) {     int j;     LinkList p;     p=L->next;j=1;     while(p&&j<i)     {         p=p->next;         ++j;     }     if(!p||j>i)         return ERROR;     e=p->data;     return OK; } Status ListInsert_L(LinkList L,int i,ElemType &e) {     int j;     LinkList p,s;     p=L;j=0;     while(p&&j<i-1)     {         p=p->next;         ++j;     }     if(!p||j>i-1)         return ERROR;     s=(LinkList)malloc(sizeof(LNode));     s->data=e;     s->next=p->next;     p->next=s;     return OK; } Status ListDelete_L(LinkList &L,int i,ElemType &e) {     int j;     LinkList p,q;     p=L;j=0;     while(p->next&&j<i-1)     {         p=p->next;         ++j;     }     if(!(p->next)||j>i-1)         return ERROR;     q=p->next;     p->next=q->next;     e=q->data;     free(q);     return OK;   }   void main() {     LinkList p,L;     int n;     scanf("%d",&n); 	getchar();     CreateList_L(L,n);     p=L->next;     while(p)     {         printf("%d ",p->data);         p=p->next;     }     printf("\n");     int i;     ElemType e;     scanf("%d",&i); 	getchar();     GetElem_L(L,i,e);     printf("%d\n",e);     scanf("%d %d",&i,&e); 	getchar();     ListInsert_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n");     scanf("%d",&i); 	getchar();     ListDelete_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n"); } e:\c\pp.c(17) : error C2143: syntax error : missing ';' before 'type' e:\c\pp.c(17) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(17) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(17) : error C2059: syntax error : '&' e:\c\pp.c(17) : error C2059: syntax error : ')' e:\c\pp.c(32) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(32) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(32) : error C2059: syntax error : '&' e:\c\pp.c(32) : error C2059: syntax error : ')' e:\c\pp.c(47) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(47) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(47) : error C2059: syntax error : '&' e:\c\pp.c(47) : error C2059: syntax error : ')' e:\c\pp.c(65) : error C2143: syntax error : missing ')' before '&' e:\c\pp.c(65) : error C2143: syntax error : missing '{' before '&' e:\c\pp.c(65) : error C2059: syntax error : '&' e:\c\pp.c(65) : error C2059: syntax error : ')' e:\c\pp.c(91) : warning C4013: 'CreateList_L' undefined; assuming extern returning int e:\c\pp.c(99) : error C2143: syntax error : missing ';' before 'type' e:\c\pp.c(100) : error C2275: 'ElemType' : illegal use of this type as an expression         e:\c\pp.c(11) : see declaration of 'ElemType' e:\c\pp.c(100) : error C2146: syntax error : missing ';' before identifier 'e' e:\c\pp.c(100) : error C2065: 'e' : undeclared identifier e:\c\pp.c(101) : error C2065: 'i' : undeclared identifier e:\c\pp.c(103) : warning C4013: 'GetElem_L' undefined; assuming extern returning int e:\c\pp.c(107) : warning C4013: 'ListInsert_L' undefined; assuming extern returning int e:\c\pp.c(115) : warning C4013: 'ListDelete_L' undefined; assuming extern returning int 执行 cl.exe 时出错.  pp.obj - 1 error(s), 0 warning(s)  这是我学数据结构的第一个代码   我自己也不知道是什么意思，完全不懂

把改过后的代码和报错信息一起粘 贴过来，才能帮你

引用 4 楼 user-5 的回复:还有，在所有的scanf函数后面都加上一句getchar();清空缓存  不行啊、、、

引用 2 楼 paschen 的回复:scanf(&p->data);  scanf第一个参数是字符串，而不是接收数据的地址  主函数中 int i  后面少了个分号   改了，还是有一堆错误、

还有，在所有的scanf函数后面都加上一句getchar();清空缓存

void CreateList_L(LinkList &L,int n) { 	int i;	 	LinkList p=NULL,pend=NULL;	 	L=(LinkList)malloc (sizeof (LNode));	 	L->next=NULL;	 	for （i=n;i＞0;--i）     {     	p=(LinkList)malloc(sizeof (LNode));		     	scanf("%d",&p->data);		     	getchar();     	if (L->next==NULL)          	L->next=p;	         else             pend->next=p;     	pend=p;     } }

3楼的回复，你没看到吗？照着改啊

#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;   typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList; void CreateList_L(LinkList L,int n) {     int i;     LinkList p;     L=(LinkList)malloc(sizeof(LNode));     L->next=NULL;     for(i=n;i>0;--i)     {         p=(LinkList)malloc(sizeof(LNode));         scanf("%d",&p->data);         L->next=p->next;         p->next=L;     } } Status GetElem_L(LinkList L,int i,ElemType e) {     int j;     LinkList p;     p=L->next;j=1;     while(p&&j<i)     {         p=p->next;         ++j;     }     if(!p||j>i)         return ERROR;     e=p->data;     return OK; } Status ListInsert_L(LinkList L,int i,ElemType e) {     int j;     LinkList p,s;     p=L;j=0;     while(p&&j<i-1)     {         p=p->next;         ++j;     }     if(!p||j>i-1)         return ERROR;     s=(LinkList)malloc(sizeof(LNode));     s->data=e;     s->next=p->next;     p->next=s;     return OK; } Status ListDelete_L(LinkList L,int i,ElemType e) {     int j;     LinkList p,q;     p=L;j=0;     while(p->next&&j<i-1)     {         p=p->next;         ++j;     }     if(!(p->next)||j>i-1)         return ERROR;     q=p->next;     p->next=q->next;     e=q->data;     free(q);     return OK;   }   void main() {     LinkList p,L;     int n; 	int i;     ElemType e;     scanf("%d",&n);     CreateList_L(L,n);     p=L->next;     while(p)     {         printf("%d ",p->data);         p=p->next;     }     printf("\n");         scanf("%d ",&i);     GetElem_L(L,i,e);     printf("%d\n",e);     scanf("%d %d",&i,&e);     ListInsert_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n");     scanf("%d",&i);     ListDelete_L(L,i,e);     for(p=L->next;p;p=p->next)     {         printf("%d ",p->data);     }     printf("\n"); }  编辑和组建没有问题，但是运行的时候，突然中断了，这又是什么情况啊，哪里出问题了嘛？


Question: 使用gdb如何单步c程序对应的汇编指令?

应该是 i 吧  ..

layout regs：显示源代码/反汇编和CPU寄存器窗口

10. 查看寄存器 要查看寄存器的值，很简单，可以使用如下命令： info registers 查看寄存器的情况(除了浮点寄存器)。 info all-registers 查看所有寄存器的情况(包括浮点寄存器)。 info registers <regname ...> 查看所指定的寄存器的情况。 寄存器中放置了程序运行时的数据，比如程序当前运行的指令地址(ip)，程序的当前堆栈地址(sp)等。同样可以使用print命令来访问寄存器的情况，只需要在寄存器名字前加一个$符号就可以了，如p。

引用 1 楼 zhao4zhong1 的回复:layout：用于分割窗口，可以一边查看代码，一边测试： layout src：显示源代码窗口 layout asm：显示反汇编窗口 layout regs：显示源代码/反汇编和CPU寄存器窗口 layout split：显示源代码和反汇编窗口  能否同时显示源代码和寄存器窗口? 好像用layout调整的时候，要么显示源码，要么显示寄存器，只有反汇编的窗口不被覆盖。 还请指点!


Question: 将给定的数转换为字符串，原则如下，1对应a,2对应b,...26对应z,例如12258可以转换为'abbeh','aveh'

动态规划：https://blog.csdn.net/jingjingxiazhe/article/details/88287107

会做但真不想帮伸手党贴代码。  题目要求的是个数，可以用动态规划做，非常简单。

#include <stdio.h> int main(){  	char ch,*p; 	char chs[26]; 	int i; 	int k=0; 	for(i=97;i<=122;i++){ 		chs[k]=i; 		k++; 	} 		 	p=chs; 	printf("%c",*(p+3));     return 0; }    自己加个循环改下就可以了

仅供参考：#include <stdio.h> #include <string.h> char *a="abcde"; int L,i,j,k; void main() {     L=strlen(a);     for (i=1;i<=L;i++) {         for (j=0;j<=L-i;j++) {             for (k=j;k<j+i;k++) {                 printf("%c",a[k]);             }             printf("\n");         }     } }

你有没有做出来~同问呀~

z写错了。。。。。大哥帮帮忙 啊  想了一下午

逻辑有问题： 26到底对应bf还是对应z？

将一个数字依次对10取模、除10 得到每一位的数字，然后将这个数字 + 'a' -1 得到对应的字符，重组得到字符串

求大神啊！！！！！！！！！！！！！！！！！！锐捷笔记


Question: 算法请教，根据2组互斥对，找出一个数组使得和每组互斥对的交集为1

比如你的例子有 (1 8 21 24 32 42 50 58) (1 14 17 28 37 46 53 60) 两组解。

解并不唯一。

穷举？毕竟也就穷举 2^n 个（逃  不过这样看来，整个穷举过程是个二叉树，应该能用一些剪枝的技巧


Question: 如果有同名变量的话，代码块内部的子代码块，用的是全局变量还是局部变量？

说实话哈，有这个时间问不如自己想办一个办法，验证自己的猜测。--我的方法：取地址。你在main的开头输出全局a的地址 int a; int main() { cout<<&a<<endl;  for() { int a; cout<<&a<<endl;   //我用直觉法也感觉这个a是局部的。。 } }  看看两个地址一不一样不就知道是局部还是全局的啦。

看编译器以及实现的标准  C89 肯定是局部变量覆盖全局变量且没有办法访问全局变量（至少我不知道），你这段程序在C89编译器上也编译不过，不能在for那里声明变量。  VS2010部分支持C99，GCC部分支持C99,C10，你的代码可以编译过，但是不支持 ::符号，所以还是无法访问全局变量  当然，你如果用.cpp作为后缀，用C++的编译器来编译，应该可以使用::来访问全局变量。

用的是局部变量，此时可以用::a来表示全局变量

看你内层有没有同名变量，有的话使用的就是内层的变量

引用 3 楼 qq423399099 的回复:如果使用同名标识符，具有内层作用域的标识符会覆盖外层作用域的标识符。       当一局部变量和一全局变量同名时，所有对变量名的 引用都会指向局部变量，此时，如果使用全局变量，就要用作用域解析符：：来限定变量（就是说通知编译器）  可我现在使用这个变量时，是在更内层的子代码块。也是用的外层定义的局部变量吗？

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  不要写连自己也预测不了结果的代码！

是局部变量a 。


Question: 指针的减法有编译错误,提示转型是非法的。

可以转换，没问题  不过更好的是转换成INT_PTR，否则如果是64位程序，可能会超出int范围

unsigned? long?

是可以的吧，你用的什么编译器？


Question: 如何通过文件中的数据，直接产生结果数据

恩。 不是很理解    能否再详细一下？ 谢谢

输入重写向到，可以用文件中的数据做为输入

close之后再open不行吗？


Question: 小白学c

1.printf那句多了一个双引号 2.delta > 0的条件里面，其中一个x2写成了x1 3.else后面不要跟条件  #include<stdio.h> #include<math.h> int main() { 	int a, b, c; 	double x1, x2, delta; 	printf("输入a, b, c\n"); 	scanf("%d,%d,%d", &a, &b, &c); 	delta = (double)b*b - 4 * a*c; 	if (delta > 0) 	{ 		x1 = (-b + sqrt(delta)) / (2 * a); 		x2 = (-b - sqrt(delta)) / (2 * a); 		printf("%f,%f\n", x1, x2); 	} 	else if (delta == 0) 	{ 		x1 = -b / 2 * a; 		x2 = x1; 		printf("%f,%f\n", x1, x2); 	} 	else 	{ 		printf("无解\n"); 	} 	return 0; }

else (delta<0) else后边不能有条件表达式，去掉就行了

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

附上程序  #include<stdio.h> #include<math.h> int main() { 	int a,b,c; 	double x1,x2,delta; 	printf(“输入a,b,c”\n");     scanf("%d,%d,%d",&a,&b,&c);     delta=(double)b*b-4*a*c; 	if(delta>0) 	{          x1=(-b+sqrt(delta))/(2*a);          x1=(-b-sqrt(delta))/(2*a); 	 printf("%f,%f\n",x1,x2); 	}      else if(delta==0) 	{ 		x1=-b/2*a; 		x2=x1;                 printf("%f,%f\n",x1,x2); 	} 	 else (delta<0) */错误指向这里*/{   		                   printf("无解\n"); 	          }      return 0; }


Question: 请教下FORK（） 问题

fork 会让一个进程变成两个，相当于把正在运行的程序复制了一份。但是，在这两个进程里fork的返回值是不一样的。

能具体点么，3楼的

fork在子进程中返回0，不是他的pid

搜“linux fork”？ 搜“毛德操 进程调度”？


Question: lex能否表达"不包含某个字串"或者"匹配的优先级"?

引用 5 楼 piweur 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 提醒：正则表达式不是万能的；有限状态自动机是万能的。 参考《编译原理》中的词法分析和有限状态自动机。  你的意思是说，对于我的需求而言，lex已经不行了，必须要yacc/bison上场了，是吗?[/quote] 其实我lex+yacc和flex+bison都没研究过。只听说它们是开源的从文法自动生成词法分析/语法分析代码的工具软件。 你的问题还得具体搜相关真正弄过的前辈的博文……

引用 3 楼 zhao4zhong1 的回复:提醒：正则表达式不是万能的；有限状态自动机是万能的。 参考《编译原理》中的词法分析和有限状态自动机。  你的意思是说，对于我的需求而言，lex已经不行了，必须要yacc/bison上场了，是吗?

lex可以将12作为一个整体对待么比如(12)这样写的话

引用 1 楼 user-2 的回复:如果你把0-9加到第三个式子里面是什么情况。还有救是lex的正则方式有没有说把几个字符作为整体对待的书写方式呢？  我尝试了一下，不行:  $ cat d.l %{ #include<stdio.h> %} %% 12 {printf("head\n");} 34 {printf("tail\n");} [A-Za-z0-9]*  {printf("content\n");} %%  编译运行:  $ lex d.l && gcc lex.yy.c -ll a@a-VirtualBox:~/compile$ echo "12dfas2sdf3awer34"|a.out content   还是一个贪婪匹配。没有达到我的要求。


Question: 自学C语言时，关于.0的

引用 2 楼 YXTS122 的回复:unsigned int i;c语言定义变量i一定要放在块的开头，要是c++，你这样写就不会报错 谢谢，谢谢

引用 4 楼 paschen 的回复:意思是错了，没有这种关键字 谢谢，综合上面的关键字的构成，和“”错了“”，我知道为什么了

意思是错了，没有这种关键字

c语言变量命名： 数字、字母、下划线，都可以为变量命名。 做为变量名的开头不能为数字，如 3a_是错的，而a_3或_a3是正确 变量名不能为关键字，像if'else'printf 等等都不能

c语言标识符只能由字母，数字和下滑线组成


Question: 在一个.mat文件中存放着MATLAB的三维数组，如何用C写出来存放在一个三维数组中

仅供参考：//在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------

你都已经通过matGetVariable得到mxArray类型的数据指针了，之后从这个指针得到数据存到C语言数组中应该很容易啊。 mxGetPr？ 可以参考一下Matlab mx,mex,mat等库的API文档

我已经知道怎么转了 因为三维数组的第三个维有限制 所以不能这样直接定义double a[][][]  但是可以用动态数组创建三维数组     传值就如两个链接说的一样


Question: 结构体内的字符串输入和输出的问题～

我的问题类似，当用scanf函数直接给字符串指针的结构体成员输入字符串时，程序运行就会报错，而如果结构体成员使用字符数组来定义就不会，因为要试验C语言中不定长记录的存储等问题，所以任然坚持用字符指针作为结构体成员，最后采用先用一个普通的字符指针变量接受字符串，再把该变量赋值给结构体成员来解决。 通过调试跟踪发现，在定义结构体变量时，结构体变量本身被分配了内存，但是其字符指针成员没有被分配到有效的内存地址，编译时没有问题，运行时就会报错！使用字符数组能够正确运行的原因是，字符数组能够被分配到有效的内存空间！ PS：我没有用malloc函数来分配内存，而是依赖于编译器在定义变量时的自动分配，我用的编译环境是Cygwin64

谢谢大神们给的解答，我做了下面几个改变 一、node->name前面的取址符去掉了，在这之前加上了  char name[10]; node->name = name; 这两条语句； 二、在Passwordinput函数中我传递给函数的是node整个结构体，而我对这个函数的定义是只对char型字符串操作，所以传入的应该是Passwordinput(node->password); 三、输出函数中，由于是双向链表，所以存储的时候是链式储存结构，是不能用pointer++来做到往下个结点跳的功能的  谢谢大神们解答

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

引用 4 楼 paschen的回复:字符指针不需要再取地址 对呀我知道呀可是去掉的话在VC.中会程序错误

字符指针不需要再取地址

scanf("%s", &node->name);  改成   scanf("%s", node->name);

引用 1 楼 user-5的回复:scanf函数第二个参数，不用取止符，原本就是字符指针， 也就是字符串首地址 不加取址符会出现错误，我也觉得应该不用加，可是不加会出错

scanf函数第二个参数，不用取止符，原本就是字符指针， 也就是字符串首地址

引用 7 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 可以解释一下吗因为没在书上看过耶

引用 6 楼 JohnLee790608的回复:scanf("%s", &node->name); 这句有问题，前面malloc了一个teacher结构体，name指针本身的空间有了，但是指向的空间不确定。 要指定指向的位置，可以： char c[100]; // 本地临时变量，保存输入的名字，如果100不够，可以再加 ... scanf("%s", c);  // c为临时变量，保存输入进来的 node->name =  (char)malloc((strlen(c) + 1) * sizeof(char)); // 申请保存输入字符串的空间，name指向到此区域 // 用memcpy将字符串拷贝过来 不明白可以继续问。。。 微信 JohnLee790608 呀好的我试试看


Question: 大神们求助，如何通过编写程序来实现这个东西，如何通过编写代码来找出int的范围和判断这台计算机的位宽

可以用指针来看，指针大小的四就是32位，8就是64位

那请问各位如何判断位宽呢

2楼正解，用sizeof求int所占字节数，每个字节为8位

sizeof由编译器决定而非由计算机的位宽决定。

sizeof(int)*8 跟编译器、操作系统、CPU和总线都有关。


Question: 求各位大神帮忙我的这个程序哪里出错了？

scanf函数出错， 第二个参数必须是地址，楼主以后要注意这个问题

把函数调用改一下就好了   int main(void){ 	char a[50]; 	scanf("%s",a); 	mid(a); 	return 0; }

请好好检查你自己的代码，我不行你那样可以编译通过，很多地方又数组越界 #include "stdafx.h" #include <stdio.h>  void mid(char c[]); int main(void){ char a[50]; scanf("%s",a); mid(a); return 0; }  void mid(char c[]) { int n=0; int mide; int b=1; while(c[n]!='\0') n++; mide = (25-n)/2; while(b<=mide){ b++; } printf("%s\n",c);  }


Question: 求问C语言中“:=”（双引号中的符号是什么意思？）

这是别的语言里的赋值吧

同意2楼，可能是操作符重载

看这:=和exit倒像是PASCAL  不过if语句又不是

这不是可用的 C 语言，你就把它当伪代码吧。  当成 C 语言的话，错误太多了 ...

谢谢大家的帮助

引用 8 楼 DelphiGuy 的回复::=是很多Pascal类语言，诸如Algol68、Pascal、Modula2、Modula3、Ada... 中的赋值符号，所以这段程序可能是从Pascal写的代码改成C的，忘了把:=改成=了。  哦哦，有道理有道理！，这样就可以解释的通了！！！

引用 8 楼 DelphiGuy 的回复::=是很多Pascal类语言，诸如Algol68、Pascal、Modula2、Modula3、Ada... 中的赋值符号，所以这段程序可能是从Pascal写的代码改成C的，忘了把:=改成=了。 英雄所见略同

不是C语言。

没有:=这个“”运算符“”，有程序里有定义这种符号

没有这种运算符！。。

看一下crosslist的源码，看一下这几个成员 的 类型 ，有没有对这个运算符进行编写


Question: C语言动态数组释放单个元素内存的问题

引用 4 楼 libinden71 的回复:[quote=引用 2 楼 user-3 的回复:] 先把删除元素之后 的所有元素向前移，然后再realloc呢 +1   压缩内存的时候注意'/0‘[/quote] 法克  后面为毛多了‘！’玩意

引用 2 楼 user-3 的回复:先把删除元素之后 的所有元素向前移，然后再realloc呢 +1   压缩内存的时候注意'/0‘！’

引用 2 楼 user-3 的回复:先把删除元素之后 的所有元素向前移，然后再realloc呢 妙啊！

先把删除元素之后 的所有元素向前移，然后再realloc呢

用realloc(数组名,--数组长度*sizeof(数据类型));这种方法可以，但是只适合删除最后一个元素，我程序报错的原因是我前面插入函数的算法写错了，欢迎继续讨论删除其他元素的解决办法！


Question: scanf_s(" %d %c %d"，&a,&b,&c)每次运行总会出错

高版本的VS都会让你用scanf_s来替代scanf 1.可以：Alt+F7，打开工程属性，然后找到图片上标注的地方，添加一行内容_CRT_SECURE_NO_DEPRECATE就OK了 2.如果用scanf_s，在读入%c或者%s的时候必须多传入一个参数用来指定读取的长度，否则会出错

#pragma warning(disable:4996) ...

scanf_s中%c还需要一个参数，表示长度  如果不想加，就用scanf

scanf_s(" %d %c %d"，&a,&b,1,&c);

微软的_s对于字符串要求传入缓存长度, 不会用_s就用原版...反正连警告都不看:  C4477	“scanf_s”: 格式字符串“%c”需要类型“unsigned int”的参数，但可变参数 3 拥有了类型“int *”


Question: 求大神解答一下C语言问题

一楼正解，不过你的代码有点缺陷，如果面试官要你写这个代码的话，你会被面试官pass掉，原因是你的代码鲁棒性不好，应该在函数的最前面加上代码：  if (s == NULL || t == NULL) {         printf("The Parameter is null!");         return; }   因为参数为NULL的话，代表没有内存，不能赋值的。

对的对的，楼上正解

因为字符串是以\0结尾的，如果没有\0，会一直往后输出


Question: 求一个二维数组中最大的元素值 求教各位大神

#include "stdio.h" int main() {  	int a[3][4],i,j,max=0,row=0,col=0; 	printf("请输入12个整数:\n"); 	for(i=0;i<3;i++) 	{ 	for(j=0;j<4;j++) 	{ 	scanf("%d",&a[i][j]); 	} 	} 	max=a[0][0];  	for(i=0;i<3;i++) 	{ 	for(j=0;j<4;j++) 	{ 		if(a[i][j]>max) 		{ 		max=a[i][j]; 		row=i; 		col=j; 		} 	} 	} 	printf("max=%d\nrow=%d\ncol=%d\n",max,row,col);  }

谢谢楼上的二位

printf里应当输出max,row,col,而不是a[i][j].输出随机的值是因为经过循环后，i变为3，j变为4，越界了。

最后printf错了,用max,不要用a[i][j], i,j都越界了


Question: 关于 peterson 方法完成进程互斥的疑问

引用 2 楼 FancyMouse 的回复:顺便补充，你的理解完全没有问题。进程切换的确会发生在任何点，包括&&上。会出问题是因为它那代码写错了。  居然由于这一点的关系。。。 这多进程编程看来有点坑啊

你这peterson反了。peterson应该是interested[other] == TRUE && turn == process。

手持终端机 数据采集器 RFID手持设备


Question: 在其他函数中引用另一个函数中的局部变量 会有什么问题呢

未定义行为。 刚好值没有被修改，并不代表你就可以这样去用（以后出了BUG都不知道是哪的问题）

结果正确最多只能算是运气好  你试着在，在你printf后面再输出一次或许就不是那个值了  所以不要返回局部变量的地址，因为这个变量函数结束就销毁了

在局部变量前加static

碰巧没变更害人 不要把偶然当成必然

国破山河在...

fun()方法返回的地址值和实际取得的数值不相同啊

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

fun() 结束时变量i 已经被系统回收，但是还没被再次利用（所有值还是i的值）！你在调用之后下个断点，然后随便打印一段话，你观察下内存 这时候在打印i的值 如果被利用了它就会是一堆垃圾数据！


Question: C语言求助

那条scanf分成三条语句写，每一个输入完输入回车然后输入下一个

引用 1楼lm_whales 的回复:内存越界了 逗号 分割的字符串，是不会当成两个字符读取的那内存越界怎么处理呢，name我在前面也有声明并且分配内存了呀。

那内存越界怎么处理呢，name我在前面也有声明并且分配内存了呀。

内存越界了 逗号 分割的字符串，是不会当成两个字符读取的

引用 7楼小灸舞 的回复:scanf("%s,%d,%s",p1->name,&p1->ID_number,p1->MAC_address); 这样的写法，编译器没法搞清楚你输入进来的逗号到底是%s的一部分呢还是分隔符呢 改成空格分隔的。 scanf("%s %d %s",p1->name,&p1->ID_number,p1->MAC_address);嗯，感谢

引用 4楼赵4老师 的回复:scanf("%19s%d%19s",p1->name,&p1->ID_number,p1->MAC_address);//输入各项请用空格间隔嗯，感谢

引用 5楼lm_whales 的回复:主要是逗号， 输入字符串的时候,输入的逗号也是字符串的一部分。直到遇到 空白符 后面的 ,%d,%s 都没法匹配了 而 第一个数据，超过了数组能够容纳的字符串的字符数。造成越界访问嗯，感谢

4楼正解！


Question: ld生成文件时报错

自顶，帮看下啊。

引用 4 楼 Rewen 的回复:没有加入  libc.so，crti.o 等库吧。  把这些库都加进去看看。  加进去如下，还是报错啊？  [neo@localhost ld]$ lsb_release -d Description:    Red Hat Enterprise Linux Server release 6.1 (Santiago) [neo@localhost ld]$ ld t1.o /usr/lib64/crti.o -lc -o t1 ld: warning: cannot find entry symbol _start; defaulting to 00000000004002b4 [neo@localhost ld]$ ./t1 -bash: ./t1: /lib/ld64.so.1: bad ELF interpreter: No such file or directory [neo@localhost ld]$

没有加入  libc.so，crti.o 等库吧。  把这些库都加进去看看。

引用 1 楼 user-2 的回复:ld t2.o -lc -o t2  你好，执行了，如下提示，还是报错  [weihu@nagios libcurl]$ cat t2.c  #include <stdio.h>  int main() {         printf("hello world!\n");         return 0; } [weihu@nagios libcurl]$ gcc -c t2.c -o t2.o [weihu@nagios libcurl]$ ld t2.o -lc -o t2 ld: warning: cannot find entry symbol _start; defaulting to 0000000000400260 [weihu@nagios libcurl]$ ./t2  -bash: ./t2: /lib/ld64.so.1: bad ELF interpreter: No such file or directory [weihu@nagios libcurl]$

ld t2.o -lc -o t2

ld t2.o -lc -o t2


Question: c语言windows下网络通信怎么实现啊？？？

套接字可以实现网络编程

MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 先下载安装MSDN98  再参考MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\IOCTL.C： /******************************************************************************\ * ioctl.c - TCP server * *       This is a part of the Microsoft Source Code Samples. *       Copyright 1996-1997 Microsoft Corporation. *       All rights reserved. *       This source code is only intended as a supplement to *       Microsoft Development Tools and/or WinHelp documentation. *       See these sources for detailed information regarding the *       Microsoft samples programs. \******************************************************************************/    #define WIN32_LEAN_AND_MEAN #include <winsock2.h> #include <stdlib.h> #include <stdio.h> #include <string.h>  #define DEFAULT_PORT 5001  int ReadAndEcho(SOCKET , char *,int ) ; int WriteMessage(SOCKET , char *,int ) ;  void Usage(char *progname) { 	fprintf(stderr,"Usage\n%s -e [endpoint] -i [interface]\n", 		progname); 	fprintf(stderr,"Where:\n"); 	fprintf(stderr,"\tendpoint is the port to listen on\n"); 	fprintf(stderr,"\tinterface is the ipaddr (in dotted decimal notation)"); 	fprintf(stderr," to bind to\n"); 	fprintf(stderr,"Defaults are 5001 and INADDR_ANY\n"); 	WSACleanup(); 	exit(1); } int main(int argc, char **argv) {  	char Buffer[128]; 	char *interface= NULL; 	unsigned short port=DEFAULT_PORT; 	int	fromlen; 	int	i, ioctl_opt =1; 	struct sockaddr_in local, from; 	WSADATA	wsaData; 	SOCKET listen_socket, msgsock; 	fd_set readfds,	writefds, exceptfds;  	/* Parse arguments */ 	if (argc >1) { 		for(i=1;i <argc;i++) { 			if ( (argv[i][0] ==	'-') || (argv[i][0] == '/') ) { 				switch(tolower(argv[i][1]))	{ 					case 'i': 						interface =	argv[++i]; 						break; 					case 'e': 						port = atoi(argv[++i]); 						break; 					default: 						Usage(argv[0]); 						break; 				} 			} 			else 				Usage(argv[0]); 		} 	}   	if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR)	{ 		fprintf(stderr,"WSAStartup failed with error %d\n",WSAGetLastError()); 		WSACleanup(); 		return -1; 	}   	if (port ==	0){ 		Usage(argv[0]); 	}  	// 	// The fd sets should be zeroed	out	before using them to prevent errors. 	FD_ZERO(&readfds); 	FD_ZERO(&writefds); 	FD_ZERO(&exceptfds); 	memset(Buffer,0,sizeof(Buffer));  	local.sin_family = AF_INET;  	// 	// bind	to specific	interface if desired.  	local.sin_addr.s_addr =	(!interface)?INADDR_ANY:inet_addr(interface);  	/* 	 * Port	MUST be	in Network Byte	Order 	 */ 	local.sin_port = htons(port);  	listen_socket =	socket(AF_INET,	SOCK_STREAM,0);	// TCP socket 	if (listen_socket == INVALID_SOCKET){ 		fprintf(stderr,"socket() failed with error %d\n",WSAGetLastError()); 		WSACleanup(); 		return -1; 	} 	// 	// bind() associates a local address and port combination with the 	// socket just created.  	if (bind(listen_socket,(struct sockaddr*)&local,sizeof(local) ) 		== SOCKET_ERROR) { 		fprintf(stderr,"bind() failed with error %d\n",WSAGetLastError()); 		WSACleanup(); 		return -1; 	}  	// 	// start listening on the socket for incoming connections 	// 	if (listen(listen_socket,5)	== SOCKET_ERROR) { 		fprintf(stderr,"listen() failed with error %d\n",WSAGetLastError()); 		WSACleanup(); 		return -1; 	} 	printf("%s: Listening on port %d\n",argv[0],port);  	// 	// Set the socket to non-blocking mode. 	// 	if (ioctlsocket(listen_socket,FIONBIO,&ioctl_opt) == SOCKET_ERROR) { 		fprintf(stderr,"ioctlsocket failed %d\n",WSAGetLastError()); 		WSACleanup(); 		return -1; 	} 	// 	// The structure of	the	loop below is very simple. We only accept one 	// connection at a time. As	soon as	another	client connects, we 	// disconnect the first	one, and start talking to the new client. 	// All this	server does	is to echo the data	received on	the	socket 	// back	to the client. 	// 	// This	is not a very realistic	server,	but	it does	serve to show that 	// select()	does not scale very	well on	win32. If we were dealing 	// with	more than one client, we would have	to have	a list of sockets 	// that	are	in each	fdset to be	able to	check them when	select() 	// returns. 	// 	while(1) {  		// 		// A socket	in the listen()	state becomes ready	to read	when a 		// client connects to it. An accept() will complete	without 		// blocking. 		// Since select	sets the sockets that are ready	to be read from	or 		// written to, we have to include listen_socket	in the fdset each time 		// through the loop. 		//  		FD_SET(listen_socket,&readfds);  		i =	select(0,&readfds,&writefds,&exceptfds,NULL); 		if (i == SOCKET_ERROR) { 			fprintf(stderr,"select failed %d\n",WSAGetLastError()); 		} 		if (i==0){ 			fprintf(stderr,"Select returned no fds ready\n"); 		}  		if (FD_ISSET(listen_socket,	&readfds)){ 			// 			// close the previous client socket. 			// We must also	clear it from the fdset	to prevent select() 			// from	failing. 			// 			closesocket(msgsock); 			FD_CLR(msgsock,&readfds); 			FD_CLR(msgsock,&writefds); 			fromlen	= sizeof(from); 			msgsock= accept(listen_socket,(struct sockaddr*)&from,&fromlen); 			if (msgsock	== INVALID_SOCKET) { 				fprintf(stderr,"accept failed %d\n",WSAGetLastError()); 				WSACleanup(); 				return -1; 			} 			FD_SET(msgsock,&writefds); 			FD_SET(msgsock,&readfds); 			continue; 		} 		if (FD_ISSET(msgsock,&readfds) ) { 			// 			// socket is ready to read,	i.e., there	is data	on the socket. 			// 			if (ReadAndEcho(msgsock,Buffer,sizeof(Buffer))<0) { 				fprintf(stderr,"terminating connection\n"); 				FD_CLR(msgsock,&readfds); 				FD_CLR(msgsock,&writefds); 				closesocket(msgsock); 				continue; 			} 		} 		if (FD_ISSET(msgsock,&writefds)	){ 			if (WriteMessage(msgsock,Buffer,sizeof(Buffer))	<=0) { 				fprintf(stderr,"terminating connection\n"); 				FD_CLR(msgsock,&readfds); 				FD_CLR(msgsock,&writefds); 				closesocket(msgsock); 				continue; 			} 		} 		FD_SET(msgsock,&writefds); 		FD_SET(msgsock,&readfds); 	} } int ReadAndEcho(SOCKET insock, char *Buffer,int size) { 	int	rc;  	rc = recv(insock,Buffer,size,0);  	if (rc == SOCKET_ERROR)	{ 		fprintf(stderr,"recv() failed with error %d\n",WSAGetLastError());   		return -1; 	} 	if (rc ==0)	{ 		fprintf(stderr,"Connection closed by client\n"); 		return 0; 	} 	printf("Received [%s] from client\n",Buffer); 	return rc; } int WriteMessage(SOCKET outsock, char *Buffer,int size) { 	int	rc; 	int	lasterr;  	printf("Sending [%s] to client\n",Buffer); 	rc = send(outsock,Buffer,size, 0);  	if (rc == SOCKET_ERROR)	{ 	  lasterr =	WSAGetLastError(); 	  if (lasterr == WSAEWOULDBLOCK) 		return 0; 	  else { 		fprintf(stderr,"send() failed with error %d\n",lasterr);     		return -1; 	  } 	} 	if (rc ==0)	{ 		fprintf(stderr,"Connection closed by client\n"); 	} 	return rc; }


Question: 二分法的一些问题

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

C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\bsearch.c： /*** *bsearch.c - do a binary search * *   Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *   defines bsearch() - do a binary search an an array * *******************************************************************************/  #include <cruntime.h> #include <stdlib.h> #include <search.h> #include <internal.h>  #if defined (_M_CEE) #define __fileDECL  __clrcall #else  /* defined (_M_CEE) */ #define __fileDECL  __cdecl #endif  /* defined (_M_CEE) */ /*** *char *bsearch() - do a binary search on an array * *Purpose: *   Does a binary search of a sorted array for a key. * *Entry: *   const char *key    - key to search for *   const char *base   - base of sorted array to search *   unsigned int num   - number of elements in array *   unsigned int width - number of bytes per element *   int (*compare)()   - pointer to function that compares two array *           elements, returning neg when #1 < #2, pos when #1 > #2, and *           0 when they are equal. Function is passed pointers to two *           array elements. * *Exit: *   if key is found: *           returns pointer to occurrence of key in array *   if key is not found: *           returns NULL * *Exceptions: *   Input parameters are validated. Refer to the validation section of the function. * *******************************************************************************/  #ifdef __USE_CONTEXT #define __COMPARE(context, p1, p2) (*compare)(context, p1, p2) #else  /* __USE_CONTEXT */ #define __COMPARE(context, p1, p2) (*compare)(p1, p2) #endif  /* __USE_CONTEXT */  #if !defined (_M_CEE) _CRTIMP #endif  /* !defined (_M_CEE) */  SECURITYSAFECRITICAL_ATTRIBUTE #ifdef __USE_CONTEXT void * __fileDECL bsearch_s (     REG4 const void *key,     const void *base,     size_t num,     size_t width,     int (__fileDECL *compare)(void *, const void *, const void *),     void *context     ) #else  /* __USE_CONTEXT */ void * __fileDECL bsearch (     REG4 const void *key,     const void *base,     size_t num,     size_t width,     int (__fileDECL *compare)(const void *, const void *)     ) #endif  /* __USE_CONTEXT */ {     REG1 char *lo = (char *)base;     REG2 char *hi = (char *)base + (num - 1) * width;     REG3 char *mid;     size_t half;     int result;      /* validation section */     _VALIDATE_RETURN(base != NULL || num == 0, EINVAL, NULL);     _VALIDATE_RETURN(width > 0, EINVAL, NULL);     _VALIDATE_RETURN(compare != NULL, EINVAL, NULL);          /*         We allow a NULL key here because it breaks some older code and because we do not dereference         this ourselves so we can't be sure that it's a problem for the comparison function         */      while (lo <= hi)     {         if ((half = num / 2) != 0)         {             mid = lo + (num & 1 ? half : (half - 1)) * width;             if (!(result = __COMPARE(context, key, mid)))                 return(mid);             else if (result < 0)             {                 hi = mid - width;                 num = num & 1 ? half : half-1;             }             else             {                 lo = mid + width;                 num = half;             }         }         else if (num)             return (__COMPARE(context, key, lo) ? NULL : lo);         else             break;     }      return NULL; }  #undef __fileDECL #undef __COMPARE

引用 3 楼 qq_36151474 的回复:[quote=引用 1 楼 user-3 的回复:] 将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的 引用 1 楼 user-3 的回复:将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的  确实用参数传进去就好啦 还有一个小问题 为什么这样找不到2000 能找到0  2000也是在里面的啊[/quote]  不懂，必要时单步调试代码分析原因，没法帮你调试

引用 1 楼 user-3 的回复:将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的 引用 1 楼 user-3 的回复:将数组大小通过参数传到paixu函数中  数组元素个数作为参数时已经退化为指针了，所以你在paixu中的 l 是不能得到数元素个数的  确实用参数传进去就好啦 还有一个小问题 为什么这样找不到2000 能找到0  2000也是在里面的啊

paixu函数中sizeof(a)得到的只是指针的大小（32位程序为4）


Question: c帖

在百度知道看到同样的问题的回答 亲测，有用！ 将文件夹中的MinGW64改成MinGW32似乎就可以了 (或者将MinGW32改成MinGW64）

代码写错了，大哥  #include <stdio.h> void main() { int i; int a[20]={1,1}; for(i=2;i=20;i++) { a[i]=a[i-2]+a[i-1]; } for(i=0;i<20;i++) { if(0==i%5) { printf("\n"); } printf("%12d",a[i]); } printf("\n"); }

dev c++中不支持void main,改成main或int main

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

呃呃，下了好几个的。都不行

引用 2 楼 AS1832 的回复:那个=20，却是写错了。但是问题不在哪里呀！怎样可以让它的二进制目录不缺失呢？  不清楚了，可能下载的不全吧，重新下载安装试下

那个=20，却是写错了。但是问题不在哪里呀！怎样可以让它的二进制目录不缺失呢？

for(i=2;i=20;i++)  应该是  for(i=2;i<20;i++)  吧


Question: 在linux下面讀取文件的問題


Question: 计算机编程语言,词法分析都可以用正规式来表达?

RG=DFA < BNF=CFG < LL(1) < LR

基本上计算机语言是2型文法，并不是线性的，但能不能转成3型的还得看是什么语言吧，你试试能用3型文法描述数学表达式吗

3型文法最简单啊, 你为虾米要给自己找麻烦一定要弄个递归可枚举的..

要不先弄懂啥叫“图灵机”？


Question: fgets读取文本文件结束后,再次调用gets函数想键盘输入,却直接读到'\0',为何??

引用 3 楼 berger 的回复:[quote=引用 2 楼 user-2的回复:]The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……[/quote]前两次scanf都是%d格式化了，不会读入换行符等空字符

引用 9 楼 user-2的回复:。。。看错了 前面两次scanf调用，缓冲区里有残留的＼n，所以后面第一次gets异常，但我不懂两次调用scanf，不应该缓冲区内残留两个换行符吗？为什么只有一个？是第二次scanf时要刷新输入缓冲区吗？

。。。看错了

引用 6 楼 berger 的回复:[quote=引用 4 楼 user-2的回复:][quote=引用 3 楼 berger 的回复:] [quote=引用 2 楼 user-2的回复:]The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……[/quote]前两次scanf都是%d格式化了，不会读入换行符等空字符[/quote] 嗯，知道了，那么两次连续读取整形数，缓冲区应该有两个换行符残留吧？为什么用scanf("%c",&ch)这种语句去读只能读到一个＼n呢？后一个scanf执行后就是等待输入状态了，另一个\n呢？……  在不同编译器里也试了下，一样，何解？[/quote]The gets function reads a line from the standard input stream stdin，这里写的不是read a char，大概是这个原因吧 没有深究

引用 5 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 感谢回复！记得了～～～

引用 4 楼 user-2的回复:[quote=引用 3 楼 berger 的回复:] [quote=引用 2 楼 user-2的回复:]The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……[/quote]前两次scanf都是%d格式化了，不会读入换行符等空字符[/quote] 嗯，知道了，那么两次连续读取整形数，缓冲区应该有两个换行符残留吧？为什么用scanf("%c",&ch)这种语句去读只能读到一个＼n呢？后一个scanf执行后就是等待输入状态了，另一个\n呢？……  在不同编译器里也试了下，一样，何解？

引用 2 楼 user-2的回复:The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n').   gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.   _getws is a wide-character version of gets; its argument and return value are wide-character strings. 感谢回复，想了想，应该是前面的两次scanf留下的换行符被读了进来，但scanf一共调用了两次，第二次scanf调用时应该因为缓冲区内还有换行符，无法读取数字一直循环吧？为什么第二次调用可以正常进行呢？……

手机端看不到颜色标注，是指定fp2的前一句gets调用～


Question: 求解释输出结果

因为你指向的是NULL，转成ulong以后就是0了 比如你改成char	*pc = "sdfd";这样的就能看到地址了

指针变量加1，即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。至于真实的地址加了多少，要看原来指针指向的数据类型是什么。 http://blog.csdn.net/wade23/article/details/4546119

我不明白输出的不是一堆地址值。

Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

指针加1，指针移动的距离等于指针所指类型长度

T*类型指针+n 移动距离为 n * sizeof(T)  所以pc是char*，所以结果为 0 + 1 * sizeof(char) = 1  同理其他几个


Question: 为什么会出现这个哪里错了吗

果然啊因为不细心搞错了换行符学习到了

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

printf("%n");  改成 printf("\n");


Question: 一个大学重修过c语言的人来问个数组转换的问题

作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

引用 5 楼 忘世麒麟的回复:if(pos == -1)   ->     if(pos == string::npos) C是没有string的

char存的只是字符，如果要字符串， 你需要一个二维字符数组

float buff[2]={1.2,2.2}; 	char szbuf[1024]; 	sprintf(szbuf,"%f",buff[0]); 	string szStr = szbuf; 	int pos = szStr.find("."); 	if(pos == -1) 	{ 		cout<<"没有找到小数点"<<endl; 	} 	else 		cout<<"小数点在(从0开始计数):"<<pos<<endl;

引用 1 楼 y_kings 的回复:好吧，我承认我被网上的东西误导了。。我的意思是buf[0]=1;buf[1]=.;buf[2]=2;然后问题是在我不知道小数点前面有几位的情况下，怎么知道小数点该放哪？ 使用sprintf函数.

没学好也不至于char只能表示一个字符也不知道吧


Question: 一维数组如何转化为二维数组，仅限C语言

引用 6 楼 ooolinux的回复:要输入的数字先写到文本文件input.txt里，程序运行的时候重定向从那个文件输入，避免反复键盘输入的繁琐。 或者在程序中用随机数来产生成绩，避免手动输入。 嗯，我尝试一下。谭浩强的C语言，刚刚学到函数呢。今天自己琢磨了数组作为参数的情况。

请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

定义一个Student结构，包括姓名和四门课成绩。

http://blog.csdn.net/tobebetterprogrammer/article/details/18260029 可以用来参考一下，C/C++有些部分处理方式是差不多的。

引用 3 楼 干的漂亮的回复:int a[40]; /*依次输入成绩*/ /*每个学生的average成绩*/ for(i=0;i<40;i+=4) { 	sum=0; 	m=i; 	for(m=i;m<i+4;m++) 	sum+=a[m]; 	printf("%d student average score=%d\n",i/4+1,sum/4); } /*pass */ for(i=0;i<4;i++) { 	sum=0; 	for(m=i;m<40;m+=4) 		if(a[m]>60) 			sum++; 	printf("subject %d pass %d\n",i,sum/10.0); }  /*max*/ max=a[0]; maxer=0; for(i=1;i<40;i++) {	 	if(max<a[i]) 	{ 		max=a[i]; 		maxer=i; 	} }  printf("student %d maxScore subject is %d\n",maxer/4+1,maxer%4+1); 要求用逗号分隔的方式，一次性输入4×12个数字

用结构体数组来记录，数组中每一项对应一个结构体，一个结构记录一个学生的各分数


Question: 求一篇用C语言描述的数据结构的单链表的功能代码 另外帮我看看我这个代码怎么错的

你这个程序有很多问题： 1.CreateHead既然已经有返回值了，根本没必要传参进去了 2.getchar();以后加一句fflush(stdin)清空输入缓冲区，否则会读入回车符 3.你的链表连接部分也不对 4.你的Print函数也不对，应该先输入再s = s->next,while判断的应该是s而不是s->next  # include<stdio.h> # include<malloc.h> typedef struct Node { 	int date; 	struct Node *next; }Node, *LinkList; LinkList CreateHead() { 	LinkList L = (LinkList)malloc(sizeof(LinkList)); 	L->next = NULL; 	Node *s,*p = L; 	char c; 	int flag = 1; 	while (flag) 	{ 		printf("请输入字符\t"); 		c = getchar(); 		fflush(stdin); 		if (c != '$') 		{ 			s = (Node *)malloc(sizeof(Node)); 			s->date = c; 			s->next = NULL; 			p->next = s; 			p = s; 		} 		else 			flag = 0; 	} 	return L; } void Print(LinkList L) { 	Node *s; 	s = (Node *)malloc(sizeof(Node)); 	s = L->next; 	while (s != NULL) 	{ 		 		printf("%c", s->date); 		s = s->next; 	} } int main() { 	LinkList L1; 	L1 = CreateHead(); 	Print(L1); 	return 0; }

是的。。。。。。

你CreateHead中的L都没初始，就直接使用L->next了


Question: 解答一下关于“C语言的指针和地址”之间的一个小疑点，感觉混淆了

在被调函数中有一句是“ *aver=ave;”，我刚开始写的错误语句是"aver=&ave;"；  -- 前者是对 aver 指向的地址写入数值。对指针解引用。 后者是对 aver 这个指针变量赋值，另它指向 ave。

楼主以为aver=&ave两边都加个*就等价于 *aver=ave;了

函数中的aver在函数中属于局部变量，aver在被调用的函数中原本指向实参，aver=&ave;此时aver指向了ave的地址了，此时实参和函数中的形参指针aver指向的不是一个地址了。 若有疑问请发邮件：likun_557@163.com

*aver=ave; 根据参数把它所指的变量给修改了（真改了，符合要求） aver=&ave; 把传过来的参数给修改了（改了也白改）


Question: C语言算法题：按权重分糖果，求解为什么AC不了

#include <stdio.h> int n,i; long sum; int candy[100005]; float mark[100005]; int main() { 	scanf("%d",&n);   	for(i=0;i<n;i++){ 		scanf("%f",&mark[i]); 		candy[i]=1; 	} 	sum=0; 	for(i=1;i<n;i++){ 		if(mark[i-1]<mark[i]){ 			candy[i]=candy[i-1]+1; 		} 	} 	for(i=n-1;i>0;i--){ 		if(mark[i]<mark[i-1]&&candy[i]>=candy[i-1]){ 			candy[i-1]=candy[i]+1; 		} 	} 	for(i=0;i<n;i++){ 		sum+=candy[i]; 		//printf("%d ",candy[i]); 	}  	printf("%d\n",sum); 	return 0; }

引用 1 楼 user-1 的回复:画出得分的曲线图 凡是处于谷底的得1 块 其他人，根据阶梯，得到左右两个方向，阶梯数最大的个数的糖果  例如第一组数据                                                                 91.69          3                                          /            84.67                65                        2                 /            \          /  0.41                  63.34                             1  一共三个台阶高度，第一级 得到1个，第二级得到2个，第三级得到3个我也试过这种方法AC不了，要不给你网址试试，http://acm.scu.edu.cn/soj/problem.action?id=4457


Question: 对话框过程函数的HWND句柄如何传递？

谢谢赵老师，需要学习好多东西，从MSDN例程开始。

有没有高手指点下啊？？

《深入浅出MFC》

引用 20 楼 SXJIAKE 的回复:[quote=引用 19 楼 xiaobicai 的回复:]我没什么调试经验，这个值后面不是有unsued=???，表示什么意思？ 我就理解为没有值了，也就是无效的。 这样理解对吗？ 但是即便有值，但是因为句柄传递过来时，InitSocket(hDial)这个函数无法执行，所以我才认为是句柄传递 上出了问题。HWND 是一个对外隐藏的数据，系统并未开放，因此定义成什么都无所谓的。在 Windows SDK 头文件中被定义为一个只含有一个 int unused 成员的结构体指针。事实上，你并不需要关心这些，HWND 有值就行了。[/quote]   好的，非常感谢您的解答，非常深入。 HWND现在是有值了，但是我的问题还没解决。就是我的初始化函数为什么不行？ 就是InitSocket(hDial)这个函数放在ETHERNETCOMMDlgProc这个过程函数中不能执行。而问题就出在它接收的参数句柄上面， 请问这是什么问题？ 我目前的解决办法是将InitSocket(hDial)这个函数放在WndProc这个过程中了，是可以完成初始化动作的。 请问，问题出在哪里？请高手指点。

引用 19 楼 xiaobicai 的回复:我没什么调试经验，这个值后面不是有unsued=???，表示什么意思？ 我就理解为没有值了，也就是无效的。 这样理解对吗？ 但是即便有值，但是因为句柄传递过来时，InitSocket(hDial)这个函数无法执行，所以我才认为是句柄传递 上出了问题。HWND 是一个对外隐藏的数据，系统并未开放，因此定义成什么都无所谓的。在 Windows SDK 头文件中被定义为一个只含有一个 int unused 成员的结构体指针。事实上，你并不需要关心这些，HWND 有值就行了。

引用 17 楼 SXJIAKE 的回复:Value 不是有值吗  我没什么调试经验，这个值后面不是有unsued=???，表示什么意思？ 我就理解为没有值了，也就是无效的。 这样理解对吗？ 但是即便有值，但是因为句柄传递过来时，InitSocket(hDial)这个函数无法执行，所以我才认为是句柄传递 上出了问题。

引用 16 楼 hoodlum1980 的回复:这函数是你通知给操作系统，由系统调用的。而不是你直接调用。 当你要调用窗口过程，通常是通过 SendMessage ( hWnd, ... ); 的方式间接调用。 那么 hWnd 这个参数你如何获知，也是通过调用以下 API ，通过返回值得到：  CreateWindow, CreateWindowEx, CreateDialogIndirect 等。  普通模态对话框：  DialogBoxParam ，这个函数不会返回 hWnd。要知道 hWnd，可以在 WM_INITDIALOG 消息中把 hWnd 参数保存起来。   首先感谢你讲得很深入。 我创建ETHERNETCOMMDlg对话框是在下面这个过程函数里的： LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 创建对话框调用的是CreateDialog宏，它使用的是CreateDialogPara这个函数来创建对话框的，而CreateDialogPara这个函数 调用的是CreateWindow函数来创建对话框的，这个过程应该是在底层完成的。但是没关系，CreateDialog宏也能返回对话框的句柄，而我是想要在 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) 这个过程函数中将hDlg句柄传递进来的。但是在这个过程函数中，句柄失效，所以WM_INITDIALOG 消息无法起作用，我现在 在ETHERNETCOMMDlgProc这个过程函数中接收这个消息时是没做任何动作的。 本来应该把InitSocket(hDialogModeless_Ethernet)这个初始化函数函数放在ETHERNETCOMMDlgProc这个过程中的， 现在没办法，就只能放在WndProc这个过程中了，就是创建的同时初始化，而且，句柄hDlg也改成了全局变量hDialogModeless_Ethernet，以便在ETHERNETCOMMDlgProc过程中可以使用。  。。。。。。。 WndProc这个过程的部分代码如下：    case ID_ETHERNET:     				  //MessageBox(NULL,"ID_ETHERNET 执行到了","提示",MB_OK); 				 				  //创建非模态对话框 				 hDialogModeless_Ethernet=CreateDialog(hInstance, (LPCTSTR)IDD_ETHERNET_DLG, hwnd, (DLGPROC)ETHERNETCOMMDlgProc); 				 if(!hDialogModeless_Ethernet) 				 { 					  MessageBox(NULL,L"hDialogModeless_Ethernet 句柄无效 MMMM！!",L"提示",MB_OK); 					  break; 				 } 				 InitSocket(hDialogModeless_Ethernet); 				 ShowWindow(hDialogModeless_Ethernet,SW_SHOW);  				  				  break ;   说了上面这么多，不知道我有没有说清楚。

Value 不是有值吗

引用 14 楼 csd123xitong 的回复:[quote=引用 8 楼 xiaobicai 的回复:] 那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) 在对话框过程函数里面，hDlg这个参数确实是可以直接用的。[/quote]   之前试过了的，在过程函数中初始化时， InitSocket(hDlg)这个函数是无法执行的，因为hDlg句柄的值未知。 所以，现在我才放到创建对话框函数的后面进行初始化的。  有没有高手指点下啊。

引用 8 楼 xiaobicai 的回复:那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) 在对话框过程函数里面，hDlg这个参数确实是可以直接用的。

你好像单步执行没进到case里面，在case里面还是？？？吗

过程函数是系统调用的啊，或者说是你运行消息队列那段代码时调用的啊，句柄的指向内容肯定未知啊，因为它是void*类型的啊

单步调试的值，请看图片：

我单步执行的，HWND hDlg这个句柄的值就是问号？？？

引用 8 楼 xiaobicai 的回复:那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)  什么叫传不进来，不可能

对话框过程函数是一个回调函数，回调函数是由系统调用的，hwnd是由系统调用回调函数时，由系统传递的。


Question: C语言，关于循环问题求助！

问题2：  while(w!=1){          scanf("%*s");  printf("Error,please enter a number ,as 1, 157,-6...\n");  }  你这里只要条件满足，肯定会进入死循环的，因为没有跳出条件啊。。。

问题1： 你的目的是，当输入的不是1的时候，做循环体里面的事情？ 你这样是不对的，因为scanf的返回值不是b的内容。 而是匹配的输入数量。 而且当输入结束的时候返回EOF，这个值也不是1啊。所以永远不会结束，只能死循环了。。。

抱歉，手打代码的时候在抽烟，没注意检测代码问题，你指出的问题编译时都是不存在的。 哎，这个问题头疼，编译是能通过的，也能运行，但是有这个BUG就是感觉特别不爽，想找出问题来。

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

#include<stdio.h> int main() {   int b; while((scanf("%d",&b)!=1) {   printf("*"); scanf("%d",&a); }  return 0; }  （1）while循环中括号不匹配。 （2）a变量没有定义，会编译不过~~~ 楼主问的关键问题，我也说不清，呜呜~~~


Question: gcc编译提示cannot find -lpthread

在虚拟机中的Linux下使用gcc

引用 1 楼 user-2 的回复:mingw?  mingw 自己不带 pthread ，得自己去下一个第三方的。 那该如何安装第三方库呢？

如何安装呢？

mingw?  mingw 自己不带 pthread ，得自己去下一个第三方的。


Question: 贪吃蛇中方向问题

引用 8 楼 zhao4zhong1 的回复:引用 6 楼 qq_32296307 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 搜“C源代码 贪吃蛇”膜拜大神 赵4“大神”几乎不生产“源代码”，他几乎总是百度搜索源代码的搬运工。 [/quote]

引用 9 楼 u010165006 的回复:[quote=引用 7 楼 qq_32296307 的回复:] 不太懂，什么叫demo，我想问的是，while（1）{1.2.}1.我不按任何建，屏幕上不断打印，，可是，我有的时候，要按键，如何区分  给蛇一个初始方向 当前方向=初始方向 循环中() { 如果有上、下、左、右按键，改变当前方向 蛇沿当前方向运动一格 如果蛇头撞墙或撞身，结束循环 Sleep(一段时间); }   如果你无法理解，还是找个源代码参考一下。[/quote]ook

引用 7 楼 qq_32296307 的回复:不太懂，什么叫demo，我想问的是，while（1）{1.2.}1.我不按任何建，屏幕上不断打印，，可是，我有的时候，要按键，如何区分  给蛇一个初始方向 当前方向=初始方向 循环中() { 如果有上、下、左、右按键，改变当前方向 蛇沿当前方向运动一格 如果蛇头撞墙或撞身，结束循环 Sleep(一段时间); }   如果你无法理解，还是找个源代码参考一下。

引用 6 楼 qq_32296307 的回复:引用 5 楼 zhao4zhong1 的回复:搜“C源代码 贪吃蛇”膜拜大神 赵4“大神”几乎不生产“源代码”，他几乎总是百度搜索源代码的搬运工。

引用 3 楼 u010165006 的回复:循环中() { if( ! isDEMO )     如果有上、下、左、右按键，改变当前方向 //else //    蛇自动改变当前方向 蛇沿当前方向运动一格 如果蛇头撞墙或撞身，结束循环 }不太懂，什么叫demo，我想问的是，while（1）{1.2.}1.我不按任何建，屏幕上不断打印，，可是，我有的时候，要按键，如何区分

引用 5 楼 zhao4zhong1 的回复:搜“C源代码 贪吃蛇”膜拜大神

搜“C源代码 贪吃蛇”

你需要一个计时器 如果是控制台的话 可以  #include <windows.h> while(1) {    // 蛇沿当前方向运动一格    //如果蛇头撞墙或撞身，结束循环    Sleep(间隔); }

第二种，就是保持，我不能输入字符 ———————————— 应该不输入的时候保持方向，而不是不能输入 你为什么要不能输入，想做DEMO吗？

给蛇一个初始方向 当前方向=初始方向 循环中() { 如果有上、下、左、右按键，改变当前方向 蛇沿当前方向运动一格 如果蛇头撞墙或撞身，结束循环 }


Question: 新人对着书打的代码，不知道为什么运行不正常。求触帮助OTZ

在后面添加system（"pause")

试试： fflush(stdin); getch(); //不显示输入的字符 return 0;

哦，谢谢，是VS2012出问题了。本地windows调试器不会调试修改后的代码，一直调试的都是之前写错的代码。

可以再加一个getchar  或者用system(“pause”)

getchar接收了scanf_s留下的换行符\n  所以直接退出了


Question: 括号配对问题

是该函数无法处理（）这种字符吗？

小弟现在还不会栈函数

// acm 括号配对.cpp : 定义控制台应用程序的入口点。 //输入样本个数和括号样本，看括号是否可以配成对   #include "StdAfx.h" #include<stdio.h> #include<string.h> #include<ctype.h> #include <stdlib.h> int main(void)   //"[]"==91.93   "()""==40.41 { 	int n,a; 	int w=0; 	int t,j,u; 	char name[1000]; 	char*p; 	printf("请输入样本个数："); 	scanf("%d",&n); 	for(int i=0;i<n;i++) 	{ 		printf("请输入测试样本："); 		scanf("%s",name);            //在此处有一个奇怪的错误，再按shift加9，0表示输入括号时，此处占用的字符数为4，但是若不按shift，则正常 		p=name; 		if(strlen(name)%2!=0) 			break; 			                                //我想利用ASCII表进行判断，我感觉“("与")"在表的值上应该差的数字是有规律的 			                        //利用这个规律应该可以在if语句中进行判断 		//  situation 1 		if(toascii(*(p+w))==91&&toascii(*(p+strlen(name)-1-w))==93) 		{ 				for(t=1;t<strlen(name);t++) 				{ 					if(toascii(*(p+strlen(name)-1-t))-toascii(*(p+t))==2||1) 						continue; 					else 						break; 				} 		switch(t>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		} 		 	// situation 2			 		if(toascii(*(p+w))==93&&toascii(*(p+strlen(name)-1-w))==91) 		{ 			for(j=1;j<strlen(name);j++) 			{ 				if(toascii(*(p+strlen(name)-1-j))-toascii(*(p+j))==2||1) 					continue; 				else 					break; 			} 		switch(j>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		} //situation 3 		if(toascii(*(p+w))==40&&toascii(*(p+strlen(name)-1-w))==41) 		{ 			for(u=1;u<strlen(name);u++) 			{ 				if(toascii(*(p+strlen(name)-1-u))-toascii(*(p+u))==2||1) 					continue; 				else 					break; 			} 		switch(u>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		}  	//situation 4 	    if(toascii(*(p+w))==41&&toascii(*(p+strlen(name)-1-w))==40) 		{ 			for(a=1;a<strlen(name);a++) 			{ 				if(toascii(*(p+strlen(name)-1-a))-toascii(*(p+a))==2||1) 					continue; 				else 					break; 			} 		switch(a>1) 		{ 		case 1: 			printf("YES"); 		case 0: 			printf("NO"); 		} 		} 	} 	printf("NO"); 	return 0; } 		 为什么toascii函数不起作用呢？各位

审题比英文更重要！

英文很重要

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

如果不需要能预编译头文件，删除#include "stdafx.h"这句   加上 #include <stdio.h>   #include <tchar.h>  前者里包含了printf scanf函数 后者包含了TCHAR宏定义

fefe82 说的对，是我没审好题

小弟发现了错误，if的判断思路不对 改正代码如下：  // acm 括号配对.cpp : 定义控制台应用程序的入口点。 //输入样本个数和括号样本，看括号是否可以配成对   #include "StdAfx.h" #include<stdio.h> #include<string.h> int main(void) { 	int n,a; 	int w=0; 	char name[1000]; 	char*p; 	printf("请输入样本个数："); 	scanf("%d",&n); 	for(int i=0;i<n;i++) 	{ 		printf("请输入测试样本："); 		scanf("%s",name);            //在此处有一个奇怪的错误，再按shift加9，0表示输入括号时，此处占用的字符数为4，但是若不按shift，则正常 		p=name; 		if(strlen(name)%2!=0) 			printf("NO\n"); 		switch (*(p+w)) 		{ 		case '[': 			  { 				  if(*(p+strlen(name)-w-1)==']') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		case ']': 			  { 				  if(*(p+strlen(name)-w-1)=='[') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		case '(': 			  { 				  if(*(p+strlen(name)-w-1)==')') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		case ')': 			  { 				  if(*(p+strlen(name)-w-1)=='(') 					  printf("YES"); 				  else 					  printf("NO"); 			break; 			  } 		default: 			{ 				printf("NO"); 				break; 			} 		} 	} 	return 0; } 		  但是acm还是说：runningtime error  	运行时出错： 常见出错的原因可能有以下几种： 1、数组开得太小了，导致访问到了不该访问的内存区域 2、发生除零错误 3、大数组定义在函数内,导致程序栈区耗尽 4、指针用错了，导致访问到不该访问的内存区域 5、还有可能是程序抛出了未接收的异常

数据保证S中只含有"[","]","(",")"四种字符  {} 哪来的？

引用 3 楼 ylxd41 的回复:这个搞定了，但是又出现了running error，实在不行了，各位帮帮忙。 在本地执行时，有个特例，就是输入{}是无法得出正确结果 谢谢大家你的printf（）NO和 YES 而题目中是No和Yes 题目中的符号是[](),你并不需要输入其他字符，你可以去搜搜别的博客，这是nyoj的题目，很多的

//#include "stdafx.h" #include <string.h> #include <stdio.h> int main(int argc, char * argv[])


Question: leetcode 3sum提不上去，请大神看看哪里出问题了？？？

int** rets = (int**)malloc(sizeof(int*)*numsSize);  应该是这一条分配的空间不够，test case的数组长度为27，但是return size为28，所以这里会小。 比如改成 int** rets = (int**)malloc(sizeof(int*)*numsSize *2); 是可以accepted的。当然这个2只是测试，感觉这个空间分配应该按照排列组合公式的Cnumsize中取3来设置。  你的代码确实在VS上可以正确运行，也能得到28个结果。这里还没想通，等待大神结贴。

边界条件 输入输出格式 ……

出错的那组数据，本地调试的时候没有问题吗？

引用 2 楼 littlebeat123 的回复:引用 1 楼 user-3 的回复:出错的那组数据，本地调试的时候没有问题吗？没发现问题，我直接把结果打印出来了。 试了一下，确实如你所说，本地运行没有问题。目测是未定义行为引起的不同，好好检查程序吧。顺便感叹一下好久没写 c 程序了。