Question: 一个c语言链表删除学号的问题

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 仅供参考：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

引用 1 楼 ck.zZ的回复:删除结点请参考： http://blog.csdn.net/CHENYUFENG1991/article/details/50773279?locationNum=2&fps=1 为啥我输出会有中文，而且就停在那里了


Question: 编译器出问题了，麻烦帮我调试下。告诉一下问题出哪里了

Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

引用 5 楼 zhao4zhong1 的回复:调试不了建议洗洗睡吧。 程序没解决，睡不着啊！！

调试不了建议洗洗睡吧。

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

引用 1 楼 幻夢之葉的回复:所以你还是重装下IDE吧 现在要是下的了我就不会发帖子了。

所以你还是重装下IDE吧


Question: 关于循环队列的错误 新人找不到哪错了

边界条件 是码农永远的痛！

int Enqueue(Queue *Q, int *e)//入  {   //if((Q->rear+1)%MAXSIZE == Q->front)   if((Q->rear+1)%MAXSIZE > Q->front)   {           return FALSE;   }   Q->data[Q->rear] =*e;   Q->rear = (Q->rear + 1)%MAXSIZE;   }  int Empty(Queue *Q) {         if (Q->front == Q->rear) //此判断也可能是满的         return TRUE;         else          return FALSE; }    建议rear用size代替，size代表队列当前有多少个元素 入队直接放在 front + size 的位置 size++; 出队 front++, size--  size == 0 空队列 size == MAXSIZE 即为满队列 这两种情况都不能进行入队操作


Question: 求助，真的很急

我也想知道。

Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

如果这问题很简单的话，RSA加密还怎么号称安全？

SO 有个 libc++ 的实现，http://stackoverflow.com/questions/4475996/given-prime-number-n-compute-the-next-prime


Question: 这句sprintf怎么理解

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

让str中的内容为： 变量a = %X ，其中%X用 变量B 的十六进制值替换

产生一个字符串“变量a=b”（变量b是十六进制的形式的数，“变量a=”是四个字符），并且保存到str中


Question: 计算器的编写想实现连加连减连乘连除  刚刚学习的菜鸟求大神指点

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数^     ⑿向上取整ceil     ⒀向下取整floor     ⒁四舍五入取整round 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);    (*iop)--;break;         case  8: x=cos(x);    (*iop)--;break;         case  9: x=tan(x);    (*iop)--;break;         case 10: x=sqrt(x);   (*iop)--;break;         case 11: x=asin(x);   (*iop)--;break;         case 12: x=acos(x);   (*iop)--;break;         case 13: x=atan(x);   (*iop)--;break;         case 14: x=log10(x);  (*iop)--;break;         case 15: x=log(x);    (*iop)--;break;         case 16: x=exp(x);    (*iop)--;break;         case 17: x=ceil(x);   (*iop)--;break;         case 18: x=floor(x);  (*iop)--;break;         case 19: x=round(x,0);(*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/'||c=='%') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }


Question: 输入正确的文件名会得到错误的结果

scanf("%[^\n]",filename);

文件名最好不要带空格和中文 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

你输入的那个文件名中间有空格，scanf是以空格作为输入项的分隔符的


Question: 数据类型转换

a-'0'表示char型的数转换为int型 a+'0'表示int型的数转换为char型

数学运算啊，那叫啥的啊斯克码


Question: 来个能人帮我改c语言程序为c++么

C是C++的子集，楼主的问题就好比将一个"男人"变成一个"人"一样!

C++是支持C语言的语法的,你直接改一下文件后缀名,用C++的编译器也能编过和运行

C能跑，C++也能跑

c++ 基本兼容 c，直接编译就行了吧。有一些不一样的地方可能会导致编译错误，具体问题具体分析就行了。


Question: 求助

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

// gongshi.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include "math.h"  //2.4e9<=3e8sqrt(m*m/a/a+n*n/b/b+p*p/d/d)<=2.5e9 //其中a=0.46,b=0.4,d=0.4,求m,n,p数的组合，m,n,p为0-9的整数。  int main(int argc, char* argv[]) { 	double a = 0.46; 	double b = 0.4; 	double d = 0.4; 	int m, n, p; 	for( m = 0; m <= 9; m++ ) 	{ 		for( n = 0; n <= 9; n++ ) 		{ 			for( p = 0; p <= 9; p++ ) 			{ 				double result; 				result = 3 * 10000000 * sqrt( m * m / a / a + n * n / b / b + p * p / d / d ); 				if( result >= 2.4 * 1000000000 					&& 					result <= 2.5 * 1000000000 					) 				{ 					printf( "ok ---- m = %d, n = %d, p = %d, result = %f\r\n", m, n, p, result ); 				} 				else 				{ 					printf( "error - m = %d, n = %d, p = %d, result = %f\r\n", m, n, p, result ); 				} 			} 		} 	} 	//printf("Hello World!\n"); 	return 0; }    解不出来

// 2.4e9<=3e8sqrt(m*m/a/a+n*n/b/b+p*p/d/d)<=2.5e9 // 其中a=0.46,b=0.4,d=0.4,求m,n,p数的组合，m,n,p为0-9的整数。 #include <stdio.h> #include <math.h> int main() {     int m,n,p;     double a=0.46,b=0.4,d=0.4,v;     for (m=0;m<10;m++) {         for (n=0;n<10;n++) {             for (p=0;p<10;p++) {                 v=3e8*sqrt(m*m/a/a+n*n/b/b+p*p/d/d);                 if (2.4e9<=v && v<=2.5e9) {                     printf("m,n,p:%d,%d,%d\n",m,n,p);                 }             }         }     }     return 0; } //m,n,p:1,1,3 //m,n,p:1,3,1 //m,n,p:2,2,2 //m,n,p:3,0,2 //m,n,p:3,2,0 //

原来我少写了个0。

谢谢您，刚刚我又重新算了一下，是这样计算编程的。

老师你好，今天您给的代码在计算过程中出现的结果不符合不等式的限制。您看看有什么问题吗？


Question: 输入到文件尾C语言

gets, _getws Get a line from the stdin stream.  char *gets( char *buffer );  wchar_t *_getws( wchar_t *buffer );  Routine Required Header Compatibility  gets <stdio.h> ANSI, Win 95, Win NT  _getws <stdio.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns its argument if successful. A NULL pointer indicates an error or end-of-file condition. Use ferror or feof to determine which one has occurred.  Parameter  buffer  Storage location for input string  Remarks  The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character. _getws is a wide-character version of gets; its argument and return value are wide-character strings.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _getts gets gets _getws    Example  /* GETS.C */  #include <stdio.h>  void main( void ) {    char line[81];     printf( "Input a string: " );    gets( line );    printf( "The line entered was: %s\n", line ); }   Output  Input a string: Hello! The line entered was: Hello!   Stream I/O Routines  See Also   fgets, fputs, puts

1009  时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 总提交: 46            测试通过: 29  描述    在C语言里，定义整型变量a可以使用语句：  int a;  而定义一重指针变量p1指向a变量，即把a变量的地址储存在指针变量p1里，可以使用语句：  int *p1;  p1 = &a;  若要通过p1访问变量a，应该使用：  *p1  定义二重变量p2指向p1指针，即把p1的地址存储在p2里，可以使用：  int *p2;  p2 = &p1;  由于p1之前已经指向a，因此通过p2可以访问到a变量，使用：  **p2  以此类推......  现在给出一个x重指针变量的定义，并假设之前已经定义过1重，2重，...，x-1重指针变量，而且已经将1重指针变量指向a变量，2重指针指向1重指针，...，x重指针指向x-1重指针。  问如何通过x重指针访问变量a？    输入    输入数据有多组，每组只描述x重指针变量的定义，定义格式为：   intX Y;  其中X为若干个*，Y遵守C语言标识符命名规则。每行总长度不超过100个字符。  输入直到文件结束为止。    输出    每组输出一行，每行输出一串字符，表示如何通过定义的指针访问a变量，不留空格。    样例输入  int* p; int** prr; int**** yyy;   样例输出  *p **prr ****yyy   这是题目


Question: 数据结构表达式求值

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


Question: 这两者的区别是什么

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

for() { //此处有代码就不同了   for() //此处有代码就不同了 }

for()循环后面必须是一条语句或者一条复合语句，{}大括号内的就是一条复合语句， for(...)   sum+=i; 这样也是一条复合语句。 有些情况使用{}，代码更加清晰。

没啥区别，看习惯了

似乎没区别

目前没区别，但加入代码就有区别了

没区别。for结构整体上就是一个语句，外面加不加大括号无所谓

一个嵌套，一个平级！

没区别。你要非说区别的话，就是一个把循环体标出来了，一个没标出来。


Question: 关于0<=10为真还是为假的问题

楼主该补补小学算数了。

这是一个数学上的逻辑的问题，0<10固然正确，0=10肯定错误。0<=10这个式子等价于0<10“或”0=10，即（“真”||“假”），得到的值当然是真了。

C语言里没有这种n>=1<=10写法，这个写法本身就很奇怪 要写也应该写成1<=n<=10(虽然这种写法也是错的)

引用 8 楼 zhao4zhong1 的回复:楼主该补补小学算数了。 跟你什么关系？让我补数学？咱俩很熟么？什么时候轮到你给我说三道四了？ 我不懂就问怎么了？我要是不懂1+1等于多少那我照样也能问的出来！我给你说 每个人在这里都是想让自己编程进步的人，最讨厌这种不解决问题还往别人身上泼冷水的人。

莫名其妙，不清不楚

n >= 1 <= 10 第一次判断：0（n） >= 1，假，所以（n >= 1）值为 0。 第二次判断：0（n >= 1） <= 10， 真，所以整个式子为 真。 所以便执行了 if 里的语句。 但是标准的写法应该是 if (n >= 1 && n <= 10) 这样的话 n>= 1 便不满足，不会执行。

引用 3 楼 qq_37120435 的回复:为什么0<=10为true呢？0不等于10啊 <=是小于或者等于，就是不大于。 莫非你能找出一个等于10并且小于10的数？

if(n>=1<=10)  就会先判断 n >= 1 为 false false 跟 int 比较，false转int为0 0 <= 10 当然是true了

if(n>=1 && n<=10)


Question: 请教个进制转换的问题，想了2天没有解决

引用 7 楼 zhao4zhong1 的回复:#include <stdio.h> #include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     unsigned char keyBuf[9]={0x02,0xea,0xfb,0xea,0x4e,0x72,0x56,0xe5,0x9b};     int i;     char sx[4];     string s1,s2,s256,res;      s256=string("256");      sprintf(sx,"%u",keyBuf[0]);     s1=string(sx);     for (i=1;i<9;i++) {         res=MUL_INT(s1,s256);         s1=res;         sprintf(sx,"%u",keyBuf[i]);         s2=string(sx);         res=ADD_INT(s1,s2);         s1=res;     }     cout<<s1<<endl;     return(0); } //53825872994095261083 //  问题已解决，赵老师给的代码是C++语言的，我后来用VC6.0跑运行，然后用C实现的String类型的字符串数组，谢谢赵老师提供的高精度算法思路。

引用 3 楼 u010165006 的回复:a0*16^0 + a1*16^1 + a2*16^2 ...我九个字节其实是从数组元素1到数组元素8的16进制字符串。要转换成10进制字符串，在放到一个20个元素长度的数组中。  引用 7 楼 zhao4zhong1 的回复:#include <stdio.h> #include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     unsigned char keyBuf[9]={0x02,0xea,0xfb,0xea,0x4e,0x72,0x56,0xe5,0x9b};     int i;     char sx[4];     string s1,s2,s256,res;      s256=string("256");      sprintf(sx,"%u",keyBuf[0]);     s1=string(sx);     for (i=1;i<9;i++) {         res=MUL_INT(s1,s256);         s1=res;         sprintf(sx,"%u",keyBuf[i]);         s2=string(sx);         res=ADD_INT(s1,s2);         s1=res;     }     cout<<s1<<endl;     return(0); } //53825872994095261083 // 赵老师，可以给个概述吗？我环境有点问题，跑不起来。我看到是用高精度乘法和高精度加法。乘法的时候是哪2个参数，加法的时候又是哪两个参数，谢谢赵老师。

引用 3 楼 u010165006 的回复:a0*16^0 + a1*16^1 + a2*16^2 ...这个权值的方法解决不了我的问题，我怎么得到这个20个长度的10进制数值呢。

引用 3 楼 u010165006 的回复:a0*16^0 + a1*16^1 + a2*16^2 ... 引用 2 楼 bjym1987 的回复:很简单的  9b == 9*16+b 其它的照算移位就好了我是要把0x02,0xea,0xfb,0xea,0x4e,0x72,0x56,0xe5,0x9b，九个字节数据转换成20位的十进制数呢，这个20位的数值，我JAVA程序里是有的Bigdecimal类型，但C里面是没有的。

引用 1 楼 bjym1987 的回复:unsigned char keyBuf[9]={0xea,0xfb,0xea,0x4e,0x72,0x56,0xe5,0x9b};计算器上这个才是你转的结果吧计算器上转不了，只有64bit，我9个字节有效其实是66个Bit位。

a0*16^0 + a1*16^1 + a2*16^2 ...

很简单的  9b == 9*16+b 其它的照算移位就好了


Question: 代码输出超限是什么鬼，acm是怎么判断的，为什么每次在codeblocks上运行感觉都非常正常

100万以内的素数有78498个

网上说使用查表法，使用空间换速度。 100万之前的可以预先做张表格

引用 10 楼 qq_36409192 的回复:#include<stdio.h> int main() {     int n,tag,i,j; 	scanf("%d",&n); 	for(i=2;i<n;i++) 	{ 		tag=0; 		for(j=1;j<=i;j++) 			if(i%j==0) 				tag++; 		if(tag==2) 			printf("%d  ",i); 	} 	return 0; } 谢谢对了，但是要少个空格

引用 7 楼 u012909435 的回复:这个要用筛法。。。。 筛法是什么，筛选么

引用 6 楼 m1478 的回复:会不会是多了或少了空格。 不知道，样例里输出之间是有空格的

这个要用筛法。。。。

会不会是多了或少了空格。

引用 1 楼 xsklld 的回复:随便给个大点的N，比如123456789，看看在Code::Blocks上要跑多久。好慢要22多秒

引用 1 楼 xsklld 的回复:随便给个大点的N，比如123456789，看看在Code::Blocks上要跑多久。 会不会是我定义的N范围太小，

引用 2 楼 FancyMouse 的回复:你这应该是超时不是超输出吧它上面是说输出超限，，没有说超时

你这应该是超时不是超输出吧


Question: C++  vector 转化成数组，push_back函数怎样转化，加断点监测变量值发现不一样

谢谢各位，已经知道哪里出问题并且改好了

malloc、realloc、free


Question: 关于strcmp函数的疑惑

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

for (i = 1; i < 7; i++) 这一句错了， 改为]for (i = 0; i < 7; i++)

循环从1开始，Sunday是date[0]，根本没匹配到，把for循环里面的i=1改成i=0试试


Question: 程序找错 下面一段程序有什么错，找出并改正

栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

不要返回局部变量，标准对于这种行为未定义

返回局部变量的地址是未定义行为

#include <stdio.h>  char *foo(int *handle) {     static char str[] = "okay\n";     *handle = 1;      return str; }  int main(void) {     //void **handle;     int handle;      char *result;     result = foo(&handle);     if (handle == 1) {         printf("%s", result);     }     return 0; }  问题1, 使用野指针,handle就是野指针,如果单从你的去求是从函数foo中获取一个标志值,没必要使用二重指针,直接使用一重指针即可. 问题2: 获取栈上的地址；函数foo中str数组是栈上空间,获取其地址,然后在main函数里再次使用没有意义.因为foo函数调用完后栈空间会被自动释放,在使用没有意义,很容易被别的程序再次申请foo的使用过的栈空间.  改的方法:handle使用了变量,str使用了静态数组,因为字符串"oky\n"是在数据段,不会跟着foo的释放而无效,所以main函数也可以读到正确的字符串..

#include <stdio.h>  char *foo(void **handle) { char str[] = "okay\n"; *handle = 1; //void* 的数据不能直接被使用，地址用int 赋值也不匹配 return str; }  int main(void) { void **handle; //没有分配内存就直接使用  char *result; result = foo(handle); if (*handle == 1) {  printf("%s", result); } return 0; }


Question: 栈内存定义大小有什么需要注意的？

/STACK   (Stack Allocations) Home |  Overview |  How Do I |  Linker Options  The Stack Allocations (/STACK:reserve[,commit]) option sets the size of the stack in bytes.   To find this option in the development environment, click Settings on the Project menu. Then click the Link tab, and click Output in the Category box. The Reserve text box (or in the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. The linker rounds up the specified value to the nearest 4 bytes.  The optional value specified in the Commit text box (or in the commit argument on the command line) is subject to interpretation by the operating system. In Windows NT, it specifies the amount of physical memory to allocate at a time. Committed virtual memory causes space to be reserved in the paging file. A higher commit value saves time when the application needs more stack space, but increases the memory requirements and possibly the startup time.  Specify the reserve and commit values in decimal or C-language notation.  Another way to set the size of the stack is with the STACKSIZE statement in a module-definition (.DEF) file. STACKSIZE overrides the Stack Allocations (/STACK) option if both are specified. You can change the stack after the .EXE file is built by using the EDITBIN tool.

栈大小一般只有几M（1~10M） http://blog.csdn.net/xxxxxx91116/article/details/10068555

太大的变量无法在栈中分配(比如说你分配一个大小为10000000的int型数组)，这时候就需要从内存中分配空间给变量，否则会造成程序崩溃。

程序运行的栈空间没有那么大,它是反复使用的段内存空间,因为函数,局部变量,代码都会用到栈上的空间.空间小,内容也不少,所以,平时定义栈上的数据(比如局部变量数组)时应根据需要来定义大小；如果实在需要比较大空间,建议使用堆上空间,相对栈还是比较大的.或者定义成全局的变量,但是一般对于大数句还是在堆上申请比较好.


Question: 非常简单的一道函数水题，但是提交上去就是答案错误不知道为什么，代码看起来还算正常

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

你的格式不匹配，输入和输出的形式都有点问题，具体见楼上答案

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

输出答案的格式不对，你这是一个数据，一个结果，不是输完数据，连出结果。

输入是add(1,7)不是1 7

scanf("%d%d",&a,&b); 里面缺个分割符吧，比如逗号什么的。scanf("%d,%d",&a,&b);  不知道你输入具体啥样，猜的。

引用 5 楼 qq423399099 的回复:你的输入不满足题目要求的，改成这样试试：  #include<stdio.h> void add(int x, int y) { 	printf("%d", x + y); } void main() { 	int a, b, n, i, sum; 	scanf("%d", &n); 	getchar(); 	for (i = 0; i<n; i++) 	{ 		scanf("add(%d,%d)", &a, &b); 		getchar(); 		add(a, b); 		printf("\n"); 	} }   谢谢，是我没有看清题目，太不好意思了，，，，


Question: c语言如何解析.vsd（visio生成的图）文件

Visio文件以.vss格式保存，可以直接使用记事本打开。 内容为xml文件格式，可以进行分析。

在Visio中开始记录宏，手动完成所需功能，结束记录宏，按Alt+F11键，查看刚才记录的宏对应的VBA代码。 调用vba for Visio  参考C调用vba for excel：// Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Visual C++ Language  Reference and related // electronic documentation provided with Microsoft Visual C++. // See these sources for detailed information regarding the // Microsoft Visual C++ product.  // NOTE: This example will only work with Excel8 in Office97 // Compile with cl /GX comexcel.cpp // TO DO: Edit the #import paths //#pragma message ("Make sure you go to Tools.Options.Directories and add the paths to mso97.dll and vbeext1.olb.  Mso97.dll will usually be in c:\\\"Program Files\"\\\"Microsoft Office\"\\Office, and vbeext1.olb will be in c:\\\"Program Files\"\\\"Common Files\"\\\"Microsoft Shared\"\\VBA") #import "C:\\Program Files\\Common Files\\Microsoft Shared\\Office11\\mso.dll" no_namespace rename("DocumentProperties", "DocumentPropertiesXL") #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\VBA6\\VBE6EXT.OLB" no_namespace #import "C:\\Program Files\\Microsoft Office\\OFFICE11\\excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces  #pragma warning (disable:4192 4146)  #include <stdio.h> #include <tchar.h>  void dump_com_error(_com_error &e) {     _tprintf(_T("Oops - hit an error!\n"));     _tprintf(_T("\a\tCode = %08lx\n"), e.Error());     _tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());     _bstr_t bstrSource(e.Source());     _bstr_t bstrDescription(e.Description());     _tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);     _tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription); }  // If this is placed in the scope of the smart pointers, they must be // explicitly Release(d) before CoUninitialize() is called.  If any reference // count is non-zero, a protection fault will occur. struct StartOle {     StartOle() { CoInitialize(NULL); }     ~StartOle() { CoUninitialize(); } } _inst_StartOle;  void main() {     using namespace Excel;      _ApplicationPtr pXL;      try     {       pXL.CreateInstance(L"Excel.Application");        pXL->Visible = VARIANT_TRUE;        WorkbooksPtr pBooks = pXL->Workbooks;       _WorkbookPtr pBook  = pBooks->Add((long)xlWorksheet);       _WorksheetPtr pSheet = pXL->ActiveSheet;        RangePtr pRange;       pRange = pSheet->Range["A21"];       pRange->Value2 = 75L;       //pRange->NumberFormatLocal = "@";        _CommandBarsPtr pCmdbars = pXL->CommandBars;       int iCmdbars = pCmdbars->GetCount();        Sleep(1000);       pRange = pSheet->Range["20:20"];       pRange->Insert( (long)Excel::xlDown );       pRange->Merge();        Sleep(1000);        pBook->Saved = VARIANT_TRUE;       pXL->Quit();     }     catch(_com_error &e)     {       dump_com_error(e);        pXL->Quit();     } }

引用 2 楼 i0703mtf 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 在Visio中开始记录宏，手动完成所需功能，结束记录宏，按Alt+F11键，查看刚才记录的宏对应的VBA代码。 调用vba for Visio  我现在需要从文件内解析出图标对应的关系，例如图A链接了图B，不是想对现有的文件本身做操作，这种方式不可以吧[/quote]   我个人认为，你的这个开发需求实现起来十分复杂，我也没时间看这个东西，但我觉得你首先要阅读微软的相关的SDK说明，最好先从 MSDN 上找答案。

引用 1 楼 zhao4zhong1 的回复:在Visio中开始记录宏，手动完成所需功能，结束记录宏，按Alt+F11键，查看刚才记录的宏对应的VBA代码。 调用vba for Visio  我现在需要从文件内解析出图标对应的关系，例如图A链接了图B，不是想对现有的文件本身做操作，这种方式不可以吧


Question: C语言新手问题

引用 17 楼 a149979032 的回复:[quote=引用 15 楼 a149979032 的回复:] [quote=引用 14 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 a149979032 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 // [/quote] 您能跟我说一下问题是出在哪里了吗？我输出也改了%lf了[/quote] 我试了输出还是0.00000，表示不解[/quote] 终于好了原来是n没有赋初值，十分感谢老师！

引用 15 楼 a149979032 的回复:[quote=引用 14 楼 zhao4zhong1 的回复:] [quote=引用 12 楼 a149979032 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 // [/quote] 您能跟我说一下问题是出在哪里了吗？我输出也改了%lf了[/quote] 我试了输出还是0.00000，表示不解

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

谢谢解答

scanf("%f",&a);  改成：  scanf("%lf",&a);  输入时double一定要用 %lf  输出时可以用 %f

double 8字节，flot 4字节，你scanf使用 %f肯定是不行的 scanf 的话 %f和%lf不能混淆的

把%f 改成 %lf

类型匹配：float对应的是%f,double对应的是%lf

引用 14 楼 zhao4zhong1 的回复:[quote=引用 12 楼 a149979032 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 // [/quote] 您能跟我说一下问题是出在哪里了吗？我输出也改了%lf了

引用 12 楼 a149979032 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗[/quote] #include <stdio.h> #include <math.h> int main() {     int i,n;     double x0,x1,f,f1;     x0=1.5;     n=100;     for (i=1;i<=n;i++) {         f=2.0*x0*x0*x0-4.0*x0*x0+3.0*x0-6.0;         f1=6.0*x0*x0-8.0*x0+3.0;         x1=x0-f/f1;         if (fabs(x0-x1)<1e-5) break;         printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%lf,%lf\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //

引用 10 楼 user-6 的回复:[quote=引用 7 楼 a149979032 的回复:] 又遇到问题了，这个怎么用double输出的时候是0.000000，求大神解答 #include<stdio.h> #include<math.h> int main() { 	int i,n; 	float x0,x1,f,f1; 	x0=1.5; 	for(i=1;i<=n;i++) 	{ 		f=2*x0*x0*x0-4*x0*x0+3*x0-6; 		f1=6*x0*x0-8*x0+3; 		x1=x0-f/f1; 		if(fabs(x0-x1)<1e-5) break; 		x0=x1; 	} 	printf("x1=%f\n",x1); 	return 0; } 没有进入for循环，x1为初始值[/quote] 你试一下看看啊

引用 11 楼 zhao4zhong1 的回复:#include <stdio.h> #include <math.h> int main() {     int i,n;     float x0,x1,f,f1;     x0=1.5f;     n=100;     for (i=1;i<=n;i++) {         f=2.0f*x0*x0*x0-4.0f*x0*x0+3.0f*x0-6.0f;         f1=6.0f*x0*x0-8.0f*x0+3.0f;         x1=x0-f/f1;         if (fabs((double)(x0-x1))<1e-5) break;         printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);         x0=x1;     }     printf("i,x0,x1=%3d,%f,%f\n",i,x0,x1);     return 0; } //i,x0,x1=  1,1.500000,2.333333 //i,x0,x1=  2,2.333333,2.061002 //i,x0,x1=  3,2.061002,2.002557 //i,x0,x1=  4,2.002557,2.000005 //i,x0,x1=  5,2.000005,2.000000 //  我的意思是在main底下的声明用double,可以用吗

引用 7 楼 a149979032 的回复:又遇到问题了，这个怎么用double输出的时候是0.000000，求大神解答 #include<stdio.h> #include<math.h> int main() { 	int i,n; 	float x0,x1,f,f1; 	x0=1.5; 	for(i=1;i<=n;i++) 	{ 		f=2*x0*x0*x0-4*x0*x0+3*x0-6; 		f1=6*x0*x0-8*x0+3; 		x1=x0-f/f1; 		if(fabs(x0-x1)<1e-5) break; 		x0=x1; 	} 	printf("x1=%f\n",x1); 	return 0; } 没有进入for循环，x1为初始值

引用 8 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 老师，我最下面这个程序经过调试在float时没有出现问题，但是变成double就不行了，试了很多次，找不出原因，真心求解，望帮我解惑，谢谢


Question: local function definitions are illegal求解

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

1.有个函数少了一个括号 2.main函数里L=Arrage(L);应该是L=Arrange(L); 3.InputData函数你没有return值  #include<stdio.h> #include<string.h> #define MaxSpace 100 #define keylen 7 #define RADIX_n 10 #define RADIX_c 26 typedef char KeyType; typedef struct{ 	char start[7]; 	char end[7]; 	char sche[12]; 	char time1[5]; 	char time2[5]; 	char model[3]; 	int price; }InfoType; typedef struct{ 	KeyType keys[keylen]; 	InfoType others; 	int next; }SLNode; typedef struct{ 	SLNode sl[MaxSpace]; 	int keynum; 	int length; }SLList; typedef int ArrType_n[RADIX_n]; typedef int ArrType_c[RADIX_c]; void Display(SLList L, int i);  void Distribute(SLNode *sl, int i, ArrType_n f, ArrType_n e) { 	int j, p; 	for (j = 0; j < RADIX_n; j++) 	{ 		f[j] = 0; 		e[j] = 0; 	} 	for (p = sl[0].next; p; p = sl[p].next) 	{ 		j = sl[p].keys[i] % 48; 		if (!f[j]) 			f[j] = p; 		else 			sl[e[j]].next = p; 		e[j] = p; 	} }  void Collect(SLNode *sl, int i, ArrType_n f, ArrType_n e) { 	int j, t; 	for (j = 0; !f[j]; j++); 	sl[0].next = f[j]; 	t = e[j]; 	while (j < RADIX_n - 1) 	{ 		for (j = j + 1; j < RADIX_n - 1 && !f[j]; j++); 		if (f[j]) 		{ 			sl[t].next = f[j]; 			t = e[j]; 		} 	} 	sl[t].next = 0; }  void Distribute_c(SLNode *sl, int i, ArrType_n f, ArrType_c e) { 	int j, p; 	for (j = 0; j < RADIX_c; j++) 	{ 		f[j] = 0; 		e[j] = 0; 	} 	for (p = sl[0].next; p; p = sl[p].next) 	{ 		j = sl[p].keys[i] % 65; 		if (!f[j]) 			f[j] = p; 		else 			sl[e[j]].next = p; 	} }  void Collect_c(SLNode *sl, int i, ArrType_n f, ArrType_c e) { 	int j, t; 	for (j = 0; !f[j]; j++); 	sl[0].next = f[j]; 	t = e[j]; 	while (j < RADIX_c - 1) 	{ 		for (j = j + 1; j < RADIX_c - 1 && !f[j]; j++); 		if (f[j]) 		{ 			sl[t].next = f[j]; 			t = e[j]; 		} 	} 	sl[t].next = 0; }  SLList RadixSort(SLList L) { 	int i; 	ArrType_n fn, en; 	ArrType_n fc, ec; 	for (i = 0; i < L.length; i++) 		L.sl[i].next = i + 1; 	L.sl[L.length].next = 0; 	for (i = L.keynum - 1; i >= 2; i--) 	{ 		Distribute_c(L.sl, i, fn, en); 		Collect_c(L.sl, i, fn, en); 	} 	for (i = 1; i >= 0; i--) 	{ 		Distribute_c(L.sl, i, fc, ec); 		Collect_c(L.sl, i, fc, ec); 		return L; 	} } SLList Arrange(SLList L) { 	int p, q, i; 	SLNode temp; 	p = L.sl[0].next; 	for (i = 1; i < L.length; i++) 	{ 		while (p < i) 			p = L.sl[p].next; 		q = L.sl[p].next; 		if (p != i) 		{ 			temp = L.sl[p]; 			L.sl[p] = L.sl[i]; 			L.sl[i] = temp; 			L.sl[i].next = p; 		} 		p = q; 	} 	return L; }  int BinSearch(SLList L, KeyType key[]) { 	int low, high, mid; 	low = 1; high = L.length - 1; 	while (low <= high){ 		mid = (low + high) / 2; 		if (strcmp(key, L.sl[mid].keys) == 0) 			return mid; 		else if (strcmp(key, L.sl[mid].keys) < 0) 			high = mid - 1; 		else 			low = mid + 1; 	} 	return 0; }  void SeqSearch(SLList L, KeyType key[], int i) { 	int j, k, m = 0; 	for (j = 1; j < L.length; j++) 	{ 		switch (i){ 		case 2:k = strcmp(key, L.sl[j].others.start); break; 		case 3:k = strcmp(key, L.sl[i].others.end); break; 		case 4:k = strcmp(key, L.sl[i].others.time1); break; 		case 5:k = strcmp(key, L.sl[i].others.time2); break; 		} 		if (k == 0){ 			m = 1; 			Display(L, j); 		} 	} 	if (m == 0) 		printf("无此航班的信息，可能是输入错误！！！\n"); }  void Display(SLList L, int i) { 	if (i == 0) 		printf("无此航班信息，可能是输入错误！！！\n"); 	else{ 		printf("航班号 起点站 终点站 航班期	起飞时间 到达时间 机型 票价\n"); 		printf("%s,%s,%s,%s,%s,%s,%s,%d\n", L.sl[i].keys, 			L.sl[i].others.start, L.sl[i].others.end, L.sl[i].others.sche, 			L.sl[i].others.time1, L.sl[i].others.time2, L.sl[i].others.model, 			L.sl[i].others.price); 	} }  void serachcon(SLList L) { 	int i = 1, k; 	KeyType key[keylen], kl[4]; 	while (i >= 1 && i <= 5){ 		printf("********************************\n"); 		printf("****	航班信息查询系统	****\n"); 		printf("********************************\n"); 		printf("****	1.  航 班 号	****\n"); 		printf("****	2.  起 点 站	****\n"); 		printf("****	3.  终 点 站	****\n"); 		printf("****	4.  起飞时间	****\n"); 		printf("****	5.  到达时间	****\n"); 		printf("****	0.  退出系统	****\n"); 		printf("********************************\n"); 		printf("	请选择（0~5）："); 		scanf("%d", &i); 		switch (i){ 		case 1:printf("输入要查询的航班号（字母要大写）："); 			scanf("%s", key); 			k = BinSearch(L, key); 			Display(L, k); 			break; 		case 2:printf("输入要查询的航班起点站名："); 			scanf("%s", key); 			SeqSearch(L, key, i); 			break; 		case 3:printf("输入要查询航班的终点站名："); 			scanf("%s", key); 			SeqSearch(L, key, i); 			break; 		case 4:printf("输入要查询航班起飞时间："); 			scanf("%s", kl); 			SeqSearch(L, kl, i); 			break; 		case 5:printf("输入要查询航班到达时间："); 			scanf("%s", kl); 			SeqSearch(L, kl, i); 			break; 		case 0:printf("再见！！！\n"); 			return; 		} 	} }  SLList InputData(SLList L) { 	int i = ++L.length; 	char yn = 'y'; 	while (yn == 'y' || yn == 'Y') 	{ 		printf("航班号 起点站 终点站 航班期	起飞时间 到达时间 机型 票价\n"); 		printf("%s%s%s%s%s%s%s%d\n", L.sl[i].keys, 			L.sl[i].others.start, L.sl[i].others.end, L.sl[i].others.sche, 			L.sl[i].others.time1, L.sl[i].others.time2, L.sl[i].others.model, 			L.sl[i].others.price); 		++i; 		printf("继续输入吗？y\n"); 		getchar(); 		scanf("%c", &yn); 	} 	L.length = i - 1; 	return L; }  void main() { 	int i, k; 	SLList L; 	L.keynum = 6; 	L.length = 0; 	for (i = 1; i <= L.length; i++) 		Display(L, i); 	L = InputData(L); 	L = RadixSort(L); 	L = Arrange(L); 	serachcon(L); 	return; }

SLList RadixSort(SLList L) 函数最后少了大括号 }

为什么可以编译链接了，但出现了这个情况


Question: 关于C栈的一些疑问

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

int d = 6；也许被优化掉了，因为后面没有再使用，嵌入式里面尤其常见。

未定义行为，不同的编译器可能结果不同

你这是在测试编译器，而编译器想怎么干都可以。

赵老师吃定冯诺依曼结构了。

这叫未定义行为，楼主不要纠结了，记住别写这样的代码就行。 即便你费半天劲研究明白了主楼的例子，获得的知识也没有通用性。 具体到这个例子，c 和 d 都是同时进出栈的，不存在 d 先用了一块地，用完了腾出的空间 c 又复用了。

引用 9 楼 u010165006 的回复:客人住酒店，在房间遗落了一个东西（值），下一个客人入住同一个房间，房间里还有那样东西。  下一个客人入住同一个房间，不清理的话房间里还有那样东西。

引用 4 楼 guoke312 的回复:我的本意就是c不赋值，因为前面的a局部变量，if后面已经消亡，a就出栈了，栈内存是脏的那么c入栈不就应该是6吗？加了打印列2可以一直保证是6，而列一却不行，这是为何？ d出栈为什么它的值会留在栈中？？而且又为什么会和c匹配？？你知道c存的地址会是之前d的位置？？

while (TRUE) { 		int a ; 		printf("%p",&a); 	} 试试不就知道了

引用 5 楼 guoke312 的回复:[quote=引用 2 楼 user-10 的回复:] 在同一个函数内，变量放在栈的哪个部分是不确定的，编译器可以自行优化  函数执行完才会移动栈帧理清所有占上的内容  那我有个疑问，若是函数执行完毕清理的话，那么while（1）死循环里面定义的局部变量，一直分配不清理不就会导致栈内存溢出？我想应该变量生命周期结束就该清理？[/quote]  曲解了您的意思，那么变量放栈随机的，为何加了打印以后c就是一定放在a消亡的栈地址？

引用 2 楼 user-10 的回复:在同一个函数内，变量放在栈的哪个部分是不确定的，编译器可以自行优化  函数执行完才会移动栈帧理清所有占上的内容  那我有个疑问，若是函数执行完毕清理的话，那么while（1）死循环里面定义的局部变量，一直分配不清理不就会导致栈内存溢出？我想应该变量生命周期结束就该清理？

int c 不赋值 ，它的值打印出来是随机的，这两个例子并不能说明什么即使。

c没进行赋值，输出的值是随机的。


Question: 如何在程序两个输入之间计时

打开include\time.h一眼。

1. <time.h>中函数clock()，返回类型clock_t，精确度，毫秒级别 实例： #include <stdio.h>  #include <time.h>  #include <math.h>   void test() { 	int i = 0; 	int j = 0; 	double a = 0;  	while (i++ < 1000000) 	while (j++ < 1000000) 	{ 		a = sqrt(2.0); 	} }  int main(void) { 	clock_t start, finish; 	double  duration = 0.0;  	start = clock();  	test();  	finish = clock(); 	duration = (double)(finish - start)；输出单位ms 		duration = (double)(finish - start) / CLOCKS_PER_SEC; //输出单位为妙，精确到毫秒级 	//#define CLOCKS_PER_SEC 1000  	printf("%f seconds\n", duration);  	return 0; } 2、<time.h>中函数time(&t)， 精确度，秒级别 功能：取以秒为单位的，从1970年1月1日格林威治时间00 : 00 : 00算起的当前时间，并把它存在长整形变量t中，函数返回如前所述的时间秒值。 								测试程序如下： #include   "stdio.h"  #include   "time.h"       #include   "stdlib.h"  void main() { 	long   start, end; 	time(&start); 	delay(50000); 	time(&end); 	printf("end-start=%ld\n ", end - start); 	getch(); }  3. 最精确的计时：QueryPerformanceCounter来查询定时器的计数值，如果硬件里有定时器，它就会启动这个定时器，并且不断获取定时器的值，这样的定时器精度，就跟硬件时钟的晶振一样精确的。 #include <stdio.h>  #include <stdlib.h>  #include <windows.h>   void test() { 	int i = 0; 	int j = 0; 	double a = 0;  	while (i++ < 1000000) 	while (j++ < 1000000) 	{ 		a = sqrt(2.0); 	} }  int main(void) { 	LARGE_INTEGER start; 	LARGE_INTEGER end; 	LARGE_INTEGER freq;  	QueryPerformanceFrequency(&freq); 	QueryPerformanceCounter(&start);   	test();  	QueryPerformanceCounter(&end);  	printf("user time : %.10f seconds\n", (double)(end.QuadPart - start.QuadPart) / (double)freq.QuadPart);  	return 0; }

#include <time.h> #ifdef WIN32 #   include <windows.h> #else #   include <sys/time.h> #endif #ifdef WIN32 int gettimeofday(struct timeval *tp, void *tzp) {     time_t clock;     struct tm tm;     SYSTEMTIME wtm;     GetLocalTime(&wtm);     tm.tm_year     = wtm.wYear - 1900;     tm.tm_mon     = wtm.wMonth - 1;     tm.tm_mday     = wtm.wDay;     tm.tm_hour     = wtm.wHour;     tm.tm_min     = wtm.wMinute;     tm.tm_sec     = wtm.wSecond;     tm. tm_isdst    = -1;     clock = mktime(&tm);     tp->tv_sec = clock;     tp->tv_usec = wtm.wMilliseconds * 1000;     return (0); } #endif /* WIN32 */  这个函数  VC 没有，不过可以找个别人的实现

gettimeofday 表头文件：#include <sys/time.h> 函数原型：int gettimeofday(struct timeval *tv,struct timezone *tz) 函数说明：把目前的时间按tv所指的结构返回，当时地区的信息则放到tz所指的结构中 struct timeval {    long tv_sec; //秒    long tv_usec;//微妙 } struct timezone {    int tz_minuteswest;//和格林威治时间差了多少分钟    int tz_dsttime;    //日光节约时间的状态 }  #include <stdio.h> #include <sys/time.h>   int main(int argc, char** argv) {     timeval tv;     gettimeofday(&tv, NULL);     double cl = tv.tv_sec + (double)tv.tv_usec / 1000000;      getchar(); //暂停等待      gettimeofday(&tv, NULL);     cl = (tv.tv_sec + (double)tv.tv_usec / 1000000) - cl;      printf("暂停时间:%f\n", cl);      struct timezone tz;     gettimeofday(&tv, &tz);     printf("tv.tv_sec:%d\n", tv.tv_sec);     printf("tv.tv_usec:%d\n", tv.tv_usec);     printf("tz.tz_minuteswest:%d\n", tz.tz_minuteswest);     printf("tv.tz_dsttime:%d\n", tz.tz_dsttime);      return 0; }

#include <time.h>  clock_t_t beg = clock();  //你需要计时的程序  clock_t end = clock();  clock_t btw = end - beg; //单位毫秒，这个时间不是十分精确，一般用于计算大概时间

百度一下time.h的函数吧 ，善用搜索引擎   直接百度解决问题的速度更快些吧。


Question: 请问C语言怎么手动将字符串转换为2进制？

引用 3 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉    明白了，不过我输入-1，而且也把%032s改成%064s(内存分配了65个char)，为什么计算器上是64个1，而我的程序前32个0，后32个1呢？   	int number = 0; 	printf("输入10进制: "); 	scanf("%d", &number); 	getchar();  	Base* base = new_Base();				/*创建对象*/ 	Str* result = base->tenToTwo(number);	/*转换*/ 	result->print(result);					/*打印*/

引用 3 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉    请问十进制转二进制那里, 用%s不好吗?为什么用%032s？

引用 9 楼 zhao4zhong1 的回复:    __int64 i64,v;     char bs[65];     char b[65];  // 64位十进制整数转二进制串；     i64=-1;     _i64toa(i64,b,2);     sprintf(bs,"%064s",b);     printf("i64=%I64d,bs=%s\n",i64,bs);   谢谢！

void BinaryToHexString( char* src,unsigned long length_src, char* result) { 	if(src==NULL||result==NULL) 	{ 		return; 	}      	for (int i = 0; i < length_src; i++)  	{  		sprintf ( result + strlen(result), "%02X", *(src+i)&0XFF); 	} }

引用 2 楼 yyxgs 的回复:[quote=引用 1 楼 user-5的回复:]计算机中所有东西都是2进制的，不知道你说的转成2进制是什么意思 就是说把字符串转换为2进制，储存到另一个字符数组中。[/quote]  你的需求讲得十分不明白。  你的源数据是字符串，目标数据是字符数组，从字符串转到字符数组，这就是你的需求对吧。 请问跟二进制有什么关系？你能否补充说明一下？  另外，你所说的字符串，是标准的C语言字符串，例如 char* str = "This is an ANSI C string text."; 还是某种特定的字符串数据类型？（比如 std::string 当然这个是C++的，不是 C 的）  还有，你的源数据（字符串），和目标数据（字符数组），它们的编码格式分别是什么样的？ 都是 ANSI Plain Text，还是 WCHAR ，会不会是一边为 UTF-16 编码，另一边为 UTF-8 编码。。。  这些都可能字符串转换的实际情况。你的需求是什么样的呢？

#include <stdio.h>  int binaryNum[16];  //存放转换后得到的二进制码 int count = 0;  //计数十进制整数被2除的次数 int oneCount = 0;  //得到的二进制码中1的个数  void main(){ 	int num; 	printf("输入一个十进制的整数："); 	scanf("%d", &num);  	while ((num / 2) != 1){  //判断条件为：除以2之后的商不等于1 		binaryNum[count] = num % 2;  //取余后的数字存入数组 		num /= 2;  //num = num/2; 进行下一轮的判断 		count++;  //此变量用来指定数组下标 	} 	binaryNum[count + 1] = 1;  //最后一次除法做完以后，剩下的商一定是1，所以在最后手动添加一个1  	printf("二进制数值为："); 	//倒序打印出数组中的元素 	// sizeof(整形数组)/sizeof(整形单个元素大小) = 数组的元素个数 	for (int i = sizeof(binaryNum) / sizeof(int)-1; i >= 0; i--){ 		if (binaryNum[i] == 1) 			oneCount++;  //出现一次1就累加 		printf("%d", binaryNum[i]); 	} 	printf("\n共有%d个1\n", oneCount); }

引用 1 楼 user-5的回复:计算机中所有东西都是2进制的，不知道你说的转成2进制是什么意思 就是说把字符串转换为2进制，储存到另一个字符数组中。

计算机中所有东西都是2进制的，不知道你说的转成2进制是什么意思


Question: 二叉排序树构建程序崩溃?

main函数已加上返回值

引用 16 楼 may_Xia 的回复:[quote=引用 15 楼 paschen 的回复:] [quote=引用 14 楼 may_Xia 的回复:] [quote=引用 13 楼 paschen 的回复:] 我上面发的你没全改啊  int createSearchTree(PBinSearchTree ptree)  改成：  int createSearchTree(PBinSearchTree* ptree)     编译成功，但运行崩溃……[/quote]  去掉*ptree=NULL;那句[/quote]   依旧................................我都不好意思问了......................................................................[/quote]  其他几个函数也类似问题啊，我出错可以断下来分析什么原因

引用 15 楼 paschen 的回复:[quote=引用 14 楼 may_Xia 的回复:] [quote=引用 13 楼 paschen 的回复:] 我上面发的你没全改啊  int createSearchTree(PBinSearchTree ptree)  改成：  int createSearchTree(PBinSearchTree* ptree)     编译成功，但运行崩溃……[/quote]  去掉*ptree=NULL;那句[/quote]   依旧................................我都不好意思问了......................................................................

引用 14 楼 may_Xia 的回复:[quote=引用 13 楼 paschen 的回复:] 我上面发的你没全改啊  int createSearchTree(PBinSearchTree ptree)  改成：  int createSearchTree(PBinSearchTree* ptree)     编译成功，但运行崩溃……[/quote]  去掉*ptree=NULL;那句

引用 13 楼 paschen 的回复:我上面发的你没全改啊  int createSearchTree(PBinSearchTree ptree)  改成：  int createSearchTree(PBinSearchTree* ptree)     编译成功，但运行崩溃……

引用 11 楼 paschen 的回复:[quote=引用 8 楼 may_Xia 的回复:] [quote=引用 7 楼 paschen 的回复:] [quote=引用 6 楼 may_Xia 的回复:] [quote=引用 5 楼 paschen 的回复:] [quote=引用 4 楼 may_Xia 的回复:] [quote=引用 3 楼 paschen 的回复:] createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢[/quote]  1、不是说参数是指针类型就叫按指针传递  2、取决于你要修改的东西，如果你要修改的是指针变量，那你就要传入这个指针变量的地址   int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }   createSearchTree(&t); [/quote]      改成这样?int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }  int main() { 	int s; 	PBinSearchNode* p; 	PBinSearchTree *t; 	p=(PBinSearchNode*)malloc(sizeof(PBinSearchNode));     createSearchTree(t); 	printf("请输入要查找的元素,若该元素已存在得到1,无该元素得到0.\n"); 	scanf("%d",&s); 	search(*t,s,p); 	return 0; 	 }好晕啊...新手小白,多包涵...[/quote]  什么意思？  上面不是给你改了：  createSearchTree(t);  改成：  createSearchTree(&t);  应该传地址[/quote]    直接这样改有错啊??[/quote]  你再发下你瑞的代码，还有错误提示是什么[/quote]      #include<stdio.h> #include<stdlib.h>  typedef int KeyType; struct BinSearchNode; typedef struct BinSearchNode* PBinSearchNode; struct BinSearchNode { KeyType key; PBinSearchNode llink,rlink; }; typedef struct BinSearchNode* BinSearchTree; typedef BinSearchTree* PBinSearchTree;  int search(PBinSearchTree ptree,KeyType key,PBinSearchNode *position) { PBinSearchNode p,q; p=*ptree;q=p; while(p!=NULL) { p=q; if(p->key==key) {*position=p;return 1;} else if(p->key>key) p=p->llink; else p=p->rlink; } *position=q;return 0; }  int insert(PBinSearchTree ptree,KeyType key) { PBinSearchNode position,p; p=(PBinSearchNode)malloc(sizeof(struct BinSearchNode)); if(search(ptree,key,&position)==1) return 1; if(p==NULL) {printf("Error.\n");return 0;} p->key=key;p->llink=p->rlink=NULL; if(position==NULL) *ptree=p; else if(key<position->key) position->llink=p; else position->rlink=p; return 0; }  int createSearchTree(PBinSearchTree ptree) { int i; *ptree=NULL; printf("请输入以-1为结束标记的节点列.\n"); scanf("%d",&i); while(i!=0) { insert(ptree,i); scanf("%d",&i); }  return 1; }  int main() { int s; PBinSearchNode* p; p=(PBinSearchNode*)malloc(sizeof(PBinSearchNode)); PBinSearchTree t; createSearchTree(&t); printf("请输入要查找的元素,若该元素已存在得到1,无该元素得到0.\n"); scanf("%d",&s); search(t,s,p); return 1;  }    [Error] cannot convert 'BinSearchNode***' to 'PBinSearchTree {aka BinSearchNode**}' for argument '1' to 'int createSearchTree(PBinSearchTree)'  谢谢啊！

引用 8 楼 may_Xia 的回复:[quote=引用 7 楼 paschen 的回复:] [quote=引用 6 楼 may_Xia 的回复:] [quote=引用 5 楼 paschen 的回复:] [quote=引用 4 楼 may_Xia 的回复:] [quote=引用 3 楼 paschen 的回复:] createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢[/quote]  1、不是说参数是指针类型就叫按指针传递  2、取决于你要修改的东西，如果你要修改的是指针变量，那你就要传入这个指针变量的地址   int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }   createSearchTree(&t); [/quote]      改成这样?int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }  int main() { 	int s; 	PBinSearchNode* p; 	PBinSearchTree *t; 	p=(PBinSearchNode*)malloc(sizeof(PBinSearchNode));     createSearchTree(t); 	printf("请输入要查找的元素,若该元素已存在得到1,无该元素得到0.\n"); 	scanf("%d",&s); 	search(*t,s,p); 	return 0; 	 }好晕啊...新手小白,多包涵...[/quote]  什么意思？  上面不是给你改了：  createSearchTree(t);  改成：  createSearchTree(&t);  应该传地址[/quote]    直接这样改有错啊??[/quote]  你再发下你瑞的代码，还有错误提示是什么

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

引用 7 楼 paschen 的回复:[quote=引用 6 楼 may_Xia 的回复:] [quote=引用 5 楼 paschen 的回复:] [quote=引用 4 楼 may_Xia 的回复:] [quote=引用 3 楼 paschen 的回复:] createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢[/quote]  1、不是说参数是指针类型就叫按指针传递  2、取决于你要修改的东西，如果你要修改的是指针变量，那你就要传入这个指针变量的地址   int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }   createSearchTree(&t); [/quote]      改成这样?int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }  int main() { 	int s; 	PBinSearchNode* p; 	PBinSearchTree *t; 	p=(PBinSearchNode*)malloc(sizeof(PBinSearchNode));     createSearchTree(t); 	printf("请输入要查找的元素,若该元素已存在得到1,无该元素得到0.\n"); 	scanf("%d",&s); 	search(*t,s,p); 	return 0; 	 }好晕啊...新手小白,多包涵...[/quote]  什么意思？  上面不是给你改了：  createSearchTree(t);  改成：  createSearchTree(&t);  应该传地址[/quote]    直接这样改有错啊??

引用 6 楼 may_Xia 的回复:[quote=引用 5 楼 paschen 的回复:] [quote=引用 4 楼 may_Xia 的回复:] [quote=引用 3 楼 paschen 的回复:] createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢[/quote]  1、不是说参数是指针类型就叫按指针传递  2、取决于你要修改的东西，如果你要修改的是指针变量，那你就要传入这个指针变量的地址   int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }   createSearchTree(&t); [/quote]      改成这样?int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }  int main() { 	int s; 	PBinSearchNode* p; 	PBinSearchTree *t; 	p=(PBinSearchNode*)malloc(sizeof(PBinSearchNode));     createSearchTree(t); 	printf("请输入要查找的元素,若该元素已存在得到1,无该元素得到0.\n"); 	scanf("%d",&s); 	search(*t,s,p); 	return 0; 	 }好晕啊...新手小白,多包涵...[/quote]  什么意思？  上面不是给你改了：  createSearchTree(t);  改成：  createSearchTree(&t);  应该传地址

引用 5 楼 paschen 的回复:[quote=引用 4 楼 may_Xia 的回复:] [quote=引用 3 楼 paschen 的回复:] createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢[/quote]  1、不是说参数是指针类型就叫按指针传递  2、取决于你要修改的东西，如果你要修改的是指针变量，那你就要传入这个指针变量的地址   int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }   createSearchTree(&t); [/quote]      改成这样?int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }  int main() { 	int s; 	PBinSearchNode* p; 	PBinSearchTree *t; 	p=(PBinSearchNode*)malloc(sizeof(PBinSearchNode));     createSearchTree(t); 	printf("请输入要查找的元素,若该元素已存在得到1,无该元素得到0.\n"); 	scanf("%d",&s); 	search(*t,s,p); 	return 0; 	 }好晕啊...新手小白,多包涵...

引用 4 楼 may_Xia 的回复:[quote=引用 3 楼 paschen 的回复:] createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢[/quote]  1、不是说参数是指针类型就叫按指针传递  2、取决于你要修改的东西，如果你要修改的是指针变量，那你就要传入这个指针变量的地址   int createSearchTree(PBinSearchTree* ptree) { 	int i; 	*ptree=NULL; 	printf("请输入以-1为结束标记的节点列.\n"); 	scanf("%d",&i); 	while(i!=0) 	{ 		insert(*ptree,i); 		scanf("%d",&i); 	}  	return 1; }   createSearchTree(&t);

引用 3 楼 paschen 的回复:createSearchTree(t); 是按值传递的，函数中的参数是复制过来的，你在函数中的修改不会影响到主函数中的t   传的不是指针吗？想不通.... 那应该怎么传？？谢谢

p=*ptree //?? p=ptree


Question: linux C 消息队列求助！

LZ的问题跟消息队列有关系吗?如果定义全局变量,并且在其他源文件里使用,建议把全局变量放在源文件里而不是生命在头文件里,因为这样很容易造成重定义的错误. 把定义和引用都放在源文件里.

key.h const int key; key.c const int key = 0x1234567;  要引用的文件的头文件里面这么玩 #include "key.h" extern const int key;

“程序中包含了这个头文件  是否这2个程序就可以直接使用这个key和值了”，你这个两个程序是什么概念，如果是同一个工程里面，可以这么用，但是另外两个程序.........不太理解你的程序是个什么概念！

包含(#include)是预处器指令，是复制文件，也就是把变量声明复制过来，只能安慰编译器，如果没有把包含key的定义的obj文件链接进来，链接时会报"undefied reference to xxx"错误


Question: 格式错误求教怎么修改 输入下面多了一个空行但是如果去掉空行输出又不对，

把scanf("%d",&n) 改为scanf("%d\n",&n); 同时再把for(i=0; i<n+1; i++) 改为for(i=0;i<n;i++) 即可。

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

碰到会单独读入回车符（比如gets,scanf(%c,....)等等）的语句之前，最好清空输入缓冲区一下

是因为回车符的原因,首先第一个空行是你输入n的时候加上去,然后gets遇到回车符结束,所以s[0] 就是'\n',后面每次都会有的换行是因为gets每次都会将'\n'带入你的缓存里.可以把它先去掉.  #include<stdio.h> #include<string.h>   #define     MAX_STR_LEN     64  int main() {     int n, i, j, len;     char str[MAX_STR_LEN];      scanf("%d", &n);     getchar();    /* receive '\n' */     for(i = 0; i < n; i++)     {         fgets(str, MAX_STR_LEN-1, stdin);         len = strlen(str)-1;         str[len] = 0;   /* equal '\0'. */         for(j = len - 1; j >= 0; j--)         {             printf("%c", str[j]);         }         printf("\n");     }      return 0; }  数据没必要申请那么大的,你测试一次性也输入不了1000个字符,建议不要这么做.栈的空间是有限并且宝贵的.应该根据需要而申请栈上的空间.

scanf("%d",&n);  后面加一句getchar();  将你输入完留在缓冲区中的换行符接收了，否则会被之后的gets接收了

引用 7 楼 zuoside__lord 的回复:[quote=引用 6 楼 user-5 的回复:] [quote=引用 5 楼 zuoside__lord 的回复:]   题目描述 Sine的一个朋友疯了，最近他老爱说反话，别人说什么他就倒着说一遍，真是个奇怪的人。那他到底说了什么呢？  输入 第1行：一个整数n(0<n<=20)表示字符串数 第2到n+1行：每行一个字符串（字符串长度大于0不超过1000，字符均为“可打印”字符，32<=ASCII码<=126）  输出 输出逆序的字符串，每行一个。 样例输入 1 i am speaking 样例输出 gnikaeps ma i 提示 安徽大学第三届ACM/ICPC 程序设计竞赛现场赛    提交 这是题目，我按照各位建议加了getchar还是错的，答案错误  for(i=0; i<n+1; i++)  改成：  for(i=0; i<n; i++)[/quote] 还是错误输出的结果前面多了个空格，莫名其妙地多了，提交上去还是格式错误[/quote]  没懂你意思，这样改：  #include<stdio.h> #include<string.h> int main() { 	int n,i,j,len; 	char s[1001],b[1001]; 	scanf("%d",&n); 	getchar(); 	for(i=0; i<n; i++) 	{ 		gets(s); 		for(j=strlen(s)-1; j>=0; j--) 		{ 			printf("%c",s[j]); 		} 		printf("\n"); 	} } 引用 9 楼 zuoside__lord 的回复:[quote=引用 8 楼 user-5 的回复:] [quote=引用 7 楼 zuoside__lord 的回复:] [quote=引用 6 楼 user-5 的回复:] [quote=引用 5 楼 zuoside__lord 的回复:]   题目描述 Sine的一个朋友疯了，最近他老爱说反话，别人说什么他就倒着说一遍，真是个奇怪的人。那他到底说了什么呢？  输入 第1行：一个整数n(0<n<=20)表示字符串数 第2到n+1行：每行一个字符串（字符串长度大于0不超过1000，字符均为“可打印”字符，32<=ASCII码<=126）  输出 输出逆序的字符串，每行一个。 样例输入 1 i am speaking 样例输出 gnikaeps ma i 提示 安徽大学第三届ACM/ICPC 程序设计竞赛现场赛    提交 这是题目，我按照各位建议加了getchar还是错的，答案错误  for(i=0; i<n+1; i++)  改成：  for(i=0; i<n; i++)[/quote] 还是错误输出的结果前面多了个空格，莫名其妙地多了，提交上去还是格式错误[/quote]  没懂你意思，这样改：  #include<stdio.h> #include<string.h> int main() { 	int n,i,j,len; 	char s[1001],b[1001]; 	scanf("%d",&n); 	getchar(); 	for(i=0; i<n; i++) 	{ 		gets(s); 		for(j=strlen(s)-1; j>=0; j--) 		{ 			printf("%c",s[j]); 		} 		printf("\n"); 	} }[/quote] 谢谢，终于对了，为什么有时候要-1，有时候又不-1[/quote]  哪里有-1  你是说循环里不加+1吗？  这样i才是循环n次，i=0也算

引用 8 楼 user-5 的回复:[quote=引用 7 楼 zuoside__lord 的回复:] [quote=引用 6 楼 user-5 的回复:] [quote=引用 5 楼 zuoside__lord 的回复:]   题目描述 Sine的一个朋友疯了，最近他老爱说反话，别人说什么他就倒着说一遍，真是个奇怪的人。那他到底说了什么呢？  输入 第1行：一个整数n(0<n<=20)表示字符串数 第2到n+1行：每行一个字符串（字符串长度大于0不超过1000，字符均为“可打印”字符，32<=ASCII码<=126）  输出 输出逆序的字符串，每行一个。 样例输入 1 i am speaking 样例输出 gnikaeps ma i 提示 安徽大学第三届ACM/ICPC 程序设计竞赛现场赛    提交 这是题目，我按照各位建议加了getchar还是错的，答案错误  for(i=0; i<n+1; i++)  改成：  for(i=0; i<n; i++)[/quote] 还是错误输出的结果前面多了个空格，莫名其妙地多了，提交上去还是格式错误[/quote]  没懂你意思，这样改：  #include<stdio.h> #include<string.h> int main() { 	int n,i,j,len; 	char s[1001],b[1001]; 	scanf("%d",&n); 	getchar(); 	for(i=0; i<n; i++) 	{ 		gets(s); 		for(j=strlen(s)-1; j>=0; j--) 		{ 			printf("%c",s[j]); 		} 		printf("\n"); 	} }[/quote] 谢谢，终于对了，为什么有时候要-1，有时候又不-1

引用 6 楼 user-5 的回复:[quote=引用 5 楼 zuoside__lord 的回复:]   题目描述 Sine的一个朋友疯了，最近他老爱说反话，别人说什么他就倒着说一遍，真是个奇怪的人。那他到底说了什么呢？  输入 第1行：一个整数n(0<n<=20)表示字符串数 第2到n+1行：每行一个字符串（字符串长度大于0不超过1000，字符均为“可打印”字符，32<=ASCII码<=126）  输出 输出逆序的字符串，每行一个。 样例输入 1 i am speaking 样例输出 gnikaeps ma i 提示 安徽大学第三届ACM/ICPC 程序设计竞赛现场赛    提交 这是题目，我按照各位建议加了getchar还是错的，答案错误  for(i=0; i<n+1; i++)  改成：  for(i=0; i<n; i++)[/quote] 还是错误输出的结果前面多了个空格，莫名其妙地多了，提交上去还是格式错误

引用 5 楼 zuoside__lord 的回复:题目描述 Sine的一个朋友疯了，最近他老爱说反话，别人说什么他就倒着说一遍，真是个奇怪的人。那他到底说了什么呢？  输入 第1行：一个整数n(0<n<=20)表示字符串数 第2到n+1行：每行一个字符串（字符串长度大于0不超过1000，字符均为“可打印”字符，32<=ASCII码<=126）  输出 输出逆序的字符串，每行一个。 样例输入 1 i am speaking 样例输出 gnikaeps ma i 提示 安徽大学第三届ACM/ICPC 程序设计竞赛现场赛    提交 这是题目，我按照各位建议加了getchar还是错的，答案错误  for(i=0; i<n+1; i++)  改成：  for(i=0; i<n; i++)


Question: 帮忙大神看个程序，在VS2015上写的

1.要在函数内改变指针的指向必须传二级指针或者一级指针的引用才行  #include <stdio.h> #include <stdlib.h> #include <string.h> void GetMemory(char **p) { 	*p = (char *)malloc(100); } void main(void) { 	char *str = NULL; 	GetMemory(&str); 	strcpy(str, "hello world"); 	printf(str); }   2.要在堆上分配的空间才行，否则是未定义行为  #include <stdio.h> #include <string.h> #include <stdlib.h> char *GetMemory(void) { 	char str[] = "hello world"; 	char *p = (char *)malloc(strlen(str) + 1); 	strcpy(p, str); 	return p; } void main() { 	char *str = NULL; 	str = GetMemory(); 	printf(str); }

第二个直接是错的，因为你返回的是一个局部数组变量，函数运行完就销毁了

第一个，你GetMemory是按值传递的，你在GetMemory中申请的内存是给了一个复制后的指针，并没有改变原指针：  这样改：   #include <stdio.h> void GetMemory(char **p) { 	*p = (char *)malloc(100); } void main(void) { 	char *str = NULL; 	GetMemory(&str); 	strcpy(str, "hello world"); 	printf(str); }


Question: C中出现 [Error] ld returned 1 exit status问题，如何解决？

我也是这问题

弱弱的问一句 解决了吗 我也是这个问题

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

scanf("%s",&G->vexs[i]);  这里的G->vexs[i]只是一个字符的空间，如果你需要的是字符串，G->vexs应该用二维字符数组

printf("请输入第%d个单位的名称：",i+1); scanf("%s",&G->vexs[i]);  //?  写成：scanf("%c", &G->vexs[i]);  或者 typedef char VerTexType;   ==>     typedef char* VerTexType;

AMGraph *G = new AMGraph;


Question: 关于 ++i 的一些问题

运算符优先级等价于  ++i | | (++j && ++k) || 和 && 运算符都遵循短路规则 即判断左侧值就能得出结果，后续的判断就忽略

因为这是个逻辑或前面真，后面就不执行了，所以会这样

++i 值为2，为真，后面的不需求值了。j、k不变。


Question: 用C编写代码的时候出现    [Error] ld returned 1 exit status   问题，应该如何解决？求大神指导。

这样试试 int main() { 	AMGraph G; 	printf("欢迎进入学校超市选址问题："); 	Migraph graph; 	graph.CreatAiMGraph(&G); 	graph.ShortestPath_Floyd(&G); 	return 0; }  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

非常感谢，那个问题已经解决了，但是程序运行的时候，输入单位名称后出现这个问题，应该如何解决？可以帮忙看一下么？

CreatAiMGraph和ShortestPath_Floyd这2个函数如果是Migraph类的成员函数的话，你实现的时候不能写成： void CreatAiMGraph(AMGraph *G)这样，要改成： void Migraph::CreatAiMGraph(AMGraph *G) PS:类定义也移到函数的上面去  #include<stdio.h> #include<stdlib.h>  #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 const int MaxInt = 32767; const int MVNum = 100;  typedef char VerTexType; typedef int ArcType; typedef struct { 	VerTexType vexs[MVNum];     //单位名称；  //? 	ArcType dis[MVNum][MVNum];  //单位间的长度； 	int adj[MVNum][MVNum];      //单位间是否相通； 	int f[MVNum];               //各单位去超市的频率； 	int vexnum, arcnum;          //图当前的点数及边数；  }AMGraph;  class Migraph { public: 	void CreatAiMGraph(AMGraph *G); 	void ShortestPath_Floyd(AMGraph *G); };  void Migraph::CreatAiMGraph(AMGraph *G) { 	int i, j, k;  	printf("请输入单位个数：\n"); 	scanf("%d", &(G->vexnum));  	printf("请输入单位之间的路径数：\n"); 	scanf("%d", &(G->arcnum));  	printf("请输入单位名称：\n"); 	for (i = 0; i<G->vexnum; i++) 	{ 		printf("请输入第%d个单位的名称：", i + 1); 		scanf("%s", &G->vexs[i]);  //? 	}  	for (i = 0; i<G->vexnum; i++)      //结构体初始化； 	for (j = 0; j<G->vexnum; j++) 	{ 		G->adj[i][j] = 0; 		G->dis[i][j] = 0; 		G->f[i] = 0; 	}  	for (k = 0; k<G->arcnum; k++)  //录入单位之间的信息  	{ 		printf("请输入相通的两单位(eg:i,j)：\n"); 		scanf("%d,%d", &i, &j); 		printf("请输入相通两单位之间的距离(eg:dis):"); 		scanf("%d", &G->dis[i][j]);	//? 		G->adj[i][j] = 1; 		G->adj[j][i] = 1; 		G->dis[j][i] = G->dis[i][j]; 	}  	for (k = 0; k<G->vexnum; k++)	//录入单位去超市的频率  	{ 		printf("请输入第%d个单位去超市的相对频率：\n", k); 		scanf("%d", &(G->f[k])); 	}  	for (i = 0; i<G->vexnum; i++) 	for (j = 0; j<G->vexnum; j++) 	{ 		G->dis[i][j] *= G->f[i]; 		if (G->adj[i][j] == 0 && i != j) 			G->dis[i][j] = MaxInt; 	}  }  void Migraph::ShortestPath_Floyd(AMGraph *G) { 	int D[MVNum][MVNum], Path[MVNum][MVNum]; 	int i, j, k, pre; 	int count[MVNum]; 	for (i = 0; i<G->vexnum; ++i)            //初始化  	for (j = 0; j<G->vexnum; ++j) 	{ 		D[i][j] = G->dis[i][j]; 		if (D[i][j]<MaxInt) 			Path[i][j] = i; 		else 			Path[i][j] = -1; 		count[i] = 0; 	} 	for (k = 0; k<G->vexnum; ++k)	//运算步骤  	for (i = 0; i<G->vexnum; ++i) 	for (j = 0; j<G->vexnum; ++j) 	if (D[i][k] + D[k][j]<D[i][j]) 	{ 		D[i][j] = D[i][k] + D[k][j]; 		Path[i][j] = Path[k][j]; 	} 	printf("Floyed算法求解如下：\n"); 	for (i = 0; j<G->vexnum; i++) 	for (j = 0; j<G->vexnum; j++) 	{ 		if (i != j) 		{ 			printf("%d->%d;", i, j); 			if (D[i][j] == MaxInt) 			{ 				if (i != j) 					printf("不存在路径\n"); 			} 			else 			{ 				printf("路径长度为：%d\n", &D[i][j]); 				printf("路径为：%d*", i); 				pre = Path[i][j]; 				while (pre != -1) 				{ 					printf("%d\n", pre); 					pre = Path[pre][j]; 				} 				printf("%d", j); 			} 		} 	} 	for (i = 0; j<G->vexnum; i++) 	for (j = 0; j<G->vexnum; j++) 	{ 		if (D[i][j] == MaxInt) 			count[i] = 0; 		else 			count[i] = 1; 	} 	for (i = 0; i<G->vexnum; i++) 	if (count[i]) 	{ 		for (j = 0; j<G->vexnum; j++) 		if (i != j) 			D[i][i] += D[j][i]; 	} 	k = 0; 	for (i = 0; i<G->vexnum; i++) 	{ 		if (count[i]) 		if (D[k][k]>D[i][i]) 			k = i; 	}  }   int main() { 	AMGraph *G; 	printf("欢迎进入学校超市选址问题："); 	Migraph graph; 	graph.CreatAiMGraph(G); 	graph.ShortestPath_Floyd(G); 	return 0; }


Question: union和struct的问题

引用 3 楼 赵4老师的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 你给的链接看不懂，不适合我这个初学者！

引用 4 楼 zhaozhu110的回复:union是共用体,strcut是结构体,union可以共用，后者不行~ 怎么回答你好咧，竟然要求要打十个字

引用 2 楼 自信男孩的回复:你的程序在Linux下是可以运行的,结果和你的一样. float浮点数因为有整数部分和小数部分,其表示方法与整形的是不一样的.详见这个链接 http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html w.a = 65; 那么其二进制是100000001,这是32位中的低位,即低9位,但是浮点数是1位符号为,8位解码为阶码为,23为尾数位.65的二进制实在浮点数的尾数位里,所以是0.00000 你给的连接我看了，懂了一些。谢谢，但是怎么处理才能让其打印出的float数据是65而不是0.000000？

union是共用体,strcut是结构体,union可以共用，后者不行~

这只是GCC的扩展功能，不是标准，VC不支持这种用法


Question: 求助：文件操作与字符处理（不知道错在哪了）

大家帮我看看可以吗？？ 下面这个程序 有弊端 但是我不知道怎么改；谢谢大家了！！！ 弊端就是： 标准输入数据: I am a student. -1 = 1 - 2. q=a-m. z = i - w. My school is SCAU. It is a beau- tiful university. t-t-t-t, 123 123. I like it. 标准输出答案:    1|t 4    2|a 3    3|i 3    4|is 2    5|it 2 你的错误输出结果:    1|a 3    2|i 3    3|is 2    4|it 2    5|am 1  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> struct word {     char c[30];     int n; }w[10000]; int main() {     FILE *fp;     fp=fopen("case1.in","r");     char b[30],ch;     int i=0,m=1,j=0,k=0,t=0,h=0;     if(fp==NULL)     return 0;     while((ch=fgetc(fp))!=EOF)     {         //大写转小写         if(ch>='A'&&ch<'Z')         ch=ch+32;         if(ch>='a'&&ch<='z')         {             b[i]=ch;             i++;             h=1;         }         //如果不是字母的话，先判定是不是连字符         else         {             if(ch=='-'&&(ch=fgetc(fp))=='\n')             h=0;             else             {                 if(h==1)                 {                     //已经找到一个完整的单词                     b[i]='\0';                     i=0;                     h=0;                     m=0;                     //在已有的单词中逐个比对                     for(j=0;j<k;j++)                     {                         if(strcmp(b,w[j].c)==0)                         {                             m=1;                             break;                         }                     }                     //找到则单词数加1                     if(m==1)                     w[j].n++;                     //没找到安放新单词                     else                     {                         w[k].n=1;                         strcpy(w[k].c,b);                         k++;                     }                 }             }         }     }     //输出前5个最多的单词     for(i=0;i<k&&i<5;i++)     {         t=0;         while(w[t].n==0)         t++;         for(j=1;j<k;j++)         {             if(w[j].n>w[t].n)             t=j;             else if(w[j].n==w[t].n)             {                 if(strcmp(w[j].c,w[t].c)<0)                 t=j;             }         }         printf("%s %d\n",w[t].c,w[t].n);         //每个单词输出后，单词数就清零，不影响下次的查找         w[t].n=0;     }     fclose(fp);     return 0; }

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h>  struct cun {     char c[20];     int n; }; int main() {     int i=0,j=0,l,m;     FILE *fp;     char a,fun[20],dan[10000][20];     struct cun word[10000],t; 	if((fp=fopen("case1.in","r"))==NULL) exit(0);     while((a=fgetc(fp))!=EOF)     {         if(a>='A'&&a<='Z') a+=32;         if(a>='a'&&a<='z')         {             fun[i]=a;             i++;         }         else         {             if(a=='-')             {                 if((a=fgetc(fp))!='\n')                 {                     fun[i]='\0';                     strcpy(dan[j],fun);                     j++;                     i=0;                     if((a>='A'&&a<='Z')||(a>='a'&&a<='z'))                     {                         if(a>='a'&&a<='z') {fun[i]=a;i++;}                         else {a+=32;fun[i]=a;i++;}                     }                 }                 else continue;             }             else             {                 fun[i]='\0';                 strcpy(dan[j],fun);                 j++;                 i=0;             }         }        if(j>0&&dan[j-1][0]=='\0') j--;     }     if(i!=0)     {         fun[i]='\0';         strcpy(dan[j],fun);         j++;     }     l=j;     strcpy(word[0].c,dan[0]);     for(i=1,m=1;i<l;i++)     {         for(j=0;j<i;j++)         {             if(strcmp(dan[i],dan[j])==0) break;             else continue;         }         if(j==i)         {             strcpy(word[m].c,dan[i]);             m++;         }     }     for(i=0;i<m;i++)     {         for(j=0;j<l;j++)         if(strcmp(word[i].c,dan[j])==0) word[i].n++;     }         for(i=0;i<m;i++)             for(j=0;j<m-i;j++)             {                 if((word[j].n<word[j+1].n)||(word[j].n==word[j+1].n&&strcmp(word[j].c,word[j+1].c)>0))                 {                     t=word[j];                     word[j]=word[j+1];                     word[j+1]=t;                 }             }     if(m<5) for(i=0;i<m;i++)             printf("%s %d\n",word[i].c,word[i].n);     else for(i=0;i<5;i++)             printf("%s %d\n",word[i].c,word[i].n);     fclose(fp);     return 0; } 修改版（测试正确，提交是错误的）

你主函数中的变量 j 都没有初始化就使用了

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

要求是：在当前目录中存在文件名为"case1.in"（其中case后为数字1，不是字母l，写错提交后会判错）的文本文件， 其内容为一篇英文文章（以EOF作为结束标志）。现要求读取该文本文件内容，统计文章中每个单词出现的次数， 并输出出现次数最多的前5个单词及其出现次数（按出现次数由多到少的顺序输出，次数相同时按字典顺序输出， 不足5个单词时，按序输出全部单词）。程序中注意如下细节： （1）	空格、标点符号与回车符起到分隔单词的作用。 （2）	文章一行的末尾可能有连字符，出现连字符时，该行最末的字符串与下行最先出现的字符串构一个单词； （3）	名词缩写算一个单词； （4）	数字不算单词； （5）	单词不区分大小写； （6）	输出时单词全使用小写；  #include "stdio.h"  #include "math.h"  #include "string.h"  #include "stdlib.h"   _______________________   main()  {           _______________________  }   输入格式 文件case1.in中一篇英文文章，包含多段文字，单词数不超过10000，每个单词不超过20个字符   输出格式 按题意输出答案   输入样例 （如case1.in内容如下）  I am a student. My school is SCAU. It is a beau- tiful university. I like it.   输出样例 a 2 i 2 is 2 it 2 am 1 （要考虑到I am a student. -1 = 1 - 2. q=a-m. z = i - w. My school is SCAU. It is a beau-  tiful university. t-t-t-t, 123 123. I like it.这种情况）

#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <string.h>   #define     MAX_WORD_LEN    32 #define     MAX_WORD_NUM    1024   struct word_info {     char word[MAX_WORD_LEN];     int cnt; };   static FILE *open_file(const char *filename, const char *open_mode) {     FILE *fp = fopen(filename, open_mode);     if (!fp) {         perror("Open file error!");         exit(0);     }      return fp; }  int is_exist(const char *word, struct word_info *word_list, int num) {     int i;      for (i = 0; i < num; i++) {        if (strcmp(word, word_list[i].word) == 0)            return i;     }      return -1; }  void sort_as_char(struct word_info *word_list, int num) {     struct word_info wd;     int i, j;      for (i = 0; i < num; i++) {         for (j = 0; j < num - 1 - i; j++) {             if (strcmp(word_list[j].word, word_list[j+1].word) > 0) {                 wd = word_list[j];                 word_list[j] = word_list[j+1];                 word_list[j+1] = wd;             }         }     } }  void sort_as_cnt(struct word_info *word_list, int num) {     struct word_info wd;     int i, j;      for (i = 0; i < num; i++) {         for (j = 0; j < num - 1 - i; j++) {             if (word_list[j].cnt <  word_list[j+1].cnt) {                 wd = word_list[j];                 word_list[j] = word_list[j+1];                 word_list[j+1] = wd;             }         }     } }  int read_words_list(FILE *fp, struct word_info *word_list, int total_num) {     char word[MAX_WORD_LEN] = {0};     int ch, idx;     int i = 0, num = 0, flag = 0;      while ((ch =fgetc(fp)) != EOF) {         if (isalpha(ch)) {             word[i++] = tolower(ch);             if (i == MAX_WORD_LEN) {    /* a word's length is greater than 12. */                 word[i-1] = 0;             }         } else if (ch == ' ' || ch == '\n'                   || ch == '.' || ch == ','                   || ch == '!' || ch == '?') {             if (flag) {                 flag = 0;                 continue;             }             if (i <= 0)    /* word is null. */                 continue;             word[i] = 0;             idx = is_exist(word, word_list, num);             if (idx >= 0) {   /* This word has existed*/                 strcpy(word_list[idx].word, word);                 word_list[idx].cnt++;             }else {    /* A new word. */                 strcpy(word_list[num].word, word);                 word_list[num].cnt++;                 num++;                 if (num == total_num) {                     break;                 }             }             i = 0;         }else if (ch == '-') {             flag = 1;             continue;         }     }      return num; }  static void print_words_list (struct word_info *word_list, int num) {     int i;      for (i = 0; i < num; i++) {         printf("word: %s, cnt = %d\n", word_list[i].word, word_list[i].cnt);     } }  static void init_words_list(struct word_info *word_list, int num) {     int i;      for (i = 0; i < num; i++)         word_list[i].cnt = 0; }  int main(void) {     struct word_info word_list[MAX_WORD_NUM];     FILE *fp;     int cur_num = 0;      init_words_list(word_list, MAX_WORD_NUM);     fp = open_file("2.txt", "r");      /* read the word from the file. */     cur_num = read_words_list(fp, word_list, MAX_WORD_NUM);     printf("\nShow the word list: \n");     print_words_list(word_list, cur_num);      /* sort the word list. */     sort_as_char(word_list, cur_num);     sort_as_cnt(word_list, cur_num);     printf("\nAfter sort: \n");     print_words_list(word_list, cur_num);      fclose(fp);      return 0; }  /* int main() {     int i = 0, j = 0, l, m;     FILE *fp;     char a, fun[20], dan[10000][20];     struct cun word[10000], t;      if((fp = fopen("case1.in","r")) == NULL) {         perror("Open file error!\n");         exit(0);     }     while((a=fgetc(fp)) != EOF)     {         if(a >= 'A' && a <= 'Z')             a += 32;         if(a >= 'a' && a<= 'z')         {             fun[i] = a;             i++;         }         else         {             if(a == '-')             {                 if((a = fgetc(fp)) != '\n')                 {                     fun[i]='\0';                     strcpy(dan[j], fun);                     j++;                     i = 0;                     if((a >= 'A' && a <= 'Z')                        || (a >= 'a' && a <= 'z'))                     {                         if(a >= 'a' && a <= 'z') {                             fun[i] = a;                             i++;                         } else {                             a += 32;                             fun[i] = a;                             i++;                         }                     }                 }                 else                     continue;             } else             {                 fun[i] = '\0';                 strcpy(dan[j], fun);                 j++;                 i = 0;             }         }         if(j > 0 && dan[j-1][0] == '\0')             j--;     }     if(i != 0) {         fun[i] = '\0';         strcpy(dan[j], fun);         j++;     }     l = j;     strcpy(word[0].c,dan[0]);     for(i=1,m=1;i<l;i++)     {         for(j=0;j<i;j++)         {             if(strcmp(dan[i],dan[j]) == 0)                 break;             else                 continue;         }         if(j == i)         {             strcpy(word[m].c, dan[i]);             m++;         }     }     for(i = 0; i < m; i++)     {         for(j=0;j<l;j++)             if(strcmp(word[i].c,dan[j])==0)                 word[i].n++;     }     for(i=0;i<m;i++)         for(j=0;j<m-i;j++)         {             if((word[j].n<word[j+1].n)||(word[j].n==word[j+1].n&&strcmp(word[j].c,word[j+1].c)>0))             {                 t=word[j];                 word[j]=word[j+1];                 word[j+1]=t;             }         }     if(m<5) for(i=0;i<m;i++)         printf("%s %d\n",word[i].c,word[i].n);     else for(i=0;i<5;i++)         printf("%s %d\n",word[i].c,word[i].n);     fclose(fp);      return 0; } */  改了一下你的程序,对比一下作为一个参考吧. 代码太长,都写在main函数里,分不清功能.

在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。


Question: 两个整形商无法得到浮点的商

谢谢各位，将分母变为1000.0就能得到浮点的商。

不会吧，如果已经转换成了浮点数，除法运算得到的结果也是float类型的  结果肯定是1.5，可能你程序运行了之前生成的结果，建议清理工程重新编译链接再试下

你是咋看到 1.0 的?

VS测试没问题，楼主用printf打印得到的是1？

VS2013测试可以，你什么编译器？  试试下面的 float default_time=GetBase()/1000.0;


Question: 三个整数排序的代码，我写的代码为什么运行不对？求救

引用 3 楼 qq423399099 的回复:scanf才需要加上&,你"%d,%d,%d"的话，输入的时候必须是用逗号来分隔3个数（不能用空格或者回车） 犯低级错误了，谢谢你

把printf("The three integer small to big:%d,%d,%d\n", &x, &y, &z);中的&去掉

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

&的问题，多敲点代码

输出不需要&。

printf("The three integer small to big:%d,%d,%d\n", &x, &y, &z);  改成：  printf("The three integer small to big:%d,%d,%d\n", x, y, z);


Question: 以下程序输出的结果是8341，为什么顺序会换呢？求详解

引用 2 楼 qq423399099 的回复:1.少了个括号 2.main里的for循环for (k = 0; k,n; k++)应该是for (k = 0; k< n; k++) 引用 楼主 qq_36379181 的回复:#include <stdio.h> void sort(int a[],int n) {  int i,j,p;int t;    for(i=1;i<n-1;i+=2)    {  p=i;       for(j=i+2;j<n;j+=2) 		  if(a[j]>a[p]) 			  p=j; 		  if(p!=i) 		  {  t=a[i];a[i]=a[p];a[p]=t; 		  }    }    void main()    {  int s[]={8,1,4,3},n=4,k;       sort(s,n); 	  for(k=0;k,n;k++) 		  printf("%4d",s[k]); 	  printf("\n"); 	  } 这个是选择排序算法，不过写得不完善  void sort(int a[],int n) {     int i,j,p;     int t;     for(i=0;i<n-1;i++)     {         p=i;         for(j=i+1;j<n;j++)         {             if(a[j]>a[p])             {                 p=j;             }         }                  if(p!=i)         {             t=a[i];             a[i]=a[p];             a[p]=t;         }     } }  int main(int argc, const char * argv[]) {     // insert code here...     int s[]={8,1,4,3},n=4,k = 0;     sort(s,n);     for(k=0; k<n; k++)     {         printf("%4d",s[k]);     }     printf("\n");     return 0; }

建议单步跟踪程序运行，观察变量变化情况，看是哪一步和你期望的不一致，然后分析原因