Question: 日历程序求大神修改

可以啊想什么就做才能精益求精

当然可以，LZ慢慢来。

仅供参考，尽管是java script：  1900-2050年超酷百年日历。 来自网络，经本人整理优化。 http://download.csdn.net/detail/zhao4zhong1/1211949

当然可以的阿！ 也就是每次显示的加一个额外的判断呗！ 一步一步的向后完善吧！

/*返回农历信息*/ int get_lunar_info(int solar_year, int solar_month, Lunar_info *l_info,Chinese_era *china_era) {  	int i; 	int total; 	int temp_num; 	/*阳历1900年01月31日为农历1900年01月01日*/ 	total=get_solar_total(solar_year,solar_month)-30; 	china_era->era_day=total+40; 	/*将13和14月作为下一年的1月和2月,便于确定Y年M月D日是星期几 	蔡勒公式求星期几:W=[C/4]-2C+y+[y/4]+[13×(M+1)/5]+d-1*/ 	china_era->era_month=14; 	for(i=1900;i<2051&&total>=0;i++) 	{ 	  /*temp_num记录从1900到2050年闰年和平年的天数*/ 	  temp_num=get_lunar_year_total(i); 	  total-=temp_num; 	  /*累计月*/ 	  china_era->era_month+=12; 	} 	l_info->lunar_year=i; 	if(total<0) 	{ 	  total+=temp_num; 	  /*减年*/ 	  l_info->lunar_year--; 	  china_era->era_month-=12; 	} 	/*1864年为农历甲子年*/ 	china_era->era_year=l_info->lunar_year-1864; 	/*返回是否存在闰月*/ 	l_info->leap_month=get_leap_month(l_info->lunar_year); 	l_info->leap_flag=0; 	for(i=1;i<13 &&total>0;i++) 	{ 		if (l_info->leap_month>0&&i==(l_info->leap_month+1)&&l_info->leap_flag==0) 		{ 			--i; 			temp_num=get_leap_month_day(l_info->lunar_year); 			/*存在闰月*/ 			l_info->leap_flag=1; 		} 		else 			temp_num=get_lunar_month_total(l_info->lunar_year, i); 		if (l_info->leap_flag==1&&i==(l_info->leap_month+1)) 			l_info->leap_flag=0; 		total-=temp_num; 		if (l_info->leap_flag==0) 			china_era->era_month++; 	} 	if(total==0&&l_info->leap_month>0&&i==l_info->leap_month+1) 		if(l_info->leap_flag==1) 			l_info->leap_flag=0; 		else 		{ 		   l_info->leap_flag=1; 		   --i; 		   --china_era->era_month; 		} 		if(total<0) 		{ 		  total+=temp_num; 		  --i; 		  --china_era->era_month; 		} 		l_info->lunar_month=i; 		l_info->lunar_day=total+1; 		if (l_info->leap_flag==0) 			l_info->current_mday=get_lunar_month_total(l_info->lunar_year,l_info->lunar_month); 		else 			l_info->current_mday=get_leap_month_day(l_info->lunar_year); 		return 0; } /*输出农历日期信息*/ int out_chinese(Lunar_info *l_info,char *chinese_str) {  	/*初一不打印*/ 	if (l_info->lunar_day!=1) 	{ 		strcpy(chinese_str, chinese_day[l_info->lunar_day-1]); 		if (l_info->lunar_day==15&&l_info->lunar_month==1) 				strcpy(chinese_str, "元宵节"); 		if(l_info->lunar_day==22&&l_info->lunar_month==2&&l_info->lunar_year>1986) 			strcpy(chinese_str, "凤诞辰"); 		if(l_info->lunar_day==5&&l_info->lunar_month==5) 			strcpy(chinese_str, "端午节"); 		if(l_info->lunar_day==7&&l_info->lunar_month==7) 			strcpy(chinese_str, "情人节"); 		if(l_info->lunar_day==15&&l_info->lunar_month==7) 			strcpy(chinese_str, "中元节"); 		if (l_info->lunar_day==15&&l_info->lunar_month==8) 				strcpy(chinese_str, "中秋节"); 		if (l_info->lunar_day==9&&l_info->lunar_month==9) 				strcpy(chinese_str, "重阳节"); 		if(l_info->lunar_day==5&&l_info->lunar_month==10&&l_info->lunar_year>1985) 			strcpy(chinese_str, "龙诞辰"); 		if(l_info->lunar_month==12) 		{ 			if(l_info->lunar_day==30) 				strcpy(chinese_str, "除夕"); 			if(l_info->current_mday<30&&l_info->lunar_day==29) 				strcpy(chinese_str, "除夕"); 			if (l_info->lunar_day==8) 				strcpy(chinese_str, "腊八节"); 			if (l_info->lunar_day==23) 				strcpy(chinese_str, "小年"); 		}  	} 	else 	{ 		if (l_info->leap_flag==1) 		{ 			//如果存在闰月就将汉字闰复制到数组里，再连接农历月份 			strcpy(chinese_str, "闰"); 			strcat(chinese_str,chinese_month[l_info->lunar_month-1]); 			strcat(chinese_str, "月"); 		} 		else 		{ 			if (l_info->lunar_month==1) 				strcpy(chinese_str, "春节"); 			else 			{ 				strcpy(chinese_str,chinese_month[l_info->lunar_month-1]); 				strcat(chinese_str, "月"); 				if(get_lunar_month_total(l_info->lunar_year,l_info->lunar_month)==30) 					strcat(chinese_str,"大"); 				else 					strcat(chinese_str,"小"); 			} 		} 	} 	return 0; } /*界面输出*/ void sub_menue() { 	  int week,s_month_total,space_num,c_num;    	  int i,j; 	  char tmp_str[9]; 	  Chinese_era c_ear; 	  Lunar_info l_info; 	  /*每个月一号为星期几*/ 	  week=get_week(s_year,s_month); 	  /*返回当月的天数*/ 	  s_month_total=day(s_month); 	  //将已开辟内存空间tmp_str的首sizeof(tmp_str)个字节的值设为值0,作用在于可以方便的清空结构类型的数组或变量。 	  memset(&c_ear,0,sizeof(c_ear)); 	  memset(&l_info,0,sizeof(l_info)); 	  /*返回农历信息*/ 	  get_lunar_info(s_year,s_month,&l_info,&c_ear); 	  memset(tmp_str,0,sizeof(tmp_str)); 	  /*确定干支*/ 	  get_chinese_era(s_year-1864,tmp_str); 	  system("cls"); 	  printf("\t　     ╭───────────────────────────╮\n");    	  printf("\t       ｜                   欢迎使用万年历系统                 ｜\n"); 	  printf("\t       ｜───────────────────────────｜\n"); 	  printf("\t       ｜          阳历:%d年%02d月  农历:%s年 【%s】         ｜\n", 	  s_year,s_month, tmp_str, Animals[(s_year-1864)%12]); 	  printf("\t       ｜───────────────────────────｜\n"); 	  printf("\t       ｜        今天是:"); 	  TIME(); 	  printf("｜\n"); 	  printf("\t       ｜───────────────────────────｜\n"); 	  printf("\t       ｜星期日  星期一  星期二  星期三  星期四  星期五  星期六｜\n"); 	  printf("\t       ｜───────────────────────────｜\n"); 	  printf("\t       ｜  ");  	  space_num=week; 	  for (i=1; i<space_num;i++) 	  { 		  printf("        "); 	  } 	  c_num=0; 	  for (i=1; i<=s_month_total;i++) 	  { 		   s_day=i; 		   printf("%02d",s_day);  		   week+=1; 		   if((week>7)||(i==s_month_total)) 		   { 			   week=1; 		       printf("\n               ｜"); 				if (i<7) 				{ 					for (j=1;j<space_num;j++) 					{ 						printf("        "); 					} 					week=space_num; 				} 				else 					week=1; 				while(1) 				{ 					week+=1; 					memset(tmp_str,0,sizeof(tmp_str)); 					out_chinese(&l_info,tmp_str); 					printf("% 6s", tmp_str); 					if (l_info.lunar_day<l_info.current_mday) 						l_info.lunar_day=l_info.lunar_day+1; 					else 					{ 						if ((l_info.lunar_month==l_info.leap_month)&&l_info.leap_flag==0) 						{ 							/*存在闰月,返回天数*/ 							l_info.current_mday=get_leap_month_day(l_info.lunar_year); 							l_info.leap_flag=1; 						} 						else 						{ 							l_info.lunar_month=l_info.lunar_month+1; 							if (l_info.lunar_month>12) 							{ 								l_info.lunar_month=1; 								/*月数大于12进年*/ 								l_info.lunar_year=l_info.lunar_year+1; 							} 							/*返回闰月的天数*/ 							l_info.current_mday=get_lunar_month_total(l_info.lunar_year, l_info.lunar_month); 							l_info.leap_flag=0; 						} 						l_info.lunar_day=1; 					} 					c_num++; 					if ((week>7)||(c_num==s_month_total)) 					{ 						week=1; 						printf("\n               ｜  "); 						break; 					} 					else 						printf("  "); 				} 		   } 		   else 			   printf("      "); 	  } 	  printf("\n"); 	  printf("\t       ╰───────────────────────────╯\n"); 	  	 printf("\t　　************************************************************************\n");          printf("\t  　*                                                                      *\n"); 		 printf("\t  　*   崇                  万年历            查询系统                自   *\n"); 		 printf("\t    *                                                                      *\n"); 		 printf("\t　　* 　德   1    查询上一年                2    查询下一年           强   *\n"); 		 printf("\t　　*     　                                                               *\n"); 		 printf("\t　　* 　尚   3    查询上一月                4    查询下一月           力   *\n"); 		 printf("\t　　*                                                                      *\n"); 		 printf("\t　　* 　学   5    退出系统                  6    关于作者             行    *\n"); 		 printf("\t　　*     　                                                               *\n"); 		 printf("\t　　************************************************************************\n"); } main() {  	system("mode con:cols=100 lines=50"); 	system("color 04"); 	char tmp_str[9]; 	int curr_year,curr_month; 	time_t t; 	struct tm *tp; 	t=time(NULL); 	tp=localtime(&t); lable:; 	s_year=tp->tm_year+1900; 	s_month=tp->tm_mon+1; 	sub_menue(); 	while (1) 	{ 	  printf("\t\t       你可以输入年份(1900-2050),也可以输入(1-5)!\n请输入:"); 	  /*将已开辟内存空间tmp_str的首sizeof(tmp_str)个字节的值设为值0,作用在于可以方便的清空结构类型的数组或变量。*/ 	  memset(tmp_str,0,sizeof(tmp_str)); 	  gets(tmp_str); 	  /*atoi将字符串转换成整型数,用curr_month，curr_year接收输入的值*/ 	  curr_month=curr_year=atoi(tmp_str); 	  /*上一年*/ 	  if(curr_year==1&&strlen(tmp_str)==1) 	  { 		  s_year--; 		  if(s_year<1900) 			  s_year=2050; 	  } 	  /*下一年*/ 	  else if(curr_year==2&&strlen(tmp_str)==1) 	  { 		  s_year++; 		  if(s_year>2050) 			  s_year=1900; 	  } 	  /*上一月*/ 	  else if(curr_month==3&&strlen(tmp_str)==1) 	  { 		  s_month--; 		  if (s_month<1) 		  { 			  s_year-=1; 			  s_month=12; 			  if(s_year<1900) 				  s_year=2050; 		  } 	  } 	  /*下一月*/ 	  else if(curr_month==4&&strlen(tmp_str)==1) 	  { 		  s_month++; 		  if (s_month>12) 		  { 			  s_year+=1; 			  s_month=1; 			  if(s_year>2050) 				  s_year=1900; 		  } 	  } 	  /*退出*/ 	  else if(curr_year==5&&strlen(tmp_str)==1) 		  { 			  system("cls"); 			  printf("\n\n\n\n\n\n\n\n\t\t\t    谢 谢 使 用, 再 见 !!!\n\t\t\t "); 			  buffer(1); 			  exit(0); 		  } 	  /*关于作者*/ 	   else if(curr_year==6&&strlen(tmp_str)==1) 		  { 			  system("cls"); 		     printf("\t**********************************************************\n\n"); 			 printf("\t^^^^^^^^^^     大学计算机科学技术学院    ^^^^^^^^^^\n\n"); 			 printf("\t^^^^^^^^^           网络工程13-1班            ^^^^^^^^^\n\n"); 			 printf("\t^^^^^^^^          *   *    *                    ^^^^^^^^\n\n"); 			 printf("\t^^^^^^^^^          禁止CTRL+C    谢谢合作      ^^^^^^^^^\n\n"); 			 printf("\t^^^^^^^^^^   如有系统故障，请联系             QQ:188075810\n\n");         			 printf("\t**********************************************************\n\n"); 			  buffer(1); 			  exit(0); 		  } 	  else 	  { 		  s_year=atoi(tmp_str); 		  if (strlen(tmp_str)>4||(s_year<1900)||(s_year>2050)) 		  { 		   printf("\t\t\t  Error:年份输入错误,重新输入!!!\n"); 		   buffer(1); 		   goto lable; 		  } 		  printf("请输入月份(1-12):"); 		  memset(tmp_str,0,sizeof(tmp_str)); 		  gets(tmp_str); 		  s_month=atoi(tmp_str); 		  if (strlen(tmp_str)>2||(s_month<1)||(s_month>12)) 		  { 		   printf("\t\t\t  Error:月份输入错误,重新输入!!!\n"); 		   buffer(1); 		   goto lable; 		  } 	  } 	  sub_menue(); 	} }可以将节日，节气插到日历里吗？顺便添加一些小功能吗？


Question: 求大神给我写写

http://download.csdn.net/detail/Monkey0307/2696471#comment 这个吧，没有图形界面的   引用 4 楼 u013287032 的回复:进不去啊 这个

进不去啊 这个

http://www.slideshare.net/saurabh1508/calculator-16722563 参考一下

恩 对， 用C语言产生随机数，产生随机符号，输出这个式子，然后算个计算题。。。

做一个计算器吗？


Question: 用C++编写一个活期储蓄帐目管理系统的设计与实现的系统

引用 3 楼 u013286215 的回复:怎么除了VIP下载，不能用其他的么。。。 有下载积分就可以下载的阿！  银行项目网上很多源码的，可以都搜索下！

怎么除了VIP下载，不能用其他的么。。。

能运行的求发啊！


Question: 程序运行却出现core jump，求指导

引用 3 楼 max_min_ 的回复:  fread(&my_cards[filecount],size,count-filecount,pcards); // 循环读这里 ，你第一次已经全部读完了啊，不明白 十分感谢谢 我已经搞定了 ，虽然错误没找到，但从新写的完美运行了。。。

是你的rewind()函数这里导致的。 pcards=fopen("card.dat","r");之后要做NULL check   pcards=fopen("card.dat","r");         if(pcards == NULL) {             exit(0);         }         rewind(pcards);

进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令


Question: 一个小程序,有点小错误,求指出

引用 14 楼 bijiaoben 的回复:如果按照你代码表述的做法的话，把你的代码按照这样改： for(p=p_beg+n-m;p>a+i;p--) { *p=*(p-1); } 至于为什么这样做，你在纸上画画就清楚了，i大于1的时候你就知道结果了。 对,就是这样,终于弄出来了,太感谢了,麻烦你那么久

还是11楼的问题，楼主到底想要的是神马？yidong(6,3)和yidong(9,3）的期望输出分别是什么？请恕我理解能力不够，搞不明白这个我是没法帮到楼主的。

引用 9 楼 bijiaoben 的回复:[quote=引用 8 楼 bijiaoben 的回复:] [quote=引用 7 楼 u013160932 的回复:] [quote=引用 5 楼 bijiaoben 的回复:]     for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊[/quote] 你明显不够仔细，因为你都没看我在5楼说了什么。。。。[/quote] 好吧，不好意思，也许我没明白你在说什么。我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,这个是什么意思呢？ 如果输入了1到20，共20个数字，还用你的函数yidong(9,3)处理一下，你期望的输出结果是什么样呢？如果调用方式改为yidong(19,3)，你期望的输出又是什么样呢？楼主所说的，所以我是n-m-i，那为什么代码里面又是 temp=a[n-m+i]？[/quote] 大神,别这样说,是我不好意思才对,那么麻烦你 我现在是输入9个数字,然后前面6个数字移动到最后,然后后面3个放到前面 如   1 2 3 4 5 6 7 8 9 变成 7 8 9 1 2 3 4 5 6  是这样的, 第1次内循环, 记录temp=a[6]=7,前6个数往后移一次 变成1 1 2 3 4 5 6 8 9(7被覆盖了) 然后把记录的temp=a[6]放到a[0],变成7 1 2 3 4 5 6 8 9 第2个内循环 7后面的6个数再往后一次,记录temp=a[7]=8,7后面的6个数往后移动一次,变成 7 1 1 2 3 4 5 6 9(8被覆盖了),再把temp=a[8]放到a[1],变成7 8 1 2 3 4 5 6 9  因为每移动一次,需要记录temp总会往后移动一个单位,所以是temp=[n-m+i];

引用 8 楼 bijiaoben 的回复:[quote=引用 7 楼 u013160932 的回复:] [quote=引用 5 楼 bijiaoben 的回复:]     for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊[/quote] 你明显不够仔细，因为你都没看我在5楼说了什么。。。。[/quote] 好吧，不好意思，也许我没明白你在说什么。我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,这个是什么意思呢？ 如果输入了1到20，共20个数字，还用你的函数yidong(9,3)处理一下，你期望的输出结果是什么样呢？如果调用方式改为yidong(19,3)，你期望的输出又是什么样呢？楼主所说的，所以我是n-m-i，那为什么代码里面又是 temp=a[n-m+i]？

引用 7 楼 u013160932 的回复:[quote=引用 5 楼 bijiaoben 的回复:]     for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊[/quote] 你明显不够仔细，因为你都没看我在5楼说了什么。。。。

引用 5 楼 bijiaoben 的回复:for(i=0;i<m;i++) {     	p_beg=a+i;         temp=a[n-m+i]; printf("temp=\n",temp);     for(p=p_beg+n-m;p>a;p--) {	 *p=*(p-1); }     a[i]=temp; 楼主自己单步跟踪一下这个代码就明白了，楼主不应该从n-m+1开始往后移动，而是应该让你temp始终指向最尾端的元素。  temp=a[n-m+i]; and *p=*(p-1); and i++ 会让你的temp每次都是拿到一个固定的数。楼主把你的temp固定指向a[n-1]试试看结果呢。 那个10我忘记改过来了= = 我这个代码不是整体往后移的,而是前面n个数字往后移动,一次,会覆盖掉这n个数的后面那个数,再把后面那个数字放到前面,而移动一次,我所需要记录的那个数也会往后移动一个位置,所以我是n-m-i. 你说的那个方法我换个代码试了下,能成功,但是我用这个方法来敲代码的时候不行了,不知道是我想法错了还还是我的代码细节方面错了,很纠结啊

引用 11 楼 bijiaoben 的回复:题目是,把前面n个数向后移动m个单位,后面m个单位放到最前面 楼主，对这个题目，我的理解是这样的： 假设输入9个数字123456789,调用函数yidong(6,3)后，变成789123456。 楼主大人的做法是把n个数内部循环右移m次。所以楼主的调用方法是yidong(9,3)。如果按照题目要求，把前九个数字右移3次的话，因为右边已经没有数字了，所以应该不会有数字被挤到前面去，应该还是123456789才对啊就是789123456,但是我的结果是779123456

另外，楼主的这个函数是要搞哪样？ void print(int *a) { int i; printf("shuru 10 ge shu\n"); for(i=0;i<9;i++)     scanf("%d",&a[i]); }  为什么输入10个数却只有9次循环？

引用 3 楼 user-2 的回复:for(i=0;i<m;i++)貌似一步一步慢慢爬，那就不用写的那么复杂吧，先暂存最后一个元素，从尾部往前遍历把元素往后移动一位，最后把暂存的元素摆在第一个，如此循环m次完成...那你能不能帮我看下我那程序是哪出问题了

引用 1 楼 user-2 的回复:简单的就申请一样的数组空间，元素一次移动到定位再复制回原数组。想就地操做又不想一步步慢慢爬貌似复杂了...数组能做出来,但现在我用指针弄不出来,不知道是哪错了,我用printf来捕捉a[i]的值,发现也没错,但是一打出来就错了


Question: 求大神指点，文件中EOF占位问题

feof的作用是，告诉你是否一定到了文件末尾，但是，它必须在已经读取失败一次之后才能告诉你到了文件末尾！所以想用它来避免读取失败是不可能的！ 推荐的方法是一开始就获取到文件大小，自己控制每次读多少数据何时结束，什么文件流啊去死吧！

先检测ch再赋值给str，所以前者有问题，后者正确不是嘛...

引用 2 楼 yulinlang 的回复:这两个是windows系统下文本文件行末的回车，换行符，ASCII码0D，0A。  EOF根本就不会在文件中出现。 那为什么这段代码 while ( !feof(fp_B) )      //fp_B指向文件B { ch = fgetc(fp_B); str[i++] = ch;	 } 会多存一个类似空格的符号

不要使用 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;  //... } 类似的例子还可以举很多。  另外应该int ch;而不能char ch;，因为要区别'\xFF'和EOF即-1

如果EOF只占一个移动点，那么最后的那个4行应该不会出现，可是他居然出现了，而且还通过了feof的检测，而且最后一次执行ch = fgetc(fp_B);语句后指针没有右移，真奇怪


Question: 请高手判断 这种改进的冒泡法 是否提高效率?

用选择法较好

引用 6 楼 derekrose 的回复:效率是否提高肯定会有一定的度量标准，这个毫无疑问，所以你如果想知道效率的比较，就要先学习度量标准，那个更具有理论价值，比实验要来的精确 谢谢!

冒泡排序是最差的排序方法, 毫无实用价值. 很多人喜欢谈论冒泡排序, 主要原因是: 在学校里考试如果考复杂排序(快速排序, 堆排序神马的)很多人做不出来, 简单排序(选择排序, 插入排序)又显得太简单了. 冒泡排序的难度适中, 所以很多没有实际软件开发经验的老师喜欢大讲冒泡排序. 喜欢冒泡排序的程序员也算应试教育的受害者吧.

这此算法的优化已经经过这么多年的无数高手的研究了, 再想提高, 已经不能使用原来的思想了, 也就是说你必需自己创造一种全新的算法, 如果仅仅是去提高原有的算法, 没有意义了.  但这种钻研精神是值得学习的.

当数据量是n 的时候，你少比较常量级的次数，是没有意义的

引用 11 楼 zhao4zhong1 的回复:＜1000个元素，冒泡排序 ＜100000个元素，qsort函数 ＜10000000个元素，放数据库中，建索引，（B+树排序） ≥10000000个元素，没用到过。赵老师说的不错。

引用 4 楼 user-8 的回复:楼主知道大O标记时间复杂度么？  不懂,刚学完一遍C基础.下一步计划学习数据库 再下一步学习数据结构,不知道这个学习顺序对不对?还望指教!

楼主知道大O标记时间复杂度么？

/* 2013年12月24日 学习笔记  书上的冒泡法，为什么不从最小最大向中间排呢？下一步试着改进。  */ # include <STDIO.H>  int Sort(int * pArr, int len) { 	int i, j, r; 	int t; 	r=0; 	for(i=0; i<len-1; i++) 	{ 		for(j=0; j<len-1-i; j++) 		{ 			if(pArr[j] > pArr[j+1])   			{ 				t = pArr[j]; 				pArr[j] = pArr[j+1]; 				pArr[j+1] = t; 				r++; 			} 		} 	}     return r; } int main(void) { 	int a[10] = {0,-2,6,5,4,-4,3,2,-3,-6}; 	int i; 	  	i = Sort(a, 10); 	printf("交换次数：%d\n", i);  	for(i=0; i<10; i++) 	{ 		printf("%d  ", a[i]); 	} 	printf("\n");  	return 0; }   /* ---------------------------------- 课本上的冒泡排序法执行结果是：  交换次数：32 -6  -4  -3  -2  0  2  3  4  5  6  ----------------------------------  */

在进行双向(最小,最大)排序时,并没有降低交换次数.原码如下: /*  2013年12月25日圣诞节 改进冒泡法排序,虽然降低了循环次数,但交换次数没有下降(还是32次),效率应该不会提高.   */ # include <STDIO.H>  int Sort(int * pArr, int len) { 	int i, j, k, r; 	int min, max; 	r = 0; 	for(i=0; i<len/2; i++) 	{ 		k=0; 		printf("外循环次数：%d \n", i+1); 		for(j=i; j<len-1-i; j++) 		{ 			printf("内循环次数：k = %d \n", ++k); 			if(pArr[j] > pArr[j+1])   			{ 				max = pArr[j]; 				pArr[j] = pArr[j+1]; 				pArr[j+1] = max; 				r++; 			} 			if(pArr[i]>pArr[j]) 			{ 				min = pArr[j]; 				pArr[j] = pArr[i]; 				pArr[i] = min; 				r++; 			}  		} 		printf("\n"); 	} 	return r; } int main(void) { 	int a[10] = {0,-2,6,5,4,-4,3,2,-3,-6}; 	int i; 	int j = 0;  	printf("排序前："); 	for(i=0; i<10; i++) 	{ 		printf("%d  ", a[i]); 	}  	printf("\n");  	j = Sort(a, 10); 	printf("交换次数：%d", j);  	printf("排序后："); 	for(i=0; i<10; i++) 	{ 		printf("%d  ", a[i]); 	} 	printf("\n"); 	 	return 0; }  /* ---------------------------- 排序前：0  -2  6  5  4  -4  3  2  -3  -6 外循环次数：1 内循环次数：k = 1 内循环次数：k = 2 内循环次数：k = 3 内循环次数：k = 4 内循环次数：k = 5 内循环次数：k = 6 内循环次数：k = 7 内循环次数：k = 8 内循环次数：k = 9  外循环次数：2 内循环次数：k = 1 内循环次数：k = 2 内循环次数：k = 3 内循环次数：k = 4 内循环次数：k = 5 内循环次数：k = 6 内循环次数：k = 7    外循环次数：3 内循环次数：k = 1 内循环次数：k = 2 内循环次数：k = 3 内循环次数：k = 4 内循环次数：k = 5  外循环次数：4 内循环次数：k = 1 内循环次数：k = 2 内循环次数：k = 3  外循环次数：5 内循环次数：k = 1  交换次数：32排序后：-6  -4  -3  -2  0  2  3  4  5  6 ----------------------------   */

冒泡法 排序需要 32次交换, 这种方法降低到24次交换,应该可以提高效率吧!


Question: 帮忙指点下看什么书

我是大一的 现在把C程序设计的书看完了  哪位大神指点一下 适合继续学C#？ 如果还学要继续巩固C语言的话 我该看那些书？怎么做比较好呢？

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

引用 2 楼 max_min_ 的回复:王爽的那本8086可以看看！ 正在看啊，写的很好。

为什么非要看他的书

王爽的那本8086可以看看！

就用大学教材行了

先问自己两个问题： 1、为什么要学汇编？ 2、为什么要学Win32平台？

先把 16位汇编看完 ，有本书叫 <<汇编语言>> 作者 王爽，特别有名 再看 <<windows程序设计>> 一个老外好像叫 charles petzold ,也特别有名  前提是有 c语言基础，然后就可以看<<win32环境下汇编语言程序设计>>了， 我就是这个路线看的.

<<Intel汇编语言程序设计>>,不要太好

想学汇编，直接王爽


Question: sizeof 一个含结构体的结构体

如果结构体中的成员又是另外一种结构体类型时，只需把其展开即可。但有一点需要注意，展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。 这里 struct S3 {     char c1;     struct S1 s;     char c2; }; 将其展开 struct S3 {    char c1;    struct S1    {       char  c;       int   i;    }s;    char c2; }; 假如S3.c1 为0x00000000; 则S3.S1.c 为0x00000004;               //注意它的偏移量为4，不是1 S3.S1.i   为0x00000008-0x0000000C; S3.c2     为0x0000000D; 整个S3大小应该是0x00000000-0x000000010;为16

关于这方面的内容确实是依赖于编译器实现的 比如你看下《深入探索C++对象模型》里面对于一个类的实现在g++和微软的编译器的处理就是不一样的 所以这方面内容意义不大 主要还是编译器相关

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

不一定是4的倍数，如果pack指定为8，那就是8的倍数了。  引用 7 楼 akirya 的回复:按照起始地址算比较容易。 对于S1 的起始地址只要是4的倍数，就能保证读取c和i都是高效的。  S3中s的地址会保证为4的倍数，那么c1之后就空3字节。 {     char c1;     struct S1 s;     char c2; }; 引用 7 楼 akirya 的回复:按照起始地址算比较容易。 对于S1 的起始地址只要是4的倍数，就能保证读取c和i都是高效的。  S3中s的地址会保证为4的倍数，那么c1之后就空3字节。 {     char c1;     struct S1 s;     char c2; };

理解和讨论之前通常要先学会如何观察和观察什么。

多谢，忘了还有pack这回事。  其实是看了很多，网上查了很多，都是这么说的，结构体里的结构体，如果考虑偏移量是按整体看，如果找最宽的基本类型，是打散了来看。现在想这句话应该是对的，但是同时应该考虑编译器的pack。 就是pack指定为8的时候，看偏移量的时候，那我的s3里的s1不能按4字节处理，要看整体，这个时候就得是8的倍数，如果按4处理就是4的倍数了。  资料上说的对，考虑偏移量时结构体里的结构体看做整体，找结构体里最宽的基本类型时，打散了看。 资料上这句话对，但是很多资料没有把S3为什么是16讲清楚。     引用 1 楼 zhao4zhong1 的回复:#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //


Question: fflush的问题

可能是以文本方式打开，这样写入'\n'时会多一个'\r'字节。  引用 楼主 rabbitjerry 的回复:使用fwrite频繁写文件，每次写固定的几十个字节，写完之后都用fflush函数刷新缓冲区。 这样会造成文件错误吗？ 我在具体实行的时候，查看文件的二进制数据，发现每次写的数据包多了一个字节。 请问是fflush造成的结果吗？

引用 5 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 “多一少一”问题占程序员常犯错误的10%以上！ 赵老师总结的到位。

引用 2 楼 KenZhang1031 的回复:fflush是把缓存写到硬盘的，不会引起你说的错误。要查查程序。你的这个说法是不正确的，fflush只是将c的文件缓存刷新到系统层，而真正将系统层的文件缓存刷新到磁盘的是其他函数的功能_commit(Windows)/fsync(linux)

引用 3 楼 turingo 的回复:可能是以文本方式打开，这样写入'\n'时会多一个'\r'字节。  [quote=引用 楼主 rabbitjerry 的回复:] 使用fwrite频繁写文件，每次写固定的几十个字节，写完之后都用fflush函数刷新缓冲区。 这样会造成文件错误吗？ 我在具体实行的时候，查看文件的二进制数据，发现每次写的数据包多了一个字节。 请问是fflush造成的结果吗？[/quote]  ++  试试二进制方式。

fflush是把缓存写到硬盘的，不会引起你说的错误。要查查程序。

不会。 不是。  你的fwrite怎么调的？（代码呢？） 你的几十个字节怎么来的？（代码呢？）


Question: 在自定义标识符时,不能使用____关键字______和特定字.

楼主是个好人啊

看到答案我就来了

不明就觉个厉

特殊符号和GPU哭了！

谢谢                   .

直接带答案？ 接分接分

楼主，你懂的。

LZ这是散分的节奏？


Question: 对vc6.0平台调试出现问题，应用程序无法正常启动（0xc0150002).请单击“确定”关闭应用程序

引用 22 楼 zhao4zhong1 的回复:请关注：工程、设置、Debug对话框中 可执行调试对话： 工作目录： 的内容。问题解决了，谢谢，通过事务处理确定的

引用 24 楼 zhao4zhong1 的回复:请关注：工程、设置、General对话框中 中间文件： 输出文件： 的内容。 项目设置中的结果都在这

引用 14 楼 zhao4zhong1 的回复: 第一个是错误的exe显示的，第二个是正确的exe显示的

两个dsp中都没有vld相关的东西。。。。。。。。

VLD.DLL当然和VLD_X86.DLL不同了。 用记事本打开.dsp文件，将其中的VLD.LIB改为VLD_X86.LIB试试看。

引用 11 楼 cheng7068 的回复:报的都是dll引用的问题错误，这个分析一下引用环境吧什么是分析引用环境？能够具体点吗，我现在有两个项目，用的都是vc6.0，但是一个可以调试一个不可以进行调试，能够帮忙解释下吗，谢谢

引用 10 楼 zhao4zhong1 的回复:用depends.exe查看exe依赖的dll及其所在目录和版本号。这个不是很懂有什么用呢？下面是两个exe文件的区别 粉色的是无法运行的，黄色的是能够运行的。这个不懂，最多看看调用的函数，谢谢

报的都是dll引用的问题错误，这个分析一下引用环境吧

用depends.exe查看exe依赖的dll及其所在目录和版本号。

重新update代码，重新编译呗

引用 7 楼 zhao4zhong1 的回复:VC6恐怕不支持WINVER 0x0501 或者没有引入正确的.h或.lib文件。 请关注：工具、选择、目录、显示目录为：Include files和Library files时，下面路径中的各目录的上下顺序。  上面是我改动的第二个地方,WINVER那个是因为我要转到vs2008的时候编译器不认识才加的，改回vc6.0版本的时候我去掉了。我用的是静态编译库， 工具中设定include和lib应该是vc6.0的编译环境的设置吧，我的项目没改动的版本在这个编译环境下运行时没有问题的

引用 3 楼 zhao4zhong1 的回复:设置Debug版，重建所有，按F11 忘了放图了抱歉 通过textdiff可以看出我只改了这两处

引用 3 楼 zhao4zhong1 的回复:设置Debug版，重建所有，按F11我这样重建完全没有问题，但是调试不正确

引用 3 楼 zhao4zhong1 的回复:设置Debug版，重建所有，按F11 请问这样是Debug吧，如果是的话我就是这么调试的，其实不是单步的问题，是直接进不进去

设置Debug版，重建所有，按F11

可能别人对我这个问题觉得很无聊，我想解释一下，我原本vc6.0环境这个项目是好的，我想要调整到vs2008的平台，那么我就将其修改到vs2008的平台下面去了，然后出现了同样如题的问题，发现我调用的外部dll有问题，只支持到6.0版本，那么我就重新弄了一个支持08版本的dll，在vs2008编译通过了，但是仍然是出现“应用程序无法正常启动（0xc0150002).请单击“确定”关闭应用程序”这个错误，而且程序是在调试进入函数的时候就出了问题。没有想清楚为什么，就决定还是用原来的吧，毕竟改平台需求不是特别强烈，结果改回来之后竟然又有同样的问题了。vc6.0编译环境我在不变的情况，重新将我的原有备份项目打开运行是成功的，所以请问有谁知道这个是什么问题吗？谢谢

这个是我出错的时候调试显示的东西如下 Loaded 'ntdll.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\kernel32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\KernelBase.dll', no matching symbolic information found. Loaded 'C:\ProgramData\Norton\{0C55C096-0F1D-4F28-AAA2-85EF591126E7}\N360_20.3.0.36\Definitions\BASHDefs\20131203.001\UMEngx86.dll', no matching symbolic information found. Loaded 'C:\Users\Administrator\Desktop\transform\transform\transform\SmartPointer\Debug\libmultitouch.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\setupapi.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\cfgmgr32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\msvcrt.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\rpcrt4.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\advapi32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\sechost.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\gdi32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\user32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\lpk.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\usp10.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\oleaut32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\ole32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\devobj.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\hid.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\comdlg32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\shlwapi.dll', no matching symbolic information found. Loaded 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18201_none_ec80f00e8593ece5\comctl32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\shell32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\winspool.drv', no matching symbolic information found. Loaded 'C:\Windows\System32\oledlg.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\olepro32.dll', no matching symbolic information found. Loaded 'C:\Windows\winsxs\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.18120_none_72d2e82386681b36\GdiPlus.dll', no matching symbolic information found. Loaded 'C:\Users\Administrator\Desktop\transform\transform\transform\SmartPointer\Debug\vld.dll', no matching symbolic information found. The thread 0x11B4 has exited with code -1072365566 (0xC0150002). The program 'C:\Users\Administrator\Desktop\transform\transform\transform\SmartPointer\Debug\SmartPointer.exe' has exited with code -1072365566 (0xC0150002).  我原来调试能够成功显示的调试界面如下 Loaded 'C:\Users\Administrator\Desktop\wu\transform\transform\SmartPointer.exe', no matching symbolic information found. Loaded 'ntdll.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\kernel32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\KernelBase.dll', no matching symbolic information found. Loaded 'C:\ProgramData\Norton\{0C55C096-0F1D-4F28-AAA2-85EF591126E7}\N360_20.3.0.36\Definitions\BASHDefs\20131203.001\UMEngx86.dll', no matching symbolic information found. Loaded 'C:\Users\Administrator\Desktop\wu\transform\transform\libmultitouch.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\setupapi.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\cfgmgr32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\msvcrt.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\rpcrt4.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\advapi32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\sechost.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\gdi32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\user32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\lpk.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\usp10.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\oleaut32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\ole32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\devobj.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\hid.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\comdlg32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\shlwapi.dll', no matching symbolic information found. Loaded 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18201_none_ec80f00e8593ece5\comctl32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\shell32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\winspool.drv', no matching symbolic information found. Loaded 'C:\Windows\System32\oledlg.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\olepro32.dll', no matching symbolic information found. Loaded 'C:\Windows\winsxs\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.18120_none_72d2e82386681b36\GdiPlus.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\imm32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\msctf.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\uxtheme.dll', no matching symbolic information found. vmthid \\?\hid#vmthiddevice&col04#1&2d595ca7&1&0003#{4d1e55b2-f16f-11cf-88cb-001111000030} Loaded 'C:\Windows\System32\wintrust.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\crypt32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\msasn1.dll', no matching symbolic information found. Loaded 'C:\Program Files\Common Files\microsoft shared\ink\tiptsf.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\version.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\apphelp.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\SogouPY.ime', no matching symbolic information found. Loaded 'C:\Windows\System32\msimg32.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\oleacc.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\ntmarta.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\Wldap32.dll', no matching symbolic information found. Loaded 'D:\Program Files\SogouInput\7.0.0.9553\Resource.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\dwmapi.dll', no matching symbolic information found. Loaded 'D:\Program Files\SogouInput\Components\PicFace\1.0.0.792\PicFace.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\cryptbase.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\clbcatq.dll', no matching symbolic information found. Loaded 'D:\Program Files\SogouInput\Components\SmartInfo\1.0.0.266\SmartInfo.dll', no matching symbolic information found. Loaded 'C:\Windows\System32\psapi.dll', no matching symbolic information found. Loaded 'D:\Program Files\SogouInput\Components\WonderfulWrite\1.0.0.53\WonderfulWrite.dll', no matching symbolic information found. The thread 0x468 has exited with code 0 (0x0). Loaded 'C:\Windows\System32\WindowsCodecs.dll', no matching symbolic information found. Loaded 'C:\Users\Administrator\AppData\Local\Youdao\Dict\Application\5.4.46.5479\WordStrokeHelper32.dll', no matching symbolic information found. Open Port Failed!!!0.-----Open Device Fail!!!The thread 0x140C has exited with code 0 (0x0). The thread 0x1120 has exited with code 1 (0x1). The thread 0x1408 has exited with code 1034 (0x40A). The thread 0xFC8 has exited with code 1034 (0x40A). The thread 0x1104 has exited with code 1034 (0x40A). The program 'C:\Users\Administrator\Desktop\wu\transform\transform\SmartPointer.exe' has exited with code 1034 (0x40A).

请关注：工程、设置、General对话框中 中间文件： 输出文件： 的内容。

引用 22 楼 zhao4zhong1 的回复:因为开会导致没注意抱歉，至于您说的那个启动目录和工作目录一致，我将工具中的include，lib，source和bin都重新设定过了，结果还是没有变化。也许是我理解出了错误，谢谢指出


Question: c语言公交查询系统中图遍历起什么作用？

引用 7 楼 edwardvsnc 的回复:比如，你想看一个区域的交通便利情况，是否需要开设新路之类的，就可能要求一下强连通。 这个过程就要遍历图。 比如，路的宽窄不同，流量也就不同，想看一下区域的流通性，就可能要求一下最大流、最小流之类的。 有时还要找出割点、桥，防止一个地方堵死造成整个交通瘫痪。 这些都需要遍历图的基础上来做。  没做过类似的研究，所以例子可能不太恰当。  嗯，这个在现实生活中的确要考虑，从这就可以看出前辈们要编写的程序有多么的复杂。

引用 10 楼 u012510962 的回复:[quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 u012510962 的回复:] [quote=引用 4 楼 derekrose 的回复:] 遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确 是的，要全部遍历了才可以得到最终的结果。我先前准备写转车的时候考虑了，就是也许有不同的路线连接这两个站点，那就有不同的转车方法了。 至于遍历的原理，广度优先遍历和深度优先遍历还是有了解的。可现在不知道这两个站点间的路线要怎么存储，求教！！[/quote]  很简单，本质就是链表  每个节点记录本站的信息，以及下个站的节点指针[/quote]  我大概想通了，下面是我的一点点思路。麻烦前辈看下： 比如说现在建立了一个城市公交站点图并以邻接矩阵的方式存储，当要存储其中两个站点间的路径时，那么从起始站点开始对这个图实行遍历。 从起点开始就要开始建立链表，其中要建立多少链表就得看和起点相关联的站点有几个，当遍历完了第一层（在广度优先遍历的前提下），开始遍历第二层，当遍历完成后，此时存在的链表数就是第二层的站点数和第一层的具体情况了。（当这样的分支越来越大那么要建立的链表数要很大，而且很繁琐）就这要下去一直建立很多很多链表，最后在这些链表中查找同时有这两个站点的链表[/quote] 上面的方法简单粗暴，或许要浪费不小内存空间。但在操作时有些模块可以用递归的方法解决，可是感觉这好像太繁琐，请前辈点评一下，指导一下思路。 谢谢！！

引用 6 楼 derekrose 的回复:[quote=引用 5 楼 u012510962 的回复:] [quote=引用 4 楼 derekrose 的回复:] 遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确 是的，要全部遍历了才可以得到最终的结果。我先前准备写转车的时候考虑了，就是也许有不同的路线连接这两个站点，那就有不同的转车方法了。 至于遍历的原理，广度优先遍历和深度优先遍历还是有了解的。可现在不知道这两个站点间的路线要怎么存储，求教！！[/quote]  很简单，本质就是链表  每个节点记录本站的信息，以及下个站的节点指针[/quote]  我大概想通了，下面是我的一点点思路。麻烦前辈看下： 比如说现在建立了一个城市公交站点图并以邻接矩阵的方式存储，当要存储其中两个站点间的路径时，那么从起始站点开始对这个图实行遍历。 从起点开始就要开始建立链表，其中要建立多少链表就得看和起点相关联的站点有几个，当遍历完了第一层（在广度优先遍历的前提下），开始遍历第二层，当遍历完成后，此时存在的链表数就是第二层的站点数和第一层的具体情况了。（当这样的分支越来越大那么要建立的链表数要很大，而且很繁琐）就这要下去一直建立很多很多链表，最后在这些链表中查找同时有这两个站点的链表

引用 8 楼 edwardvsnc 的回复:[quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 u012510962 的回复:] [quote=引用 4 楼 derekrose 的回复:] 遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确 是的，要全部遍历了才可以得到最终的结果。我先前准备写转车的时候考虑了，就是也许有不同的路线连接这两个站点，那就有不同的转车方法了。 至于遍历的原理，广度优先遍历和深度优先遍历还是有了解的。可现在不知道这两个站点间的路线要怎么存储，求教！！[/quote]  很简单，本质就是链表  每个节点记录本站的信息，以及下个站的节点指针[/quote]  确实可以通过邻接链表来表示图，不过说本质是链表，不敢苟同。 [/quote] “本质”可以换成“思想”

引用 6 楼 derekrose 的回复:[quote=引用 5 楼 u012510962 的回复:] [quote=引用 4 楼 derekrose 的回复:] 遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确 是的，要全部遍历了才可以得到最终的结果。我先前准备写转车的时候考虑了，就是也许有不同的路线连接这两个站点，那就有不同的转车方法了。 至于遍历的原理，广度优先遍历和深度优先遍历还是有了解的。可现在不知道这两个站点间的路线要怎么存储，求教！！[/quote]  很简单，本质就是链表  每个节点记录本站的信息，以及下个站的节点指针[/quote]  确实可以通过邻接链表来表示图，不过说本质是链表，不敢苟同。

引用 5 楼 u012510962 的回复:[quote=引用 4 楼 derekrose 的回复:] 遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确 是的，要全部遍历了才可以得到最终的结果。我先前准备写转车的时候考虑了，就是也许有不同的路线连接这两个站点，那就有不同的转车方法了。 至于遍历的原理，广度优先遍历和深度优先遍历还是有了解的。可现在不知道这两个站点间的路线要怎么存储，求教！！[/quote]  很简单，本质就是链表  每个节点记录本站的信息，以及下个站的节点指针

引用 4 楼 derekrose 的回复:遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确 是的，要全部遍历了才可以得到最终的结果。我先前准备写转车的时候考虑了，就是也许有不同的路线连接这两个站点，那就有不同的转车方法了。 至于遍历的原理，广度优先遍历和深度优先遍历还是有了解的。可现在不知道这两个站点间的路线要怎么存储，求教！！

遍历图和遍历数组原理一样 你不遍历无法获得全部的信息 结果不准确

引用 2 楼 zhao4zhong1 的回复:试给出A点到B点所有不超过10站路，换乘不超过两次的坐车方案。 前辈们写的就是要深奥好多，想想就好复杂的样子。 我上面那个简单要求的编完了，其中的两个站点查找就仅仅在已有的公交线路中查找，最短路径也就是利用迪杰斯特拉算法原理写的，可我觉得这系统根本没有一点点用。虽然老师没要求我们要有转车功能，可是我想试着去编编，可又有知识盲点。哎！找好求助高手了。 我觉得转车功能的瓶颈是：比如有站点A、B，从A开始遍历找B，在查找过程中怎么记录A到B的路径？难道和迪杰斯特拉算法中的一样拿个数组记录，这显然不可行，因为它们之间可能有多种不同的路径。（这仅仅是个人想法）真的不知道可以用什么方法处理。求指教！！ 谢谢！！

试给出A点到B点所有不超过10站路，换乘不超过两次的坐车方案。

试给出A点到B点所有不超过10站路，倒车不超过两次的坐车方案。 试给出从A点出发，直线距离不超过5公里能到达的所有超市。


Question: 怎么做一个界面软件？

各说各不同，唉 怎么我用CodeBlocks和GTK编译时提示少个DLL文件？

qt 不需要犹豫。

GTK+  引用 楼主 wshong2005 的回复:如果我想做一个界面的学生的管理成绩软件或其它界面软件时，请问用C还是C++？用什么库好点而且是跨平台的？qt？wxwidgets？(MFS不跨平台吧？) 如果是选那个界面库时是不是除了标准库外的还要学选的界面库里的库函数？ 有点无知，望详解！谢谢了呵呵。

就LZ的关心点来说，Qt是比较好的选择，它是C++描述的。

建议用xml写界面，移植xml解析的程序模块解析界面的xml生成界面，如此不但可以跨平台，还可实现界面和功能分开。

是啊，要学库函数的，可以用那个Qt。不过我从来没写过界面软件，只用openGL写过图形！


Question: C语言，获取用户输入问题

int a, b; char c,d; scanf("%c:%d %c:%d",&c,&a, &d, &b);


Question: 字符串排序 冒泡法 memcpy内存报错 高手指点。。。

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

引用 2 楼 user-5 的回复:in = "3122...改变指针指向常量区不可以改写其内容，不管memcpy或memmove都会报错吧。原申请100个内存地址也丢失。排序字串跑去搬动字符没啥效率，改用指针数组对指针进行排序吧... 正解。楼主可以把常量字符串拷贝到你分配的内存中。

2楼说的也在理！竟然你已经分配了内存就不要再给它赋地址值了！ in = "3122…… 这句的意思是把后面常量字符串的地址赋值给in的 这里最好换成strcpy/memcpy/等函数

printf("%s\n", *in);这个地方出错了吧！！！

换成memmove函数！ memcpy不支持内存重叠的！


Question: vs2010产生随机数时的一个问题

已经解决了，谢谢！

参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c  /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

srand(time(0));只需要一次就可以了，不用每次都srand(time(0)); 不然每次都产生同一个数#include <stdio.h> #include <stdlib.h>    unsigned suijishu(int n) {     unsigned int i;      // srand(time(0));// 不需要每次都初始化        i = rand()%n;       return i; }  #include <time.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "bx_suiji.h"   void main() {       srand(time(0));// 在这里初始化，就可以了。     char s[4] = {0};     int i=0,n=0;     for(n =0;n<2;n++)     {         for(i=0;i<4;i++)         {             s[i] = 'a'+suijishu(26);         }         for(i = 0;i<4;i++)         {             printf("%c",s[i]);         }         printf("\n");     }     printf("done!\n");       exit(0); }


Question: opencv图像处理代码优化

引用 10 楼 baipv008 的回复:我觉得这段代码用查表法，起码快100倍。图像处理一般不在内层循环做复杂数值运算 嗯，是呀！正在做查表法，应该快很多的，thank you

引用 8 楼 vipcxj 的回复:[quote=引用 7 楼 u011513563 的回复:] [quote=引用 5 楼 vipcxj 的回复:] 从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍 试过了并行思考，通过指令#pragma omp parallel for并行执行，可以使程序提高好几倍，[/quote]  其实还有HSFL之类的给GPU编程的语言，其实GPU的并行能力远强于CPU，你弄的图像处理程序，更是要时时和GPU打交道了[/quote] 其实之前对于这个GPU不太了解，因为接触时间也不是很长，多谢指点，又学到了点东西

引用 9 楼 vipcxj 的回复:[quote=引用 8 楼 vipcxj 的回复:] [quote=引用 7 楼 u011513563 的回复:] [quote=引用 5 楼 vipcxj 的回复:] 从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍 试过了并行思考，通过指令#pragma omp parallel for并行执行，可以使程序提高好几倍，[/quote]  其实还有HSFL之类的给GPU编程的语言，其实GPU的并行能力远强于CPU，你弄的图像处理程序，更是要时时和GPU打交道了[/quote] 其实你pow(A,2)直接用A*A我估计可以快好多倍，你平方都用pow真是闲得蛋疼啊~[/quote]  是啊！没注意

引用 7 楼 u011513563 的回复:[quote=引用 5 楼 vipcxj 的回复:] 从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍 试过了并行思考，通过指令#pragma omp parallel for并行执行，可以使程序提高好几倍，[/quote]  其实还有HSFL之类的给GPU编程的语言，其实GPU的并行能力远强于CPU，你弄的图像处理程序，更是要时时和GPU打交道了

我觉得这段代码用查表法，起码快100倍。图像处理一般不在内层循环做复杂数值运算

引用 8 楼 vipcxj 的回复:[quote=引用 7 楼 u011513563 的回复:] [quote=引用 5 楼 vipcxj 的回复:] 从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍 试过了并行思考，通过指令#pragma omp parallel for并行执行，可以使程序提高好几倍，[/quote]  其实还有HSFL之类的给GPU编程的语言，其实GPU的并行能力远强于CPU，你弄的图像处理程序，更是要时时和GPU打交道了[/quote] 其实你pow(A,2)直接用A*A我估计可以快好多倍，你平方都用pow真是闲得蛋疼啊~

引用 5 楼 vipcxj 的回复:从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍 这个不错，图像可以分成上下两部分，起两个线程处理，分配到两个cpu。 速度再提升一倍应该问题不大。  分子部分的计算，完全可以移动到图像循环外部做预处理。  再加上 一些运算 * 和 / 再做一下简化，减少运算量。  再把汇编码 根据不同平台用一些快速的CPU指令优化一下会又有一些提升。  不过无论这种代码上优化的技巧有多高，最终仍然是比不上算法的改进提升的幅度大。  当然算法的改进是最难的。

引用 5 楼 vipcxj 的回复:从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍 试过了并行思考，通过指令#pragma omp parallel for并行执行，可以使程序提高好几倍，

从并行上思考吧，这种东西让GPU来算，速度会提高成百上千倍

引用 1 楼 zhao4zhong1 的回复:搜"查表法"?  我也看了一些查表法的东西，的确可以提高速度很多，但是我这里好像不太适用，我利用指针对其进行处理，速度可以提高3、4倍，你也提供了一种很好的思路，多谢，

引用 2 楼 gqjjqg 的回复:[quote=引用 楼主 u011513563 的回复:]  求各位大神指导，开发环境是opencv，代码执行速度大概是0.7秒左右，这只是对于一帧图片的处理，我处理的是视频流，2秒钟3帧图片，根本就达不到实时性要求，求各位大神指导下，3层for循环的优化，谢谢！！  row = 480, col = 640, Histbin = 16  不知道你是要做什么，光从代码上看，把最里面的那重循环优化一下应该就会好了吧。[/quote] 我是做图像处理的，内层函数是一个算法的实现表达式，我对立面的代码进行又花了下，利用指针对图像进行像素点提取，速度可以提高3、4倍以上，不过还是没有达到我的要求，不过我们思路一致，谢谢

引用 楼主 u011513563 的回复:求各位大神指导，开发环境是opencv，代码执行速度大概是0.7秒左右，这只是对于一帧图片的处理，我处理的是视频流，2秒钟3帧图片，根本就达不到实时性要求，求各位大神指导下，3层for循环的优化，谢谢！！  row = 480, col = 640, Histbin = 16  不知道你是要做什么，光从代码上看，把最里面的那重循环优化一下应该就会好了吧。

搜"查表法"?


Question: 下面函数，只要被调用就会导致单片机死机，请大家帮忙分析

之前是定时去更新显示，调用上述函数，改成数值发生变化在调该函数，暂时没有发现问题。jieti

感谢大家回复，暂时汇报一下情况。 1、dispbuf2[2] = '\0';这个是漏掉的代码，补上。 2、“char dispbuf1[6],dispbuf2[6] ;”尝试着增加过buf的长度，不过问题依旧存在，不是这个内存溢出导致的。 3，目前做法，之前是定时去更新显示，调用上述函数，改成数值发生变化在调该函数，暂时没有发现问题。    进一步测试中，感谢大家回复。

char dispbuf1[6],dispbuf2[6] ; 试试

在单片机上遇到过中断处理函数中输出串口Log(printf)导致死机的问题。 当时的开发环境是Keil

引用 1 楼 zhao4zhong1 的回复:将               //  dispbuf2[2] = '\0'; 改为                 dispbuf2[2] = '\0'; 试试看。  暂时调整上面函数被调用的频次，以前是定时调用刷新，现在改成判断数值变化，连续工作了9个小时了。 在观察24小时，汇报结果。

引用 3 楼 zhaocanxing 的回复:你的putstr是怎么写的？可不可以贴出来看看？  暂时调整上面函数被调用的频次，以前是定时调用刷新，现在改成判断数值变化，连续工作了9个小时了。 如果这个问题还会发生，我再贴这段代码，谢谢关注。

你的putstr是怎么写的？可不可以贴出来看看？

引用 1 楼 zhao4zhong1 的回复:将               //  dispbuf2[2] = '\0'; 改为                 dispbuf2[2] = '\0'; 试试看。   晚上反馈结果，测试过程慢。 谢谢支持。


Question: 如何分配未知长度的数组或者内存空间

我给你介绍个c的小东东，obstack。grow就行了，比任何stl都好用。

STL的vector因为规定是连续空间 ，但又动态大小，就采用了如上策略

其实你可以直接分配一个连续空间，不够的时候直接加倍realloc，最多浪费数据大小一倍空间，最多也就复制32次(32位

引用 13 楼 micklexqg 的回复:个人总结：我觉得还是预定义一个稍大一点的数组是最简单，最有效的解决方法，用拷贝的方法也可以，但是增加了复杂度，而且还要多分配一块内存空间，虽然有释放掉，但是中间处理的时候会同时需要两个内存空间的。。。以上完全是个人感觉。。。 如果想节省空间，就用链表吧 STL的list 如果符合条件，就 push_back 进去，时间复杂度为常数。

引用 3 楼 micklexqg 的回复:[quote=引用 1 楼 qq120848369 的回复:] 内存不够用了可以分配一块更大的，把原先的数据拷贝上去哈。 那不如直接定义一个大的数组。。。[/quote] 你怎么知道多大叫大的数组？

是不是考虑复杂了？？ 声明一个和原数组一样大的数组不行吗？  因为后申请的数组的肯定是原始数组的子集。

说白了，最底层的内存管理，就是这样： 1、如果要内存连续，最有效的方法就是先算出大小，然后分配； 2、如果大小有变化，那么重新分配，把老数据copy过去； 3、如果嫌麻烦，同时担心内存碎片，分配效率什么的，分配一块非常大内存，自行管理（内存池）；

除了18楼的兄弟，其他人都一帮垃圾 答的什么问题，连边都不靠  楼主的问题，就是不懂数据结构的问题

1）不想用vector 就学习，vector的处理方式，这样C，C++都可以用。 好像是每次满了以后，增加固定字节，比如256 字节 ，或者每次满了以后，加倍数据空间。  2）如果连拷贝数据，都不希望有，那就用数组链表。 满了，再开一个数组。  大概结构如下： 类型定义：  struct block{ T arr[N]; int size; struct block* next; };  实际结构：  arr[N]  +--->arr    +--->arr[N] size    |    size   |    size next--->+    next --+    NULL  数据结构里的链串，就是这么处理的。

引用 楼主 micklexqg 的回复:是这样的，数组都是需要知道长度的，就算是动态数组，也需要知道动态分配的长度，而这里的情况是这样的，在一个循环体里，有判断比较，如果满足条件就把数据保存下来，不满足跳过下一步，所以整个数据的长度只有循环体结束了之后才会知道。首先，我不想直接定义一个很长的数组，其次，我不想执行两次循环，即不想先算出长度，在存储数据，而且，即使是连续两次new或者malloc，内存空间也应该不会是连续的，所以只要满足条件就new的做法是不对的，有人告诉我用链表或者vector，但是这个不是很懂，我想知道，用C或者数组能不能解决？求告知。。。 不用多想了，这种情况下用vector是非常适合的，只是push的时候要成組数据，不要单个。

赵老师贴的代码只是给你个malloc、realloc、free函数用法例子，是让你自己用这三个函数，先malloc，每次需要增加再realloc，用完记得free

自己写一个内存池，分配一块超级大的内存，随便你怎么用，用完了告诉内存池用了多少。内存池自动回收剩下的内存用于下次分配。  这个办法是不是很傻

HeapReAlloc

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

引用 9 楼 zhao4zhong1 的回复:malloc realloc free 仅供参考//输出PROG中有但LIST中没有的文本行，即集合PROG-LIST #include <stdio.h> #include <string.h> #include <stdlib.h> #include <search.h> #define MAXCHARS 512 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; char PROG[256]="PROG";//程序Program需要的文件列表 char LIST[256]="LIST";//dir /b /s生成的实际文件列表List FILE *fp,*fl; int i,c,n,L,hh; int ignore_case=0; char ln[MAXCHARS]; int icompare(const void *arg1,const void *arg2) {    return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) {    return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) {     if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG     if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     if ((fl=fopen(LIST,"rt"))==NULL) {         fprintf(stderr,"Can not open %s\n",LIST);         fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);         return 1;     }     if ((fp=fopen(PROG,"rt"))==NULL) {         fclose(fl);         fprintf(stderr,"Can not open %s\n",PROG);         fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);         return 2;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(fl);         fclose(fp);         fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 4;     }     n=0;     hh=0;     i=0;     while (1) {         if (fgets(ln,MAXCHARS,fl)==NULL) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);             while (1) {                 c=fgetc(fl);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             strcpy(buf+i,ln);i+=MAXCHARS;             n++;             if (n>=MAXLINES) {                 MAXLINES2=MAXLINES*2;                 if (MAXLINES2==1280000) MAXLINES2=2500000;                 buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);                 if (NULL==buf2) {                     free(buf);                     fclose(fl);                     fclose(fp);                     fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     return 5;                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(fl);     if (ignore_case) qsort(buf,n,MAXCHARS,icompare);     else qsort(buf,n,MAXCHARS,compare);     hh=0;     while (1) {         if (fgets(ln,MAXCHARS,fp)==NULL) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);             while (1) {                 c=fgetc(fp);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             if (ignore_case) {                 if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);             } else {                 if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);             }         }     }     fclose(fp);     free(buf);     return 0; }  好难啊，看不懂、、、

栈空间较小，最好不要直接定义一个大数组，试试realloc看看合不合用先...

引用 6 楼 zhou19891113 的回复:[quote=引用 楼主 micklexqg 的回复:] 是这样的，数组都是需要知道长度的，就算是动态数组，也需要知道动态分配的长度，而这里的情况是这样的，在一个循环体里，有判断比较，如果满足条件就把数据保存下来，不满足跳过下一步，所以整个数据的长度只有循环体结束了之后才会知道。首先，我不想直接定义一个很长的数组，其次，我不想执行两次循环，即不想先算出长度，在存储数据，而且，即使是连续两次new或者malloc，内存空间也应该不会是连续的，所以只要满足条件就new的做法是不对的，有人告诉我用链表或者vector，但是这个不是很懂，我想知道，用C或者数组能不能解决？求告知。。。 这一类问题都可以通过合理的设计代码得以解决。[/quote] 可是，应该如何合理地设计代码啊，求告知

引用 4 楼 zhuobattle 的回复:[quote=引用 3 楼 micklexqg 的回复:] [quote=引用 1 楼 qq120848369 的回复:] 内存不够用了可以分配一块更大的，把原先的数据拷贝上去哈。 那不如直接定义一个大的数组。。。[/quote] 第一，你能保证一定足够？ 第二，太大的话，大部分情况就浪费了[/quote] 如果每次都循环都执行拷贝的话，会不会增加复杂度啊


Question: 求大侠帮助，计算两个年份直接的闰年数，不用循环

感谢大家，找了一个最简单的算法，分别求a年和b年与公元0年1月1日的闰年书，a/4-a/100+a/400，看到这个公式我就窒息了。

2000年到2004年之间到底有几个闰年？

一个数学问题： 给定x，y（x < y） 求x，y之间4的倍数的个数a，100的倍数的个数b，400的倍数的个数c 闰年的个数为a - b + c  至于求a的方法： if (x % 4 != 0)   x = x + 4 - x % 4; // 把x变成不小于x的能被4整除的数 if (y % 4 != 0)   y = y - y % 4; // 把y变成不大于y的能被4整除的数 if (x <= y)   a = (y - x) / 4 + 1; else   a = 0; 求b、c类似了

1楼的思路正确

我觉得大概是这个思路：先算超过400年，再算超过100年，再算100年内的。 设两年分别是整数a和b（b>a），则 闰年数=(（b - a）/400）*97 +(（b - a）% 400) / 100 * 24 + (((b - a) % 400) % 100) / 4。 结果不一定对，可能要再考虑a和b是闰年的情况。

个人想法: 什么是闰年,每隔四年一次? 不对, 应该是每隔400年有400/4 - 3 = 97个,3个不是闰年的是,100,200,300,这3个能被100整除,却不能被400整除.所以每100年内, [n, n+100)有25或者24个, 当n%400==0就有25,其他24. 这样应该就能马上算出f(n)是从0,到n这年有多少个闰年,要求两个年份a,b中间的闰年数 f(b)-f(a)即可,b >= a

先找到下一个闰年，然后再找到最后一个闰年 相减后除以4加1 就是 4的倍数的年份的个数  另其为S  然后对经过的百年进行逐一辨别 找出非闰年 令其为D  ans：S - D


Question: 关于windows下的开源库libmodbus的使用（ModBus协议）

但是试了下，我倒是不缺stdintl.h文件，而它给的例子是用的是GCC的库函数，vc下就编译不过了。难道真要在GCC下。。。都没用过。

If you want to compile with Microsoft Visual Studio, you need to install <http://code.google.com/p/msinttypes/> to fill the absence of stdint.h.  To compile under Windows, install [MinGW](http://www.mingw.org/) and MSYS then select the common packages (gcc, automake, libtool, etc). The directory `./src/win32/` contains a Visual C project.  这两段是关键


Question: short长度的问题，应该怎么做？

引用 楼主 fyzqzpd 的回复:cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; //我要取数据的前两个字节，而且保证这两个字节是short类型的数据，下面这句大多数时候是正确的。 short s = *(short*)str; //但有人说short不一定是两个字节，请问应该怎么做？ //WORD能保证是两个字节吗？ //double能保证是8个字节吗？ stdint.h的int16_t或者uint16_t。这个标准头的内容是在配置时或者安装时生成的，理论上会配合你当前平台，提供指定长度的类型。 如果你还怕不保险，可以设个编译时检查，要求长度是2字节。

引用 12 楼 adeng1919 的回复:[quote=引用 11 楼 fyzqzpd 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 请随便谁举一个sizeof(short)不是2的实际例子。 short能保证在绝大多数操作系统中是两个字节吗？[/quote] http://bbs.csdn.net/topics/250076957参考这个帖子，和编译器有关，但是规定short不少于16位[/quote] 谢了，只要是跟编译器有关，跟系统无关那就我所谓了，反正我也不换编译器。

无码不幸福，下面是读取二进制DXF格式文件的代码 ////////////////////////////////////////////////////////////////////////// BOOL BinDxfReadLine( DXFDATA &data, DXFLINE& tm ) {     tm.x1 = tm.y1 = tm.z1 = tm.x2 = tm.y2 = tm.z2 = 0.0; 	tm.color = 9999; 	tm.layer[0] = '\0'; 	 	while ( data.pIndex < data.pEnd ) 	{ 		int rec = ReadBinNumber();  		switch( data.dwGcode ) 		{ 		case 10: tm.x1    = *(double*)(data.pIndex); data.pIndex+=8; break; 		case 20: tm.y1    = *(double*)(data.pIndex); data.pIndex+=8; break; 		case 30: tm.z1    = *(double*)(data.pIndex); data.pIndex+=8; break; 		case 11: tm.x2    = *(double*)(data.pIndex); data.pIndex+=8; break; 		case 21: tm.y2    = *(double*)(data.pIndex); data.pIndex+=8; break; 		case 31: tm.z2    = *(double*)(data.pIndex); data.pIndex+=8; break; 		case 62: tm.color = *(short* )(data.pIndex); data.pIndex+=2; break; 		case 8:  ReadBinString(); strcpy( tm.layer, data.strValue ); break; 		case 0: 			{ 				if ( fabs(tm.x1-tm.x2) + fabs(tm.y1-tm.y2) < 0.000001f ) 				{ 					tm.x2 += 0.000001f; 				} 				if ( tm.color == 9999 ) 				{ 					tm.color = ReadLayerColor(tm.layer); 				}  				data.pIndex -= rec;  			} 			return true;  		default: ReadBinSpace(); break; 		} 		 	}  	return false; }

cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; short s = *(short*)str; assert(s==0x3231);//小端内存 assert(s==0x3132);//大端内存

引用 11 楼 fyzqzpd 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 请随便谁举一个sizeof(short)不是2的实际例子。 short能保证在绝大多数操作系统中是两个字节吗？[/quote] http://bbs.csdn.net/topics/250076957参考这个帖子，和编译器有关，但是规定short不少于16位

引用 7 楼 zhao4zhong1 的回复:请随便谁举一个sizeof(short)不是2的实际例子。 short能保证在绝大多数操作系统中是两个字节吗？

请原谅我的表达能力，其实我就是想知道，已知数据有两个字节是short数值，我想把它取出来，应该怎么做？

引用 8 楼 supermegaboy 的回复:[quote=引用 楼主 fyzqzpd 的回复:] cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; //我要取数据的前两个字节，而且保证这两个字节是short类型的数据，下面这句大多数时候是正确的。 short s = *(short*)str; //但有人说short不一定是两个字节，请问应该怎么做？ //WORD能保证是两个字节吗？ //double能保证是8个字节吗？  请你先澄清一个问题，当short不是两字节时，你想怎么做？[/quote] 对呀？我想问的就是如果short不是两个字节我该怎么做

引用 楼主 fyzqzpd 的回复:cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; //我要取数据的前两个字节，而且保证这两个字节是short类型的数据，下面这句大多数时候是正确的。 short s = *(short*)str; //但有人说short不一定是两个字节，请问应该怎么做？ //WORD能保证是两个字节吗？ //double能保证是8个字节吗？  请你先澄清一个问题，当short不是两字节时，你想怎么做？

请随便谁举一个sizeof(short)不是2的实际例子。

请问 turingo，wchar_t不一定是二个字节吧，因为有些unicode编码的中文占用三个字节或4个字节。 wchar_t仅代表是宽字符，不知道说得对不对。

不同的平台不同的编译器对数据类型定义的大小都是有区别的，如果在开发中对精度要求很高的话，可以事先检测你要用的类型是占几个字节

试试就清楚了！  引用 3 楼 fyzqzpd 的回复:[quote=引用 2 楼 turingo 的回复:] 1、目前来看，short基本上是16位的，以后不保证； 2、用wchar_t比较合适，它一定是两个字节。  [quote=引用 楼主 fyzqzpd 的回复:] cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; //我要取数据的前两个字节，而且保证这两个字节是short类型的数据，下面这句大多数时候是正确的。 short s = *(short*)str; //但有人说short不一定是两个字节，请问应该怎么做？ //WORD能保证是两个字节吗？ //double能保证是8个字节吗？[/quote]  //我要取short数值，要这样吗？ wchar_t  w = *(wchar_t*)str; short s = *(short*)w; [/quote]

引用 2 楼 turingo 的回复:1、目前来看，short基本上是16位的，以后不保证； 2、用wchar_t比较合适，它一定是两个字节。  [quote=引用 楼主 fyzqzpd 的回复:] cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; //我要取数据的前两个字节，而且保证这两个字节是short类型的数据，下面这句大多数时候是正确的。 short s = *(short*)str; //但有人说short不一定是两个字节，请问应该怎么做？ //WORD能保证是两个字节吗？ //double能保证是8个字节吗？[/quote]  //我要取short数值，要这样吗？ wchar_t  w = *(wchar_t*)str; short s = *(short*)w;

1、目前来看，short基本上是16位的，以后不保证； 2、用wchar_t比较合适，它一定是两个字节。  引用 楼主 fyzqzpd 的回复:cha str[256] = "12dkflskdjflksjdflsdjfsdfsf"; //我要取数据的前两个字节，而且保证这两个字节是short类型的数据，下面这句大多数时候是正确的。 short s = *(short*)str; //但有人说short不一定是两个字节，请问应该怎么做？ //WORD能保证是两个字节吗？ //double能保证是8个字节吗？

标准似乎规定short就是两个字节啊，没有规定的是int


Question: computer graphics with openGL 4th edition

楼主，你下载到了吗，有的话给我一份xusiwei2136@163.com，谢谢

要填一个调查，结果“您所在地区不支持”


Question: 在线等啊 新手请教 求帮忙

酱油党路过~~~

引用 2 楼 q745401990 的回复: #include "stdio.h" void main() { char i,j,k; // 三层遍历，不可重复 for(i='x';i<='z';i++)     for(j='x';j<='z';j++)         if(i!=j)// 排除第一种重复情况           {       			for(k='x';k<='z';k++)     			 {        				 if(i!=k&&j!=k)// 排除第二种重复情况 					{ 						// A说他不和X比，C说他不和X、Z比 						// 排除这些情况  							if(i!='x'&&k!='x'&&k!='z')  							printf("a--%c,b--%c,c--%c",i,j,k); 					} 				}     	 } }谢谢啊

引用 1 楼 user-3 的回复:再加一层嵌套 这就是一个示例程序 就事论事 并不是一个通用的解决方案 所以这里没什么好纠结的 谢谢啊 这几天比较忙，没来得及回复。

引用 4 楼 u011408601 的回复:[quote=引用 2 楼 q745401990 的回复:]  #include "stdio.h" void main() { char i,j,k; // 三层遍历，不可重复 for(i='x';i<='z';i++)     for(j='x';j<='z';j++)         if(i!=j)// 排除第一种重复情况           {       			for(k='x';k<='z';k++)     			 {        				 if(i!=k&&j!=k)// 排除第二种重复情况 					{ 						// A说他不和X比，C说他不和X、Z比 						// 排除这些情况  							if(i!='x'&&k!='x'&&k!='z')  							printf("a--%c,b--%c,c--%c",i,j,k); 					} 				}     	 } }谢谢啊 [/quote]  可以结贴了


Question: [下面的框架可能不正确和/或缺失，没有为 highgui100.dll 加载符号]

0、要联网 1、点 调试 2、然后 选项和设置 3、把微软符号服务器勾 4、运行的时候等一下 会从微软下载符号！！

这个问题 ‘Debug下正常  Release下不正常

我也遇到这个问题了，求答复

是啊，同求，我也很着急的。

解决的话求回复，我也的苦恼中

我也是   你解决了吗

我也是这个问题！！！

我也是这个问题呢

楼主问题解决没有？我也遇上这样的问题了！！

没符号不会调试汇编指令吗？

highgui100.dll是 Release 版，不可调试

就是这样子啊

引用 13 楼 u013262531 的回复:引用 11 楼 user-12 的回复:[quote=引用 10 楼 u013262531 的回复:] [quote=引用 7 楼 user-12 的回复:] 需要提供pdb文件方便调试，没有的话，只能看汇编码了。怎么弄这个pdb文件啊？ 编译时代码是选择输出pdb [/quote]参数和你的一样··我一一核对了··[/quote]  说的是highgui100.dll的pdb。

引用 11 楼 user-12 的回复:引用 10 楼 u013262531 的回复:[quote=引用 7 楼 user-12 的回复:] 需要提供pdb文件方便调试，没有的话，只能看汇编码了。怎么弄这个pdb文件啊？ 编译时代码是选择输出pdb [/quote]参数和你的一样··我一一核对了··

引用 11 楼 user-12 的回复:引用 10 楼 u013262531 的回复:[quote=引用 7 楼 user-12 的回复:] 需要提供pdb文件方便调试，没有的话，只能看汇编码了。怎么弄这个pdb文件啊？ 编译时代码是选择输出pdb [/quote] 另外把pdb所在的路径添加到symbol路径中：

引用 10 楼 u013262531 的回复:引用 7 楼 user-12 的回复:需要提供pdb文件方便调试，没有的话，只能看汇编码了。怎么弄这个pdb文件啊？ 编译时代码是选择输出pdb

除此以外 还出现了  	cxcore100.dll!10011cf0() 	  	[下面的框架可能不正确和/或缺失，没有为 cxcore100.dll 加载符号]	 >	VideoCapture.exe!vedio::captrue(_IplImage * pImg_org=0x012e0000)  行184 + 0x9 字节	C++  	ffffffff()	  还有kenel.dll也出现问题

重建所有试试。

需要提供pdb文件方便调试，没有的话，只能看汇编码了。


Question: 不用函数；写字符串的长度，连接，复制，查找，比较

借楼上,你在测试的时候把 __cdecl去掉应该是可以的

char * __cdecl strcat (         char * dst,         const char * src         ) {         char * cp = dst;          while( *cp )                 cp++;                   /* find end of dst */          while( *cp++ = *src++ ) ;       /* Copy src to end of dst */          return( dst );                  /* return dst */  }  char * __cdecl strcpy(char * dst, const char * src) {         char * cp = dst;          while( *cp++ = *src++ )                 ;               /* Copy src over dst */          return( dst ); }  int __cdecl strcmp (         const char * src,         const char * dst         ) {         int ret = 0 ;          while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst)   && *dst)                 ++src, ++dst;          if ( ret < 0 )                 ret = -1 ;         else if ( ret > 0 )                 ret = 1 ;          return( ret ); }  size_t __cdecl strlen (         const char * str         ) {         const char *eos = str;          while( *eos++ ) ;          return( eos - str - 1 ); }  char * __cdecl strstr (         const char * str1,         const char * str2         ) {         char *cp = (char *) str1;         char *s1, *s2;          if ( !*str2 )             return((char *)str1);          while (*cp)         {                 s1 = cp;                 s2 = (char *) str2;                  while ( *s1 && *s2 && !(*s1-*s2) )                         s1++, s2++;                  if (!*s2)                         return(cp);                  cp++;         }          return(NULL);  } 我把源码都给你贴上吧

看下函数内部的实现不就可以了么，好像都是内联汇编

复制帮你写个，我可没验证噢   void strcpy(char *dst, const char *src) {     while (*dst++ = *src++); }


Question: 单链表输出指定位置的元素 求指导~

*chazhao(L,i)这样能输出吗？

楼主可以单步跟踪你的代码，你会发现变量的改动对你代码的影响。

引用 8 楼 fishhehe 的回复:[quote=引用 7 楼 bijiaoben 的回复:] while(L->next) { printf("%d ",L->next->data); L=L->next; } int i; printf("shuru"); scanf("%d",&i); *chazhao(L,i); 输出链表的时候把链表头指针都改了，L不再指向链表头结点了，后面查找的时候还用L会出错的。 另外*chazhao(L,i)有什么特别意义吗？ 我也感觉这里好像不对 应该怎么改[/quote] 用个临时变量，不要改动L的值。L指向你链表的头结点，不要改动它。 LinkList temp=L->next; while(NULL != temp) {     printf("%d ", temp->data);     temp = temp->next; }

引用 7 楼 bijiaoben 的回复:while(L->next) { printf("%d ",L->next->data); L=L->next; } int i; printf("shuru"); scanf("%d",&i); *chazhao(L,i); 输出链表的时候把链表头指针都改了，L不再指向链表头结点了，后面查找的时候还用L会出错的。 另外*chazhao(L,i)有什么特别意义吗？ 我也感觉这里好像不对 应该怎么改

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

引用 4 楼 fishhehe 的回复:[quote=引用 2 楼 user-4 的回复:] return s; printf("%d",s->data); 这两行互换一下，你都return了，还怎么printf  互换完输入i的时候就停止工作了~~[/quote]在scanf("%d" ,&i);后刷新输入缓冲区，fflush(stdin);。 另外，你调用chazhao()为啥前边还带一个*？

引用 2 楼 user-4 的回复:return s; printf("%d",s->data); 这两行互换一下，你都return了，还怎么printf  互换完输入i的时候就停止工作了~~

互换完输入i的时候就停止工作了~~

求大神指导！

引用 9 楼 bijiaoben 的回复:[quote=引用 8 楼 fishhehe 的回复:] [quote=引用 7 楼 bijiaoben 的回复:] while(L->next) { printf("%d ",L->next->data); L=L->next; } int i; printf("shuru"); scanf("%d",&i); *chazhao(L,i); 输出链表的时候把链表头指针都改了，L不再指向链表头结点了，后面查找的时候还用L会出错的。 另外*chazhao(L,i)有什么特别意义吗？ 我也感觉这里好像不对 应该怎么改[/quote] 用个临时变量，不要改动L的值。L指向你链表的头结点，不要改动它。 LinkList temp=L->next; while(NULL != temp) {     printf("%d ", temp->data);     temp = temp->next; }[/quote]


Question: 利用函数实现字符串颠倒

引用 6 楼 crucifer10 的回复:[quote=引用 3 楼 starytx 的回复:] 附上代码 void reverseStr(char *str) { 	if (str == NULL || strlen(str) == 0) 	{ 		return; 	} 	char *p1 = str; 	char *p2 = str + strlen(str) - 1; 	while (p1 < p2) 	{ 		char cTemp = *p1; 		*p1 = *p2; 		*p2 = cTemp; 		p1++; 		p2--; 	} }能否帮我看一下下面这个程序有什么不对的地方   #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 101 int search(double *v,int n,double k) { 	int i; 	*v=k; 	for(i=n-1;*(v+i)!=k;i--); 	return i; } int main() { 	double set[N],key; 	int i,pos; 	srand(time(NULL)); 	for(i=1;i<N;i++) 		set[i]=10+rand()%90+(10+rand()%90)*1e-2; 	printf("?key:"); 	scanf("%lf",&key); 	pos=search(set,i,pos); if(set[pos]==key) 		printf("The set[%d] is the KeyNumber.\n",pos); 	else 		printf("No KeyNumber in the set.\n"); 	return 0; }[/quote]pos=search(set,i,pos);？很明显有问题

给你一个原滋原味C的  #include<stdio.h>  void exchange(char *str) {    if(NULL==str) return;     char *p1=str;    char *p2=str;     while(*(p2+1))      p2++;     while(p1<p2)    {        *p1^=*p2;        *p2^=*p1;        *p1^=*p2; 	   p1++; 	   p2--;    } }  int main() {     char s[100]="123456789\0";     puts(s);      exchange(s);     puts(s);      return 0; }

for(i=n-1;*(v+i)!=k;i--); i=-1时，没找到，就会数组越界。

#include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include<string.h>    void exchange(char *s,int length) {     char *p=s; 	char c; 	int flag=length/2; 	while(flag) 	{ 		c=*p; 	    *p=(*(s+length-1)); 	    *(s+length-1)=c; 		p++; 		s--; 		flag--; 	} }  int _tmain(int argc, _TCHAR* argv[]) {     char s[100]="zar and leo";     int i,j;     exchange(s,strlen(s));     puts(s); 	system("pause");     return 0; }

引用 3 楼 starytx 的回复:附上代码 void reverseStr(char *str) { 	if (str == NULL || strlen(str) == 0) 	{ 		return; 	} 	char *p1 = str; 	char *p2 = str + strlen(str) - 1; 	while (p1 < p2) 	{ 		char cTemp = *p1; 		*p1 = *p2; 		*p2 = cTemp; 		p1++; 		p2--; 	} }能否帮我看一下下面这个程序有什么不对的地方   #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 101 int search(double *v,int n,double k) { 	int i; 	*v=k; 	for(i=n-1;*(v+i)!=k;i--); 	return i; } int main() { 	double set[N],key; 	int i,pos; 	srand(time(NULL)); 	for(i=1;i<N;i++) 		set[i]=10+rand()%90+(10+rand()%90)*1e-2; 	printf("?key:"); 	scanf("%lf",&key); 	pos=search(set,i,pos); if(set[pos]==key) 		printf("The set[%d] is the KeyNumber.\n",pos); 	else 		printf("No KeyNumber in the set.\n"); 	return 0; }

引用 3 楼 starytx 的回复:附上代码 void reverseStr(char *str) { 	if (str == NULL || strlen(str) == 0) 	{ 		return; 	} 	char *p1 = str; 	char *p2 = str + strlen(str) - 1; 	while (p1 < p2) 	{ 		char cTemp = *p1; 		*p1 = *p2; 		*p2 = cTemp; 		p1++; 		p2--; 	} }谢谢，我改成功了

引用 3 楼 starytx 的回复:附上代码 void reverseStr(char *str) { 	if (str == NULL || strlen(str) == 0) 	{ 		return; 	} 	char *p1 = str; 	char *p2 = str + strlen(str) - 1; 	while (p1 < p2) 	{ 		char cTemp = *p1; 		*p1 = *p2; 		*p2 = cTemp; 		p1++; 		p2--; 	} }能不能只改动一到两处

定义两个指针p1,p2,p1指向字符串的首字符，p2指向最后一个字符，然后循环p1自增，p2自减，在循环中交换两者指向的字符值，循环结束条件是p1>=p2

参考我的博文http://blog.csdn.net/turingo/article/details/8124432  引用 楼主 crucifer10 的回复:请问该怎么改，，是利用函数实现字符串颠倒  #include<stdio.h> #include<string.h> void exchange(char *c1,char c2) { 	char c; 	c=*c1; 	*c1=c2; 	c2=c; } int main() { 	char s[100]; 	int i,j; 	while(strlen(gets(s))) 	{ 		for(i=0,j=strlen(s)-1;i<j;i++,j--) 			exchange(s+i,s+j-i); 		puts(s); 	} 	return 0; }


Question: 结构体 是属于声明，还是定义？

引用 16 楼 Red_Stone 的回复:狭义上理解，变量定义是指声明并分配内存，变量声明是指为了调整作用域而做的引用因此编译器不会为变量声明做内存分配工作。 struct AAA {     int a； }； 这里可以认为是对struct AAA类型的定义，因此，可以如下声明或定义其变量： struct AAA aaa; 这句代码如果放在函数外边，即为全局定义（编译时分配内存），这时在其他文件中可以使用extern struct AAA aaa;来声明其为外部变量并引用； 如果放在函数内，就是自动变量的定义（编译时分配内存）。 分配内存的理解是错的。 比如typedef name的所谓定义就无所谓分配内存。 在C中实际上“定义”也就是“可能唯一”，这个概念充其量是习惯说法。 C++的定义和强制性的程序基本正确规则One Definition Rule相关，因此更加要命。 C在此对应的规则是： WG14/N1570 3 If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space, except that: —a typedef name may be redefined to denote the same type as it currently does, provided that type is not a variably modified type; —tags may be redeclared as specified in 6.7.2.3. 可以重复声明的就只有typedef name和tag。剩下的声明（注意不要求是定义）都没法在同一个作用域和名称空间内重复。 而C++不一样。 3.2 One definition rule [basic.def.odr] 1 No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template. （太长，下略。） 禁止重复的规则都是基于定义上的（同一个名称的不同声明出现冲突是另一回事），所以从普通的声明中区分出定义很重要。（另外C++没有name space，tag对应于class-name，在指定类型上是一回事。）

引用 3 楼 supermegaboy 的回复:[quote=引用 楼主 missheaven2011 的回复:] 最近看书，声明可以需要用到的地方声明很多次，定义一个程序中只能有一次 那么 struct AAA {     int a； }； 这个结构体，在头文件中，被多个源文件调用，是不是说明这是对结构体类型的声明呢 有没有具体说明的相关文章  结构体属于类型定义，当它以不完整类型出现时，才属于类型声明。[/quote]++

这个是结构体的定义，在使用时才需要声明结构体

这是一个结构体的定义 一个结构体的声明可以如下: struct  sturct_name;

个人意见：引用内容的长短不是最重要的，最重要的是看从哪里引用。 楼主的问题最该引用“C语法约定中的声明”，我承认我2楼错引了“C++语法约定中的声明” 10楼我纠正为“C语法约定中的声明”  谢谢FrankHB1989提醒。

引用 9 楼 zhao4zhong1 的回复:[quote=引用 7 楼 FrankHB1989 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] C版哪来的class ？ 除了你没人提到class吧。 [/quote] 我是说2楼内容里面有class[/quote] 2楼不就是你引用的。 我说赵老湿以后要引用内容短点有针对性点行不，长了看得慌别人引用起来也累。

引用 3 楼 supermegaboy 的回复:[quote=引用 楼主 missheaven2011 的回复:] 最近看书，声明可以需要用到的地方声明很多次，定义一个程序中只能有一次 那么 struct AAA {     int a； }； 这个结构体，在头文件中，被多个源文件调用，是不是说明这是对结构体类型的声明呢 有没有具体说明的相关文章  结构体属于类型定义，当它以不完整类型出现时，才属于类型声明。[/quote] 这个是错的。 C的“类型定义”专指typedef： WG14/N1570 6.7.8 Type definitions Syntax 1 typedef-name: identifier 这里只能说是带struct-or-union-specifier的tag declaration（struct-declaration有另外的含义）。 另外注意，“不完整类型”是一个已知类型自身的属性，不是决定声明或定义存在的理由。

这个总该是纯C了吧： mk:@MSITStore:C:\MSDN98\98VS\2052\vclang.chm::/html/_clang_summary_of_declarations.htm Summary of Declarations declaration :  declaration-specifiers attribute-seq opt init-declarator-list opt ;                         /* attribute-seq is Microsoft Specific */  declaration-specifiers :  storage-class-specifier declaration-specifiers opt type-specifier declaration-specifiers opt type-qualifier declaration-specifiers opt  attribute-seq :            /* attribute-seq is Microsoft Specific */  attribute attribute-seq opt  attribute : one of      /* Microsoft Specific */  __asm __fastcall  __based __inline  __cdecl __stdcall    init-declarator-list :  init-declarator init-declarator-list , init-declarator  init-declarator :  declarator declarator = initializer /* For scalar initialization */  storage-class-specifier :  auto register static extern typedef __declspec ( extended-decl-modifier-seq ) /* Microsoft Specific */  type-specifier :  void char short int __int8       /* Microsoft Specific */ __int16      /* Microsoft Specific */ __int32      /* Microsoft Specific */ __int64      /* Microsoft Specific */ long float double signed unsigned struct-or-union-specifier enum-specifier typedef-name  type-qualifier :  const volatile  declarator :  pointer opt direct-declarator  direct-declarator :  identifier ( declarator ) direct-declarator [ constant-expression opt] direct-declarator ( parameter-type-list )   /* New-style declarator */ direct-declarator ( identifier-list opt )      /* Obsolete-style declarator */  pointer :  * type-qualifier-list opt * type-qualifier-list opt pointer  parameter-type-list :                           /* The parameter list */  parameter-list parameter-list , ...  parameter-list :  parameter-declaration parameter-list , parameter-declaration  type-qualifier-list :  type-qualifier type-qualifier-list type-qualifier  enum-specifier :  enum identifier opt { enumerator-list } enum identifier  enumerator-list :  enumerator enumerator-list , enumerator  enumerator :  enumeration-constant enumeration-constant = constant-expression  enumeration-constant :  identifier  struct-or-union-specifier :  struct-or-union identifier opt { struct-declaration-list } struct-or-union identifier  struct-or-union :  struct union  struct-declaration-list :  struct-declaration struct-declaration-list struct-declaration  struct-declaration :  specifier-qualifier-list struct-declarator-list ;  specifier-qualifier-list :  type-specifier specifier-qualifier-list opt type-qualifier specifier-qualifier-list opt  struct-declarator-list :  struct-declarator struct-declarator-list , struct-declarator  struct-declarator :  declarator type-specifier declarator opt : constant-expression  parameter-declaration :  declaration-specifiers declarator                /* Named declarator */ declaration-specifiers abstract-declarator opt /* Anonymous declarator */  identifier-list :      /* For old-style declarator */  identifier identifier-list , identifier  abstract-declarator :         /* Used with anonymous declarators */  pointer pointer opt direct-abstract-declarator  direct-abstract-declarator :  ( abstract-declarator ) direct-abstract-declarator opt [ constant-expression opt ] direct-abstract-declarator opt ( parameter-type-list opt )  initializer :  assignment-expression { initializer-list }   /* For aggregate initialization */  { initializer-list , }  initializer-list :  initializer initializer-list , initializer  type-name :  specifier-qualifier-list abstract-declarator opt  typedef-name :  identifier  extended-decl-modifier-seq :/*   Microsoft Specific */  extended-decl-modifier opt extended-decl-modifier-seq extended-decl-modifier  extended-decl-modifier :   /* Microsoft Specific */  thread naked dllimport dllexport

引用 7 楼 FrankHB1989 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] C版哪来的class ？ 除了你没人提到class吧。 [/quote] 我是说2楼内容里面有class

结构体类型。 结构体的tag是标识符，它可以被声明。 声明是一种语法构造。 WG14/N1570 6.7 Declarations Syntax 1 declaration: declaration-specifiers init-declarator-listopt ; static_assert-declaration declaration-specifiers: storage-class-specifier declaration-specifiers opt type-specifier declaration-specifiers opt type-qualifier declaration-specifiers opt function-specifier declaration-specifiers opt alignment-specifier declaration-specifiersopt init-declarator-list: init-declarator init-declarator-list ,init-declarator init-declarator: declarator declarator =initializer  LZ的代码是声明，规约为declaration-specifiers init-declarator-list ;，其中declaration-specifiers是type-specifier declaration-specifiers，这里type-specifier是struct-or-union-specifier。  定义是特殊的声明，满足以下语义构造： WG14/N1570 6.7/5 A declaration specifies the interpretation and attributes of a set of identifiers. A definition of an identifier is a declaration for that identifier that: — for an object, causes storage to be reserved for that object; — for a function, includes the function body; —for an enumeration constant, is the (only) declaration of the identifier; — for a typedef name, is the first (or only) declaration of the identifier.  对于C++来说也类似，不过有两点显著差异： 声明引入名称(name) ，定义相对于名称（标识符的泛化），更强调相对于实体(entity) ； typedef只是声明不是定义。

引用 5 楼 zhao4zhong1 的回复:C版哪来的class ？ 除了你没人提到class吧。

定义，此struct的类型定义

C版哪来的class ？

引用 2 楼 zhao4zhong1 的回复:Grammar of C++ Declarations declaration:   decl-specifiersopt declarator-listopt ; asm-declaration  function-definition  linkage-specification template-declaration:  asm-declaration:  __asm( string-literal );  decl-specifiers:   decl-specifiersopt decl-specifier  decl-specifier:  storage-class-specifier  type-specifier  fct-specifier  friend  typedef __declspec ( extended-decl-modifier-seq )  storage-class-specifier:   auto  register  static  extern  fct-specifier:   inline  virtual  type-specifier:   simple-type-name  class-specifier  enum-specifier  elaborated-type-specifier  const  volatile  extended-decl-modifier-seq:  extended-decl-modifieropt extended-decl-modifier extended-decl-modifier-seq  extended-decl-modifier:  thread naked dllimport dllexport  simple-type-name:   complete-class-name  qualified-type-name  char  short  int  long  signed  unsigned  float  double  void  elaborated-type-specifier:  class-key  identifier  class-key  class-name enum-name  class-key:   class  struct  union  qualified-type-name:   typedef-name  class-name :: qualified-type-name  complete-class-name:   qualified-class-name  :: qualified-class-name  qualified-class-name:   class-name  class-name :: qualified-class-name  enum-specifier:   enum identifieropt { enum-listopt }  enum-list:   enumerator  enum-list , enumerator  enumerator:   identifier  identifier = constant-expression  constant-expression:   conditional-expression  linkage-specification:   extern string-literal { declaration-listopt }  extern string-literal declaration  declaration-list:   declaration declaration-list  declaration  template-declaration:  template < template-argument-list > declaration  template-argument-list:  template-argument template-argument-list , template-argument  template-argument:  type-argument argument-declaration  type-argument:  class identifier  template-class-name:  template-name < template-arg-list >  template-arg-list:  template-arg template-arg-list , template-arg  template-arg:  expression type-name  original-namespace-name :  identifier  namespace-definition :  original-namespace-definition extension-namespace-definition unnamed-namespace-definition  original-namespace-definition :  namespace identifier { namespace-body }  extension-namespace-definition :  namespace original-namespace-name { namespace-body }  unnamed-namespace-definition :  namespace { namespace-body }  namespace-body :  declaration-seqopt  id-expression :  unqualified-id qualified-id  nested-name-specifier :  class-or-namespace-name :: nested-name-specifieropt   class-or-namespace-name :  class-name namespace-name  namespace-name :  original-namespace-name namespace-alias  namespace-alias :  identifier  namespace-alias-definition :  namespace identifier = qualified-namespace-specifier;  qualified-namespace-specifier :  ::opt nested-name-specifieropt class-or-namespace-name  using-declaration :  using ::opt nested-name-specifier unqualified-id using :: unqualified-id  using-directive :  using namespace ::opt nested-name-specifieropt namespace-name 赵老湿这里是C版，人家没问C艹。

引用 11 楼 FrankHB1989 的回复:[quote=引用 3 楼 supermegaboy 的回复:] [quote=引用 楼主 missheaven2011 的回复:] 最近看书，声明可以需要用到的地方声明很多次，定义一个程序中只能有一次 那么 struct AAA {     int a； }； 这个结构体，在头文件中，被多个源文件调用，是不是说明这是对结构体类型的声明呢 有没有具体说明的相关文章  结构体属于类型定义，当它以不完整类型出现时，才属于类型声明。[/quote] 这个是错的。 C的“类型定义”专指typedef： WG14/N1570 6.7.8 Type definitions Syntax 1 typedef-name: identifier 这里只能说是带struct-or-union-specifier的tag declaration（struct-declaration有另外的含义）。 另外注意，“不完整类型”是一个已知类型自身的属性，不是决定声明或定义存在的理由。  [/quote]  你过虑了，偶说的类型定义显然不可能是typedef。

看来,楼主的头脑中没有内部连接和外部连接的概念呀!!! 现在在给你科普一下... 时刻要注意区分内部连接和外部连接   以下情况有内部连接: 　　 　　a)所有的声明 　　 　　b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义 　　 　　c)enum定义 　　 　　d)inline函数定义(包括自由函数和非自由函数) 　　 　　e)类的定义,当然也包括struct定义了　 　　f)名字空间中const常量定义 　　 　　g)union的定义 　　 　　外部连接:在一个多文件程序中，假如一个名称在连接时可以和其它编译单元交互，那么这个名称就有外部连接。 　　 　　以下情况有外部连接: 　　 　　a)类非inline函数总有外部连接。包括类成员函数和类静态成员函数 　　 　　b)类静态成员变量总有外部连接。 　　 　　c)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量

我觉得这是引用该结构体的定义，如果多个.h文件都include了包含这段代码的.h文件(并且出现嵌套的话)，

struct AAA {     int a； }； 这应该是定义一个名为“AAA”的结构体。  “在头文件中，被多个源文件调用，是不是说明这是对结构体类型的声明呢？” 我觉得这是引用该结构体的定义，如果多个.h文件都include了包含这段代码的.h文件的话， 编译的时候是会提示错误的“类型重定义”。  而真正要用到“AAA”这个结构体的时候， struct AAA a = { 123 }; struct AAA b = { 456 }; 这才是声明一个名称为“a”的AAA类型的结构体变量；

C的tag和对应类型声明的关系： WG14/N570 6.7.2.3 4 All declarations of structure, union, or enumerated types that have the same scope and use the same tag declare the same type. Irrespective of whether there is a tag or what other declarations of the type are in the same translation unit, the type is incomplete until immediately after the closing brace of the list defining the content, and complete thereafter. 至于说不指定{...}的形式嘛…… WG14/N1570 6.7.2.3 7 A declaration of the form struct-or-union identifier ; specifies a structure or union type and declares the identifier as a tag of that type. 8 If a type specifier of the form struct-or-union identifier occurs other than as part of one of the above forms, and no other declaration of the identifier as a tag is visible, then it declares an incomplete structure or union type, and declares the identifier as the tag of that type. 可见类似LZ的代码声明了类型struct AAA；而struct AAA;在之前没有可见的上述形式的声明时声明不完整类型struct AAA。 按C的说法，两者都只是声明而不是定义。（顺便，前者在C++是类定义；后者是类名声明，不是定义。）当然，{}里的内容可以是定义。


Question: C语言怎样除去数组字符串的特殊字符

用ctype.h中库函数可以判断字符是不是数字int isdigit(int c)， isalpha判断是不是英文字母，可以看一下。

引用 2 楼 q745401990 的回复:void squeeze(char s[],int c)  {      int i,j;      for (i = 0, j = 0; s[i] != '\0'; i++)      {          if (s[i] != c)          {              s[j++] = s[i];          }      }      s[j] = '\0'; }   没有就自己写呗  除去字符串s 中的字符c

用一个指针把它找到，然后可以让后面的向前移动（覆盖掉“，”）

没有，后面的字凑6个字

void strcpybutcomma(char *t,char *s) {     char c;      while (1) {         c = *s++;         if (','!=c) *t++ = c;         if (0==c) break;     } }


Question: c语言如何实现二叉树的顺序存储？

用一个数组 记录好父子节点位置下标就行了

既然是完全二叉树那用数组就可以了啊  假设根结点是0 那么一个结点其左孩子 且该结点的在数组中下标为n 则其左孩子的下标为2*n+1 而右孩子的下标为 2*n+2  因为是完全二叉树 所以使用这种方法应该是非常好的  之所以使用指针实现树是因为大多数树并不是满树或者完全二叉树 所以会造成大量空间浪费 而对于满树和完全二叉树当然使用数组实现最好

引用 楼主 xyf12344 的回复:如题。。。老师布置的任务， 我的想法是，先写一个头文件，定义一个struct bitnode {} 然后，再定义一个 struct tree{}。 但是在c文件实现中，不知道如何下手。。。。求高手赐教 看一下二叉堆的存储方式就会了！

在一棵n个结点的完全二叉树中，从树根起，自上层到下层，每层从左至右，给所有结点编号，能得到一个反映整个二叉树结构的线性序列。  然后用一个数组存起来就可以了

后来，老师要求的是一个完全二叉树

维基百科。。。


Question: 没有语法错误 为什么会出现这种情况

引用 5 楼 max_min_ 的回复:   aver(a);//调用   ps:检查scanf函数的返回值！ 恩 调用的地方弄明白了 但是您说的检查scanf函数的返回值是什么意思呢 菜鸟见谅

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

引用 6 楼 a345485527 的回复:[quote=引用 4 楼 b372119132 的回复:] [quote=引用 2 楼 gerrard0616 的回复:] aver(a[2][2]);//调用 这里lz要传入数组吧，换成aver(a); a[2][2]是指数组中的单个元素 可是我记得老师讲的时候说的是如果是二维数组的话 前面括号里的数字可以省略 后面的不能省略 就是这样的形式：a[][x];[/quote] 这个指的是形参，不是实参[/quote] 谢谢了！

引用 4 楼 b372119132 的回复:[quote=引用 2 楼 gerrard0616 的回复:] aver(a[2][2]);//调用 这里lz要传入数组吧，换成aver(a); a[2][2]是指数组中的单个元素 可是我记得老师讲的时候说的是如果是二维数组的话 前面括号里的数字可以省略 后面的不能省略 就是这样的形式：a[][x];[/quote] 这个指的是形参，不是实参

aver(a);//调用   ps:检查scanf函数的返回值！

引用 2 楼 gerrard0616 的回复:aver(a[2][2]);//调用 这里lz要传入数组吧，换成aver(a); a[2][2]是指数组中的单个元素 可是我记得老师讲的时候说的是如果是二维数组的话 前面括号里的数字可以省略 后面的不能省略 就是这样的形式：a[][x];

怎么会不报错呢，看这个/**/部分  /*求平均数*/ # include <stdio.h>  int i = 0, j = 0; int c[2];   void aver(int b[2][2]);//声明放到Main函数外 int main() { 	 	int a[2][2]; 	for (i = 0; i < 2; i++) 		for (j = 0; j < 2; j++) 			scanf("%d",&a[i][j]);//输入4个数字  	/*这里调用*/ 	aver(a);//调用 	for (i = 0; i < 2; i++) 		printf("%3d",c[i]);  	return 0; }  /*形参*/ /*不一定非要这么写*/ void aver(int b[][2]) { 	int sum = 0; 	for (i = 0; i < 2; i++) 	{ 		for (j = 0; j < 2; j++) 			sum = sum + b[i][j]; 		c[i] = sum/2;//求平均后赋值给c数组 		sum = 0;//归零 	}  }

我说没有语法错误的意思是  没有报错


Question: C中\t和\n 的区别

这个问题完全可以在网上google下！ 都有详细的说明已经附带例程的！

引用 2 楼 a345485527 的回复:\t:水平制表（跳到下一个Tab位置） \r:回车，将当前位置移到本行开头 \n:换行  mark一下

\r:回车，将当前位置移到本行开头 \n:换行，并且可以刷新缓冲区

\n new line

\t tab \n next line \r return

t不换行 n换行

\r：回车，相当于光标回到本行首位置，不会换行；另外有一个\n，换行，表示光标换到下一行；因此在windows下通常使用\r\n，表示回车换行，即光标到第二行的首位置，相当于按了键盘上的Enter键（有些是标为return键） \t: 水平制表符，相当于按了键盘上的TAB按键，通常宽度相当于8个空格的位置，但有些软件允许设置tab的宽度。

楼上++  \t相当于你按下TAB键的效果 一般是后移一段位置  \n是换行 也就是进入到下一行

\r 回车 　　\t 跳格  文本中换行： 		CFile file; 		file.Open(szPath, CFile::modeWrite | CFile::modeCreate); 		char newLine[2] = {13, 10}; 		file.Write(newLine, 2);					//换行 这是我对\n \t的理解

printf一下就知道了啊 制表符和换行符

\r 回车  \t 跳格


Question: C语言正则表达式

正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549

推荐使用regtest软件。

引用 2 楼 gongheguoyingpai11 的回复:[^_][a-zA-Z0-9]+  貌似是因为这个地方的原因 这里[^_]需要匹配一个除_之外的字符 [a-zA-Z0-9]+需要匹配一个处于a-z或A-Z或0-9的字符 所以此处需要匹配两个字符 而在第二个匹配中此处只有r一个字符 所以不匹配  将[a-zA-Z0-9]+改为[a-zA-Z0-9]*应该就可以了  [a-zA-Z0-9]+需要匹配一个处于a-z或A-Z或0-9的字符 所以此处需要匹配两个字符?  大神 这个地方为什么必须要匹配两个字符吗？

貌似两个串格式基本一样的说。

引用 7 楼 zhao4zhong1 的回复:http://www.baidu.com/s?wd=regtest&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=7&rsv_sug1=7&rsv_sug4=95&rsv_sug=0&inputT=2422   呃呃呃。我在百度下载了好几个了，都不好用或者说我没用明白，总之就是我的代码能运行成功，但是这个软件却不行。。。。。咋办呐

引用 4 楼 zhao4zhong1 的回复:推荐使用regtest软件。  我下了好几个软件，不过我感觉好像都不是C语言的啊是我用的不对还是怎么？

引用 3 楼 laoyaoyaoyaoyao 的回复:[quote=引用 2 楼 gongheguoyingpai11 的回复:] [^_][a-zA-Z0-9]+  貌似是因为这个地方的原因 这里[^_]需要匹配一个除_之外的字符 [a-zA-Z0-9]+需要匹配一个处于a-z或A-Z或0-9的字符 所以此处需要匹配两个字符 而在第二个匹配中此处只有r一个字符 所以不匹配  将[a-zA-Z0-9]+改为[a-zA-Z0-9]*应该就可以了  [a-zA-Z0-9]+需要匹配一个处于a-z或A-Z或0-9的字符 所以此处需要匹配两个字符?  大神 这个地方为什么必须要匹配两个字符吗？  [/quote] [^-]因为没有数量修饰符 所以采取顺序匹配所以这里是必须匹配一个字符的 而[a-zA-Z0-9]+中的加号是匹配一个或多个字符 所以这里也必须至少匹配一个字符 所以[^_][a-zA-Z0-9]+至少需要匹配两个字符


Question: c语言一个成绩管理系统（有问题求修改）

引用 6 楼 zifang20 的回复:[quote=引用 5 楼 bijiaoben 的回复:] printf("Input num %d english:",stuinfoi); scanf("%f",stu1.english); printf("Input num %d math:",stuinfoi); scanf("%f",stu1.math); => printf("Input num %d english:",stuinfoi); scanf("%f",&stu1.english); printf("Input num %d math:",stuinfoi); scanf("%f",&stu1.math);  楼主好像少写了取地址符号  谢谢啊 不过貌似这儿问题处理完成之后  还有其其它功能都有问题 。。[/quote] 没关系，你把错误情况贴出来，今天有空了再帮你看。程序都是一点一点改出来的，别急

就是啊，楼主太懒了

你说有问题，但没说什么问题。只是发上来让大家帮你调试程序吗？

引用 5 楼 bijiaoben 的回复:printf("Input num %d english:",stuinfoi); scanf("%f",stu1.english); printf("Input num %d math:",stuinfoi); scanf("%f",stu1.math); => printf("Input num %d english:",stuinfoi); scanf("%f",&stu1.english); printf("Input num %d math:",stuinfoi); scanf("%f",&stu1.math);  楼主好像少写了取地址符号  谢谢啊 不过貌似这儿问题处理完成之后  还有其其它功能都有问题 。。

引用 2 楼 user-2 的回复:就是啊，楼主太懒了我修改过的通过留言板发了，具体问题你看我刚才给你上一楼好友的留言。

引用 1 楼 bijiaoben 的回复:你说有问题，但没说什么问题。只是发上来让大家帮你调试程序吗？                //  学生信息管理系统   #include "stdio.h"   struct Student                                   /*定义学生信息的结构体类型*/ { int id; char name[10]; char _class; float english; float math; float chinese; float others; float total;   };    char stuinfocol[][12]={"ID","Name","_class","english","math","chinese","others"}; /*定义学生信息的列标题*/  int  stuinfoi=1;    void title();                                    /*完成若干个自定义函数的声明*/ int dupchkstuinfo(FILE *fp,int id); int stcmp(char *str1,char *str2); int found(char *str); void inputstu(); void editstu(); void delstu(); void showstu(); void query(); void help();      void title()                                     /*定义显示学生管理系统初始界面的函数*/ { printf("\t\t\tStudent Management System\n\n"); printf("  Press 1    Press 2    Press 3    Press 4    press 5    Press h    Press #\n"); printf(" InputStu    EditStu     DelStu    ShowStu     Query      Help       Exit\n\n\n"); }     int dupchkstuinfo(FILE *fp,int id)               /*定义 查重函数，当插入新记录前，检查与文件已有记录是否重复，以id号为关键字*/ { FILE *fp2=fp; struct Student data,*p=&data; rewind(fp);                                      /*将文件指针置于文件的头部*/ while(fread(p,sizeof(struct Student),1,fp),!feof(fp)) if((*p).id==id) break; fp=fp2; if((*p).id==id) return 1;           else  return 0; }     int stcmp(char *str1,char *str2)          /*定义两个字符串匹配函数，比较两个字符串是否相同*/ { while(*str1!='\0'&&*str2!='\0')          //输入比较判断字符串是否合法，返回布尔值。 { if(*str1!=*str2)  break; str1++; str2++; } if(*str1=='\0'&&*str2=='\0')  return 1;                        else   return 0; }     int found(char *str)                          /*定义查找函数，当修改记录时，输入要修改的列的标题，在列标题数组中查找*/ { int i; for(i=0;i<7;i++) if(stcmp(stuinfocol[i],str))  break; if(stcmp(stuinfocol[i],str))  return i;    else  return 7; }     void inputstu()                                  /*定义录入学生信息记录的函数*/ { FILE *fp;                                        //定义了一个文件流指针，指向的是一个文件 struct Student stu1; char command[5]="add"; fp=fopen("huangzifang.dat","ab+");                   /*以追加的读写二进制文件的方式打开二进制文件stuinfo.dat*/ while(!stcmp(command,"exit"))                    /*录入字符串exit的时候，退出插入记录的状态*/ { printf("Input num %d ID:",stuinfoi); scanf("%d",&stu1.id); if(dupchkstuinfo(fp,stu1.id)) { printf("Your input ID is duplicate,input it again!!!\n"); continue; } printf("Input num %d NAME:",stuinfoi); scanf("%s",&stu1.name); printf("Input num %d class:",stuinfoi); scanf("\n%s",&stu1._class);  printf("Input num %d english:",stuinfoi); scanf("%f",stu1.english); printf("Input num %d math:",stuinfoi); scanf("%f",stu1.math); printf("Input num %d chinese:",stuinfoi); scanf("%f",&stu1.chinese); printf("Input num %d other:",stuinfoi); scanf("%f",&stu1.others); printf("Input num %d total:",stuinfoi); scanf("%f",&stu1.total); fwrite(&stu1,sizeof(struct Student),1,fp); stuinfoi++; getchar(); gets(command); } fclose(fp); }     void editstu()                                   /*定义修改学生信息记录的函数*/ { FILE *fp; struct Student stu1; int id,i=0; char command[12]="add"; printf("Please input the student id  you want to edit:"); scanf("%d",&id);                                 /*获取要修改的学生信息记录的学生id*/ fp=fopen("stuinfo.dat","rb+");                   /*以正常的读写二进制文件的方式打开二进制文件stuinfo.dat*/ while(fread(&stu1,sizeof(struct Student),1,fp),!feof(fp)&&stu1.id!=id)  i++; if(stu1.id!=id) printf("The record is not exist!!\n");     /*判断录入的id在学生信息文件中是否存在，不存在，显示提示信息!!*/         else            {         printf("\n%-8s%-10s%-10s%-16s%-12s%-10s%-s\n",stuinfocol[0],stuinfocol[1],stuinfocol[2],stuinfocol[3],stuinfocol[4],stuinfocol[5],stuinfocol[6]);         printf("%-8d",stu1.id);         printf("%-11s",stu1.name);         printf("%-9s",stu1._class); 		printf("%f",stu1.english);         printf("%f",stu1.math); 		printf("%f",stu1.chinese); 		printf("%f",stu1.others); 		printf("%f",stu1.total);          /*录入的id在学生信息文件中存在,则显示对应的记录信息*/         getchar();         gets(command);         while(!stcmp(command,"exit"))                     /*录入字符串exit的时候,退出修改记录的状态*/         {          switch(found(command))                           /*录入其他字符串时候,判断要修改本记录的哪个列标题的信息*/         {         case 0:  printf("Please input new id:");         scanf("%d",&stu1.id);             break;         case 1:  printf("Please input new name:");       scanf("%s",stu1.name);            break;         case 2:  printf("Please input new class:");        scanf("%s",&stu1._class);       break;         case 3:  printf("Please input new english:");   scanf("%f",&stu1.english);         break;         case 4:  printf("Please input new math:");      scanf("%f",&stu1.math);            break;         case 5:  printf("Please input new chinese:");      scanf("%f",&stu1.chinese);      break;         case 6:  printf("Please input new others:"); scanf("%f",&stu1.others);             break; 		case 7:  printf("Please input new total:"); scanf("%f",&stu1.total);               break;         default: printf("Your input is wrong!!\n");         }         getchar();         gets(command);         }         fseek(fp,i*sizeof(struct Student),SEEK_SET);         fwrite(&stu1,sizeof(struct Student),1,fp);         } fclose(fp); }     void delstu()                                     /*定义删除学生信息记录的函数*/                                 { FILE *fp,*fp2; struct Student stu1; char *new="huangzifang.dat",*old="temp.dat"; int id; printf("Please input the student id  you want to delete:"); scanf("%d",&id);                                 /*获取要删除的学生信息记录的学生id*/ fp=fopen("stuinfo.dat","ab+");                    /*以追加的读写二进制文件的方式打开二进制文件stuinfo.dat*/ while(fread(&stu1,sizeof(struct Student),1,fp),!feof(fp)&&stu1.id!=id)  ; if(stu1.id!=id)   printf("The record is not exist!!\n");   /*判断录入的id在学生信息文件中是否存在，不存在，显示提示信息!!*/         else         {         rewind(fp);         fp2=fopen("temp.dat","ab+");             /*以追加的读写二进制文件的方式新建打开二进制文件temp.dat*/                while(fread(&stu1,sizeof(struct Student),1,fp),!feof(fp))           if(stu1.id!=id) fwrite(&stu1,sizeof(struct Student),1,fp2);  /*将stuinfo.dat中除录入id对应记录外的其他记录输入至temp.dat*/         fclose(fp);         fclose(fp2);         remove(new);                             /*删除二进制文件stuinfo.dat*/         if(!rename(old,new))   printf("ok!!\n"); /*重命名temp.dat为stuinfo.dat*/                         else   printf("error!!\n");         } }    void showstu()                                    /*定义显示学生信息记录的函数*/ { FILE *fp; struct Student stu1; printf("\n%-8s%-10s%-10s%-16s%-12s%-10s%-s\n",stuinfocol[0],stuinfocol[1],stuinfocol[2],stuinfocol[3],stuinfocol[4],stuinfocol[5],stuinfocol[6]); fp=fopen("huagnzifang.dat","ab+");                   /*以追加的读写二进制文件的方式打开二进制文件stuinfo.dat*/ while(fread(&stu1,sizeof(struct Student),1,fp),!feof(fp))   /*通过循环，不断读取stuinfo.dat的记录至stu1结构体变量，再输出stu1*/ { printf("%d",stu1.id); printf("%s",stu1.name); printf("%f",stu1.english);  printf("%s",stu1._class); printf("%1f\n",stu1.others); printf("%1f\n",stu1.total); } fclose(fp); }     void query()                                      /*定义查询学生信息记录的函数，此函数未完成*/ { printf("\n"); }    void help()                                       /*定义显示软件帮助信息的函数*/ { printf("\n\nOperate help\n\n"); printf("Press 1,input student informatin!!\n"); printf("Press 2,edit student informatin!!\n"); printf("Press 3,delete student informatin!!\n"); printf("Press 4,show student informatin!!\n"); printf("Press 5,query student informatin!!\n"); printf("Press #,Exit from System!!\n"); printf("Press h,Get Help!!\n"); printf("Press exit,Exit from input or edit!!!\n"); getchar(); }     main()                                           /*定义主函数*/ { char ch;   title(); while((ch=getchar())!='#')                       /*通过循环录入不同字符，调用不同函数，完成不同的功能*/ { switch(ch) { case  '1':  inputstu();     break; case  '2':  editstu();      break; case  '3':  delstu();       break;                 /*   删除   */ case  '4':  showstu();      break; case  '5':  query();        break;               /*   查询函数    该部分需要手动完成     */ case  'h':  help();         break; default:    printf("Input error!!!\n");          /*输入为非法字符，显示提示信息*/ } scanf("\n");                                     /*屏蔽回车符的录入*/ } }       按“1”输入学生成绩时候，输入英语成绩时候就死机。


Question: 如何避免realloc申请空间过大

检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  仅供参考//输出PROG中有但LIST中没有的文本行，即集合PROG-LIST #include <stdio.h> #include <string.h> #include <stdlib.h> #include <search.h> #define MAXCHARS 512 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; char PROG[256]="PROG";//程序Program需要的文件列表 char LIST[256]="LIST";//dir /b /s生成的实际文件列表List FILE *fp,*fl; int i,c,n,L,hh; int ignore_case=0; char ln[MAXCHARS]; int icompare(const void *arg1,const void *arg2) {    return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) {    return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) {     if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG     if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     if ((fl=fopen(LIST,"rt"))==NULL) {         fprintf(stderr,"Can not open %s\n",LIST);         fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);         return 1;     }     if ((fp=fopen(PROG,"rt"))==NULL) {         fclose(fl);         fprintf(stderr,"Can not open %s\n",PROG);         fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);         return 2;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(fl);         fclose(fp);         fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 4;     }     n=0;     hh=0;     i=0;     while (1) {         if (fgets(ln,MAXCHARS,fl)==NULL) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);             while (1) {                 c=fgetc(fl);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             strcpy(buf+i,ln);i+=MAXCHARS;             n++;             if (n>=MAXLINES) {                 MAXLINES2=MAXLINES*2;                 if (MAXLINES2==1280000) MAXLINES2=2500000;                 buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);                 if (NULL==buf2) {                     free(buf);                     fclose(fl);                     fclose(fp);                     fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     return 5;                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(fl);     if (ignore_case) qsort(buf,n,MAXCHARS,icompare);     else qsort(buf,n,MAXCHARS,compare);     hh=0;     while (1) {         if (fgets(ln,MAXCHARS,fp)==NULL) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);             while (1) {                 c=fgetc(fp);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             if (ignore_case) {                 if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);             } else {                 if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);             }         }     }     fclose(fp);     free(buf);     return 0; }

楼主realloc返回NULL就不怕原先那块内存没释放吗？

CreateFileMapping The CreateFileMapping function creates a named or unnamed file-mapping object for the specified file.   HANDLE CreateFileMapping(   HANDLE hFile,              // handle to file to map   LPSECURITY_ATTRIBUTES lpFileMappingAttributes,                              // optional security attributes   DWORD flProtect,           // protection for mapping object   DWORD dwMaximumSizeHigh,   // high-order 32 bits of object size   DWORD dwMaximumSizeLow,    // low-order 32 bits of object size   LPCTSTR lpName             // name of file-mapping object );

GlobalMemoryStatusVlm [This is preliminary documentation and subject to change.]   The GlobalMemoryStatusVlm function obtains information about the computer's current usage of both physical and virtual memory.   VOID GlobalMemoryStatusVlm(   LPMEMORYSTATUSVLM lpBuffer   // pointer to a memory status structure );   Parameters lpBuffer  Pointer to a MEMORYSTATUSVLM structure. GlobalMemoryStatusVlm stores information about current memory availability in this structure.  Return Values This function does not return a value.   Remarks You can use the GlobalMemoryStatusVlm function to determine how much memory your application can allocate without severely impacting other applications.   The information returned by the GlobalMemoryStatusVlm function is volatile. There is no guarantee that two sequential calls to this function will return the same information.   QuickInfo   Windows NT: Requires version 5.0 or later.   Windows: Unsupported.   Windows CE: Unsupported.   Header: Declared in winbase.h.   Import Library: Use kernel32.lib.  See Also Memory Management Overview, Memory Management Functions, Very Large Memory (VLM), GlobalMemoryStatus, MEMORYSTATUSVLM

不断在同样的地址扩增空间，这样的做法不太好吧？这样比重新malloc失败的几率会越来越大

提问能力决定了工作能力

动态申请内存总是有机会不成功的。  引用 楼主 wbct007 的回复:如何避免realloc申请空间过大？一个buff，不断的realloc，每次加固定长度，但是几次之后就会提示  realloc(): invalid next size: 0x00007f7af426e610   我知道是因为内存不够，但是，如何避免？  realloc申请内存失败以后，原ptr不变，大小也不变，但是，这个size有问题，怎么避免？

原程序

好吧，实践证明随着运行时间的延长，性能下降很厉害呀，内存泄露估计是存在的，这个，优化……

个人能从来都是建议以及尽量不用这个函数的！ 很多问题


Question: 哈夫曼编码译码，哪位大神帮我做一下吧

作业，不用那么完美，直接用二叉树做，虽然用数组，可能更好。

60以下：有下列情况之一者成绩为不及格： (1)独立工作能力很差；没有完成设计的基本要求的内容；程序结构不合理。 (2)在设计中有严重的违反纪律或抄袭他人设计和成果。 (3)无故不提交设计。

都不太准确的，

百度上有很多这个代码~~可以查一下~~

帮帮忙吧,我需要代码。

呵呵，不会写，而且后天要交了哦。

这个程序上来讲不是很难，主要是要有信息论与编码的基础，建议楼主自己试着写一下


Question: 课程设计，大神帮帮忙

引用 6 楼 q745401990 的回复:http://write.blog.csdn.net/postlist/0/0/enabled/3  仔细看看我的博客 谢谢，看了你的博客不错哦，对不起我不小心按错了，按到丢个板砖

[quote=引用 5 楼 paopaozai 的回复:] 1）随机数产生函数；    用srand rand 2）程序运行时间统计函数。    运行前后各取一次时间相减就可以了。 谢谢，我排序的的代码我会，学过了，就你说的这两个问题不会，请问在哪有详细的说明

貌似蛮简单的

都是 书上的知识

google下 排序算法  很多例程的，一般都会提供4种以上的! 自己动手吧！

要求用c和数据结构