Question: 编写成绩管理系统遇到的一些问题请教。

参考一下——http://blog.csdn.net/u012421456/article/details/40015333

引用 3 楼 axiqia 的回复:问题1： struct student *searchbyname(struct student *head) {     char c;     struct student *stu2;     stu2=(struct student *)malloc(LEN);       printf("Please enter the name :");     scanf("%s",stu2->name);       struct student *p1,*p0;       p1=head;     p0=stu2;       while((p0->name!=p1->name)&&(p1->next!=NULL))     {          p1=p1->next;     }     if(p0->name!=p1->name)         printf("%d %s %lf",p1->no,p1->name,p1->score);     else {         printf("Please cheak your name !");         searchbyname(head);     }     while(1)     {         printf("\n是否继续搜索成员？输入 Y 继续，输入 N 返回:\n");         scanf("%c",&c);                                      //   没有执行？debug时直接就调过了         if(c=='n'||c=='N')             break;         else if (c=='Y'||c=='y');             searchbyname(head);     }     system("pause");     return head; }; 这个可能是因为前面的输入导致缓冲区有回车\n存在，加个getchar()试试，

问题三： void read(struct student *head ) {     FILE *fp;     struct student*p;     p=head;     fp=fopen("student.txt","r");     if(fp==NULL)     {         printf("打开文件出错\n");         exit(1);     }     while(p->next!=NULL)     {         fread(p,sizeof(LEN),1,fp);         p=p->next;     }     fclose(fp); } 如果把数据写入链表中呢？

问题2： void save(struct student *head ) {     FILE *fp;     struct student*p;     p=head;     fp=fopen("student.txt","w");       if(fp==NULL)     {         printf("打开文件出错\n");         exit(1);     }     while(p->next!=NULL)     {         fwrite(p,LEN,1,fp);         p=p->next;     }     fclose(fp); } 由于没有老师没有讲关于文件的部分，所以对文件操作还是有很大问题。该怎么把创建好的链表写入文件中？

代码有什么问题？

struct student *change(struct student *head) {     int num;     struct student *stu;     stu=head;     while(1)     {         printf("请输入查找方式：\n");         printf("学号修改，请输入1\n");         printf("姓名修改，请输入2\n");         printf("返回主菜单，请输入3\n");          scanf("%d",&num);         switch(num)         {             case 1:changebynum(stu);             case 2:changebyname(stu);             case 3:goto END; break;             default :printf("暂不支持，请重新输入\n");break;         }     } END :     system("pause");     return head; }  struct student *changebynum(struct student *head) {     char c;     struct student *stu2;     stu2=(struct student *)malloc(LEN);      struct student *p1,*p0;      p1=head;     p0=stu2;      printf("Please enter the no :");     scanf("%d",&p0->no);     while((p0->name!=p1->name)&&(p1->next!=NULL))     {          p1=p1->next;     }     if(p1->next==NULL)         changebynum(head);       printf("输入要修改成员的资料");     printf("Please enter the name:");     scanf("%s",stu2->name);     strcpy(p1->name,p0->name);     printf("Please enter the score:");     scanf("%lf",&stu2->score);     p1->score=p0->score;      while(1)     {         printf("\n是否继续修改成员？输入 Y 继续，输入 N 返回:\n");         scanf("%c",&c);                                                                                //   没有执行？         if(c=='n'||c=='N')             break;         else if (c=='Y'||c=='y');             changebynum(head);     }     system("pause");     return head; };  struct student *changebyname(struct student *head) {     char c;     struct student *stu2;     stu2=(struct student *)malloc(LEN);      struct student *p1,*p0;      p1=head;     p0=stu2;      printf("Please enter the name :");     scanf("%s",p0->name);     while((p0->name!=p1->name)&&(p1->next!=NULL))     {          p1=p1->next;     }     if(p1->next==NULL)         changebyname(head);       printf("输入要修改成员的资料");     printf("Please enter the num:");     scanf("%d",&stu2->no);     p1->no=p0->no;     printf("Please enter the score:");     scanf("%lf",&stu2->score);     p1->score=p0->score;      while(1)     {         printf("\n是否继续修改成员？输入 Y 继续，输入 N 返回:\n");         scanf("%c",&c);                                                                                //   没有执行？         if(c=='n'||c=='N')             break;         else if (c=='Y'||c=='y');             changebyname(head);     }     system("pause");     return head; };  void save(struct student *head ) {     FILE *fp;     struct student*p;     p=head;     fp=fopen("student.txt","w");  	if(fp==NULL) 	{ 		printf("打开文件出错\n"); 		exit(1); 	} 	while(p->next!=NULL)     {         fwrite(p,LEN,1,fp);         p=p->next;     }     fclose(fp); }  void read(struct student *head ) {     FILE *fp;     struct student*p;     p=head;     fp=fopen("student.txt","r");     if(fp==NULL)     {         printf("打开文件出错\n");         exit(1);     }     while(p->next!=NULL)     {         fread(p,sizeof(LEN),1,fp);         p=p->next;     }     fclose(fp); }  以上是代码的全部。 小白一个，学了C一学期，学艺不精，第一次独立写500行以上的程序，只能写到这个地步了。还是有点自知之明，知道写的不怎么样，所以大家有什么要批评的，我都会虚心接受。如果大家能给予帮助，不胜感激，恳请广大坛友指教。


Question: scanf为什么没有执行呢？

引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉+1

引用 6 楼 kino_chen 的回复:[quote=引用 5 楼 axiqia 的回复:] system("pause")有什么问题吗？不太懂，我单步调试的时候，按下一步直接就调过了scanf。 我的理解是进入del函数后，执行del到while。带用户选择继续删除Y，则递归调用del，知道用户选择删除完成N，跳出while，执行pause；如果用户选择删除完成N，执行pause。等待用户按下任意键时返回head。 是我错了- -，平时不用system("pause")，顾名思义了。1楼应该就是对的，你在scanf("%d",&num)时留下了一个'\n',被scanf("%c",&c)拿去了，你试试scanf(" %c",&c)，在%c前加个空格，使其能跳过空白符。[/quote] 和一楼的效果一样，单次调用可以，但是多次就会出错

引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉不过还以有点问题， 第二次调用的时候会出错

引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉有两个scanf，我没有表达清楚，导致也没有理解你的意思，楼主正解，在输入第一num是后getchar()，就可以了

引用 5 楼 axiqia 的回复:system("pause")有什么问题吗？不太懂，我单步调试的时候，按下一步直接就调过了scanf。 我的理解是进入del函数后，执行del到while。带用户选择继续删除Y，则递归调用del，知道用户选择删除完成N，跳出while，执行pause；如果用户选择删除完成N，执行pause。等待用户按下任意键时返回head。 是我错了- -，平时不用system("pause")，顾名思义了。1楼应该就是对的，你在scanf("%d",&num)时留下了一个'\n',被scanf("%c",&c)拿去了，你试试scanf(" %c",&c)，在%c前加个空格，使其能跳过空白符。

递归调用。我就问一个问题，进入递归后，怎么返回....你都system("pause")了。单步调试一下，你就知道了，不是scanf()没执行

引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉判断是否继续删除中输入Y,N。我试了，加个getchar()没有用

引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉  直接fflush(stdin);清除键盘缓冲区不是更好吗？


Question: 深度搜索结束问题

已了解。。。

楼上的说的我好羞愧。。这个是地址。http://blog.csdn.net/believe__dream/article/details/42270757

引用 1 楼 coding_hello 的回复:回答你的疑问还需要大家去到处找你发的别的贴呢？+!......

回答你的疑问还需要大家去到处找你发的别的贴呢？


Question: SelectObject使用有些疑问，求解答。

是的，显然楼上没有回答你的问题

SelectObject The SelectObject function selects an object into the specified device context. The new object replaces the previous object of the same type.   HGDIOBJ SelectObject(   HDC hdc,          // handle to device context   HGDIOBJ hgdiobj   // handle to object );   Parameters hdc  Handle to the device context.  hgdiobj  Handle to the object to be selected. The specified object must have been created by using one of the following functions: Object Functions  Bitmap CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection   (Bitmaps can be selected for memory device contexts only, and for only one device context at a time.)  Brush CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush  Font CreateFont, CreateFontIndirect  Pen CreatePen, CreatePenIndirect  Region CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect    Return Values If the selected object is not a region and the function succeeds, the return value is the handle of the object being replaced. If the selected object is a region and the function succeeds, the return value is one of the following values:   Value Meaning  SIMPLEREGION Region consists of a single rectangle.  COMPLEXREGION Region consists of more than one rectangle.  NULLREGION Region is empty.    If an error occurs and the selected object is not a region, the return value is NULL. Otherwise, it is GDI_ERROR.   Remarks This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.   An application cannot select a bitmap into more than one device context at a time.   ICM: If the object being selected is a brush or a pen color management is performed.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in wingdi.h.   Import Library: Use gdi32.lib.  See Also Device Contexts Overview, Device Context Functions, CombineRgn, CreateBitmap, CreateBitmapIndirect, CreateBrushIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBPatternBrush, CreateEllipticRgn, CreateEllipticRgnIndirect, CreateFont, CreateFontIndirect, CreateHatchBrush, CreatePatternBrush, CreatePen, CreatePenIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateSolidBrush, SelectClipRgn, SelectPalette

引用 4 楼 fly_dragon_fly 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 是的，显然楼上没有回答你的问题 这是我回答问题的个人风格。[/quote] 只想回答2个字的， 论坛要6个字，没办法[/quote] 选中2个子，将其颜色设置为黑色。

引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 是的，显然楼上没有回答你的问题 这是我回答问题的个人风格。[/quote] 只想回答2个字的， 论坛要6个字，没办法

引用 2 楼 fly_dragon_fly 的回复:是的，显然楼上没有回答你的问题 这是我回答问题的个人风格。


Question: 关于C++调用C编写的动态链接库的问题

不需要。  参考MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\*.* MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

引用 2 楼 a30037338 的回复:不要吧！ HMODULE hModule=GetModuleHandle("***.dll"); //打开共享库， 获得句柄 if (hModule) { 　　typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD); 　　LPFNREGISTER lpfnRegister; 　　lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");          // hModule：共享库句柄， RegisterServiceProcess： 需要加载函数的函数名 　　if (lpfnRegister) 　   { 　　        (*lpfnRegister)(NULL,1L); 　　} }  这个需要你知道共享库中有什么函数和函数参数，   可以通过工具查看dll中的内容 恩，函数的接口是知道的，我也用dumpbin查看过； 其实GetProcAddress我也已经成功，就是调用的时候结果不知怎么的不对，看来是其他问题！ 总之谢谢ls几位

使用def文件导出对应的函数

不需要


Question: 在txt文件中根据关键词选择读取数据

文件假设是d:\data.txt, 输出是D:\out.txt   #include <stdio.h> #include <string.h>  int main(){ 	FILE* fp = fopen("d:\\data.txt", "r"); 	FILE* fp_out = fopen("d:\\out.txt", "wb"); 	do{ 		char buf[1024]; 		fgets(buf, 1023, fp); 		if (strncmp(buf, "WIFI/", 5)==0) 		{ 			fprintf(fp_out, "%s\r\n", buf+5); 		} 	}while(!feof(fp));  	fclose(fp); 	fclose(fp_out);  	return 0; }

能提供程序或者关键语句代码吗？

一行一行读取getline() 然后，分析读到的一行数据。首先判断有没有WIFI，有就保存他后面的数据；如果没有就读取下一行

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

望编程大神求教


Question: 请问如何开发获取当前计算机cpu,内存,硬盘,进程，网络流量等使用率或传输情况，要参考什么类型的书或章节。谢谢各位！

Python，中psutil模块，可以

这个和系统有关，你可以阅读一下sigar源码，相信对你有帮助

这个和系统有关，你可以阅读一下sigar源码，相信对你有帮助

系统调用有相关API

在MSDN里面搜“PDH”

这玩意人家肯定研究类很多。自己能找到啊

百度一个一个去查，都很容易查到，就是分散点，不要嫌麻烦，连这个都要别人帮你去查好了汇总给你。


Question: C语言 命令行参数

参考 http://blog.csdn.net/xiaocainiaoshangxiao/article/details/13996459

鸟哥的linux私房菜，这本书值得你看

只是一个参数而已.理解了的话,该参数完全可以通过配置文件的读写替代

我是做单片机嵌入式的，请问，我会用到这个东西吗？

比如windows的ping、ipconfig/all 等命令后面都带了参数

因为你的main函数从来都不带参数，否则你一定好奇，为什么main函数带2个参数，这2个参数那里来的。然后你什么都明白了

一个程序运行时候,使可以给程序一个参数的,如果你如果你用过DOS或者linux,你会深有体会

运行main带参数的控制台应用程序方法 http://blog.csdn.net/wangshiqilin_fjy/article/details/8177930 命令行参数和普通的函数参数其实是一个道理的。不要太纠结在这里。

参考——http://wenku.baidu.com/view/ad407b1c650e52ea55189806.html


Question: 数组的传递问题   求解    在线等

for(x=0;x<n;x++) { scanf("%d",&a[x]); } printf("最大整数为：%d,最小整数为：%d",max(n,a),mix(n,a));

学会调试代码定位问题，一点点问题就问别人帮你，怎么提高啊。

引用 3 楼 anshiny 的回复:int max(int n, int a[]) { 	int x; 	int the_max = a[0]; 	for(x=1; x<n; x++) { 		if(the_max < a[x]) 			the_max = a[x]; 	} 	return the_max; }  int mix(int n,int a[9]) { 	int x; 	int the_min = a[0]; 	for(x=1; x<n; x++) { 		if(the_min > a[x]) 			the_min = a[x]; 	} 	return the_min; }  int main(int argc, char *argv[]) { 	int a[9], x, n; 	printf("请输入n:\n"); 	scanf("%d", &n); 	for(x=0;x<n;x++) { 		scanf("%d", &a[x]); 	} 	printf("最大整数为：%d, 最小整数为：%d", max(n,a), mix(n,a)); 	return 0; }+!

[quote=引用 3 楼 anshiny 的回复:] [quote] 支持  int main(int argc, char *argv[]) { 	int a[9],x,n; 	printf("请输入n:\n"); 	scanf("%d",&n); 	for(x=0;x<n;x++) 	{ 		scanf("%d",&a[x]);// & 	} 	printf("最大整数为：%d,最小整数为：%d",max(n,a),mix(n,a));//用数组名 	return 0; }

别等了。。。认真看书更实在！

scanf &a[] a-x max|min(n,a)

scanf &a[] a-x max|min(n,a)


Question: 海量优质电子书分享

东西都分享了，投票这点小事还是做得来

已投票，资源正在下载

楼主，下了你的资源，只能投个票以表谢意啦。

顶一个

引用 2 楼 hitwhylz 的回复:[quote=引用 1 楼 zmszsh 的回复:] 谢谢楼主！ 另外问一句楼主都看完了吗？  移动开发多数看了。 算法部分看得少,  那些要比较用心看, 不然看不懂。 还有一些正在看， 比如iOS Games by Tutorials v2.2 这本, 原版12月14号刚在国外出版的。[/quote] 自惭形秽啊，一看书就没有精神，膜拜楼主！

已投票，谢谢楼主！

引用 1 楼 zmszsh 的回复:谢谢楼主！ 另外问一句楼主都看完了吗？  移动开发多数看了。 算法部分看得少,  那些要比较用心看, 不然看不懂。 还有一些正在看， 比如iOS Games by Tutorials v2.2 这本, 原版12月14号刚在国外出版的。

谢谢楼主！ 另外问一句楼主都看完了吗？


Question: C语言 任意输入年月日，距离1949年10月1日有多少天？

这个是我以前写的，写得很不规范，你稍微修改下就能用了 /*显示某年某月某日星期几*/ #include <stdio.h> #include <stdlib.h> int main() { 	int n,y,r,ts;     int sh,zh,ch,x;     int a,b,c;     int d,e,f;     while(1){     system("cls");     printf("请输入年份：");     scanf("%d",&n);	     printf("请输入月份：");     scanf("%d",&y);	     printf("请输入日期：");     scanf("%d",&r);	     int t=0;     for(ch=1900;ch<n;ch++)    {if((ch%4==0)&&(ch%100!=0)||(ch%400==0))  t++; }     if(y==1)	d=0;     if(y==2)	d=31;     if(y==3)	d=59;     if(y==4)	d=90;     if(y==5)	d=120;     if(y==6)	d=151;     if(y==7)	d=181;     if(y==8)	d=212;     if(y==9)	d=243;     if(y==10)	d=273;     if(y==11)	d=304;     if(y==12)	d=334; 	sh=n-1900;zh=sh*365;x=zh+t;     ts=x+d+r;     e=(ts+7)/7;f=e*7;x=ts-f+7;     printf("从1900年1月1日到%d年%d月%d日，已经过了%d天，当天是星期",n,y,r,ts);     if(x==0||x==7)	printf("天");     if(x==6)		printf("六");     if(x==5)		printf("五");     if(x==4)		printf("四");     if(x==3)		printf("三");     if(x==2)		printf("二");     if(x==1)		printf("一");     printf("\n"); 	system("pause");     } 	return 0; }

CTime ct1(1949,10,1,0,0,0); CTime ct2(xx,xx,xx,xx,xx,xx);//你输入的时间 CTimeSpan span = ct1 - ct2; //span.GetDays()就是相隔的天数 有可能是负数 取绝对值就好了

mktime啊  #include <stdio.h> #include <string.h> #include <time.h>  int main(int argc, char *argv[]) {     struct tm tm0, tm1;     time_t tk0, tk1;      memset(&tm0, 0, sizeof(tm0));     memset(&tm1, 0, sizeof(tm1));      tm0.tm_year = 1949 - 1900;     tm0.tm_mon  = 10 - 1;     tm0.tm_mday = 1;     tk0 = mktime(&tm0);      tm1.tm_year = 1949 - 1900;     tm1.tm_mon  = 9 - 1;     tm1.tm_mday = 30;     tk1 = mktime(&tm1);     printf("%d\n", (int)((tk1 - tk0) / (3600 * 24)));      tm1.tm_year = 1948 - 1900;     tm1.tm_mon  = 10 - 1;     tm1.tm_mday = 1;     tk1 = mktime(&tm1);     printf("%d\n", (int)((tk1 - tk0) / (3600 * 24)));      tm1.tm_year = 1949 - 1900;     tm1.tm_mon  = 10 - 1;     tm1.tm_mday = 2;     tk1 = mktime(&tm1);     printf("%d\n", (int)((tk1 - tk0) / (3600 * 24)));      return 0; }

The COleDateTime class handles dates from 1 January 100 – 31 December 9999.  仅供参考#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

这个用模拟的方法就可以做出来啊。 注意闰年、大小月份就是了

引用 3 楼 coding_hello 的回复:每年的天数是365或者366天，12个月份，除了2月，天数都是固定的，闰年2月29天，其他时候28天。  1.如果输入的是1949年的，就只要计算月份和日期。 2.如果相差年份，就计算相差的年份*365，补上中间可能的闰年误差的1天，剩下的就归约到了问题1，同年内的月份日期差的天数+1

用time得到秒数差反算天。有范围，要任意日期得自对照历法去查，不同时期历法不同


Question: C语言最基础的缓冲区问题

引用 8 楼 voidth 的回复:英文不好看不懂。。。 我问题没说明白。 scanf后 缓冲区留下的 \n 下一个scanf %s 执行时 略去 空白符 略去的意思是 \n依然存在   只是scanf忽略 还是scanf把 \n从缓冲中清除？  咋说不明白呢。。。就是清除了。随着第二个scanf处理完它的输入数据，然后这些输入数据包括之前的回车，都清除掉了

英语也是一门计算机语言的说。

那就是 第一个scanf("%d",&p->number);输入后 缓冲区留下\n 第二个scanf("%s",p->name);    前面的\n就从缓冲区消失了？

引用 4 楼 voidth 的回复:刚才用电脑试了下  全局结构体的的元素不是初始化的。。。  scanf本身会滤除前导空白（包括回车符） 除非 %c,  这滤除是指的从缓冲区 清除掉  还是指无视掉  全局变量，编译器会保证都初始化成0  清除掉和无视掉没有区别，因为会接着处理后面的数据，这样的话，之前的数据最后也都一起清除了

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

那就是后面的scanf会清除  前面缓冲区scanf的回车了是么  我还有一个问题  顺便问一下 要构建链表 typedef struct info{ 	int number; 	char name[10]; 	int sex;//0男1女 	int grade; 	struct info* next; }student; 定义全局的结构体变量 里面数据域的值是0么 里面的指针域的指针是指向空么

scanf本身会滤除前导空白（包括回车符） 除非 %c, 而表示输入完成的回车， 通常会在一次输入数据的时候，输入回车， 此回车会留在缓冲区内 getchar(),gets 不会会滤除前导空白 所以只需要一个 getchar();

scanf("%d\n",&p->grade);


Question: 怎样将指针的地址值作为函数返回值返回

int *test(int *p) {     int q;     return p; }

引用 1 楼 user-11 的回复:你想说的是 return *p 吧？ 自古2楼出真相 引用 11 楼 wengdunliang 的回复:[quote=引用 1 楼 user-11 的回复:] 你想说的是 return *p 吧？ 自古2楼出真相[/quote] 3楼说的也对，我觉得你应该要的是3楼的答案

q=(int)p为啥不行？？  #include<stdio.h> #include<time.h>  int test(int *p) {     int q;     return q=(int)p; }  int main(void) { 	int aa[3] = {1,2,3}; 	int c = test(aa); 	printf("c=%x, aa=%x\r\n", c, aa);  	return 0; }   输出： c=18ff3c, aa=18ff3c

return (int) p; 问题在于，结果是实现定义的。如果结果不能被整数类型表示，则行为还是未定义的哩。

你的问题 有点问题  该怎么解释 “p的地址是100”  如果说 p的值是100（用 printf("%p",p) 输出的结果是100） 那么3楼是正确的  如果说p作为一个变量被存储在内存中的第100个字节处  那么6楼是正确的  你知道什么叫 “按值传递吗？”

return (int)&p;//请确定你的编译环境是32位。不然返回int，就会有截断，64位环境下地址是64位的。  p是个临时变量，你把临时变量的地址返回是要干什么- -，肯定有不可告人的秘密

#include <stdio.h> int* test(int **p) {     return *p+1; } int main() {  int d[2]={1,2};  int *p;    p=&d[0];  p=test(&p);   printf("%d\n",p[0]);//2  return 0; }

楼主是要p指针指向的内存地址吧

也试过q=(int)p  如果返回值那么 这个不该是q = (int *)p;吗 return q; 你传进来 又传出去 是在开玩笑吗。  如果返回的是地址 int *q = p; return q;  你何不直接不调用函数 直接 在外面打印p的地址 为什么要返回printf 格式化字符 %p

unsigned int GetPtrAddr(int* p) { 	return (unsigned int)p; }

你返回的类型要匹配啊 int* test(int*p)

你想说的是 return *p 吧？


Question: 为什么epoll用非阻塞而poll用阻塞呢

http://www.cnblogs.com/Anker/p/3265058.html 这篇文章不错


Question: 类型转换问题

引用 7 楼 lm_whales 的回复:同一数据，内部二进制数据是相同的， unsigned 和 signed 表示不同数值 而高级语言，和汇编语言，都会使用十进制表示数据 对于 负数， 同一数值 的 unsigned 表示一个很大的正数 -1 对应的 unsigned， 距离数据溢出还差 1，即最大无符号数 如此而已  32 Bit   溢出值为 4294967296，(unsigned)-1 = 4294967295 signed 到unsigned  实际上并不存在转化动作， 只有类型本身需要转换一下 指针以外， 真正需要转换动作的转换， 的内置数据类型之间，有以下几种  1）在不同长度的整型之间（a符号或者无符号扩展，b数据截断） 2）在不同长度的浮点型之间（a有效数据和指数扩展，b直接截断） 3）在整型和浮点型之间，（a数据扩展，b直接截断，四舍五入，或者取可表示的最大值等等）  +1

C语言无符号数和有符号数之间的转换，转换的原则是底层的位表示保持不变。  当一种类型的表达式被赋值给另外一种类型的变量时，转换是隐式发生的： int tx, ty; unsigned ux, uy; tx = ux;//ux的值转换为signed uy = ty;//ty的值转换为unsigned

《CSAPP》：信息的表示和处理

已经声明的类型还会改变？silly boy.

2）在不同长度的浮点型之间（a有效数据和指数扩展，b直接截断，四舍五入，等等）

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

类型是不会改变的

申明的类型是告诉编译器，不会改变

不会的，楼主想一想char类型变量超过范围出现的情况，应该就知道了

max 永远都是 unsigned int 类型。

不会的。仍是unsigned int 对16位机来说，4-5=65535，3-5=65534 对32位机来说，4-5=4294967295


Question: 二维数组与二级指针的一个疑问

引用 11 楼 sholber 的回复:int a[4][2]= {1,2,3,4,5,6,7,8};  a == &a[0] == a[0] == &a[0][0]    胡说八道，  +1

这是自己在qt下编写的例子：int b[4][2] = {1, 2, 3, 4, 5, 6, 7, 8};      printf("a = %x\n", b);     printf("a[0] = %x\n", b[0]);     printf("&a[0] = %x\n", &b[0]);     printf("&a[0][0] = %x\n", &b[0][0]); 结果如下图：  不知道楼主是怎么查看内存的？

a[0]:1 2 a[1]:3 4 a[2]:5 6 a[3]:7 8 a是整个数组的地址，a[0]是第一维的地址，在某些时候你可以理解为计算机对待[]就是+的意思，比如a[1][2]在编译器看来就是*(*(a+1)+2)

a[0]不是变量

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

引用 9 楼 lm_whales 的回复:通过指针引用数据，是一种间接引用 通过变量名引用数据是直接引用 二级指针需要两次间接引用，才能够获取数据 二级指针变量，需要至少数据地址之外的两个地址（的内存）， 分别储存一级，二级指针，才能够引用数据本身。 其中一个是二级指针变量本身的地址（内存）， 一个用于储存一级指针  二级指针，和一级指针联合作用，才能够实现获取引用数据的目的

通过指针引用数据，是一种间接引用 通过变量名引用数据是直接引用 二级指针需要两次间接引用，才能够获取数据 需要至少两个地址，分别储存一级，二级指针。

a  == &a[0]  == a[0] == &a[0][0]  这是不对的 这四个表达式并不相等  a==  &a[0] 是没错的，&a[0] ==a[0] 就有问题了,指针类型不同  只有，下面这个式子是对的 (void *)a  ==(void *)&a[0] == (void *)a[0]==  (void *) &a[0][0]    表达式 a == 表达式 &a[0]  类型为  int (*)[2]; 表达式 a[0] == 表达式 &a[0][0]  类型为  int *;   数组指针,不是二级指针。  int **p2; int *p1 int a[10][2]; int b[10]; int c; //p2= &a[0]; //错误 int ** 和 int (*)[2] 不匹配 //p2= &b;// //错误int ** 和 int (*)[10] 不匹配  p2 = &p1; // 必须经过这一步， / p1= a[0];//指向变量（数组元素） a[0][0]; //或者    p1= b;//指向变量（数组元素）b[0]; p1 = &b[0];//指向变量（数组元素）b[0]; p1= &c;//指向变量 c; **p2=100; //这才可以引用 **p2;  p2 = malloc(sizeof(int*));//或者动态分配内存  , *p2 = a[0];  *p2 = b;  *p2 =&c; **p2=100; //这才可以引用 **p2; free(p2);//释放内存  二级指针要想 获取 数据本身， 必须 指向一级指针， 通过一级指针得到数据本身

a[0]应该占四个四节吧

对啊。我也是这么理解的，那问题就在于a[0]这个变量存储的值究竟被计算机存储在哪里了？为何我下断点查看内存进入地址，就找不到这个值。。。  引用 楼主 sinat_24160769 的回复:首选，我们要达成共识。 例：int a[4][2]= {1,2,3,4,5,6,7,8}; a == &a[0] == a[0] == &a[0][0]   a[0] 占8个字节    指针a是指向一个包含有2个int 值的数组   以上没问题吧？   那么，问题来了： a[0] 究竟是什么？ 为何我下断点后在内存中，找到&a[0]这个地址，按照8字节，16进制解析，却得到了0000000100000000 ，难道不应该是个地址吗？a[0] 究竟是什么？我好纠结啊。。。。求巨巨答复！

a[0]就是一个包含两个int的一维数组


Question: 有关C语言函数声明和include的问题

建议楼主随便找个开源C项目的源代码参考一下人家是怎么做的。

引用 6 楼 pengzhixi 的回复:不是的 如果函数是static那么你只能在定义的那个c文件里面使用。即使在头文件里面声明那也不行   谢谢您的解答我明白了

引用 1 楼 pengzhixi 的回复:首先不推荐在头文件实现一个全局函数。因为头文件可能会被很多其他的cpp文件包含，这样造成了编译器和连接器的负担，而且容易和其他cpp文件里面的函数定义起冲突。就你目前所说的情况来说，如果你main.c里面include了.h那么直接用都不需要声明该函数   谢谢您的解答我明白的，如果想要安全并且规范一点声明在.h函数定义在.c这样函数是static的时候它也会有意义。

引用 1 楼 pengzhixi 的回复:首先不推荐在头文件实现一个全局函数。因为头文件可能会被很多其他的cpp文件包含，这样造成了编译器和连接器的负担，而且容易和其他cpp文件里面的函数定义起冲突。就你目前所说的情况来说，如果你main.c里面include了.h那么直接用都不需要声明该函数   请问您平时怎么做？

我上面说包含两次会有编译错误的前提是你在.h里面定义了函数的实现。

正确的做法是.h里面只包含声明，.c里面来定义。 检查一个.h文件是否包含定义的常用手段是同一个.c包含两次来测试。 比如你在main.c里面这样写肯定会有编译错误。 #include "test.h" #include "test.h" 也许你会说谁会这么无聊包含两次啊。不过这样做主要是保证多个.c文件包含同一个.h的时候不会报错。


Question: codeblocks怎么警告都build不过去？

引用 5 楼 user-4 的回复:警告啊，i 没有使用嘛，不理解？  关键是不能运行啊，难道还得配置一下。。。

没准codeblocks在哪事先就这么配置的。

是什么错误？

不同作用域内有重名变量——当前作用域覆盖外面作用域的同名变量，警告相当于提示你是不是有错误！如果没有，忽视它即可！ 其次是函数声明有返回值，但是函数内没有发现return语句的警告！ 如果不想有任何警告提示，在配置选项里设置一下，可以屏蔽所有警告！

警告啊，i 没有使用嘛，不理解？

引用 2 楼 turingo 的回复:是什么错误？  未使用的变量啊，int i，后面没有用


Question: 关于结构体变量非定义时初始化问题

引用 7 楼 zhao4zhong1 的回复:“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。 赵老师求教：如果说 sss = { 1, "Leonard" }; 是对变量赋值的话，那怎么才算对变量非定义时初始化？

c语言不能这样做的。。。 还有用VS写出来的基本都是C/C++，而不是单纯的C

非定义时初始化是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

2013 遵循 C++11标准，允许用初始化表给类，结构赋值， 数组不清楚允不允许，应该不允许吧

引用 8 楼 C0909 的回复:  为何很多人都把struct  写在函数里！  强迫症 = =！  刚开始就没养成好的习惯  不过小代码 无所谓了

是的  引用 2 楼 r55393344 的回复:引用 1 楼 turingo 的回复:在C++中不是叫初始化，而是结构体整体赋值吧。那么C语言确实不允许非定义时初始化的是吗？

sss = { 1, "Leonard" };会报错~ 我试了一下，结构体定义在main外，结构体没有赋值会有默认值：  #include <stdio.h> #include <string.h> struct stu { 	int num; 	char name[20]; } s, ss, sss; int main(void) { 	//sss = {1, "Leonard"}; //非定义时初始化 	s.num = 1; strcpy_s(s.name, "Tyler"); 	ss.num = 1; strcpy_s(ss.name, "Jason");  	printf("s.num = %d, s.name = %s\n", s.num, s.name); 	printf("ss.num = %d, ss.name = %s\n", ss.num, ss.name); 	printf("sss.num = %d, sss.name = %s\n", sss.num, sss.name);  	getchar(); 	return 0; }  像楼主将结构体定义放在main里面那样，运行结果就是这样：

在C++中不是叫初始化，而是结构体整体赋值吧。

引用 7 楼 zhao4zhong1 的回复:“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。 赵老师讲的一针见血， 学习了。

为何很多人都把struct  写在函数里！  强迫症 = =！


Question: 请教一个ODBC连接SQL Server的问题

引用 1 楼 zhao4zhong1 的回复:没见过{?=call ...}只见过{call ...} ......又理解错教程所表达的意思了......

CRecordset::Open virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none ); throw( CDBException, CMemoryException );  Return Value  Nonzero if the CRecordset object was successfully opened; otherwise 0 if CDatabase::Open (if called) returns 0.  Parameters  ... lpszSQL  A string pointer containing one of the following:   A NULL pointer.   The name of a table.   An SQL SELECT statement (optionally with an SQL WHERE or ORDER BY clause).    A CALL statement specifying the name of a predefined query (stored procedure). Be careful that you do not insert whitespace between the curly brace and the CALL keyword. For more information about this string, see the table and the discussion of ClassWizard’s role under Remarks.  Note   The order of the columns in your result set must match the order of the RFX or Bulk RFX function calls in your DoFieldExchange or DoBulkFieldExchange function override. ...  When you call Open, a query, usually an SQL SELECT statement, selects records based on criteria shown in the following table.  Value of the lpszSQL parameter Records selected are determined by Example  NULL The string returned by GetDefaultSQL.   SQL table name All columns of the table-list in DoFieldExchange or DoBulkFieldExchange. "Customer"   Predefined query (stored procedure) name The columns the query is defined to return. "{call OverDueAccts}"   SELECT column-list FROM table-list The specified columns from the specified table(s). "SELECT CustId, CustName FROM  Customer"     ! Warning   Be careful that you do not insert extra whitespace in your SQL string. For example, if you insert whitespace between the curly brace and the CALL keyword, MFC will misinterpret the SQL string as a table name and incorporate it into a SELECT statement, which will result in an exception being thrown. Similarly, if your predefined query uses an output parameter, do not insert whitespace between the curly brace and the '?' symbol. Finally, you must not insert whitespace before the curly brace in a CALL statement or before the SELECT keyword in a SELECT statment.  The usual procedure is to pass NULL to Open; in this case, Open calls GetDefaultSQL. If you are using a derived CRecordset class, GetDefualtSQL gives the table name(s) you specified in ClassWizard. You can instead specify other information in the lpszSQL parameter.  Whatever you pass, Open constructs a final SQL string for the query (the string may have SQL WHERE and ORDER BY clauses appended to the lpszSQL string you passed) and then executes the query. You can examine the constructed string by calling GetSQL after calling Open. For additional details about how the recordset constructs an SQL statement and selects records, see the articleRecordset: How Recordsets Select Records (ODBC) in Visual C++ Programmer’s Guide.  The field data members of your recordset class are bound to the columns of the data selected. If any records are returned, the first record becomes the current record.  If you want to set options for the recordset, such as a filter or sort, specify these after you construct the recordset object but before you call Open. If you want to refresh the records in the recordset after the recordset is already open, call Requery.  For more information, including additional examples, see the articlesRecordset (ODBC),Recordset: How Recordsets Select Records (ODBC), andRecordset: Creating and Closing Recordsets (ODBC) in Visual C++ Programmer’s Guide.  Example  The following code examples show different forms of the Open call.  // rs is a CRecordset or // CRecordset-derived object  // Open rs using the default SQL statement, // implement bookmarks, and turn off // automatic dirty field checking rs.Open( CRecordset::snapshot, NULL,          CRecordset::useBookmarks |          CRecordset::noDirtyFieldCheck );  // Pass a complete SELECT statement // and open as a dynaset rs.Open( CRecordset::dynaset,          _T( "Select L_Name from Customer" ) );  // Accept all defaults rs.Open( );  CRecordset Overview |  Class Members |  Hierarchy Chart  See Also   CRecordset::CRecordset, CRecordset::Close, CRecordset::GetDefaultSQL, CRecordset::GetSQL, CRecordset::m_strFilter, CRecordset::m_strSort, CRecordset::Requery

没见过{?=call ...}只见过{call ...}


Question: 来人+++++++++++++++

只有数组初始化的时候可以这么用，二维可以省掉第一个维度的值，但是你必须把所有元素写出来，编译器自动会计算出来，呵呵

引用 2 楼 tenmenglin 的回复:[quote=引用 1 楼 user-2 的回复:] dxsz[wei[i]]用数字做下标取得该数字的大写数字 可是他定义的是二维数组啊[/quote] 你告诉我dxsz[0], dxsz[1]里面存放了什么

引用 1 楼 user-2 的回复:dxsz[wei[i]]用数字做下标取得该数字的大写数字 可是他定义的是二维数组啊

dxsz[wei[i]]用数字做下标取得该数字的大写数字


Question: C内存地址访问报错：Access Violation

引用 1 楼 wjl123 的回复:我找到原因了。因为我的工程项目文件里有一个同名的create_hash_table，系统调用的是那个函数，而不是这个函数，所以出现了异常。我明白了。 编译器没报错或给出警告？


Question: 最右数字 求帮助 只有几行代码

引用 5 楼 anshiny 的回复:int num[10][4]={{0,0,0,0},{1,1,1,1},{6,2,4,8},{1,3,9,7},{6,4,6,4},                     {5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};  ....这错误....谢啦!

int num[10][4]={{0,0,0,0},{1,1,1,1},{8,2,4,6},{1,3,9,7},{6,4,6,4},                     {5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};

引用 1 楼 user-2 的回复:oj上面报的是什么错  Wrong Answer

oj上面报的是什么错


Question: 脚本中嵌入正则表达式的一个小问题

引用 9 楼 N_sev7 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 如果sed支持用\t代表Tab字符的话： sed -i.bk -e 's/long[ \t][ \t]*longitude/int32_t longitude/g' $i  s/(^| |	|\(|,|<)unsigned( |	)long( |	|\*|\)|>|&|,)/\1uint32_t\3/g  这个表达式大体上我明白，但是(^| |	|\(|,|<)中标红的那个符号表示什么意思呢？[/quote] 不就是将 行首开始的“空格、Tab、(、,、<”＋"unsigned"＋空格、Tab＋“long"＋”空格、Tab、*、)、>、&、,“ 替换为 行首开始的“空格、Tab、(、,、<”＋”uint32_t“＋”空格、Tab、*、)、>、&、,“ 吗？

引用 8 楼 zhao4zhong1 的回复:如果sed支持用\t代表Tab字符的话： sed -i.bk -e 's/long[ \t][ \t]*longitude/int32_t longitude/g' $i  s/(^| |	|\(|,|<)unsigned( |	)long( |	|\*|\)|>|&|,)/\1uint32_t\3/g  这个表达式大体上我明白，但是(^| |	|\(|,|<)中标红的那个符号表示什么意思呢？

引用 5 楼 N_sev7 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] sed -i.bk -e 's/long longitude/int32_t longitude/g' $i 因为有些人写代码的时候喜欢用空格，有些人喜欢用Tab键， 直接这样“sed -i.bk -e 's/long longitude/int32_t longitude/g' $i”写应该不行吧[/quote] 宰了那些用Tab键的人！

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 N_sev7 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] sed -i.bk -e 's/long longitude/int32_t longitude/g' $i 因为有些人写代码的时候喜欢用空格，有些人喜欢用Tab键， 直接这样“sed -i.bk -e 's/long longitude/int32_t longitude/g' $i”写应该不行吧[/quote] 宰了那些用Tab键的人！[/quote] 我也想，可是小鬼子离得太远了

引用 1 楼 zhao4zhong1 的回复:sed -i.bk -e 's/long longitude/int32_t longitude/g' $i 因为有些人写代码的时候喜欢用空格，有些人喜欢用Tab键， 直接这样“sed -i.bk -e 's/long longitude/int32_t longitude/g' $i”写应该不行吧

引用 3 楼 user-2 的回复:\1用来做什么的 就是想写一个32位到64位移植用的脚本 把一些数据类型做个替换

\1用来做什么的


Question: 一道题两种解法时间复杂度的比较

引用 2 楼 user-5 的回复:网上做法可以进一步优化， 比如，x和y的绝对值无论如何都不可能大于积 m的绝对值的。5 4 这个输入只要查 -4 到 4就行了，不用 -9999到9999  恩，还可以进一步优化，5 4这个输入，只需要查-2到2就行了 因为x*y=m, 那么x,y两个中间必有一个的绝对值小于等于sqrt(abs(m));， 当m普遍比较大时，也能省不少计算

int n = 0,m = 0;     int x = 0,y = 0;     int k = 0;     int k2= 0;  //x+y =n //x-y =k  //x= (n+k)/2     for(cin>>n>>m; n!=0 && m!=0 ;cin>>n>>m)     {         k2 =n*n -4*m;         //cout <<"n="<<n<<",m=" <<m<<",k2="<<k2<<"k="<<k<<endl;          if(k2<0){             cout<< "No "<<endl;         }         else {             k =sqrt(k2);// 用移位算法，大约16 次移位            // cout <<"n="<<n<<",m=" <<m<<",k2="<<k2<<"k="<<k<<endl;              if(k*k !=k2)             {                 cout <<"No"<<endl;             }             else {                     x = n + k;                     y = n - k;                     if((x&1 )==1 )cout<<"No"<<endl;                     else cout<<"Yes"<<endl;//<<" x="<<x/2 <<",y = "<<y/2<<endl;             }         }     }  这个算法理论上，应该是  O(1)的

x -y = sqrt( (x+y)*(x+y) -4* x*y)  x = (（x+y） +(x-y))/2 y = (x+y -(x-y))/2;         这一步，用奇偶性判断 x,y 是否整数   1) (x+y)*(x+y) -4* x*y >0  2)  (x+y)*(x+y) -4* x*y  是个 完全平方数 这一步，可以采用移位开平方方法计算，有余数为假  也可以简单点，用浮点数开方 如果 (x-y) *(x-y ) =   (x+y)*(x+y) -4* x*y   是个 完全平方数

这个解一元二次方程，看有没有整数解即可

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

judge是什么? judge的额外算法维度决定了你的算法相对于第二种算法的额外维度

网上的做法比lz少了很多if else判断，大量计算，还有judge的调用。就算都是O（n），对方每一次的时间花销都比你的代码小多了。  而且，网上直接用公式做，简单明了。 x+y = n =》 y = n - x 然后x×y = m =》 x × （n - x） = m 就是 if(i*(n-i) == m)   这个判断  lz的没仔细看，不知道是怎么算的。


Question: 一个很奇怪程序溢出的问题

引用 5 楼 Evankaka 的回复:你的快排我感觉有问题 这里两句：  sort(input, min, i);         sort(input, j + 1, max);  不是一般都写成：  sort(input, min, i-1);         sort(input, i+ 1, max);?? 对对对，我就是这里出了问题，现在改回来了，谢谢

噢噢噢噢，谢谢上面的几位，根据你们的方法  我知道为什么那里是空行的了因为是递归调用，但是第一次的key的strcmp是最大的话，j+1就会溢出，直接跳过所有的语句，所以我看不到错误在哪  谢谢各位，我学习到了新的知识

栈堆告诉我说出错的是哪里，在getsreport里面大概是说可以用cookie储存什么额外指针  然后我转到我的代码行，可是是空的，我不知道是什么错误

断点到这里后，查看堆栈，知道看到自己的代码行，就可以看到是什么溢出了。

好，我看看，所有的崩溃都可以这么看吗

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


Question: cmd重定向标准输入，出错

使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。  下表将列出可用的句柄。  句柄      句柄的数字代号 描述 STDIN     0              键盘输入 STDOUT    1              输出到命令提示符窗口 STDERR    2              错误输出到命令提示符窗口 UNDEFINED 3-9            这些句柄由应用程序单独定义，并且是各个工具特定的。  数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄，可在重定向操作符前面键入该句柄的 数字。如果未定义句柄，则默认的 < 重定向输入操作符是 0，而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后，必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。  要指定重定向到现有句柄，请使用与 (&) 字符，后面接要重定向的句柄号 （例如 &句柄#）。例如，下面的命令可以将句柄 2（即 STDERR）重定向到 句柄 1（即 STDOUT）：  2>&1  下表列出了可用于将输入和输出数据流进行重定向的操作符。  重定向操作符 描述 > 将命令输出写入到文件或设备（例如打印机）中，而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。  默认情况下，可以从键盘将命令输入（即 STDIN 句柄）发送到 Cmd.exe，然后由 Cmd.exe 将命令输出（即 STDOUT 句柄）发送到命令提示符窗口。  重定向输入 (<) 要将键盘输入重定向到文件或设备，请使用 < 操作符。例如，要从 File.txt 获取 sort 命令的输入，请键入：  sort<file.txt  File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。  < 操作符可以打开具有只读访问的指定文件名。所以，不能使用该操作符向文件中写入 信息。例如，如果以 <&2 启动程序，则所有试图读取句柄 0 的操作都将失败，因为句 柄 2 最初是以只写访问打开的。   注意  0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。  要将输出从命令提示符窗口重定向到文件或设备，请使用 > 操作符。可以在许多命令中 使用该操作符。例如，要将 dir 输出重定向到 Dirlist.txt，请键入：  dir>dirlist.txt  如果 Dirlist.txt 不存在，Cmd.exe 将创建该文件。如果 Dirlist.txt 存在，Cmd.exe 将使用 dir 命令的输出替换文件中的信息。  要运行 netsh routing dump 命令，然后将输出发送到 Route.cfg，请键入：  netsh routing dump>c:\route.cfg  > 操作符可以打开具有只写访问属性的指定文件。所以，不能使用该操作符读取文件。 例如，如果使用重定向 >&0 启动程序，则所有试图写入句柄 1 的操作都将失败，因为 句柄 0 最初是以只读访问打开的。   注意  1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如， 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt，请键入：  dir>c:\file.txt 2>&1  复制句柄时，可以复制该句柄原状态的所有特性。例如，如果一个句柄具有只写访问的 属性，则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。  使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用，指定的文件必须已经存在。 如果输入文件存在，Cmd.exe 将以只读方式打开该文件，然后将文件中包含的字符作为 输入发送到此命令（如同从键盘输入一样）。如果指定了句柄，Cmd.exe 将指定的句柄 复制到系统现有的句柄中。  例如，要以句柄 0 输入读取（即 STDIN）的方式打开 File.txt，请键入：  <file.txt  要打开 File.txt，并在内容排序后将输出发送到命令提示符窗口（即 STDOUT），请键入：  sort<file.txt  要查找 File.txt，然后将句柄 1（即 STDOUT）和句柄 2（即 STDERR）重定向到 Search.txt，请键入：  findfile file.txt>search.txt 2<&1  要以句柄 0 输入读取（即 STDIN）的方式复制用户定义句柄 3，请键入：  <&3  使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名，Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄，Cmd.exe 将文件复制到现有句柄中。  要将用户定义句柄 3 复制到句柄 1，请键入：  >&3  要将包括句柄 2（即 STDERR）的所有输出从 ipconfig 命令重定向到 句柄 1（即 STDOUT），然后将输出重定向到 Output.log，请键入：  ipconfig.exe>>output.log 2>&1  使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息，请使用两个连续 的大于号（即 >>）。例如，下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件：  dir>>dirlist.txt  要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾，请键入：  netstat>>tcpinfo.txt  使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出（默认情况下是 STDOUT），然后将其导入另 一个命令的输入中（默认情况下是 STDIN）。例如，下面的命令将对目录分类：  dir | sort  在本例中，将同时启动两个命令，但随后 sort 命令会暂停，直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入，然后将输出发送到 句柄 1（即 STDOUT）。  合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如，可以使用以 下命令存储包含“LOG”字符串的文件名:  dir /b | find "LOG" > loglist.txt  dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表（例如，NetshConfig.log、Logdat.svd 和 Mylog.bat）存储在文件 Loglist.txt 中。  要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名，并且在命令提示符窗口中 每次显示一屏：  dir c:\ /s /b | find "LOG" | more  利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名（在命令提示符窗口中每次显示一屏）。有关筛选器命令的详细信息，请参阅 使用筛选器。

加上空格试试： 7  <gpsdata.csv

换个文件名看看，或者用7.exe。别用 7< 这种形式。可能解析错了。

我试了下，没障碍。。。你啥情况。。。


Question: 运算符重载，提示未声明。

// CCTest.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h"   #include <intrin.h> #include <iostream> class CMyString { public: 	CMyString(char* pData=nullptr); 	CMyString(const CMyString& str); 	~CMyString(void);  	void print(CMyString& str1) 	{ 		std::cout<<str1.m_pData<<std::endl; 	} protected: private: 	char* m_pData;  public: 	CMyString& operator=(const CMyString& str); };  CMyString::CMyString(char* pData){ 	this->m_pData = new char[200]; 	if(pData != NULL){ 		memcpy(this->m_pData,pData,strlen(pData)); 	} } CMyString::~CMyString(){ 	delete m_pData; } CMyString& CMyString::operator=(const CMyString& str) { 	this->m_pData = new char[200]; 	this->m_pData = str.m_pData; 	return *this; }  void main() { 	CMyString m_str="ceshi"; 	CMyString strTmp2; 	CMyString strTmp3; 	strTmp2=m_str; 	strTmp3.print(strTmp2); 	getchar(); } 你这个用到的m_pData未申请任何存储空间，指向有问题。所以给你稍加改动了一些

CMyString(char* pData=nullptr);也一样没实现 这两个函数都是需要的

CMyString(const CMyString& str); 没实现啊 这个 operator = 是否有问题 关键就和这个拷贝构造函数有关

看错了，无视吧

引用 1 楼 pengzhixi 的回复:看你operator=的实现吧，问题就在实现里面 还是不明白啊，能说具体点吗。这段代码是书上的，只不过书上就写了一下函数的实现和构造函数。我想写个main函数调用一下试试的。

看你operator=的实现吧，问题就在实现里面

引用 3 楼 user-4 的回复:if ((void const *)this!=(void const *)&str) 不对啊。


Question: 在多核时代还有办法测试程序运行的cpu周期数吗，rdtsc还能用吗

操作系统统计里面本来就用cpu统计了，再精确的估计是没有了。

可以指定线程在哪个CPU核心上运行,依然无法得出正确结论 不过第一要保证, 全部代码在物理内存运行, 二要保证不存在缓存不命中的情况 三要保证不存在线程切换 这样看来根本就没有好办法  假设能保证以上没问题, 最好的方法是自己做个实时,单用户,单任务操作系统 直接跑你的代码 rdtsc指令本身是没有问题的, 有问题的是 你的待测程序的指令序列 能否保证不中断的, 连续的运行在一个CPU核心上 以及能否全速运行(不存在高速缓存不命中问题), 另外,绝对不能有换页操作

由于存在流水线技术，反汇编和实际运行周期数不一致的

感觉反汇编出来比较靠谱 直接看汇编代码的时钟周期数

可以申请独占cpu嘛，能不能实现你想要的效果就不知道了

你把测试时间的线程设置下线程亲和性, 让这个线程只跑在一个 CPU 上就是了.   pthread_setaffinity_np/SetThreadAffinityMask 啥的...  最简单的还是把你的测试跑个 几千次, 直接用 clock/GetTickCount 的精度就够了...

引用 1 楼 zhao4zhong1 的回复:无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！ 信中哥，得永生。

我用测试一个流密码的速度，要求必须是cycle/bite，所以必须要测试时钟周期数，并且我看其他人的数据也是在多核的情况下测试的cpu时钟周期，有啥方法吗


Question: 《嗨翻C语言》里关于地图上画坐标的问题

调试下你的程序。  另外， 如果你是C语言初学者，还是别看这本书了。老老实实看那几本经典教程吧。

地图打开后应该定位到 麻省理工 那边。和图里的一样，就是没有那一串坐标。这应该不是你的C程序问题了

用你的数据试了下，至少js代码是能运行的。定位到的位置看上去也和图里的地图差不多。  说不定google地图接口变了，或者那个网页的js代码本来就有问题。

引用 2 楼 aceydbm 的回复:这本书早就买了一直没看，经典的教程都已经看过三遍了，所以现在才来看这本书。 怎么调试？可以具体一点吗？ output.json 这个是C程序输出的文本吧。  如果这个文本（编码和内容）的格式不对，那么调试c程序。  如果这个文本格式是对的，那么你可以去看看他的html，js的代码是不是有问题。书的例子里如果有自带的数据文件，直接用书里的试试看。


Question: 关于malloc麻烦大家看下我这段代码放了什么低级错误,谢谢！

引用 1 楼 kino_chen 的回复:1.number的定义呢？ 2.p先指向malloc的空间，后来指向a，内存泄露了。 3.*(p+1)这个时候，指向的是&a之后的内存了，怎么能随便写 4.free(p)，这时候就是free(&a)了，怎么可能不错 5.好好看看基础书籍谢谢，明白了。。看来基础是不好


Question: findfirst findnext函数

system函数好像也不安全吧

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。   Linux下使用ls命令。

_findfirst, _findfirsti64, _wfindfirst, _wfindfirsti64 Provides information about the first instance of a filename that matches the file specified in the filespec argument.  long _findfirst( char *filespec, struct _finddata_t *fileinfo );  __int64 _findfirsti64( char *filespec, struct _finddata_t *fileinfo );  long _wfindfirst( wchar_t *filespec, struct _wfinddata_t *fileinfo );  __int64 _wfindfirsti64( wchar_t *filespec, struct _wfinddata_t *fileinfo );  Function Required Header Compatibility  _findfirst <io.h> Win 95, Win NT  _findfirsti64 <io.h> Win 95, Win NT  _wfindfirst <io.h> or <wchar.h> Win NT  _wfindfirsti64 <io.h> or <wchar.h> Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  If successful, _findfirst and _wfindfirst return a unique search handle identifying the file or group of files matching the filespec specification, which can be used in a subsequent call to _findnext or _wfindnext, respectively, or to _findclose. Otherwise, _findfirst and _wfindfirst return –1 and set errno to one of the following values:  ENOENT  File specification that could not be matched  EINVAL  Invalid filename specification  Parameters  filespec  Target file specification (may include wildcards)  fileinfo  File information buffer  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tfindfirst _findfirst _findfirst _wfindfirst  _tfindfirsti64 _findfirsti64 _findfirsti64 _wfindfirsti64    System Calls Routines |  _find, _wfind Function Overview _findnext, _findnexti64, _wfindnext, _wfindnexti64 Find the next name, if any, that matches the filespec argument in a previous call to _findfirst, and then alters the fileinfo structure contents accordingly.  int _findnext( long handle, struct _finddata_t *fileinfo );  __int64 _findnexti64( long handle, struct _finddata_t *fileinfo );  int _wfindnext( long handle, struct _wfinddata_t *fileinfo );  __int64 _wfindnexti64( long handle, struct _wfinddata_t *fileinfo );  Function Required Header Compatibility  _findnext <io.h> Win 95, Win NT  _findnexti64 <io.h> Win 95, Win NT  _wfindnext <io.h> or <wchar.h> Win NT  _wfindnexti64 <io.h> or <wchar.h> Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  If successful, _findnext and _wfindnext return 0. Otherwise, they return –1 and set errno to ENOENT, indicating that no more matching files could be found.  Parameters  handle  Search handle returned by a previous call to _findfirst  fileinfo  File information buffer  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tfindnext _findnext _findnext _wfindnext  _tfindnexti64 _findnexti64 _findnexti64 _wfindnexti64    System Calls Routines |  _find, _wfind Function Overview

dir.h没有这个文件吧。


Question: 在线等   大神们给看看，本人是菜鸟。需要用c语言解答

真不好意思！没看明白！

所谓按升序排列返回 是输出么   还是存储

同上  我也感觉是这样 问题描述不清，如果是这样 不是很简单么

没看懂问题。是指 1 5 3 7 5 6中找出 5 3 7，然后按3 5 7输出？

你的意思是一串整型数据 int  a,b,c,d,看其中是否存在某个数？


Question: sscanf语句读取字符串信息

多谢指导，OK了

请判断sscanf函数的返回值。 请限制sscanf函数中字符串的最大长度。  ret=sscanf(data_buff,"%*[^\"]\"%9[^\"]\",\"%10[0-9]\",\"\",\"%23[^\"]\"%511s\r\n",Msg_REC,Msg_tele_no,Msg_time,Msg_content);           printf("ret from CMGR: %d\n",ret);//打印出匹配的参数个数 if (ret==4) {     printf("Msg_REC from CMGR: %s\n",Msg_REC);     printf("Msg_tele_no from CMGR: %s\n",Msg_tele_no);     printf("Msg_time from CMGR: %s\n",Msg_time);     printf("Msg_content from CMGR: %s\n",Msg_content); } else {  printf("Format error:%s",data_buff); }

ret from CMGR: 4 Msg_REC from CMGR: REC UNREAD Msg_tele_no from CMGR: 1008611 Msg_time from CMGR: 14/12/22,17:29:02+32 Msg_content from CMGR: 60A8672C6708901A4FE18D3900320034002E003700345143FF0C4F599 89D00310031002E003800385143FF0C52694F59901A8BDD5206949FFF1A54085BB66B224F5900310 039003500355206949FFF0C00567F5153056708595799104F5900310030003000305206949F30025 2694F594E0A7F516D4191CF002F65F6957FFF1A770151850033

Msg_Time[20]太短了，20个字符不够，我改成24了   #include <stdio.h> char data_buff[] = "AT+CMGR=23\r\n+CMGR: \"REC UNREAD\",\"1008611\",\"\",\"14/12/22,17:29:02+32\"\r\n60A8672C6708901A4FE18D3900320034002E003700345143FF0C4F59989D00310031002E003800385143FF0C52694F59901A8BDD5206949FFF1A54085BB66B224F5900310039003500355206949FFF0C00567F5153056708595799104F5900310030003000305206949F300252694F594E0A7F516D4191CF002F65F6957FFF1A770151850033\r\n";  char Msg_REC[10] = {0};//短信标识，是否已经读取过此短信  此字符串应为“REC UNREAD” char Msg_tele_no[11] = {0};//短信号码  此字符串应为"1008611" char Msg_time[24] = {0};//短信接收时间  此字符串应为"14/12/22,17:29:02+32" char Msg_content[512] = {0};//短信内容，unicode编码形式 此字符串应为60A8672......  int main(void)  {  	int    ret; 	 	//ret = sscanf(data_buff,"%*[^\"]%s\",\"%s\",\"\",\"%s\"%s",Msg_REC,Msg_tele_no,Msg_time,Msg_content); 	ret = sscanf(data_buff,"%*[^\"]\"%[^\"]\",\"%[0-9]\",\"\",\"%[^\"]\"%s\r\n",Msg_REC,Msg_tele_no,Msg_time,Msg_content); 	 	printf("ret from CMGR: %d\n",ret);//打印出匹配的参数个数 	printf("Msg_REC from CMGR: %s\n",Msg_REC); 	printf("Msg_tele_no from CMGR: %s\n",Msg_tele_no); 	printf("Msg_time from CMGR: %s\n",Msg_time); 	printf("Msg_content from CMGR: %s\n",Msg_content); 	 	return(0);  }


Question: fseek文件定位问题?

引用 3 楼 zhao4zhong1 的回复:楼主听谁说的123可以插入到456前面的？  所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。+1,楼主没看书。。。

数据写入文件后，要想往前面插数据，可以先获得文件大小x，然后加上你要新插入的数据大小y, 然后malloc(x+y)的buffer，把新数据写进buffer，然后把文件中的数据全部读出来，跟着新数据也写进buffer，只不过在新数据后面，然后把文件指针移动到文件开始处，把整个buffer写进去。就可以实现你这个功能需求了。  你确定非要这么干吗？？再也想不出比这更烂的日志写法了

如何实现先写456，后写123。最后文件内容为123456 应用举例：log文本，写入日期时间和发生的事件。最近的时间在文本最上面。 例如：2014-12-28 14:00:00 step 4 run             2014-12-28 13:00:00 step 3 run             2014-12-28 12:00:00 step 2 run             2014-12-28 11:00:00 step 1 run

引用 3 楼 zhao4zhong1 的回复:楼主听谁说的123可以插入到456前面的？  所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。 赵老师正解

你都重新定位到文件开头了，自然就覆盖了

引用 3 楼 zhao4zhong1 的回复:楼主听谁说的123可以插入到456前面的？  所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。 纯粹误人子弟啊！


Question: [硬盘容量]看题,快来节分

引用 5 楼 hnwyllmm 的回复:楼主这个是大学计算机组成原理课本里面的习题？ 是啊,<计算机组成原理(白中英-第五版)>

引用 1 楼 adusuccessfully 的回复:占个沙发吧，但是我对着个题不是很懂~~~  问LZ：每道的记录的位数相同，按照最内道来计算和最外道来计算还有什么区别呢？？ 谢谢你 热心回复,我已近找到问题所在了,我回给你20分

引用 1 楼 adusuccessfully 的回复:占个沙发吧，但是我对着个题不是很懂~~~  问LZ：每道的记录的位数相同，按照最内道来计算和最外道来计算还有什么区别呢？？ 按最内道算:m = (9-5) * 3.14 * 2  * 100 * 5 / 1000000; 按最外道 算m = 9 * 3.14 * 2 * 5 * 100  引用 2 楼 coding_hello 的回复:位密度不同，不存在按最外道还是最内道计算的问题，因为最外道和最内道的信息位数一样。  几个公式： (1)总磁道数=记录面数×磁道密度×(外直径-内直径)÷2 (2)非格式化容量=位密度×3.14×最内圈直径×总磁道数 (3)格式化容量=每道扇区数×扇区容量×总磁道数 (4)平均数据传输速率=最内圈直径×3.14×位密度×盘片转速   注意盘面直径18英寸，可记录部分5英寸，也就是最内道直径18-5=13英寸 单磁道信息位数=2*π*r*位密度=13*3.14*1000=40820bits 20个盘面，盘面可用5英寸，道密度100磁道/英寸 总容量也就是20/2*5*100*40820=204100000bits，也就是25512500字节(按1个字节8bit算) 盘片传输速度要达到1MB/s，那就是1024*1024*8=13*3.14*1000*转速， 转速=205.5转,也就是转速大于206转即可满足 内直径应该是18 - 5 * 2 = 8 内半径应该是 8 / 2 = 4

楼主这个是大学计算机组成原理课本里面的习题？

这是数学应用题么？

看了题目，有分么?


Question: 如何用c语言在centos下获取一些硬件信息

引用 9 楼 coding_hello 的回复:获取系统信息一般都是使用系统提供的API接口。如果非要纠结标准C函数的话，就只能是读文件了。  8楼的应该解决你问题了，不够的自己再百度吧。。。  这么说来还是用管道调用命令比较方便

centos 里应该也有 dmidecode 吧  终极方法就是自己mmap物理内存，然后根据SMBIOS去找你要的东西。

引用 12 楼 wangyaninglm 的回复:[quote=引用 9 楼 coding_hello 的回复:] 获取系统信息一般都是使用系统提供的API接口。如果非要纠结标准C函数的话，就只能是读文件了。  8楼的应该解决你问题了，不够的自己再百度吧。。。  这么说来还是用管道调用命令比较方便[/quote] 恩，如果程序开销不大，功能简单的话管道足以满足。我看sigar 以及 lmon的源码，系统配置大概都是配置文件或者管道，如果有api，我相信也是通过这种方式进行封装的

1. 内核版本：popen("uname -sr", "r"); 2.内存容量：/proc/meminfo ‘MemTotal:’字段 3.操作系统版本：/etc/issue 或者 /etc/*ease 4.当前用户名：a.getuid()获取当前用户的uid;b.getpwuid(uid)或者用户名 5.cpu名称:/proc/cpuinfo ’model name‘字段 6.cpu内核数：/proc/cpuinfo 'processor'字段最大值+1(逻辑核数)， 'physical id'字段最大值 + 1 大概这么读吧，上面对应的c操作主要是读文件

man 2 uname man  getlogin 其他不知道了，这些函数肯定都是系统调用了，你找找看有没满足的

引用 4 楼 kino_chen 的回复:咳咳，popen("uname -a","r")，能达到要求么  矮油我去。。。这种办法在linux内核下面通用，能写到字符数组里面，也算是个办法  c语言的函数呢？

引用 2 楼 zhao4zhong1 的回复:不了解。 我去，赵老师不给力。。。

咳咳，popen("uname -a","r")，能达到要求么

不了解。

类似苹果达尔文内核下面的这些函数：     //kern_return_t kr;     //host_name_port_t myhost;    // kernel_version_t kversion;    // host_basic_info_data_t hinfo;    // mach_msg_type_number_t count;     char            *cpu_type_name,*cpu_subtype_name;    // vm_size_t  page_size;     // myhost = mach_host_self();    // kr = host_kernel_version(myhost, kversion);    // count = HOST_BASIC_INFO_COUNT;    // kr = host_info(myhost, HOST_BASIC_INFO, (host_info_t)&hinfo, &count);    // kr = host_page_size(myhost, &page_size);                                               //


Question: writestring("\");问题？？？

是的 3Q

将每个\替换为\\  C++ Character Constants Character constants are one or more members of the “source character set,” the character set in which a program is written, surrounded by single quotation marks ('). They are used to represent characters in the “execution character set,” the character set on the machine where the program executes.  Microsoft Specific   For Microsoft C++, the source and execution character sets are both ASCII.  END Microsoft Specific  There are three kinds of character constants:   Normal character constants   Multicharacter constants   Wide-character constants  Note   Use wide-character constants in place of multicharacter constants to ensure portability.  Character constants are specified as one or more characters enclosed in single quotation marks. For example:  char ch = 'x';          // Specify normal character constant. int mbch = 'ab';        // Specify system-dependent                         //  multicharacter constant. wchar_t wcch = L'ab';   // Specify wide-character constant.  Note that mbch is of type int. If it were declared as type char, the second byte would not be retained. A multicharacter constant has four meaningful characters; specifying more than four generates an error message.  Syntax  character-constant :  'c-char-sequence' L'c-char-sequence'  c-char-sequence :  c-char c-char-sequence c-char  c-char :  any member of the source character set except the single quotation mark ('), backslash (\), or newline character escape-sequence  escape-sequence :  simple-escape-sequence octal-escape-sequence hexadecimal-escape-sequence  simple-escape-sequence : one of  \' \" \? \\ \a \b \f \n \r \t \v  octal-escape-sequence :  \octal-digit \octal-digit octal-digit \octal-digit octal-digit octal-digit  hexadecimal-escape-sequence :  \xhexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit  Microsoft C++ supports normal, multicharacter, and wide-character constants. Use wide-character constants to specify members of the extended execution character set (for example, to support an international application). Normal character constants have type char, multicharacter constants have type int, and wide-character constants have type wchar_t. (The type wchar_t is defined in the standard include files STDDEF.H, STDLIB.H, and STRING.H. The wide-character functions, however, are prototyped only in STDLIB.H.)  The only difference in specification between normal and wide-character constants is that wide-character constants are preceded by the letter L. For example:  char schar = 'x';               // Normal character constant wchar_t wchar = L'\x81\x19';    // Wide-character constant  Table 1.2 shows reserved or nongraphic characters that are system dependent or not allowed within character constants. These characters should be represented with escape sequences.  Table 1.2   C++ Reserved or Nongraphic Characters  Character ASCII  Representation ASCII  Value Escape Sequence  Newline NL (LF) 10 or 0x0a \n  Horizontal tab HT 9 \t  Vertical tab VT 11 or 0x0b \v  Backspace BS 8 \b  Carriage return CR 13 or 0x0d \r  Formfeed FF 12 or 0x0c \f  Alert BEL 7 \a  Backslash \ 92 or 0x5c \\  Question mark ? 63 or 0x3f \?  Single quotation mark ' 39 or 0x27 \'  Double quotation mark " 34 or 0x22 \"  Octal number ooo — \ooo  Hexadecimal number hhh — \xhhh  Null character NUL 0 \0    If the character following the backslash does not specify a legal escape sequence, the result is implementation defined. In Microsoft C++, the character following the backslash is taken literally, as though the escape were not present, and a level 1 warning (“unrecognized character escape sequence”) is issued.  Octal escape sequences, specified in the form \ooo, consist of a backslash and one, two, or three octal characters. Hexadecimal escape sequences, specified in the form \xhhh, consist of the characters \x followed by a sequence of hexadecimal digits. Unlike octal escape constants, there is no limit on the number of hexadecimal digits in an escape sequence.  Octal escape sequences are terminated by the first character that is not an octal digit, or when three characters are seen. For example:  wchar_t och = L'\076a';  // Sequence terminates at a char    ch = '\233';     // Sequence terminates after 3 characters  Similarly, hexadecimal escape sequences terminate at the first character that is not a hexadecimal digit. Because hexadecimal digits include the letters a through f (and A through F), make sure the escape sequence terminates at the intended digit.  Because the single quotation mark (') encloses character constants, use the escape sequence \' to represent enclosed single quotation marks. The double quotation mark (") can be represented without an escape sequence. The backslash character (\) is a line-continuation character when placed at the end of a line. If you want a backslash character to appear within a character constant, you must type two backslashes in a row (\\). (SeePhases of Translation in the Preprocessor Reference for more information about line continuation.)


Question: HDOJ2011水题不知道错在哪里

恩，楼上正解，注意类型，int / int 结果还是int，至少有一个操作数要转换成double，比如1改成1.0

程序中1/i，由于i是整形，当i大于1时。所有的1/i结果都是0，也就得不到你想要的结果。

#include <stdio.h> int main() {     double sum_odd,sum_even,sum;     int i,m,n;     scanf("%d",&m);     while(m--)     {         sum_odd=0;         sum_even=0;         sum=0;         scanf("%d",&n);         if(n==1)printf("1.00\n");//Èç¹ûÊäÈëµÄnÎª1         else if(n%2!=0)//Èç¹ûn²»Îª1ÇÒnÎªÆæÊý         {             for(i=1;i<=n;i=i+2)             {                 sum_odd+=1.0/i;//这里用1.0/i，浮点数除法             }             for(i=2;i<=n-1;i=i+2)             {                 sum_even+=1.0/i;             }             sum=sum_odd-sum_even;             printf("%.2lf\n",sum);//ÓÃÆæÊýºÍ¼õÈ¥Å¼ÊýºÍ         }         else //Èç¹ûn²»Îª1ÇÒnÎªÅ¼Êý         {             for(i=1;i<=n-1;i=i+2)             {                 sum_odd+=1.0/i;             }             for(i=2;i<=n;i=i+2)             {                 sum_even+=1.0/i;             }             sum=sum_odd-sum_even;             printf("%.2lf\n",sum);//ÓÃÆæÊýºÍ¼õÈ¥Å¼ÊýºÍ         }     } }


Question: 用fgets（）函数的时候，输入字符太多就会自动关闭程序？

在每个最后不带\n的printf后面加fflush(stdout);

不是同步 而是说getchar也从stdin里面提取字符

测试了可以输入任意多个字符 VS2008

引用 1 楼 pengzhixi 的回复:因为你的getchar也会得到字符所以程序运行到结束 多谢！搞定了，那么也就是说fgets()和getchar一起用的时候他们是同步工作的？

因为你的getchar也会得到字符所以程序运行到结束


Question: 如何求数组中第K大的数？

这个是经典算法啊，看看堆排序，只不过是仅考虑前k个元素

问题的描述有问题  3 3 1 2 中第二大的应该是2 还是3呢?

時間複雜度我不會計算

《编程珠玑》

先排序，但是会遇到相同大小的数据，如果只涉及的求K大数，可以把相同的输保留一个，其他的做标记。

定义K个变量，分别保存前K个数，并排序，依次向后取数，并和前K个变量中做比较！

对排序可以解决

这就是算法中的选择问题， 可以采用类似快速排序的方法， 实现平均复杂度是 O(N)的算法。  其实就是快速排序，一次划分后，只处理一个递归分支的情况  如果要求，前K个数是排好序的， 可以对K个数再排一次序， 或者直接用排序算法，排序整个数组

http://blog.csdn.net/v_JULY_v/article/details/6370650 http://en.wikipedia.org/wiki/Selection_algorithm

LZ，解决这个问题的办法一般有两个： 1）先排序再查找：排序算法在O（n）的有三个：计数排序、桶排序、基数排序。其他就好办了。 2）经典的思想是：活用数据结构：建一个最小堆，建好之后选第k大的。

比较赞同5楼的思路。使用快排思想，如果数据存储在外存，则需要额外的O(n)的内存空间。而使用最小堆无论数据在内存还是外在都是需要的额外内存空间都是：O(k)。我写的一篇文章和楼主的要求差不多。http://blog.csdn.net/mxway/article/details/21776727

引用 8 楼 U_Fan 的回复:[quote=引用 4 楼 mstlq 的回复:] http://blog.csdn.net/guofengzai/article/details/2574225 不好意思， 我没有说清楚。需要用C语言实现， 如果你能讲解下nth_element源码算法就最好了。[/quote] 原理就是9楼说的^_^

想一想快速排序的原理，再想一想每一轮过滤基准最后都放在哪儿了，然后你的问题就解决了。

引用 4 楼 mstlq 的回复:http://blog.csdn.net/guofengzai/article/details/2574225 不好意思， 我没有说清楚。需要用C语言实现， 如果你能讲解下nth_element源码算法就最好了。

用最小堆来做是比较好的方案。

2楼的方法肯定不是最好的。 解法：维护一个k大小的最小堆，对于数组中的每一个元素判断与堆顶的大小，若堆顶较大，则不管，否则，弹出堆顶，将当前值插入到堆中。时间复杂度O(n * logk)  解法：利用hash保存数组中元素Si出现的次数，利用计数排序的思想，线性从大到小扫描过程中，前面有k-1个数则为第k大数，平均情况下时间复杂度O(n)

引用 1 楼 m13890 的回复:先排序，再直接找。。  这个应该不会超过O(n)吧 如果是先排序， 那就要求排序的时间复杂度不超过O(n)，据我了解的排序算法好像都要比n大吧。


Question: C编译报错：error: cast from pointer to integer of different size [-Werror=point

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 在宏MAKE_KEY_INFO中，企图将指针类型转换为无符号32位整型数，但这在64位环境下会发生兼容性问题。


Question: 新手求助   我装的mysql64位得 用的vc  mysql的odbc驱动也是64位的

在64位Windows下： 64位exe和dll在目录c:\windows\system32目录下； 32位exe和dll在目录c:\windows\syswow64目录下； 所以要注意： 在win64位系统下：   配置64位程序用的     DSN使用c:\windows\system32\odbcad32.exe     数据库别名使用c:\windows\system32\cliconfg.exe   配置32位程序用的     DSN使用c:\windows\syswow64\odbcad32.exe     数据库别名使用c:\windows\syswow64\cliconfg.exe


Question: 大家怎么使用VS编译器

一般将报错信息百度都会有解决方法

这有啥难的。多摸索几天就是了。有问题马 上百度啊！

我就用的是vs2013    楼主应该报的宽窄字符问题

VS12 和VC6的差别很大的说！  建议新建空项目然后把文件加进去！基本就OK了

网上找教程 百度文库就有

vs应该是比较好用的吧，提示什么的都很好用。

我的经验是：把解决不了的报错信息直接google，一般会有相关的资料~~

看看MSDN？

总有个适应期的，出现错误就一个一个改呗

这些简单，问题是，经常缺少各种文件 预定义什么的

摸索几天就习惯了。你只是不愿意改变以前所习惯的IDE而已

文件、打开、项目/解决方案、选.sln文件、打开。 或者 文件、新建、项目、……


Question: 求教一个C 语言的问题！！！

#include <stdio.h> #include <windows.h>  void main() { 	char name[20]; 	scanf("%s",name); 	const char * hz = ".txt"; 	strcat(name,hz); 	 	ShellExecute(NULL,"open",name,NULL,0,SW_SHOWNORMAL); } 不知道是不是这个意思

++ 不过楼主的意思好像是直接命令行传参，所以应该是： if(argc != 2)   return -1; 然后把argv[1]当成文件名即可  引用 1 楼 coding_hello 的回复:没编译，大概这样，新手不容易啊，多看看书，函数参考  #include <stdio.h>  int main(int argc, char *argv[]) { 	char file_name[1024] = {0};         char file_content[4096] = {0}; 	while(1) 	{ 		printf("input : "); 		scanf("%s", file_name); 		strcat(file_name, ".txt"); 		FILE* fp = fopen(file_name, "r");                 if (fp == NULL)                 {                         printf("file %s open failed\r\n", file_name);                         continue;                 } 	 		/* 该干嘛干嘛 */ 		fread(file_content, 1, 4095, fp);                 file_content[4095] = 0;                 printf("%s\r\n", file_content); 		 		fclose(fp); 	} 	 	return 0; }

楼上的答案很好，再加上一句#include <string>就更完美了~~


Question: 感觉不知道应该学什么了

下载研究eMule源代码。

引用 18 楼 zhao4zhong1 的回复:[quote=引用 14 楼 USE_R_NAME 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 zhao4zhong1 的回复:] 为什么不直接上Windows版的扫雷呢？ 《Visual C++ 游戏开发经典案例详解》[/quote]我还没学过C++，现在只是会了点C！可以看么？[/quote] 对于学习这件事，有时候需要有“霸王硬上弓”的精神。[/quote]  PS: 现在大三了

引用 18 楼 zhao4zhong1 的回复:[quote=引用 14 楼 USE_R_NAME 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 zhao4zhong1 的回复:] 为什么不直接上Windows版的扫雷呢？ 《Visual C++ 游戏开发经典案例详解》[/quote]我还没学过C++，现在只是会了点C！可以看么？[/quote] 对于学习这件事，有时候需要有“霸王硬上弓”的精神。[/quote]      赵老师，同问，已经看过《C++ primer》《C++ template》《C++ 编程思想》《windows 编程思想》《Effective C++》《算法程序与设计》《精通正则表达式》《设计模式》。。。（能练运用数据结构和很多的算法，正则表达式和设计模式只是理解）写的代码也不少了，不知道接下来该做什么。     手头有《C++数值算法》《Visual C++技术内幕》《OpenGL游戏编程》《学习openCV》《LINUX内核设计与实现》和一些boost、qt、java、ios的资料      我对这些都很感兴趣，但是没那么多时间去一一研究，已学的东西又不能直接运用在开发里，我是不是该专门学一种开发比如android开发、ios开发（做一些小东西） 还是去学 boost库 Qt之类的框架（为以后打基础）亦或是 学习自己感兴趣的（算法）      学这些东西都非常的耗时，希望赵老师指点

在OJ上刷个500题以上，你就知道学什么了。

有问题是好事，顺着问题寻找解决办法！

数据结构也学过了吗

引用 14 楼 USE_R_NAME 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 zhao4zhong1 的回复:] 为什么不直接上Windows版的扫雷呢？ 《Visual C++ 游戏开发经典案例详解》[/quote]我还没学过C++，现在只是会了点C！可以看么？[/quote] 对于学习这件事，有时候需要有“霸王硬上弓”的精神。

是哪里不行？卡在什么地方做不出来？要知道问题在哪里，才有办法提高啊。

孔子有云：  学而不思则罔，思而不学则殆。  对于程序来说，什么是学？什么是思？  我觉得你不应该再学什么，而是应该想想要做点什么。

我觉得你先的搞定界面,然后在构思代码,C语言的话建议使用GTK3来做界面！  GTK3可以找杨中科的 《C语言也可以干大事》

推荐看《c语言也能干大事》

引用 5 楼 call_from_dream 的回复:耐心一点，多找点资料，慢慢来。扫雷、贪吃蛇那样的小游戏，我相信你可以做出来的。刚开始，你可以去找相应的教材和代码去学，跟着别人一步步来。你还在学校，有足够的空闲。等你走上社会找工作了，你如果没有相关经验，你才会发现什么才叫真正的纠结。学校里，那种小程序自己能快速搞定当然最好，一时搞不定也没人催你；社会上，项目经理给你一天时间或一个星期时间搞定一个项目，搞不定估计就要走人了。 程序贵在坚持！一两个星期，一两个月变成高手，那是天才。市场上有很多21天学通X语言的，事实上，31天你也未必能把那本书看个大概（对初学者而言），更别说完全掌握了。 国内，现在有一些比较知名的培训班专门做软件开发的培训。就那种专门的培训机构把一个有点基础的新手培养成能做开发的码农，至少也得4个月     //这4个月每天学习8+小时，双休日顶多休息一天 所以说，你现在有点太急于求成了。给自己一点时间，对学习多一点耐心，相信你会有所成就的！谢谢了！是有点急于求成了，感觉大学过的太快了，单纯靠跟着学校学，学到的很不实用，整天都是算数，学了半学期扫雷都写不出来有点心急了！我明天继续写

引用 10 楼 zhao4zhong1 的回复:为什么不直接上Windows版的扫雷呢？ 《Visual C++ 游戏开发经典案例详解》

为什么不直接上Windows版的扫雷呢？

引用 6 楼 USE_R_NAME 的回复:[quote=引用 5 楼 call_from_dream 的回复:] 耐心一点，多找点资料，慢慢来。扫雷、贪吃蛇那样的小游戏，我相信你可以做出来的。刚开始，你可以去找相应的教材和代码去学，跟着别人一步步来。你还在学校，有足够的空闲。等你走上社会找工作了，你如果没有相关经验，你才会发现什么才叫真正的纠结。学校里，那种小程序自己能快速搞定当然最好，一时搞不定也没人催你；社会上，项目经理给你一天时间或一个星期时间搞定一个项目，搞不定估计就要走人了。 程序贵在坚持！一两个星期，一两个月变成高手，那是天才。市场上有很多21天学通X语言的，事实上，31天你也未必能把那本书看个大概（对初学者而言），更别说完全掌握了。 国内，现在有一些比较知名的培训班专门做软件开发的培训。就那种专门的培训机构把一个有点基础的新手培养成能做开发的码农，至少也得4个月     //这4个月每天学习8+小时，双休日顶多休息一天 所以说，你现在有点太急于求成了。给自己一点时间，对学习多一点耐心，相信你会有所成就的！谢谢了！是有点急于求成了，感觉大学过的太快了，单纯靠跟着学校学，学到的很不实用，整天都是算数，学了半学期扫雷都写不出来有点心急了！我明天继续写[/quote]这方面的资料网上有，学校图书馆相关的书也有，书后面的光盘里也有。耐心点，慢慢找。在学校有问题还能问问老师，跟师兄、师姐客气点，他们中很多人也很愿意帮你一把的，同一级的肯定也不乏软件“高手”……别太急！别太内向！打交道的人多了，说不定你还可能有艳遇，你懂的！

加油 共勉！

引用 7 楼 coding_hello 的回复:思路理清楚，想想步骤  1.初始化数组，确定初始状态信息，是不是雷，是不是空白，都不是的话应该是周围的雷的个数 2.画出来，比如都显示成星号，横坐标纵坐标显示出来 3.等玩家输入坐标和动作 4.判断玩家输入，根据输入做判断，改状态  5.循环3,4，知道玩家炸雷或者扫雷结束今天理理思路重写，昨天的思路比较混乱！没想好就开写了！

引用 12 楼 zhang5476499 的回复:推荐看《c语言也能干大事》去图书馆看看能不能借到！！！

引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] 为什么不直接上Windows版的扫雷呢？ 《Visual C++ 游戏开发经典案例详解》[/quote]我还没学过C++，现在只是会了点C！可以看么？


Question: 如何释放指向数组的指针的空间的问题

for(int i=0; i<3; i++)     delete[] H[i];  delete[] H;

delete []h[i] delete []h


Question: 我编译VC++项目时为神马string.h报很多错误？

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

重定义了，string.h头文件重复引用了

有可能是字符集的原因。。设置一下，因为VS现在默认都 是unicode..


Question: 通讯录系统出错

#define N 50 #define exit #include<stdio.h> #include<string.h> struct people {char name[20];  char num[15];  char mail[20]; }peop[N]; //输出某个联系人信息 void printf_one(int i) {  	printf("\t%s\t%s\t%s\t%s\n",peop[i].name,peop[i].num,peop[i].mail);  }  void printf_f()//输出信息函数 { 	printf("\n\t姓名\t电话号码\t邮箱\n"); }  //输入某联系人信息 void input(int i) {   void printf_f();//掉了分号 printf_f(); printf("\n"); scanf("%s\t%s\t%s",peop[i].name,peop[i].num,peop[i].mail);//多了一个%s } //输出已存联系人  void printf_n(int n) { int j;void printf_one(int i); for(j=0;j<n;j++) { if((j!=0)&&(j%10==0))  { 	printf("\n\nPress any key to continue...:");  	getchar(); 	printf("\n\n");//这行可以修改下 } printf_one(j); }    getchar(); } //统计已有联系人数目  int load()//加载？//统计已有联系人数目 { FILE *fp; int i; if((fp=fopen("file","rb"))==NULL) { 	printf("\nCan not open file\n"); 	exit (0); } for(i=0;!feof(fp);i++)//直到指针移到尾部 fread(&peop[i],sizeof(struct people),1,fp); fclose(fp); return(i-1);//已有联系人数目 } //修改数据  int modify_data(int i,int n)//修改联系人 { int c,w1;  void input(int i);  void menu(); do { printf("\n修改选项=>\n\n  1).姓名  2).电话号码  3).邮箱  4).所有数据  5).取消并返回\n");  printf("请选择: "); scanf("%d",&c); if(c>5||c<1)  {printf("\nChoose error! Please again!"); getchar();} }while(c>5||c<1); do { switch(c) { case 1: printf("name:"); scanf("%s",peop[i].name); break; case 2: printf("number:"); scanf("%s",peop[i].num); break; case 3: printf("e-mail:"); scanf("%s",peop[i].mail); break; case 4: input(i); break; case 5: menu();  } printf("\n现在\n"); printf_f();  printf_one(i); printf("\n确定?\n\n\t1).是  2).不，重新修改  3).返回不保存 \n"); scanf("%d",&w1); } while(w1==2); return(w1); } //保存到文件  void save(int n) { FILE *fp;  int i; if((fp=fopen("file","wb"))==NULL) { printf("\nCan not open file\n"); exit(0); } for(i=0;i<n;i++) if(peop[i].name[0]!='\0') if(fwrite(&peop[i],sizeof(struct people),1,fp)!=1) printf("file write error\n"); fclose(fp); }//掉 了大括号  //浏览所有添加    void printf_back() { 	int w;  	void browse();  	void menu(); 	printf("\n\n\t^_^.Successful. ^_^\n\n"); 	printf("What do you want to do?\n\n\t1).浏览所有\t2).返回\b\b"); 	scanf("%d",&w); 	if(w==1) browse(); 	else menu(); }  #define N 50 #define exit #include<stdio.h> #include<string.h> #include"data.h"   void menu();//函数声明要放到main函数前面 void main() { 	menu(); }  void menu() { 	int n, w1; 	void enter();  void add();  void modify();   void browse();  void deleter();  void search(); 	do 	{ 		printf("\t************************菜单************************ "); 		printf("\t*******************1.新建联系人*******************"); 		printf("\t*******************2.添加联系人*******************"); 		printf("\t*******************3.修      改*******************"); 		printf("\t*******************4.删      除*******************"); 		printf("\t*******************5.浏      览*******************"); 		printf("\t*******************6.查      找*******************"); 		printf("\t*******************7.退      出*******************"); 		printf("\n\n********************通讯录********************* "); 		printf("请选择服务种类(1-7) : [ ]\b\b"); 		scanf("%d",&n); 		if(n<1||n>7) 		{w1=1;getchar();} 		else w1=0; 	}while(w1==1); 	switch(n) 	{ 	case 1: enter(); break; 	case 2: add(); break; 	case 3: modify(); break; 	case 4: deleter(); break; 	case 5: browse(); break; 	case 6: search(); break; 	case 7: exit(0); 	} }  void enter()//新建联系人 { int i,n; printf("How many people(0-%d)?:",N-1); scanf("%d",&n); printf("请输入数据:\n"); for(i=0;i<n;i++) {printf("\n输入第 %d个记录.\n",i+1);  input(i); } if(i!=0) save(n); printf_back(); }  void add()//添加联系人 { int i,n,k,t;    n=load(); printf("How many people do you want to add(0-%d)?:",N-n-1); scanf("%d",&t);     k=n+t; for(i=n;i<k;i++) { printf("\n输入第 %d个记录.\n",i-n+1);  input(i);} save(k);  printf_back(); }  void modify()//修改联系人 { struct people s;   int i,n,k,w0=1,w1,w2=0;  n=load(); do { k=-1;  printf_f();   printf_n(n); do { printf("\n\n输入希望修改的联系人的姓名\n姓名:"); scanf("%s",s.name); for(i=0;i<n;i++) if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_f();   printf_one(k); w1=modify_data(k,n); if(w1==1) {printf("\n\t^_^.Successful ^_^.\n\n是否继续?\n\n\t1).是 2).保存返回\t[ ]\b\b"); scanf("%d",&w0);  w2=1;} else {w0=0;  if(w2==0) peop[k]=s;} if((w0!=1)&&(w2==1))  save(n); }while(w0==1);    menu(); }  void browse()//浏览函数功能之一 { int n;  n=load(); printf_f();  printf_n(n); printf("\t共有 %d 记录.\n",n); printf("\nPress any key to back..."); getchar(); menu(); }  void search()//查找函数 功能之一 { int w0,k,i,n,w1,w2; struct people s;  n=load(); do {printf("请选择查找类别:  1).姓名  2).电话号码   [ ]\b\b"); scanf("%d",&w1); if(w1<1||w1>2) {printf("输入错误!请重新输入!\n"); w2=1;} }while(w2==1); if(w1==1) {do { k=-1;  do { printf("\n\nEnter name that tou want to search!\nName:"); scanf("%s",s.name); for(i=0;i<n;i++) if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_f();  printf_one(k); printf("\nWhat do you want to do?\n\t1).继续   2).返回菜单   [ ]\b\b"); scanf("%d",&w0); }while(w0==1); menu(); } else { do { k=-1;  do { printf("\n\nEnter number that tou want to search!\nNum:"); scanf("%s",s.num); for(i=0;i<n;i++) if(strcmp(s.num,peop[i].num)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_f();  printf_one(k); printf("\nWhat do you want to do?\n\t1).继续   2).返回菜单   [ ]\b\b"); scanf("%d",&w0); }while(w0==1); menu(); } }  void deleter()//删除联系人 {struct people s;  int i,n,k,w0,w1;  n=load(); do { k=-1;  printf_f();  printf_n(n); do { printf("\n\nEnter name that you want to delete!\nName:"); scanf("%s",s.name); for(i=0;i<n;i++) if(strcmp(s.name,peop[i].name)==0) {k=i; s=peop[i];} if(k==-1) printf("\n\n没有记录请重新输入!"); }while(k==-1); printf_f();  printf_one(k); printf("\n确定?\n\t1).是   2).返回  [ ]\b\b"); scanf("%d",&w0);   if(w0==1) {peop[k].name[0]='\0'; save(n);}  else break; printf("\n\t^_^.Successful^_^.\n"); printf("What do you want to do?\n\t1).继续   2).返回  [ ]\b\b"); scanf("%d",&w1); }while(w1==1); menu(); }

//输入某联系人信息 void input(int i) {   void printf_f();   //这漏了; printf_f();  printf("\n");   scanf("%s\t%s\t%s\t%s",peop[i].name,peop[i].num,peop[i].mail);  }                                            //输出已存联系人  void printf_n(int n) { int j;void printf_one(int i);  //这也漏了;   for(j=0;j<n;j++)   { if((j!=0)&&(j%10==0))    {   printf("\n\nPress any key to continue...:");    getchar();   printf("\n\n");//这行可以修改下   }     printf_one(j);   }      getchar(); }                                       //保存到文件  void save(int n) { FILE *fp;    int i;   if((fp=fopen("file","wb"))==NULL)   { printf("\nCan not open file\n");     exit(0);   }   for(i=0;i<n;i++)   if(peop[i].name[0]!='\0')   if(fwrite(&peop[i],sizeof(struct people),1,fp)!=1)   printf("file write error\n");   fclose(fp); }  //这漏了}

代码排好格式，从上往下检查花括号的配对关系，是不是有遗漏的，每一行结束有没有遗漏的分号


Question: system("CompMgmtLauncher");奇异问题

system("compmgmt.msc");

用系统管理员权限试试

额。。这个应该是环境配置的问题了。。具体细节也不知道哦~~

#include <stdlib.h> void main(){ 	system("CompMgmtLauncher"); 	system("pause"); }  我在vs2010上可以运行，就调出了“计算机管理”。 我不是大神，我也不知道为什么在LZ的机子上不能运行~~


Question: linux下用c语言保存网络图片到本地，该怎么处理？

同上，libcurl

使用curl库？

不想用socket就用第三方的库呗，来这问还不如直接去百度就好了


Question: error:incomplete type is not allowed

太粗心   谢谢  我以为写了的

typedef struct Item;  你Item都没定义。只是声明没有用的，只声明编译器怎么知道它的内存布局。


Question: 新人，好多error，求教

引用 9 楼 kino_chen 的回复:引用 8 楼 axiqia 的回复:[quote=引用 7 楼 kino_chen 的回复:] [quote=引用 6 楼 axiqia 的回复:] [quote=引用 4 楼 kino_chen 的回复:] #define LEN sizeof(struct student}  //就随便看了一下...谢谢，终于找到了，编译器提醒的错误都是指在create函数里面，结果我始终找不着，原来错误在前面，纠结了一晚上。谢谢，剩下我的自己来搞定。 不客气，应该的[/quote]开始报28个，我都晕了，甚至没有写下去的信念了。总之功能了，我继续敲，完善一下其他[/quote] 一个个解决，你就有成就感了，解决一个编译一下，别看这么多error，可能就是几处的错误。[/quote] 恩恩，已经写了200多行了，调试了一下午。确实学到很多。

引用 8 楼 axiqia 的回复:引用 7 楼 kino_chen 的回复:[quote=引用 6 楼 axiqia 的回复:] [quote=引用 4 楼 kino_chen 的回复:] #define LEN sizeof(struct student}  //就随便看了一下...谢谢，终于找到了，编译器提醒的错误都是指在create函数里面，结果我始终找不着，原来错误在前面，纠结了一晚上。谢谢，剩下我的自己来搞定。 不客气，应该的[/quote]开始报28个，我都晕了，甚至没有写下去的信念了。总之功能了，我继续敲，完善一下其他[/quote] 一个个解决，你就有成就感了，解决一个编译一下，别看这么多error，可能就是几处的错误。

引用 7 楼 kino_chen 的回复:引用 6 楼 axiqia 的回复:[quote=引用 4 楼 kino_chen 的回复:] #define LEN sizeof(struct student}  //就随便看了一下...谢谢，终于找到了，编译器提醒的错误都是指在create函数里面，结果我始终找不着，原来错误在前面，纠结了一晚上。谢谢，剩下我的自己来搞定。 不客气，应该的[/quote]开始报28个，我都晕了，甚至没有写下去的信念了。总之功能了，我继续敲，完善一下其他

引用 6 楼 axiqia 的回复:引用 4 楼 kino_chen 的回复:#define LEN sizeof(struct student}  //就随便看了一下...谢谢，终于找到了，编译器提醒的错误都是指在create函数里面，结果我始终找不着，原来错误在前面，纠结了一晚上。谢谢，剩下我的自己来搞定。 不客气，应该的

逻辑就不来看了，create的逻辑感觉是有问题的，你可以看看。下面是我看到的错误，可能不全，有提示会好点。  scanf("%s",&p1->name); //不需要加& p=head; //head 没定义，之前那个head是局部变量

引用 2 楼 axiqia 的回复:quote]编译的时候有错误发现不了才把代码贴出来，没有想过让人帮忙做作业，你可能会错意了吧。只是让帮忙指出错误在哪里，还请仔细看一下问题。 不好意思，能把错误提示贴一下么？

引用 1 楼 kino_chen 的回复:先自己解决，解决不了再把错误提示贴出来，大家分析定位一下。论坛毕竟不是帮人做作业的地方编译的时候有错误发现不了才把代码贴出来，没有想过让人帮忙做作业，你可能会错意了吧。只是让帮忙指出错误在哪里，还请仔细看一下问题。


Question: 怎样写一个抽象数据类型（ADT）的程序呢？

”首先应该是数据结构的设计，这个在写代码之前就应该确定“ 这句话对我有用，后面的我都知道  还有就是赵老师，你推荐的那个，我觉得好像离我比较远，而且没这么多时间 我目前就是从单文件到多文件（文件之间的关系我知道），在设计一个多文件程序时的思路是什么？  网上有说先要确定自己的需求？ 然后就没有了 希望有大神能够指点迷津 或者提供一些关于程序设计思路的搜索关键词 （我搜索过，但没搜索到什么，可能关键词，不太合适）

这里面当然需要设计了。 首先应该是数据结构的设计，这个在写代码之前就应该确定。 然后是头文件，那些是公共头文件，就把这些公共头文件写在一个头文件中，然后一个include就ok。 后面是。c文件，它实现的是函数功能，当然你也需要明确各个函数作用以及相互关系

搜“跟我一起写makefile” 或在MSDN里面搜“msbuild”

之前写的程序都是一个单一的文件，现在要写一个多文件的代码 这个流程是什么？

恩 谢谢    待会儿   仔细看一看

粗略说下自己的感受，可以看看~ 1.肯定是要需求分析，写个需求分析文档什么的。写的过程当中，你就会有个大局观了，而且有些不合适的想法就会被排出。-------需求分析 2.多文件，就要分模块，一个文件一个模块功能（多个子模块又能组成一个大模块），大模块以库的方式提供给用户，而小模块功能如果不需要了，也只需要编译时不加该文件就行了，减小库大小。-----------概要设计 3.然后设计接口，设计接口要考虑，你需要什么信息（入参），才能给出什么信息（出参）。为了让这些信息不那么松散，肯定是要设计数据结构了。还有嘛就是要考虑到自己到底处于什么位置，你只是提供服务，设计的接口就不能太业务。------系统设计 如果不是自己一个人，那就找人评审一下，也设计下测试案例。 4.写代码。---------编码 5.写好一个模块可以测试一下，看看功能是否实现------------单元测试 6.都写好之后，一起跑跑，毕竟单个没问题，一起不一定没问题------------系统测试  时间充裕，你可以考虑优化代码！！


Question: 请问 int (*a)[10]   和  int a[10] 一样吗？

引用 6 楼 kino_chen 的回复:[quote=引用 5 楼 jimy1 的回复:] [quote=引用 3 楼 XSF50717 的回复:]  int (*a)[10]  指向一个整型的一维数组，这个一维数组的长度是10，也可以说是a的步长。也就是说执行a+1时，a要跨过10个整型数据的长度；  int a[10] 这个是最基本的数组，不多说了  请问 int (*a)[10]    a是一个地址 a+1,不是换算成十进制  再加一  吗？  int a[10]    a+1  是加一个int单位步长吗？  谢谢[/quote] 指针+n，实际上是指针+n*sizeof(指针指向的类型)。此处int (*a)[10]  a是一个指向拥有十个int的数组,所以a+1就是a+1*sizeof(int [10]);[/quote] 是的就是这样的

引用 5 楼 jimy1 的回复:[quote=引用 3 楼 XSF50717 的回复:]  int (*a)[10]  指向一个整型的一维数组，这个一维数组的长度是10，也可以说是a的步长。也就是说执行a+1时，a要跨过10个整型数据的长度；  int a[10] 这个是最基本的数组，不多说了  请问 int (*a)[10]    a是一个地址 a+1,不是换算成十进制  再加一  吗？  int a[10]    a+1  是加一个int单位步长吗？  谢谢[/quote] 指针+n，实际上是指针+n*sizeof(指针指向的类型)。此处int (*a)[10]  a是一个指向拥有十个int的数组,所以a+1就是a+1*sizeof(int [10]);

引用 3 楼 XSF50717 的回复:int (*a)[10]  指向一个整型的一维数组，这个一维数组的长度是10，也可以说是a的步长。也就是说执行a+1时，a要跨过10个整型数据的长度；  int a[10] 这个是最基本的数组，不多说了  请问 int (*a)[10]    a是一个地址 a+1,不是换算成十进制  再加一  吗？  int a[10]    a+1  是加一个int单位步长吗？  谢谢

int (*a)[10]   数组指针 int *a[10]     指针数组 http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html

看着我就觉得不一样 -0-

不一样，后者是数组，前者是指向数组类型的指针。


Question: C语言两个两组数同时存放，然后想对一组数进行排序，另一组跟着？

直接排一个数组，另一个根据下标进行同样的交换就可以

typedef struct node{ int a, int b}node_t;  node_t node_map[6] ;   //初始化一下，每个 node_t 节点 就是个映射关系，(3,3), (5,43).....  //排序数组....  //遍历映射关系，排列出另一个数组

可以给就下标排序，完成后可以选择性的按照已序的下标再调整原数组。 也可以直接排序第二个数组，每次交换的时候把第一个数组内对应的元素也交换。


Question: 关于二级指针的幅值问题，向大家请教一下这段程序应该怎么改，谢谢！

char *out= NULL; int max_numstr_length = Continumax(&out, inputstr); unsigned int Continumax(char** pOutputstr, char* intputstr) { 	*pOutputstr = (char *)malloc(100); }  这样做,外部释放内存

在线求解答啊。。有没有大神知道

引用 4 楼 user-2 的回复:[quote=引用 3 楼 zhuangshengen 的回复:] [quote=引用 2 楼 user-2 的回复:]  for(int i = 0 ; i<max;i++)  //将最大子字符串的值拷贝给outputstr { **pOutputstr++ = *pstr++; } 试试不行，和我一开始的问题一样[/quote] 为什么这么写呢。。感觉好麻烦啊，二级指针不是一般用来改指针的地址的么，用来赋值感觉不好用啊。。。[/quote]题目要求一定要用二级指针，用不来。。。

引用 3 楼 zhuangshengen 的回复:[quote=引用 2 楼 user-2 的回复:]  for(int i = 0 ; i<max;i++)  //将最大子字符串的值拷贝给outputstr { **pOutputstr++ = *pstr++; } 试试不行，和我一开始的问题一样[/quote] 为什么这么写呢。。感觉好麻烦啊，二级指针不是一般用来改指针的地址的么，用来赋值感觉不好用啊。。。

引用 2 楼 user-2 的回复:for(int i = 0 ; i<max;i++)  //将最大子字符串的值拷贝给outputstr { **pOutputstr++ = *pstr++; } 试试不行，和我一开始的问题一样

for(int i = 0 ; i<max;i++)  //将最大子字符串的值拷贝给outputstr { **pOutputstr = *pstr; (*pOutputstr)++; //pstr++; }


Question: c语言课程设计——学生成绩记录簿  求大神指教

明年吧  等我有空的话

网上很多demo，找一个看看改改就行了，不要一上来就要源码！

这个东西我们也做了 是期末作业 很简单的 用点心 别空想 上来就干 先把框架做出来 我是用dev的项目做的 一个模块一个模块做 都是用基本语句完成的 汇集到一个文件也就34百行 一点一点拱 34天的事

你是严芬教的吧


Question: 合成两个有序链表不知道错在哪里，求高手帮忙！

引用 1 楼 user-3 的回复: linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  您好，刚才我在想这个together函数里其实不用给L3重新开辟一个空间，直接让L3指向L1的头结点，这样似乎也是可以的？

引用 3 楼 adusuccessfully 的回复: 	//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }   您好，我刚刚一直在想，together这个函数里面要是把L1，L2都给free了，等会儿回到主函数的时候还怎么输出啊、

引用 7 楼 user-3 的回复:[quote=引用 3 楼 adusuccessfully 的回复:] LZ写程序的时候可能复制粘贴，粘贴后忘修改了~~ 我在楼上修改的基础上，增加了考虑重复的情况，修改比较简单！！ 楼上的修改为什么要给main函数中加一个  while(1);的死循环呢？？  #include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else if(p1->data>p2->data) 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 		else 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next;//头结点L没有数据 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }    加了它是为了防止控制台退出，一闪而过。。你要么是用vc6.0..要么是用GCC吧。。。。[/quote] 我用的codeblocks  很谢谢你的回答！

在参考代码段中找找： http://pan.baidu.com/s/17yIcQ

引用 6 楼 qq_23908539 的回复:[quote=引用 1 楼 user-3 的回复:]  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  您好，刚才我在想这个together函数里其实不用给L3重新开辟一个空间，直接让L3指向L1的头结点，这样似乎也是可以的？[/quote]  都 行，只要能实现你要的功能就行了

引用 3 楼 adusuccessfully 的回复:LZ写程序的时候可能复制粘贴，粘贴后忘修改了~~ 我在楼上修改的基础上，增加了考虑重复的情况，修改比较简单！！ 楼上的修改为什么要给main函数中加一个  while(1);的死循环呢？？  #include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else if(p1->data>p2->data) 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 		else 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next;//头结点L没有数据 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }    加了它是为了防止控制台退出，一闪而过。。你要么是用vc6.0..要么是用GCC吧。。。。

这是不考虑重复的情况，如果考虑重复的情况还得再加个else if..然后，P1,P2同时变

#include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	while(1); 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<=p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else //你这里直接用一个else。感情 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next; 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }  改好了，错在判断语句if后面的p2.....啊。。。


Question: 运行后为什么子菜单功能实现不了

为什么最近有这么多人写这个


Question: 贪心讨论

那应该是怎么样的？总体来考虑最优情况吗？

局部最优期望达到整体最优，但是最终结果是不一定是最优的，可能连次优都不如


Question: C 语言指针的一个小问题

结合this指针，可能比较容易理解： http://blog.csdn.net/wz7654321/article/details/8375922 楼主的代码，调用test的时候，也传了个this指针进去，而且this是空指针。但是因为test函数根本就没用到任何成员变量，所以test函数里面根本就没有用到这个空的this指针，所以也就不会挂。

这个就涉及到类里面对于成员变量和成员函数的区别。 对于非静态的成员变量，这个类构造的每个对象都有一个各自的变量，比如1楼GCC类的成员变量i。要访问这个成员变量，就必须要用到类对象的地址，如果刚好是空指针，那就挂了。 成员函数就不一样了。不管这个类构造了多少个对象，或者根本就没有构造任何对象，成员函数(还有静态成员变量)都只有一份拷贝。所以，访问成员函数，根本就用不着类对象的地址，是不是空指针都无所谓。

把代码稍微改一下： class GCC { public: int i;  // 加一个成员变量     void test()     {             cout<<"this is the test" << i <<endl;  // 访问成员变量     } }; 这样的话，再用空指针就会挂掉了。


Question: TEXTOUT输出不正常。。。

引用 2 楼 fly_dragon_fly 的回复:用tchar就不用w这类函数 wsprintf  请教一下，除了WSPRINTF,还有哪个函数可以将变量转为字符串？

引用 1 楼 user-3 的回复:试试工程-》设置里面的字符集看看  已经将UNICODE改为多字节

这是我发表的主题，那帐号PW没了，进不去  解决办法找到了，是把sizeof改为strlen  结帖

用tchar就不用w这类函数 wsprintf

试试工程-》设置里面的字符集看看


Question: 一个输入英文首字母判断星期几的问题出错，求高手帮忙

貌似是懂了一些

你需要 setbuf(stdin,NULL)

输入M回车后，M和回车先后付给了I，因此分别执行了第一个case和default语句 解决办法是，先定义个整型变量int n;在switch前面加上scanf("％d",&n);来吃掉回车 更多信息百度scanf缓冲区

输入M之后敲的那个回车，也会被scanf读取并赋值给I和a，结果他们的值就是'\n‘，导致错误。 加一点代码把'\n'的情况单独处理一下就好了


Question: C语言程序报地址冲突

引用 2 楼 ddyuwgr123 的回复:struct bst *l=NULL; 他停止这一句 但是怎么改？？？   int i,j;    struct bst *l=NULL;    l  =  (struct bst *)malloc(sizeof(struct bst));  //先给结构体分配内存    l->data=(int *)malloc(100*sizeof(int ));    for(i=0;i<100;i++)       {        l->data[i]=0;        }    l->lenth=0;    for(j=0;j<n;j++)       {        bst_insert(l,1,x[j]);        l->lenth++;        }//第一个结点为空    return l;

struct bst *l=NULL; 他停止这一句 但是怎么改？？？

错误信息表明在对空指针进行读写操作。  在调试器中运行程序吧，会停在出错行，仔细看看当前行在操作的节点。


Question: 请问这段二叉树建立的代码有什么问题吗

能给几组测试数据吗

BiNode * Creat() {     int dt; 	BiNode *bt;     bt = new(BiNode);     if (!bt) { 		exit(0); 	}     cin >> dt;     if(dt == 0) {         bt = NULL;     } else {         bt->data = dt;         bt->Lchild = Creat();         bt->Rchlid = Creat();     } 	return bt; }  void PreOrder(BiNode *bt) {     if (!bt)         return;     cout << bt->data << ' '; 	PreOrder(bt->Lchild); 	PreOrder(bt->Rchlid); 	delete bt; }

#include<iostream> #include<stdlib.h> #include<malloc.h> using namespace std; typedef struct BiNode {     int data;     BiNode *Lchild;     BiNode *Rchlid; }BiNode;  BiNode * Creat() {     int dt; 	BiNode *bt;     bt = (BiNode *)malloc(sizeof(BiNode));     if (!bt) { 		exit(0); 	}     cin >> dt;     if(dt == 0) {         bt = NULL;     } else {         bt->data = dt;         bt->Lchild = Creat();         bt->Rchlid = Creat();     } 	return bt; }  void PreOrder(BiNode *bt) {     if (!bt)         return;     cout << bt->data << ' '; 	PreOrder(bt->Lchild); 	PreOrder(bt->Rchlid); }  int main() {     BiNode *bt = Creat();     PreOrder(bt);     return 0; }

1 2 4 0 0 5 0 0 3 0 0 1 2 3 4 0 5 0 0 6 0 0 0 7 8 0 0 9 0 0 1 2 0 0 3 4 6 0 0 0 5 0 0


Question: 请大家帮我找错 谢谢了

真的很多错误啊引用 2 楼 qq_23092307 的回复:这个是我写的 错误百出 结果还是错的 请大家帮我指出错误

楼主还有一段很长的路要走哇~

看到楼主想起了我自己上学的时候。马上买电脑 等我。

仅供参考/*************************************************************************     > File Name: main4.c     > Author: jukay     > Mail: hellojukay@163.com      > Created Time: 2014年12月27日 星期六 19时56分12秒  ************************************************************************/  #include<stdio.h>  int is_perime(int n) { 	int state = 1; 	for(int i = 2; i < n; ++i) 	{ 		if(n % i == 0) 			{ 				state = 0; 				break; 			} 	} 	return state; }  void abs_perime_tens() { 	int tmp; 	for(int i = 10; i < 100; ++i) 	{ 		tmp = i/10 + 10 * (i % 10); 		if(is_perime(i) && is_perime(tmp)) 			printf("%d\t",i); 	} }  int main(int argc, char **argv) { 	abs_perime_tens(); }

引用 7 楼 user-8 的回复:我是想来吐槽楼主的。。。。。你看看5楼贴的代码和你贴的代码，仅仅是缩进的问题可读性就差了好多倍。  说的在理  谢谢指点     缩进是什么

马上给出参考代码,等我

马上买电脑..等我

马上开VS..等我

你有3个错误 1.main函数你如果没有返回，要写成void main() 2.int isPrime你应该返回不同的值，表示它是不是素数，如0表示不是素数，1表示是素数 3.absPrimeTens()中，int n,m,i;。。i是局部变量，而且值未定。运行到n=i%10;会报错。你要么把main中的i传给absPrimeTens()，要么把i定义成全局变量。当然了，最简单的还是把for(i=11;i<=100;i++)放到absPrimeTens()中。

引用 6 楼 Evankaka 的回复: 可以告诉我 我错哪了吗

#include <stdio.h>  int isprime(int n);  void absprimetens();  int isPrime(int n) { 	int i; 	for(i=2;i<n;i++) 		if(n%i==0) 			return 0;//表示该数不是素数        		return 1;//表示该数是素数 } void absPrimeTens() { 	int n,m,i; 	for(i=10;i<100;i++) 	{ 		n=i%10; 		m=i/10+n*10; 		if(isPrime(i)==1&&isPrime(m)==1) 			printf("%d\n",i); 	} }   void main() { 	absPrimeTens(); 	while(1);//死循环，防止控制台退出  } OK了

马上开VS..等我

正确解答网上有 只需大家告诉我怎么错的

这个是我写的 错误百出 结果还是错的 请大家帮我指出错误

#include <stdio.h>   int isprime(int n);   void absprimetens();      	int isPrime(int n) 	{ 		for(int i=2;i<n;i++) 			if(n%i==0) 				return 0;} 	void absPrimeTens() 	{ 		 		int n,m,i; 		n=i%10; 		m=(i-n)/10+n*10; 		if(isPrime(m)==0) 			printf("%d",i); 	}   				main() 	{ 	 	int i; 	for(i=11;i<=100;i++) 	{   	if(isPrime(i)==0) 	absPrimeTens(); 	 	} 				}


Question: 在线等牛人 帮忙调试一下程序， 关于链表的

[quote=引用 2 楼 user-1 的回复:] 原谅我是个大一的。。。能懂 大神说的是什么。。但是我想知道  我的程序错在哪。。。             [

原题：一组人（n）个，围成一圈，从某人开始数到滴三个的人出列，在接着从下一个人开始数，最终输出最终出列的人（约瑟夫环是一个数学的应用问题：已知n个人（以编号1,2,3,...,n）分别表示）围坐在一张圆桌周围。从编号k的人开始报数，数到m的那个人出列；他的下一个人又从1开始报数，数到m的那个人又出列：依此规律重复下去，知道圆桌周围的人全都出列。 #include <iostream>   #include <list>   #include <vector>   #include <algorithm>   using namespace std;   vector<int> yuesefeng(int n,int m);   void main()   {       int n,m;       cin>>n>>m;       vector<int> out;       out=yuesefeng(n,m);       int i,len=out.size();       for(i=0;i<len;i++)           cout<<out[i]<<" ";       system("pause");   }   vector<int> yuesefeng(int n,int m)//n代表初始人数，m代表初始号码   {       vector<int> out;       list<int> in;       list<int>::iterator pos;       int i;       for(i=1;i<=n;i++)           in.push_back(i);       pos=in.begin();       int kk=m;       while(in.size()!=0)       {              if(kk!=1)             {                 pos++;                 kk--;              if(pos==in.end())//注意要判断是否到尾部了，到尾部就指向头部               pos=in.begin();              }           else           {               out.push_back(*pos);//到数了，点到的人保存到输出               pos=in.erase(pos);///将此人从列表中删除，注意erase返回的是下个人的指针               if(pos==in.end())                   pos=in.begin();           }              }       return out;   }

这就是约瑟夫环的问题哈，可以用STL中的list来做，效果更高


Question: EOF的问题

引用 4 楼 zhao4zhong1 的回复:为了区别到底是按了EOF对应按键（Linux下Ctrl+D，Windows下Enter、Ctrl+Z、Enter）还是ASCII码为255的字符（Windows下按住Alt不放，按小键盘上的2、5、5，再松开Alt，或输入重定向文件中的'\xff'），和EOF比较的变量的类型不能是char。 ++ 这是说到根子上了

你这样理解嘛：EOF==end of file,这个东西就拿来搞文件的，‘\n'只是个换行符

EOF的值为-1，EOF用在处理文件时判断是否已经读到文件尾，而getchar会一直从标准输入读取一个字符，每读一个字符就赋给ch，读到换行符\n时也直接赋给ch，\n明显不等于-1，所以while一直在等待输入。要想退出while循环，Linux下按Ctrl+D就可以了。

可以用的，区别只是在于'\n'是按回车就退出，而EOF的话： 1、Windows下按CTRL+Z相当于输入EOF 2、Linux下按CTRL+D相当于输入EOF

char ch;  ===> int ch;   因为getchar()函数的返回值是int int getchar(void);  DESCRIPTION        fgetc()  reads  the next character from stream and returns it as an unsigned char cast to an int, or EOF on end        of file or error.         getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream  more  than        once.         getchar() is equivalent to getc(stdin).

明白了   谢谢大家

2楼正解！两种判断都合理！只是采集数据时，你怎么输入收尾符的问题！

1楼正解，EOF一般是-1，getchar返回值是 int


Question: 直接插入排序

#include<stdio.h> #include<stdlib.h> #include<time.h>  void dfas(int a[],int n) //待排序元素用一个数组a表示，数组有n个元素 {  	int i,j; 	int t; 	for(i=1;i<n;i++) //i表示插入次数，共进行n-1次插入 	{  		t=a[i]; //把待排序元素赋给t 		j=i-1; 		while ((j>=0) && (t<a[j])) 		{	  			a[j+1]=a[j];  			j--;  		} // 顺序比较和移动 		a[j+1]=t; 	}  /*	 	for(i=0;i<5;i++) 		printf("%5d",a[i]); 	putchar(10);  //回车 */ } 	 void main() { 	int i,a[5]; 	srand(time(0));  	for(i=0;i<5;i++)  //数组是以下标0开始，而不是1 	{ 		a[i]=rand()%100; 		printf("%5d",a[i]); 	} 	printf("\n after sort========================\n"); 	dfas(a,5); 	for(i=0;i<5;i++) 	{ 		printf("%5d",a[i]); 	} 	putchar(10);  //回车 }

给LZ分享一个链接，这篇博文讲了多种排序算法：http://blog.csdn.net/hguisu/article/details/7776068

数组的下标是从0开始的~~  for(i=0;i<5;i++){ 		a[i]=rand()%100; 		printf("%5d",a[i]); 	} 	printf("\n");

非常感谢大家的帮助！问题解决了。


Question: 使用LoadLibrary加载了ntoskrnl.exe后，用EnumDevicedDriver为什么枚举不出ntoskrnl.exe

搜“devcon”


Question: 新手求救。弄搜索功能快哭了啊

用fscanf（data，%d，buff）；这样就没有其他东西了 遇到空格就结束了

楼主别贴图，贴代码上来，我就帮你改。

引用 8 楼 jacksonfan 的回复:buff不是从文本文件读出来的么，那你看看文件结尾有没有多余的空格有空格，但是半角空格啊，而且还有奇怪的汉字。。。

引用 9 楼 fengswd 的回复:不是分配了14字节的空间吗？读13个，然后设置第14个为NULL.并不是让你也读14个。。嗯嗯好的我试一下

引用 5 楼 fengswd 的回复:要读·13必须分配14.最好在读取前初始一下buffer为全0.用HeapAlloc更好，比malloc好多了亲，分配了14，但我输入1234567890123的时候后面多了很多空格和‘铪’字符

引用 2 楼 fly_dragon_fly 的回复:buffer分配13读了14亲，我要读取13个char类型的字符，应该分配多少呀

引用 1 楼 user-6 的回复:描述的不是很详细啊，结果也没有，也没有贴代码，亲，我贴代码了呀，是图片形式的

buff不是从文本文件读出来的么，那你看看文件结尾有没有多余的空格

描述的不是很详细啊，结果也没有，也没有贴代码，


Question: 发现个问题，gdb 附加进程调试是另开一个进程还是在当前进程？

引用 1 楼 zhao4zhong1 的回复:八成B进程开了单独的线程接收数据。 引用 3 楼 coding_hello 的回复:attach的进程是同一个进程，不会新开。至于在收数据，就是上面说的，有个单独线程在接收。  去百度了解下调试器的原理和程序执行的原理吧  确实没有新开进程，用codeblocks的gdb时还会将原程序停掉。

ps一下就知道了。 gdb有自己的进程，它通过ptrace接口去调试其他进程。

八成B进程开了单独的线程接收数据。


Question: C语言typedef用法求助

啟用別名，使用一個一個別名替代一個比較長的類型名稱

创建一个新的数据类型：类型名字是SCROLLINFO ，类型： CONST *LPCSCROLLINFO 以后你想声明或定义类型是 CONST *LPCSCROLLINFO的变量时，直接使用名字SCROLLINFO 声明或定义该类型变量即可。  参考资料：《K&R》 Besides purely aesthetic issues, there are two main reasons for using typedefs. The first is to parameterize a program against portability problems. If typedefs are used for data types that may be machine-dependent, only the typedefs need change when the program is moved. One common situation is to use typedef names for various integer quantities, then make an appropriate set of choices of short, int, and long for each host machine. Types like size_t and ptrdiff_t from the standard library are examples. The second purpose of typedefs is to provide better documentation for a program - a type called Treeptr may be easier to understand than one declared only as a pointer to a complicated structure

typedef typedef type-declaration synonym;  The typedef keyword defines a synonym for the specified type-declaration. The identifier in the type-declaration becomes another name for the type, instead of naming an instance of the type. You cannot use the typedef specifier inside a function definition.  A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.  Example  // Example of the typedef keyword typedef unsigned long ulong;  ulong ul;     // Equivalent to "unsigned long ul;"  typedef struct mystructtag {    int   i;    float f;    char  c; } mystruct;  mystruct ms;   // Equivalent to "struct mystructtag ms;"  typedef int (*funcptr)();  // funcptr is synonym for "pointer                            //    to function returning int"  funcptr table[10];   // Equivalent to "int (*table[10])();"

给类型SCROLLINFO CONST *起个别名LPCSCROLLINFO

typedef   len_t  unsigned int len_t  length; //等价于 unsigned int  length;

typedef是type define的简写，其实就是启别名。 有了这句typedef SCROLLINFO CONST *LPCSCROLLINFO;此后LPCSCROLLINFO可以代表SCROLLINFO CONST *定义新的变量……


Question: C语言定义的结构体存放在内存的什么区域？

b是在  栈区！

struct test {         int a; }    这样还没在内存中开辟控件,包括任何内存都没  struct test  t1;//这个是在栈区 struct test * t2 = (struct test *)malloc(sizeof(struct test));//堆区

静态区吧应该是

符号表

那你说int放在哪里

类型定义(没有成员函数),编译的时候,放在 编译器的符号表里,如果这个类型既没有静态成员变量, 也没有定义变量常量(包括引用) ,也没有被函数使用(不是函数参数表中某个参数类型的一部分), 没有用来定义其他类型的成员变量(常量) 且不是一个嵌套类的成员 那么编译后的代码中, 一般不会包含这个类型的信息. 也就是说符号表这部分,可能会被丢弃  结构定义也是一种类型定义. 类型定义本身.相当于声明

没得结构体这个说法了

理解和讨论之前请先学会如何观察！  可以参考gcc源代码相关片断。

引用 3 楼 user-8 的回复:在编译之后，没有这个结构的存在。 就算被引用了，也没有这个结构存在，仅仅存在这个结构描述的内存布局，也就是说如何依据指向结构的指针如何取得成员的指针。而这个布局被内嵌到成语的代码中。 struct test {         int a; } struct test2 {         int a; } 她们在编译之后是一致的。仅仅是内存的一个布局，影响到如何获取成员的偏移量。 但是在一个地方他们是不一致的，那就是调试符号。 也就是说定义一个结构体，只是告诉编译器结构体变量内部的布局。并不会生成在实际的代码或内存中？

引用 1 楼 user-8 的回复:放在编译器的编译的源码里面。 我说的是，编译运行之后

放在编译器的编译的源码里面。


Question: 在online judege上做了一道题，说是有一个测试点没有通过，实在找不到问题出在哪了

“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

引用 1 楼 user-2 的回复:for(i=0;i<n;i++) {    if(A[i+1]==A[i])  运行到i=n-1的时候 你i+1是不是数组越界了？ 竟然是这么个小问题！泪奔，非常感谢你！！！

竟然是这么个小问题！泪奔，非常感谢你！！！