Question: while后边的分号作用

while后面是要加代码块的，一对大括号或者是一条语句。while后面加一个 ；号的意思意思就是while后面接了一条空语句。空语句就是只有一个 ； 号，其他的什么都没有的那种语句，表示什么都不做。PS：LZ，我最近在攒积分，求LZ给点积分

二楼是亮点……

二楼说出了答案

#define XXX(a,b) do { \     a = b; \     } while(0);

while (  expression )  statement///如果直接是；说明执行空的statement

大家一起努力吧，把它顶成热帖！

不循环了呗,没有循环体,这句应该没啥用

空语句。。。

这是把需要循环的部分放到了括号里执行，代码不易让人看懂，可以说有利有弊吧

类似的 if (XXX); else ...

空语句，啥不都不执行  顺便膜拜2L

一条空语句

引用 5 楼 mymtom 的回复:while (  expression )  statement哇，双蛋刀！

while (  expression )  statement

有分号就是因为不需要或者没有循环体；一般是将循环体集成到判断条件里了，楼主这个就是这种情况；

引用 2 楼 zxhuser-14 的回复:二楼正解。。 2L就是那么自信

二楼正解。。

结束循环体，如果没有分号，下一行printf将被认为是循环体的一部分


Question: 24点游戏

表示很无力 不会在easyx里面做  不会显示扑克牌

洗牌算法参考 #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

参考MSDN98\SAMPLES\VC98\SDK\COM\ACTIVEXCONTROL\BASECTL\CARD\*.*  http://bbs.csdn.net/topics/380157851

这个不难。。。 只会c的路过。。。


Question: C语言将小图插入Qr码图形中心出错，原因是小图WIDTH不是4的倍数，求解！

更正：(bmpWidth*bibitCount/8+3)/4*4-bmpWidth*3;

晕 k+=(bmpWidth+3)/4*4-bmpWidth;

引用 2 楼 user-2 的回复:图像一行占的字节数必须是4的倍数，如果不是的话需要在尾部补齐，否则就会出现错位  同意楼上说法。还有个更简单的解决方法，但稍有损失，只是对于在Qr码中贴图，无所谓了。具体的做法是处理WIDTH向的for循环中有个k变量，指示pBmpBuf当前位置，循环结束后，让k跳过补齐位即可。  unsigned char* p; for(i=0; i<bmpHeight; i++) { 　　for(j=0; j<bmpWidth; j++) 　　{ 　　　　p = pBmpBuf + k;   　　　　/// 更新数据到旧BMP 　　　　set_pixel(x+j,y+i,*(p+2),*(p+1),*(p));/// x,y为叠加位置   　　　　k+=3; 　　} 　　k+=(sminfo.width+3)/4*4-sminfo.width; }

图像一行占的字节数必须是4的倍数，如果不是的话需要在尾部补齐，否则就会出现错位

图像一行占的字节数必须是4的倍数，如果不是的话需要在后面补齐，否则就会出现错位


Question: 谁能帮我看下这段代码，书上关于静态变量的课后题

#include <stdio.h> int  square (int i)  {  return i*i;  }  void main()  {  int i=0;  i=square(i);  for (;i<3;i++)  {  static int i=1;  i+=square(i);  printf("%d\t",i);  }  printf("\n");  }

1. +=与 =+ 2. 少了个；和“\n” 3. 没有renturn  结果2，6，42； 1 + 1*1； 2+ 2*2；6+6*6；

围观。。。。

这不是误人子弟吗？无语啊

哈工大苏小红编的，哎 ~

这个课本误人哪，这个循环控制，里面又是修改控制变量，自己又要累加。 你这到底是什么课本啊？？？换一个吧

引用 3 楼 xpdavis 的回复:还有，你这里2个i，外层的i应该起名叫sum比较合适一点 这个是书上课本后的题    我自己的话 肯定不会把代码搞成这样

还有，你这里2个i，外层的i应该起名叫sum比较合适一点

i+=square（i）

i=+square(i); 还是 i+=square(i); ？？？


Question: 用ADOX创建mdb数据库

引用 2 楼 jiangsheng 的回复:ADOX不支持托管代码 .Net程序应该使用ADO.Net 话说回来你的程序难道是数据库设计器么？安装程序里带一个数据库不是什么问题。 谢谢您，问题已经解决了。。。

引用 1 楼 zhaowech 的回复:搜索ADO2，这是一个已经封装好的类库，应该更好用 十分感谢您，问题已经解决了

搜索ADO2，这是一个已经封装好的类库，应该更好用


Question: 新手提问

直接用   char  num=0xFF;  char data;  for(i=1;i<=8; i++)  {  data&(num-1);  }  从低到高想要哪位取哪位！  仅供参考  说错了，应该是  char  num=0xFF;  char data;  for(i=1;i<=8; i++)  {  data|(num<<i);  }  大概思路是这样，没有细细思考，如有问题请指正！

看一下位运算那章。。。

仅供参考#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des);     r = READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3


Question: 如何编写C语言程序遍历pagefil.sys和Hiberfil.sys两个文件？

将Windows放在虚拟机里面运行，在虚拟机外就可以读取这两个文件了。我猜。

引用 2 楼 zhao4zhong1 的回复:虚拟机 知道赵老师很忙，但是我真是刚刚接触这个，理解不过来，能不能说的再详细点点。指明清楚问题思路，我好更确切的去百度或谷歌来解决问题，谢谢了哈！

楼上。。。。

虚拟机

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。


Question: 【新手求教】能不能帮我看下这个有什么问题呢，数据结构，一元多项式相加

真心谢谢大家，正在看，正在学习

引用 4 楼 cc946079647 的回复: #include<stdio.h> #include<malloc.h> #include<stdlib.h>  typedef struct Polynode { 	int coef; 	int exp; 	struct Polynode *next; }Polynode,*Polylist;  void polycreate(Polynode **p,int m) {    	Polynode *head,*s; 	head=(Polynode*)malloc(sizeof(Polynode)); 	head->next=NULL; 	int c,e,i; 	for(i=0;i<m;i++) 	{ 		printf("请输入多项式的系数以及指数.\n"); 		scanf("%d,%d",&c,&e); 		if(c!=0) 		{ 			s=(Polynode*)malloc(sizeof(Polynode)); 			s->coef=c; 			s->exp=e; 			s->next=head->next; 			head->next=s; 		} 	} 	*p=head; }  void polyadd(Polylist polya,Polylist polyb) { 	Polynode *p,*q,*tail,*temp; 	int sum; 	p=polya->next; 	q=polyb->next; 	tail=polya; 	while(p!=NULL&&q!=NULL) 	{ 		if(p->exp<q->exp) 		{tail->next=p;tail=p;p=p->next;} 		else if(p->exp==q->exp) 		{    sum=p->coef+q->coef; 		if(sum!=0) 		{    p->coef=sum; 		tail->next=p;tail=p; 		p=p->next; 		temp=q;q=q->next;free(temp); 		} 		else 		{    temp=p;p=p->next;free(temp); 		temp=q;q=q->next;free(temp); 		} 		} 		else 		{tail->next=q;tail=q;q=q->next;} 	} 	if(p!=NULL) 		tail->next=p; 	else 		tail->next=q; }  void print(Polynode *p) { 	while(p->next!=NULL) 	{    		p=p->next; 		printf("%dx^%d",p->coef,p->exp); 	} }   void main() { 	Polylist pa=NULL; 	Polylist pb=NULL; 	int n,m; 	printf("请输入多项式pa项数：\n"); 	scanf("%d",&m); 	polycreate(&pa,m); 	print(pa); 	printf("\n"); 	printf("请输入多项式pb的项数：\n"); 	scanf("%d",&n); 	polycreate(&pb,n); 	print(pb); 	printf("\n"); 	polyadd(pa,pb); 	print(pa); }   注意，想要在polycreate内部修改pa，要用指向Polynode指针的指针

#include<stdio.h> #include<malloc.h> #include<stdlib.h>  typedef struct Polynode {     int coef;     int exp;     struct Polynode *next; }Polynode,*Polylist;  void polycreate(Polynode *p,int m)//参数p传入函数后就没有用过 {        Polynode *head,*rear,*s;     int c,e,i;     head=(Polynode*)malloc(sizeof(Polynode));     rear=head; for(i=0;i<m;i++) { printf("请输入多项式的系数以及指数.\n");     scanf("%d,%d",&c,&e);     while(c!=0)//这是一个死循环，已经有for了还需要这个东西吗？     { s=(Polynode*)malloc(sizeof(Polynode)); s->coef=c; s->exp=e; rear->next=s; rear=s; scanf("%d,%d",&c,&e);     }     rear->next=NULL; } }  void polyadd(Polylist polya,Polylist polyb) {     Polynode *p,*q,*tail,*temp;     int sum;     p=polya->next;     q=polyb->next;     tail=polya;     while(p!=NULL&&q!=NULL)     { if(p->exp<q->exp)     {tail->next=p;tail=p;p=p->next;} else if(p->exp==q->exp) {    sum=p->coef+q->coef;     if(sum!=0) {    p->coef=sum;      tail->next=p;tail=p;      p=p->next;      temp=q;q=q->next;free(temp); }     else     {    temp=p;p=p->next;free(temp);  temp=q;q=q->next;free(temp);     } } else     {tail->next=q;tail=q;q=q->next;}     }     if(p!=NULL) tail->next=p;     else tail->next=q; }  void print(Polynode *p) { while(p->next!=NULL) {    p=p->next; printf("%dx^%d",p->coef,p->exp); } }   void main() { Polylist pa,pb;定义了二个空指针，却不分配内存 int n,m; printf("请输入多项式pa项数：\n"); scanf("%d",&m); polycreate(pa,m); print(pa); printf("\n"); printf("请输入多项式pb的项数：\n"); scanf("%d",&n); polycreate(pb,n); print(pb); printf("\n"); polyadd(pa,pb); print(pa); } 错的地方太多了，自己好好重新写一个吧

引用 1 楼 cc946079647 的回复:polycreate(pa,m); 声明是传地址吧。。这里应该是polycreate(&pa,m); 看错了。。


Question: 种子

这题目起的，你要问随机种子就问随机种子。。。。。。

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

请加上随机数种子。害我不纯洁了一把。

int main() {   int i; //  srand(time(NULL));  // 如果不加这一句，每次运行的结果都一样。加上之后每次就都不一样了。   for (i=0; i < 10; i++) {     printf("%d  ", rand());   }   return 0; }

c语言的随机数函数，其实是所谓"伪随机数"，每次调用随机数函数rand()，返回的值都是从上一次的返回值算出来的。最开始的头一个值就叫“种子”，从种子开始然后产生一系列的随机数。如果用同一个种子，产生的一系列随机数就都是一样的。所以调用随机数函数之前，都要一次性的设置一个不同的种子，用time(0)就是一个简单有效的办法


Question: 关于#if defined和#ifdef

参考gcc源代码中实现这两个条件编译指令的源代码相关片断。

#ifdef _ABC_ //... #else //... #endif  //或者 #ifndef _ABC_ #define _ABC_  #endif  貌似用的多都是在防止文件的重复包含

引用 3 楼 xpdavis 的回复:#if defined后面还可以加上其它的defined #ifdef 只能有一个here you go


Question: 如何使用ioctl命令控制SCSI设备？

仅供查看收发的每个字节的原始值使用：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

sprintf(driver,"\\\\.\\%s:","H");  // 	 		 hUDisk = CreateFile(driver, GENERIC_READ | GENERIC_WRITE,  			 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING,0,NULL);   		 if (hUDisk ==INVALID_HANDLE_VALUE)  		 { 			 printf("INVALID_HANDLE_VALUE\n");  			 return false; 		 } 		 memset(&sptdwb,0, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER)); 		 sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); 		 sptdwb.sptd.PathId = 0; 		 sptdwb.sptd.TargetId = 1;    		 sptdwb.sptd.Lun = 0;  		 sptdwb.sptd.CdbLength = 16; 		 sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN; 		 sptdwb.sptd.SenseInfoLength = 24; 		 sptdwb.sptd.DataTransferLength = 10;  		 sptdwb.sptd.TimeOutValue = 2; 		 sptdwb.sptd.DataBuffer = bufDataRead;  		 sptdwb.sptd.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf);  		 sptdwb.sptd.Cdb[0] = 0x40 ;   //MODE SENSE[6] 		 sptdwb.sptd.Cdb[1] = 0x56 ;  		 sptdwb.sptd.Cdb[2] = 0x65 ; 		 sptdwb.sptd.Cdb[3] = 0x3b ; 		 sptdwb.sptd.Cdb[4] = 0x38 ; 		 sptdwb.sptd.Cdb[5] = 0x3b ;   		 sptdwb.sptd.Cdb[6] = 0x31 ;  		 sptdwb.sptd.Cdb[7] = 0x32 ;  		 sptdwb.sptd.Cdb[8] = 0x33;  		 sptdwb.sptd.Cdb[9] = 0x34 ;  		 sptdwb.sptd.Cdb[10] = 0x35 ;  		 sptdwb.sptd.Cdb[11] = 0x36 ;  		 sptdwb.sptd.Cdb[12] = 0x37 ;  		 sptdwb.sptd.Cdb[13] = 0x38 ;  		 sptdwb.sptd.Cdb[14] = 0x3b ; 		 sptdwb.sptd.Cdb[15] = 0x23 ;;    		 length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER); 		 printf("length=%d\n",length);  		 ret  = DeviceIoControl(hUDisk, 			 IOCTL_SCSI_PASS_THROUGH_DIRECT, 			 &sptdwb, 			 length, 			 &sptdwb, 			 length, 			 &bytesReturn, 			 NULL);  转成Linux的

InitCmdPacket(CMD_TEST_CONNECTION, m_bySrcDeviceID, m_byDstDeviceID, NULL, 0);           SEND_COMMAND(CMD_TEST_CONNECTION, w_bRet, m_bySrcDeviceID, m_byDstDeviceID);   能否把你的这些参数也贴出来呢？ 我现在需要给U盘 scsi 命令。

LS。

引用 1 楼 lovesmiles 的回复:完全可以，要是你下一步问“怎么实现？”，我也不知道。协议都是公开的，相信只要参考win32和android的代码改就可以了。 就是参考了Windows下的代码，还是不行，现在完全不知道如何下手了


Question: 难以理解的+=符号使用错误

for(i = 0; i < ATM; i++){         fgets(buf, 82, fp);          //strcpy(head[i], buf);         strncpy(head[i],buf,30);head[i][30]=0;//改为这样          *(*head + i*31 + 30) = 0;         sscanf(buf + 30, "%lf%lf%lf", A + 3 * i, A + 3 * i + 1, A + 3 * i + 2);         p[0] += *(A + 3 * i);         p[1] += *(A + 3 * i + 1);         p[2] += *(A + 3 * i + 2);         printf("%d  %f  %f\n", i, *(A+3*i), p[0]);     }

strcpy(head[i], buf); 这一行写head内存区越界了，恰好影响到紧随其后的 p ,  q 等变量。                  strncpy(head[i], buf,  30) ; head[i][30] = 0;

#include <mkl.h> 这个文件在哪？ 要上传就整个工程上传上来，有什么库的，头文件的。

strcpy 是依据 \0 作为结束判断的


Question: 关于文件拷贝的问题

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

引用 3 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。  为什么if (atoi(getc(frd)))会显示段错误，我是想取出文本中的数字 还有您这段代码有可能a=fgetc(f)就不满足条件啊为什么还要先执行它  while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

引用 1 楼 xpdavis 的回复:文本文件不要用fseek ftell 直接判断fgetc返回值是不是EOF，即为文件结束了 丢字符的原因已经找到了，是调用了两次fget，取到了下一个字符。 你说的文本文件不要用fseek ftell什么意思，那这个是用在哪里的，谢谢


Question: WINDOWS下Fortran与c混合编译环境搭建

引用 3 楼 dbzhang800 的回复:[quote=引用 楼主 npu123456 的回复:] 要进行windows下Fortran和C语言的混合编程，但是之前没有接触过，不知道如何搭建编译环境，也不知道如何操作。有一段是C和fortran互相调用的程序，在linux下已运行通过，现在需要在windows编译。自己有使用visual studio开发的经验。 编译环境如何搭建？ linux和windows中C调用Fortran的语法相同吗？ 求指点，尽量详细些，谢谢！  如果你用VS的话：应该是，购买了微软的Visual Studio，又买了因特尔的Fortran编译器配合使用吧？这些商业版的东西应该有技术支持的。  如果你既然linux下编译通过了，在Windows下，为什么不继续用GCC中的c和fortran编译器呢？[/quote]  没有很好的界面不太方便调试啊，感觉还是visual studio爽一些，虽然可能没那么高的分辨率吧。

引用 楼主 npu123456 的回复:要进行windows下Fortran和C语言的混合编程，但是之前没有接触过，不知道如何搭建编译环境，也不知道如何操作。有一段是C和fortran互相调用的程序，在linux下已运行通过，现在需要在windows编译。自己有使用visual studio开发的经验。 编译环境如何搭建？ linux和windows中C调用Fortran的语法相同吗？ 求指点，尽量详细些，谢谢！  如果你用VS的话：应该是，购买了微软的Visual Studio，又买了因特尔的Fortran编译器配合使用吧？这些商业版的东西应该有技术支持的。  如果你既然linux下编译通过了，在Windows下，为什么不继续用GCC中的c和fortran编译器呢？

不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

围观，，，，


Question: 本人菜鸟一枚，自学Linux c中，简单的链表程序却不停出错，求解。

仅供参考  //LinkList.h #ifndef LINKLIST_H_ #define LINKLIST_H_  #ifndef constant #define constant  #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2  #include <stdlib.h> typedef int Status;  #endif /* constant */  typedef int LLElemType;  typedef struct LNode{ 	LLElemType data; 	struct LNode *next; }LNode,LinkList;  Status InitList_Link(LinkList **L); Status CreateListF_Link(LinkList **L,LLElemType elem[],int n); LinkList* CreateListFF_Link(LLElemType elem[],int n); Status CreateListR_Link(LinkList **L,LLElemType elem[],int n); LinkList* CreateListRR_Link(LLElemType elem[],int n); Status DestroyList_Link(LinkList *L); Status ClearList_Link(LinkList *L); int EmptyList_Link(LinkList *L); int LengthList_Link(LinkList *L); Status GetElem_Link(LinkList *L,int i,LLElemType *e); int LocateElem_Link(LinkList *L,LLElemType e); Status InsertList_Link(LinkList *L,int i,LLElemType e); Status DeleteList_Link(LinkList *L,int i,LLElemType *e);  #endif /* LINKLIST_H_ */  //LinkList.c #include "LinkList.h"  Status InitList_Link(LinkList **L){ 	*L=(LinkList *)malloc(sizeof(LinkList)); 	(*L)->next=NULL; 	return OK; }  Status CreateListF_Link(LinkList **L,LLElemType elem[],int n){ 	LNode *p; 	int i; 	*L=(LinkList *)malloc(sizeof(LinkList)); 	(*L)->next=NULL; 	for(i=0;i<n;i++){ 		p=(LNode *)malloc(sizeof(LNode)); 		p->data=elem[i]; 		p->next=(*L)->next; 		(*L)->next=p; } 	return OK; }  LinkList* CreateListFF_Link(LLElemType elem[],int n){ 	LNode *head,*p; 	int i; 	head=(LinkList *)malloc(sizeof(LinkList)); 	head->next=NULL; 	for(i=0;i<n;i++) 	{ 		p=(LNode *)malloc(sizeof(LNode)); 		p->data=elem[i]; 		p->next=head->next; 		head->next=p; 	} 	return head; }  int CreateListR_Link(LinkList **L,LLElemType elem[],int n){ 	LNode *p,*q; 	int i; 	*L=(LinkList *)malloc(sizeof(LinkList)); 	p=*L; 	for(i=0;i<n;i++){ 		q=(LNode *)malloc(sizeof(LNode)); 		q->data=elem[i]; 		p->next=q; 		p=q; 	} 	p->next=NULL; 	return OK; }  LinkList* CreateListRR_Link(LLElemType elem[],int n){ 	LNode *head,*p,*q; 	int i; 	head=(LinkList *)malloc(sizeof(LinkList)); 	p=head; 	for(i=0;i<n;i++){ 		q=(LNode *)malloc(sizeof(LNode)); 		q->data=elem[i]; 		p->next=q; 		p=q; 	} 	p->next=NULL; 	return head; }  Status DestroyList_Link(LinkList *L){ 	LNode *p,*q; 	p=L;q=p->next; 	while(q!=NULL){ 		free(p); 		p=q; 		q=q->next; } 	free(p); 	return OK; }  Status ClearList_Link(LinkList *L){ 	LNode *p,*q; 	p=L; 	while(p->next!=NULL){ 		q=p->next; 		p->next=q->next; 		free(q); } 	return OK; }  int EmptyList_Link(LinkList *L){ 	return L->next==NULL; }  int LengthList_Link(LinkList *L){ 	int n=0; 	LNode *p=L; 	p=p->next; 	while(p!=NULL){ 		n++; 		p=p->next; 	} 	return n; }  Status GetElem_Link(LinkList *L,int i,LLElemType *e){ 	int n=0; 	LNode *p; 	if(i<1 ||i>LengthList_Link(L)) return ERROR; 	p=L->next; 	while(p!=NULL){ 		if ((n++)==i-1) 			*e=p->data;    p=p->next; 	} 	return OK; }  int LocateElem_Link(LinkList *L,LLElemType e){ 	LNode *p; 	int n=0; 	p=L->next; 	while(p!=NULL){ 		n++; 		if(e==p->data) 			return n; 		else 			p=p->next; 	} 	return 0; }  Status InsertList_Link(LinkList *L,int i,LLElemType e){ 	int n=0; 	LNode *p,*q; 	if(i<1 || i>LengthList_Link(L)+1) return ERROR; 	p=L; 	while(n<i-1 && p!=NULL){ 		n++; 		p=p->next; } 	q=(LNode *)malloc(sizeof(LNode)); 	q->data=e; 	q->next=p->next; 	p->next=q; 	return OK; }  Status DeleteList_Link(LinkList *L,int i,LLElemType *e){ 	int n=0; 	LNode *p,*q; 	if(i<1 || i>LengthList_Link(L)) return ERROR; 	p=L; 	while(n<i-1 && p!=NULL){ 		n++; 		p=p->next; 	} 	q=p->next; 	p->next=q->next; 	*e=q->data; 	free(q); 	return OK; }  //mainTest.c #include "LinkList.h" #include <stdio.h> int main(){ 	LinkList *L; 	int i; 	LLElemType ee; 	InitList_Link(&L); 	for(i=0;i<10;i++){ 		InsertList_Link(L,(i+1),2*i+1); 	} 	GetElem_Link(L,1,&ee); 	printf("%d\n",ee); 	printf("%d\n",LengthList_Link(L)); 	DestroyList_Link(L); 	return 0; }

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

实参中L本身为地址,&L为地址的地址,

我编程很少，而且对链表部分很不熟，我看的那本书上说的是形参部分为：Linklist &L，我觉得他这样做不对，形参应该匹配实参，而实参传递的是一个地址Linklist（&L），所以形参必为一个指针接受实参传递的“值”，这样理解对吗？

我刚自己学了会单链表，我把我代码也帖出来吧，看看有没有用。#include <iostream> using namespace std; #include <ctime>  //链表的数据准备 typedef struct ListNode  { 	int n_nkey; 	ListNode * pNext; }Node;  //追加结点：首先分配内存空间，保存新增的结点 //			从头指针head开始逐个检查，直到找到最后一个结点 //			将表尾结点的地址设置为新增结点的地址 //			将新增结点的地址部分设置为空地址null,即新结点成为表尾 Node * NodeAdd(Node * head,int n) { 	Node * p1,* p2; 	if (!(p1 = new Node[sizeof(Node)])) 	{ 		cout<<"申请内存失败！\n"; 		return NULL; 	}else 	{ 		//把p1设置成表尾 		p1->n_nkey = n; 		p1->pNext = NULL; 		if (head == NULL)//头指针 		{ 			head = p1; 			return head; 		} 		p2 = head; 		//查找链表的末尾 		while (p2->pNext != NULL) 		{ 			p2 = p2->pNext; 		} 		p2->pNext = p1; 		return head; 	} }  //插入头结点：首先分配内存空间，保存新增的结点 //			使新增结点指向头指针head所指向的结点 //			然后使头指针head指向新增结点 Node * NodeAddFirst(Node *head,int n) { 	Node * p1; 	if (!(p1 = new Node[sizeof(Node)])) 	{ 		cout<<"申请内存失败!\n"; 		return NULL; 	}else 	{ 		p1->n_nkey = n; 		//指向头指针所指结点 		p1->pNext = head; 		//头指针指向新增结点 		head = p1; 		return head; 	} }  //查找结点 Node * FindNode(Node * head,int key) { 	Node * pTemp; 	//保存链表头指针 	pTemp = head; 	while (pTemp)	//若结点有效，则进行查找 	{ 		if (pTemp->n_nkey == key)	//诺结点关键字与传入关键字相同 		{ 			return pTemp; 		} 		pTemp = pTemp->pNext; 	} 	return NULL; }  //插入结点:首先分配内存空间，保存新增结点 //			找到要插入的逻辑位置，也就是位于哪两个结点之间 //			修改插入位置结点的指针，使其指向新增结点，而使新增结点指向原插入位置所指向的结点 Node * InsertNode(Node *head,int findkey,int n) { 	Node * p1,*p2; 	//分配保存结点的内容 	if (!(p1 = new Node[sizeof(Node)])) 	{ 		cout<<"申请内存失败!\n"; 		return NULL; 	} 	p1->n_nkey = n; 	p2 = FindNode(head,findkey); 	if (p2)//成功找到结点 	{ 		p1->pNext = p2->pNext; 		p2->pNext = p1; 	}else 	{ 		cout<<"未找到正确的插入位置!\n"; 		delete [] p1; 	} 	return head; }  //删除结点:查找到需要删除的结点 //			使前一结点指向当前结点的下一结点 //			删除结点。 int DeleteNode(Node *head,int key) { 	Node *p1,*p2;					//p1保存删除结点的前一结点 	p2 = head; 	p1 = head; 	while (p2) 	{ 		if (p2->n_nkey == key) 		{ 			p1->pNext = p2->pNext; 			delete p2; 			return 1; 		}else 		{ 			p1 = p2; 			p2 = p2->pNext; 		} 	} 	return 0; }  //计算链表长度 int NodeLength(Node *head) { 	Node *pTemp; 	int Len =0; 	pTemp = head; 	while (pTemp)	//遍历整个链表 	{ 		Len ++; 		pTemp = pTemp->pNext; 	} 	return Len; }  //显示所有结点 void ALLNode(Node * head) { 	Node * pTemp; 	int Num; 	pTemp = head; 	while (pTemp) 	{ 		Num	= pTemp->n_nkey; 		cout<<Num<<" "; 		pTemp = pTemp->pNext; 	} 	cout<<endl; }  //删除重复结点:先排序，然后如果相邻两个相等则删除后面哪个 Node * DeleteRepetitionNode(Node * head) { 	//对链表进行排序 	int nLen = NodeLength(head); 	Node *P1,*P2; 	P1 = head; 	if (nLen<2) 	{ 		return head; 	} 	//此时nLen不小于2，则p2 = p1.pNext存在 	for (int i=0;i<nLen;i++) 	{ 		P1 = head; 		while (P1->pNext != NULL) 		{ 			//两两比较 			P2 = P1->pNext; 			if (P1->n_nkey > P2->n_nkey) 			{ 				int temp = P1->n_nkey; 				P1->n_nkey = P2->n_nkey; 				P2->n_nkey = temp; 			} 			if (P2->pNext != NULL) 			{ 				P1 = P1->pNext; 			}else 			{ 				P1 = P1->pNext; 				break; 			} 		} 	} 	//删除重复数据，记得要更新p1 p2 	P1 = head; 	while (P1->pNext != NULL) 	{ 		//两两比较 		P2 = P1->pNext; 		if (P1->n_nkey == P2->n_nkey) 		{ 			//把第二个结点的指针赋值给前一个结点 			P1->pNext = P2->pNext; 			delete P2; 		}else 		{ 			P1 = P1->pNext; 		} 	} 	return head; } int main() { 	srand(time(0)); 	Node *node,*head = NULL; 	//通过追加结点的方式添加10个结点 	for (int i=0;i<10;i++) 	{ 		int N = rand()/1000; 		head = NodeAdd(head,N); 	} 	//显示所有结点 	ALLNode(head); 	//删除重复结点 	head = DeleteRepetitionNode(head); 	//显示所有结点 	ALLNode(head); 	return 0; }

应该是参数传递有问题，在创建链表的的参数里，应该传递L的地址，这样才能将链表的头结点得到，即需要L参数即是一个传入参数也需要是一个传出参数，或者另一种方式通过返回值。

不能老是以菜鸟作为借口，代码风格太差了，应该加强编码规范的学习。可以参考如下《C/C++语言编码规范》 http://blog.csdn.net/wenrenhua08/article/details/39591285

mark 迟点来看

仅供参考 http://yun.baidu.com/s/17yIcQ

我初次打的代码是和你说的一样的，但是出错，改了之后就不出错，所以。。。我看书多，却没练习，多谢提醒。

那么这个错误时怎么回事呢，大牛？

引用 2 楼 liangrongyao 的回复:那么问题又来了 liang@ubuntu:~$ gcc -g -o 1 ~/Desktop/创建链表.c /home/liang/Desktop/创建链表.c:8:27: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token /home/liang/Desktop/创建链表.c:13:29: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token liang@ubuntu:~$  这是改完之后的，而且我的LinkList是一个指向节点类型的指针，不是值传递吧？谢谢。  呵呵，你没搞懂什么叫值传递 ，LinkList是一个指针类型，如果你在函数内是要改变它所指向的值当然不叫值传递了，问题是你要改变是指针本身，这就是值传递。别要像书呆子一样以为只要传是指针就不是值传递了。

访问内存出错，因为你的参数是LinkList, 是值传递，你在函数内部改变它是没有意思的，函数结束后它就变回原值了。  将所有函数的参数 LinkList L 改成 LinkList &L


Question: 为什么Codeblocks里的注释字体方向会这样？见所未见。。。

引用 4 楼 akirya 的回复:字体前面加@符号 比如用 "@宋体" 这个字体就倒过来了 解决了，多谢大神指点！请收分，不谢~

字体前面加@符号 比如用 "@宋体" 这个字体就倒过来了

这是困为你的字体或者编码选择不对，我也遇到过这样的现象

引用 1 楼 lovesmiles 的回复:闻所未闻，不过word有这样的功能，将它放到Code编程器也不算什么。 百度一下，也不知道。。。

闻所未闻，不过word有这样的功能，将它放到Code编程器也不算什么。


Question: 关于变参宏的使用

#include <boost\preprocessor.hpp> 使用 BOOST 的 宏可以简单实现。 使用 KEYWORD_IS_VOID 可以区分是否存在返回值。 使用 REPEAT 可以实现参数的类型和变量的定义和使用。

引用 6 楼 mymtom 的回复:[quote=引用 3 楼 jwj070524 的回复:] 函数定义里面的参数列表和函数调用传入的参数列表不一样啊，一个有类型，一个没有。所以宏没法做啊。 ++[/quote] 就是有没有办法1个宏传入两组变参，第1组传入类型做包装函数的定义，第2组作为被包装参数的实参。

引用 3 楼 jwj070524 的回复:函数定义里面的参数列表和函数调用传入的参数列表不一样啊，一个有类型，一个没有。所以宏没法做啊。 ++

Collapse AllExpand All      Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript   Visual Basic C# Visual C++ J# JScript Visual C++ Language Reference  Variadic Macros  Example  See Also  Send Feedback     Variadic macros are function-like macros that contain a variable number of arguments.  Remarks To use variadic macros, the ellipsis may be specified as the final formal argument in a macro definition, and the replacement identifier __VA_ARGS__ may be used in the definition to insert the extra arguments. __VA_ARGS__ is replaced by all of the arguments that match the ellipsis, including commas between them.  The C Standard specifies that at least one argument must be passed to the ellipsis, to ensure that the macro does not resolve to an expression with a trailing comma. The Visual C++ implementation will suppress a trailing comma if no arguments are passed to the ellipsis.  Support for variadic macros was introduced in Visual C++ 2005.  Example   Copy Code  // variadic_macros.cpp #include <stdio.h> #define EMPTY  #define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } #define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); } #define CHECK3(...) { printf(__VA_ARGS__); } #define MACRO(s, ...) printf(s, __VA_ARGS__)  int main() {    CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");    CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n");   // won't print     CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n");   // won't print    CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");     // always invokes printf in the macro    CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");     MACRO("hello, world\n");    // MACRO("error\n", EMPTY);   would cause C2059 }     Copy Code  here are some varargs1(1) here are some varargs2(4) here are some varargs3(5) hello, world    See Also Concepts Macros (C/C++) Send feedback on this topic to Microsoft.

#define IRRELEVANT_CALLBACK(CallBack, Return, ...) \ Return ext_##CallBack(##__VA_ARGS__) \ { \    CallBack(##__VA_ARGS__); //对应的返回值好像不会返回吧。 }

Return ext_##CallBack(##__VA_ARGS__) \ { \    CallBack(##__VA_ARGS__); }  你看看你这代换进去什么东西

貌似宏定义没有变参的吧？？？


Question: 有没有哪个大神写过斗地主C语言版程序，使用#include "graphics.h"  /*图形系统头文件*/编程，毫无头绪呀

你们老师是古董中的极品,几十年前的东西还在搞

那你就去问老师。。。

这是我们算法分析上课用的，哎，坑，不懂

graphics.h 文件是很老的东西了，这个是TC编译才有的。你的代码估计也是TC代码，楼主放弃它吧。太过时了。


Question: libxml2库写xml文件，保存不了为utf-8格式 的文件，问题在哪儿呢？求指教

引用 2 楼 lovesmiles 的回复:#define MY_ENCODING "ISO-8859-1" 这个要不要改一下？   我记得那个xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);   换"UTF-8" 好像也不行。 不晓得到底哪儿有问题

引用 1 楼 BeanJoy 的回复:是不是没设置XML文件头？ xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL); 这句是什么意思，"ISO-8859-1"是什么意思？ 没用过libxml2，只是提出有疑问的地方。   我记得那个xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);   换"UTF-8" 好像也不行。 不晓得到底哪儿有问题


Question: break是跟最近的IF，还是for循环？

break只能用在switch和循环中,另外,程序有问题,if(buffer[0]='\0')这是赋值!

for 循环

只适用for  while  do-while

BREAK不能用在IF下，只能用在FOR下，除了SWITCH语句的特例

学习了，很游泳

單步調式就知道了

break是跳出循环和switch中的case选项，也只有这两个地方会用到break吧。

break可以用在选择结构的switch,不能用在if,break也可以用在循环结构， 所以，这个break,会中断for循环的执行。

break只能用在循环和switch语句里面，跟if-else无关  if ('\n' == buffer[0])   return ...

for(i=0;i<=n;i++)       if(!str_in(&pS[i]))       break; /* break是跟最近的IF，还是for循环? */      //是在if下，跳出for循环


Question: C语言 字符数组的ASCII 码问题

在国外学习？学到这个份上了，主要还是要靠自己，我以前这些课程全都是自学的

哎， 很努力的学， 无奈美帝老师讲的。。。哎 还是国内讲这些能把基础打扎实

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

while (list[i]!='\0')     {         printf("The ASC code for %c is %d", list[i],list[i]);         i++;     } 这个i没有从0开始的 还有，你输入list[i]之后，没有将最后一个置为'\0'，简单的，就直接输入整个字符串，用”%s“

#include <stdio.h> #include <string.h>  int minCharRead ( char list[], int listSize); int numAlphaCharRead ( char list[], int listSize); double avgCharRead ( char list[], int listSize);  int main() {     static char list[100];     int num[100];     int i, a, b,c,d;     printf("please type a character \n");      for (i=0;i<99;i++)     {         list[i] =  getchar();         printf("you just typed %c \n", list[i]);         num[i] = list[i];     if (i>=100)         printf("the max size for array is full");         break;     }      while (list[i]!='\0')     {         printf("The ASC code for %c is %d", list[i],list[i]);         i++;     }      printf("the minascii is \n");     a = minCharRead (list,d );     for (i=0;i<100;i++)         printf (" %d", a);      printf ("the number of  \n");    b = numAlphaCharRead(list, d);    //for (i=0;i<100;i++)         printf (" %d", b);      printf ("the ave is");     c = avgCharRead(list, d);     //for (i=0;i<100;i++)         printf (" %d", c);     return 0; }  int minCharRead(char list[], int listSize ) {     int i,j;     for (i=1; list[i]!= '\0' ;i++)         if ((int)list[0]< (int)list[i])          {              list [0] = list[i];             i++;          }     j= (int)list[0];     return j; }  int numAlphaCharRead(char list[], int listSize) {     int i;     listSize =0;     for (i=0; list[i]!= '\0' ;i++)         if ((list[i]>='A'&&list[i]<='Z')||(list[i]>='a'&&list[i]<='z'))              listSize++;         return listSize; }  double avgCharRead(char list[], int listSize) {     double avg;     int sum,i;     sum=0;     for (i=0;i<100;i++)         sum+=(int)list[i];         avg = sum / i;     return avg; }      结果不太对，比如我输入多个字母进去，只能显示第一个char的

a = minCharRead (x,d ); 直接传list就好     a = minCharRead (list,d );

#include <stdio.h> #include <string.h>  int minCharRead ( char list[], int listSize); int numAlphaCharRead ( char list[], int listSize); double avgCharRead ( char list[], int listSize);  int main() {     static char list[100];     int num[100];     int i, a, b,c,d;     char x;     printf("please type a character \n");      for (i=0;i<99;i++)     {         list[i] =  getchar();         printf("you just typed %c \n", list[i]);         num[i] = list[i];     if (i>=100)         printf("the max size for array is full");         break;     }      while (list[i]!='\0')     {         printf("The ASC code for %c is %d", list[i],list[i]);         i++;     }      x= list[i];     printf("the minascii is ");     a = minCharRead (x,d );     for (i=0;i<100;i++)         printf (" %d", a);      printf ("the number of  ");     b = numAlphaCharRead(x, d);    for (i=0;i<100;i++)         printf (" %d", b);      printf ("the ave is");     c = avgCharRead(x, d);     for (i=0;i<100;i++)         printf (" %d", c);     return 0; }  int minCharRead(char list[], int listSize ) {     int i,j;     for (i=1; list[i]!= '\0' ;i++)         if ((int)list[0]< (int)list[i])          {              list [0] = list[i];             i++;          }     j= (int)list[0];     return j; }  int numAlphaCharRead(char list[], int listSize) {     int i;     listSize =0;     for (i=0; list[i]!= '\0' ;i++)         if ((list[i]>='A'&&list[i]<='Z')||(list[i]>='a'&&list[i]<='z'))              listSize++;         return listSize; }  double avgCharRead(char list[], int listSize) {     double avg;     int sum,i;     sum=0;     for (i=0;i<100;i++)         sum+=(int)list[i];         avg = sum / i;     return avg; }   改了一下，但是还是不对，我需要在哪里修改呢 ？ 谢谢你

如果你要找到所有元素里面最小的，某种类型的东西有多少，都是需要循环的 这在数据库方面叫做聚集函数，即该函数不是针对某个个体的，而是群体的

主函数里往 list【 】写char 进去的时候使用了循环。  下边三个子函数里是否也要用循环呢，我看了好多例子还是比较蒙，刚刚入门，请指教，谢谢

你的函数调用没什么问题啊，就是在编写函数上面发蒙 其实你编写函数，跟main里面差不多的定义变量做法就可以了啊

我不懂函数怎么用，所以在变量使用上完全蒙的

avgCharRead貌似还OK 另外2个，承诺的循环哪去了？

看了好多资料，照猫画虎的code，不working。。。  #include <stdio.h> #include <string.h>  int minCharRead ( char list[], int listSize); int numAlphaCharRead ( char list[], int listSize); double avgCharRead ( char list[], int listSize);  int main() {     static char list[50];     int num[50];     int i, a, b,c,d;     char x;     printf("please type a character \n");      for (i=0;i<49;i++)     {         list[i] =  getchar();         //scanf("%c",&list[i]);         printf("you just typed %c \n", list[i]);         num[i] = list[i];     if (i>=50)         printf("the max size for array is full");         break;     }      while (list[i]!='\0')     {         printf("The ASC code for %c is %d", list[i],list[i]);         i++;     }      x= list[i];     printf("the minascii is ");     a = minCharRead (x,d );     //for (i=0;i<50;i++)         printf (" %d", a);      printf ("the number of  ");     b = numAlphaCharRead(x, d);    for (i=0;i<50;i++)         printf (" %d", b);      printf ("the ave is");     c = avgCharRead(x, d);     for (i=0;i<50;i++)         printf (" %d", c);     return 0; }  int minCharRead(char list[], int listSize ) {     int i=1,j;         if ((int)list[0]< (int)list[i])          {              list [0] = list[i];             i++;          }     j= (int)list[0];     return j; }  int numAlphaCharRead(char list[], int listSize) {     int i;     listSize =0;    // for (i=0; list[i]!= '\0' ;i++)     if ((list[i]>='A'&&list[i]<='Z')||(list[i]>='a'&&list[i]<='z'))              listSize++;         return listSize; }  double avgCharRead(char list[], int listSize) {     double avg;     int sum,i;     sum=0;     //int number[i];     for (i=0;i<50;i++)         sum+=(int)list[i];         avg = sum / i;     return avg; }

for (i=0;i<100;i++)         scanf("%c",&list[i]); list只有50个字符，你循环却是100，立马越界 输入字符串用%s 既然你都会写循环了，这些函数都是单循环搞定的，还写不出来吗？

加我好友,我也新手!


Question: 我想任意输入5个字符串存放到指针数组name[]中，然后输出这些字符串，但上面的方法不行，要怎么样才可以实现？

哦哦 这样啊 谢谢啊

引用 楼主 qq_21938717 的回复:char* name[5];  你这5个指针都没有分配空间，要用malloc和free分配和释放空间


Question: 在线等，急+++++求指导

引用 3 楼 cs290473786 的回复:没有具体测试。 #include <iostream> #include <fstream> #include <stack> using namespace std;  struct CharInfor { 	int row; 	int column; 	int type;//0表示'('，1表示')' };  int main() { 	fstream fileStream; 	fileStream.open("aa.cpp", ios::in);  	stack<CharInfor> charStack; 	char readChar; 	int nowRow = 0; 	int nowColumn = 0; 	CharInfor tempInfor; 	while (fileStream.read(&readChar, 1)) 	{ 		nowColumn++; 		tempInfor.column = nowColumn; 		tempInfor.row = nowRow; 		if (readChar == '(') 		{ 			tempInfor.type = 0; 			charStack.push(tempInfor); 		} 		if (readChar == ')') 		{ 			tempInfor.type = 1; 			if (charStack.empty()) 			{ 				break; 			} 			charStack.pop(); 		} 		if (readChar == '\n') 		{ 			nowColumn = 0; 			nowRow++; 		} 	} 	if (fileStream.eof() == true) 	{ 		if (charStack.size() > 0) 		{ 			cout << "(错误:" << charStack.top().row << "行" << charStack.top().column << "列" << endl;//只显示了一个 		} 		else 		{ 			cout << "正常" << endl; 		} 	}  	else 	{ 		cout << ")错误:" << tempInfor.row << "行" << tempInfor.column << "列" << endl;//只显示了一个 	} 	return 0; }  我表示C++不是强项。。不过谢谢帮忙了，我回头帮你测试一下

引用 4 楼 u013163178 的回复:写的不好。 /*************************************************************************     > File Name: fgetc.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月13日 星期一 17时46分01秒  ************************************************************************/ #include<stdlib.h> #include<stdio.h> #include<string.h> int main() { 	FILE *fstream; 	char* buffer; 	// get char 	int ch; 	buffer = (char*)malloc(32); 	fstream = fopen("aa.txt","r"); 	if(fstream == NULL) 	{ 		fprintf(stderr,"%s\n","failed to open aa.txt\n"); 		exit(0); 	} 	//the position of the char in  average line 	int nch = 0; 	//number of line 	int nln = 0; 	char *pos = buffer; 	//the position of ')' 	int n; 	while((ch=fgetc(fstream)) !=EOF) 	{ 		nch++; 		if(ch =='(' ) 		{ 			buffer++; 			*buffer = ch; 		}		 		if(ch ==')') 		{ 			if(*buffer =='(') 			{ 				*buffer ='\0'; 				buffer--; 			} 			else 				//error here 				n = nch; 		} 		if(ch =='\n') 		{ 			nln++; 			if(pos == buffer) 				printf("the %dth line is ok!\n",nln); 			else 				printf("the %dth line %dth char is error\n",nln,n); 			// clear the position of "(" 			n = 0; 			nch = 0; 			buffer =pos; 			memset(buffer,'\0',32); 		} 	} }  谢谢了哈。。。写的比我的好多了

挨个读取字符 碰到左括号入栈 碰到右括号出栈 最后判断栈是否为空

求帮助啊！！！！


Question: 关于对某一段地址赋值问题

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

看二楼。。。。

手机和电脑的地址空间映射不一样的

一般写好像问题还不大    这个问题影视先要进行读   如果你不加那个或的运算   应该不会导致错误的 也就是结果不对

地址能随便用的？不能访问的内存肯定要报错。

0x40280000 该地址在PC上是否可以访问呢？这个是关键。应该是访问权限的问题；

嗯，记住了

楼上正解....

手机0x40280000地址可写 电脑0x40280000地址不可写


Question: VC++6.0  Debug assertion Failed! 2进制转化为10进制

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

ElemType *base;     ElemType *top;     int stackSize; 这些都需要有一个初始值，写程序有的地方是不能偷懒的 此外，话说，你InitStack写得也有问题啊，还是好好检查一下代码吧

sqStack s;   不是这样初始化建立栈么?

sqStack s; 初始化完全没搞好，哎……


Question: 班级成绩管理系统的成绩统计函数，该怎么写输出？

先把程序写完整了吧


Question: 问个DNS的问题，实在不知道发在哪里了

恩恩，应该是配置问题。信任那个我只是在开玩笑的。

这不是信任不信任的问题，应该是配置的问题，从截图来看，似乎存在一个根节点的配置，bind9没用过，不敢下结论

截图没有截好


Question: linux编译出现  (.text+0x20)：对‘main’未定义的引用 collect2: 错误：ld 返回 1

围观。。。。

gcc -odes1 des1.c -I/root/ssl/include -L /root/ssl/lib/ -lcrypto

gcc des1.o -L/root/ssl/lib/ -lcrypto -o a.out

gcc des1.o /root/ssl/lib/libcrypto.a -o a.out


Question: 简单的扬声器程序详细解释下吧

这是一个用引脚反复输出高低电平，让扬声反复振动产生声音的。 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SPK = P3^7;//接扬声器的引脚 sbit K1 = P1^4;//接开关  void Alarm(uchar t) {  	uchar i,j; for(i=0;i<200;i++) {//振动200次  	SPK = ~SPK;//通过电平转换，使扬声器振动一次 for(j=0;j<t;j++);//延时 } }  void main() {  	while(1) {  	if(K1==1)//假如开关一直通电 {  	Alarm(90);//发出时延为90的声音，高频声 Alarm(120);//发出时延为120的声音，低频声 } } }

#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SPK = P3^7; sbit K1 = P1^4;  void Alarm(uchar t) {     uchar i,j;     for(i=0;i<200;i++)     {         SPK = ~SPK;         for(j=0;j<t;j++);     } }  void main() {     while(1)     {         if(K1==1)         {             Alarm(90);             Alarm(120);         }     } } 只是把代码格式化了一下。。。


Question: 关于while(条件表达式）其中判断下一次 循环的 问题

先别考虑*fast和IsNumber，先来看while(a ? b : c)。这里判断循环结束的条件是整个表达式 a?b:c的返回值，这个值或者是b或者是c，a只起一个选择的作用。把这个弄明白，你的代码就不难理解了。

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

while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))；  IsNumber(*fast) ? *fast++ : (*slow++= *fast++)先解析这个表达式 IsNumber(*fast)为真返回*fast++；否则返回*slow++= *fast++ 所以while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； 的判断条件是*fast++或*slow++

引用 3 楼 brookmill 的回复:[quote=引用 1 楼 brookmill 的回复:] 从判断循环终止的角度来说，把它简化为while (a ? b : c)，也就是说如果a不为0，用b是否为0来判断；如果a为0则用c 具体到这里，while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； b和c的值实际上都是*fast，所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow 更正：如果*fast不是数字就把它赋值给*slow[/quote] 为何不是判定IsNumber(*fast)的真假而是判定*fast是否为0呢？

引用 1 楼 brookmill 的回复:从判断循环终止的角度来说，把它简化为while (a ? b : c)，也就是说如果a不为0，用b是否为0来判断；如果a为0则用c 具体到这里，while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； b和c的值实际上都是*fast，所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow 更正：如果*fast不是数字就把它赋值给*slow

整个代码的思路：两个指针，fast依次走过字符串里的每个字符，直到字符串结束(也就是while循环里面的*fast为0)；slow走的比较慢，遇到数字就停下来，只有*fast非数字的时候才赋值并前进。


Question: 着急！！不用itoa怎么把int变成string

仅供参考char * comma(__int64 num) {     static char commades[80];     static char commasrc[80];      sprintf(commasrc,"%I64d",num);     int L=strlen(commasrc);     register int j=0;     register int k=0;     for (int i=L-1;i>=0;i--) {         commades[j]=commasrc[i];         k++;         j++;         if ((k%3)==0 && i>0) {             commades[j]=',';             j++;         }     }     commades[j]=0;     strcpy(commades,strrev(commades));     return commades; }

std::to_string直接搞定。 http://en.cppreference.com/w/cpp/string/basic_string/to_string

就标题问题，现在标准做法是std::to_string。要逗号嘛在结果里插入……有些逗。 一些现成的代码： http://stackoverflow.com/questions/7276826/c-format-number-with-commas

自己实现很简单的

转换成1000进制表示

或者这个C版的， msvc不可以

引用 3 楼 mujiok2003 的回复:C只能自己实现， C++可以使用facet[code=c] C++实现

C只能自己实现， C++可以使用facet

那就使用sprintf()函数把

自己写个函数实现

//调用者应该给出足够大的buf char *my_itoa(int n, char *buf) {     int i, j, k=0, l=0;     char tmp[32] = {0};      i = n;     do {         j = i%10;         i = i/10;         sprintf(tmp+k, "%d", j); //倒序         k++;         l++;         if (i!=0 && l%3 == 0) {             sprintf(tmp+k, ",");             k++;             l = 0;         }     }while(i);      for (k--,i=0; i<=k; i++) {         buf[i] = tmp[k-i];     }      return buf; }  int main() {     char buf[32] = {0};     int n;     printf("input a number: ");     scanf("%d", &n);     printf("output: %s\n", my_itoa(n,buf));     return 0; }  欢迎点评


Question: 关于openssl 的des加密方法详细点的函数说明

你好, 请问你怎么使用openssl的DH密钥交换的呢, 我有自己设定好的p和g, 不知道该怎么转换成openssl中的DH结构体

不懂，帮你顶一下


Question: 在线oj题错误，求解

围观。。。。


Question: 设好的程序出错warning C4047:  求大神指导

#include <stdio.h> #include <string.h> int main() {     char n_name[256] = {0};     printf("请输入你的名字:");fflush(stdout);     scanf("%s",&n_name);     if(strcmp(n_name, "幺妹") == 0)     {         printf("ILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILO\n"                "ILOVEYOUILO ****** VEYOU ****** ILOVEYOUILO\n"                "ILOVEYOU *********** I *********** LOVEYOUI\n"                "OUIUI *************** *************** VEYOU\n"                "YOUI ********************************** LOV\n"                "IL ************************************* OV\n"                "L *************I**LOVE**YOU*!************ O\n"                "I *************************************** L\n"                "U *************************************** I\n"                "OU ************************************* IL\n"                "UIL *********************************** OVE\n"                "OVEYO ******************************* ULOVE\n"                "OVEYOUI **************************** LOVEYO\n"                "EYOUILOVE *********************** YOUILOVEY\n"                "VEYOUILOVEYOU ***************** ILOVEYOUILO\n"                "ILOVEYOUILOVEYO ************* LOVEYOUILOVEY\n"                "UILOVEYOUILOVEYOU ********* LOVEYOUILOVEYOU\n"                "LOVEYOUILOVEYOUILOV ***** ILOVEYOUILOVEYOUI\n"                "EYOUILOVEYOUILOVEYOU *** YOULOVEYOUILOVEYOU\n"                "VEYOUILOVEYOUILOVEYOU * VEYOUILOVEYOUILOVEY\n"                "OVEYOUILOVEYOUILOVEYOUILOVEYOUILOVEYOUILOVE\n");     }     else         printf("对不起，这个程序不是给你的噢！！");     getchar();     return 0; }

小伙子，好样滴。好好爱她。 #include <stdio.h> #include <string.h> void main() { 	char n_name[256] = {0}; 	printf("请输入你的名字:"); 	scanf("%s",&n_name); 	if(strcmp(n_name, "张三") == 0) 	{ 		printf("·····································\n"); 		printf("          **            **\n"); 		printf("         ****          ****\n"); 		printf("        ******        ******\n"); 		printf("       ********      ********\n"); 		printf("      **********    **********\n"); 		printf("     **************************\n"); 		printf("    ****************************\n"); 		printf("     ***************************\n"); 		printf("      *************************\n"); 		printf("       ***********************\n"); 		printf("        *********************\n"); 		printf("         *******************\n"); 		printf("          *****************\n"); 		printf("           ***************\n"); 		printf("            *************\n"); 		printf("             ***********\n"); 		printf("              *********\n"); 		printf("               *******\n"); 		printf("                *****\n"); 		printf("                 ***\n"); 		printf("                  *\n"); 		printf("·····································\n "); 	} 	else 		printf("对不起，这个程序不是给你的噢！！"); 	getchar(); }

可以用的  只不过你需要的是名字 应该是字符串类型的数据   而你却定义的int型数据 改为楼上所说的： char n_name[10]; printf("请输入你的名字"); scanf("%s",n_name); if(strcmp(n_name,"······") == 0) {    // do something }

引用 1 楼 u014723382 的回复:没这个库sting.h.strcmp这个函数是对字符进行操作的，需要string.h 这个库。你改改试试加上string.h之后还会出现那个错误

引用 1 楼 u014723382 的回复:没这个库sting.h.strcmp这个函数是对字符进行操作的，需要string.h 这个库。你改改试试加了之后就出现这个错误fatal error C1083: Cannot open include file: 'sting.h': No such file or directory

int n_name;    printf("请输入你的名字");     scanf("%d",&n_name); 改为： char n_name[10];    printf("请输入你的名字");     scanf("%s",n_name);

scanf("%d",&n_name);  改成scanf("%s",&n_name);

引用 6 楼 xydp1987108 的回复:同楼上 另外strcmp是用来比较字符串是否相等的 if(strcmp(n_name,"······") == 0)那strcmp是不能用吗？那应该用什么？？


Question: 开平方函数

#include <stdio.h> #include <stdlib.h> #include<math.h> void  main() { double y0,y2,R1; scanf("%lf%lf",&y0,&y2); printf("y0=%lf\ny2=%lf\n",y0,y2); R1=sqrt((y2-y0)*(y2-y0)); printf("R1=%lf",R1); system("pause"); } 改成这样就可以了

看4楼，用scanf时注意输入数据的格式

输入后可以先输出输入的内容，这样可以判断是否是输入的问题；

运行时要按照scanf函数中的格式进行输入呐，即y0和y1要按照"%lf,%lf"格式输入，中间有逗号。不然你也可以修改输入格式。

/*************************************************************************     > File Name: sqrt.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月14日 星期二 17时53分38秒  ************************************************************************/ #include<float.h> #include<stdio.h> #include<math.h> int main() { 	double y0,y2,R1; 	scanf("%lf",&y0); 	getchar(); 	scanf("%lf",&y2); 	printf("y0=%lf\ny2=%lf\n",y0,y2); 	R1 = sqrt((y2 - y0)*(y2 - y0)); 	printf("R1 = %lf\n",R1); 	return 0; } 你试试这个

引用 2 楼 xpdavis 的回复:输入2个double的时候，记住用“,”分隔正解

请检查scanf函数的返回值。

输入2个double的时候，记住用“,”分隔

我试了下，把void改成int，加个return 0;


Question: 求找BUG POJ 1934

代码有点凌乱，也不加点注释说一下你的算法。


Question: 共用体入门例题

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后面要加一个getchar

二楼正解。。。

引用 1 楼 user-5 的回复:scanf("%d%s%c%c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);	 --------------------- 因为你的输入格式 是 一行 一起输入 所有的啊 其实我是想问输入数据的时候摁Enter不是表示一个数据输入结束吗，之前写程序如scanf("%d%d%d",&a,&b,&c);我都是输入一个数据摁Enter结束的

scanf("%d%s%c%c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);	 改成 scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);	 就行了。


Question: 着急！有没有人对汇编语言很在行啊！！

c语言编译后反汇编就可以了。不同的机器对应不同的指令集。如果想用win32的汇编到单片机上面跑，那是不可能的，别人估计也帮不了你。

不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

是PC程序还是其它芯片的程序？每种芯片指令集可能会不一样的。

c可以编译成汇编的啊，具体要参考编译器命令行的参数

对了，gcc 参考链接 http://bbs.csdn.net/topics/190172069

网上没有编译成汇编的软件吗

如果逻辑不复杂，写起来容易，如果复杂，你先编译出来，然后反汇编一下就行了。


Question: 存储元 存储单元 地址 字位 字节 的描述

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

1. 一个字节。 2.看大小端吧。要么高地址都是0，要么地地址都是0，没有前后的概念。 3.计算机内部都是2进制的概念。显示的是什么，是人的概念，编码问题。

Q2: 整形占用多少字节与不同的平台有关,不一定是4字节;

顶顶，求解答

引用 1 楼 user-4 的回复:0-255 需要1个字节即可  其他几个问题呢，几个词语的理解有没有什么问题啊

0-255 需要1个字节即可


Question: Linux 进程通信传递Map

引用 5 楼 lovesmiles 的回复:[quote=引用 3 楼 owen00sun 的回复:] [quote=引用 1 楼 slx_391987 的回复:] 父子进程间通信，管道最好。 子进程写，父进程读。  管道间如何传递Map对象？[/quote]  你的Map对像是什么？stl的map吗？这个怎么能传递。[/quote] 问题已经解决了，把Map转换成了结构体，还可以序列化或者组成字符串发送

引用 3 楼 owen00sun 的回复:[quote=引用 1 楼 slx_391987 的回复:] 父子进程间通信，管道最好。 子进程写，父进程读。  管道间如何传递Map对象？[/quote]  你的Map对像是什么？stl的map吗？这个怎么能传递。

Map对象是对象，不是一段内存或字符串，无法直接通过管道等任何传输通道在进程间传输。

引用 1 楼 slx_391987 的回复:父子进程间通信，管道最好。 子进程写，父进程读。  管道间如何传递Map对象？

可以转成json文本，传递之后再去加载文本

父子进程间通信，管道最好。 子进程写，父进程读。


Question: 獲取資料夾絕對路徑

引用WIN7用户目录一般在C:\User下面 C:\User 後面每一個使用者有不同的資料夾 ex : 使用者名為 123，啟動即為C:\Users\123\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup  但我要如何得到使用者的名字? 這樣我只要在C:\Users\         \AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 填上使用者的名字就好了

C:\Documents and Settings\Administrator\「开始」菜单\程序\启动  HOMEPATH=\Documents and Settings\Administrator 你自己比较一下吧，还有WIN7用户目录一般在C:\User下面

我所指的"啟動"資料夾 (Startup) 是這個 http://windows.microsoft.com/zh-tw/windows/run-program-automatically-windows-starts#1TC=windows-7

启动资料夹是在当前用户目录下面，你找一下，环境变量有的，比如 HOMEPATH=\Documents and Settings\Administrator 知道怎么取环境变量吧？

我要找到一個叫做啟動的資料夾。每一個使用者都會有不同的"啟動"資料夾， 所以我不能確定"啟動"資料夾的絕對路徑，那我要怎麼將程式移到"啟動"資料夾? 如果我要用第2種方法 (全盘搜索) 要如何實現?

二个方法 1将你的执行文件放到这个文件夹里面，当前路径自然就是文件夹的绝对路径 2全盘搜索，查找同名的文件夹，如果存在，搜索结果自然就是该文件夹的绝对路径了

台湾的？。。。

好好描述问题


Question: 使用fopen打开的文件，想把文件截短应该怎么办？

SetFilePointer＋SetEndOfFile

在Windows下，crt库里当然没有ftruncate。所以如果要在Windows下实现相同功能，必须用fileno() + _chsize()

看二楼，长知识

http://baike.baidu.com/view/3567004.htm?fr=aladdin 获取描述符可以用fileno函数 #include <stdio.h>  int fileno(FILE *fp);  Returns: the file descriptor associated with the stream

已打开的文件可以找 ftruncate

试试你用的函数库中是否有truncate


Question: bilblt的问题

BitBlt The BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.   BOOL BitBlt(   HDC hdcDest, // handle to destination device context   int nXDest,  // x-coordinate of destination rectangle's upper-left                 // corner   int nYDest,  // y-coordinate of destination rectangle's upper-left                 // corner   int nWidth,  // width of destination rectangle   int nHeight, // height of destination rectangle   HDC hdcSrc,  // handle to source device context   int nXSrc,   // x-coordinate of source rectangle's upper-left                 // corner   int nYSrc,   // y-coordinate of source rectangle's upper-left                 // corner   DWORD dwRop  // raster operation code );   Parameters hdcDest  Handle to the destination device context.  nXDest  Specifies the logical x-coordinate of the upper-left corner of the destination rectangle.  nYDest  Specifies the logical y-coordinate of the upper-left corner of the destination rectangle.  nWidth  Specifies the logical width of the source and destination rectangles.  nHeight  Specifies the logical height of the source and the destination rectangles.  hdcSrc  Handle to the source device context.  nXSrc  Specifies the logical x-coordinate of the upper-left corner of the source rectangle.  nYSrc  Specifies the logical y-coordinate of the upper-left corner of the source rectangle.  dwRop  Specifies a raster-operation code. These codes define how the color data for the source rectangle is to be combined with the color data for the destination rectangle to achieve the final color.  The following list shows some common raster operation codes: Value Description  BLACKNESS Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.)  DSTINVERT Inverts the destination rectangle.  MERGECOPY Merges the colors of the source rectangle with the specified pattern by using the Boolean AND operator.  MERGEPAINT Merges the colors of the inverted source rectangle with the colors of the destination rectangle by using the Boolean OR operator.  NOTSRCCOPY Copies the inverted source rectangle to the destination.  NOTSRCERASE Combines the colors of the source and destination rectangles by using the Boolean OR operator and then inverts the resultant color.  PATCOPY Copies the specified pattern into the destination bitmap.  PATINVERT Combines the colors of the specified pattern with the colors of the destination rectangle by using the Boolean XOR operator.  PATPAINT Combines the colors of the pattern with the colors of the inverted source rectangle by using the Boolean OR operator. The result of this operation is combined with the colors of the destination rectangle by using the Boolean OR operator.  SRCAND Combines the colors of the source and destination rectangles by using the Boolean AND operator.  SRCCOPY Copies the source rectangle directly to the destination rectangle.  SRCERASE Combines the inverted colors of the destination rectangle with the colors of the source rectangle by using the Boolean AND operator.  SRCINVERT Combines the colors of the source and destination rectangles by using the Boolean XOR operator.  SRCPAINT Combines the colors of the source and destination rectangles by using the Boolean OR operator.  WHITENESS Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.)     Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero.   Windows NT: To get extended error information, callGetLastError.   Remarks If a rotation or shear transformation is in effect in the source device context, BitBlt returns an error. If other transformations exist in the source device context (and a matching transformation is not in effect in the destination device context), the rectangle in the destination device context is stretched, compressed, or rotated as necessary.   If the color formats of the source and destination device contexts do not match, the BitBlt function converts the source color format to match the destination format.   When an enhanced metafile is being recorded, an error occurs if the source device context identifies an enhanced-metafile device context.   Not all devices support the BitBlt function. For more information, see the RC_BITBLT raster capability entry in the GetDeviceCaps function as well as the following functions: MaskBlt, PlgBlt, StretchBlt.   BitBlt returns an error if the source and destination device contexts represent different devices.   ICM: No color management is performed when blits occur.   Windows CE: In Windows CE version 1.0, the dwRop parameter can only be assigned the following values:  SRCCOPY  SRCAND  SRCPAINT   SRCINVERT   In Windows CE version 2.0, the dwRop parameter can be any ROP3.   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 Bitmaps Overview, Bitmap Functions

Setting a Breakpoint on a Message Received by a Windows Function You can set message breakpoints to stop the debugger when a particular WndProc function message is received.  Note   Message breakpoints work only on x86- or Pentium-based systems.  To set a breakpoint on a message   From the Edit menu, click Breakpoints.  The Breakpoints dialog box appears.  Click the Messages tab.   In the Break At WndProc text box, type the name of the Windows function.  If you are setting a breakpoint during a debug session, the list contains the exported functions in your project.   In the Set One Breakpoint For Each Message To Watch list box, select the message.   To set another breakpoint, press ENTER, and then repeat steps 3 and 4.  The Breakpoints list displays the currently active breakpoints.  Click OK to set the breakpoints.  Note If you interrupt execution while Windows or other system code is running, the results can be unpredictable.

你运行一下呗，那个函数本来设置的是窗口左上角的一部分就是那个图标。然后整个客户区显示的多是那个图标。 如果说，他所选取的位置一直是相对于窗口的，那应该客户区显示的一直是那个图标。 如果说，他所选取的位置是相对于桌面的，那也应该那个位置有什么显示什么，但实际不是这样啊，比如说我要最大化在还原，那那个位置就还是那个图标了，但是显示的是一片空白。 你运行一下改变一下窗口的大小就知道了，我可能说不太明白。

就是说，bitblt的拷贝源 就是  桌面上窗口系统图片所显示的位置的东西，  如果它被什么覆盖了， 拿  就 直接把 覆盖后的效果  拷贝到    拷贝先（这边应该是客户区）  因此，就是你说描述的效果吧  但是 最大化，就没了  是什么意思？ 最大化， 你的系统图片不是还在  显示器显示范围内吗


Question: 最长公共子序列问题

回溯....

看不懂。。。

引用 5 楼 u012421456 的回复:最字有两种意思，一种是表极限，最强的国家，这个最强只有一个，最强的国家之一，这里的最强是一些 看样子，楼主是属于第二种意思，但你的最长标准是什么呢？即多长的公共字符串算最长呢 引用 5 楼 u012421456 的回复:最字有两种意思，一种是表极限，最强的国家，这个最强只有一个，最强的国家之一，这里的最强是一些 看样子，楼主是属于第二种意思，但你的最长标准是什么呢？即多长的公共字符串算最长呢 举个例子来说吧，加入两个字符串,一个是BDCABA ;一个是ABCBDAB则它们所有的最长公共子序列为BDAB  BCAB  BCBA 。 不知道你是否明白我的意思了

引用 3 楼 u012421456 的回复:所有的最长 恩呢

所有的最长


Question: c程序问题

引用 2 楼 zhao4zhong1 的回复:楼主适合学Python

楼主适合学Python

if else里面的语句块要加上花括号{}


Question: 快速排序，递归时堆栈溢出

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

楼上。。。。

你没有return啊，必须让它收敛，在满足一个条件的时候返回


Question: 编译链接 静态局部变量也需要重定位？

《Windows PE权威指南》

内部符号（包括内部静态变量和内部全局变量）都会在重定位时进行符号解析。在进行编译时，内部全局变量被暂赋假的0x0，而静态局变量被赋值0x00000004（？）。所以我们在重定位表中可以看到他们。 ----------------------------------------------------------- 符号解析 符号解析的方式很广，有简单直观的，也有错综复杂的。大多数解析由链接编辑器执行，且没有任何提示。但是，某些重定位可能伴随有警告诊断，而其他重定位可能导致致命错误状态。  这两种符号的解析取决于符号的属性、提供符号的文件的类型以及要生成的文件的类型。有关符号属性的完整说明，请参见符号表节。但是，对于以下论述，标识了三种基本符号类型：  未定义－文件中已引用但尚未指定存储地址的符号。  暂定－文件中已创建但尚未确定大小或尚未分配存储空间的符号。这些符号在文件中显示为未初始化的 C 符号或 FORTRAN COMMON 块。  已定义－文件中已创建并且已指定存储地址和空间的符号。  符号解析最简单的形式涉及使用优先级关系。此关系中，已定义符号优先于暂定符号，而暂定符号又优先于未定义符号。

那本传说把GDI叫做图形设备抽象DX叫做声音设备抽象、前半页还在讲状态机后半页就变自动机、“C语言的一个语句是一个表达式”的逗比读物拿来参考么……LZ自求多福。

引用 2 楼 isunn 的回复:[quote=引用 1 楼 jerry_dqh 的回复:] 局部静态变量并不是放在栈上的，应该需要重定义。不然无知道知道在进程中的位置  可是我在《程序员的自我修养》上说链接过程，只关心全局变量的”粘合“。。。[/quote] 这个说法可能不是很严谨吧。很多时候我们只关注全局变量和局部变量的区别，而忽略了静态局部变量，这时候就需要根据具体情况来判断他是接近全局变量还是接近局部变量

静态局部变量比较特殊，从可见范围上来说类似局部变量(只在函数内可见)，从存储上来说类似全局变量(保存在全局区而不是栈)。从链接的角度来说更像是全局变量。

自顶，求高人回复

引用 1 楼 jerry_dqh 的回复:局部静态变量并不是放在栈上的，应该需要重定义。不然无知道知道在进程中的位置  可是我在《程序员的自我修养》上说链接过程，只关心全局变量的”粘合“。。。

局部静态变量并不是放在栈上的，应该需要重定义。不然无知道知道在进程中的位置


Question: sizeof(long) 的大小VS2010 和 linux 下Gcc 为什么得到的值不同？

首先C语言并没有规定数据类型的长度，类型具体的长度由具体实现决定。  至于为什么sizeof(long)一个等于64一个等于32，是因为两个平台采用不同的数据模型，一个是LP64，另外一个是LLP64。直接搜一下“LP64 LLP64”就能找到更多解释。前面版主也贴出了一个网址，可以看一下

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

和编译器的有关，和操作系统无关。

不同的64位编译器的64数据模式不同， VS: sizeof(long) = 32 sizeof(long long) = 64 sizeof(void *) = 64 GCC: sizeof(long) = 64 sizeof(long long) = 64 sizeof(void *) = 64  http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models

因为没有规定sizeof(long)必须是多少， 只需要sizeof(long)>= sizeof(int)

在windows上用gcc看看 标准中没有明确的规定long的长度，它的范围是4-8字节 这个和系统没有关系 和编译器有关

围观。。。。


Question: 编写一个链队列任意输出一串字符，以#作为结束标志，然后将对列串中的元素显示到屏幕上

谢谢大家,万分感谢

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

#include <stdio.h> #include <stdlib.h> #include <string.h>  typedef char ElemType;  struct QNode { 	ElemType data; 	struct QNode *next; };  struct LinkQueue { 	struct QNode* front; 	struct QNode* rear; };  int initQueue(LinkQueue *q) { 	q->front = q->rear = (QNode*) malloc(sizeof(QNode));  	if (!q->front) { 		return 0; 	} 	q->front->next = NULL;  	return 1;  }  int InsertQueue(LinkQueue *q, ElemType e) { 	struct QNode *p;  	p = (QNode*) malloc(sizeof(QNode));  	if (p == NULL) { 		return 0; 	} 	p->data = e; 	p->next = NULL; 	q->rear->next = p; 	q->rear = p;  	return 1;  }  int PrintQueue(LinkQueue *q) {  	QNode *now = q->front->next;  	while (now) {  		printf("%c", now->data);  		now = now->next;  	}  	return 1; }  int DeleteQueue(LinkQueue *q) {  	QNode *now = q->front;  	while (now) {  		QNode *temp = now->next;  		free(now);  		now = temp; 	}  	return 1; }  int main() {  	LinkQueue s; 	ElemType c;  	initQueue(&s);  	printf("输出任意一串字符，以#作为结束标志\n");  	scanf("%c", &c);  	while (c != '#') {  		InsertQueue(&s, c); 		scanf("%c", &c); 	}  	printf("\n");  	PrintQueue(&s);  	DeleteQueue(&s);  	return 0; }


Question: 课设，企业人事管理系统，大神求修改，不尽感激，好人一生平安

很大的数，那就说明没有数。。。。。只是，随机分配的一个数而已！你再找找你的赋值，是否保存了。取值的过程是否正确

引用 8 楼 qq_15033289 的回复:看了下 ，，运行结果。。惨不忍睹呀！  改了第 ·1 个，简单的改了下。。。。主要错误点就是：你的语法有错误。。。自己一个一个函数的改吧。。我就不去费神了 void input_person(person* p) { 	printf("请输入联系人信息!\n"); 	printf("请输入姓名:"); 	scanf("%s",p->name); 	printf("请输入工号:"); 	scanf("%d",&(p->number)); 	printf("请输入部门:"); 	scanf("%s",p->bu_men); 	printf("请输入职务:"); 	scanf("%s",p->zhi_wu); 	printf("请输入ID:"); 	scanf("%d",&(p->ID)); 	printf("请输入籍贯:"); 	scanf("%s",p->ji_guan); 	printf("请输入公资:"); 	scanf("%d",&(p->salary)); }大神，我修改了这个，还有个问题为啥工资查询出来的是随机值，还是很大的数，麻烦大神看看谢谢了

引用 1 楼 u012421456 的回复:大哥，你觉得这么问，会有人帮你吗？你自己看程序吗？ 建议自己看看别人的程序，争取看懂，自己有什么不懂得，想不明白可以来问 基础知识不行，看书，搜索，帮助文档，网上的博客等能不帮忙看下撒

我C基础还行，就是忽然间一下写大程序感觉不会，还有就是剩下的问题我真不会修改。。。。想法我已经打了注释了啊，抱歉，麻烦大家了

引用 4 楼 qq_15033289 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _person { 	char name[20]; 	int number; 	char bu_men[20]; 	char zhi_wu[20]; 	long int ID; 	char ji_guan[20]; 	double salary[1000];  }person; typedef struct _addr_book { 	person per; 	struct _addr_book* next; }addr_book;  addr_book* first=NULL; void add();// 添加  void show();// 显示  void search_1(); // 搜索  void search_2(); void delet();// 删除  void save(); // 保存  void quit();// 退出  int print_menu(); addr_book* get_last(_addr_book* from); void print_person(person* p); void input_person(person* p); void bi_jiao(double a[100]); char menu[]= "+=================================================================\n" "|                         企业人事管理系统                       |\n" "+-----------------------------------------------------------------\n" "| 1  添加成员                                                    |\n" "| 2  显示该部门所有成员工资排行                                  |\n" "| 3  按照姓名查找成员                                            |\n" "| 4  按照工号查找成员                                            |\n"  "| 5  删除成员                                                    |\n" "| 6  保存                                                        |\n" "| 7  退出系统                                                    |\n" "+===================================================================\n";  int main() { 	int flg=1; 	while (flg) 	{ 		switch(print_menu()) 		{ 			case 1:  	    		add();      			break; 	    	case 2: 	    		show(); 	    		break; 			case 3: 	    		search_1(); 	    		break; 			case 4: 	    		search_2(); 	    		break; 	    	case 5: 	    		delet(); 	    		break; 			case 6: 	   			save(); 	       		break; 			case 7: 	   			quit(); 	     	    break; 		} 	} 	return 0; } void add() { 	char input='N'; 	addr_book* last=NULL; 	addr_book*new_addr=(addr_book*)malloc(sizeof(addr_book));  	new_addr->next=NULL; 	if(first==NULL) 	{ 		first=new_addr; 	} 	else 	{ 		last=get_last(first); 		last->next=new_addr;  	} 	input_person(&(new_addr->per)); 	printf("Y继续，N返回菜单"); 	getchar(); 	input=getchar(); 	if(input=='Y'||input=='y')  	{ 		add();  	} } void search_1() { 	int count=0; 	char input='N'; 	char name[20]={0}; 	addr_book* p=first; 	printf(">输入要查找的成员名字"); 	scanf("%s,name"); 	while(p!=NULL) 	{ 		if(strcmp(p->per.name,name)==0) 		{ 			print_person(&(p->per)); 		count++; 		} 		p=p->next;	 	}  	if(count==0) 	{ 		printf("查无此人");	  	} 	printf("Y继续查找，N返回菜单"); 	getchar(); 	input=getchar(); 	if(input=='Y'||input=='y') 	{ 		search_1(); 	}  }  void search_2() { 	int count=0; 	char input='N'; 	int num=0; 	addr_book* p=first; 	printf("请输入要查找的工号"); 	scanf("%d",&num);  	while(p!=NULL) 	{ 		if(num == (p->per.ID)) 		{    			print_person(&(p->per));   			count++; 		} 		p=p->next; 	} 	if(count==0) 	{ 		 printf("查无此人");     } 	printf("Y继续查找，N返回菜单\n"); 	getchar(); 	input=getchar(); 	if (input=='Y'||input=='y') 	{	 		search_2();	 	} } void show() {                int i; 	struct _person     { 		char name[20]; 		int number; 		char bu_men[20]; 		char zhi_wu[20]; 		long int ID; 		char ji_guan[20]; 		double salary[1000];      }pai_xu[100];	 	int count=0; 	struct pai_xu* p1 = NULL; 	char bu_men[20]={0}; 	addr_book* p = first; 	printf("你想要查询的部门工资排序\n"); 	scanf("%s",bu_men); 	while(p!=NULL) 	{   	    for (i=0;i<100;i++) 	 	{ 	 	   if(strcmp(p->per.bu_men,bu_men)==0) 	       { //	     	  	pai_xu[i] == p->per;/*看是否同一个部门的，如果是就放在另一个数组中进行排序*/  	     	  	// 这个没什么必要吧！只有部门相同才能进这个if 语句呀！你这样写，不论同不同都会 count++ 的  	   			count++;	        	      	       } 	 	} 	 	p=p->next;     	}  	person a[100]; 	bi_jiao(a[count].salary);/*这里有问题，但是不知道咋改，保证了a里面全是同一个部门的了按照工资排序*/  	while(p1!=NULL) 	{ 		for (i=0;i<count;i++) 		{ 			 printf("%s",	a[i].name); 			 printf("%d",	a[i].number); 			 printf("%s",	a[i].zhi_wu); 			 printf("%ld",	a[i].ID); 			 printf("%s",	a[i].ji_guan); 			 printf("%d",	a[i].salary); 		} 	}  } void bi_jiao(double a[100]) { int i,temp; for (i=0;i<100;i++)    if(a[i]<a[i+1])      {    temp=a[i];    a[i]=a[i+1];    a[i+1]=temp;      } } void delet() { int count=0; char input='N'; char name[20]={0}; addr_book* p=first; addr_book* p1=NULL; printf("请输入要删除的联系人姓名"); scanf("%s",name); while (p!=NULL) { if (strcmp(p->per.name,name)==0) { print_person(&(p->per)); count++; break; } p=p->next; } if (count==0) { printf("没有姓名为%s的人",name); } else { printf("确定要删除?Y确认，N取消");  getchar();         getchar();         input=getchar();         if(input=='Y'||input=='y')         {         	if(p==first)         	{         	first=p->next;         }         else         {         	 p1=first;         	 while(p1!=NULL)         	 {         	if(p1->next==p)         	{         	 p1->next=p->next;         	 break;         	 }         }         p1=p1->next;            	}         }         free(p);	         }  printf("继续删除其他联系人吗？Y继续删除，N返回菜单"); getchar(); input=getchar(); if (input=='Y'||input=='y') { delet(); }	 } void save() { FILE *fp; char file[100]; addr_book* p=first; printf("请输入文件名:"); scanf("%s",file); fp=fopen(file,"w"); while(p!=NULL) { fprintf(fp,"%s,%d,%s,%s,%d,%s,%d\n",p->per.name,p->per.number,p->per. bu_men,p->per.zhi_wu,p->per.ID,p->per.ji_guan,p->per.salary); p=p->next; } fclose(fp); printf("保存成功！\n按任意键返回\n"); getchar(); getchar(); } void quit() { addr_book* pdel=first; addr_book* p=NULL; if (pdel==NULL) { exit(0); }/*如果pdel的next指针不为空，表示有下一条数据*/ /*先将p指向pdel，释放掉pdel，再将p重复给pdel*/ while(pdel->next!=NULL) { p=pdel->next; free(pdel); pdel=p; }  free(pdel);/*如果pdel的next指针为空，表示没有下一条数据，直接删除该节点*/; exit(0);  } int print_menu() { int selected=0; system("cls"); printf("menu"); printf(">请选择[1~7]:"); scanf("%d",&selected); if (selected<1||selected>7) { printf("错误的选择！(请输入1~7）.按任意键继续..."); getchar(); getchar(); } return selected; } void input_person(person* p) { printf("请输入联系人信息:\n"); printf("请输入姓名:"); scanf("%s",p->name); printf("请输入工号:"); scanf("%d",p->number); printf("请输入部门:"); scanf("%s",p->bu_men); printf("请输入职务:"); scanf("%s",p->zhi_wu); printf("请输入ID:"); scanf("%d",p->ID); printf("请输入籍贯:"); scanf("%s",p->ji_guan); printf("请输入公资:"); scanf("%d",p->salary); } void print_person(person* p) { printf("姓名:%s\t工号:%d\t部门:%s\t职务:%s\tID:%d\t籍贯:%s\t工资:%d\t",p-> name,p->number,p->bu_men,p->zhi_wu,p->ID,p->ji_guan,p->salary); printf("\n"); } addr_book* get_last(addr_book* from) { addr_book* p=from; while (p->next!=NULL) { p=p->next; } return p; } 改了下 ，无错了。。。。结果什么都就不敢保证了！！为啥运行过程中会闪退啊，大神

这种东西做很多了 很简单的

引用 8 楼 qq_15033289 的回复:看了下 ，，运行结果。。惨不忍睹呀！  改了第 ·1 个，简单的改了下。。。。主要错误点就是：你的语法有错误。。。自己一个一个函数的改吧。。我就不去费神了 void input_person(person* p) { 	printf("请输入联系人信息!\n"); 	printf("请输入姓名:"); 	scanf("%s",p->name); 	printf("请输入工号:"); 	scanf("%d",&(p->number)); 	printf("请输入部门:"); 	scanf("%s",p->bu_men); 	printf("请输入职务:"); 	scanf("%s",p->zhi_wu); 	printf("请输入ID:"); 	scanf("%d",&(p->ID)); 	printf("请输入籍贯:"); 	scanf("%s",p->ji_guan); 	printf("请输入公资:"); 	scanf("%d",&(p->salary)); }好吧，我自己努力试试，刚把得

写程序要先构思，想好大概的框架然后准备细节


Question: C语言，错在哪里了？怎么改？

楼主你的编程习惯好棒奥 嘿嘿 #include <stdio.h> long fac(long n);//在这里声明一下函数   int main()  { 	 long i = 50;  	long m;  	m = fac(i);  	printf("%ld",m);   	getch(); 	 return 0;   }  long fac(long n)  {   int a,b,c;  	if(n == 0)  	{ 	return 1; 	}  	else 	 { 	a = n-1;  	b = fac(n); 	 c = b*a;  	return (c); 	} }

引用 8 楼 zhaozhaohelu 的回复:楼主你代码，呼呼呼呼，我此刻先休息一会儿再说。哈哈哈

引用 7 楼 u013163178 的回复:良好的代码风格，看起来会让人产生美感你是对的

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

楼主你代码，呼呼呼呼，我此刻先休息一会儿再说。

良好的代码风格，看起来会让人产生美感

楼上说的很对。提醒楼主要搞清楚，函数声明，函数定义，函数原型等基本概念

引用 2 楼 u012421456 的回复:main后面的函数要在main前面声明一下啊 #include <stdio.h> long fac(long n);//////////// int main() { 	long i = 50; 	long m; 	m = fac(i); 	printf("%ld",m); 	getch(); 	return 0; } long fac(long n) { 	int a,b,c; 	if(n == 0) { 		return 1; 	} 	else { 		 a = n-1; 		 b = fac(n); 		 c = b*a; 		 return (c); 	} } 楼主你倒是简单整理一下代码啊，就这么上传了？？谢谢啦

整理一下代码

#include <stdio.h>  long fac(long n)  {   	int a,b,c;  	if(n <= 1) 	 	{ 	 		 return 1; 	 	}		 	a = n; 	 	b = fac(n-1); 	  	c = b*a; 	    	return (c); 	 }	 int main() {  	long i = 10; // 50 的阶乘太大了。。	 	long m; 	 	m = fac(i); 	 	printf("%ld",m); 	getchar(); 	return 0;   }    竟供参考！！！

程序停不下来吧。 递归不会结束。  在 fac(long n) 里，调用 b=fac(n)。终止不了。  可能是你笔误吧，想写 b=fac(n-1)，是这样吗？