Question: 程序完整，但无法运行并出现C1083: Cannot open include file: 'employee.h'的错误

错误就是说你没有这个文件employee.h，检查是否放在了项目路径中，名字是否拼写错。

找到employee.h文件的位置，把它放到cpp文件的文件夹中。

帖那么多代码没用。。 找到你的employee.h所在位置： 1.用绝对路径 2.将头文件添加到工程中 3.放到include能搜索到的目录下

错误就是说你没有这个文件employee.h，你找到他把他放在跟你当前cpp文件同一个文件夹里面

把这个employee.h放到你工程的目录下，或者把它放到C盘，#include "C:\\employee.h"

void findInfo(void){     char str[5];     char target[20];     int type;     int count;     int i;     if(numEmpl==0)   {         printf("没有可供查询的记录!");         getch();         return;     }     while(1){         printf("请输入查找的方式：\n");         printf("1.按员工编号\n");         printf("2.按员工姓名\n");         printf("3.按员工所在部门\n");         printf("4.结束查询\n");         scanf("%s",str);         if(str[0]=='4')             return;         if(str[0]=='1')   {             printf("请输入欲查询的员工的编号：");             scanf("%s",target);             type=0;         }         else if(str[0]=='2'){         printf("请输入欲查找的员工的姓名：");             scanf("%s",target);             type=1;         }         else if(str[0]=='3'){             printf("请输入欲查找的员工所在部门：");             scanf("%s",target);             type=2;         }         i=findRecord(target,type,0);         if(i!=-1){             printf("编号\t姓名\t性别\t婚姻状况\t学位\t部门\t职位\t工资\t工龄\n");         }         count=0;         while(i!=-1){             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",                 records[i].EmployeeNum,records[i].EmployName,                 records[i].EmployGender,records[i].EmployeeMarriage,                 records[i].EmployeeDegree,records[i].EmployeeDepart,                 records[i].EmployeePosition,records[i].EmployeePay,                 records[i].EmployeeWorkTime);             i=findRecord(target,type,i+1);             count++;         }         if(count==0)             printf("没有符合条件的员工!\n");         else             printf("一共找到了%d名员工的信息\n\n",count);     } } void deleteRecord(void){     char str[5];     char target[20];     int type;     int i,j;     if(numEmpl==0)  {         printf("没有可供删除的记录!");         getch();         return;     }     while(1){         printf("请输入如何找到欲删除的记录的方式：\n");         printf("1.按员工编号\n");         printf("2.按员工姓名\n");         printf("3.退出删除操作\n");         scanf("%s",str);         if(str[0]=='3')             return;         if(str[0]=='1'){             printf("请输入该员工编号：");             scanf("%s",target);             type=0;         }         else if(str[0]=='2'){             printf("请输入该员工的姓名：");             scanf("%s",target);             type=1;         }         i=findRecord(target,type,0);         if(i==-1)             printf("没有符合条件的员工!\n");         while(i!=-1){             printInfo(i);             printf("确定要删除这个员工信息吗？(y/n)");             scanf("%s",str);             if(str[0]=='y'||str[0]=='Y'){                 numEmpl--;                 for(j=i;j<numEmpl;j++){                     copyRecord(&records[j+1],&records[j]);                 }                 printf("成功删除记录!\n");             }             else                 break; /*取下一个符合条件的记录*/          i=findRecord(target,type,i++);          }     }     savedFlag=1; }  /*********************************************************************         修改指定员工的消息 ***********************************************************************/ void modifyRecord(void){     char str[5];     char target[10];     int type;     int i;     if(numEmpl==0){         printf("没有可供修改的记录!");         getch();         return;     }     while(1){         printf("请输入如何找到欲修改的记录的方式:\n");         printf("1.按员工编号\n");         printf("2.按员工姓名\n");         printf("退出修改操作\n");         scanf("%s",str);         if(str[0]=='3')             return;         if(str[0]=='1'){             printf("请输入该员工编号:");             scanf("%s",target);             type=0;         }         if(str[0]=='2'){             printf("请输入该员工姓名:");             scanf("%s",target);             type=1;         }         i=findRecord(target,type,0);         if(i==-1)             printf("没有符合条件的员工!\n");         while(i!=-1){             /*打印员工信息*/             printInfo(i);             printf("确定要修改这个员工的信息吗？(y/n)");             scanf("%s",str);             if(str[0]=='y'||str[0]=='Y'){                 addInfo(i);                 printf("修改记录成功!\n");             }             i=findRecord(target,type,i+1);         }     }     savedFlag=1; }  /*********************************************** *文件储存操作函数 *结果；数组records被保存至指定文件 *返回：成功0，失败-1 ************************************************/ int saveRecords(void){     FILE *fp;     char fname[30];     if(numEmpl==0){         printf("\n\n没有记录可存！\n\n");         getch();         return -1;     }     printf("\n\n输入要存入的文件名:\n\n");     scanf("%s",fname);     if((fp=fopen(fname,"wb"))==NULL){         printf("不能存入文件!\n");         getch();         return(-1);     }     printf("\n存入文件...\n");     fwrite(records,sizeof(EmpInfo)*numEmpl,1,fp);     fclose(fp);     printf("%d条记录已经存入文件，请继续操作。\n",numEmpl);     savedFlag=0;          /*更新是否已保存的标记*/     getch();     return(-1); }    /********************************************************************************    *文件储存操作函数 *结果；records将为从指定文件中读取出的记录 *返回：成功0，失败-1 ***********************************************************************************/ int loadRecords(void){     FILE *fp;     char fname[30];     char str[5];     if(numEmpl!=0&&savedFlag==0){         printf("请选择你是要覆盖现有记录(y),还是要将");         printf("读取的记录添加到现有记录之后(n)?\n");         scanf("%s",str);         if(str[0]=='n'||str[0]=='N'){             /*将读取的记录添加到现有记录之后*/             savedFlag=1;         }         else{                 if(savedFlag==1){                     /*覆盖现有记录*/                     scanf("%s",str);                     if(str[0]!='n'&&str[0]!='N')                     printf("读取文件将会更改原来的记录");                     printf("是否保存原来的记录？(Y/n)");                     saveRecords();                 }                 numEmpl=0;         }     }     printf("\n\n请输入要读取的文件名:");     scanf("%s",fname);     if((fp=fopen(fname,"rb"))==NULL){         printf("\n\n打不开文件！请重新选择\n\n");             return-1;     }     printf("\n取文件\n");     while(!feof(fp)){         /*现在的数组空间不足，需要重新申请空间*/         if(numEmpl>=arraySize){             records=realloc(records,(arraySize+INCR_SIZE)*sizeof(EmpInfo));             if(records==NULL){                 printf("memory failed!");                 exit(-1);             }             arraySize=arraySize+INCR_SIZE;         }         if(fread(&records[numEmpl],sizeof(numEmpl),1,fp)!=1)             break;         numEmpl++;     }     fclose(fp);     printf("现在共有%d条记录。",numEmpl);     return 0; }  /*********************************************** *文件储存操作函数 *结果；数组records被保存至指定文件 *返回：成功0，失败-1 ************************************************/

void handle_menu(void) {     for(; ;) {         switch(menu_select()) {         case 0:             addRecord();             getch();             system("cls");             break;         case 1:             modifyRecord();             getch();             system("cls");             break;         case 2:             display();             getch();             system("cls");             break;         case 3:             findInfo();             system("cls");             break;         case 4:             deleteRecord();             system("cls");             break;         case 5:             sortInfo();             system("cls");             break;         case 6:             saveRecords();             system("cls");             break;         case 7:             loadRecords();             getch();             system("cls");             break;         case 8:             newRecords();             getch();             system("cls");             break;         case 9:             quit();         }     } } /****************************** *    菜单选择函数menu_selected ******************************/ int menu_select(void) {     char s[2];     int choice=0;     printf("\n");     printf("\t******菜单选项******\n");     printf("\n");     printf("\t0.增加员工信息\n");     printf("\t1.修改员工信息\n");                                            printf("\t2.显示员工信息\n");     printf("\t3.查询员工信息\n");     printf("\t4.删除员工信息\n");     printf("\t5.对员工信息进行排序\n");     printf("\t6.保存员工信息至记录文件\n");     printf("\t7.从记录文件读取员工信息\n");     printf("\t8.新建员工信息文件\n");     printf("\t9.退出管理系统\n");     printf("\t********************");     printf("\n\t左边数字对应功能选择，请选择0--9: ");     for(; ;) {         scanf("%S",s);         choice=atoi(s);            /*处理键入的非数字键，过滤出数字0*/         if(choice==0&&(strcmp(s,"0")!=0))             choice=11;         if(choice<0||choice>9)             printf("\n\t输入错误，重选0--9: ");         else             break;     }     return choice;  }     /******************************************************************** *    新建员工信息记录 *    结果:若原来信息没有保存，则保存原来的信息，然后重新输入信息记录 ********************************************************************/ void newRecords(void) {     char str[5];     if(numEmpl!=0)    {         if(savedFlag==1) {             printf("现在已经有记录，选择处理已有记录的方法。\n");             printf("是否保存原来的记录？（y/n)");             scanf("%s",str);             if(str[0]!='n' && str[0]!='N')                 saveRecords();     } }     numEmpl=0;     addRecord(); } /******************************************************************** *    结束运行，退出 *    参数 void ********************************************************************/ void quit(void) {     char str[5];     if(savedFlag==1)    {         printf("是否保存原来的记录?(y/n)");             scanf("%s",str);         if(str[0]!='n' || str[0]!='N')             saveRecords();     }     free(records);     exit(0); }/****************************** *    菜单选择函数menu_selected ******************************/ int menu_select(void) {     char s[2];     int choice=0;     printf("\n");     printf("\t******菜单选项******\n");     printf("\n");     printf("\t0.增加员工信息\n");     printf("\t1.修改员工信息\n");                                            printf("\t2.显示员工信息\n");     printf("\t3.查询员工信息\n");     printf("\t4.删除员工信息\n");     printf("\t5.对员工信息进行排序\n");     printf("\t6.保存员工信息至记录文件\n");     printf("\t7.从记录文件读取员工信息\n");     printf("\t8.新建员工信息文件\n");     printf("\t9.退出管理系统\n");     printf("\t********************");     printf("\n\t左边数字对应功能选择，请选择0--9: ");     for(; ;) {         scanf("%S",s);         choice=atoi(s);            /*处理键入的非数字键，过滤出数字0*/         if(choice==0&&(strcmp(s,"0")!=0))             choice=11;         if(choice<0||choice>9)             printf("\n\t输入错误，重选0--9: ");         else             break;     }     return choice;  }     /******************************************************************** *    新建员工信息记录 *    结果:若原来信息没有保存，则保存原来的信息，然后重新输入信息记录 ********************************************************************/ void newRecords(void) {     char str[5];     if(numEmpl!=0)    {         if(savedFlag==1) {             printf("现在已经有记录，选择处理已有记录的方法。\n");             printf("是否保存原来的记录？（y/n)");             scanf("%s",str);             if(str[0]!='n' && str[0]!='N')                 saveRecords();     } }     numEmpl=0;     addRecord(); } /******************************************************************** *    结束运行，退出 *    参数 void ********************************************************************/ void quit(void) {     char str[5];     if(savedFlag==1)    {         printf("是否保存原来的记录?(y/n)");             scanf("%s",str);         if(str[0]!='n' || str[0]!='N')             saveRecords();     }     free(records);     exit(0); } #include"employee.h" /******************************* *     显示所有的员工信息 *******************************/ void display(void) {     int i;     char str[3];     if(numEmpl==0)     {         printf("没有可供显示的记录!");         return;     }     printf("\n1.显示简明员工信息\n2.显示详细员工信息\n您的选择: ");     scanf("s%",str);     if(str[0]=='2') {         for(i=0;i<numEmpl;i++) {             /*打印员工信息*/             printInfo(i);             /*打印满20个记录后停下来*/             if(i%20==0 && i!=0) {                 printf("输入任意字符后继续...");                 getch();                 printf("\n\n");             }         }      }     if(str[0]=='1') {         for(i=0;i<numEmpl;i++) {             printf("编号\t姓名\t部门\t职位\n");             printf("%s\t%s\t%s\t%s\n",records[i].EmployeeNum,                 records[i].EmployName,                 records[i].EmployeeDepart,                 records[i].EmployeePosition);             if(i%20==0&&i!=0)  {                 printf("输入任意字符后继续...");                 getch();                 printf("\n\n");             }         }     } } /******************************************************************** *    在当前表的末尾增加新的信息 *    结果:records中将记录新的信 *    息，如果数组大小不够，会重 *    新申请数组空间 ********************************************************************/ void addRecord(void){     char str[10];     if(numEmpl==0)         printf("原来没有记录，现在建立记录\n");     else         printf("下面在当前表的末尾增加新的信息\n");     while(1){         printf("你将要添加一组员工信息，确定吗?(y/n)");         scanf("%s",str);         if(str[0]=='n' || str[0]=='N')             break;         if(numEmpl>=arraySize){             records=realloc(records,(arraySize+INCR_SIZE)*             sizeof(EmpInfo));             if(records==NULL){                 printf("memory failed!");                 exit(-1);             }             arraySize=arraySize+INCR_SIZE;         }         addInfo(numEmpl);         numEmpl++;     }     printf("现在一共有%d条信息\n",numEmpl);     savedFlag=1; } void addInfo(int num){     char str1[10];     char str2[10];     char str3[10];     char str4[10];     printf("请输入员工编号：");     scanf("%s",records[num].EmployeeNum);     printf("请输入员工姓名：");     scanf("%s",records[num].EmployName);     printf("请输入员工性别（0为女，1为男）：");     scanf("%s",str1);     if(str1[0]=='0')         strcpy(records[num].EmployGender,"女");     else         strcpy(records[num].EmployGender,"男");     printf("请输入员工婚姻状况（0为未婚,1为已婚)：");     scanf("%s",str2);     if(str2[0]=='0')         strcpy(records[num].EmployeeMarriage,"未婚");     else         strcpy(records[num].EmployeeMarriage,"已婚");     printf("请输入员工学历：（0.大学本科生,1.硕士研究生,2.博士研究生）：");     scanf("%s",str3);     if(str3[0]=='0')         strcpy(records[num].EmployeeDegree,"大学本科生");     else if(str3[0]=='1')         strcpy(records[num].EmployeeDegree,"硕士研究生");     else if(str3[0]=='2')         strcpy(records[num].EmployeeDegree,"博士研究生");     printf("请输入员工所在部门：");     scanf("%s",records[num].EmployeeDepart);     printf("请输入员工职务：(0.职员，1.主任，2.经理，3.董事长)");     scanf("%s",str4);     if(str4[0]=='0')         strcpy(records[num].EmployeePosition,"职员");     if(str4[0]=='1')         strcpy(records[num].EmployeePosition,"主任");     if(str4[0]=='2')         strcpy(records[num].EmployeePosition,"经理");     if(str4[0]=='3')         strcpy(records[num].EmployeePosition,"董事长");     printf("请输入员工工资：");     scanf("%s",records[num].EmployeePay);     printf("请输入员工工龄：(以年为单位计算):");     scanf("%s",records[num].EmployeeWorkTime); } void printInfo(int num){     printf("编号\t姓名\t性别\t婚姻状况\t学位\t部门\t职位\t工资\t工龄\n");     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",     records[num].EmployeeNum,             records[num].EmployName,records[num].EmployGender,             records[num].EmployeeMarriage,records[num].EmployeeDegree,             records[num].EmployeeDepart,records[num].EmployeePosition,             records[num].EmployeePay,records[num].EmployeeWorkTime); } #include "employee.h" int findRecord(char* target,int targetType,int from){     int i;     for(i=from;i<numEmpl;i++){          if((targetType==0 && strcmp(target,records[i].EmployeeNum)==0)              ||(targetType==1 && strcmp(target,records[i].EmployName)              ==0)              ||(targetType==2&&strcmp(target,records[i].EmployeeDepart)              ==0))              return i;     }     return -1; }

没有找到这个employee.h这个文件，检查是否放在了项目路径中，名字是否拼写错，再不行试下使用绝对路径


Question: VC6.0可以通过，gcc编译过不了，删除节点不知道怎么改。求助大神。

终于成功了， 但不知为什么。 struct stud_node *deletelist(struct stud_node *head, int min_score)  {  struct stud_node *p1, *p2;   p1 = head;  while( p1!= NULL)   //改  {  if (min_score<=p1->score)  {p2=p1;  p1=p1->next; continue ;}  else   {  if(p1 == head)  {head = p1->next;  p1 = p1->next; continue;}  else  {p2->next = p1->next;  p1 = p2->next; continue ;}  }  //删除  return (head);  }

引用 4 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 删除节点那里出错了， 但是我改不成功，能给个范例吗 struct stud_node *deletelist(struct stud_node *head, int min_score) { 	struct stud_node *p1, *p2; 	 p1 = head; 	while( p1->next != NULL) 	{ 		if (min_score<=p1->score) 			{p2=p1;  p1=p1->next; continue ;} 		else  		{ 			if(p1 == head) 			{head = p1->next;  p1 = p1->next; continue;} 			else 			{p2->next = p1->next;  p1 = p2->next; continue ;} 		} 		if(min_score>p1->score) 		p1 = p1->next; 	} 	 		 	return (head); }

用PTA做的一个作业， 以下是他的编译提示错误 a.c:32:8: error: redefinition of 'struct stud_node' a.c:4:8: note: originally defined here a.c:39:19: error: conflicting types for 'createlist' a.c:11:19: note: previous declaration of 'createlist' was here a.c:40:19: error: conflicting types for 'deletelist' a.c:12:19: note: previous declaration of 'deletelist' was here a.c:42:5: error: redefinition of 'main' a.c:14:5: note: previous definition of 'main' was here a.c:55:19: error: conflicting types for 'createlist' a.c:11:19: note: previous declaration of 'createlist' was here a.c:81:19: error: conflicting types for 'deletelist' a.c:12:19: note: previous declaration of 'deletelist' was here

char   name[20];  数组名就是数组首地址。

GCC提示什么  另外，  scanf("%s %d", &p1->name, &p1->score);  改成  scanf("%s %d", p1->name, &p1->score);


Question: 学C语言用什么工具比较好呢？

引用 8 楼 zsdsywr123 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  对对，就是这个，感谢分享！[/quote] 应改为 对对，就是这个大神，感谢分享！

虚拟机+ubuntu+vim+gcc 学习C最好的组合，但是要折腾一阵子。

我觉得，还是用gcc直接在cmd(命令提示符)编译比较方便和快捷。         用其他的乱七八杂的IDE会生成一大堆没用的文件。，我是直接写好c 然后在cmd里命令生成可执行文件的。https://pan.baidu.com/s/1mittXUS

感谢各位的回复，不一一回了。

引用 7 楼 zhao4zhong1 的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  对对，就是这个，感谢分享！

VC6.0 ，虽然有很多BUG，但是用来谢谢小程序还是可以的，要是大型的集成开发环境，初学者怕接受不了。

初学可以用：C与C++程序设计学习与实验系统 2013.3 很方便，不用建立项目，简单的验证代码甚至不用保存为文件，直接（编译）运行

直接cmd敲指令，或者用的vc（太老了，那都有它的教程）

学习C语言用个下个最简单的编译器就行了，如turbo C，还有VC++，当年在学校时学习C语言时就用的这些个。


Question: 求教，串口通信的求和校验怎么做？

求校验和简单多了。

仅供参考： #include <stdio.h> int main() {     unsigned char d[5]={0x12,0x34,0x56,0x78,0x00};     unsigned char sum,cksum;     int i;      sum=0;     for (i=0;i<4;i++) {         sum+=d[i];     }     sum=~sum+1;     d[4]=sum;      cksum=0;     for (i=0;i<5;i++) {         cksum+=d[i];     }     if (cksum==0) {         printf("cksum ok.\n");     } else {         printf("cksum err!\n");     }      d[2]=0x55;      cksum=0;     for (i=0;i<5;i++) {         cksum+=d[i];     }     if (cksum==0) {         printf("cksum ok.\n");     } else {         printf("cksum err!\n");     }      return 0; } //cksum ok. //cksum err! //

求合校验, 就是把每个字节拿来相加就OK了, 溢出也不用管, 反正只看结果. 如果校验结果有1字节表示, 那么就用 unsigned char来保存累加和,  多个字节也类似.  比如计算 char [10]的校验和,  那么就把0-9累加起来, 最终得到一个数值, 不用关心溢出.

引用 3 楼 zhao4zhong1 的回复:求校验和简单多了。  感觉应该是，但是没有找到相关的资料，可否给个例子指点一二。谢谢

引用 1 楼 zhao4zhong1 的回复:仅供参考：/***** crc16.c *****/ #include <stdio.h>  #define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ... #define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...  //Other polynoms not tested #define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ... #define CRC16_T10_DIF   0x8BB7u     // SCSI DIF #define CRC16_DECT  0x0589u     // Cordeless Telephones #define CRC16_ARINC 0xA02Bu     // ACARS Aplications  #define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves  // Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0). unsigned short crc16(unsigned short crcValue, unsigned char newByte) {     int i;      for (i = 0; i < 8; i++) {         if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){             crcValue = (crcValue << 1)  ^ POLYNOM;         } else {             crcValue = (crcValue << 1);         }         newByte <<= 1;     }     return crcValue; }  unsigned short exampleOfUseCRC16(unsigned char *Data, int len){      unsigned short crc;     int aux = 0;      crc = 0x0000u; //Initialization of crc to 0x0000 for DNP     //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT      while (aux < len){         crc = crc16(crc,Data[aux]);         aux++;     }      return (~crc); //The crc value for DNP it is obtained by NOT operation      //return crc; //The crc value for CCITT }  int main() {     unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};      printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078     return 0; }  您好， 您好，这个是CRC校验吧，和求和校验一样吗？谢谢~~


Question: 逆波兰计算器的编写

#include<stdio.h> #include<stdlib.h> #include<ctype.h>   #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10   typedef double ElemType; typedef struct  { 	ElemType *base; 	ElemType *top; 	int stacksize; }SqStack;  void InitStack(SqStack *s) { 	s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); 	if(!s->base) 		exit(0); 	s->top=s->base; 	s->stacksize=STACK_INIT_SIZE; }//组建 void Push(SqStack *s,ElemType e) { 	if(s->top-s->base>=s->stacksize) 	{ 		s->base=(ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)); 		if(!s->base) 			exit(0); 		s->top=s->base+s->stacksize; 		s->stacksize=s->stacksize+STACKINCREMENT; 	} 	*(s->top)=e; 	s->top++; }//入栈操作 void Pop(SqStack *s,ElemType *e) { 	if(s->top==s->base) 	{ 		return ; 	} 	*e=*--(s->top); } int Stacklen(SqStack s) { 	return (s.top-s.base); } int main() { 	SqStack s; 	char c; 	double d,e; 	char str[MAXBUFFER]; 	int i=0; 	InitStack(&s);//初始化 	printf("请按照逆波兰表达式输入待计算数据，数据与运算符之间空格隔开已#结束\n"); 	scanf("%c",&c); 	while(c!='#') 	{ 		while(isdigit(c)||c=='.')//用于过滤数字 		{ 			str[i++]=c; 			str[i]='\0'; 			if(i>=10) 			{ 				printf("输入的单个数据过大\n"); 				return -1; 			} 			scanf("%c",&c); 			if(c==' ') 			{ 				d=atof(str); 				Push(&s,d); 				i=0; 				break; 			} 		}////头文件ctype 		switch(c) 		{ 		case '+': 			Pop(&s,&e); 			Pop(&s,&d); 			Push(&s,d+e); 			break; 		case '-': 			Pop(&s,&e); 			Pop(&s,&d); 			Push(&s,d-e); 			break; 		case '*': 			Pop(&s,&e); 			Pop(&s,&d); 			Push(&s,d*e); 			break; 		case '/': 			Pop(&s,&e); 			Pop(&s,&d); 			if(e!=0) 			{ 				Push(&s,d/e); 			} 			else 			{ 				printf("\n出错除数为0"); 				return -1; 			}   		} 		scanf("%c",&c); 	} 	Pop(&s,&d); 	printf("最终的计算结果为%d",d); 	return 0; }  修改完整的。

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

引用 1 楼 user-2的回复:你Push函数第二个参数的类型是ElemType，但Push(&s,d);这句中的d是double类型  Pop(&s,&d); 第二个参数类型也不对  push(&s,d-e); 第一个p是大写的 需要把参数类型改了嘛？


Question: 新人求助  C语言 将输入的字符串放到指定地址的错误

0xC0000005: 读取位置 0xcccccccc 表示你对一个在栈上开辟的未初始化的空间进行了操作  使用指针数组的话，需要为每一个成员（指针）都分配空间才行

数组名等于数组首地址。

char *ch1[81]; 应该为char ch1[81]; 其它相关的再修改。

引用 2 楼 rainborn99 的回复:谢谢，谢谢你呀，这个问题我试了，已经pass了，然后在运行到子程序的时候，出现了另一个错误。在temp=*strings[a];这句。会报错：S3_1.exe 中的 0x00863a72 处有未经处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突。 我在学习另一个程序的时候，也报了这个错误，也还没有找到怎么解决，能再请教您下吗，谢谢你啦。 就是因为strings中你没有分配内存空间，存的是NULL，对NULL解引用肯定会异常。试着把ch1声明成一个二维数组。。。

你的ch1是一个指针数组，数组中的指针没有初始化就使用了  *chi这个指针还没有初始化就使用了


Question: 新人求解答:debug error错误

已经说得很清除了，doperation没有初始化。 根源是这句：  printf("请输入运算符:\n",doperation); 看样式是笔误写错了。 其他的问题： scanf不能用%d格式串来输入float类型数据 scanf("%c"之前要清理输入缓冲区，否则会获取上次输入的回车符。 我给你改了下，vs2008调试通过，有问题给我留言： float number_1=0,number_2=0;     char doperation = '\0';      //输入界面     printf("请先输入第一个数字，然后再输入第二个数字,最后输入运算符\n");     printf("请先输入第一个数字:\n",number_1);     scanf("%f",&number_1);     printf("请再输入第二个数字:\n",number_2);     scanf("%f",&number_2);     getchar();     printf("请输入运算符:\n");     scanf("%c",&doperation);     //逻辑判断区域     switch (doperation)     {     case '+':          printf("结果为:%f",number_1+number_2);         break;     case '-':          printf("结果为:%f",number_1-number_2);         break;     case '*':          printf("结果为:%f",number_1*number_2);         break;     case '/':          printf("结果为:%f",number_1/number_2);         break;     default:         printf("输出错误");      }     getchar();     return 0;

你是来搞笑的吗，float类型用%n?

无时警告/错误的新人太可怕了  1>  main.c 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(10): warning C4474: printf: 格式字符串中传递的参数太多 1>  c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(10): note: 占位符和其参数预计 0 可变参数，但提供的却是 1 参数 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(11): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数，但可变参数 1 拥有了类型“float *” 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(12): warning C4474: printf: 格式字符串中传递的参数太多 1>  c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(12): note: 占位符和其参数预计 0 可变参数，但提供的却是 1 参数 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(13): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数，但可变参数 1 拥有了类型“float *” 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(14): warning C4474: printf: 格式字符串中传递的参数太多 1>  c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(14): note: 占位符和其参数预计 0 可变参数，但提供的却是 1 参数 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(15): warning C4477: “scanf”: 格式字符串“%c”需要类型“char *”的参数，但可变参数 1 拥有了类型“int” 1>c:\users\administrator\documents\visual studio 15\projects\project1\project1\main.c(14): error C4700: 使用了未初始化的局部变量“doperation”

#include <stdio.h> int main(void)  { 	float number_1=0,number_2=0; 	char doperation;  	//输入界面 	printf("请先输入第一个数字，然后再输入第二个数字,最后输入运算符\n"); 	printf("请先输入第一个数字:\n"); 	scanf("%f",&number_1); 	printf("请再输入第二个数字:\n"); 	scanf("%f",&number_2); 	printf("请输入运算符:\n"); 	getchar(); 	scanf("%c",&doperation); 	//逻辑判断区域 	switch (doperation) 	{ 	case '+':  		printf("结果为:%f",number_1+number_2); 		break; 	case '-':  		printf("结果为:%f",number_1-number_2); 		break; 	case '*':  		printf("结果为:%f",number_1*number_2); 		break; 	case '/':  		printf("结果为:%f",number_1/number_2); 		break; 	default: 		printf("输出错误");  	} 	getchar(); 	return 0; }

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


Question: C语言中用node*&p报错误，而在c++中却不报错误，很奇怪-。-

严蔚敏的问题。

不奇怪，c不支持引用

c没有引用。

C 和 C++ 是两种不同的语言

int main() { f(); return 0; }; int f(void) { return 0; }  C语言中不报错误，而在c++中却报错误，很奇怪-。-  int main() { delete new int; return 0; };   C语言中报错误，而在c++中却不报错误，很奇怪-。-

引用 5 楼 wang0635 的回复:严蔚敏的问题。 我也被坑过，当时连引用与取地址都分不清， 照着书上代码一个字母一个字母地打，结果报错， 老师说这样伪代码， 可是书名却叫《数据结构（C语言版）》。 还有配套的光盘，居然只有编译好的exe，没有源码，exe确实可以运行，会输出运行结果，不过我发现每个exe的大小是一样的。

你怎么不直接在 C 里面写 class 呢


Question: hid 键盘 stm32发出去的和 bus Hound 抓的数据不同

应该不是吧？？？打印三星6410的usb的数据包发现跟抓包软件抓的是一样的。。。

信号不同步。我猜。


Question: 谁帮我看看这段加密解密的代码哪里错了，解密的时候发现数据丢失！

从调试秘钥时 发现 原来正真原因 是循环多了-1  去掉之后就可以了

引用 7 楼 user-1 的回复:[quote=引用 6 楼 libinden71 的回复:] 我看了好多遍了 没发现哪里逻辑有错误啊！ 不要光看，要多输出中间变量，一开始测试的文件可以小一点，比如只包含5个字符，密钥的长度为2，加密后用二进制查看器看一下对不对，如果对了就排除了加密的代码，再调试解密的[/quote]  知道了  秘钥长度问题

谁快帮我看看啊！

引用 6 楼 libinden71 的回复:我看了好多遍了 没发现哪里逻辑有错误啊！ 不要光看，要多输出中间变量，一开始测试的文件可以小一点，比如只包含5个字符，密钥的长度为2，加密后用二进制查看器看一下对不对，如果对了就排除了加密的代码，再调试解密的

我看了好多遍了 没发现哪里逻辑有错误啊！

引用 4 楼 libinden71 的回复:[quote=引用 3 楼 user-1 的回复:] 你在主楼发的代码，只有解密时有吧，加密时没有   不好意思   复制少了 还是一样  还是丢失 [/quote] 我重新发下吧！  #define  _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <string.h>  int prin_size1() { 	FILE  *p = fopen("F:\\cs.txt", "rb"); 	int size = 0; 	int ch; 	if (p != NULL) 	{ 		while ((ch = getc(p)) != EOF) 		{ 			size++; 		} 	} 	fclose(p); 	return size; }  void mainasd()//分段加密 { 	FILE  *pf = fopen("F:\\cs.txt", "rb"); 	FILE *pfw = fopen("F:\\cs(加密).txt", "wb");  	char str[100] = { 0 };  	if (pf == NULL || pfw == NULL) 	{ 		printf("文件打开失败\n"); 	} 	else 	{ 		int size = 0; 		int length = 0; 		printf("请输入加密的密码："); 		scanf("%s", str); 		length = strlen(str); 		size = prin_size1(); 		printf("size=%d\n", size);  		if (size%length == 0) 		{ 			for (int i = 0; i < size / length; i++) 			{ 				for (int j = 0; j < length; j++) 				{ 					fputc(fgetc(pf) ^ str[j], pfw); 				} 			} 		} 		else 		{ 			for (int i = 0; i < size / length - 1; i++) 			{ 				for (int j = 0; j < length; j++) 				{ 					fputc(fgetc(pf) ^ str[j], pfw); 				} 			}  			for (int i = 0; i < size%length; i++) 			{ 				fputc(fgetc(pf) ^ str[i], pfw); 			} 		}  	}   	fclose(pf); 	fclose(pfw); 	system("pause"); }  void main()//分段解密 {  	FILE  *pf = fopen("F:\\cs(加密).txt", "rb"); 	FILE *pfw = fopen("F:\\cs(解密).txt", "wb"); 	char str[100] = { 0 };  	if (pf == NULL || pfw == NULL) 	{ 		printf("文件打开失败\n"); 	} 	else 	{ 		int size = 0; 		int length = 0; 		printf("请输入解密的密码："); 		scanf("%s", str); 		length = strlen(str); 		size = prin_size1();  		if (size%length == 0) 		{ 			for (int i = 0; i < size / length; i++) 			{ 				for (int j = 0; j < length; j++) 				{ 					fputc(fgetc(pf) ^ str[j], pfw); 				} 			} 		} 		else 		{ 			for (int i = 0; i < size / length - 1; i++) 			{ 				for (int j = 0; j < length; j++) 				{ 					fputc(fgetc(pf) ^ str[j], pfw); 				} 			}  			for (int i = 0; i < size%length; i++) 			{ 				fputc(fgetc(pf) ^ str[i], pfw); 			} 		} 	}   	fclose(pf); 	fclose(pfw); 	system("pause"); }

引用 3 楼 user-1 的回复:你在主楼发的代码，只有解密时有吧，加密时没有   不好意思   复制少了 还是一样  还是丢失

你在主楼发的代码，只有解密时有吧，加密时没有

引用 1 楼 user-1 的回复:加密时如果不刚好整除，没有然后了吗  			for (int i = 0; i < size / length - 1; i++) 			{ 				for (int j = 0; j < length; j++) 				{ 					fputc(fgetc(pf) ^ str[j], pfw); 				} 			}  			for (int i = 0; i < size%length; i++) 			{ 				fputc(fgetc(pf) ^ str[i], pfw); 			} 后面这段 就是处理 else 的啊

加密时如果不刚好整除，没有然后了吗


Question: linux多线程tcp访问卡死的问题

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： //循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef _MSC_VER     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX; CRITICAL_SECTION cs_BBB; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             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]:'.');             }             Log("%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]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int main() { #ifdef _MSC_VER     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX);     InitializeCriticalSection(&cs_BBB); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef _MSC_VER     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef _MSC_VER     DeleteCriticalSection(&cs_BBB);     DeleteCriticalSection(&cs_HEX);     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }  任何收发两端速度不一致的通讯，都需要在它们之间使用一个足够大的FIFO缓冲区。 对任何FIFO缓冲区的使用，都需要仔细考虑接收端接收时超时无数据和发送端发送时FIFO缓冲区已满这两种情况下该如何做。 这些概念都在这段经典代码中有所体现。 这段经典代码还包括以下必须考虑的因素： ◆跨Windows和Linux平台 ◆多线程锁 ◆多线程日志 ◆日志文件占用的磁盘空间可控 ◆日志中的时间包括毫秒 ◆传输的数据对应的每个字节到底是几 ◆如何退出多线程程序 ◆……

而且不是服务器端的多线程是每次不固定死在哪个线程上

我抓了发现数据 都 发 出去了 ，我就 又 开始怀疑 服务器端，结果发现好像是线程死了，这问题就复杂了，我服务器端的线程唯一能让它 死的只有线程中多次调用了usleep,但是我想不同usleep为什么会让线程死掉不能工作

建议楼主先学会使用抓包软件比如wireshark


Question: 小白求助

#include <stdio.h> // scanf     #include <ctype.h> // indigit     int reverse()     {     	char ch;     	scanf("%c", &ch);     	if (ch == '\n')     	{     		return 1;     	}     	else if (!isdigit(ch))     	{     		printf("error input");     		return 0;     	}     	else {     		if (reverse())     		{     			putchar(ch);     			return 1;     		}     		return 0;     	}     }     int main()     {     	reverse();putchar('\n');     	reverse();putchar('\n');     	return 0;     }     /* stdin:     123     12a      */     /* stdout     321     error input     */ // http://ideone.com/uR2jxn

#include <stdio.h> #include <windows.h> int main() {     unsigned __int64 v;     int i,L;     char s[80];      while (1) {         if (1==scanf("%I64u",&v)) break;         rewind(stdin);     }     L=sprintf(s,"%I64u",v);     for (i=L-1;i>=0;i--) {         printf("%c",s[i]);fflush(stdout);         Sleep(300);     }      return 0; } //12345678901234567890 //09876543210987654321

#include <stdio.h> #include <windows.h> int main() {     unsigned __int64 v;     int i,L;     char s[80];      while (1) {         if (1==scanf("%I64u",&v)) break;         rewind(stdin);     }     L=sprintf(s,"%I64u",v);     for (i=0;i<L;i++) {         printf("%c",s[i]);fflush(stdout);         Sleep(300);     }      return 0; } //12345678901234567890 //12345678901234567890

引用 1 楼 user-4 的回复:用递归 求模   int Mod(int sum) { 	if (sum == 0) 	{ 		return ; 	} 	else 	{  		 Mod(sum / 10); 		 printf("temp=%d\n", sum % 10); 	} } 这条称写错了别在意	printf("sum=%d\n", sum % 10);


Question: 迷宫问题，不知道哪里错了，老是运行错误，求大佬指教

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

仅供参考：/**  * @Title  老鼠走迷宫的拓展探究  * @Author 孙琨  * @Date   2013-11-16  * @At     XUST  * @All Copyright by 孙琨  *  */  #include <iostream> using namespace std;  int maze[9][9] = { // 初始化迷宫，英文maze为“迷宫”     {2,2,2,2,2,2,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,0,2,2,0,2,2,0,2},     {2,0,2,0,0,2,0,0,2},     {2,0,2,0,2,0,2,0,2},     {2,0,0,0,0,0,2,0,2},     {2,2,0,2,2,0,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,2,2,2,2,2,2,2,2} };  int startI = 1,startJ = 1; // 入口行列坐标 int endI = 7,endJ = 7;     // 出口行列坐标  void visit(int i,int j)  // 自动搜寻路径 {     int m,n;      maze[i][j] = 1;      if((i == endI) && (j == endJ))     {         cout << endl << "显示路径:" << endl;         for(m=0; m<9; m++)         {             for(n=0; n<9; n++)             {                 if(maze[m][n] == 2)                     cout << "■";                 else if(maze[m][n] == 1)                     cout << "♀";                 else                     cout << "  ";             }             cout << endl;         }     }      if(maze[i][j+1] == 0)         visit(i,j+1);     if(maze[i+1][j] == 0)         visit(i+1,j);     if(maze[i][j-1] == 0)         visit(i,j-1);     if(maze[i-1][j] == 0)         visit(i-1,j);      maze[i][j] = 0;  }  int main(void) {     int i,j;      cout << "显示迷宫: " << endl;     for(i=0; i<9; i++)     {         for(j=0; j<9; j++)         {             if(maze[i][j] == 2)                 cout << "■" ;             else                 cout << "  " ;         }         cout << endl;     }      visit(startI,startJ);      return 0; }

出错时点中断，通过调用堆栈定位到相关代码，观察分析原因

找到bug了，谢谢各位

之前才看到迷宫游戏，现在又来一个，真多

报什么错？最好贴出来


Question: 大神求救

引用 2 楼 qq_36326777 的回复:(map_t*)这是强制转换吗  是的，类型转换

将MAP的地址作强制转换转换，转换成指向map_t结构体的指针类型，然后赋值给pq

让变量pq的值等于变量MAP的地址


Question: 求助啊，VS2013运行 Error LNK2001 Error LNK2019

折腾了几天，百度 csdn msdn都找不到解决办法，配置重置都不行，无奈只能完全卸载重装了。终于好了。

将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

引用 5 楼 u010909114 的回复:[quote=引用 4 楼 tank2651094 的回复:] [quote=引用 2 楼 u010909114 的回复:] 1：可在同事电脑写个能够正常运行的，然后拿到自己电脑上试试呗，这样可排除是代码的问题还是开发环境的问题？ 2：有时问题一种思路行不通，可换下试试。 写个很简单的打印helloworld都运行不起来。运行以前的学习的例子是出现同样的问题，所以我觉得应该是环境配置问题。在家自学的。。。实在找不出办法，只能上论坛求助了[/quote]  当前也是初学C++ ,不懂，但帮顶。[/quote]多谢！

引用 4 楼 tank2651094 的回复:[quote=引用 2 楼 u010909114 的回复:] 1：可在同事电脑写个能够正常运行的，然后拿到自己电脑上试试呗，这样可排除是代码的问题还是开发环境的问题？ 2：有时问题一种思路行不通，可换下试试。 写个很简单的打印helloworld都运行不起来。运行以前的学习的例子是出现同样的问题，所以我觉得应该是环境配置问题。在家自学的。。。实在找不出办法，只能上论坛求助了[/quote]  当前也是初学C++ ,不懂，但帮顶。

引用 2 楼 u010909114 的回复:1：可在同事电脑写个能够正常运行的，然后拿到自己电脑上试试呗，这样可排除是代码的问题还是开发环境的问题？ 2：有时问题一种思路行不通，可换下试试。 写个很简单的打印helloworld都运行不起来。运行以前的学习的例子是出现同样的问题，所以我觉得应该是环境配置问题。在家自学的。。。实在找不出办法，只能上论坛求助了

引用 1 楼 user-3 的回复:需要将依赖的库文件添加到项目设置中。  具体位置在：项目属性——链接器——输入——附加依赖项 百度找了很多问题也说是需要将依赖的库文件添加到项目设置，但是附加依赖项一直都是默认的：从父级或项目默认设置继承。 以前都没问题的。现在只是写个简单的打印helloword都不能运行。我也不知道要加什么库。。。 在配置—C/C++—代码生成—运行库—MT MTd MD MDd每一个试过也都不行。


Question: 数据结构，链表归并的一些问题是在==实在改不出来了

好的，谢谢啦

1.ShowList有几处错误 2.你的MergeList函数逻辑也不对，你的l3是会不断往后移动的，你最后return回去的l3并不是你合并后的链表头部了， 自己再改改。  void ShowList(LinkList l) { 	LinkList p; 	p = l->next; 	while (p != NULL) 	{ 		printf("%3d", p->data); 		p = p->next; 	} }

这个发现了，不过问题不在这，是我的输出的两个链表输出有错  而且每一次输出都是一个值

ShowList函数中应该是while (p != NULL)吧


Question: voronoi图JFA算法的实现


Question: C语言，PAT测试有一个测试点死活过不去，求助！ 谢谢！

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

谢谢，太粗心了，没有考虑边界条件！

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

可以留个题目链接 ， 我帮你写一个参考代码！

看了一下，楼主花了很大的功夫， 当初也是这样过来的，刷PAT可以提高编程能力 楼主这种错误估计是一个样例没有通过， 可能是一个很特别的case, 一般做这样的 题目， 别写太多代码，！

乖乖了，这么长，让人怎么抓重点啊，


Question: 求大神帮忙解决一下程序不能打开文本文件并进行修改的bug

你这个函数的声明就存在很多问题。 search_number等几个函数没有前置声明 display等几个函数声明和实现的函数参数不一致  还要就是你save函数里是if (!(fp = fopen("bbb.txt", "r")))用r模式写入？ 而且你所谓的无法读写是什么意思，fopen成功了吗？

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

引用 5 楼 paschen 的回复:"d://bbb.txt"  改成：  "d:\\bbb.txt" 改过了，不行TAT

"d://bbb.txt"  改成：  "d:\\bbb.txt"

引用 2 楼 paschen 的回复:你main中的函数声明与下面实现进的不一致  比如上面是：void del();   下面是void del(int *b) 具体是什么意思呢？

文件是存在的啊，可是无法读写

add函数打开的是d://bbb.txt，你这个文件存在吗？跟save和load操作的文件也不一样啊


Question: 用c Free一直检查文件依赖性

引用 5 楼 paschen 的回复:没有问题，可以运行生成的程序了为甚我的不行 啊？难道还要下载其它组件？

那句话之前的状态了。

没有问题，可以运行生成的程序了

完成构建：0个错误，0个警告。。

引用 2 楼 a1024204390 的回复:但是一直这样啊，它一直检查文件依赖性怎么搞阿？  已经正常结束了啊 ...

但是一直这样啊，它一直检查文件依赖性怎么搞阿？

看起来挺正常的啊 ...


Question: 求大神帮我看一下我编的有什么问题？

1.case 1是对的，不用改成case '1' 2.输入时要严格和scanf的格式对照，输入是空格分隔的，scanf里要写成scanf("%f,%f,%d", &a, &b, &flag);  #include <stdio.h>  #include <ctype.h>  int main() { 	int c, flag; 	float a, b, result; 	printf("欢迎来到小黄鸡会计算的世界\n"); 	printf("小黄鸡最近学会了加减乘除，你可以来考考它\n"); 	printf("请依次输入第一、二个数字，和你所需要的运算符号（且我们规定加减乘除依次为1、2、3、4）\n"); 	scanf("%f,%f,%d", &a, &b, &flag); 	switch (flag){ 	case 1: printf("结果是%f\n", result = a + b); break; 	case 2: printf("结果是%f\n", result = a - b); break; 	case 3: printf("结果是%f\n", result = a*b); break; 	case 4: printf("结果是%f\n", result = a / b); break; 	default:; 	} 	printf("小黄鸡很机智吧！\n"); 	return 0; }

输入时用空格或者回车分隔

输入： 12  23  1 之间不要用,号，用空格

scanf("%f,%f,%d", &a, &b, &flag);

我又改了一点，可还是不行，求指教而且为什么只显示两个结果了？  #include <stdio.h>  #include <ctype.h>  int main() {  	int c,flag; 	float a,b,result; 	printf("欢迎来到小黄鸡会计算的世界\n");     printf("小黄鸡最近学会了加减乘除，你可以来考考它\n");  	printf("请依次输入第一、二个数字，和你所需要的运算符号（且我们规定加减乘除依次为1、2、3、4）\n");  	scanf("%f",&a);  	printf("%f\n",a);  	scanf("%f",&b);  	printf("%f\n",b);  	scanf("%d",&flag);  	switch(flag){  		case '1': printf("结果是%f\n",result=a+b);break;  		case '2': printf("结果是%f\n",result=a-b);break;  		case '3': printf("结果是%f\n",result=a*b);break;  		case '4': printf("结果是%f\n",result=a/b);break;  		default:;  	}  	printf("小黄鸡很机智吧！\n");  	return 0;  }

还是不行耶，你再看看，我给你代码和效果图： #include <stdio.h> #include <ctype.h> int main() {     int c,flag;     float a,b,result;     printf("欢迎来到小黄鸡会计算的世界\n");     printf("小黄鸡最近学会了加减乘除，你可以来考考它\n");     printf("请依次输入第一、二个数字，和你所需要的运算符号（且我们规定加减乘除依次为1、2、3、4），并用逗号隔开\n");     a=scanf("%f", &a);     printf("%f\n",a);     b=scanf("%f", &b);     printf("%f\n",b);     flag=scanf("%f", &flag);     switch(flag){         case '1': printf("结果是%f\n",result=a+b); break;         case '2': printf("结果是%f\n",result=a-b); break;         case '3': printf("结果是%f\n",result=a*b); break;         case '4': printf("结果是%f\n",result=a/b); break;         default:;     }     printf("小黄鸡很机智吧！\n");     return 0; }

另外应该是 case '1'  而不是case 1  同理其他

每个case后需要加上break; 不然会继续往下掉


Question: 小白每日一问关于动态库环境搭建

引用 1 楼 user-1 的回复:dll放到exe所在目录试一下   本来就是放在exe底下但是64位找不到 我放在 C:\Windows\SysWOW64 就OK了 谢谢

dll放到exe所在目录试一下


Question: 新手安装了vs2015写c语言出现诸多问题请给予帮助

右键 源文件->添加->新建项->C++ 文件 输入文件名，选择文件位置 编辑代码就可以了

创建工程就有问题吧。 http://jingyan.baidu.com/article/63acb44ac4964c61fcc17eb7.html

源文件都没有啊

源文件为什么会是TXT，你把扩展名改成cpp再试试吧，

你文件类型怎么是txt的

在 源文件 下面添加一个 .cpp ，然后把你的代码拷进去。


Question: 数据结构字符串的链式存储

你用LString接收Chunk *类型当然不对，强转或者把左值类型改掉

类型不对，改成：Chunk* s= new Chunk;


Question: ACM的题总是 PE 大神帮帮忙

引用 2 楼 qq_29499869 的回复:因为到达n时只需要HP大于零就好了，所以我的思路是从第n条路开始，设HP为0，一层一层往上算，到达路1时返回起点的HP，然后记录下最小的起点HP。 还有题目理解上有一点我不知道有没有问题:连接i点j点的只有一条路，而且只能从i到j(假如i小于j)，也就是说题目给的那个方阵对角线及左下应该全部为0，否则的话，可能会形成圈，他可以在几个点之间一直转，这样处理起来就比较麻烦了。 因为我这两天刚好断网，代码是拍的照片，用vs编译的，结果是4。还有就是录数据那段我没写。 照片好像没有传上来，代码在下面：  #include<iostream>  int N = 4; float A[100][100] = { { 0,-4,0,-10 },{ 0,0,3,0 },{ 0,0,0,-14 },{ 0,0,0,0 } }; //有除法运算，可能出现小数，所以用的浮点型 float initHP = 1e5; float fun(int j, float HP) { 	float currentHP = HP;	//记录这一层的HP 	for (int i = j-1; i >= 0; i--) { 		HP = currentHP; 		if (A[i][j] != 0) { 			//求上一层的HP，如果HP小于等于零，则为0。 			HP = (HP - A[i][j] ) / 2 > 0 ? (HP - A[i][j]) / 2 : 0; 			if (i == 0) return HP;	//i=0，到达起点，返起点HP 			else { 				float flag = fun(i, HP); 				//如果flag>0，则返回值是HP值，记录下最小的HP值。 				if (flag > 0 && flag < initHP) 					initHP = flag; 			} 		}			 	} 	return -1;	//为了跟HP区分，返回小于0的数 } int main()  { 	int flag = fun(N-1, 0);	//初始条件，路N，HP=0. 	//因为也可能有1直达n的路，这个时候flag返回的是HP值。 	if (flag > 0 && flag < initHP) 		initHP = flag; 	printf("%d", int(initHP) + 1); 	//因为HP>0,这里取大于initHP的最小整数。 	system("pause"); 	return 0; }

printf("%d",i); => printf("%d\n",i);


Question: 金字塔编程

对齐版： //    A //   ABA //  ABCBA // ABCDCBA //ABCDEDCBA #include <stdio.h> #include <conio.h> int n,h,s,i; int main() {     while (1) {         printf("Please input a character(A-Z):");         fflush(stdout);         rewind(stdin);         scanf("%c",&n);         if ('A'<=n && n<='Z') {             for (h=0;h<n-'A'+1;h++) {                 for (s=n-'A'-h;s>0    ;s--) printf(" "   );                 for (i='A'    ;i<'A'+h;i++) printf("%c",i);                 for (i='A'+h  ;i>='A' ;i--) printf("%c",i);                                             printf("\n"  );             }             getch();             break;         }     }     return 0; }

#include <stdio.h> #include <stdlib.h> int main() { 	int line, i; 	char letter, ch; 	printf("请输入一个大写字母:"); 	scanf("%c", &letter); 	for (line = 0; line <= letter - 'A'; line++) 	{ 		for (i = 0; i<letter - 'A' - line; i++) 			printf(" "); 		for (ch = 'A'; ch <= ('A' + line); ch++)           //升序输出字母 			printf("%c", ch); 		ch -= 2; 		while (ch != 'A' - 1) 			printf("%c", ch--); 		printf("\n"); 	} 	system("pause"); 	return 0; }

#include<stdio.h> #include<stdlib.h> int main() { 	int line, num, max, center; 	int i = 0, j = 1, k = 1; 	char word; 	printf("请输入行高:\n"); 	scanf_s("%d", &line); 	max = line * 2 - 1; 	while (i < line) { 		word = 'a'; 		j = 0; 		num = 2 * i + 1; 			while (j < (int)((max - num) / 2)) {		 				printf(" ");			 				j++; 			} 			while (j >= (int)((max - num) / 2) && j < (int)(max/2)) { 				printf("%c", word++); 				j++; 			} 			while (j < ((max - num) / 2 + num) && j >= (int)(max / 2)) { 				printf("%c", word--); 				j++; 			} 			if (j == ((max - num) / 2 + num)) { 				printf("\n"); 				i++; 			} 	} 	system("pause"); 	return 0; }

感谢感谢 第一次提问 新手初学  多多指教


Question: 求问这个程序输出单链表表的时候为什么只输出第一个结点呢？？

也可以把char data;改为char data[2]; 把%c改为%s

#include＜stdio.h＞ #include＜stdlib.h＞ typedef char ElemType; typedef struct LNode { 	ElemType data[2]; 	struct LNode *next; }LNode , *LinkList ;   void CreateList(LinkList &L,int n ) { 	LNode *q , *p; 	//LinkList p; 	L = ( LinkList ) malloc ( sizeof ( LNode )); 	L-＞next = NULL ; 	q = L; 	for( int i = 0 ; i ＜ n ; i++ ) 	{ 		p = ( LinkList ) malloc ( sizeof ( LNode )); 		scanf ( "%s", p-＞data ); 		getchar(); 		p-＞next = q-＞next ; 		q-＞next = p; 		q = p ;  	/*	p-＞next = L-＞next ; 		L-＞next = p ;*/ 	} }  void DipList ( LinkList L ) { 	LinkList p ;     p = L-＞next;    while ( p != NULL )    {    	printf("%s " , p-＞data);    	p=p-＞next ;    } } void MergeList ( LinkList ha , LinkList hb , LinkList &hc ,int m ,int n) { 	LNode *q , *p ; 	p = ha ;  	q = hb ; 	int j = 0 , i = 0; 	while ( i＜m && j ＜n ) 	{ 		i++ ;  		j++ ; 		p = p-＞next ; 		q = q-＞next ; 	} 	if ( i＜m)     {     	hc = hb;     	p = ha -＞next ;      	q-＞next = ha-＞next ;     	free(ha) ;     }     if ( j ＜ n )     {     	hc = ha ;     	q = hb-＞next ;     	p-＞next = hb-＞next ;     	free(hb);     } } int main() { 	int m ,n ; 	LinkList ha , hb ,hc; 	printf("请输入单链表a的长度:"); 	scanf("%d", &m ); 	printf("请输入单链表a的元素:\n") ;  	CreateList( ha , m); 	DipList(ha); 	printf("请输入单链表b的长度:");  	scanf("%d", &n ); 	printf("请输入单链表b的元素:\n") ; 	CreateList( hb , n); 	DipList(hb); 	MergeList (ha , hb ,hc , m , n) ; 	printf( "合并后的单链表为：") ; 	DipList ( hc ) ; 	return 0; }

非常感谢！！！

主要问题在于CreateList函数中的scanf ( "%c", &p->data )一句，这时留在输入流中的空格或者回车符都被当做一个%c输入，可以改为scanf ( " %c", &p->data )，即在%c前面加个空格用于剔除输入流中的空白符。

单步跟踪程序运行，每步观察变化情况分析原因


Question: 非负十进制数转八进制数，调试总是崩溃，求大神们看看

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

首先你的2个scanf用法就不对 你的Pop(S, e);根本没法通过e带出你的元素，必须要用一级指针或者引用才行 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

scanf("%d",a);  改成  scanf("%d",&a);

在原文麻烦修改下


Question: 求救，关于c调用fortran，多线程

至少高于系统权限。如果有杀毒软件权限比它高后看看。

把权限设置到最高。

还真是系统问题，真是太坑了，放到centos下就正常了，太可恨了，浪费我一天的时间，这应该是windows下编译器的bug了

别的系统咋样啊？觉得你很牛逼啊！！

我尝试不用fortran而用c去写那个功能，而封装成dll，在用c调用，cpu到100 看来是fortran和c实现函数原理上的差异造成的，有人能回答吗？


Question: 求解答，创建二叉树问题

引用 10 楼 小灸舞的回复:之所以不对，是因为你的在CreateBiTree函数前也输入过内容，所以输入缓冲区有遗留的回车符（可以被%c读取） 在调用CreateBiTree前加一句fflush(stdin); 加了，还和上图一样。。。。

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

引用 7 楼 鱼鱼鱼鱼鱼鱼zzzzz的回复:在scanf下面加一句getchar（）；清除缓存区 试过，还是不行......

在scanf下面加一句getchar（）；清除缓存区

那你就暂停调试啊，看断在哪里，在分析原因

引用 4 楼 paschen的回复:[quote=引用 2 楼 qq_36306059 的回复:] [quote=引用 1 楼 paschen的回复:]那你就暂停调试啊，看断在哪里，在分析原因 试过，走到那里就没反应了[/quote]  你的 scanf_s 少了一个参数  不会用就用scanf[/quote] 用scanf会报错，加了参数也还是那样

引用 3 楼 user-5的回复:scanf_s("%c", &ch,1); 试过，还是一样,用VS2015编译的

引用 2 楼 qq_36306059 的回复:[quote=引用 1 楼 paschen的回复:]那你就暂停调试啊，看断在哪里，在分析原因 试过，走到那里就没反应了[/quote]  你的 scanf_s 少了一个参数  不会用就用scanf

scanf_s("%c", &ch,1);

引用 1 楼 paschen的回复:那你就暂停调试啊，看断在哪里，在分析原因 试过，走到那里就没反应了


Question: 求助

inc是一个函数 而p是一个函数指针 楼主可以网上搜索函数指针学习

如您所言，谢谢

1) inc 不是一个指针。inc 是一个函数 2) 怎么改： typedef int (*func)(int);


Question: codeblocks编译软件

run有时没准会跳过build直接run

When you select build, it just compiles everything together. However, when you select run, it does the build process, but it also executes your project.

build and run 是先生成，再运行


Question: 如何/hook其他进程读写文件?实现硬盘读写操作定位到内存变量

引用 3 楼 赵4老师的回复:使用ramdisk 谢谢赵老师。。刚刚看了那个 @chenhui530 ,发现高手都越来越少了。可能是csdn的没落原因？ 好多高手前几年一直很活跃，可是近几年好像都销声匿迹了 可能他们现在已经当老板了，或者是做了更高的主管，所以很少出来，留言了。 只是相比娱乐圈，越是这些明星，他们越是在微博上得瑟。 程序员确实相反的。 难道就没有一个真正的程序员的？像是微博一样？可以一辈子发表信息的基地? 微博上的粉丝可以转换成，知名度还有金钱，广告费用。  这里的知名度，表面上来说没有任何作用，只是自己的心里感受。

使用ramdisk

搜 api inline hook

vs.net，可以在运行时动态输入一段vb.net或其他.net代码然后直接生成一个dll或exe,也可以直接在内存中运行，不需要保存到硬盘. 比如编译器编译程序时生成临时文件，最后生成目标exe.就是想把这些临时文件和目标exe全部动不让它保存在硬盘上,实现内存编译。 ==== 或者mediaplay播放器控件ocx flash控件需要一个文件名参数，把它重新定位到自己的一个内存变量。最终实现资源文件内容》》读入内存》》变成虚拟文件的一个内存变量。  总结就是如何让本进程或其他进程读写文件时变成读写自己的内存。用文件映射也可以，可以生成一个空的文件名，或者利用已有的文件。但是不做任何读写改变。不过完成之后把这个空文件删除。  目标是实现一些加密视频的不写硬盘直接播放。 我了解的一些方法是可以直接根据内存字节播放声音，还有显示图片。如何内存播放flash视频还有其他视频？


Question: 小白每日一问关于内存释放

你strddd中应该用stsrcpy或者memcpy来复制，否则你只是改变了指针的指向，这样内层指针不再指向你分配的内存，释放非动态申请的内存导致出错

strddd 里要用 strcpy   最后 pc[i] 已经不是 malloc 出来的了。  ===================== 记住，C 没有字符串类型


Question: 求解决，换行符为什么对结果有影响啊，这程序错哪了

主要是函数JIE定义为int 却没返回值，

引用 8 楼 paschen的回复:[quote=引用 6 楼 Dknight321 的回复:] [quote=引用 4 楼 apple_v1的回复:]不知道没有return为什么能编译得过，jie是明确要求返回一个int值的 是不是因为我用的是void main()...[/quote]  和这没关系，已经说了，不要去研究未定义的行为[/quote] 好吧，只能这样理解了吧

引用 5 楼 paschen的回复:没有retrun返回的是当前EAX寄存器中的值，是不确定的，未定义行为，可能碰巧对，也可能错 好像有点道理哈，但不加换行符的输出结果很有意思

引用 6 楼 Dknight321 的回复:[quote=引用 4 楼 apple_v1的回复:]不知道没有return为什么能编译得过，jie是明确要求返回一个int值的 是不是因为我用的是void main()...[/quote]  和这没关系，已经说了，不要去研究未定义的行为

引用 6 楼 Dknight321 的回复:[quote=引用 4 楼 apple_v1的回复:]不知道没有return为什么能编译得过，jie是明确要求返回一个int值的 是不是因为我用的是void main()...[/quote] gcc可以不用写return，vs不行

引用 4 楼 apple_v1的回复:不知道没有return为什么能编译得过，jie是明确要求返回一个int值的 是不是因为我用的是void main()...

不知道没有return为什么能编译得过，jie是明确要求返回一个int值的

引用 1 楼 user-4的回复:递归不写return的吗 特别是有无换行符的差异

引用 1 楼 user-4的回复:递归不写return的吗 写return的话是对的，但是这样做，错的机理是啥呀

递归不写return的吗


Question: 关于realloc的正确使用

另外，你应该用strcpy_s 而不是strcat_s吧

strcat_s(pStrings[str_count++],str_len,buf);  改成：  strcat_s(pStrings[str_count++],BUF_LEN,buf);


Question: 关于共享栈的问题

栈1空，栈2满时 ， top1=-1， top2=0  top1是从 -1生长到n-1 top2是从n 生长到 0； 两个栈生长方向不一样； 就像原文说的，top1+1=top2 时栈满


Question: 一维数组的方式使用指针变量，求解其

A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

ap[0]就是a ap[1]显然就越界了

ap[i] 等价于 *(ap + i)   但访问时要注意不要越界  ap指向的不是数组，只是一个int元素，所以只有ap[0]是不越界的

引用 3 楼 hardwin 的回复:[quote=引用 2 楼 user-5 的回复:] i[ap] 也是 *(i + ap) 二者只要一个是地址值，一个是整数，就这样算 引用 1 楼 user-5 的回复:ap[i] 就是 *(ap + i)  那这里*(ap + 1)使用错误吗？[/quote]  错误，越界了。

语法上没有错误，使用上有问题：ap + 1 到底指向的是哪儿？指向的那个地方的内容能随便改吗？不能保证的话，就不能贸然使用

引用 2 楼 user-5 的回复:i[ap] 也是 *(i + ap) 二者只要一个是地址值，一个是整数，就这样算 引用 1 楼 user-5 的回复:ap[i] 就是 *(ap + i)  那这里*(ap + 1)使用错误吗？

ap[i] 就是 *(ap + i)


Question: C语言读取文件中数字的类型

看对应汇编指令才是正途。

引用 11楼赵4老师 的回复:看对应汇编指令才是正途。看汇编语言吗？我现在是想先打基础

3.5赋值给整型的i，会向下取整

m/n，如果俩边都是int，就会向下取整，实际上是向0取整。如果按数学除的结果是-1.5就会变成-1。如果想让他显示小数精确值，可以写成3.0f/4.0f，实际结果就是0.75

引用 5 楼 loveqise的回复:引用 2楼paschen 的回复:2、 因为这里做是整数的除法，商的结果向小取整的，之后+0.5的时候会转换成double，得到3.5，然后又转换成int，变成3应该植两个int相除，得到的还是int类型，所以截尾取整对吧 15 / 4  商 3 余 3， 结果是3，整数除法结果就是商那一项

引用 4 楼 loveqise的回复:引用 1楼paschen 的回复:1、如果是用文本方式打开的，读到的是字符串，以二进制方式读则可以读各种类型用scanf %d读取文本格式打开的文件中的数字，读到的也是字符吗？ fscanf可以按指定格式读取文本文件，可以直接得到数值

引用 3楼user-4 的回复:1. 文件中的整数是什么样子的？读是怎么读的？等等都会影响结果 ... 2. C 语言的表达式不是数学公式。你得找本书看看 C 语言表达式是怎么算的。应该植两个int相除，得到的还是int类型，所以截尾取整对吧

1、如果是用文本方式打开的，读到的是字符串，以二进制方式读则可以读各种类型


Question: 数据结构，求大神看看这个怎么回事（错误已标出）

#include "stdafx.h" #include "malloc.h" #include "stdlib.h" #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef struct LNode{ 	int data; 	LNode *next; }LNode,*LinkList; void GetElem_L(LinkList L,int i,int &e)//第i个元素值赋给e { 	LNode *p; 	p=L->next;int j=1; 	while(p&&j<i) 	{ 		p=p->next;++j;//这儿报错，error C2227: left of '->next' must point to class/struct/union。应该怎么修改呀。 	} } int main(int argc, char* argv[]) { 	printf("Hello World!\n"); 	return 0; }

int *next; // 应该struct LNode *next int *p;


Question: 请问枚举和宏定义可以这样用吗？

不可以的 楼上说可以的是不正确的 刚刚也遇到这样的问题

引用 3 楼 fefe82 的回复:不可以。  预编译发生在编译之前，enum E 的定义根本不会被处理。  预编译里能够替换的只有 define 。  在 #if 之后，所有不能通过 #define 被替换为字面量的标识符和关键字都会被替换为0。  #define DEF A   #if DEF == A // 定义一些代码 #elif DEF == B // 定义另外一些代码 #endif 会变成  #define DEF A   #if 0 == 0 // 定义一些代码 #elif 0 == 0 // 定义另外一些代码 #endif  无论你把 DEF #define 成 A B C D ... ，都是一样的。  ======================== 一下是可以的： #define DEF 1   #if DEF == 1 // 定义一些代码 #elif DEF == 2 // 定义另外一些代码 #endif 引用 3 楼 fefe82 的回复:不可以。  预编译发生在编译之前，enum E 的定义根本不会被处理。  预编译里能够替换的只有 define 。  在 #if 之后，所有不能通过 #define 被替换为字面量的标识符和关键字都会被替换为0。  #define DEF A   #if DEF == A // 定义一些代码 #elif DEF == B // 定义另外一些代码 #endif 会变成  #define DEF A   #if 0 == 0 // 定义一些代码 #elif 0 == 0 // 定义另外一些代码 #endif  无论你把 DEF #define 成 A B C D ... ，都是一样的。  ======================== 一下是可以的： #define DEF 1   #if DEF == 1 // 定义一些代码 #elif DEF == 2 // 定义另外一些代码 #endif  明白了，非常感谢。

参考gcc源代码中处理宏和处理枚举相关源代码片断。

显然是不行的，预处理指令只处理那些 # 开头的行，而且一切判断都必须是字面值或者宏名称，A、B 这些枚举值对于预处理器来说只是一些文字而已，根本还没有到语法解析层面。

楼上说的对，预编译阶段时还不会处理你的enum，所以无论你宏怎么定义，执行的都是#if DEF == A 片断代码

可以的   enum E { 	A, 	B, };   后面加上分号

可以，C的枚举相当于常量，在编译阶段枚举就会替换成常量。


Question: 各位请问这段代码哪里错了

第二层while循环条件不对  int main() { 	char a[50] = "abcdecdffcdg"; 	char b[5] = "cd"; 	char c[5] = "dc";  	char *pa = a; 	char *pb = b; 	char *pc = c; 	pa = strstr(pa, pb);  	while (pa != NULL) 	{ 		while (*pc != '\0') 		{ 			*pa = *pc; 			pa++;  			pc++;  		} 		pc = c; 		pa = strstr(pa, pb); 	}  	printf("%s\n", a); 	return 0; }


Question: leetcode runtime error但是在电脑Xcode下运行是没问题的

拿着出错的那组输入慢慢调试吧。


Question: 菜鸟。。求解。。（双循环链表

引用 4 楼 paschen 的回复:因为他们指向同一块内存，你通过一个指针改变这片内存内容，另一个指针获得的当然也是变化后的 明白了  ：） 我把 t = s 改为 t = s->prior 就可以了

引用 2 楼 user-2 的回复:你把s=t-＞prior;这句写在t=s;之后就是你要的效果了 不行啊。。我想做个双循环的就地逆置，，加这句还是不行的

引用 1 楼 user-2 的回复:s没向后移，s和t指向同一个节点啊 那我想把s在第十行位置保存的地址维持在t 里面不变，要怎么办

你把s=t-＞prior;这句写在t=s;之后就是你要的效果了

s没向后移，s和t指向同一个节点啊


Question: free产生的断点，我知道不怪free，但自己实在查不出来，帮忙看一下

引用 2 楼 user-1 的回复:容我问一句，ClearBN中memset(ClTar->numP,NULL,ClTar->size*sizeof(int))，不应该是sizeof(char)吗？ 。。。。。。。。。。。。。。。。。。 好了。。谢谢。不知道怎么输成int的。。糗。。。

可能是这里出错了  作用是向后顺移空间内的数据。 应该是这个，因为没触发这个函数时，不会有断点。


Question: 程序过不去不知道是什么问题

换成换掉VC6了 http://blog.csdn.net/cometnet/article/details/19551125

最后一条语句，return 0后面没有分号 ，应该为 return 0;

引用 8 楼 myloveqingmu 的回复:[quote=引用 5 楼 u010165006 的回复:] 用 char *str[]={ "      ******        ", "   *******          ", "      *********    " }; 再循环输出比较方便。 也可以这样：  #include <stdio.h>  static char s[] = "********\n" "*      *\n" "********\n";  int main() {     printf("%s", s);     return 0; } [/quote]  这个可以有。

#include <stdio.h> int main() {     printf(         "********\n"         "*      *\n"         "********\n"     );     return 0; }

老实说你可以先编译build或者compile-再连接（或者执行）。这样可以看见一些error。仔细读一读那些ide给你提示的错误

引用 5 楼 u010165006 的回复:用 char *str[]={ "      ******        ", "   *******          ", "      *********    " }; 再循环输出比较方便。 也可以这样：  #include <stdio.h>  static char s[] = "********\n" "*      *\n" "********\n";  int main() {     printf("%s", s);     return 0; }

第二行到最后一行开头的printf(和第一行到倒数第二行末尾的）；可以去掉。

这是得多无聊，写这么多printf

return 0 后面少了分号

楼上正解，没有分号。

return 0; 没有分号


Question: C语言中传递一个二维数组

函数参数使用float(*)[n][n]  假设array是一个float[n][n]的二维数组，调用时使用&array

因为a和b要在不同的函数中使用，所以应该把a和b定义成全局变量或者主函数里的变量，建议定义在主函数里，然后把a和b的地址传入input，在里面分配内存、初始化，以后每个函数都要传递a个b两个参数，不过如果程序较小，定义成全局变量也行，就不用每次都传了

首先感谢你的回复，你说的我都能理解，但是用到二维数组，操作起来我就蒙了，你能否帮我调试一下，让我学习学习，我调试了一下午也没对，谢谢。


Question: 排序模块部分首位置莫名出现1！ 很奇怪......

很尴尬 小弟我也发现了错误  哎@—@

是你自己多打了一个1：  printf("排序后的数组是:\n1");  后面多了个1


Question: 关于C/C++中的地址读取错误问题

哦     懂了  谢谢各位大神啦   原来是我在第二次修改代码的时候弄错了  谢谢各位

void CreateLinkList_L(LinkList &l, int n) //顺序输入n个数据元素插入单链表尾部 {     LinkList p,r;     InitLinkList(L);     r = l;     printf("please enter the value of node:\n");     for (int i = 1; i <= n; i++)     {         p = new LNode;         scanf_s("%d", &p->date);         r->next = p;         r = p;     }     r->next = NULL; //**************不是l->next，是r->next或p->next********************************** }

因为你CreateLinkList_L函数最后让l->next = NULL; 这样之后当然进不了循环了  DisplLinkList中的p也就为NULL


Question: c语言程序，请高手给我看看变步长4阶龙格库塔法解常微分方程组的程序，非常感谢！

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

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

先手工算一下，确保过程没问题了，再把过程写成程序

return z1;但出来的数值解跟解析解不一样，是主函数出问题了？

rkf()函数的return语句呢？

点第二个按钮（重试），然后点中断，通过调用堆栈定位到相关代码观察分析原因


Question: 新手问一个问题

引用 1楼user-3 的回复:这样写：max = x > y ? x : y;  其他的同理改万分感谢

治好了我多年来的颈椎病。

楼上正解

这样写：max = x > y ? x : y;  其他的同理改


Question: C语言做的小程序，其中一个模块做计算器，但是执行结果闪退

system("pause")

#pragma warning(disable:4996) ……

先找出是哪一句引起的闪退。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

scanf_s比scanf多一个参数。 比如你scanf("%d", &a); scanf_s就要写成scanf_s("%d", &a, sizeof(a));

？，我把scanf_s全部改成了scanf，（因为不改编译不通过），然后运行了一下，没有出现闪退。可以正常运行。。

计算器程序界面不错！  推荐楼主学习C++ Builder图形用户界面，入门比较容易。 仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/

scanf_s("%s",Expression); 这句，scanf_s比scanf要多一个参数


Question: 新手问一个问题，求大神解答

引用 5 楼 iizhuzhu 的回复:引用 4楼flying_music 的回复:你的两位数是怎么输入的啊，中间加空格了吗？你可以用gdb调试一下，看看程序到底跑哪儿去了大神，为什么要加空格，求指教 "%d%d"，输入两个数中间必须要用空白字符隔开，然后再按回车 你原来只是输入了一个两位数，回车后给了变量shi，而ge还没有得到值，scanf还没有返回呢，所以就没有任何反应了

引用 4楼flying_music 的回复:你的两位数是怎么输入的啊，中间加空格了吗？你可以用gdb调试一下，看看程序到底跑哪儿去了瞧我这，不加空格就是一个数了，谢谢

引用 1楼user-4 的回复:程序执行完就退出了，在最后加上getchar();不对，要不您检查一下我的代码？作用就是输入一个俩位数，用英语表示出来

程序执行完就退出了，在最后加上getchar();

程序执行完就退出了，在最后加上getchar();


Question: 用C语言编写出一个界面窗口

楼主如果想用BC编写图形程序，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

\BC\TVISION目录下是文本窗口系统的源代码


Question: 小程序，debug下异常(数据异常，未出错崩溃)，release下正常

windows里常见的内存填充数据含义 * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： //循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef _MSC_VER     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX; CRITICAL_SECTION cs_BBB; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             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]:'.');             }             Log("%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]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int main() { #ifdef _MSC_VER     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX);     InitializeCriticalSection(&cs_BBB); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef _MSC_VER     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef _MSC_VER     DeleteCriticalSection(&cs_BBB);     DeleteCriticalSection(&cs_HEX);     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

引用 3 楼 gurlsandguys的回复:回复2楼   没有出现出错中断，只是在debug下传递结构体指针参数时，突然该指针所指的结构体就全部乱码了。单步调试时，就在函数传参结束时就变了。我只会单步调试，只是注意到了指针所指地址并没变内容在单步就变了。不会调试了。还有就是为什么在release下单步时，传参又正常呢，求解 那就是你程序有问题了，认真检查，是否有越界，是否返回了局部变量等

引用 3 楼 gurlsandguys 的回复:回复2楼   没有出现出错中断，只是在debug下传递结构体指针参数时，突然该指针所指的结构体就全部乱码了。单步调试时，就在函数传参结束时就变了。我只会单步调试，只是注意到了指针所指地址并没变内容在单步就变了。不会调试了。还有就是为什么在release下单步时，传参又正常呢，求解  根本原因还是程序写错了。(出现随机、诡异的、时好时坏的等等错误，基本都是程序错了)  没有更多信息除了教你怎么调试之外也干不了啥 ...   出这种诡异问题可以尝试内存断点（在某一特定内存地址内容发生变化的时候中断）。 当然也可能需要去汇编级单步 ...

引用 9 楼 gurlsandguys 的回复:[quote=引用 8 楼 paschen 的回复:]  debug全用0xCCCCCCCC填充，这样如果使用未初始化的变量，这个变量值会是这个值  请教一下栈里不是初始化过的结构体指针吗，为什么debug会把它全部未初始化掉呢？debug填充它的意义是什么？[/quote]  VC 会把未初始化的栈内存全部填成 0xcc  楼主要了解可以自己网上搜下  不过这与你代码没有关系，不要在这些上面找原因

重新改了一下 刚开始的一个子函数在头文件中的定义负责申明一个新结构体，初始化，并传回指针。现在将申明新结构体从子函数中移出来了，子函数只负责初始化。可能是在这个子函数中申明，而又不知道在另一个子函数调用结构体时，如何正确地全局申明。所以把申明直接提出来了，就好了。 要想在main函数调用一个子函数就得到一个唯一的初始化过的全局结构体，并在接下来的MAIN中不加以申明就可以被其他函数调用，这种方式太迷糊。索性不用了。试了很久，可能以C++的方式来的话就简单多了。 最后再次谢谢三位老师的帮助！

引用 8 楼 paschen 的回复:debug全用0xCCCCCCCC填充，这样如果使用未初始化的变量，这个变量值会是这个值  请教一下栈里不是初始化过的结构体指针吗，为什么debug会把它全部未初始化掉呢？debug填充它的意义是什么？

引用 7 楼 gurlsandguys 的回复:@paschen ，@user-3 ，@赵4老师    谢谢各位的帮助~，我在反汇编界面对比两种编译模式得到以下图 debug↓  release↓    单步时发现，就在1图蓝色箭头的那一行之后出错，我百度了一下，该行的命令是将栈上从edi开始的位置向高地址方向的内存赋值0xCCCCCCCC,次数重复ecx次.  不明白为什么会有这个过程，虽然看过书里的解释，但还是不怎么清楚堆栈和反汇编。只知道堆先进先出，栈后进先出，堆是分配的内存，栈是局部变量和函数返回值等。没有接触过实例，所以并不足以让我深入地看懂上面的图。  debug全用0xCCCCCCCC填充，这样如果使用未初始化的变量，这个变量值会是这个值

出错了点中断，通过调用堆栈定位到相关代码，观察分析原因

还有一个地方拿不准就是  我在头文件里用ifndef define把整个头文件包括了。其中就有extern申明。


Question: C语言的一些问题，特别想问问int86函数

引用 35 楼 qq_36179060 的回复:过两天就要验收了，不管怎么样，感谢各位的帮助了，虽然小白依旧卡死在bug里2333  做课设吧！ 小bug没事。

引用 33 楼 bigwatercar 的回复:[quote=引用 32 楼 qianzilu 的回复:] [quote=引用 21 楼 bigwatercar 的回复:] http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。感谢，之前帖子太多被刷过去了，才看到，感谢这么费心~[/quote]  结贴多给点儿分儿就行啦 引用 31 楼 qianzilu 的回复:再求问一下，运行程序时闪退可能有哪些原因呢？加了getch也停不住…… 贴代码[/quote] 解决了，说到底是编程习惯问题2333

引用 32 楼 qianzilu 的回复:[quote=引用 21 楼 bigwatercar 的回复:] http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。感谢，之前帖子太多被刷过去了，才看到，感谢这么费心~[/quote]  结贴多给点儿分儿就行啦 引用 31 楼 qianzilu 的回复:再求问一下，运行程序时闪退可能有哪些原因呢？加了getch也停不住…… 贴代码

引用 21 楼 bigwatercar 的回复:http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。感谢，之前帖子太多被刷过去了，才看到，感谢这么费心~

再求问一下，运行程序时闪退可能有哪些原因呢？加了getch也停不住……

引用 29 楼 hijack00 的回复:int86函数不是C标准库函数，而且BC也基本不流行了。建议楼主把精力放到主流的库和IDE上，不要在这些过时的技术上浪费时间了我也知道过时了，但是目前要用没办法啊……

引用 25 楼 zhangganglei 的回复:[quote=引用 24 楼 bigwatercar 的回复:] [quote=引用 22 楼 zhangganglei 的回复:] [quote=引用 20 楼 bigwatercar 的回复:] 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了[/quote]  你先看看微机原理，了解一下中断是什么，中断向量表。   你最好有一个学习板，能直接手工触发中断。[/quote]  中断和向量表我已经明白了。微机原理上学时看过，不过基本上忘了。手里没有硬件，所以只用TC的interrupt来写程序。想请教一个问题，网上搜来的中断程序，多数是一个把中断号写入0x13，然后计数器从0加到20自动退出的程序。。另外看过一个，把中断函数写入0X1B，则按ctrl+break调用。那我想问下，如何在按wads这四个键时产生中断，从而调用我自己写的函数呢。 麻烦大大告诉一下，或者提个醒，从哪里获得这些东西也成。谢谢。[/quote]  按键会产生键盘中断的，你把你的ISR挂到键盘中断就可以了。 应该是INT1（你确认一下）。这样只要按下键盘任何一个按键，你的ISR都会动，你在你的ISR中判断是不是WASD，是就处理，不是就继续调用你保存的旧的ISR入口。就酱~~

DOS下键盘中断是9 仅供参考：#define	cRES	0x70 #define	cSYM	0x70 #define	cIDE	0x71 #define	cFUN	0x75 #define cUSR    0x7B #define	cNUM	0x74 #define	cCOM	0x7E #define cSTR    0x79 #define cERR    0x3F //------------------------------------------------------- #pragma option -N- //------------------------------------------------------- #include <conio.h> #include <ctype.h> #include <dir.h> #include <dos.h> #include <process.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //------------------------------------------------------- const char *sym=" &*<>()-=+[]:;,./?\\";//#$"` const char help[25][80]={ "谀Block哪哪哪哪哪哪哪哪哪哪哪履Cursor哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪目", "砪opy block        @c, ^kc   砱oto block beg  ^qb ?goto block end  ^qk     ?, "砫rop anchor       @a        砱oto line       ^J  ?MakeCtrOfScreen #f5     ?, "砿ark block begin  f7, ^kb   硃age down       ^c  ?MakeTopOfScreen f5      ?, "砿ark block end    f8, ^Kk   硃rev position   ^qp ?page up         ^r      ?, "砿ark line         @l        硈creen right    @f6 ?screen left     @f5     ?, "砿ove block        @m, ^kv   硈croll up       ^w  ?scroll down     ^z      ?, "硆ead block        @r, ^kr   硈hiftright      #f8 ?shiftleft       #f7     ?, "硊nmark block      @u, ^kh   硍ord right      ^f  ?word left       ^a      ?, "硍riteblock        @w, ^kw   媚Files哪哪哪哪哪哪哪哪哪哪穆腤indows- ^o 哪哪拇", "媚Edit哪哪哪哪哪哪哪哪哪哪哪拇change filename   @o, ^kf  砪lose window  ^oc ?, "砤dd line          f2        砮dit file         @e, ^ke  砱row window   ^og ?, "砫elete block      @g, ^ky   砮xit              ^kd      砈plit Window  ^oh ?, "砫el line          @d, ^y    砯ile              ^kx      硁ext window   ^on ?, "砫el rt word       ^t        砱lobal exit       @x, f10  硂ne window    ^oo ?, "砫el to eol        f6, ^qy   硁ext file         @n, ^kn  硃rev window   ^op ?, "砫up line          f4        硂s                @f9      硈hrink window ^os ?, "砳nsert line       @f2       硃quit             ^kq      硓oom window   ^oz ?, "砵oin line         @j        硃rev file         ^kp      媚Search/Replace哪拇", "砽iteral           ^p        硈ave file         ^ks      砯ind         ^qf  ?, "硈plit line        @s, ^n    硈hell             f9       砯ind replace ^qa  ?, "硊ndo cursorline   ^ql       媚Macro哪哪哪哪哪哪哪哪哪哪拇match        @f3  ?, "硊nkill            ^u        矼acro Record      ^m       硆epeat find  ^l   ?, "滥哪哪哪哪哪哪哪哪哪哪哪哪哪牧哪哪哪哪哪哪哪哪哪哪哪哪哪牧哪哪哪哪哪哪哪哪哪?, "              # = <Shift>     @ = <Alt>     ^ = <Ctrl>                       " }; char scr[4000]; int xx,yy,ii; //------------------------------------------------------- #define nRES 100 #define nFUN 500 #define nUSR 200 #define nBUF 6400 unsigned RES=0; char *res[nRES]; unsigned FUN=0; char *fun[nFUN]; unsigned USR=0; char *usr[nUSR]; char buf[nBUF]; //------------------------------------------------------- char str[41]; int directvideo=1; int in=0; int lines; int x,y,i,j,k,n,st,x1; char ascii[81],attr[80],attr1[80]; extern unsigned _heaplen = 32; extern unsigned _stklen  = 256; void interrupt (*oldint9)(); //------------------------------------------------------- void getline(int y) { 	char far *scr; 	int	i,j;  	scr=(char far *)(0xB8000000L+y*160); 	for	(i=0,j=0;i<160;i+=2,j++) { 		ascii[j]=scr[i]; 		attr[j]=scr[i+1]; 	} 	ascii[80]=0; 	memcpy(attr1,attr,80); } //------------------------------------------------------- void putline(int y) { 	char far *scr; 	int	i,j;  	scr=(char far *)(0xB8000000L+y*160); 	for	(i=0,j=0;i<160;i+=2,j++) { 		scr[i]=ascii[j]; 		scr[i+1]=attr[j]; 	} } //------------------------------------------------------- void interrupt newint9() { 	if (in==0) { 		in=1; 		if ((peekb(0,0x417)&0x10)==0x10) {//ScrollLock 			lines=peekb(0,0x484)+1; 			for	(y=1;y<lines;y++) { 				getline(y); 				x=0; 				st=0; 				while (1) { 					if (x>=80) break; 					if (st==0) { 						if (isalpha(ascii[x])||ascii[x]=='_') { 							st=1; 							i=0; 							str[i]=ascii[x]; 							x1=x; 							i++; 						} else if (isdigit(ascii[x])) { 							st=4; 							x1=x; 						} else if (strchr(sym,ascii[x])!=NULL) { 							attr[x]=cSYM; 						} else if (ascii[x]=='#') { 							st=2; 							attr[x]=cCOM; 						} else if (ascii[x]=='"'||ascii[x]==39) { 							st=3; 							attr[x]=cSTR; 						} else { 							attr[x]=cERR; 						} 						x++; 						continue; 					} 					if (st==4) {//in number 						if (!isdigit(ascii[x]))	{ 							st=0; 							memset(attr+x1,cNUM,x-x1); 							x--; 						} 						x++; 						continue; 					} 					if (st==3) {//in string 						if (ascii[x]!='"'&&ascii[x]!=39) { 							attr[x]=cSTR; 						} else { 							st=0; 							attr[x]=cSTR; 						} 						x++; 						continue; 					} 					if (st==2) {//in comment 						attr[x]=cCOM; 						x++; 						continue; 					} 					if (st==1) {//in [A-Za-z_][0-9A-Za-z_]@ 						if (isalnum(ascii[x])||ascii[x]=='_') { 							str[i]=ascii[x]; 							i++; 						} else { 							st=0; 							str[i]=0; 							for	(j=0;j<RES;j++)	{ 								if (strcmp(str,res[j])==0) break; 							} 							if (j<RES) memset(attr+x1,cRES,x-x1); 							else { 								for	(j=0;j<FUN;j++)	{ 									if (strcmp(str,fun[j])==0) break; 								} 								if (j<FUN) memset(attr+x1,cFUN,x-x1); 								else { 									for	(j=0;j<USR;j++)	{ 										if (strcmp(str,usr[j])==0) break; 									} 									if (j<USR) memset(attr+x1,cUSR,x-x1); 									else memset(attr+x1,cIDE,x-x1); 								} 							} 							x--; 						} 						x++; 						continue; 					} 				} 				if (strchr(ascii,'?)!=NULL                   ||strchr(ascii,'?)!=NULL 				  ||strchr(ascii,'?)!=NULL                   ||strchr(ascii,'?)!=NULL                   ||strchr(ascii,'?)!=NULL 				  ||strchr(ascii,'?)!=NULL) { 					st=0; 					for	(i=0;i<80;i++) { 						if (st==0) {                             if (ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?) { 								st=1; 								attr[i]=attr1[i]; 							} 							continue; 						} 						if (st==1) { 							attr[i]=attr1[i]; 							if (ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?) { 								st=0; 							} 						} 					} 				} else if (y==peekb(0,0x451)) for (i=0;i<80;i++) attr[i]&=0x3F; 				for	(i=0;i<80;i++) { 					if ((attr1[i]&0xF0)==0x20) attr[i]=(attr[i]&0x0F)|0x20; 					if ((attr1[i]&0xF0)==0x40) attr[i]=0x4F; 					if ((attr1[i]&0xF0)==0x10) attr[i]=0x1F; 				} 				putline(y); 			} 		} 		in=0; 	} 	oldint9(); } //------------------------------------------------------- int Load(char *name,int *count,char *table[],int number) { 	FILE *f; 	char *p;  	p=searchpath(name); 	if ((f=fopen(p,"r"))==NULL) { 		printf("Can not open %s\n",name); 		return(0); 	} else { 		while (1) { 			fgets(str,40,f); 			if (feof(f)) break; 			(*count)++; 		} 		if ((*count)>number) { 			printf("%s's items > %d\n",name,number); 			fclose(f); 			return(0); 		} 		rewind(f); 		k=n; 		for	(i=0;i<(*count);i++) { 			fgets(str,40,f); 			memcpy(buf+k,str,strlen(str)-1); 			table[i]=buf+k; 			k+=strlen(str); 			buf[k-1]=0; 		} 		n=k; 		fclose(f); 		if (n>nBUF)	{ 			printf("Total character numbers > %d\n",nBUF); 			return(0); 		} 		return(1); 	} } //------------------------------------------------------- void main(int argc, char *argv[]) { 	xx=wherex(); 	yy=wherey()-1; 	_fmemcpy(scr,(char far *)0xB8000000L,4000); 	if (argc==2&&(argv[1][0]=='/'&&argv[1][1]=='?')) { 		clrscr(); 		for	(i=0;i<25;i++) { 			cprintf("\r\n%s",help[i]); 		} EXIT: 		getch(); 	} else { 		n=0; 		if (Load("VOSRES.SYN",&RES,res,nRES)==0) goto EXIT; 		if (Load("VOSFUN.SYN",&FUN,fun,nFUN)==0) goto EXIT; 		if (Load("VOSUSR.SYN",&USR,usr,nUSR)==0) goto EXIT; 		oldint9=getvect(9); 		setvect(9,newint9);         textmode(C4350); 		spawnvp(P_WAIT,	"ED.EXE", argv); 		textmode(C80); 		setvect(9,oldint9); 	} 	_fmemcpy((char far *)0xB8000000L,scr,4000); 	gotoxy(xx,yy); }

引用 22 楼 zhangganglei 的回复:[quote=引用 20 楼 bigwatercar 的回复:] 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了[/quote]  你先看看微机原理，了解一下中断是什么，中断向量表。   你最好有一个学习板，能直接手工触发中断。

还是学Win32 API吧，这些东西一般人没用了。

引用 24 楼 bigwatercar 的回复:[quote=引用 22 楼 zhangganglei 的回复:] [quote=引用 20 楼 bigwatercar 的回复:] 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了[/quote]  你先看看微机原理，了解一下中断是什么，中断向量表。   你最好有一个学习板，能直接手工触发中断。[/quote]  中断和向量表我已经明白了。微机原理上学时看过，不过基本上忘了。手里没有硬件，所以只用TC的interrupt来写程序。想请教一个问题，网上搜来的中断程序，多数是一个把中断号写入0x13，然后计数器从0加到20自动退出的程序。。另外看过一个，把中断函数写入0X1B，则按ctrl+break调用。那我想问下，如何在按wads这四个键时产生中断，从而调用我自己写的函数呢。 麻烦大大告诉一下，或者提个醒，从哪里获得这些东西也成。谢谢。

C:\>VESA This video card supports VESA The VESA version is:2.0 The OEM is S3 Incorporated. Trio64 This video card supports following VESA mode: 0100	0101	0102	0103	0104	0105	0106	0107	010D	010E	010F	0110	0111	0112	0113	0114	0115	0116	0117	0150	0151	0152	0153	0160	0161	0162	0165	0170	0171	0172	0175	0190	0191	0192	0207	0209	020A	0213	0222	0223	0224	0225	  VIDEO mode=0100  TextMode=100	Xres=640	Yres=400	BitsPerPixel=8 textW=8	textH=16 NumPlanes=1	NumBank=1	MemMode=4	BankSize=0 NumPages=4	IncPages=1	Margin=256

引用 20 楼 bigwatercar 的回复:楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了

这些现在真的是用不上了

引用 17 楼 qianzilu 的回复:[quote=引用 16 楼 u010165006 的回复:] 是学习环境还是生产环境？ 呃，抱歉不是很懂这两者的区别，但就是暂时短期内是在用BC3.1做课设，用的是集成虚拟DISK_C的版本。[/quote]  做课设，如果你只是需要解析BMP图片格式，没必要用DOS平台的BC3.1，用VC+EasyX就可以了，你可以用EasyX创建窗口，自己解析BMP再逐点画到窗口，如果你不用EasyX的图片显示函数的话。

引用 16 楼 u010165006 的回复:是学习环境还是生产环境？ 呃，抱歉不是很懂这两者的区别，但就是暂时短期内是在用BC3.1做课设，用的是集成虚拟DISK_C的版本。


Question: vc6.0打开文件或工程闪退 网上的方法已试过

不要用VC6了，15年前的了，使用新版VS吧

在虚拟机中的WinXP下使用VC6


Question: 求推荐C语言入门书籍

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

C Primer Plus    C语言经典入门书籍  另参看：http://bbs.csdn.net/topics/390966354/


Question: 如何利用EOF终止scanf输入多行带空格的字符串

解决了没有，我的也要三个，要死了

引用 5 楼 helloylzheng 的回复:[quote=引用 3 楼 赵4老师的回复:]for(int t=0;EOF!=scanf("%[^\n]\n",str[t]);t++); 还是不行啊，您的代码需要按下两次eof才能停止[/quote] 参考2楼。

引用 3 楼 赵4老师的回复:for(int t=0;EOF!=scanf("%[^\n]\n",str[t]);t++); 还是不行啊，您的代码需要按下两次eof才能停止

引用 3 楼 赵4老师的回复:for(int t=0;EOF!=scanf("%[^\n]\n",str[t]);t++); 等我回去就试试，先谢谢您

<Enter>,<Ctrl+Z>,<Enter>


Question: 一道简单的ACM题目求助，实在搞不懂为什么了，编译器能得出正确的结果，但是提交却出错

搞出来了 是我排序的问题   用动态分配内存都一样啦  报的是Wrong Answer的错  不是内存的问题  还是谢谢了

引用 3 楼 csdn_blog_lcl的回复:受教了 ，可我想知道我的代码为什么提交不了 我参考了别人的代码，没有找出缘由 都说你用动态分配内存就可以了

出啥错？  引用 3 楼 csdn_blog_lcl 的回复:受教了 ，可我想知道我的代码为什么提交不了 我参考了别人的代码，没有找出缘由

受教了 ，可我想知道我的代码为什么提交不了 我参考了别人的代码，没有找出缘由

struct student stu[1000];  struct student outlineStudents[1000];  你的struct student就有20多字节， 不要在栈上分配那么大的数组，使用动态申请内存吧

#include<stdio.h> #include<string.h>  struct student { 	char id[21]; 	int totalGrades;   };    int main() { 	int N,M,G,outlineNum,index,proNum; 	int i,j,k; 	struct student stu[1000];  	struct student outlineStudents[1000];  //  出线的学生数组 	int gradesArr[12];   //每道题的分数数组 	while(scanf("%d",&N)!=EOF && N) 	{ 		outlineNum = 0; 		scanf("%d%d",&M,&G); 		for(i = 1; i <= M; i++) 		{ 			scanf("%d",&gradesArr[i]); 		} 		for(j = 0;j < N;j++) 		{ 			stu[j].totalGrades = 0; 			scanf("%s%d",stu[j].id,&proNum); 			for(i = 0;i < proNum;i++) 			{ 				scanf("%d",&index); 				stu[j].totalGrades += gradesArr[index]; 			} 			if(stu[j].totalGrades >= G) 			{ 				outlineStudents[outlineNum++] = stu[j];   // 统计出线人数 			} 		} 		for(i = 0 ;i < outlineNum-1;i++)   //  按照成绩排序 		{ 			for(k = i+1;k < outlineNum;k++) 			{ 				if(outlineStudents[i].totalGrades < outlineStudents[k].totalGrades) 				{ 					struct student temp = outlineStudents[i]; 					outlineStudents[i] = outlineStudents[k]; 					outlineStudents[k] = temp; 				} 				if(outlineStudents[i].totalGrades == outlineStudents[k].totalGrades) 				{ 					if(strcmp(outlineStudents[i].id,outlineStudents[k].id) == 1) 					{ 						struct student temp = outlineStudents[i]; 						outlineStudents[i] = outlineStudents[k]; 						outlineStudents[k] = temp; 					} 				} 			} 		} 		printf("%d\n",outlineNum);   //  开始输出 		for(i = 0; i < outlineNum;i++) 		{ 			printf("%s %d\n",outlineStudents[i].id,outlineStudents[i].totalGrades); 		} 	} 	return 0; }  这样可能好看点


Question: C语言中计算与硬盘IO的并行/并发执行

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

那就搜索"linux 异步IO"啊, 标准库与系统关系大的像是IO, 线程都和玩具一样,  简单用一下还行, 复杂的还是用操作系统的吧

引用 1 楼 user-2 的回复:windows api自带异步IO参数 多谢回复！ 额，不过是在linux下的，有没有对应的呢？有的话可否讲具体一点？

windows api自带异步IO参数


Question: 在VS2015中多个文件向一个文件中追加数据，下面的程序该怎么修改

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


Question: 栈区增长方向是高地址向低地址吗？存储一个数据也是这个方向？

栈的方向是你后压栈的变量与先压入栈的变量的方向有关，而与单个变量的大端与小端存储无关

栈区的增长方向是从高地址到低地址，也就是说栈顶的地址低于栈底

在C语言中，多字节变量（例如int）存在字节序的问题，即：高位字节存在内存高地址处还是低地址处，为此有大端序和小端序的区别。 楼主这里混淆了一个概念，就是字节序跟变量是保存在全局数据区还是在栈区是没有关系的。  其实字节序总结一下很好记忆的 大端序：高低低高 小端序：高高低低  一般x86平台都是小端序，也就是高高低低，即：高位字节存放在内存高地址处，低位字节存放在低地址处。对于整型变量a=0x12345678，其内存布局为78 56 34 12 大端序一般在以太网通信中，所以又叫网络字节序，因此上面的变量a在大端序系统上就是12 34 56 78  此外，栈的生长方向在x86平台都是从高地址往低地址方向，在其他平台则不一定，例如，在ARM平台上，栈的增长方向是可以配置的

堆栈增长方向与大小端没有任何关系。


Question: 求教指针运用问题。c语言入门经典第7章例题13题想了两天还是不明白

引用 4 楼 lbc_77 的回复:谢谢各位大神！  一、[quote=引用 1 楼 paschen 的回复:] 问题1，因为上面的循环在输入为\n时结束，此时pBuffer还会自加1，所以已经指向了下一个字符 意思是指，当pbuffer - buffer ==  BUFFER_LEN-1时已经结束while循环，但pbuffer++导致又指向了下一个字符。此时pbuffer - buffer ==  BUFFER_LEN？  二、引用 2 楼 paschen 的回复:问题2，不等于 前者在&&前半部分为假时则不会执行后半部分  而后者总会至少执行一次getchar 请问我的循环需要怎么修改才与原文的逻辑相符，运算结果相同？  三、请大神帮忙回答下第3个问题。百思不得其解。 非常感谢！ [/quote]  具体没细看，可能写错了，不必太纠结  建议单步跟踪程序运行，观察每一步程序变化，比较容易想

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

谢谢各位大神！  一、引用 1 楼 paschen 的回复:问题1，因为上面的循环在输入为\n时结束，此时pBuffer还会自加1，所以已经指向了下一个字符 意思是指，当pbuffer - buffer ==  BUFFER_LEN-1时已经结束while循环，但pbuffer++导致又指向了下一个字符。此时pbuffer - buffer ==  BUFFER_LEN？  二、引用 2 楼 paschen 的回复:问题2，不等于 前者在&&前半部分为假时则不会执行后半部分  而后者总会至少执行一次getchar 请问我的循环需要怎么修改才与原文的逻辑相符，运算结果相同？  三、请大神帮忙回答下第3个问题。百思不得其解。 非常感谢！

buffer是数组首地址，pbuffer初次等于buffer，你可以想象一格一格（表示内存空间）的作文纸，buffer表示起始格（buffer[0])地址，后面一格是buffer[1]，最后一格是buffer[BUFFER_LEN-1]，这BUFFER_LEN格是连续排列的。pbuffer首先指向buffer[0]，pbuffer++可以使pbuffer指向下一格（即buffer[1]），如果pbuffer指向buffer[3]（第3格），pbuffer-buffer==3（就是第3格与起始格第0格的距离），pbuffer-buffer==BUFFER_LEN-1表示pbuffer指向最后一格了，pbuffer-buffer<BUFFER_LEN-1表示pbuffer还没到最后一格，然后*pbuffer = getchar()读一个字符存入 pbuffer指向的格，然后pbuffer++指向下一格，然后判断刚才读入的那格字符是不是'\n'回车符，如果pbuffer还没到最后一格而且读入的不是回车字符， while((pbuffer - buffer < BUFFER_LEN-1) &&((*pbuffer++ = getchar()) != '\n')); 语句是反复执行的（后面有一个;号表示空语句），直到条件不满足（到达了最后一格，或者读入了回车符）。


Question: 关于long double类型

我回去试试，多谢各位

个人感觉(我是小白)你的L应该表示的是，后面括号内运行后，结果的类型，然而，你后面括号内的类型是指数型(指数用什么来着我忘记了，或者指数没有表示的？)。楼上的表达式没错，计算机也能运行。(不过，我感觉不像是你想要的答案 /~~")ps:我也刚学，书上说:不要乱写，能省则省……

引用 4 楼 user-5的回复:L 对应的类型是 long， 而不是long double l是long L是long double吧？

3楼正解？

int main() {   long double a = 1.23L;   return 0; } L后缀只能用来修饰常量，不能用来修饰表达式

long double y=(3.31e10L*2.01e-7L)/(7.16e-6L+2.01e-8L);

long double y=(3.31e10FL*2.01e-7FL)/(7.16e-6FL+2.01e-8FL);

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  C++ Floating-Point Constants  See Also  Send Feedback     Floating-point constants specify values that must have a fractional part. These values contain decimal points (.) and can contain exponents.  Floating-point constants have a "mantissa," which specifies the value of the number, an "exponent," which specifies the magnitude of the number, and an optional suffix that specifies the constant's type. The mantissa is specified as a sequence of digits followed by a period, followed by an optional sequence of digits representing the fractional part of the number. For example:    Copy Code  18.46 38.    The exponent, if present, specifies the magnitude of the number as a power of 10, as shown in the following example:    Copy Code  18.46e0      // 18.46 18.46e1      // 184.6    The exponent may be specified using e or E, which have the same meaning, followed by an optional sign (+ or -) and a sequence of digits. If an exponent is present, the trailing decimal point is unnecessary in whole numbers such as 18E0.  Floating-point constants default to type double. By using the suffixes f or l (or F or L — the suffix is not case sensitive), the constant can be specified as float or long double, respectively.  Although long double and double have the same representation, they are not the same type. For example, you can have overloaded functions like    Copy Code  void func( double );    and     Copy Code  void func( long double );    See Also Concepts Literals (C++) Send feedback on this topic to Microsoft.

L要写在常数后，不是一个计算的表达式后面，更不能是括号后面

L 对应的类型是 long， 而不是long double