Question: 求教各位，帮帮忙

引用 1 楼 user-3 的回复: #include <stdio.h> #include <stdlib.h>  int main() {     int score;     scanf("%d",&score);     if(score>=0&&score<60)         printf("E\n");     else if(score>=60&&score<70)         printf("D\n");     else if(score>=70&&score<80)         printf("C\n");     else if(score>=80&&score<90)         printf("B\n");     else if(score>=90&&score<=100)         printf("A\n");     else printf("错误信息\n");     switch(score/10){         case 0:case 1:case 2:case 3:case 4:case 5:printf("E\n");break;         case 6:printf("D\n");break;         case 7:printf("C\n");break;         case 8:printf("B\n");break;         case 9:printf("A\n");break;         case 10:switch(score%10){                     case 0:printf("A\n");break;                     default:printf("错误信息\n");break;                 }break;         default:printf("错误信息\n");break;     }     return 0; }     #include <stdio.h> #include <stdlib.h>  int main() {     int score;     scanf("%d",&score); #if 0     if(score>=0&&score<60)         printf("E\n");     else if(score>=60&&score<70)         printf("D\n");     else if(score>=70&&score<80)         printf("C\n");     else if(score>=80&&score<90)         printf("B\n");     else if(score>=90&&score<=100)         printf("A\n");     else printf("错误信息\n"); #else     if (score < 0 || score > 100) {         printf("错误信息\n");         return -1;     }     switch(score/10){         case 0:         case 1:         case 2:         case 3:         case 4:         case 5:printf("E\n");break;         case 6:printf("D\n");break;         case 7:printf("C\n");break;         case 8:printf("B\n");break;         case 9:         case 10:printf("A\n");break;     } #endif     return 0; }  这样代码是不是更简洁一些，不至于switch里面套switch。

引用 3 楼 dululululu 的回复:输入百分制成绩，输出五级制成绩。90-100分输出A，80-89分输出B，70-79分输出C，60-69分输出D，60分以下输出E。编程要求： （1）用if语句嵌套实现，输入成绩超出0-100，输出错误信息。 （2）用switch语句实现，输入成绩超出0-100，输出错误信息 #include <stdio.h> #include <stdlib.h> int main() {     int score;     scanf("%d",&score);     printf("if语句判断:\n");      if(score>=90&&score<=100)         printf("A\n");     else if(score>=80&&score<90)         printf("B\n");       else if(score>=70&&score<80)         printf("C\n");     else if(score>=60&&score<70)         printf("D\n");     else if(score>=0&&score<60)         printf("E\n");     else printf("输入的数字%d不在0-100之内\n",score);          printf("switch语句判断：\n");      switch(score/10){     	case 10:switch(score%10){                     case 0:printf("A\n");break;                     default:printf("输入的数字%d不在0-100之内\n",score);break;                 }break;         case 9:printf("A\n");break;         case 8:printf("B\n");break;         case 7:printf("C\n");break;         case 6:printf("D\n");break;         case 5: 		case 4: 		case 3: 		case 2: 		case 1: 		case 0:printf("E\n");break; 		default:printf("输入的数字%d不在0-100之内\n",score);break;       }     return 0; } 运行结果如下: 当输入数字满足条件时:  当输入数字不满足条件时:   这样我试过，但是有一个问题是你输入101~109它就不符合要求了


Question: 关于ARP欺骗我有几个疑问

1.不管是主机还是网关，静态绑定其它节点的ip mac，就是防止被其它节点欺骗，这不能理解？主机绑定其它机器或者网关的ip mac，就是防止被其它主机或者假网关欺骗，网关同理。 2.路由器就是网关，从问题1就可以看出，可以欺骗，只是谁欺骗谁的问题。不同子网间通信，数据帧里目的mac和源mac会陆续改为前进中的路由器的mac，而数据报文目的ip不变，就是你说的路由器转发会改mac。A骗B，B骗C。。。一个骗一个，骗子网络。 3. 可以修改数据帧 https://blog.csdn.net/qq_16555743/article/details/72652377

引用 3 楼 user-1 的回复:1.静态绑定的项不会动态更新。 2.看不懂在问什么 3.欺骗手断有多种，都有可能，总之都可以达到欺骗的目的。 静态绑定是绑定主机的arp表以防被改啊，但我看到有些文章说静态修改网关（路由器）上的ARP表也可以实现防止欺骗，我想问为什么可以；经路由器转发的包会修改mac，如果局域网的主机都直连路由器，那么是不是就没法实现arp欺骗了（毕竟mac都变了怎么欺骗）；第三个问题是，arp欺骗包发出的数据中的ip地址和mac是错误的，但IP地址是网络层加进去的，mac地址是数据链路层加进去的，我们的C编程平常用的socket，属于会话层或应用层，所以这些修改ip包和mac包是如何做到的，是有相关的API还是先把自己的IP和MAC改了，等生成好了包发出去后再改回来以此实现的？

引用 1 楼 user-1 的回复:不管是主机还是路由器，本身网卡有一固化即相对而言不能改的mac地址，能改的只是系统层面的mac地址；还有一个可动态更新的高速mac缓存，存放的其它节点的ip、mac地址映射表；mac缓存里的条目会定期动态更新，或主动或被动，静态绑定项可不被动态更新而已。arp协议一般是广播协议：请求时是我的ip和mac地址是XXX和XXX，我想知道ip为XXX的节点的mac地址；其它节点收到后会将源ip和mac更新到自己的缓存，同时如果发现目标ip跟自己一样，就作应答，否则就不应答。A发arp请求到B，A是主动，B是被动，请求与应答，达到双向更新对方的ip mac的目的。 我要欺骗你，我就给你发一个arp请求，报告给你别人的ip和我的mac。如果你更新进了你的arp缓存，当你和别人的ip通信时，就会把数据包发到我这里来。 额，老哥，你这只是解释了ARP的过程，我都知道的，并没有回答我的问题啊


Question: c初学者求助这个为什么有逻辑错误

这个问题我自己已经解决了-原来头文件里面没有先声明函数

引用 1 楼 niiiloc 的回复：请描述下具体错误的表现，啥叫逻辑错误？因为我现在上晚修，没带电脑，所以输出的数据记不清楚

引用 1 楼 niiiloc 的回复：请描述下具体错误的表现，啥叫逻辑错误？就是程序能正常运行不报错 但是输出结果不在预期 且不论输入什么数组 输出结果一致 结果是一个比较大的（可能超过了百万，记不太清楚）保留六位小数且小数位都为零的负数

请描述下具体错误的表现，啥叫逻辑错误？


Question: First-chance exception in train.exe: 0xC0000005: Access Violation.的问题

引用 1 楼 niiiloc 的回复：都调试到这个地步了，不太理解为何还发现不了问题。 倒数第二个printf，格式化输出是%d %s %s %s %d %d  6个参数，你后面带的只有5个参数。  还有你的代码风格太差了，分隔符后不能加个空格么？你自己这样看代码眼睛不疼么？谢谢

第四个printf少一个对应值，前面%d和%s加起来是6个，而参数个数确实5个，可以根据你的想法检查一下这个部分。


Question: 初学c语言，各位大佬帮帮忙

提示的只是警告而不是错误吧，代码可以运行啊！

最后一个强制类型转换

强制类型转换？


Question: 创建单链表｜有几个语句看不懂，dalao帮忙解一下吧

添加了两个函数，跟踪显示链表的变化情况，希望对你有帮助。   #include <stdio.h> #include <stdlib.h> #include <malloc.h>  typedef struct LNode { 	int data; 	struct LNode *next; } LNode;  //创建单链表，要返回头节点的指针 // 头指针h是空表头，后面的节点才存放值 LNode *CreateLink(LNode *h, int a[], int n) { 	int i; 	LNode *s, *t; 	h = (LNode *)malloc(sizeof(LNode)); 	h->next = NULL; 	t = h; 	for (i = 0; i < n; ++i) { 		s = (LNode *)malloc(sizeof(LNode)); 		s->data = a[i]; 		t->next = s; 		t = t->next; //（尾插法） 	} 	t->next = NULL; 	return h; }  // 跟踪显示链表状态，前半部分 void headTrace(LNode *h) { 	LNode *ta = h; 	while (ta->next != NULL) { 		printf("%d ==> ", ta->next->data); 		ta = ta->next; 	} 	printf("NULL\n Head <==\n"); }  //  跟踪显示链表状态，后半部分 void tailTrace(LNode *p) { 	LNode *tb = p; 	while (tb != NULL) { 		printf("%d ==> ", tb->data); 		tb = tb->next; 	} 	printf("NULL\n Tail <==\n\n"); }  // 排序，递增方式 void Sort(LNode *h) { 	LNode *p, *p1, *q, *pre; 	if (h->next != NULL) { 		p = h->next->next; 		h->next->next = NULL; 		headTrace(h); 		tailTrace(p); 		while (p != NULL) { 			pre = h; 			q = pre->next; //			headTrace(h); //			tailTrace(p); 			while ((q != NULL) && (q->data < p->data)) { 				pre = q; 				q = q->next; 				headTrace(h); 				tailTrace(p);                                 printf("= ==> Moved Backward = ==> Moved Backward = ==> Moved Backward = ==>\n\n"); 			} 			p1 = p->next; 			p->next = pre->next; 			pre->next = p; 			p = p1; 			headTrace(h); 			tailTrace(p);                         printf("^^ Exchanged ^^ Exchanged ^^ Exchanged ^^ Exchanged ^^\n\n"); 		} 	} }  int main(int argc, char *argv[]) { 	struct LNode *h = NULL; 	int a[7] = { 49, 38, 65, 97, 76, 13, 27 }; 	h = CreateLink(h, a, 7); 	Sort(h); 	while (h->next != NULL) { 		printf("%d ", h->next->data); 		h = h->next; 	} 	return 0; }   结果部分截图，

把代码里的错误，改了一下，主要是CreateLink函数需要有一个返回值，也就是头节点的指针，同时也在main函数里接受一下返回值。   #include <stdio.h> #include <stdlib.h> #include <malloc.h>  typedef struct LNode { 	int data; 	struct LNode *next; } LNode;  //创建单链表，要返回头节点的指针 // 头指针h是空表头，后面的节点才存放值 LNode *CreateLink(LNode *h, int a[], int n) { 	int i; 	LNode *s, *t; 	h = (LNode *)malloc(sizeof(LNode)); 	h->next = NULL; 	t = h; 	for (i = 0; i < n; ++i) { 		s = (LNode *)malloc(sizeof(LNode)); 		s->data = a[i]; 		t->next = s; 		t = t->next; //（尾插法） 	} 	t->next = NULL; 	return h; }  // 排序，递增方式 void Sort(LNode *h) { 	LNode *p, *p1, *q, *pre; 	if (h->next != NULL) { 		p = h->next->next; 		h->next->next = NULL; 		while (p != NULL) { 			pre = h; 			q = pre->next; 			while ((q != NULL) && (q->data < p->data)) { 				pre = q; 				q = q->next; 			} 			p1 = p->next; 			p->next = pre->next; 			pre->next = p; 			p = p1; 		} 	} }  int main(int argc, char *argv[]) { 	struct LNode *h = NULL; 	int a[7] = { 49, 38, 65, 97, 76, 13, 27 }; 	h = CreateLink(h, a, 7); 	Sort(h); 	while (h->next != NULL) { 		printf("%d ", h->next->data); 		h = h->next; 	} 	return 0; }   排序函数void Sort(LNode *h)中的  h->next->next = NULL;  要和后面的具体的排序语句结合起来看。  后面排序的条件是，（1）只要从头向后遍历的节点不是NULL，且前节点的 data 小于 后面某节点的 data，那么前节点就要后移一次，（2）前节点的 data 大于 后面某节点的 data ，那么这两个节点位置互换，（3）后节点一开始也只是前节点的后面一个节点而已，也要一次一次地向后移动。  所以，就会出现一个问题：当前节点 追上 后节点的时候，并且 前节点的 data 是 小于 后节点的 data 的情况下，怎么办？   假如 前节点 再向后移动一次的话，那就和 后节点 重合了， 二者的 data 是一样的， 那肯定不满足 前者 小于 后者 的条件， 那就 交换节点 位置吗？ 这就乱套了啊！   所以， 为了避免这种情况，就让 前节点 追上 后节点 的时候， 前节点的 next 指向 NULL ， 那么这个时候就是 第 2 层 的while 的条件   q != NULL    为假的时候，于是就让 后节点的指针 向后 移动 一次，并且 让 后节点 和 NULL 交换位置 ， 这样做就解决上面说的问题了。 这样， 前节点 、 后节点 的 data 的 比较、互换位置 、追赶，就都完成了。  不知道有没有描述情况，如果没看明白的话，建议你在纸上画一个简单的链表示意，一步一步地推导排序的变化过程，那样会更直观一点。  为了避免回答太长，在下面重新回复一个添加了跟踪显示链表状态的代码，请查看。

这个代码错误太多了。建议你先检查下你抄的代码是否跟题目一致。

void sort（LNode*h）函数中 h－＞next－＞next＝NULL； （什么意思啊，为什么要这样写?）


Question: 结构体问题

引用 2 楼 @风轻云淡_的回复:你缺的或许只是一个typedef

引用 1 楼 自信男孩的回复:*Uio是一个变量，是一个结构体指针变量，op也是一个结构体变量（和Uio区别就在它是一个普通变量）。因此op不是一个结构体类型的辨明，因此op *Uio;这样定义是非法的。  若第二个结构体加上typedef，那就可以op *Uio;定义了，并且和上面Uio指向的结构体一样了（我描述的结构体一样是指结构体成员个数和成员名一样，并不是两个相同的结构体，结构体是否一样还要看结构名是否一样）。 谢谢，我懂了，

你缺的或许只是一个typedef


Question: 程序已退出，返回值为0

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

我也是 为什么呀QAQ

...这算什么问题... 先熟悉自己的IDE吧，工欲善其事必先利其器，你们都还处于熟悉工具的过程 简单来说，F5就是把你的 exe 放在一个控制台（consle）里执行，就是 windows cmd 里面，你贴的图，就表示程序执行完了，返回值为0。因为这个控制台窗口在程序执行完后就关闭，所以如果你想要不关闭，就在代码 return 之前，加上   system("pause"); return 0;

我遇到了和你一样的情况，Ctrl+F5就不会有问题，点执行就会有问题，想知道原因！

引用 4 楼 qq_41769510的回复:[quote=引用 2 楼 qq_38834405的回复:]你是不是按f5开始编译的 ，我直接点执行的，(눈_눈)[/quote] return 0就是运行到头了，但是逻辑有没有问题，结果是不是你预期想的就不一定了

引用 2 楼 qq_38834405的回复:你是不是按f5开始编译的 ，我直接点执行的，(눈_눈)

引用 1 楼 user-6的回复:把代码贴出来 国二的，只记得问题了_(:з」∠)_

你是不是按f5开始编译的

把代码贴出来

引用 5 楼 qq_38834405的回复:[quote=引用 4 楼 qq_41769510的回复:][quote=引用 2 楼 qq_38834405的回复:]你是不是按f5开始编译的 ，我直接点执行的，(눈_눈)[/quote] return 0就是运行到头了，但是逻辑有没有问题，结果是不是你预期想的就不一定了[/quote] 好吧(눈_눈)，谢啦


Question: 哪位大神可以指导下吗，C语言新手小白

建议这些定义一个头文件，将函数声明放到头文件里。函数名前的extern可以不加。另外，函数声明建议放到main函数之外和之上。

需要加上对应的头文件，在你静态的方法上面

定义和生命函数时，参数是个数组，调用时参数却是地址。把生命里面数组改成个指针试下


Question: 栈的应用——表达式计算

这是我之前写过的一道类似的题目，代码供你参考一下  /********************************************************* #include<malloc.h> #include<stdio.h> #define OK 1 #define ERROR 0 #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量  typedef char SElemType; // 定义栈元素类型 typedef int Status; // Status是函数的类型,其值是函数结果状态代码，如OK等 typedef int ElemType; struct SqStack {      SElemType *base; // 在栈构造之前和销毁之后，base的值为NULL      SElemType *top; // 栈顶指针      int stacksize; // 当前已分配的存储空间，以元素为单位 }; // 顺序栈  Status InitStack(SqStack &S) { // 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE 	S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));      if(!S.base) return ERROR; 	 S.top=S.base; 	 S.stacksize=STACK_INIT_SIZE; 	 return OK; }  Status Push(SqStack &S,SElemType e) { // 在栈S中插入元素e为新的栈顶元素 	if(S.top-S.base>=S.stacksize) 	{ 		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 		if(!S.base) return ERROR; 		S.top=S.base+S.stacksize; 		S.stacksize+=STACKINCREMENT; 	} 	*S.top++=e; 	return OK; }  Status Pop(SqStack &S,SElemType &e) { // 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;      e=*--S.top; 	 return OK; }  Status GetTop(SqStack S,SElemType &e) { // 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;     e=*(S.top-1); 	return OK; }  struct SqStack2 {      ElemType *base; // 在栈构造之前和销毁之后，base的值为NULL      ElemType *top; // 栈顶指针      int stacksize; // 当前已分配的存储空间，以元素为单位 }; // 顺序栈  Status InitStack2(SqStack2 &S) { // 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE 	S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));      if(!S.base) return ERROR; 	 S.top=S.base; 	 S.stacksize=STACK_INIT_SIZE; 	 return OK; }  Status Push2(SqStack2 &S,ElemType e) { // 在栈S中插入元素e为新的栈顶元素 	if(S.top-S.base>=S.stacksize) 	{ 		S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType)); 		if(!S.base) return ERROR; 		S.top=S.base+S.stacksize; 		S.stacksize+=STACKINCREMENT; 	} 	*S.top++=e; 	return OK; }  Status Pop2(SqStack2 &S,ElemType &e) { // 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;      e=*--S.top; 	 return OK; }  Status GetTop2(SqStack2 S,ElemType &e) { // 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR 	if(S.top==S.base) return ERROR;     e=*(S.top-1); 	return OK; }  char Precede(char a,char c) {     int i,j;     char pre[7][7]={         {'>','>','<','<','<','>','>'},         {'>','>','<','<','<','>','>'},         {'>','>','>','>','<','>','>'},         {'>','>','>','>','<','>','>'},         {'<','<','<','<','<','=','0'},         {'>','>','>','>','0','>','>'},         {'<','<','<','<','<','0','='}     };     switch(a){     case '+':i=0;break;     case '-':i=1;break;     case '*':i=2;break;     case '/':i=3;break;     case '(':i=4;break;     case ')':i=5;break;     case '#':i=6;break;         return 0;     }     switch(c){     case '+':j=0;break;     case '-':j=1;break;     case '*':j=2;break;     case '/':j=3;break;     case '(':j=4;break;     case ')':j=5;break;     case '=':j=6;break;         return 0;     }     return pre[i][j]; }  SElemType Operate(int a,char b,int c) {     int result;      switch(b)     {     case '+':result=a+b;break;     case '-':result=a-b;break;     case '*':result=a*b;break;     case '/':result=a/b;break;     }     return result; }  int In(char c) {     switch(c)     {     case '+':     case '-':     case '*':     case '/':     case '(':     case ')':     case '=':         return 1;     }     return 0; }  SElemType Evaluate() {     struct SqStack  OPTR;     struct SqStack2 OPND;     char c,x,e,theta;     int a,b,result;     InitStack(OPTR);     Push(OPTR,'#');     InitStack2(OPND);     c=getchar();     while(c!='='||GetTop(OPTR,e),e!='=')     {         if(!In(c))         {             b=1;a=0;             while(!In(c))             {                 a=a*b+c-'0';                 b*=10;                 c=getchar();             }             Push2(OPND,a);         }         else switch(Precede(e,c))             {             case '<':                 Push(OPTR,c);                 c=getchar();                 break;             case '=':                 Pop(OPTR,x);                 c=getchar();                 break;             case '>':                 Pop(OPTR,theta);                 Pop2(OPND,a);                 Pop2(OPND,b);                 Push2(OPND,Operate(a,theta,b));                 break;             }      }     GetTop2(OPND,result);     return result; }  int main() {     printf("%d",Evaluate());     return 0; }    *********************************************/ #include<malloc.h> #include<stdio.h> #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量  typedef int SElemType; // 定义栈元素类型 typedef int Status; // Status是函数的类型,其值是函数结果状态代码，如OK等  struct SqStack {      SElemType *base; // 在栈构造之前和销毁之后，base的值为NULL      SElemType *top; // 栈顶指针      int stacksize; // 当前已分配的存储空间，以元素为单位 }; // 顺序栈  Status InitStack(SqStack &S) { // 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE 	S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));      if(!S.base) return 0; 	 S.top=S.base; 	 S.stacksize=STACK_INIT_SIZE; 	 return 1; }  Status Push(SqStack &S,SElemType e) { // 在栈S中插入元素e为新的栈顶元素 	if(S.top-S.base>=S.stacksize) 	{ 		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 		if(!S.base) return 0; 		S.top=S.base+S.stacksize; 		S.stacksize+=STACKINCREMENT; 	} 	*S.top++=e; 	return e; }  Status Pop(SqStack &S,SElemType &e) { // 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR 	if(S.top==S.base) return 0;      e=*--S.top; 	 return e; }  Status GetTop(SqStack S,SElemType &e) { // 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR 	if(S.top==S.base) return 0;     e=*(S.top-1); 	return e; }   int precede(char a,char b) {     if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';else return '<';}     else if(a=='*'||a=='/'){if(b=='(')return '<';else return '>';}     else if(a=='('){if(b==')')return '=';else return '<';}     else if(a==')'){return '>';}     else if(a=='='){if(b=='=')return '=';else return '<';}     return 0; } int P() {     char c;int x,b,d,e,s;     SqStack T,N;     InitStack(T);InitStack(N);     Push(T,'=');c=getchar();     while(c!='='||GetTop(T,e)!='=')     {         if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='='&&c!='('&&c!=')'){s=c-'0';c=getchar();while(c>='0'&&c<='9'){s=s*10+(c-'0');c=getchar();}Push(N,s);}         else         switch (precede(GetTop(T,e),c))         {             case '<':Push(T,c);c=getchar();break;             case '=':Pop(T,x);c=getchar();break;             case '>':Pop(T,e);Pop(N,b);Pop(N,d);             if(e=='+')Push(N,d+b);             else if(e=='-')Push(N,d-b);             else if(e=='*')Push(N,d*b);             else if(e=='/')Push(N,d/b);             break;         }      }     return GetTop(N,e); } int main() {     printf("%d",P());     return 0; }

首先，你要把这些代码放在cpp文件里，其次，main第五行有一个gets_s(a);这里要去掉_s，运算过程中最后得到的数并不一定只有一位，所以最后那里输出的时候也错了，可能你中间的计算也有一点问题，导致我改后试了一下你的1+1得到的是-48


Question: DAY 5.

你的问题是什么？


Question: 大哥们，帮我看下这个程序为啥跑不起来...

while(lenc<=lena||lenc<=lenb); 这个其实是一个死循环了，去掉while的分号，继续看看是否是你的想要的结果。  c[lenc]=a[lenc]+b[lenb]+x; 注意这条语句中 b的下表都是lenb,是否符合你的要求呢

while括号后面多了一个分号，所以后面的{}不是它循环体了。它的判定条件一直为真，就会死循环

你的while的括号那多了一个分号


Question: 根据三角形的三个顶点计算面积判断类型

建议直接贴出你的代码，如果你的代码不属于保密内容。


Question: 关于递增的疑问，求各位大神解答。

是从1开始的呢，因为初始化的x为1。

引用 3 楼 coo135的回复:y = (++x*5) + 50是在printf("% 10d % 10d\n", x, y);之后才执行的……所以第一次是 1  55 懂了懂了，谢谢你

引用 2 楼 儿童节的回复:你上面的代码，y的表达式里少打了一个x，怪不得看着那么奇怪。  #include <stdio.h> int main(void) { 	int x; 	int y = 55;  	for (x = 1; y <= 75; y = (++x*5) + 50) 		printf("% 10d % 10d\n", x, y); 	return 0; }   for 循环的圆括号里面的第 3 个表达式是，当每一次循环的时候，等循环体（花括号里面）里的语句全部都执行完了之后，才去执行。  所以你的疑问 和 自增运算符的关系不大，跟 for 的圆括号 里的语句的执行时机 有直接关系。 嗯嗯，懂了懂了，谢谢你

引用 1 楼 Jake_q的回复:先弄明白for循环:第一次先执行第一个分号前的，然后执行第二个分号前的条件判定语句，然后再执行循环体，执行玩循环体，再执行第二个分号后面的第三句的内容，然后又到执行判定语句，如果真再进入循环体。所以第一次的时候就是从1开始的，执行完一遍循环体才会执行++的那一句。    PS:C Primer Plus这本书挺不错的。 噢~懂了懂了，谢谢你。


Question: sift算法特征提取识别海洋溢油！

可以的话希望能加qq教一下，谢谢437083697

色差或者说轮廓明显吗？

站个1lou 哥哥们，救救我


Question: PAT提交编译错误

引用 6 楼 自信男孩的回复:[quote=引用 5 楼 Martin Morning 的回复:] [quote=引用 4 楼 自信男孩的回复:]char st[30];     char s[10][10];     //itoa(sum,st,10);     snprintf(st, 30, "%d", sum);     char *p=st;i=0;  itoa不支持，需要自己写这个函数功能，可以使用snprintf或sprintf代替。如上 谢谢老哥，基本通过了。不过不知道为啥有个运行时错误[/quote] 什么错误？[/quote] 我也不知道啊。我在PAT官网上上刷题，好多题提交后大部分测试点都能通过，一两个会提示 运行时错误。

引用 5 楼 Martin Morning 的回复:[quote=引用 4 楼 自信男孩的回复:]char st[30];     char s[10][10];     //itoa(sum,st,10);     snprintf(st, 30, "%d", sum);     char *p=st;i=0;  itoa不支持，需要自己写这个函数功能，可以使用snprintf或sprintf代替。如上 谢谢老哥，基本通过了。不过不知道为啥有个运行时错误[/quote] 什么错误？

引用 4 楼 自信男孩的回复:char st[30];     char s[10][10];     //itoa(sum,st,10);     snprintf(st, 30, "%d", sum);     char *p=st;i=0;  itoa不支持，需要自己写这个函数功能，可以使用snprintf或sprintf代替。如上 谢谢老哥，基本通过了。不过不知道为啥有个运行时错误

你把itoa()注释掉看看能不能编译。。。

引用 1 楼 user-2的回复:n 小于 10的100次方，数组元素需要100个~~  然后你提交时，编译器选C++。 还是编译错误。。和数组应该没关系，编译软件可以运行。估计是环境的原因


Question: c语言生成随机数偏小？

局部变量，全局变量，静态变量这些，没怎么学明白，我回去再看看

引用 3 楼 lin5161678的回复:假设RAND_MAX是32767 0-13 这14个数字出现的时候 小于 4/10000 几率是14/32767 你运行100*100000 结果是14/32767*100*100000 == 4272.59 结果是 4200~4300 完全正常 对对对，好像是这样，一直没找明白，想问下有没有什么好的随机数生成方法，生成这种特别小的小数的，谢谢啦

引用 2 楼 user-3的回复:将计数的那个循环拿到j的循环外面来，你这个代码风格有点难看出是不是放错地方了，建议行与行之间不要空行 这个复制出来以后格式乱了，谢谢建议

double a[100000]={0}; 这条语句定义的局部变量，建议加上static变成静态变量。因为栈上空间是有限的，而这个条语句申请的栈上空间是很大的。100000 * 8 Bytes

你嵌套循环了，所以所有数字的个数都乘以100了，原本40就变成4000了


Question: 单链表的插入和删除

能实现了，感谢指教，感谢感谢

你的算法有问题~~~给你改了一下~~水平有限   #include<stdio.h> #include<stdlib.h> #include<malloc.h> struct A { 	char sun; 	struct  A *next; }; char n; int num=0; struct A *creat() { 	struct A *p1,*p2,*h; 	char ch_t; 	p1=p2=(struct A*)malloc(sizeof(struct A)); 	printf("请输入字符串以enter结束：\n"); 	p1->sun=getchar(); 	p1->next=NULL; 	h=p1; 	num=1;  //num是用来统计节点个数的吧…… 	; 	while((ch_t=getchar())!='\n') { 		p2=p1; 		p1=(struct A*)malloc(sizeof(struct A)); 		p1->sun=ch_t; 		p1->next=NULL; 		p2->next=p1; 		num++; 	} 	printf("输入完成！\n"); 	return h; }  //打印链表中的每个节点。 int list(struct A *p) { 	if(!p) { 		printf("字母链表为空！\n"); 		return 0; 	}  	printf("字母序列为：\n"); 	while(p) { 		printf("%c ",p->sun); 		p=p->next; 	} 	printf("\n"); 	return 1; }   int reseach(struct A *p) { 	printf("输入一个字符:\n"); 	scanf("%c",&n); 	int pos=1; //寻找链表中是否有等于n的节点。找到返回位置，未找到返回0； 	while(p) { 		if(p->sun==n) break; 		p=p->next; 		pos++; 	} 	if(p) return pos; 	else return 0; }  struct A* deletes(struct A *p) { 	struct A *s,*h;// 	h=p;//不带头结点的链表，如果删除头结点，需要返回新的头结点地址 。 	if(p->sun==n) { 		h=p->next; 		free(p); 	} else { 		while(p) { 			if(p->next->sun==n) {  // 删除相应节点。 				s=p->next; 				p->next=p->next->next; 				free(s); 				break; 			} 			p=p->next; 		} 	}  	printf("删除后的数组为:\n"); 	list(h); 	return h; }  //不带头结点的链表，如果插入在头结点前，需要返回新的头结点地址 。  //你好像 就插在尾部就可以了是吧~~ struct A * insert(struct A *p,int pos) { 	struct A *s,*h; 	s=p;  	h=(struct A*)malloc(sizeof(struct A)); 	printf("请输入要插入的元素:"); 	do { 		h->sun=getchar(); 	} while(h->sun=='\n');  	if (pos==0) { //插在链表头 		h->next=s; 		p=h; 	} else {	//定位到要插入的位置pos 		while((--pos>0)&&s->next!=NULL) { 			s=s->next; 		} 		h->next=s->next; 		s->next=h; 	}  	printf("\n插入后的数组"); 	list(p); 	return p; }  void destroy(struct A *p) { 	struct A *t; 	while(p) { 		t=p->next; 		free(p); 		p=t; 	} }  int main() { 	struct A *head; 	head=creat(); 	list(head); 	int b; 	b=reseach(head); 	if(b) { 		head = deletes(head); 	} else { 		//insert(head，num)用法  num：插在链表第num个元素之后  		printf("链表未找到元素：%c\n",n) ; 		head=insert(head,num); 	} 	//删除链表 	destroy(head) ;  	return 0; }

确实是一个原因。可是后面不管输入什么都是执行插入，而且插入之后为什么输出的是乱码呀？？？？

main （）中的      if(b=1)   写错了吧，应是    if(b==1) 吧~


Question: 请教大神四道题

第三题  #include <stdio.h> #include <stdlib.h>  int main() {     int a,max=0,i;     for(i=0;i<4;i++){         scanf("%d",&a);         max = max>a?max:a;     }     printf("%d",max);     return 0; }

第二题  #include <stdio.h> #include <stdlib.h>  int main() {     int i,sum=0;     for(i=1;i<=50;i++){         sum+=i*(i+1);     }     printf("%d",sum);     return 0; }

第一题  #include <stdio.h> #include <stdlib.h>  int main() {     int i,a[10];     double sum=0;     for(i=0;i<10;i++){         scanf("%d",&a[i]);         sum+=a[i];     }     printf("%.2f",sum/10);     return 0; }


Question: c语言新手问题，求大佬看看

引用 1 楼 盲侠z 的回复:求个位数字的错了吧，，应该是 g=x%10; 谢谢！g=(x-b*100-s*10);这样就对了

求大佬解答！！！

求个位数字的错了吧，，应该是 g=x%10;


Question: C 读取文件数据

fscanf/fprintf, fread/fwrite，fgets/fputs等这些是文件的读写接口，并且是成对出现的，因此怎么写入的，就要考虑用对应的读去操作。

记得把//    input_stu();   前面的//去掉~~~

方法有点笨，供参考。   #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct _stu { 	char id[12]; 	char name[20]; 	float math; 	float english; 	float physics; } student;  int input_stu() { 	student stu[5]; 	FILE * out=fopen("s.txt","w"); 	if(!out) { 		printf("打开文件失败。\n"); 		return 1; 	} 	for(int i=0; i<5; i++) { 		printf("\n输入第 %d 位学生：\n",i+1) ; 		printf("学    号:"); 		scanf("%s",&stu[i].id); 		printf("姓    名:"); 		scanf("%s",&stu[i].name); 		printf("数学成绩:"); 		scanf("%f",&stu[i].math); 		printf("英语成绩:"); 		scanf("%f",&stu[i].english); 		printf("物理成绩:"); 		scanf("%f",&stu[i].physics); 		fprintf(out,"%s %s %.2f %.2f %.2f\n",stu[i].id, 		        stu[i].name,stu[i].math,stu[i].english,stu[i].physics); 	} 	printf("信息保存成功。\n\n") ; 	fclose(out); 	return 0; }  int read_stu(student* stu) { 	FILE* in=fopen("s.txt","r"); 	if(!in) { 		printf("打开文件失败。\n"); 		return 1; 	} 	printf("从文件中读取的成绩如下：\n"); 	printf("学号   姓名    数学成绩    英语成绩    物理成绩  \n"); 	for(int i=0; i<5; i++) { 		fscanf(in,"%s %s %f %f %f",(stu+i)->id, 		       (stu+i)->name,&(stu+i)->math,&(stu+i)->english,&(stu+i)->physics); 		printf("%s    %s    %4.2f       %4.2f      %4.2f    %4.2f\n",stu[i].id, 		       stu[i].name,stu[i].math,stu[i].english,stu[i].physics); 	} 	fclose(in); 	return 0; }  int sort(student* stu) { 	student tmp; 	float t; 	float count[5]; 	for(int i=0; i<5; i++) { 		count[i]=stu[i].math+stu[i].english+stu[i].physics; 	} 	int  max=0; 	for(int i=0; i<5; i++) { 		max=i; 		for(int j=i+1; j<5; j++) { 			if(count[j]>count[max]) max=j; 		} 		if(max!=i) { 			t=count[i]; 			count[i]=count[max]; 			count[max]=t; 		 			memcpy(&tmp,&stu[i],sizeof(student)); 			memcpy(&stu[i],&stu[max],sizeof(student)); 			memcpy(&stu[max],&tmp,sizeof(student)); 		} 	} 	return 0; }  int main() { 	student stu[5]; //	input_stu();//输入信息，然后保存的文件。  	read_stu(stu);//从文件中读取信息  	sort(stu);//排序输出  	printf("\n排序后的成绩如下：\n"); 	printf("学号   姓名    数学成绩    英语成绩    物理成绩   总成绩\n"); 	for(int i=0; i<5; i++) { 		printf("%s    %s    %4.2f       %4.2f      %4.2f    %4.2f\n",stu[i].id, 		       stu[i].name,stu[i].math,stu[i].english,stu[i].physics, 		       stu[i].math+stu[i].english+stu[i].physics); 	       }  }


Question: 学完c之后应该学什么

看你想做的是什么类型的程序/项目，各有最合适的语言。

学习程序语言没有必要把一本书从头学到尾才才开始做些事，什么是基本的东西也是比较抽象的。可以自己着手做些简单的事，如果无法入手，起码要了解需要哪些知识，然后针对性地去学习这些知识，一个个突破，不要怕出现问题，你会在解决问题中学会很多东西，而且印象深刻，容易牢记。

引用 1 楼 user-2的回复:学习C++比较好。当然没有必要 把C++全部学会，学一些比较基础的东西，如果工作需要，可以根据工作需要再继续深入学习。有了C/C++ 知识，学习其他程序语言会容易许多。 了解了解，谢谢了

不过，有了C/C++知识后，可能会很看不上其他程序语言了


Question: c语言

复数，高中的知识啊，虚数i的平方等于-1。

嗯……拍的时候还好好的

你这图.....


Question: c你好(一)

欢迎来到C语言世界

欢迎来到C的世界


Question: C语言计算无论输入什么数，得到的结果都相同，求解，不知道问题出在哪儿

楼上说对了。你打印的有问题，应该去掉&符号。

注意printf中，去掉&t前的&。我想你是想输出t的值，而非t的地址。

这里可以下载一些关于编程的书籍，推荐给你吧https://mp.weixin.qq.com/s/fsvKzaeVsQUVoPhM1mUezQ

建议你看一下c语言操作符，位运算符   ^是位运算操作符（针对二进制位进行运算），不是通常所说的幂运算符

引用 1 楼 user-3 的回复:c语言里平方你可以加#include<math.h>头文件，用函数pow(x,y)表示x^y,或者你直接写成x * x也行，你再试一下  嗯……我试了，为什么在C语言里用n^2和n*n得到的结果不同n呢? 而且有时候计算明明公式没错总是出现一些特别大的数，比如

^表示的是按位异或操作


Question: 统计中文词语词频

引用 楼主 weixin_44796503的回复:我想用c语言统计文件中的中文词语词频，有没有大佬有好方法让小弟借鉴 建议Python

引用 1 楼 user-1 的回复：[quote=引用 楼主 weixin_44796503的回复:]我想用c语言统计文件中的中文词语词频，有没有大佬有好方法让小弟借鉴 建议Python[/quote]小弟正在学c/c++所以希望用c语言实现


Question: c语言中字符变量赋值问题

我回答一下第一个问题，比方说c语言中char类型一般是一个字节，系统只会查看后8位，所以p是d；

p是字符变量不是字符串指针或数组。因此char p = 'abcd';这样赋值是有问题的，''是表示一个字符，既然是问题的赋值操作，结果可能是未定义的。

char类型理论上也是int类型，因为接受的是ASCII码，char a ='abc'， 就是在反复把一个int的值(97,98,99)赋给a，只会警告你，但是不算语法错误

引用 3 楼 秦帅的回复:这道题多处错误，字符串应该用“  ”，字符用单引号，双引号框起来的字符串代表地址， 定义的p是一个字符变量，就是单引号里边本应该只有一个字符，但是放了多个字符也可以编译运行通过，自动取最后一个字符给了p

引用 2 楼 user-5的回复:1.%c是字符输出 2.''这种符号是单个字符，a,b,c,d,e都算一个字符，但是如果连在一起，就是字符串，附值应该是用char *p或者是char p[5] 为什么单引号里边放了多个字符也可以编译通过，然后把最后一个字符赋值给字符变量p

有大神解释下吗，今天突然碰到这个类型题


Question: 求这个顺序表的问题所在，我要疯了，写了3天了

可以了可以了，谢谢大佬谢谢大佬。

。。。不行啊

不行啊大哥，出现debug了。还有指针空了是什么意思。。。

楼主，你指针指空了~~~  main（）中修改如下：  SqList t,*T;        //SqList * psq; T=&t; if(InitList(T)==ERROR)  大问题解决了，接下去就是算法的问题了。 好像很多函数都有点小问题，相信楼主自己能解决的了。  楼主加油！


Question: 萌新求解答C语言素数判断

图看不清呢。建议放源码。


Question: 判断素数输出因子

怎么做呢

任意输入一个数将它分解为三个正整数且个位不为2

引用 3 楼 user-1的回复:[quote=引用 2 楼 weixin_44854092 的回复:] [quote=引用 1 楼 user-1的回复:]这道题讲了如何求素数因子的两种方法，可以参考哈：https://blog.csdn.net/pyuxing/article/details/88848202 会判断但是不会输出它的因子，要求：输入9输出:9的因子有1，3，9，不是素数 输入11输出：11的因子有1，11，是输出[/quote] 这两种方法里都是有输出因子的，如果输出有格式要求的话，可以将因此存入数组，然后再统一最后输出也可以的。[/quote] 谢谢了

引用 2 楼 weixin_44854092 的回复:[quote=引用 1 楼 user-1的回复:]这道题讲了如何求素数因子的两种方法，可以参考哈：https://blog.csdn.net/pyuxing/article/details/88848202 会判断但是不会输出它的因子，要求：输入9输出:9的因子有1，3，9，不是素数 输入11输出：11的因子有1，11，是输出[/quote] 这两种方法里都是有输出因子的，如果输出有格式要求的话，可以将因此存入数组，然后再统一最后输出也可以的。

引用 1 楼 user-1的回复:这道题讲了如何求素数因子的两种方法，可以参考哈：https://blog.csdn.net/pyuxing/article/details/88848202 会判断但是不会输出它的因子，要求：输入9输出:9的因子有1，3，9，不是素数 输入11输出：11的因子有1，11，是输出


Question: C语言菜鸟求助

引用 5 楼 puthon 的回复:在调用这部分的时候你应该先要判断一下，就是保证输入的是非0, 0。 即if(a!=0 && n!=0)再进下面的代码段，防止数组越界c[i] = a+ b;i++;k++ if 并不能实现循环输入   这里我刚看到了是while 循环条件逻辑出了问题，假如是a != 0 && b != 0那么a和b中的其中一个取0的时候也会跳出循环  改成!(a ==0 && b==0) 就没问题了。  谢谢你的热心回复    另外咋点哪儿给分鸭 =  =

引用 3 楼 puthon 的回复:这里应该是局部变量j来遍历：printf("%d\n",c[j]); 看到了  但是我好像while这儿的条件还是有问题

这里应该是局部变量j来遍历：printf("%d\n",c[j]);

for(j = 0;j < k;j++) 	{ 		printf("%d\n",c[   j   ]); /// 这里 k -> j  	}


Question: C语言进制转化

进制转换用递归可能更加好办一点，因为符合人的思维

关于void main()可以参考这里http://www.stroustrup.com/bs_faq2.html#void-main

static bs=0; 要声明一下变量类型，比如static int bs=0; 同时建议main函数返回值最好不用void c++实现十六进制的转换https://blog.csdn.net/pyuxing/article/details/88847810，关于stl的使用不能再舒服了，


Question: 请问在数据结构中，顺序表中插入元素时空间已满增加新的分配时返回地址给newbase为什么定义成ElemType型不是SqList型

引用 1 楼 user-1 的回复://?为什么是ElemType不能是SqList?  SqList是用来记录顺序表的具体位置、长度、大小。 具体是用一个数组来实现的 ：  (*L).elem=(ElemType*)malloc((LIST_INIT_SIZE)*sizeof(ElemType)); 元素的类型在SqList中写明了，是ElemType。  //(*vi)什么意思(ElemType*)什么意思// 函数指针    参数类型 具体请百度：函数指针   //?为什么是ElemType不能是SqList? 你这顺序表是按照ElemType类型建的~~~ 谢谢，明白了，非常感谢！


Question: 求大神编写C语音题目

正着读反着写就行了呀

把t1.txt文本读入内存（数组），然后把这个数组从后往前一个字符一个字符写入t2.txt


Question: 求大神解答！！！

加上# include <stdbool.h>,之后依然会报错

加个 #include "stdafx.h"

少头文件#include <stdbool.h>，错误提示找不到bool类型

return false  后面 在加一个 return  true;  或者 false 错误原因   ： 你的函数  只有局部返回值


Question: 如何实现获取鼠标按下左键的坐标？

用c语言需要获取鼠标的句柄，然后对鼠标的操作进行判断  HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄 INPUT_RECORD inRec; DWORD res; ReadConsoleInput(hInput, &inRec, 1, &res); if (inRec.EventType == MOUSE_EVENT && inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键  大概基本操作就这样吧，你也可以查一下win32api的书籍


引用 9 楼 lin5161678的回复:引用对于*（（w+1）[2]）我还是很清楚的，相当于数组w[1][2] 清楚是清楚了 可惜是错的 这是 w[3][0] 前面打错了，后面跟着复制了，手机上打代码比较麻烦，那个[ ]不能解引用嘛？不是指针里面[ ]同等于*解引用嘛？

引用 7 楼 懵逼是一种状态 的回复:[quote=引用 6 楼 qq_38834405的回复:]你二维数组要么用[]要么用*来解引用，*(w+1)[2]，w+1先与[2]结合，因为优先级的问题，他还没有解引用，所以是一直在对行操作，就变成了*(w+3)，再与*结合，变成**(w+3)。 你可以写一下(w+1)[2][1]，等同于w[3][1]。 [ ]的优先级仅次于（），为什么w+1会与[2]结合啊？不是应该先[ ]解引用嘛？请问这块知识能到哪里去看呀？我看谭浩强书上没有讲有关解引用的点。而且网上也没有找到有关二位数组的解引用问题[/quote]  [ ]  ( )  ->   . 是同一优先级，顺序是从左→向右。 *  & 之类的一元运算符，优先级第二，顺序是从右←向左 所以*(w+1)[2] 先算(w+1)    再算[2]，将(w+1)[2]展开就是：*（（w+1）+2）==*(w+3)，这就是数组第四行的首地址。 然后再*运算，解引用，*（*(w+3)），得到数组第四行第一个元素的值（w[3][0]）。

引用 6 楼 qq_38834405的回复:你二维数组要么用[]要么用*来解引用，*(w+1)[2]，w+1先与[2]结合，因为优先级的问题，他还没有解引用，所以是一直在对行操作，就变成了*(w+3)，再与*结合，变成**(w+3)。 你可以写一下(w+1)[2][1]，等同于w[3][1]。 [ ]的优先级仅次于（），为什么w+1会与[2]结合啊？不是应该先[ ]解引用嘛？请问这块知识能到哪里去看呀？我看谭浩强书上没有讲有关解引用的点。而且网上也没有找到有关二位数组的解引用问题

引用 1 楼 qq_38834405的回复:优先级和括号的用法有什么关系。。 各位，抱歉，我打错了，是*（w+1）[2]与（*（w+1））[2]的区别

引用 1 楼 qq_38834405的回复:优先级和括号的用法有什么关系。。 抱歉抱歉，我才看到我打错了，是*（w+1）[2]与（*（w+1））[2]的区别，原谅我...

优先级和括号的用法有什么关系。。

引用 4 楼 qq_38834405的回复: 本质就是a[0] = *(a+0) 额，所以说我打错了，还是谢谢你，我还有疑问是那个*（w+1）[2]为什么可以写成*（*（（w+1）+2））。或者说，（w+1）[2]可以写成*（（w+1）+2）啊？

本质就是a[0] = *(a+0)


Question:
#include
#include
#include
typedef struct{

引用 2 楼 æ¶åæ å£° 的回复:[quote=引用 1 楼 niiiloc的回复:]自己发的帖都不看看发成什么鬼样子的么？ 发错了，本来想删掉的，但删不掉呀。[/quote] 在这个帖子下面回复时再发一遍，不然不清楚你的问题无法给你解决。

引用 1 楼 niiiloc的回复:自己发的帖都不看看发成什么鬼样子的么？ 发错了，本来想删掉的，但删不掉呀。

自己发的帖都不看看发成什么鬼样子的么？


Question: 大佬们，我想知道这是为什么？

这个和你的程序没什么关系吧

另外 调试时F5 运行时Ctrl+F5

这个是输出窗口,正常情况下就是有些dll无法加载,你就注重窗口预览中的变量的值是不是和你预想的一样就好了.这些符号不用管他.这种dll就算是有问题你也改不了,因为不是你写的,索性就不用管它.你需要关注的是左边的窗口

你F5运行的？

是不是编译器的位数问题，你要加载的是64位的库文件，而你的是win32的编译器。

要下符号表 https://blog.csdn.net/simo_xi/article/details/85126756


Question: C语言

不能删除评论吗？QAQ眼花了，不好意思

你可以百度一下这个的算法，你这个明显有错，不能从1开始


Question: 高分求调制解调器发送语音的源码

引用 1 楼 user-1 的回复:感觉安卓做这个工作比较简单些。。 安卓在打电话的时候放不出声音，我试过。你要是有用安卓实现的方法也可以。

感觉安卓做这个工作比较简单些。。


Question: 输入输出格式问题

浮点数在内存中存储会以0.xxxxx加一个指数来存储，这个主要是计算机在设计时为了增大存储的范围而设定的，而如果以%d读入会抹去零头于是就是0，最后输出也就是0了

scanf里要用%f

建议从网上搜一下整型和浮点型在内存中的表示，通过它们之间的区别来分析这个问题。

引用 3 楼 秦帅的回复:scanf    %d是整型，应该用%f， 这里没有将读取的整型变成浮点型

scanf    %d是整型，应该用%f，

引用 1 楼 user-5的回复:看源码  你多试几个数、不一定是0 我试了10多个数呢，都是输出0.000000,我觉得是格式不一致，但这种说法太肤浅了，根本原因是啥呢

看源码  你多试几个数、不一定是0


Question: C语言实现RC4


Question: 求助一个程序

应该不会有人帮你的,自己写吧.碰到不会的再查,再发帖问.

引用 5 楼 clnlyjdm的回复:#include "stdio.h" #include "string.h" #include "windows.h" #include "conio.h" void input(); void menu(); struct student { int code; char name[20]; char sex; int age; int chinese; int english; int computer; int math; int total; int average; }stud[100]; struct student temp; void input() { int num,i; printf("请问您要输入几个学生的信息？\n"); scanf("%d",&num); for(i=0;i<num;i++) { printf("请输入第%d个学生的学号:\n",i+1); scanf("%d",&stud[i].code); printf("请输入第%d个学生的姓名:\n",i+1); scanf("%s",&stud[i].name); fflush(stdin); printf("请输入第%d个学生的性别(F为女，M为男):\n",i+1); scanf("%c",&stud[i].sex); fflush(stdin); printf("请输入第%d个学生的年龄:\n",i+1); scanf("%d",&stud[i].age); printf("请输入第%d个学生的语文成绩:\n",i+1); scanf("%d",&stud[i].chinese); printf("请输入第%d个学生的英语成绩:\n",i+1); scanf("%d",&stud[i].english); printf("请输入第%d个学生的计算机成绩:\n",i+1); scanf("%d",&stud[i].computer); printf("请输入第%d个学生的数学成绩:\n",i+1); scanf("%d",&stud[i].math); stud[i].total = stud[i].chinese+stud[i].english+stud[i].computer+stud[i].math; stud[i].average = stud[i].total/4; } printf("您已经输入了%d个学生的信息",num); printf("\n请按任意键返回主菜单！"); fflush(stdin); getch(); system("cls"); menu(); } void find() { int choice,i,code; char name[20]; printf("请问您需要按照哪一个方式来查找学员：\n"); printf("查找方式：1.按学号查找。2.按姓名查找。\n"); scanf("%d",&choice); if(choice==1) { printf("请输入您要查找的同学的学号:\n"); scanf("%d",&code); for(i=0;i<100;i++) { if(code == stud[i].code) { printf("\n第%d个学生的学号是：%d\n",i+1,stud[i].code); printf("第%d个学生的姓名是：%s\n",i+1,stud[i].name); printf("第%d个学生的性别是：%c\n",i+1,stud[i].sex); printf("第%d个学生的年龄是：%d\n",i+1,stud[i].age); printf("第%d个学生的语文成绩是：%d\n",i+1,stud[i].chinese); printf("第%d个学生的英语成绩是：%d\n",i+1,stud[i].english); printf("第%d个学生的计算机成绩是：%d\n",i+1,stud[i].computer); printf("第%d个学生的数学成绩是：%d\n",i+1,stud[i].math); printf("第%d个学生的总成绩是：%d\n",i+1,stud[i].total); printf("第%d个学生的平均分是：%d\n",i+1,stud[i].average); printf("══════════════════════════════\n"); } } } else if(choice==2) { printf("请输入您要查找的学生的姓名"); fflush(stdin); gets(name); for(i=0;i<100;i++) { if(strcmp(name,stud[i].name)==0) { printf("\n第%d个学生的学号是：%d\n",i+1,stud[i].code); printf("第%d个学生的姓名是：%s\n",i+1,stud[i].name); printf("第%d个学生的性别是：%c\n",i+1,stud[i].sex); printf("第%d个学生的年龄是：%d\n",i+1,stud[i].age); printf("第%d个学生的语文成绩是：%d\n",i+1,stud[i].chinese); printf("第%d个学生的英语成绩是：%d\n",i+1,stud[i].english); printf("第%d个学生的计算机成绩是：%d\n",i+1,stud[i].computer); printf("第%d个学生的数学成绩是：%d\n",i+1,stud[i].math); printf("第%d个学生的总成绩是：%d\n",i+1,stud[i].total); printf("第%d个学生的平均分是：%d\n",i+1,stud[i].average); printf("══════════════════════════════\n"); } } } else { printf("请输入1或者2,只能按照姓名或者学号来查找学生信息"); fflush(stdin); getch(); system("cls"); find(); } printf("学生相关信息打印完毕"); printf("\n请按任意键返回主菜单！"); fflush(stdin); getch(); system("cls"); menu(); } void insert() { int i,j=0; system("cls"); printf("请输入要插入学生的信息:\n"); printf("请输入学生的学号:\n"); scanf("%d",&temp.code); printf("请输入学生的姓名:\n"); scanf("%s",&temp.name); fflush(stdin); printf("请输入学生的性别(F为女，M为男):\n"); scanf("%c",&temp.sex); fflush(stdin); printf("请输入学生的年龄:\n"); scanf("%d",&temp.age); printf("请输入学生的语文成绩:\n"); scanf("%d",&temp.chinese); printf("请输入学生的英语成绩:\n"); scanf("%d",&temp.english); printf("请输入学生的计算机成绩:\n"); scanf("%d",&temp.computer); printf("请输入学生的数学成绩:\n"); scanf("%d",&temp.math); temp.total = temp.chinese+temp.english+temp.computer+temp.math; temp.average = temp.total/4; for(i=0;i<100;i++) { if(temp.code<stud[i].code) { for(j=99;j>i;j--) { stud[j]=stud[j-1]; } } stud[j]=temp; break; } printf("你成功已插入了学生的信息！"); printf("\n请按任意键返回主菜单！"); fflush(stdin); getch(); system("cls"); menu(); } void del() { int code,i,j; printf("请输入您要删除的学员的学号：\n"); scanf("%d",&code); for(i=0;i<100;i++) { if(code==stud[i].code) { for(j=i;j<100;j++) { stud[j]=stud[j+1]; } } if(strlen(stud[i].name)>0) { printf("\n第%d个学生的学号是：%d\n",i+1,stud[i].code); printf("第%d个学生的姓名是：%s\n",i+1,stud[i].name); printf("第%d个学生的性别是：%c\n",i+1,stud[i].sex); printf("第%d个学生的年龄是：%d\n",i+1,stud[i].age); printf("第%d个学生的语文成绩是：%d\n",i+1,stud[i].chinese); printf("第%d个学生的英语成绩是：%d\n",i+1,stud[i].english); printf("第%d个学生的计算机成绩是：%d\n",i+1,stud[i].computer); printf("第%d个学生的数学成绩是：%d\n",i+1,stud[i].math); printf("第%d个学生的总成绩是：%d\n",i+1,stud[i].total); printf("第%d个学生的平均分是：%d\n",i+1,stud[i].average); printf("══════════════════════════════\n"); } } printf("学生相关信息打印完毕"); printf("\n请按任意键返回主菜单！"); fflush(stdin); getch(); system("cls"); menu(); } void output() { int i; for(i=0;i<100;i++) { if(strlen(stud[i].name)>0) { printf("\n第%d个学生的学号是：%d\n",i+1,stud[i].code); printf("第%d个学生的姓名是：%s\n",i+1,stud[i].name); printf("第%d个学生的性别是：%c\n",i+1,stud[i].sex); printf("第%d个学生的年龄是：%d\n",i+1,stud[i].age); printf("第%d个学生的语文成绩是：%d\n",i+1,stud[i].chinese); printf("第%d个学生的英语成绩是：%d\n",i+1,stud[i].english); printf("第%d个学生的计算机成绩是：%d\n",i+1,stud[i].computer); printf("第%d个学生的数学成绩是：%d\n",i+1,stud[i].math); printf("第%d个学生的总成绩是：%d\n",i+1,stud[i].total); printf("第%d个学生的平均分是：%d\n",i+1,stud[i].average); printf("══════════════════════════════\n"); } } printf("学生相关信息打印完毕"); printf("\n请按任意键返回主菜单！"); fflush(stdin); getch(); system("cls"); menu(); } void sort() { int i,j; for(i=0;i<100;i++) { for(j=i+1;j<100;j++) { if(strlen(stud[i].name)>0 && strlen(stud[j].name)>0) { if(stud[i].average<stud[j].average) { temp=stud[i]; stud[i]=stud[j]; stud[j]=temp; } } } } printf("学生信息按照平均分降序排序完毕\n"); output(); } void error() { printf("输入错误，请输入(1-7):\n"); printf("按任意键结束。。。。。\n"); fflush(stdin); getch(); system("cls"); menu(); } void menu() { int choice; system("cls"); printf("\t\t学生信息管理系统\n"); printf("*************************************************\n"); printf("\t\t输入数据\n"); printf("\t\t查找数据\n"); printf("\t\t插入数据\n"); printf("\t\t删除数据\n"); printf("\t\t输出数据\n"); printf("\t\t排序数据\n"); printf("\t\t退出\n"); printf("*************************************************\n"); printf("请输入您的选择(1-7)\n"); scanf("%d",&choice); switch(choice) { case 1:input();break; case 2:find();break; case 3:insert();break; case 4:del();break; case 5:output();break; case 6:sort();break; case 7:exit(0);break; default:error();break; } } void main() { menu(); } 这个也是我找的，好多地方不是很明白，你自己看看 谢了，不过我自己写完了，哈哈哈

。。。来人啊，来人啊。。

对了，用一个程序写出来。。。（一道题目五个要求，不是五个小题）


Question: UDP通信第一次接收数据时会有较长时间延时的问题

或许可以试试，先打开接收端，再启动发送端

抓包看看数据包有没有传到，若没到看看是不是路由的问题，到了的话看看recv代码是不是效率不好

发送前，先connect如何？ UDP编程中的connect

如果是我，让进程保持7×24小时不间断每隔比如10秒钟收发一个心跳包！

同遇到，楼主解决了么


Question: 问一下C中extern的

每加一个extern 就相当于把变量作用域扩大到了当前作用域.

结果是1，你可以写个代码试试，extern表示对其他文件中变量的引用，可以当成一个所有extern文件的全局变量。

再引用，肯定为1

extern 相当于是对外部声明了这个变量,共用了栈空间,所以,改了一个地方,另一个地方的值也就跟着改了.

extern一般是全局变量，中间只要对其修改，它的值就会变化。


Question: 新手学C语言

仅供参考，记得结贴：）  #include <stdio.h>  int func(int x, int y) {     if (x < 0)         x = -x;      if (y < 0)         y = -y;      return x + y; }  int main() {     int x,y;     scanf("%d %d", &x, &y);     printf("func(%d, %d) = %d\n", x, y, func(x, y));     return 0; }

分段函数用if 来选择对应每种情况；运行时输入用scanf一个一个输入。


Question: 编程初级（很low，但我真的不会）

#include <stdio.h>  int f(int x) {     int sum = x*x -2x - 3;     return sum; } int main() {    int accout = f(3) + f(-5) + f(5);    return 0; }


引用 1 楼 niiiloc的回复:不要过多用数学思维去解答，这样就没必要编程去做了 程序看不懂是真的难受啊。总想搞懂每个语句的含义。。。。

不要过多用数学思维去解答，这样就没必要编程去做了


Question: C语言求三角形面积

海伦公式: https://baike.baidu.com/item/%E6%B5%B7%E4%BC%A6%E5%85%AC%E5%BC%8F

引用 2 楼 DeepBlue7122的回复:這問題用海伦公式解在電腦上是最好的 请问海伦公式是什么，求大神解答

這問題用海伦公式解在電腦上是最好的

没问题都可以  挺好的


Question: ngx_save_argv()中ngx_os_argv与ngx_argv的区别且FREEBSD为什么没有申请

这个看起来是要把参数保存到全局变量 ngx_argv 中，所以会有分配空间操作。   至于为什么需要两个argv： ngx_os_argv,   ngx_argv。    可能是因为这两个参数的使用范围不一样。另外宏定义NGX_FREEBSD的作用，我没深入接触过nginx的源码所以不知道，等其他大神解答吧。


Question: 如何用c语言实现 从一个文件以每个单词为单位 读取每一行 然后把每一行存入栈中，再反向输出到另一个文件

引用 1 楼 IPJLiiiii 的回复:我想写一个 将一个文件里的每一行单词都 反着输入另一个文件（单词位置反着），就想用栈处理每一行 用数组将每个单依次存入栈 然后再 拿出来 给另一个文件 每行单独处理 但是不知道怎么做到 建议楼主考虑下strtok这个函数，应该可以满足你的要求。 大概步骤，先获取文件大小，然后calloc文件大小的内存，一次性读取出来，然后使用strtok。

sscanf，%s字符串。这将读取连续字符，直到遇到一个空格字符（空格字符可以是空白、换行和制表符）。 http://www.runoob.com/cprogramming/c-function-sscanf.html


Question: 动态分配内存问题，大佬求助帮帮看看代码哪里错了，Debug直接报错意味指针越界，可我寻思动态分配内存没啥问题啊。

#include<stdio.h> #include <malloc.h>  void InputMatrix(double *matrix,int rows,int cols) {     int i,j,ind;     for(i=0;i<rows;i++)     {         for(j=0;j<cols;j++)         {             ind=i*cols+j;             //scanf("%lf\t",matrix[ind]);             scanf("%lf", &matrix[ind]);         }         printf("\n");     } }  void Transpose(double *a,double *b,int rows,int cols) {     int _rows,_cols,Aind,Bind;     for(_rows=0;_rows<rows;_rows++)     {         //for(_cols=0;_cols>cols;_cols++)         for(_cols=0;_cols < cols;_cols++)         {             Aind=_rows*cols+_cols;             Bind=_cols*rows+_rows;             b[Bind]=a[Aind];         }     } }  void ShowTransposeMatrix(double *matrix,int rows,int cols) {     int i,j,ind;     for(i=0;i<rows;i++)     {         for(j=0;j<cols;j++)         {             ind=i*cols+j;             printf("%lf\t", matrix[ind]);         }         printf("\n");     } }  int main() {     double *a=NULL,*b=NULL;     int rows,cols;      puts("Please input the matrix rows and cols:");     scanf("%d%d",&rows,&cols);      a=(double *)malloc(rows*cols*sizeof(double));     b=(double *)malloc(rows*cols*sizeof(double));      puts("Please input the matrix:");     InputMatrix(a,rows,cols);      puts("Transposing and show:");     Transpose(a,b,rows,cols);     ShowTransposeMatrix(b,cols,rows);      free(a);     free(b);      return 0; }  供参考，代码替换的地方都是有问题的地方。

段错误原因是scanf("%lf", &matrix[ind]);  剩下的问题你自己调吧

感谢楼上三位，一开始是直接初始化的矩阵，没有自己输入，然后输入语法就直接把显示复制过去改了。就改了个printf和scanf= =，其他符号都忘记了，尴尬。


Question: 链表删除直接传指针

引用 1 楼 自信男孩 的回复:因为你删除的不是头指针，这是其一。其二是head是指向堆上的内存，那么传入head之后，del函数内接收的head也是指向堆上空间的地址，另外又因为第一个原因，所以不会出现问题。 如果你删除的是头结点，建议试一下，可能就会出问题的谢谢


Question: 新手求助

结尾加上system（“pause”）；

不知道啊，，我就选了一个图片就这样变成这样了

最近這麽多發照片上來的？而且還沒翻轉好？ 這樣看著很累，換個方式吧。

老弟，你这排版看着真心费劲。


Question: 大家帮我改改要能输入的时候判断职工号唯一

在输入的时候循环一下已存在的职工链表，找到一样的就printf出来然后节点不要插入就好了呀


Question: 哪位大神帮我一下下

建议查一下这些函数的用法：  #include <ctype.h>         int isalnum(int c);        int isalpha(int c);        int iscntrl(int c);        int isdigit(int c);        int isgraph(int c);        int islower(int c);        int isprint(int c);        int ispunct(int c);        int isspace(int c);        int isupper(int c);        int isxdigit(int c);         int isascii(int c);        int isblank(int c);

用判断ASCII码的方法来实现

#include<stdio.h>  int main() { 	char c; 	scanf("%c", &c);  	if (c >= 'A' && c <= 'Z') { 		c = c + ('a' - 'A'); 		printf("%c\n", c); 	} 	else if (c >= 'a' && c <= 'z') { 		c = c - ('a' - 'A'); 		printf("%c\n", c); 	} 	else if (c == ' ') { 		printf("space"); 	} 	else { 		printf("other"); 	}  	return 0; }


Question: 这个怎么解决  不改变式子

不是写的很清楚了么？int转换float类型会丢失数据，你把x类型改成float不行么


Question: 为什么堆一定是完全二叉树？

方便找双亲以及向下调整

引用 1 楼 user-2 的回复:堆就是那么任性的。贴一下堆的定义给你补补。。。  堆的定义如下：n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时，称之为堆。 (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2) 也就是说堆本应是数组形式是吧？


Question: 二级c语言求教

图片不清晰，建议直接贴文字或者代码


Question: 千万级数据，如何以最快的速度查找

引用 6 楼 Bandry 的回复:感谢大家的回复，目前采用了uthash存储，但是总感觉还有更高效的方法能实现，匹配是完全匹配，不用部分匹配 可以分块。 比如按第一个字节的值，分块，可以把千万条级别的数据每块下降1-3个数量级。 根据第一个字节选择块，然后再在块里面查找。这样就会快很多。

建立哈希表呀

分组建立索引呗，全都导入内存吗？看看内存够不够吧

我上面说的太粗了。 其实还需要知道 字符串的匹配方式是什么样的？ 比如字符串需要的是完全匹配还是部分匹配？ 如果不需要部分匹配，就不用建立索引

这个要建索引。参考搜索引擎的索引方式。

关键看你用何种数据结构存储 建议使用hashtable，或者BTREE


Question: HDOJ 1001

scanf在出错的情况下才会返回-1，这个可能性很小。在文件末尾时会返回EOF，在类型和输入的数据不匹配时会返回0（因为输入个数是1）。

引用 4 楼 qq_44793599 的回复:我只是个菜鸟哈哈，你看了题意就不会有这些疑问了，不能光看代码哦  能加深对scanf返回值的了解的话，也不错啊。我也是初学者，互相学习哈！

引用 3 楼 儿童节的回复:说个另外的问题。 不是很了解下面这个scanf与while的搭配  while (scanf("%d", &n) != -1) {}  是从哪里流行起来的？ 是否因为有人用过下面这句？ 而 EOF 是 -1 的宏，所以干脆直接用 -1 ？  while (scanf("%d", &n) != EOF) {}  这个表达式其实有一个小问题。如果scanf 的返回值为0 的话， 这个 while 是会进入死循环的。具体见下方说明。  因为scanf 的返回值是它成功获得对象的个数，当在接收到第一个对象之前遇到了类型匹配错误的话，返回值是0，而如果在接收到第一个对象之前遇到了输入错误的话则返回值是EOF。所以，总结起来，scanf 的返回值有3种大的情况：（1）成功接收到的对象的个数，不一定正好就等于格式符的个数，这取决于实际输入，（2）0，（3）EOF。  下面两张截图是从《C Reference》里截取的，读取文档的软件名称是Zeal，开源软件，github上有。    所以，上面这段循环代码，因为scanf 里的格式符是 %d ，如果有一个整型数据被它接收到的话，那么 返回值就肯定是 1 了， 但是如果这时候输入一个字母的话，那么返回值就是 0 了，因为没有接收到 匹配 %d 的数据。而 本来 期待 接收到一个整数的变量 n 因为没有被初始化，或者 现在很多编译器会默认 将它初始化为 0 了， 那么 n 的值 就是 不确定的 或者是 0 ， for 循环的执行次数也就可能是不确定的 。这还不是关键。 关键是， scanf 没有得到类型相匹配的数据，输入缓冲区的那个 字母 就还在输入缓冲区里 等着被读取， 到了下一次的 while 循环的时候， scanf 又 读到了 第一次输入的那个 字母， 返回值又是 0 ， 又 进入循环。 所以，这样就会出现一个 死循环 ！  当然了，你也许会问，那么不输入字母不就好了吗？  是的，不输入字母就不会出现死循环，只是说万一不小心按错了，或者不小心数字后面接了一个字母或者别的字符。  或者说，就算这种概率相当相当小吧，那么换个角度看，如果把循环条件改成下面这样，如何？  while (scanf("%d", &n) == 1) {}  意思是，只有scanf 接收到一个类型匹配的数据的时候才进入循环体内，而要结束while循环的时候，随便输入一个字母再回车即可。 甚至可以在最后一次循环的时候直接输入「一个数字+字母或别的符号」的组合，然后数字的计算结果也照常出来了，循环也顺势结束了。这样，会不会稍微轻松或者灵活一点点呢？  另外，也不妨碍直接手动输入EOF来结束循环，Linux下实测按下Ctrl+D后，循环结束。  好吧，大半夜的睡不着，对这个while循环条件闲扯了一堆，就这样吧。 欢迎给分！  （PS. 我个人推荐下面的这种写法。睡觉克了～）  你也太可爱了吧我的妈

我只是个菜鸟哈哈，你看了题意就不会有这些疑问了，不能光看代码哦

对这个题没关系啦，只是我习惯i=0

i循环多了一次


Question: 查找算法

感谢各位嗷，这个是我们的教材，算法与数据结构，上面是c语言写的定位算法。

没错，最后一位不等于，i++了

楼主的教科书不是很靠谱。BUG是存在的，last=1时，就不比较直接返回1了。  数组下标是从0开始，last是最后一个元素的下标  则应改为：int i=0；while（i<=L->last&&L->data[i]!=x)  以上代码来自《数据结构》（第二版） 陈越 主编 p57 。

哇，好老的函数定义格式了，差点儿就看不懂了！  感觉代码有问题，就是循环条件那里。   既然循环条件是 (i < L->last &&  L->data[i] != x) ， 那么如果没有目标元素的话，假如 i 和 L->last 都是int型的话，那么最终 i 的值应该是 L->last 。而底下的 if 里，没有「等于」这个判断，那等于说会 返回 i 值， 实际上就是返回的 L->last 的值喽。但是，没有 目标元素的情况是应该返回 0 的呀！ 要么，难道 L->last 不是int 型 而是 浮点型 ？比如， L->last 是 2.5 ， 最后一次执行循环时 i 是 2 ， 下一次 i 变成 3 了 所以结束循环。然后去下面 做 if 比较。。。奇怪哦！  你在书上不是也写了 i 等于 last 这样的笔记吗？ 应该也是有这个疑问吧？   嗯，感觉这本书不是太靠谱！

这是什么书啊、这缩进就不想看了  while里面条件是<last，下面的if是>last,不太对吧。 感觉while里改成<=last就对了：找到时、i属于[1,last], 找不到时i=last+1  你可以写代码测以下。书和老师都不一定对、当然自己也不一定对。

没上下文看不出来 一般i=0开始的话，这段代码没啥问题


Question: 数组

引用 3 楼 汉森伯逸的回复:楼主是不是想利用动态内存自由定义数组，我这有个很简单的方法要的话中午给你写 对呀，怎么弄呀

for(int i=0;i<count;i++) { if(A[i]==m) { num=i; } break; } 这个break应该放到if语句块里。而不是放在外面

楼主是不是想利用动态内存自由定义数组，我这有个很简单的方法要的话中午给你写

MSDN中关于scanf()的返回值有如下描述 Returns the number of fields successfully converted and assigned. A return value of 0 indicates that no fields were assigned. scanf()函数的返回值是读入数据的个数。在你的代码中， while (scanf("%d", &a)== 1) 每次读入的数据个数都是1，scanf()函数的返回值一直是1，条件语句始终成立，所以while()会一直循环下去，没有向下执行。

int getBuff; while ((getBuff = getchar() != '\n') && (getBuff != EOF));  使用scanf之后，往往输入缓冲区有残留数据，可以是回车符，也可以是其它没有被之前的scanf吸收的任何的输入数据。 后面如果有scanf的话，这个scanf首先是去查看输入缓冲区有没有数据，如果有的话，它就直接取来用了，就不会等待外来的输入了。  你最上面的代码的问题原因，一方面是没有清空输入缓冲区，另一方面，最重要的，逻辑上的问题，还是那个 break; 语句的位置不对。

引用 6 楼 儿童节的回复:2楼、4楼说得对，关键是 break; 放错位置了，应该放在 if 的代码块内部。   #include <stdio.h> #include <malloc.h>  int main() { 	int *A; 	// 编译的时候，提示warning，变量x没有用到。。。 	//	int a, h, m, x, y, z, num, count, i = 0; 	int a, h, m, y, z, num, count, i = 0; 	printf("输入数组元素:\n"); 	/* 昨天在你的另一个帖子里说过，malloc应适当地多申请一点内存空间，否则放不下多少数据。         *   另外，仅仅针对int型数组而言，用malloc来申请内存空间真的是没有节约空间，反而浪费了。         *   具体见我之前的一篇总结文章：https://blog.csdn.net/weixin_44732817/article/details/88566962         *   还不如直接定义A为一个int数组，长度定个20、50之类的，在不济就定个1000。         *   真要动态申请内存空间的话，至少要考虑用多个指针把多个内存空间相互联系起来才行。         *   不过，仅仅对于一个int数据，就去malloc一下，真的是严重浪费。         */  	// 修改：申请了20 个 int 型数据的内存空间 	A = (int *)malloc(20 * sizeof(int)); 	while (scanf("%d", &a) == 1) { 		A[i] = a; 		i++; 		count = i; 	} 	printf("数组的长度:%d\n", count); 	printf("数组的元素为:"); 	for (i = 0; i < count; i++) { 		printf("% d", A[i]); 	} 	printf("\n"); //  为了让输出结果看起来顺眼，加一个换行符  	// 下面两句，吸收前面使用scanf之后的输入缓冲区残留数据 	int getBuff; 	while ((getBuff = getchar() != '\n') && (getBuff != EOF)) 		;  	printf("请输入查找的数:\n"); 	scanf("%d", &m);  	num = -1; //  增加一句，初始化num变量，且初值不在A[]的下标范围内，以防后面使用未初始化过的值  	for (int i = 0; i < count; i++) { 		if (A[i] == m) { 			num = i; 			break; // 修改后 		} 		// 这个 break; 应该放进 if 的代码块内部，否则，for 循环的第一次循环执行到这里就结束循环了 		//		break; 	}  	//  在数组A[]中有匹配的数的情况下，num的值为相应的下标值，没有匹配的话，仍为-1 	if (num < count && num != -1) { 		for (y = num; y < count - 1; y++) { 			A[y] = A[y + 1]; 			//  为什么要count--;呢？ 不是已经y++了吗？这句多余了！ 			//			count--; 		}  		printf("删除后的数组为：\n"); 		for (int i = 0; i < count - 1; i++) { 			// 文字"插入后的数组为："就不用放到循环里来了。 			// A[y]又是什么鬼？？？ 			//			printf("删除后的数组为:%d\n", A[y]); 			printf("%d ", A[i]); 		} 		printf("\n"); // 最后加个换行符，美观一点点。。。 	} else { 		// 下面这块的意思，没弄明白。为什么要把m插入到A[]数组的中间去呢？ 		//  删除了原来的int，count / 2 运算是取商，本来就是 int 型啊！ 		z = count / 2; 		// 循环条件有问题：h 的初始值是count，那么它怎么会小于 z 呢？？？循环执行不了啊！ 		//		for (h = count; h < z; h--) { 		for (h = count; h > z; h--) { 			//  理论上来说，下标h已经越界了。当然了，前面定义了足够大的数组长度就没关系吧。 			A[h] = A[h - 1]; 		} 		A[z] = m;  		printf("插入后的数组为：\n"); 		for (int i = 0; i < count + 1; i++) { 			// 文字"插入后的数组为："就不用放到循环里来了 			//			printf("插入后的数组为:%d", A[i]); 			printf("%d ", A[i]); 		} 		printf("\n"); // 最后加个换行符，美观一点点。。。 	} 	free(A); 	A = NULL; 	return 0; }   Linux环境gcc编译测试截图：   另，常见的动态申请一维数组的空间的方法，也是需要你先给出一个数组长度值，然后才去malloc申请，而不是输入一个数，就去malloc一次。建议不要太纠结在一维数组的动态申请上，动态链表等等之类的情况才比较适用一个节点malloc一次的方式。 再次感谢你的解答，谢谢。 我还有问题想问一下你 int getBuff; while ((getBuff = getchar() != '\n') && (getBuff != EOF)); 这一句是吸收我从键盘上输入的回车吗？我觉得没有执行之后的语句就是因为执行程序的时候敲了回车键。


Question: 求大神帮帮孩子吧！

MFC吧，代码网上应该有

接水果?用unity或者opengl + cocos ,C语言写不了

百度吧，这里只提供问题解答，不帮人做课程设计的

你确定是用c语言写，不是MFC


Question: 大佬们这个什么意思

引用 1 楼 潇潇-易水 的回复:全是错误  #include <stdio.h> int main() {     int a=6;     for(int i=0;i<3;i++)     {        printf(" %d",a);    // 你为什么要这么干？ 打印3次 6？     }     printf("\n");     return 0; }    就是 666 应该是聊天表情包吧

可以发一下问题的题目吗

抄代码都抄不好，那么多错误

是找错误吗？应该编译不过吧，如果忽略细节应该是输出666

引用 3 楼 lin5161678 的回复:[quote=引用 1 楼 潇潇-易水 的回复:] 全是错误  #include <stdio.h> int main() {     int a=6;     for(int i=0;i<3;i++)     {        printf(" %d",a);    // 你为什么要这么干？ 打印3次 6？     }     printf("\n");     return 0; }    就是 666 应该是聊天表情包吧 [/quote] 秀儿 ， 是你吗？


Question: 二叉树的建立bug导致程序中断

你这个程序bug太多了 Preorder_create(&(*node)->left, arr);  Preorder_create(&(*node)->right, arr); arr一直指向一开始传进来的地址，所以前头的判断就一直不会为真，因此不会退出。 其次，你的意思先建左树，再建右数，但是第一个Preorder就会把arr所有的数全部建立为节点，后面Preorder_create就是无效语句。

递归出口应该是*(arr)=0吧，而不是#。  static  _index  会一直增长，然后*(arr+ _index) 越界了。。。


Question: 求助！

是的，要先写一个循环遍历数组，将数组中的数全部加起来再除以人数就可以得到平均分了。fun是你自己写一个函数，然后后面直接调用的，c语言中并没有fun语句


Question: 关于while()

先说while循环语句 while循环的条件语句中包含了后置版本的递增运算符，在《C++Primer第5版中文版》中提到，后置版本的递增运算符会将运算对象加1，但是求值结果是运算对象改变之前的那个值的副本。对于 while(i++<2) 首先将i加1，i变为1，接下来是用i改变前的那个值的副本，即0与2进行比较，while条件语句成立，此时输出的值是i的当前值1；之后，在while条件语句中，将i加1，i变为2，接下来是用i改变前的那个值的副本，即1与2进行比较，while条件语句成立，此时输出的值是i的当前值2；最后，while循环语句不成立，循环退出。 再说for循环 在《C++Primer第5版中文版》中提到  其执行的顺序为1首先执行一次init-statement 2接下来判断condition 3如果condition为真，则执行循环体 4最后执行expression 对于 for（;i<2;i++） init-statement是空语句，之后判断condition是否为真，此时i的值是0，条件为真，所以输出0，最后执行expression，i的值加1，此时i的值是1；之后再判断condition是否为真，此时i的值是1，条件为真，所以输出1，最后执行expression，i的值加2，此时i的值是2；最后condition条件为假，退出for循环，所以for输出的是0和1。 这两种情况的主要区别在于后置版本的递增运算符的用法上。

while：i++表示先用后加，while（0<2）执行完毕，自加一，即i+1=1输出，同理下次执行while（1<2），再自加一，i+1=2。 for：先i=0，判断i是否<2，成立，执行输出语句输出i=0，再执行i++，i然后就等于1，再此循环，i<2，输出i=1，i++，此时i=2<2，不成立，结束。

while先执行i＜2然后++接着循环体 for先执行i＜2然后循环体最后才i++或者++i

while里面是比了大小后再加1，所以是1 2。for里面最后一个分号后面的语句是在每次循环结束后再运行的，所以是0 1

程序是这样运行的  while    先判断i小于2   在++     输出的就是1      而for   循环是  先判断i小于2      输出0，在++        简单的说   while  在判断完以后就++了   而for循环   是判断   执行完一次后  再++   判断            前者是判断伴随++   后者是   判断后  循环走一次后  再++


Question: 访问冲突问题

引用 4 楼 qq_44836834 的回复:[quote=引用 3 楼 儿童节的回复:]不知道你说的给  head->next  赋一个地址 是赋 的什么 地址， 又是如何冲突的。 代码发上来看看如何？ 已经解决了，谢谢[/quote]  恭喜，解决了就好！  顺便能麻烦结个贴给分吗？ 谢谢！

引用 3 楼 儿童节的回复:不知道你说的给  head->next  赋一个地址 是赋 的什么 地址， 又是如何冲突的。 代码发上来看看如何？ 已经解决了，谢谢

按照你的建议进行更改后，问题解决，但是给head->next赋一个地址同样会冲突，是不是next不够长，该怎么改

pointer1 和 pointer2 都是指针类型， sizeof得到的返回值是 8 个字节， 远远小于 结构体变量所占的 字节数。  malloc的参数 用 sizeof(struct node1) 和 sizeof(struct node2) 吧。


Question: malloc的使用

申请空间也不要放在循环内吧

楼主想自由分配动态内存，不用既定内存

就没人想到realloc吗………

引用 13 楼 weixin_42045178 的回复:哦哦哦，我明白了，谢谢指导。  前面的那个文字密密麻麻的回复，建议仔细看看吧，虽然都是很基础的东西，但是还是觉得很有用处的。 另外，麻烦结个帖给分吧，谢谢！

引用 11 楼 儿童节的回复:[quote=引用 8 楼 weixin_42045178 的回复:] 也不行，如果是1的话就会无限循环 输入一个不是数字的字符，比如字母a进去就结束了。[/quote] 嗯嗯，知道了，谢谢。

哦哦哦，我明白了，谢谢指导。

引用 8 楼 weixin_42045178 的回复:也不行，如果是1的话就会无限循环  malloc的参数也写大一点，sizeof(int)只有4个字节，名以上只分配了4个字节任意使用空间，只够输入 1 个 int 型的值 。

引用 8 楼 weixin_42045178 的回复:也不行，如果是1的话就会无限循环 输入一个不是数字的字符，比如字母a进去就结束了。

#include <stdio.h> #include <malloc.h> int main() { 	int *A; 	int a, count, i = 0; 	printf("输入数组元素:\n"); 	A = (int *)malloc(10 * sizeof(int)); 	while (scanf("%d", &a) == 1) { 		A[i] = a; 		i++; 		count = i; 	} 	printf("数组的长度:%d\n", count); 	printf("输出数组:\n"); 	for (int j = 0; j < count; j++) { 		printf("%d", A[j]); 	} 	free(A); 	A = NULL; 	return 0; }   Linux环境gcc编译、运行截图， （输入一个数，回车一次，让while循环执行一次）：  （一次性输入完全部的数，以空格分隔，回车结束输入：）

也不行，如果是1的话就会无限循环

引用 6 楼 weixin_42045178 的回复:#include<stdio.h> #include<malloc.h> int main() { 	int *A; 	int a,count,i=0; 	printf("输入数组元素:\n"); 	A=(int*)malloc(sizeof(int)); 	while(scanf("%d",&a)==0) 	{ 		A[i]=a; 		i++; 		count=i; 	} 	printf("数组的长度:%d\n",count); 	printf("输出数组:\n"); 	for(int j=0;j<count;j++) 	{ 		printf("%d",A[j]); 	} 	free(A); 	return 0; }   然后我改成这样，还是输出不了数组，而且数组的长度一直是0.   额， 我上面的回复里， 给的循环条件是  while(scanf("%d",&a) == 1)啊。  。。。。。比较的数字是  1   不是 0  啊 。。。。

程序运行的图片完全看不清楚，不过代码确实有几个不是太合适的地方。  （1）因为while(getcha()!='\n')这样的循环条件，每次循环的第一个输入的值都会被getchar给吃掉，所以输入数据的时候，会不方便。比如输入「110<空格>」，那么第一个1被getchar吃掉了，变量a只接收到10这个数。就算本来就是打算输入10的，那看起来也很别扭啊！建议直接把scanf作为循环条件，比如while(scanf("%d",&a) == 1)这样。 （2）while循环里面，放了语句「A =(int *)malloc(10 * sizeof(int)); 」，那么每一次的循环都会重新malloc一次，等于说每一次的循环，都让A指向了一个新的内存块首地址（默认malloc每次都成功的情况下），那么每一次都只给A指向的内存块中的一个int型所占的内存空间赋予了值，而这个内存块中的其它允许赋值的内存空间并没有被初始化过，那么它们的值用%d输出的话就很可能是乱码，至少也是不确定的值。 （3）接第（2）点，所以应该把为A申请内存块的语句放到while的前面去。而且，既然名义上申请的内存块的大小是「10*sizeof(int)」，那么按道理为while循环也最多只执行10次才合理啊。（这里也不展开讨论malloc实际申请了多少字节了。） （4）那么，上面的while循环结束之后，A指向的是最后一次循环时用malloc申请到的内存块的首地址，其中只有一个元素A[count-1]是被正确赋值了的。而之前几次循环里malloc到的内存块，早就不知道去哪里了，至少从你的代码里是找不回来了。（这里也不讨论是否循环次数已经超过了10次的情况了。。。） （5）while循环里，为数组的程度计数的变量count的赋值也不对，比如第一次循环，那么上一句的「i++;」之后，i 的值变成了1 ， 这就是此时数组的长度了，那么 count = i + 1 ; 的话，count 的值就变成了 2 ， 那就不对了。所以 ，不嫌罗嗦的话，count = i ; 就可以。 （6）先假设 变量 count 是正确地计数了的， 那么 for 循环输出A[]的元素的值的时候，循环控制变量i从下标0开始按步进值 1 逐次增加，合法的循环终止条件应该是「i < count;」。因为如果数组下标到了count 的话，也就是说，要输出 A[count] 元素的话，那么正如前面（2～4）点所说，这个 A[count] 元素是没有被正确赋值过的，是不确定的值，也就可能输出一个乱码了。 （7）使用完malloc之后，记得free一下。  嗯，大概就这么多吧。。。

引用 2 楼 niiiloc的回复:while循环一直在修改A的内存地址，导致出现乱码 解决方法就是把malloc放到while循环前面，记得结贴 放在前面也不行，我是想每循环一次就分配一个空间，这样就有足够的空间来存放了。

引用 1 楼 qq_1096235292的回复:直接在声明数组的时候分配好内存不就行了，放到while循环里面分配是什么操作 因为我想输入一个不先确定长度的数组。

直接在声明数组的时候分配好内存不就行了，放到while循环里面分配是什么操作


Question: C程序求输入两个数的最大公约数和最小公倍数

交换后 有 m>n r=m%n m=n n=r 最后r==0时 最大公约数为m

while中r都未初始化，另外辗除法是用num1除以num2，num1＞num2求出余数resd，如果resd==0，则num2是最大公约数，否则(resd!=0)，num1=num2，num2=resd，重复以上过程直到resd==0为止。


Question: 谁能帮我调试一下代码啊?逻辑错误,有些功能不能实现啊,主函数是对的,由于字数限制不能完全显示出来

代码写得很好啦？请问老总是金蝶还是用友？当初财金软件，好像就这两家的最好。

引用 13 楼 jiamianshiye_16_com的回复: hello world   回复栏里有插入代码的选项，仔细看看。你就贴在这里就行。大家看到了感兴趣的都会帮你看的。 分数不够了，发不了，只能这样

引用 11 楼 jiamianshiye_16_com的回复:老弟，能不能好好的把代码贴出来。用代码格式贴好，这样看着很是费劲。 我用的VC+，只能这样，你要帮我改吗？要的话加qq

老弟，能不能好好的把代码贴出来。用代码格式贴好，这样看着很是费劲。

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 血影*裂冰 的回复:] [quote=引用 1 楼 niiiloc的回复:]一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了[/quote]  没感觉多庸俗。代码调试需要功夫和时间的，收点辛苦费没啥[/quote] 你能改吗？改好有偿。

引用 8 楼 血影*裂冰的回复:[quote=引用 7 楼 自信男孩的回复:][quote=引用 4 楼 血影*裂冰 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 血影*裂冰 的回复:] [quote=引用 1 楼 niiiloc的回复:]一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了[/quote]  没感觉多庸俗。代码调试需要功夫和时间的，收点辛苦费没啥[/quote] 给你半天时间能调好吗[/quote]  给我半天时间，不如自己用半天时间去调试。我想不需要用半天时间，一个小时左右差不多吧。 [/quote] 不，因为找了很多人都没调试出来[/quote] 我也改不来，菜鸟一个，明天还的交

引用 7 楼 自信男孩的回复:[quote=引用 4 楼 血影*裂冰 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 血影*裂冰 的回复:] [quote=引用 1 楼 niiiloc的回复:]一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了[/quote]  没感觉多庸俗。代码调试需要功夫和时间的，收点辛苦费没啥[/quote] 给你半天时间能调好吗[/quote]  给我半天时间，不如自己用半天时间去调试。我想不需要用半天时间，一个小时左右差不多吧。 [/quote] 不，因为找了很多人都没调试出来

引用 4 楼 血影*裂冰 的回复:[quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 血影*裂冰 的回复:] [quote=引用 1 楼 niiiloc的回复:]一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了[/quote]  没感觉多庸俗。代码调试需要功夫和时间的，收点辛苦费没啥[/quote] 给你半天时间能调好吗[/quote]  给我半天时间，不如自己用半天时间去调试。我想不需要用半天时间，一个小时左右差不多吧。

引用 1 楼 niiiloc的回复:一看就是抄的代码，你给多少钱呢 给你半天时间能不能调好

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 血影*裂冰 的回复:] [quote=引用 1 楼 niiiloc的回复:]一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了[/quote]  没感觉多庸俗。代码调试需要功夫和时间的，收点辛苦费没啥[/quote] 给你半天时间能调好吗

改了一下，主要是printf()的错误，VS2015编译能通过，main()函数，所以没有运行调试 #include<stdio.h> #include<stdlib.h> #include<string.h> struct stuff { 	char num[6];//工号 	char name[20];//姓名 	char sex[4];//性别 	int year;//年龄 	char job[8];//职务 	int month;//月份 	float reward;//额外加薪 	float reduce;//扣除 	float base;//基本工资 	float pay;//薪水 }; stuff stu[100];//员工信息  void start(); void input(); void save_file(int); int load_file(); void display(); void find_num(); void find_name(); void del(); void add(); void modify(); void sort(); void tong();  void start()//开始函数 { 	system("cls"); 	system("color 80"); 	printf("\n\n"); 	printf("           |----------------------------------------------------------|\n\n"); 	printf("           |*****************欢迎使用员工工资管理系统*****************|\n\n"); 	printf("           |----------------------------------------------------------|\n\n"); 	printf("                             1.信息录入\n"); 	printf("                             2.信息显示\n"); 	printf("                             3.工资信息查询\n"); 	printf("                             4.工资信息修改\n"); 	printf("                             5.工资信息删除\n"); 	printf("                             6.信息添加\n"); 	printf("                             7.工资排序\n"); 	printf("                             8.工资统计\n"); 	printf("                             9.退出\n"); 	printf("********************************************************************************\n");   } void input()//输入函数 { 	int i = 0, m; 	printf("请输入要录入员工的人数:\n"); 	scanf("%d", &m); 	for (i = 0; i<m; i++) 	{ 		printf("请输入月份:\n"); 		scanf("%d", &stu[i].month); 		printf("工号:\n"); 		scanf("%s", stu[i].num); 		printf("姓名:\n"); 		scanf("%s", stu[i].name); 		printf("性别:\n"); 		scanf("%s", stu[i].sex); 		printf("年龄:\n"); 		scanf("%d", &stu[i].year); 		printf("职务:\n"); 		scanf("%s", stu[i].job); 		printf("基本工资:\n"); 		scanf("%f", &stu[i].base); 		printf("额外加薪:\n"); 		scanf("%f", &stu[i].reward); 		printf("扣除:\n"); 		scanf("%f", &stu[i].reduce); 		stu[i].pay = stu[i].base + stu[i].reward + stu[i].reduce; 	} 	printf("员工信息已录入!\n"); 	save_file(m); }  void save_file(int m)//保存文件 { 	FILE *fp; 	int i; 	fp = fopen("stuff.txt", "wb"); 	if (fp == NULL) 	{ 		printf("打开文件失败!\n"); 	} 	for (i = 0; i<m; i++) 		fprintf(fp, "%d      %s    %s     %s    %d     %s	%f         %f         %f        %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 	fclose(fp); }   int load_file()//读写函数 { 	FILE *fp; 	int i = 0; 	fp = fopen("stuff.txt", "rt"); 	if (fp == NULL) 	{ 		printf("\n\n*****库文件不存在，请创建!******\n\n"); 		exit(0); 	} 	while (feof(fp) != 1)//检测流文件是否结束 	{ 		fread(&stu[i], sizeof(struct stuff), 1, fp);//从磁盘文件读出 		if (stu[i].num != 0) 			i++; 	} 	fclose(fp); 	return(i - 1);  }  void display()//显示函数 { 	int i, m = load_file(); 	system("cls"); 	printf("月份   工号   姓名  性别  职务  基本工资   额外加薪    扣除       薪水\n"); 	for (i = 0; i<m; i++) 	{ 		stu[i].pay = stu[i].base + stu[i].reward + stu[i].reduce; 		printf("%d      %s    %s     %s   %d	 %s     %f         %f         %f        %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 	} }   void del()//删除函数 { 	int m = load_file(); 	int i, j, n, t, flag;//flag作为删除是否成功的标志 	char name[20]; 	printf("原来的员工信息\n"); 	display();//调用显示函数显示原本信息 	printf("\n\n"); 	printf("按姓名删除:\n"); 	scanf("%s", name); 	for (flag = 1, i = 0; flag&&i<m; i++) 	{ 		if (strcmp(stu[i].name, name) == 0)//找姓名 		{ 			printf("此人原先的信息为:\n"); 			printf("月份   工号   姓名  性别  职务  基本工资   额外加薪    扣除       薪水\n"); 			printf("%d      %s    %s     %s   %d	 %s      %f          %f        %f         %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 			printf("确认删除请按1，取消请按0\n"); 			scanf("%d", &n); 			if (n == 1) 			{ 				for (j = i; j<m - 1; j++) 				{ 					//将删除后之后的员工信息往前填补 					stu[j] = stu[j + 1]; 				} 				flag = 0; 			} 		} 	} 	if (flag == 0)//删除成功 		m = m - 1; 	else 		printf("查无此人!"); 	printf("删除后的所有员工信息:\n"); 	save_file(m);//调用保存函数保存删除后的信息 	display();//调用显示函数显示删除后所有员工的信息 	printf("继续删除请按1，停止删除请按0\n"); 	scanf("%d", &t); 	switch (t) 	{ 	case 1:del(); break;//循环调用自己的函数，实现多次删除 	case 0:break; 	default:break; 	} }  void add()//添加函数 { 	FILE *fp; 	fp = fopen("stuff.txt", "a");//追加 	int n, i, count = 0, m = load_file(); 	printf("原来的员工信息:\n"); 	display(); 	printf("\n\n"); 	printf("请输入想增加的员工数:\n"); 	scanf("%d", &n); 	for (i = m; i<m + n; i++) 	{ 		printf("请输入增加员工的信息:\n"); 		printf("请输入月份:\n"); 		scanf("%d", &stu[i].month); 		printf("工号:\n"); 		scanf("%s", stu[i].num); 		printf("姓名:\n"); 		scanf("%s", stu[i].name); 		printf("性别:\n"); 		scanf("%s", stu[i].sex); 		printf("年龄:\n"); 		scanf("%d", &stu[i].year); 		printf("职务:\n"); 		scanf("%s", stu[i].job); 		printf("基本工资:\n"); 		scanf("%f", &stu[i].base); 		printf("额外加薪:\n"); 		scanf("%f", &stu[i].reward); 		printf("扣除:\n"); 		scanf("%f", &stu[i].reduce); 		stu[i].pay = stu[i].base + stu[i].reward + stu[i].reduce; 		printf("\n"); 		count += 1; 		printf("\n"); 		printf("已增加的人数:\n"); 		printf("%d", count); 	} 	printf("添加成功!\n"); 	m = m + count; 	printf("增加后所有员工的信息:\n\n"); 	save_file(m); 	display(); 	fclose(fp); }  void find()//查找函数 { 	int t, flag; 	system("cls"); 	printf("1.按工号查询\n"); 	printf("2.按姓名查询\n"); 	printf("3.返回主菜单\n"); 	scanf("%d", &t); 	if (t >= 1 && t <= 3) 	{ 		flag = 1; 	} 	else 	{ 		flag = 0; 		printf("输入有误!\n"); 	} 	while (flag == 1) 	{ 		switch (t) 		{ 		case 1: 			printf("按工号查询:\n"); 			find_num(); 			break; 		case 2: 			printf("按姓名查询:\n"); 			find_name(); 			break; 		case 3:start(); break; 		default:break; 		} 	} }  void find_num()//按工号查询函数 { 	int m = load_file(), t, i; 	char a[100] = { 0 }; 	printf("请输入要查找员工的工号:\n"); 	scanf("%s", a); 	for (i = 0; i<m; i++) 	{ 		if (strcmp(a, stu[i].num) == 0) 		{ 			printf("月份   工号   姓名  性别  职务  基本工资   额外加薪    扣除       薪水\n"); 			printf("%d      %s    %s     %s   %d	 %s      %f          %f        %f         %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 			break; 		} 		else 			printf("查无此人\n\n"); 	} 	printf("返回查询函数请按1，继续查询请按2\n\n"); 	scanf("%d", &t); 	switch (t) 	{ 	case 1:find(); break; 	case 2: break; 	default:break; 	} }  void find_name()//按姓名查询 { 	char name[30]; 	int i, t, m = load_file(); 	printf("请输入要查询员工的姓名:\n"); 	scanf("%s", name); 	for (i = 0; i<m; i++) 	{ 		if (strcmp(stu[i].name, name) == 0) 		{ 			printf("月份   工号   姓名  性别  职务  基本工资   额外加薪    扣除       薪水\n"); 			printf("%d      %s    %s     %s   %d  %s      %f          %f        %f         %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 		} 		if (i == m) 			printf("查无此人\n"); 	} 	printf("返回查询函数请按1，继续查询请按2\n\n"); 	scanf("%d", &t); 	switch (t) 	{ 	case 1: find(); break; 	case 2: break; 	default:break;  	} }  void modify()//修改函数 { 	char num[7]; 	char name[20]; 	char sex[4]; 	int year = 1; 	char job[10]; 	int month; 	float base; 	float reward; 	float reduce; 	//float pay; 	int b, c, i=0, n, t, flag, m = load_file(); 	system("cls"); 	printf("原来的员工信息:\n"); 	printf("月份   工号   姓名  性别  职务  基本工资   额外加薪    扣除       薪水\n"); 	printf("%d      %s    %s     %s  %d  %s      %f          %f        %f         %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 	printf("\n"); 	printf("请输入要修改的员工姓名:\n"); 	scanf("%s", name); 	for (flag = 1, i = 0; flag&&i<m; i++) 	{ 		if (strcmp(stu[i].name, name) == 0) 		{ 			printf("该员工原本记录为:\n"); 			printf("月份   工号   姓名  性别  职务  基本工资   额外加薪    扣除       薪水\n"); 			printf("%d      %s    %s     %s  %d  %s      %f          %f        %f         %f\n", stu[i].month, stu[i].num, stu[i].name, stu[i].sex, stu[i].year, stu[i].job, stu[i].base, stu[i].reward, stu[i].reduce, stu[i].pay); 			printf("确定修改请按1,取消请按2\n"); 			scanf("%d", &n); 			if (n == 1) 			{ 				printf("需要修改的选项:"); 				printf("1.工号    2.姓名      3.性别       4.年龄      5.职务        6.月份     7.基本工资   8.额外加薪    9.扣除    10.返回上一级\n"); 				printf("请输入要修改的序号:\n"); 				scanf("%d", &c); 				if (c<1 || c>10) 				{ 					printf("该选项不存在,请重新选择!\n"); 					flag = 0; 				} 			} 		} 	} 	if (flag == 1) 		printf("查无此人!\n"); 	do 	{ 		switch (c) 		{ 		case 1: 			printf("工号改为:\n"); 			scanf("%s", &num); 			strcpy(stu[i - 1].num, num); 			break; 		case 2: 			printf("姓名改为:\n"); 			scanf("%s", &name); 			strcpy(stu[i - 1].name, name); 			break; 		case 3: 			printf("性别改为:\n"); 			scanf("%s", sex); 			strcpy(stu[i - 1].sex, sex); 			break; 		case 4: 			printf("年龄改为:\n"); 			scanf("%d", &year); 			stu[i - 1].year = year; 			break; 		case 5: 			printf("职务改为:\n"); 			scanf("%s", &job); 			strcpy(stu[i - 1].job, job); 			break; 		case 6: 			printf("月份改为:\n"); 			scanf("%d", &month); 			stu[i - 1].month = month; 			break; 		case 7: 			printf("基本工资改为:\n"); 			scanf("%f", &base); 			stu[i - 1].base = base; 			break; 		case 8: 			printf("额外加薪改为:\n"); 			scanf("%f", &reward); 			stu[i - 1].reward = reward; 			break; 		case 9: 			printf("扣除改为:\n"); 			scanf("%f", &reduce); 			stu[i - 1].reduce = reduce; 			break; 		case 10:modify(); break; 		} 		printf("\n\n"); 		printf("确认修改请按1,重新修改请按2\n\n"); 		scanf("%d", &b); 	} while (b == 2); 	{ 		modify(); 	} 	printf("\n修改后的所有员工信息:\n"); 	save_file(m); 	display(); 	printf("继续修改请按1,不再修改请按2\n"); 	scanf("%d", &t); 	switch (t) 	{ 	case 1:modify(); break; 	case 2:break; 	default:break; 	} } void sort() { 	int i, j, m = load_file(); 	struct stuff t; 	for (i = 0; i<m - 1; i++) 	{ 		for (j = 0; j<m - i - 1; j++) 			if (stu[j].pay>stu[j + 1].pay) 			{ 				t = stu[j]; 				stu[j] = stu[j + 1]; 				stu[j + 1] = t;  			} 	} }  void tong() { 	int sum = 0, i, count = 0, j = 0, k = 0; 	int m = load_file(); 	for (i = 0; i<m; i++) 	{ 		sum = sum + (int)stu[i].pay; 		if (stu[i].pay <= 2000) 		{ 			count++; 		} 		if (stu[i].pay>2000 && stu[i].pay <= 5000) 		{ 			j++;

引用 2 楼 血影*裂冰 的回复:[quote=引用 1 楼 niiiloc的回复:]一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了[/quote]  没感觉多庸俗。代码调试需要功夫和时间的，收点辛苦费没啥

引用 1 楼 niiiloc的回复:一看就是抄的代码，你给多少钱呢 大佬还要钱啊，是不是太庸俗了

一看就是抄的代码，你给多少钱呢


Question: 小白求助，这代码一直超时，要疯了

引用 6 楼 niiiloc 的回复:还有代码里最大的问题就是输入和处理没有分开 for(i=1;i<=m;i++) {     for(j=1;j<=n;j++)     {         scanf("%c",&num[i][j]);     }     getchar(); }  // 数据处理... 谢谢，问题已经解决，我是个小白，以为这样处理能提高效率，谢谢你的建议

就不应该在main函数里用while(1)死循环 题目里虽然写了多组数据，但是没有明确循环退出条件，所以建议把while(1)死循环去掉

顶一下，求一位大佬

引用 2 楼 真相重于对错 的回复:把原题贴一下  要求输出所使用砖块的高度和数量，使用如下格式分行显示： k Ck 其中k∈{ 1,2,….,M}代表砖块的高度，Ck代表需要的高度为K的砖块的数量，不用输出Ck=0的行，按照K的升序显示各行。

把原题贴一下

#include <stdio.h>  int process(int m,int n) {     char num[200][200];     int i,j,count[200],ans[200];     for(i=1;i<=m;i++)     {         for(j=1;j<=n;j++)             {                 scanf("%c",&num[i][j]);                 if(num[i][j]=='0')                 {                     count[j]++;                     if(i==m)                     {                         ans[count[j]]++;                         count[j]=0;                     }                 }                 if(num[i][j]=='1')                 {   if(num[i-1][j]=='0')                     {                      ans[count[j]]++;                      count[j]=0;                     }                 }             }              getchar();     }      for(i=1;i<=200;i++)          if(ans[i]>0)             {                 printf("%d %d\n",i,ans[i]);                 ans[i]=0;             } }  int main() {      int m,n;     while (1)     {  scanf("%d%d",&m,&n);        process(m,n);     }     return 0; } 这是我的代码，能有效的输入输出，就是提交好几次都是超时，把process直接写进main里也是一样。（为了能实现多组输入我在main里面用了一个大while）


Question: 求大神讲解

引用 4 楼 魏宇轩的回复:警告并不是错误，编译能过 而且，一直提示有错误

那为什么把程序导入protues之后还是不能仿真呢

警告并不是错误，编译能过

引用 1 楼 phenix2009的回复:没提示错误啊 提示三处警告啊，感觉不太对

提示3wrning这个是什么原因

没提示错误啊


Question: 求教

printf("F = %2.2lf \n c = 2.2f\n", F, c);  //double对应输出格式%lf，float对应%f


Question: 什么叫迭代？

计算斐波那契额数列的过程就是一种迭代


Question: cfree不支持 函数形参前面写*&的形式，请问能不能通过一些设置上的更改来让他支持

我没有用过cfree ，是不是你没有按c++方式编译？

cfree 不是号称可以编译c++的吗

*& 是C++的方式，请改用C++编译器。


Question: C语言字符数组输入输出问题

谢谢啦，真是搞晕了，这都被我弄错了……

数组类型是char 不是int


Question: 大神，这题怎么解？

引用 楼主 你怪带劲的回复:用函数实现，从键盘任意输入一组数。把各位上的奇数和偶数分别提取出来，然后构成两个新数。高位依然是高位，低位依然是低位。 解法思路:  设置新基数odd_n=0,位数标志on_f=1；偶数even_n=0,位数标志en_f=1。 读取任意数x。  循环(当x>0){ 取x的个位数b=x%10,x=x/10; 判断b奇偶    如是基数则（odd_n=odd_n+on_f＊b；on_f=on_f*10  //进一位）    反之是偶数，如法炮制。 }  输出基数odd_n，偶数even_n。  相信楼主会写了。


Question: 求大神讲解一下这个程序是什么意思呀，为什么结果是23呀，初学者，有点懵

懂了懂了，谢谢

楼上正解。楼主~

因为case 2:printf("%d", k++);没有加break，因此会继续执行case 3:printf("%d", k++);  case 2:printf("%d", k++);  输出2，k=3 case 3:printf("%d", k++);  输出3，k=4  因此最终输出结果是23


Question: 看一下这段代不错那儿

错在闲的蛋疼

引用 4 楼 user-3 的回复:听说结果31  引用 2 楼 qq_40878688 的回复:代码没有错，运行结果31 我用的在线编辑器结果是31，可能有问题吧

引用 2 楼 qq_40878688 的回复:代码没有错，运行结果31 输出语句用了逗号运算符： 引用逗号运算符是指在C语言中，多个表达式可以用逗号分开，其中用逗号分开的表达式的值分别结算，但整个表达式的值是最后一个表达式的值。参数分隔符号 不是逗号运算符

未定义行为 GG 没意义


Question: 一个刚学C语言和单片机小白的提问

引用 3 楼 pxf1249905281 的回复:[quote=引用 1 楼 lishungong 的回复:] while（S==1）    {    for（t=1；t<4;t++）        {         if(Z==1)          {            z   break;//如果Z也成立 则执行z一次          }         else         ｛ continue;//如果Z变为不成立则在一段时间内持续判断Z是否成立          ｝       }    s ｝这样的话 功能z退出for循环 外部的while循环还是会让z继续一直运行 而不是一次[/quote]   把s的条件置成false 就可以了

引用 1 楼 lishungong 的回复:while（S==1）    {    for（t=1；t<4;t++）        {         if(Z==1)          {            z            break;//如果Z也成立 则执行z一次          }         else         ｛        continue;//如果Z变为不成立则在一段时间内持续判断Z是否成立          ｝       }    s ｝这样的话 功能z退出for循环 外部的while循环还是会让z继续一直运行 而不是一次

后面的没有明白 引用S成立时执行s                                  此时如果Z也成立 则执行z一次  这里用中断感觉比较好


Question: 大佬们，救救孩子吧

你截图都不会，还指望编得好程序？


Question: 求助，关于if语句的一个问题

浮点数格式 http://bbs.csdn.net/topics/390676437

编译器的问题吗

改成 a*0.2+b*0.3-1 < 0.000001试试 浮点数比较一般考虑个误差范围，小于这个误差范围则认为相等


Question: 可视化程序制作

引用 6 楼 qq_44824814的回复:[quote=引用 3 楼 ooolinux 的回复：][quote=引用 2 楼 qq_44824814 的回复:] c语言代码也可以用这个软件吗？  C++，兼容C语言。 第一本书有一章简单介绍了C++。[/quote]这个从网上可以下载不 [/quote] 可以下载的。字数字数

引用 7 楼 qq_44824814 的回复:引用 5 楼 棉猴 的回复：MFC吧，在界面编辑器中拖几个控件进去，所见即所得，挺简单的mfc是软件吗？ MFC叫做微软基本类库，Visual Studio中都支持的。在创建项目时选择创建MFC项目，之后，选择基于对话框的项目即可。

引用 3 楼 ooolinux 的回复：[quote=引用 2 楼 qq_44824814 的回复:] c语言代码也可以用这个软件吗？  C++，兼容C语言。 第一本书有一章简单介绍了C++。[/quote]这个从网上可以下载不

MFC吧，在界面编辑器中拖几个控件进去，所见即所得，挺简单的

二维还是三维的？？

引用 2 楼 qq_44824814 的回复:c语言代码也可以用这个软件吗？  C++，兼容C语言。 第一本书有一章简单介绍了C++。

引用 1 楼 ooolinux 的回复：图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder书籍下载： https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Qc语言代码也可以用这个软件吗？


Question: visual的问题

说真的，看不清呃。。。


Question: C语言中strcmp函数可以比较一个由键盘输入的字符串和从文件里读出来的字符串吗？

這沒什麽區別啊，關鍵只在於結束符，都確保有NULL結尾就可以比較了。

没有区别的。都可以。

只要是字符串就可以，前提是字符串内部不包含'\0'字符，否则会被截断


Question: c语言关于多线程的问题

线程函数不是你这么定义的 线程函数也不能转换成void*进行传递 pthread_creat要求的就是函数类型的参数  自己man pthread_creat研究一下吧

如果是双向链表，为什么没有pre->previous->next = p？ 不同的问题建议另外开帖问

想问下这个segmenttation fault是咋回事

编译不过把编译错误贴出来


Question: 数据结构。求大神指点

引用 5 楼 weixin_44810057的回复:第五个你能给我写一下吗 结果：若cur_e是list的数据元素，且不是第一个，则用pre_e返回 //          他的前驱，否则操作失败，pre Status PriorElem(List list,ElemType cur_e,ElemType *pre_e){ 	int itr; 	if(!list.data){ 		printf("Error!! Please inital first!!\n"); 		exit(0); 	} 	if((itr=ExistElem(list,cur_e)) && itr != 1){ 		*pre_e=list.data[itr-2]; 		return OK; 	}else{ 		return ERROR; 	} } 我复制的见别人写的

引用 5 楼 weixin_44810057 的回复:第五个你能给我写一下吗  好吧。 Listempty _Sq(&L)  应该是清空链表吧……前面看错了。  步骤： 用2根指针，一根指向链表头，一根指向要free的节点。 将链表头置为NULL。 遍历链表，依次free。  伪C代码： NODE *p,*q; p=q=L.head; L.head=NULL; while(p){ 	p=p->next; 	free(q); 	q=p; }   Priorelem_ Sq(L, cur-e, &pre_e) 猜想是将cur_e的前一个赋值给pre_e吧~~  步骤：遍历链表，找到当前节点的后继节点等于cur_e的节点(p->next->data=cur_e)，赋值给pre_e。  NODE *p； p=L.head; while(p->next) 	if(p->next->data==cur_e) 	{  *pre_e=p->data; 	   return true; 	} //如果没有找到或者链表第一个元素=cur_e,没有前序则返回false return false;

第五个你能给我写一下吗

你这题目主要是指时间复杂度吧。。。书上有的。

谢谢啊，我们老师也没有说清楚

你没说明链表是否带头节点，就当他是带头结点的链表把。  Listlength _Sq(L)   这个求链表长度的是吧 步骤：从链表头数到链表尾 伪C代码： NODE* p; count=0; for（p=L.head；p；p=p->next）       count++; return count; 性能：O(n)  Getelem _Sq(L, i, &e)  是获取第i个元素吗？  步骤：从头开始一个个数，数到第i个，然后赋值给e  伪C代码： NODE* p； for(p=L.head;p&&i>1;p=p->next)     --i; if(p) *e=p->data;  性能：O(n)   Locate Elem _Sq(L,e) 定位e在链表中的位置？  步骤：从头开始一个个找，直到找到和e相等的元素，返回位置。  伪C代码： NODE* p; int count=0; for(p=L.head;p;p=p->next){ 	++count; 	if(p->data==e) break; } if(p&&count) return count;  性能：O(n)   Listempty _Sq(&L)  判断链表是否为空？  步骤：看看头指针是否为NULL 伪C代码：if（L->head==NULL）return true;else return false;   性能：O(1)


Question: void Swap ( int &a, int &b)与void Swap ( int &a, int &b)

引用 5 楼 轻箬笠的回复:[quote=引用 4 楼 sdghchj 的回复:] C语言没有引用 这句才是关键的，void Swap ( int &a, int &b)是c++的写法。[/quote] 找了好久 谢谢你啦😄

https://www.cnblogs.com/x_wukong/p/5712345.html 最大的不同在于： 指针本质是值传递，被调函数对形式参数的任何操作都是作为局部变量进行，不会影响主调函数的实参变量的值。 而引用传递，被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用 4 楼 sdghchj 的回复:C语言没有引用 这句才是关键的，void Swap ( int &a, int &b)是c++的写法。

C语言没有引用

void Swap ( int &a, int &b)与void Swap ( int *a, int *b)  前者c++的引用。后者c指针。两种不同的概念。不要把引用当成c来看。c没有引用。

地址可以通过指针变量修改，地址不能直接被修改。等一个传过去没法修改，第二个传过去可以修改指向和地址指向变量的值

第一个是传引用，第二个是传指针，教科书上都有详细说明的呀。你可以百度搜索：  指针和引用的区别


Question: 求助C语言

都看不清啊。怎么说了

懂啦 谢谢大家 原因找到啦，谢谢哥哥姐姐


Question:
】近似数是从某一位四舍五入后，与准确数最相近的数。例如：精确到十位数，则328的近似数为330；精确到百位数，则1123的近似数为1100。
现输入一个四位的正

#include <stdio.h> int main() { int n; scanf("%d",&n); if(n<1000|n>9999) printf("data error!");//如果输入不是四位数，给出输入错误提示 else printf("%d",(n+50)/100*100);//输入是四位数，输出其近似数 return 0; }


Question: 关于stand(time(NULL))的问题

引用 4 楼 哎哟，我的小黑猫还不会说的回复:#include <time.h>   还要包括这个头文件。 好像是  #include<windows.h>  这个头文件。

#include <time.h>   还要包括这个头文件。

srand((unsighted int)time(NULL));   随机变量为一个无符号整型，这样就可以了

谢谢，直接加一个time的头文件就可以了。刚上机试过

引用 7 楼 lin5161678的回复:[quote=引用 1 楼 qq_38834405 的回复:] time是保留字，不能用来当变量名，去掉就好了time不是保留字 可以用来做变量名  这里的问题是 time是一个int 而不是函数  不能 time() 就像 int n; 不能 n() 一样 语法上不支持 函数调用运算符的操作数 必须是 函数类型或者函数指针类型 [/quote] sry 这段时间学数据库晕了 我又误导人了

把time变量改个名字吧，后面还要用time函数呢

引用 1 楼 qq_38834405 的回复:time是保留字，不能用来当变量名，去掉就好了time不是保留字 可以用来做变量名  这里的问题是 time是一个int 而不是函数  不能 time() 就像 int n; 不能 n() 一样 语法上不支持 函数调用运算符的操作数 必须是 函数类型或者函数指针类型

你在上一行把time声明成int类型了啊~ 你换个名字吧~~

time是保留字，不能用来当变量名，去掉就好了


Question: 求大佬设计一下程序，我的时间复杂度太大了

这种题目真讨厌啊~~语文不好，要看半天才能看懂他在说什么。 分析题目，结果如下： 有一个长度为n的数组，起始位置是数组头部pos=0；每轮可以跳x步(1<=x<=Vi)同时需满足（Di>=n[pos+x]）；经过若干轮后，判断最后是否能到达数组尾部pos=n-1。 给定m个（Vi，Di），判断每个是否能到达。  这个用贪婪算法，每次能跳多远就跳多远，如果一步都不能跳那么就一定跳不出了。 这个问题时间复杂度O(n)~   #include<stdio.h> #include<stdlib.h> int main() { 	int n,m,pos,step; 	int * pool,*Vi,*Di; 	scanf("%d%d",&n,&m); 	//读入长度为n的鳄鱼数据 	pool=(int *)malloc(sizeof(int)*n); 	for(int i=0; i<n; i++) 		scanf("%d",pool+i); 	//读入m个 装备的属性 	Vi=(int*)malloc(sizeof(int)*m); 	Di=(int*)malloc(sizeof(int)*m); 	for(int i=0; i<m; i++) 		scanf("%d%d",Di+i,Vi+i); 	//求每个装备是能渡过 	for(int i=0; i<m; i++) { 		pos=0;//起始位置 		while(pos<n-1) { 			step=0; 			//求一次最多能跳几步 			for(int j=1; j<=Vi[i]&&pos+j<n; j++) 				if(Di[i]>=pool[pos+j]) 					step=j; 			//如果一步都跳不了，那就不再跳了 			if(step==0) break; 			else pos+=step; 		} 		//输出结果 		if(pos==n-1) printf("Yes\n"); 		else printf("No\n"); 	} 	free(pool); 	free(Vi); 	free(Di); }


Question:
大佬们问个问题
为什么a+‘a’-‘A’是97

代码错的 题目错的 出题人水平太低 怎么错的 看前面各位的介绍

《C++程序的150个建议》中 “建议3：对表达式计算顺序不要想当然”中提到“C语言也不能识别操作符的哪一个操作被先计算”  所以，这个a=a+1这个表达式可能先执行，也可能后执行！

典型的序列点日经问题，答案是未定义。

具体是97，还是98，依赖于参数入栈方向。

引用 8 楼 user-5的回复:不要纠结这种题，如果单考逗号表达式，是从左往右的，但是夹杂着参数入栈，就不要理他了 嗯……………………😊

懂了，这道题就是错的，不要说太复杂(≧Д≦)ノ只是个初学者……

引用 1 楼 真相重于对错的回复:a等于多少？ 66……………………

a等于多少？


Question: 小白求救，谢谢大佬

1：sum需要重置，应该放在for循环中； 2：a=a/10;  b=a%10; 这样的结果就是少了一位了~~，这两句只要更换一下顺序就可以了。

大致没问题，如下修改。

引用 9 楼 qq_44790116的回复:[quote=引用 8 楼 qq_38834405的回复:][quote=引用 7 楼 qq_44790116 的回复:] [quote=引用 5 楼 qq_38834405的回复:]水仙花数是指一个 3 位数，你n=4到7要干嘛。。而且int类型也放不下这么大的数字（因为你后面要次方），你把你的while里面a和b 的赋值顺序交换一下就行了 书上的题目这么要求的[/quote]你把题目拍一下，你的算法没问题，就是a,b赋值顺序错了。水仙花数真真是指一个 3 位数。。[/quote] 我加你QQ吧，这好像不能拍照[/quote] Q 469704848

引用 8 楼 qq_38834405的回复:[quote=引用 7 楼 qq_44790116 的回复:] [quote=引用 5 楼 qq_38834405的回复:]水仙花数是指一个 3 位数，你n=4到7要干嘛。。而且int类型也放不下这么大的数字（因为你后面要次方），你把你的while里面a和b 的赋值顺序交换一下就行了 书上的题目这么要求的[/quote]你把题目拍一下，你的算法没问题，就是a,b赋值顺序错了。水仙花数真真是指一个 3 位数。。[/quote] 我加你QQ吧，这好像不能拍照

引用 7 楼 qq_44790116 的回复:[quote=引用 5 楼 qq_38834405的回复:]水仙花数是指一个 3 位数，你n=4到7要干嘛。。而且int类型也放不下这么大的数字（因为你后面要次方），你把你的while里面a和b 的赋值顺序交换一下就行了 书上的题目这么要求的[/quote]你把题目拍一下，你的算法没问题，就是a,b赋值顺序错了。水仙花数真真是指一个 3 位数。。

引用 5 楼 qq_38834405的回复:水仙花数是指一个 3 位数，你n=4到7要干嘛。。而且int类型也放不下这么大的数字（因为你后面要次方），你把你的while里面a和b 的赋值顺序交换一下就行了 书上的题目这么要求的

#include <iostream> #include <math.h> #include <cstdio>  int main() { 	int n, i, N, sum; 	sum = 0; 	printf("请输入位数[3,7]: "); 	scanf_s("%d",&n); 	if (n<3 || n > 7) 	{ 		printf("输入数据不符合要求，请重新输入"); 		scanf_s("%d", &n); 	} 	switch (n) 	{ 	case 3: N = 100; 		break; 	case 4: N = 1000; 		break; 	case 5: N = 10000; 		break; 	case 6: N = 100000; 		break; 	case 7: N = 1000000; 		break; 	default: 		break; 	}  	// 分配空间，存储各个位置上的数字 	int *Ptr = NULL; 	Ptr = (int *)malloc(n * sizeof(int));  	for (i = N; i < N * 10; ++i) 	{ 		// 初始化各个位置上的数字为0 		for (size_t j = 0; j < n; j++) 		{ 			Ptr[j] = 0; 		}  		// 计算各个位置上的数字 		for (int j = n-1; j >= 0; j--) 		{ 			int sum_temp = 0; 			for (int k = n-1; k > j; k--) 			{ 				sum_temp += pow(10, k)*Ptr[k]; 			} 			Ptr[j] = (i - sum_temp) / pow(10,j); 		}  		// 计算和 		sum = 0; 		for (size_t j = 0; j < n; j++) 		{ 			sum += Ptr[j] * Ptr[j] * Ptr[j]; 		}  		// 比较，是否为水仙花数 		if (sum==i) 		{ 			printf("当前水仙花数是： %8d\n ", i); 		} 	}  	free(Ptr);  	std::cin.get();  	return 0;

引用 1 楼 qq_38834405的回复:sum需要重置，sum=0放for里面。 而且输出的数还有不是水仙花数的

引用 1 楼 qq_38834405的回复:sum需要重置，sum=0放for里面。 改过来了，可是还是输不出全部符合情况的水仙花数，只输出了一个

改过来了，可是还是输不出全部符合情况的水仙花数，只输出了一个


Question: Single LinkList 单向串行链结

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633


Question: 新手请问一下这是什么编程软件，win10能下吗

要钱，试用30天

jetbrain全家桶系列

有点像mac自带的 sublime


Question: c语言中&与&&的区别

有引用。可以避免传指针。

C语言中有引用吗？

承接上文，&还有引用 的作用

区别多的是 而你差不多一个都没说出来


Question: 萌新求解！

引用 2 楼 qq_44823489 的回复:[quote=引用 1 楼 顾宇宝宝的回复:]         首先a=15，a%3为0，然后执行case 0语句，m+1变成1，           break跳出switch语句，打印结果就是1了 m++后m就等于1了吗，那什么时候m仍然为0呢[/quote] 看书

引用 1 楼 顾宇宝宝的回复:首先a=15，a%3为0，然后执行case 0语句，m+1变成1，           break跳出switch语句，打印结果就是1了 m++后m就等于1了吗，那什么时候m仍然为0呢

a%3的结果为0，直接匹配case 0： 执行m++，m自增变成1，然后跳出匹配，打印结果1


Question: 飞思卡尔

、无线节能组 、无线节能组 （1）车模 ）车模 自行制作车模，不允许使用传统车轮支撑车模运行。可以使用履带、整体滚 动、爬行机构、气垫等类型的运动方式。 如果车模是脱离地面运行，则需要从车模上下垂一个终端带有磁铁的物体， 接触赛道表面， 它的作用： （1） 用于指示车模运行是否还在赛道边界内； （2） 用于触发感应线圈计时系统。 对于无线节能系统， 除了可以利用从无线线圈接收到的电能之外， 也允许使 用车体上存储的机械动能、势能（压缩气体、弹簧、橡皮筋） 、光能电池进行辅 助驱动，车上预储机械势能总量不能超过2000焦耳。不允许使用化学能源。 （2）传感器 ）传感器 允许电磁感应线圈进行赛道引导线的检测， 也允许使用摄像头传感器进行赛 道检测。 （3）比赛赛道 ）比赛赛道 比赛是在PVC赛道上进行，赛道采用电磁线进行引导，赛道也同时具有黑色 边界线。赛道中可能存在的元素包括表2中所有的元素。 比赛赛道发车区中安放有无线发射线圈，通过交变电流，产生交变磁场。车 模通过接收线圈获得电能， 对车模上的储能法拉电容进行充电。 关于无线充电线 圈具体技术规格以及制作方式， 无线接收线圈的规格以及制作方式将会另行发布 文档进行说明。

能说的再明白一点吗


Question: C语言问题int a[][N]      那个[]是什么意思呀

你这是定义了一个二维数组，二维数组的列是一定要确定的，而行可以先不确定

二维数组的行数

嗯嗯，我知道了，谢谢大家啦

不不，刚才看错了，是二维数组的行数，第一个代表行第二个代表列，行数可忽略不写，列数一定要写

是一维数组的长度，可忽略不写

int a[？行][N列] 二维矩阵的行和列，当你知道有多少个数据，知道一行有多少列时，就可以算出来有多少行，就可以省略行的输入（如果不知道有多少个数据是不能省略的，c语言不允许定义不知道大小的数组）

c语言数组是行序为主，Arr[m][n]就是一个m行n列的二维数组，当二维数组作为函数参数时，可以不用给出一维大小，所以就可以写成a[][n]了


Question: 新手求指教！！一直出错要哭了

linkedlist本身就是指针类型 你的l想定义成什么类型？，指针的指针，还是结构体指针 如果是 linkedlist *l = null；指针的指针 那么应该是 l = （linkedlist*）malloc（sizeof（linkedlist）） 如果是lineklist l = null；结构体指针 那么应该是 l = （linekedlist）mallloc（sizeof（lnode））

1. malloc的返回值是指针 2. LinkedList已经是指向LNode的指针了  LinkedList  L = NULL; L = (LinkedList)malloc(sizeof(LNode));


Question: void fun函数中的*s=a［0］和*s=a［i］为什么不能改成s=&a［0］和s=&a［i］的形式

引用 2 楼 qq_38834405的回复:我觉得没差别，能贴一下源码吗，这个真的看不清楚 才开始用 不太会 实在抱歉

#include<stdio.h> #include<string.h> #include<conio.h> #include<stdlib.h> #define N 10 typedef struct ss{ char num[10];   int s;} STU; void fun(STU a[], STU *s) {	int i;  s=a;   for(i=0;i<N;i++) 	  if(s->s>a[i].s)		   *s=a[i];} void main() {   FILE *wf;   STU a[N]={ { "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},  { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;   int i;   system("CLS");   printf("*****The original data*****\n");  for(i=0;i<N;i++)      printf("No=%s Mark=%d\n", a[i].num,a[i].s);  fun(a,&m);   printf("*****THE RESULT*****\n");   printf("The lowest :%s, %d\n",m.num,m.s);/******************************/  wf=fopen("out.dat","w");   fprintf(wf,"%s, %d",m.num,m.s);   fclose(wf);/*****************************/}

抱歉抱歉 图太模糊了

一个是修改指针所指向地址的值；一个是改变指针的位置，这两个形式看着很像，但是确实天差地别、不可同日而语的。建议好好理解指针的概念，指针存储的只是地址，并不是值。

*s=a[0] 和 s=&a[0]应该不一样 你的图看不清，我只能根据标题回答 *s=a[0] 猜测 s 应该是个指针类型 ，这句话的意思是把a[0]的值拷贝给s所指向的地址中，语句执行后如果修改s指向地址的内容不影响a[0] s=&a[0] 是把s指向了a[0],因此之后如果修改s,将会影响到a[0]  int a[]={1,2,3,4,5}; 	int *s; 	s=new int; 	*s=a[0]; 	*s=10; //a[0]不变 	int *s1; 	s1=&a[0]; 	*s1=100;//a[0]也会改为100

我觉得没差别，能贴一下源码吗，这个真的看不清楚

我觉得是因为用指针会直接把数据储存到内存中，而用&不会，他只是在输入的时候会把输入的数储存到内存里


Question: C语言命令行如何进行多次传参

#include<stdio.h> int main(int argc, char *argv[]) {     char str[1024];     char* p = argv[1];     if (argc == 1)     {         printf("please enter parameter!  ATTENTION:The first parameter is number,the second parament is whatever you want!\n");         scanf("%s", str);         p = str;     }      printf("%s",p);     return 0;        }

引用 3 楼 niiiloc 的回复:你的程序也没啥错啊，卡在那里是因为在等待用户输入参数 你随便输入个参数就过去了有的 argc是1  argv[1]是NULL scanf("%s", NULL); 会凉凉

另外定义一个数组  新输入的参数就存到数组里面就完事

MSDN中提到 The __argc global variable is a count of the number of command-line arguments passed to the program. __argv is a pointer to an array of single-byte-character or multi-byte-character strings that contain the program arguments. argc是命令行的参数数量，而argv是一个指向数组的指针，这个数组中的元素是命令行中的参数。也就是说，argv指向的数组中的元素的数量要与argc相同。 if (argc == 1)     {         printf("please enter parameter!  ATTENTION:The first parameter is number,the second parament is whatever you want!\n");         scanf("%s",argv[1]);     } 在以上代码中，argc的值是1，则argv的数组元素个数是1个，不会存在argv[1]，所以程序会报错。因此，不能用scanf()输入参数。此时之只能是如2楼所说，退出程序。在cmd中输入参数，重新进入。

scanf(“%s”, &argv[1]);

你的程序也没啥错啊，卡在那里是因为在等待用户输入参数 你随便输入个参数就过去了

#include<stdio.h> int main(int argc, char *argv[]) {     if (argc == 1)     {         printf("please enter parameter!  ATTENTION:The first parameter is number,the second parament is whatever you want!\n");         return 1;     }     printf("%s",argv[1]);     return 0;       } H:\a大一下>xxx.exe please enter parameter!  ATTENTION:The first parameter is number,the second parament is whatever you want!  H:\a大一下>xxx.exe 1 abc 1

别沉了啊。。。。

谢谢各位大佬的解答，感谢感谢！


Question: 求第三题codeblocks怎么做

引用 2 楼 user-2的回复: switch（opr）{ case  ‘+’：printf("%d+%d=%d",a,b,a+b);break; case  ‘-’：printf("%d-%d=%d",a,b,a-b);break; case    ’*‘：printf("%d*%d=%d",a,b,a*b);break; case   ’/‘：printf("%d/%d=%d",a,b,a/b);break; default: printf("error");break； }  基本的操作就这样，具体要你自己去实现，例如除以0错误这种 多谢指点

用开关语句做


Question: C新手，有大神帮我看看作业哪错了吗

我最喜欢的VC++6.0，没有之一！ 计算输入数字的位数的代码没有错误，主要是求逆序数，即case 2语句中有一些小小的错误 	case 2: 		printf("输入一个不多于三位的数字以继续:\n"); 		scanf("%d", &i); 		b = i / 100; 		c = (i - (b * 100))/10;//-------修改求c的代码----------- 		d = i - (b * 100) - (c * 10); 		if (b != 0) 		{//------添加括号------ 			e = b; 			b = d; 			d = e; 			printf("%d%d%d\n", b, c, d); 		}//------添加括号------ 		else if (c != 0)//-------改为else if------- 		{//------添加括号------ 			e = d; 			d = c; 			c = e; 			printf("%d%d\n", c, d); 		}//------添加括号------ 		else if (d != 0)//-------改为else if------- 		{//------添加括号------ 			printf("%d\n", d); 		}//------添加括号------ 		break; VC++6.0 User，加油！

错了好多，都不知道怎么说。

自己加个断点调一下就清楚了，代码上看的话，输入56，会输出655，因为这时候c，d（十位，个位）都不等于0，应该用else if； if(b!=0) {...} else if (c!=0) {...} else {...} 或者用switch 或者这样： if(b!=0) {只输入百位} if (c!=0) {只输入十位} if(d!=0) {只输入个位}


Question: 怎么把文件里的内容保存到数组里然后读取

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

文件里不是只有数字。还有英语单词和一些符号什么的。

那个输出代码之前写了的，可是输出开出来乱码，代码还是这个

好像没写输出数据的代码

你只读取 没输出  当然空白了

换了几个函数都编译不出

调试下呗


Question: LED = ~data  这个到底是什么意思呢？

谢谢，帮大忙了！

一个寄存器里面有8位数据，每一位一般都有特别的含义，按照你这个程序而言，寄存器LED的每一位对应一个实际的LED口，而且对这一位写0就可以点亮（共阳极），所以一开始赋值～（0x01），意思是对0x01取反，原本是1的位就会变0，所以第一位LED先点亮，其余熄灭，然后把这个1不断左移，依次点亮其余LED，当这个1左移最高位继续左移的时候就会消失，于是就会变成0，此时已经依次点亮一遍，重新赋值0x01再开始下一轮


Question: a+b

所以 你的问题呢?

#include <stdio.h>  #include <stdlib.h>  //主要你没给例子 //是要3 1 2 3这样的输入 输出6吗  int main()  {      int sum,n,a[100],i;//a改成数组      while(scanf("%d",&n)&&n!=0){//这里条件符号                    sum=0;          for(i=0;i<n;i++){              scanf("%d",&a[i]);              sum+=a[i];          }          printf("%d\n",sum);      }      return 0;  }

这是我根据题目要求写的一个程序  #include <stdio.h> #include <stdlib.h>  int main() {     int sum,n,a,i;     while(scanf("%d",&n),n!=0){         sum=0;         for(i=0;i<n;i++){             scanf("%d",&a);             sum+=a;         }         printf("%d\n",sum);     }     return 0; }


Question: 关于\b的使用

\b只是设置光标位置 没有删除的作用

要全部删掉可以用system("cls");这是windows头文件里面的一个函数

改用cprintf


Question: 将 gbk编码的字符串 转换成 utf-8 后，存储到注册表出现数据丢失的问题

这也许是一个无解的问题。  结贴，感谢大家回复。

@zgl7903 你的程序文件内部使用的是 utf-8 编码吧，我的程序文件内部使用的是 gbk 编码，使用你的代码后，测试结果和我之前是一样的。  我写的程序源代码使用的是 gbk 编码, 但需要在程序中将 gbk 编码的 "新2" 转换成 utf-8 编码后，存储到注册表的 REG_SZ 。  "d:\新2" 转换成 utf-8 后了字节： 0x64 0x3a 0x5c 0xe6 0x96 0xb0 0x32  但不知为什么，存储到注册表(REG_SZ)后，在我的程序中再读取注册表项时，读取到的字节变成了：  0x64 0x3a 0x5c 0xe6 0x96 0x3f 0x0  为什么数据变了？

CHAR srcGbk[] =    {     0x64, 0x3a, 0x5c, 0xd0, 0xc2, 0x32, 0x00,   };    HKEY hPrimKey = HKEY_CURRENT_USER;   LPCWSTR szSubKey = L"Software\\myTest";   LPCWSTR szValueName = L"TestValule";    const int CP_GBK = 936;      //写入测试   {     //GBK-->UNICODE     int iWLen = MultiByteToWideChar(CP_GBK, 0, srcGbk, -1, NULL, 0);     WCHAR *wChString = new WCHAR[iWLen + 1];     MultiByteToWideChar(CP_GBK, 0, srcGbk, -1, wChString, iWLen);     wChString[iWLen] = 0;      //UNICODE-->UTF8     int iUtf8Len = WideCharToMultiByte(CP_UTF8, 0, wChString, -1, NULL, 0, NULL, NULL);     CHAR *szUtf8String = new CHAR[iUtf8Len + 1];     WideCharToMultiByte(CP_UTF8, 0, wChString, -1, szUtf8String, iUtf8Len, NULL, NULL);     szUtf8String[iUtf8Len] = 0;      HKEY hKey = NULL;     DWORD dwDisp=0;     if(RegCreateKeyExW(hPrimKey, szSubKey, NULL, NULL,       0, KEY_ALL_ACCESS , NULL, &hKey, &dwDisp) == ERROR_SUCCESS)     {       RegSetValueExW(hKey, szValueName, NULL, REG_SZ, (BYTE*)szUtf8String, iUtf8Len);       RegCloseKey(hKey);     }      delete [] szUtf8String;     delete [] wChString;   }      //读出测试   {     HKEY hKey = NULL;     if(RegOpenKeyExW(hPrimKey, szSubKey, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)     {       //获取长度       DWORD dwType=0, iUtf8Len = 0;       RegQueryValueExW(hKey, szValueName, NULL, &dwType, NULL, &iUtf8Len);       //读入UTF8       CHAR *chUtf8 = new char[iUtf8Len + 1];       RegQueryValueExW(hKey, szValueName, NULL, &dwType, (BYTE*)chUtf8, &iUtf8Len);       chUtf8[iUtf8Len] = 0;        //UTF8-->Unicode       int iWLen = MultiByteToWideChar(CP_UTF8, 0, chUtf8, -1, NULL, 0);       WCHAR *wChString = new WCHAR[iWLen + 1];       MultiByteToWideChar(CP_UTF8, 0, chUtf8, -1, wChString, iWLen);       wChString[iWLen]= 0;        //Unicode--->GBK       int iGBKLen = WideCharToMultiByte(CP_GBK, 0, wChString, -1, NULL, 0, NULL, NULL);       CHAR *chGBK = new CHAR[iGBKLen + 1];       WideCharToMultiByte(CP_GBK, 0, wChString, -1, chGBK, iGBKLen, NULL, NULL);       chGBK[iGBKLen] = 0;        ASSERT(strcmp(srcGbk, chGBK) == 0);              delete [] chGBK;       delete [] wChString;       delete [] chUtf8;        RegCloseKey(hKey);     }   }

使用 REG_BINARY 类型，在我的程序中写入，读取转换成utf-8的数据，测试发现，数据不会丢失。  但另一个exe文件在读取注册表项的时候，加了一个判断： REG_SZ，导致我的程序必须使用 REG_SZ。  苦恼...

转换成utf-8编码后，结尾不缺少结束符 '\0'  其实问题应该改成：  为什么将 gbk编码的中文转换成utf-8编码，写入注册表项(REG_SZ)后，会出现数据丢失的情况。

我的程序内部使用的是 gbk 编码，如果在写入注册表的时候，不转换成 utf-8，对于我的程序，是可以正常的写入和读取。  但是另一个程序由于使用的是 utf-8，他读取我写入的注册表项的内容，就会出现乱码。  为了解决这个问题，我在写入注册表的时候，将内容先转换成 utf-8，然后再写入注册表项(REG_SZ)  但是，发现有些中文转换成utf-8后，写入注册表会丢失数据。

写入对吗？ 是否缺少了结束符 0 ？ RegSetValueExW  RegQueryValueEx 直接读写Unicode， 不要转码

另一个程序在读取注册表项时，会判断注册表项的类型，必须为 REG_SZ，所以我的程序在存储的时候，必须使用 REG_SZ 类型。

建议存注册表的时候,以GBK格式存储,读出来之后再转换为UTF8或者别的格式

发现，将gbk字符串："d:\新2"  转换成 utf-8 编码后，存储到注册过后， 数据就被改写了，问题就出在这里。


Question: 面向对象程序设计

这有啥好问的呀。vc都告诉你啦，缺头文件

建议到C语言版块问问


Question: 求大佬帮助

循环有三种，分别是：while（）{}、do{}while();和for（；；）{} while（条件）{需要循环的操作} do{需要循环的操作}while（判断条件）；（这种方法会在未判断之前先做一次） for（i=0；i<次数；i++）{需要循环的操作}（按给定次数循环） 看你需要哪一种咯


Question: 跪求大佬指点

自定义消息协议可以实现

必须使用特定地点wifi. 要么带wifi特征。要么wifi里某台服务器提供验证服务，连了wifi,就是局域网。连对应ip服务器的端口签到。可以http或者socket干活。其他的网你自然连不到公司的wifi签到咯。 当然可以绕过。比如内网搞代理等等

具体怎么搞不清楚，不过，从钉钉的情形看，应该是记录了wifi的唯一特征码，然后用户连上wifi的时候跟服务器那边就校验就可以了。 至于怎么记录wifi的唯一特征码，应该是管理员用户连上wifi的时候，app计算出来的，然后由管理员手动设置的。

引用 2 楼 轻箬笠 的回复：卧槽，这不就是钉钉的定点打卡。哪个公司这么变态啊，还需要自己搞一个但是不让用流量

引用 2 楼 轻箬笠 的回复：卧槽，这不就是钉钉的定点打卡。哪个公司这么变态啊，还需要自己搞一个重庆中国人寿，哈哈不信吧

特定地点wifi 可以将连入这个Wifi的某台PC，作为服务器。在软件上，签到的话，与这个PC服务器进行通讯。就可以保证，不可以用流量了。  实现的话，确实局域网 Socket就可以了。

卧槽，这不就是钉钉的定点打卡。哪个公司这么变态啊，还需要自己搞一个

局域网socket通信应该可以吧


Question: 变量名称获取

编译后的汇编语言是没有变量名称的

C不支持RTTI，C++支持RTTI也很有限，只能取类型名，至少标准C++是这样的，但是可以用宏模拟一下：  #include <stdio.h>  #define __NAME__(x) #x  int func(int a) {   printf("%s = %d\n", __NAME__(a), a);   return a; }  int main() {   int num = 10;   printf("%s = %d\n", __NAME__(num), num);   printf("%s = %d\n", __NAME__(func)__NAME__((num)), func(num));    return 0; }

为什么不去试试读取对应PDB文件获取变量名呢？

那就只能把名称传进去了 void func(char *pParaName, int paraVAlue) {      printf("%s =  %d\n",pParaName, paraValue); }

不可以,编译后这些变量名称都不存在了


Question: 求大佬

sin, cos两个函数传的是角度，不是弧度，把30和60也转换成弧度

引用 12 楼 weixin_44815382 的回复:救救孩子   不知道哪错了！！！！？樂 跟踪调试基本技能，自己跟踪一下哪一步错了。 或者把公式拆开，看，公式的哪一步结果错了。

救救孩子   不知道哪错了！！！！？🤔

改了以后还是错的    。。。

引用 9 楼 weixin_44815382 的回复:没懂  可以具体说一下改哪  怎么改吗 他的意思是，你的角度单位不统一，sin你似乎用的是角度。cos你用的是弧度。 你要统一，或者cos用acos

引用 7 楼 user-4的回复:[quote=引用 6 楼 weixin_44815382 的回复:] [quote=引用 4 楼 zjq9931的回复:][quote=引用 3 楼 weixin_44815382 的回复:] 求大佬指点                 谢   #include <stdio.h> #include <stdlib.h> #include <math.h>  #define pi 3.14159 int main() { 	double x,y; 	scanf("%f",&x); 	x=x*pi/180; 	y=sqrt((sin((double)60)+1)*(sin((double)30)+1)/cos(x)); 	printf("%.2f",y); 	return 0; } [/quote] 答案错误                   。[/quote]  都是弧度、改一下就好了[/quote] 没懂  可以具体说一下改哪  怎么改吗

原来 三角函数的参数都是 弧度啊

引用 6 楼 weixin_44815382 的回复:[quote=引用 4 楼 zjq9931的回复:][quote=引用 3 楼 weixin_44815382 的回复:] 求大佬指点                 谢   #include <stdio.h> #include <stdlib.h> #include <math.h>  #define pi 3.14159 int main() { 	double x,y; 	scanf("%f",&x); 	x=x*pi/180; 	y=sqrt((sin((double)60)+1)*(sin((double)30)+1)/cos(x)); 	printf("%.2f",y); 	return 0; } [/quote] 答案错误                   。[/quote]  都是弧度、改一下就好了

引用 4 楼 zjq9931的回复:[quote=引用 3 楼 weixin_44815382 的回复:] 求大佬指点                 谢  #include <stdio.h> #include <stdlib.h> #include <math.h>  #define pi 3.14159 int main() { 	double x,y; 	scanf("%f",&x); 	x=x*pi/180; 	y=sqrt((sin((double)60)+1)*(sin((double)30)+1)/cos(x)); 	printf("%.2f",y); 	return 0; } [/quote] 答案错误                   。

x=x*pi/180; 这一步去掉 ?

引用 3 楼 weixin_44815382 的回复:求大佬指点                 谢  #include <stdio.h> #include <stdlib.h> #include <math.h>  #define pi 3.14159 int main() { 	double x,y; 	scanf("%f",&x); 	x=x*pi/180; 	y=sqrt((sin((double)60)+1)*(sin((double)30)+1)/cos(x)); 	printf("%.2f",y); 	return 0; }

求大佬指点                 谢

引用 1 楼 zjq9931的回复:包含math.h头文件即可有这些数学函数。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define pi 3.14159 int main() {double x,y; scanf("%d",x); x=x*pi/180; y=sqrt((sin(60)+1)*(sin(30)+1)/cos(x)); printf("%.2f",y);     return 0; }哪错了？？

包含math.h头文件即可有这些数学函数。


我就搞不懂了，提问最基本的一点连问题都描述不明白么？  引用 5 楼 wopabe 的回复:[quote=引用 4 楼 niiiloc 的回复:] 晕死，while (1)就是死循环啊，一直循环在跑到啊 [quote=引用 3 楼 wopabe 的回复:] [quote=引用 1 楼 niiiloc 的回复:] 当然可以，没有规定说循环终不能释放资源啊 if (ptr != NULL) {     free(ptr);     ptr = NULL; } while(1)后面的代码什么时候走到？[/quote][/quote] 哈哈，不要晕，是while(1){}的后面，没有说明白[/quote]

引用 5 楼 wopabe 的回复:哈哈，不要晕，是while(1){}的后面，没有说明白 需要你主动退出，比如调用break，或者使用goto

引用 4 楼 niiiloc 的回复:晕死，while (1)就是死循环啊，一直循环在跑到啊 [quote=引用 3 楼 wopabe 的回复:] [quote=引用 1 楼 niiiloc 的回复:] 当然可以，没有规定说循环终不能释放资源啊 if (ptr != NULL) {     free(ptr);     ptr = NULL; } while(1)后面的代码什么时候走到？[/quote][/quote] 哈哈，不要晕，是while(1){}的后面，没有说明白

晕死，while (1)就是死循环啊，一直循环在跑到啊 引用 3 楼 wopabe 的回复:[quote=引用 1 楼 niiiloc 的回复:] 当然可以，没有规定说循环终不能释放资源啊 if (ptr != NULL) {     free(ptr);     ptr = NULL; } while(1)后面的代码什么时候走到？[/quote]

引用 1 楼 niiiloc 的回复:当然可以，没有规定说循环终不能释放资源啊 if (ptr != NULL) {     free(ptr);     ptr = NULL; } while(1)后面的代码什么时候走到？

资源可以释放

引用 7 楼 niiiloc 的回复:我就搞不懂了，提问最基本的一点连问题都描述不明白么？  [quote=引用 5 楼 wopabe 的回复:] [quote=引用 4 楼 niiiloc 的回复:] 晕死，while (1)就是死循环啊，一直循环在跑到啊 [quote=引用 3 楼 wopabe 的回复:] [quote=引用 1 楼 niiiloc 的回复:] 当然可以，没有规定说循环终不能释放资源啊 if (ptr != NULL) {     free(ptr);     ptr = NULL; } while(1)后面的代码什么时候走到？[/quote][/quote] 哈哈，不要晕，是while(1){}的后面，没有说明白[/quote][/quote] 受教受教了 大牛不要激动嘛，激动的就不好做大牛了哦


Question: 关于运算优先级

引用 4 楼 weixin_44813559的回复:[quote=引用 1 楼 少爷！的回复:]括号优先级最高，而––运算符出现在变量后面的意思是让变量先进行其他运算，再自减 可以举个用到自减比减法运算级别高这个知识点的例子吗？[/quote] ––a–b 先自减在减b

弄清楚 表达式的值和操作数的值 b-- 求值结果是b  这是表达式b--的结果 不用考虑b有没有减1 什么时候减1 看不懂你就拆分 int tmp = b--; a - tmp

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

引用 1 楼 少爷！的回复:括号优先级最高，而––运算符出现在变量后面的意思是让变量先进行其他运算，再自减 可以举个用到自减比减法运算级别高这个知识点的例子吗？

++在前，先自增，再计算表达式 ++再后，则先计算表达式，最后再自增

和运算优先级没有关系，关键点在于是b--还是--b b--这条语句中b还是原始值，语句结束后b=b-1 --b这条语句中b=b-1

括号优先级最高，而––运算符出现在变量后面的意思是让变量先进行其他运算，再自减


Question: 新人求问

temp=s就是保存s的首地址 whlie遇到*s==0才退出，s++就是指针一直增加 所以s-temp-1就是计算和首地址距离，所以就是字符串s的长度

计算字符串长度


Question: c语言数组越界读取错误花式搞事

引用 8 楼 coo135的回复:楼主，仔细看了你的代码，主要的毛病是你没用弄明白变量的作用域。 例如在char *  generateKey(char  * key) 函数中，你返回的是：	return *k;	 k = keyGroup;而char keyGroup[16][17];定义在函数中，一但函数返回，k所指向的内容存在不确定性。有一下几种可能：1、被系统收回，出现非法操作；2、分配给其它对象覆盖，出现乱码；3、正常。所以，返回一个局部变量的指针是错误的！！！ 你在char * makeGroup(char plaintext[100]) 函数中也是如此。 了解，改过来了

了解。之前不太懂，改过来了

引用 6 楼 qybao 的回复:%s打印char数组，就是打印从数组首地址开始到‘\0’结束这一段内存空间的内容（例如你把字符串中间的字符改成‘\0’再打印试试，肯定只输出前半部，‘\0’以后的内容丢失，但是内存里的内容并不会丢失），所以你要这么打印的话就自己控制好‘\0’。如果你做过c通信方面的开发，就不会觉得奇怪了，因为底层的通信都是把struct转成char[]字节来传输的。我大概了解了，谢谢

#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

引用 3 楼 qybao的回复:用外部变量的或者用new，malloc申请内存（自己申请就要自己释放）。方法内部的数组只是在方法栈内有效，方法结束后栈被回收释放，原来栈内的数组属于垃圾内存 大佬，我想问一下，函数里面的数组和其他整形数，空间是连续分配的吗，为什么地址是连续的？像上面那个函数里面定义的数组和一个int变量。数组里面放的就是个字符串，没有给它设置结束符"\0"，用%s输出这个数组，会把后面那个int类型数字也一起输出。比如数组是csdn，数字是1，不设置结束符，打印csdn会显示csdn1。

引用 1 楼 qybao的回复:太长没细看，你的函数返回的指针都是函数内部变量，函数结束后就被回收了，你这都是隐藏的炸弹 意思是要从外部传指针进来再返回？多设置一个指针作为属性，然后返回这个指针。为什么我返回数组的名字不行。不是说单个数组名就等于首地址么


Question: long double 加减法计算精度问题

浮點數的實現方式是指數式的，所以不會每一位都精確。自己實現一個精確的浮點數，思路可以這樣：整數和小數分別用長整數表示，如果需要精度更高，也可能長整數達不到要求，可以用多個長整數，不過進位等方面就比較複雜了。

浮点数格式 http://bbs.csdn.net/topics/390676437

自己用数据结构实现 引用 2 楼 charles_great 的回复:怎么算呢？ 引用 1 楼 老马何以识途 的回复:這是跟浮點數的存儲和表達方式有關的，如果你需要每一個小數位的精確，需要另外的算法。


Question: 新人学生求解一个在转换十六进制字符串到十进制时遇到的问题，用vs2017写的

仅供参考：#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汉


Question: c经典问题汇总

如果是总结分享建议放到博客里：） 还有你这程序不能找到全解，只能找到一个解，可以再优化下


Question: 1＜＝1是真还是假？

1<=1是真，y++是先执行操作后自增，你是不是在自增之前就进行操作了呀，如果打印y++的值是原值哦，打印后才自增的

这个问题，数学老师应该知道

反证法：若１<= 1为假，１>1则为真，而１>1实则为假，因此1<=1为真。

1<=1 读作1不大于1

1 <= 1可以分解为： 1 < 1 || 1 == 1

不要怀疑常识，所以一定是你哪里搞错了


眼睛瞎了，能不能打字给我们描述


Question: 用离散公式求解

一声叹息，问题都表达不清楚

就是这样的题目...求大神


Question: c++求帮助 需要大佬帮忙看下

float result = 1.0; if (m > n && n > 0) { 	for (int i = m; i > 0; i --) { 		result *= i; 		if (i <= n) 			result /= i; 		if (i <= (m - n); 			result /= i; 	} } 这个是纯循环的用法

刚手算了下，你应该是p=m!/(n! * (m-n)!) 那结果应该是factorial(m) * 1.0 / (factorial(n) * factorial(m - n)); 因为你要的结果是浮点数，需要乘上1.0

p=m!/n!(m-n)!这段表示 p=m!/(n! * (m-n)!)还是p=(m!/n!)*(m-n)!

引用 3 楼 weixin_44810984的回复:[quote=引用 1 楼 轻箬笠的回复:]long factorial(int n) {   if (n < 2) return n;   return n * factorial(n - 1); }  你要的结果应该就是 factorial(m) / factorial(n) * factorial(m - n); 求p=m!/n!(m-n)!的值，其中m与n为两个整数，且要求m>n， 输出为单浮度精点，当m=12，n=8时 出去结果为495.000000  用循环  嘿嘿[/quote] 这个我写了好几遍 但是输入程序不对

引用 1 楼 轻箬笠的回复:long factorial(int n) {   if (n < 2) return n;   return n * factorial(n - 1); }  你要的结果应该就是 factorial(m) / factorial(n) * factorial(m - n); 求p=m!/n!(m-n)!的值，其中m与n为两个整数，且要求m>n， 输出为单浮度精点，当m=12，n=8时 出去结果为495.000000  用循环  嘿嘿

哦哦好的呢 谢谢啦 嘿嘿


Question: c语言 命令行参数求助

是说写入文件的函数吗？比如 fprintf ?   #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) {     if (2 == argc)     {          FILE *fp;         char fname[100];         strcpy(fname, argv[1]);          printf(">>> File write process starts. >>>\n");         if ((fp = fopen("1.txt", "wt")) == NULL)         {             puts("Failed to open file 1.txt\n");             exit(0);         }          //fputs(fname, fp);         fprintf(fp,"%s",fname);          fclose(fp);          printf(">>> File write process ends. >>>\n");          printf(">>> File read process starts. >>>\n");          if ((fp = fopen("1.txt", "rt")) == NULL)         {             puts("Failed to open file 1.txt\n");             exit(0);         }          int ch;         while ((ch = fgetc(fp)) != EOF)         {             putchar(ch);         }         puts("\n");          fclose(fp);          printf(">>> File read process ends. >>>\n");     }     else     {         printf("Wrong input...\n");         printf("Command usage: 'Command<space>stringasfilename<enter>'\n");         return -1;     }      return 0; }

www谢谢各位大佬，解决了解决了

printf("%s\n", filename);

看错了，写文件可以用fputs http://www.runoob.com/cprogramming/c-file-io.html


Question: c语言中如何求一串数据中指定范围内数的和？

仅供参考，还有，你的题目前后矛盾，题目说21结尾实际是aa结尾，sum到底是2-5数字和还是2-6数字和 #include <stdlib.h>  int main() {     int a[6];     scanf("01 %d %d %d %d %d %d aa", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]);     a[5] = (a[0] + a[1] + a[2] + a[3] + a[4]);     printf("01 %d %d %d %d %d %d aa\n", a[0], a[1], a[2], a[3], a[4], a[5]);     return 0; }


Question: 声明变量的问题

谢谢，大哥的火眼金睛

报错的文件的名字是「4.c」，你把「5.c」打开作甚？  去打开 「4.c」文件 看看吧！

楼上应该真相了。。。。。。。 表扬楼主，终于有人能发看得清的图了


Question: #include "graph.c"无法找到原文件怎么办

引用 4 楼 user-1 的回复:[quote=引用 1 楼 weixin_42163912 的回复:] 再就是#include<graphics.h>也出错，但是装了Easyx就好了，但是显示easyx只能在C++里运行，这怎么办？ c和c++可以混合编译 没有问题呀 [/quote] 您是怎么混合编译的呢

百度 extern "C"

引用 1 楼 weixin_42163912 的回复:再就是#include<graphics.h>也出错，但是装了Easyx就好了，但是显示easyx只能在C++里运行，这怎么办？ c和c++可以混合编译 没有问题呀

@luodongshui