Question: VS2017 中难道不需要用extern就可以调用另一个c文件的函数了？

引用 13 楼 liups 的回复:[quote=引用 12 楼 wow334 的回复:] [quote=引用 11 楼 KenYuan2016 的回复:] 编译可以通过，运行就有问题了吧  main.c文件： #include <stdio.h>   int main() {  	haha(); 	return 0;  }   a.c  文件： #include <stdio.h>  void haha(){ 	printf("%s","哈哈"); }  竟然不用在main.c中声明haha()方法,也能正常运行。太奇怪了。[/quote] 测试了一下，VC6和VC2013中都是同样的效果[/quote]  百度了一下，可能是GCC 编译器导致的不需要声明。

引用 12 楼 wow334 的回复:[quote=引用 11 楼 KenYuan2016 的回复:] 编译可以通过，运行就有问题了吧  main.c文件： #include <stdio.h>   int main() {  	haha(); 	return 0;  }   a.c  文件： #include <stdio.h>  void haha(){ 	printf("%s","哈哈"); }  竟然不用在main.c中声明haha()方法,也能正常运行。太奇怪了。[/quote] 测试了一下，VC6和VC2013中都是同样的效果

引用 11 楼 KenYuan2016 的回复:编译可以通过，运行就有问题了吧  main.c文件： #include <stdio.h>   int main() {  	haha(); 	return 0;  }   a.c  文件： #include <stdio.h>  void haha(){ 	printf("%s","哈哈"); }  竟然不用在main.c中声明haha()方法,也能正常运行。太奇怪了。

编译可以通过，运行就有问题了吧

引用 9 楼 wow334 的回复:[quote=引用 8 楼 liups 的回复:] 我感觉不要深究这个的好。 非常规的做法能调用与否不是重点，重点是防止错误的调用  嗯。  只是我初学c语言，如果是vs2017的特别功能，不利于我学c的语法规则啊。[/quote] 按标准的写法来，总是没有错的

引用 8 楼 liups 的回复:我感觉不要深究这个的好。 非常规的做法能调用与否不是重点，重点是防止错误的调用  嗯。  只是我初学c语言，如果是vs2017的特别功能，不利于我学c的语法规则啊。

我感觉不要深究这个的好。 非常规的做法能调用与否不是重点，重点是防止错误的调用

引用 5 楼 至尊宝、 的回复:[quote=引用 楼主 wow334 的回复:] 如题，谢谢！ 如题，谢谢！ 如题，谢谢！函数默认是extern的，变量的话就需要手动extern了[/quote]  问题是我都没有include 另一个文件 ，也没有在要用的地方extern 声明另一个文件的函数啊。

引用 楼主 wow334 的回复:如题，谢谢！ 如题，谢谢！ 如题，谢谢！函数默认是extern的，变量的话就需要手动extern了

引用 3 楼 liups 的回复:[quote=引用 2 楼 wow334 的回复:] [quote=引用 1 楼 liups 的回复:] include也可以吧 是的。  但是我什么也没做就可以在main函数中引用另一个文件中的函数。[/quote] 也许是因为文件加入了工程或项目的原因[/quote] 哦哦，谢谢！   可不可以让VS2017恢复正常的c语言规则？

引用 2 楼 wow334 的回复:[quote=引用 1 楼 liups 的回复:] include也可以吧 是的。  但是我什么也没做就可以在main函数中引用另一个文件中的函数。[/quote] 也许是因为文件加入了工程或项目的原因

引用 1 楼 liups 的回复:include也可以吧 是的。  但是我什么也没做就可以在main函数中引用另一个文件中的函数。

include也可以吧


Question: 代码没有错误，为什么就是运行不出来啊？？？

引用 4 楼 珰珰珰 的回复:谢谢，但我的目的是输出每一趟排序后的结果 那就把  注释掉 你原先的输出语句的注释符号去掉就好了呀。 上面不是没给你删除，只是注释掉了而已么？ ～

引用 2 楼 拥抱Linux 的回复:简单改了一下，具体说明见注释，  #include <stdio.h>  #define MAXL 100 //定义表中最多记录个数  typedef int KeyType; typedef char InfoType[10]; typedef struct { 	KeyType key; //KeyType为关键字的数据类型 	InfoType data; //其他数据 } RecType; typedef RecType SeqList[MAXL]; //顺序表类型  int partition(RecType R[], int s, int t) { 	int i = s, j = t; 	RecType tmp = R[i]; 	while (i < j) {                 // 原来的代码，while圆括号后面多了一个分号 		while (j > i && R[j].key >= tmp.key) { 			j--; 		} 		R[i] = R[j];                 // 原来的代码，while圆括号后面多了一个分号 		while (i < j && R[i].key <= tmp.key) { 			i++; 		} 		R[j] = R[i]; 	} 	R[i] = tmp; 	return i; }  void QuickSort(RecType R[], int s, int t) { 	int i, n; 	if (s < t) {                 // 原来的代码，partrtion赋值给了变量i，可是后面又多出来了一个for循环使用了变量i                 // 等于这个partition的赋值就没有起作用了 		n = partition(R, s, t); 		/* 		for (i = 0; i < t + 1; i++) { 			printf("%d ", R[i].key); 		} 		printf("\n");                 */                 // 下面两行语句需要使用前面的partition的返回值 		QuickSort(R, s, n - 1); 		QuickSort(R, n + 1, t); 	} }  int main(void) { 	SeqList R; 	int a[] = { 6, 8, 7, 9, 0, 1, 3, 2, 4, 5 }, i, n = 10; 	for (i = 0; i < n; i++) //建立顺序表 		R[i].key = a[i]; 	printf("序列:"); 	for (i = 0; i < n; i++) 		printf("%d ", R[i].key); 	printf("\n"); 	printf("使用快速排序算法\n"); 	QuickSort(R, 0, 9);          // 打印最终排序后的结果 	for (int k = 0; k < n; k++) { 		printf("%d ", R[k].key); 	}  	return 0; }  ～  谢谢，但我的目的是输出每一趟排序后的结果

另外你在函数递归的时候是不是一直在掉自己执行，什么时候程序结束也就是说什么时候递归才停止，并没有判断，

partition函数中的这段代码                 while((j>i) && (R[j].key>=tmp.key));                 j--;                 R[i]=R[j];                 while((i<j )&& (R[i].key <= tmp.key));                 i++;                 R[j]=R[i]; 进入了第二个while的死循环。


Question: C语言程序转换为单片机汇编程序，急求，非常感谢！

不明白为什么要汇编？当年我们没有C51这些工具时很苦的！ 如果是C51好象直接可以转换成汇编的，看这里： https://zhidao.baidu.com/question/433033708.html


Question: 求一个点阵图相似度算法，如电子表数字识别。

怎么没有人给点建议啊，必要ai学习，普通算法啊，提供点建议吧

端午节祝福大家。继续顶上去。望人来给点建议，就是简单普通算法，不要硬塞去学习。

我都一直看啊，我不是要人家全教你，说点相关的一个链接也行啊。如果自己没有看点书，学点，怎么知道从两点斜率下手啊。这论坛不会是总是发点，诶你吃饭没有吧。有时候给一个关键字都很起到作用。不像你说的。

这种就是要看书从头学起的嘛看视频也行，别人在这里也没办法把全部教给你呀

求好心人给点料，普通算法，不要动不动就学习啊。如果两点斜率，再统计不同地方等。

像这个跟数字点阵图识别应该有相似啊。普通算法有没有啊？一维信号可以相关系数，但是这个是二维，有什么好算法像相关系数啊？因为棋盘上的点变化无常，但是点数又不多，像这个应该无效用到学习吧？希望大家指点下。

翠花，上卷积神经网络

如果是通用的一般是找3个最明显的特征点来定位旋转的角度 单独就这个问题可以简单的用重心方式来确定

桂花，上OpenCV！


Question: 在堆内存中找到数据是否只有这两种方式？

堆上的内存，要看你申请的对上空间是连续的还是不连续的，比如你在堆上一次申请一块内存， 那么可以像使用数组那样访问堆上的这块内存，如果你是编写链表（内存可能不连续），那么 就需要通过next/prev节点去访问和查找堆上的内存位置。

存储数据结构本来就和堆内存没有任何关系 内存就像是盒子，在盒子里放什么和盒子本身有关么？并没有

MSDN98中的例子walker又名pwalk。 完整列出指定进程的内存使用情况，显示进程地址空间内容，装载哪些DLL，代码、数据、堆栈段分配在何处，可以用来检测内存泄漏，监测内存使用。http://download.csdn.net/detail/zhao4zhong1/3667896

假中堆内存地址编号是0-0xff 0 a 1 b 2 c 3 d 4 5 5 6 . . . ff 内存表现只能是地址0的数据，地址1的数据，至于链表，你得先确定他是个链表，地址4存的是5，可以代表是数据5，也可以认为是一个针向5地址的指针，应该说堆中找数据，只有地址，数据，也就是你说的单独的指针，所有的数据只能通过指针去找。


Question: 卡布列克 运行出错可以帮忙改改不

https://blog.csdn.net/qq_38375538/article/details/74080135 看看别人写的吧

首先先学会描述问题，运行出错是什么？与预期结果不符？程序异常退出？

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

好的 我懂了 谢谢


Question: dbgView在 win10 32位和win7 64上无法显示驱动中DbgPrint输出的日志，已经按照网上的操作，添加注册表中的值了，依旧不能显示，在win7

引用 4 楼 Eleven的回复:你驱动中输出log这样写，DbgViewer就可以看到了。 DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, ...);   enum DBG_LEVEL { INF = 0x0, WRN, ERR };    #define	DUMP(level, lpszFormat, ...)						DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[DRV] : " ## lpszFormat ## "\n", __VA_ARGS__)   谢谢，好像不是这个原因，我做的是驱动开发，我是在系统睡眠唤醒时捕捉日志的，就是捕捉不到，唤醒后就能捕捉到，应该是唤醒时先唤醒kernal，然后才唤醒dbgView，因此捕捉不到

引用 1 楼 user-3的回复:以前搜到的信息，参考一下  DbgView 4.81 Win10修正版 DbgView在Windows10里面有一个小bug：关闭DbgView，第二次启动时无法Capture Kernel。  这是因为DbgView在释放dbgv.sys时写入失败。  Win10新增了一个限制，驱动加载到内核后是不允许修改文件的。 而在以前的Windows版本中驱动加载后文件是可以删除或修改的。  因此对DbgView.exe稍微修改了一下，写入dbgv.sys失败时提示且不退出正常逻辑。  具体修改内容是 .text:004051AC                 jnz     short loc_4051F8 改成了 .text:004051AC                 jmp    short loc_4051F8  filepos: 45ac                      75(jnz) -> EB(jmp)                                                                  mengxp                                                                 2016-12-3 ------------ 原版DebugView在Win10下经常报错，需要到"C:\Windows\System32\drivers"中找到"dbgv.sys"，删除它，再使用"管理员身份"运行该软件。 我的应该不是这个版本，在win7 32位上能正常显示驱动内核日志，但在win7 64和win10上无法显示内核日志，是不是64位系统上要使用64位的dbgView？

把这个打钩就行了


Question: 求改错那里有错误

scanf("%f",st[i].score[j]); 这一句应该加一个&

scanf你都没有使用&符号取地址咧

#include <stdio.h>  struct stud {     char name[30];     float score[4];     float total;     float average; };  int main(void) {     struct stud  st[5];     int  i,j;      for(i=0;i<5;i++)     {         scanf("%s",st[i].name);         for(j=0;j<4;j++)             //scanf("%f",st[i].score[j]);             scanf("%f", &st[i].score[j]);      }      for(i=0;i<5;i++)     {         st[i].total=0;         for(j=0;j<4;j++)             st[i].total += st[i].score[j];         st[i].average = st[i].total/4;         printf("%.1f\n", st[i].average);     }     return 0; }  供参考～


Question: 急急急，求大佬！！

两种方法，一种就是几个printf语句就可以了。另一种就是for循环就可以了。这是C的基础知识哦！

先找出行号和空格数的关系，找到这个关系后就很容易写代码了，当然C语言基础得需要熟悉了。

引用 6 楼 636f6c696e的回复:你是麻瓜么。。。自己根据需要加几个空格不就好了 [quote=引用 5 楼 西北✔ 的回复:] [quote=引用 2 楼 user-6的回复:]printf("*****"); printf(" *****"); printf("  *****"); printf("   *****"); printf("    *****"); *****    *****        *****            *****               ***** 最后是这样嘛，大哥[/quote][/quote] 刚学，啥都不会。。。。

for (int i = 0; i != 5; ++i) 	{ 		printf("%*s*****\n",i*2,""); 	}

你是麻瓜么。。。自己根据需要加几个空格不就好了 引用 5 楼 西北✔ 的回复:[quote=引用 2 楼 user-6的回复:]printf("*****"); printf(" *****"); printf("  *****"); printf("   *****"); printf("    *****"); *****    *****        *****            *****               ***** 最后是这样嘛，大哥[/quote]

引用 2 楼 user-6的回复:printf("*****"); printf(" *****"); printf("  *****"); printf("   *****"); printf("    *****"); *****    *****        *****            *****               ***** 最后是这样嘛，大哥

两层for循环不就行了

这样子的 *****    *****        *****            *****               *****


Question: DFT简洁计算问题

一种结合DFT和FFT的实用傅里叶变换算法  可以百度一下，和这个反向的算法，已经稍有眉目了，还在研究， FFTW3库我查下再说

直接用fftw3库来算啊 何必自己造轮子呢,还没别人造得好 可以支持任意点数的fft运算

FFT只限于2^n数量的数据才能用的， 不知道你是在哪看的方法呢


Question: 删除一个字符数组当中的其中一个元素然后输出，被删除的元素用键盘输入，（1）主函数完成被删除元素的输入，数组元素输入以及删除后数组元素的输出。（2）删除功能用子函

起码自己写写，要现成的是需要付出费用的，别想着天上总会掉馅饼

哦


Question: C语言 汇编混编 数组传参问题  帮忙看看

可以学学这些排序算法 sort函数排序 https://blog.csdn.net/weixin_43956598/article/details/90241551 冒泡排序 https://blog.csdn.net/weixin_43956598/article/details/90176251 选择排序 https://blog.csdn.net/weixin_43956598/article/details/90178197 插入排序 https://blog.csdn.net/weixin_43956598/article/details/90181567 快速排序 https://blog.csdn.net/weixin_43956598/article/details/90215135 希尔排序 https://blog.csdn.net/weixin_43956598/articledetails/90234480 堆排序https://blog.csdn.net/weixin_43956598/article/details/90343547

引用 6 楼 Intel0011 的回复:a没有解释为地址，所以用lea ebx, a p解释为地址了，所以用mov ebx, p一语道破天机  非常感谢！！！

这个结果是对的 #include <stdio.h>  int main(void) {    int i;    int a[]={5,-8,9,4,1};    int *sort(int *p);        sort(a);        for (i = 0; i <= 4; i++)    {       printf("\t%d", a[i]);    }    printf("\n");    getchar();    return 0; }  int *sort(int *p) {    int n=5;    _asm    {       //pushad       mov ebx,p       mov ecx,n       dec ecx    loop1:       mov edx,ecx       mov esi,0    loop2:       mov eax,[ebx+esi]       cmp eax,[ebx+esi+4]       jge next       xchg eax,[ebx+esi+4]       mov [ebx+esi],eax    next:       add esi,4       loop loop2       mov ecx,edx       loop loop1       //popad    }    return p; }

#include <stdio.h>  int main(void) {    int i;    int a[]={5,-8,9,4,1};    int *sort(int *p);        sort(a);        for (i = 0; i <= 4; i++)    {       printf("\t%d", a[i]);    }    printf("\n");    getchar();    return 0; }  int *sort(int *p) {    _asm    {       //pushad       mov ebx,p // <-- lea ebx, p       mov ecx,5       dec ecx    loop1:       mov edx,ecx       mov esi,0    loop2:       mov eax,[ebx+esi]       cmp eax,[ebx+esi+4]       jge next       xchg eax,[ebx+esi+4]       mov [ebx+esi],eax    next:       add esi,4       loop loop2       mov ecx,edx       loop loop1       //popad    }    return p; }

你应该看一下return 这句在C函数里编译做了什么，C函数调用返回结果在eax中,你可以返回之前打印eax和返回之后的p出来和返回的结果对比一下,你这个可以定义成void sort(*p)最后不用返回

引用 1 楼 Intel0011的回复:1. 保存和恢复寄存器，因为系统会改写eax等寄存器 2. 循环中不能简单使用sort(a)，返回的是一个指针，并未随循环而变化 int main(void) {    int i;    int a[]={5,-8,9,4,1};    int *sort(int *p);        sort(a);        for (i = 0; i <= 4; i++)    {       printf("\t%d", a[i]);    }    printf("\n");    return 0; }  int *sort(int *p) {    int n=5;    _asm    {       pushad       lea ebx,p       mov ecx,n       dec ecx    loop1:       mov edx,ecx       mov esi,0    loop2:       mov eax,[ebx+esi]       cmp eax,[ebx+esi+4]       jge next       xchg eax,[ebx+esi+4]       mov [ebx+esi],eax    next:       add esi,4       loop loop2       mov ecx,edx       loop loop1       popad    }    return p; } #else int main(void) {    int i;    int a[]={5,-8,9,4,1};    int n=5;        _asm    {       lea ebx,a       mov ecx,n       dec ecx    loop1:       mov edx,ecx       mov esi,0    loop2:       mov eax,[ebx+esi]       cmp eax,[ebx+esi+4]       jge next       xchg eax,[ebx+esi+4]       mov [ebx+esi],eax    next:       add esi,4       loop loop2       mov ecx,edx       loop loop1    }        for (i = 0; i <= 4; i++)    {       printf("\t%d", a[i]);    }    printf("\n");    return 0; }  修改之后还是不能实现功能。。。。能帮我再改改么


Question: c++二叉树

建议用C++的新特性定义结构（和类其实区别不多） typedef struct ThrTreeNode {//线索化二叉树类型 int info;  int ltag, rtag;//左右线索 struct ThrTreeNode *llink, *rlink;//左右后继  ThrTreeNode()//new 的时候自动调用构造函数,减少重复代码 { info=0; ltag=0; rtag=0; llink=NULL; rlink=NULL; };  };

好的谢谢两位大佬了，是我才疏学浅，万分感谢！

指针是无法修改自身的，但你可以通过这个指针修改它的成员，我用递归写了两种方法你可以对比一下  #include <iostream> #define num 500//二叉树结点最大个数 using namespace std;  struct ThrTreeNode {//线索化二叉树类型 	int info; 	int ltag, rtag;//左右线索 	struct ThrTreeNode* llink, * rlink;//左右后继 };  ThrTreeNode* insertTree(struct ThrTreeNode**, int);//给二叉树赋值  int main() { 	struct ThrTreeNode* T = NULL;//创建空线索二叉树根 	int data[num]; 	int i; 	for (i = 0; i < num; i++) { 		data[i] = -1; 	} 	cout << "请输入您想存入此线索二叉树的一组数据（个数小于500）："; 	for (i = 0; i < num; i++) {//输入线索二叉树各结点的值 		cin >> data[i]; 		if (cin.get() == '\n') 			break; 	} 	i = 0; 	while (data[i] != -1) {//初始化二叉树 		T=insertTree(&T, data[i]); 		i++; 	} 	return 0; }  ThrTreeNode* insertTree(struct ThrTreeNode** T, int a) {//初始化二叉树 	if (*T == NULL)			//由于要修改T的值，所以用ThrTeeNode** 		*T = new ThrTreeNode({ a,0,0,NULL,NULL }); 	else { 		if (a > (*T)->info)  			(*T)->rlink = insertTree(&(*T)->rlink, a);	 		else 			(*T)->llink = insertTree(&(*T)->llink, a); 	} 	return *T; } [code=c] #include <iostream> #define num 500//二叉树结点最大个数 using namespace std;  struct ThrTreeNode {//线索化二叉树类型 	int info; 	int ltag, rtag;//左右线索 	struct ThrTreeNode* llink, * rlink;//左右后继 };  ThrTreeNode* insertTree(struct ThrTreeNode*, int);//给二叉树赋值  int main() { 	struct ThrTreeNode* T = NULL;//创建空线索二叉树根 	int data[num]; 	int i; 	for (i = 0; i < num; i++) { 		data[i] = -1; 	} 	cout << "请输入您想存入此线索二叉树的一组数据（个数小于500）："; 	for (i = 0; i < num; i++) {//输入线索二叉树各结点的值 		cin >> data[i]; 		if (cin.get() == '\n') 			break; 	} 	i = 0; 	while (data[i] != -1) {//初始化二叉树 		T=insertTree(T, data[i]); 		i++; 	} 	return 0; }  ThrTreeNode* insertTree(struct ThrTreeNode* T, int a) {//初始化二叉树 	if (T == NULL)		 		T = new ThrTreeNode({ a,0,0,NULL,NULL }); 	else { 		if (a > T->info)		//这里通过返回值修改T的左右孩子，并未修改T 			T->rlink = insertTree(T->rlink, a);	 		else 			T->llink = insertTree(T->llink, a); 	} 	return T; }   [/code]

引用 楼主 jiliangsui 的回复:有没有大佬帮我看看我这个简单的二叉树赋值到底哪里不对啊，系统一直提示NULL指针的，但是我明明new分配空间了啊 ！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！1  #include <iostream> #define num 500//二叉树结点最大个数 using namespace std;  struct ThrTreeNode {//线索化二叉树类型 	int info; 	int ltag, rtag;//左右线索 	struct ThrTreeNode *llink, *rlink;//左右后继 };  void insertTree(struct ThrTreeNode*, int);//给二叉树赋值  int main(){ 	struct ThrTreeNode* T = NULL;//创建空线索二叉树根 	int data[num]; 	int i; 	for (i = 0; i < num; i++) { 		data[i] = -1; 	} 	cout << "请输入您想存入此线索二叉树的一组数据（个数小于500）："; 	for (i = 0; i < num; i++) {//输入线索二叉树各结点的值 		cin >> data[i]; 		if (cin.get() == '\n') 			break; 	} 	i = 0; 	while (data[i] != -1) {//初始化二叉树 		insertTree(T, data[i]); 		i++; 	} }  void insertTree(struct ThrTreeNode* T, int a) {//初始化二叉树 	struct ThrTreeNode* p = T; 	if (p == NULL) {//对线索二叉数的根赋值 		p = new struct ThrTreeNode; 		p->info = a; 		p->ltag = 0;//未线索化前，左右线索值默认为0 		p->rtag = 0; 		p->llink = NULL; 		p->rlink = NULL; 	} 	else {                      //添加临时指向父节点的指针                           struct ThrTreeNode* parent=NULL;                            int leftorright=0; 		while (p != NULL) { parent=p;  			if (a > p->info) {//若该值大于该结点值，进入其右子树                                 				p = p->rlink;                                                                 leftorright=0; 			} 			else//若该值小于等于该结点值，进入其左子树 			p = p->llink;                         leftorright=1; 		} p = new struct ThrTreeNode;  if(leftorright>0) { 		parent->llink=p; } else { 	        parent->rlink=p;  } 		p->info = a; 		p->ltag = 0;//未线索化前，左右线索值默认为0 		p->rtag = 0; 		p->llink = NULL; 		p->rlink = NULL; 	} }  p=p->llink;重新分配p并不影响原来p->llink的指向，他指向的还是NULL

T的info是正常的，但是T的llink和rlink全是NULL值

大佬我照着你的这个做，还是报错NULL指针啊啊，我原来做的一个学生管理系统也是我这种方法做的，就可以。。。我也不知道为什么。。。

引用 3 楼 jiliangsui 的回复:还有我照着你的改了用二重指针改一重指针，但还是报错null 你的操作就像是拿纸把图书馆的地址给记下来，然后自己用橡皮擦擦了纸上的内容重写，难道图书馆会因为你那张纸而改变地址？你这是在自欺欺人

p只是一个用来存地址的指针，你只是修改了p存的地址，不是修改所存地址的内容  #include <iostream> #define num 500//二叉树结点最大个数 using namespace std;  struct ThrTreeNode {//线索化二叉树类型 	int info; 	int ltag, rtag;//左右线索 	struct ThrTreeNode* llink, * rlink;//左右后继 };  void insertTree(struct ThrTreeNode**, int);//给二叉树赋值  int main() { 	struct ThrTreeNode* T = NULL;//创建空线索二叉树根 	int data[num]; 	int i; 	for (i = 0; i < num; i++) { 		data[i] = -1; 	} 	cout << "请输入您想存入此线索二叉树的一组数据（个数小于500）："; 	for (i = 0; i < num; i++) {//输入线索二叉树各结点的值 		cin >> data[i]; 		if (cin.get() == '\n') 			break; 	} 	i = 0; 	while (data[i] != -1) {//初始化二叉树 		insertTree(&T, data[i]); 		i++; 	} 	return 0; }  void insertTree(struct ThrTreeNode** T, int a) {//初始化二叉树 	struct ThrTreeNode* p = *T; 	if (p == NULL) {//对线索二叉数的根赋值 		p = new struct ThrTreeNode; 		p->info = a; 		p->ltag = 0;//未线索化前，左右线索值默认为0 		p->rtag = 0; 		p->llink = NULL; 		p->rlink = NULL; 		*T = p; 	} 	else { 		while (p != NULL) { 			if (a > p->info) {//若该值大于该结点值，进入其右子树 				p = p->rlink; 			} 			else//若该值小于等于该结点值，进入其左子树 				p = p->llink; 		} 		p = new struct ThrTreeNode; 		p->info = a; 		p->ltag = 0;//未线索化前，左右线索值默认为0 		p->rtag = 0; 		p->llink = NULL; 		p->rlink = NULL; 	} }

还有我照着你的改了用二重指针改一重指针，但还是报错null

这个时候难道不是p和T指向的是同一个结点吗，修改了p也就修改了T，我们老师原来这么说的，看了你的博文，我还是怎么觉得，qaq。。。

修改insert函数，看注释，对指针的理解不是很清楚，其实把初始化和insert分开是最好的 我写了一篇简述指针的博文，你看一下有没有帮助 https://blog.csdn.net/qq_40946921/article/details/90047918  void insertTree(struct ThrTreeNode** T, int a) {	//因为根结点是new出来的，即修改了根节点的值，所以要用根节点的指针 	struct ThrTreeNode *p = *T; 	if (p == NULL) { 		p = new struct ThrTreeNode; 		p->info = a; 		p->ltag = 0; 		p->rtag = 0; 		p->llink = NULL; 		p->rlink = NULL; 		*T = p;		/*你这里需要修改T，因为上方你已经将p（不是T）重新赋值*/ 	} 	else { 		while (p != NULL) { 			if (a > p->info) { 				p = p->rlink; 			} 			else 				p = p->llink; 		} 		p = new struct ThrTreeNode; 		p->info = a; 		p->ltag = 0;//未线索化前，左右线索值默认为0 		p->rtag = 0; 		p->llink = NULL; 		p->rlink = NULL; 	} }


Question: 小白求教c 用指针数组实现成绩查询和输出学生信息

引用 12 楼 拥抱Linux 的回复：[quote=引用 11 楼 FAM^刘丽丽 的回复:] 咋给分兄弟 今天第一次发帖 电脑的浏览器里登录csdn论坛，打开自己的帖子，在标题旁边可以看到「结帖」、「给分」等提示框。 具体的 「给分」文本框是出现在每层楼层的回答旁边的。[/quote]ok我尽快

引用 11 楼 FAM^刘丽丽 的回复:咋给分兄弟 今天第一次发帖 电脑的浏览器里登录csdn论坛，打开自己的帖子，在标题旁边可以看到「结帖」、「给分」等提示框。 具体的 「给分」文本框是出现在每层楼层的回答旁边的。

引用 10 楼 拥抱Linux 的回复：[quote=引用 9 楼 FAM^刘丽丽 的回复:] 学号是那种大学学号哈哈 不过我懂老哥意思了 秒懂 再次谢谢老哥 不用客气。 如果是数字0开头的学号的话，就没法用 int 类型来保存了，还是应该用字符数组来保存。如果学号位数太长，超出 int 型的取值范围的话， 也需要考虑其它类型来保存 学号 数据，比如使用 long 型 或者 字符数组等。 ～ 如有帮助，欢迎 及时 结帖、给分。：-） ～[/quote]咋给分兄弟 今天第一次发帖

引用 9 楼 FAM^刘丽丽 的回复:学号是那种大学学号哈哈 不过我懂老哥意思了 秒懂 再次谢谢老哥 不用客气。 如果是数字0开头的学号的话，就没法用 int 类型来保存了，还是应该用字符数组来保存。如果学号位数太长，超出 int 型的取值范围的话， 也需要考虑其它类型来保存 学号 数据，比如使用 long 型 或者 字符数组等。 ～ 如有帮助，欢迎 及时 结帖、给分。：-） ～

引用 8 楼 拥抱Linux 的回复：[quote=引用 7 楼 FAM^刘丽丽 的回复:] 老哥那个我flag那里的意思是当检测到空格的时候就不进行循环，因为学生的信息要求名字和学号，我输入的时候每输入一个人的名字和学好之间是有空格的，请问这样想有错误吗 （1）根据你的代码，如果名字的字符串本身中间没有空格的话，就没必要去检查空格字符。 你原先用的输入函数是gets，它会把一行输入的所有字符都作为一整个字符串来处理，除非遇到回车。而且在上面的注释里也说了，编译器对gets函数提出了警告，认为它是一个危险函数，容易引起问题，所以俺把所有的gets都给换成了scanf函数。 （2）按你代码的逻辑，输入的时候，第一个for循环只是输入数字啊，应该就是你预想的学号吧？ 然后第二个for循环是只是输入名字啊，名字本身如果内部没有空格的话，直接 scanf("%s",数组名) 是没问题的啊，不同的字符串之间在输入的时候用空格来分隔也没问题。 那就没必要检查什么空格了呀。但是for循环一定要给一个确定的结束条件，所以应该以字符串末尾的结束字符'\0'作为结束条件。 （3）其它楼层有人给出了C自带的库函数<string.h>中的字符串比较函数strncmp，你有兴趣的话可以了解一下、试一试。但是，如果自己能完成字符串的比较的话，对字符串的理解会更有帮助吧。 ～[/quote]学号是那种大学学号哈哈 不过我懂老哥意思了 秒懂 再次谢谢老哥

引用 7 楼 FAM^刘丽丽 的回复:老哥那个我flag那里的意思是当检测到空格的时候就不进行循环，因为学生的信息要求名字和学号，我输入的时候每输入一个人的名字和学好之间是有空格的，请问这样想有错误吗 （1）根据你的代码，如果名字的字符串本身中间没有空格的话，就没必要去检查空格字符。 你原先用的输入函数是gets，它会把一行输入的所有字符都作为一整个字符串来处理，除非遇到回车。而且在上面的注释里也说了，编译器对gets函数提出了警告，认为它是一个危险函数，容易引起问题，所以俺把所有的gets都给换成了scanf函数。 （2）按你代码的逻辑，输入的时候，第一个for循环只是输入数字啊，应该就是你预想的学号吧？ 然后第二个for循环是只是输入名字啊，名字本身如果内部没有空格的话，直接 scanf("%s",数组名) 是没问题的啊，不同的字符串之间在输入的时候用空格来分隔也没问题。 那就没必要检查什么空格了呀。但是for循环一定要给一个确定的结束条件，所以应该以字符串末尾的结束字符'\0'作为结束条件。 （3）其它楼层有人给出了C自带的库函数<string.h>中的字符串比较函数strncmp，你有兴趣的话可以了解一下、试一试。但是，如果自己能完成字符串的比较的话，对字符串的理解会更有帮助吧。 ～

引用 2 楼 拥抱Linux 的回复：简单改了一下：  #include <stdio.h> #include <string.h>  void paixue(int *p1, char *inf[]); void search(char *p1, int *p2, char *inf[]);  int main(void) { 	int i, a[5]; 	char inf1[5][10], *inf[5], name[10]; 	// 把所有的gets函数都换成了scanf函数，编译器提醒使用gets函数比较危险         for (i = 0; i < 5; i++) 		scanf("%d", &a[i]); 	for (i = 0; i < 5; i++) 		scanf("%s",inf1[i]); 	for (i = 0; i < 5; i++) 		inf[i] = inf1[i]; 	paixue(a, inf); 	scanf("%s",name); 	search(name, a, inf); 	return 0; }  void paixue(int *p1, char *inf[]) { 	int i, j, t; 	char *temp; 	for (i = 0; i < 4; i++) 		for (j = i + 1; j < 5; j++) 			if (*(p1 + j) > *(p1 + i)) {                                 // 建议定义一个结构体，交换变量的时候，结构体变量可以直接赋值 				t = *(p1 + i); 				*(p1 + i) = *(p1 + j); 				*(p1 + j) = t; 				temp = inf[i]; 				inf[i] = inf[j]; 				inf[j] = temp; 			} }  void search(char *p1, int *p2, char *inf[]) { 	int i, j, flag = 1; 	for (j = 0; j < 5; j++) {                 // 字符串末尾的结束字符是'\0'，不是空格 		for (i = 0; *(p1 + i) != '\0'; i++) 			if (*(p1 + i) != *(inf[j] + i)) { 				flag = 0; 				break; 			} 		if (flag == 1) { 			printf("%-3d", *(p2 + j)); 			printf("%s\n", inf[j]); 		} 		flag = 1; 	} }  说明都写在注释里了。 ～老哥那个我flag那里的意思是当检测到空格的时候就不进行循环，因为学生的信息要求名字和学号，我输入的时候每输入一个人的名字和学好之间是有空格的，请问这样想有错误吗

引用 1 楼 user-3 的回复：char inf1[5][10],*inf[5],name[10]; for(i=0;i<5;i++) scanf("%d",&a[i]); for(i=0;i<5;i++) gets(inf1[i]); for(i=0;i<5;i++) inf[i]=inf1[i]; paixue(a,inf); gets(name); 这一段代码中没有吃掉回车符，导致你的输入有问题，可与选择使用格式化输入函数谢谢老哥

引用 3 楼 拥抱Linux 的回复：还有比较是否相等的运算符是  ==  不是  = 。 上面忘了提了，但是代码里是修改了的。谢谢老哥 这么明显的错误

#include<stdio.h> #include<string.h>      void paixue(int *p1,char *inf[]);     void search(char *p1,int *p2,char *inf[]); void print_info (int *pscore, char *inf[], int n); int main() {     int i,a[5];     char inf1[5][10],*inf[5],name[10];     for(i=0;i<5;i++)         scanf("%d",&a[i]);     getchar();    //for '\n'     for(i=0;i<5;i++)         gets(inf1[i]);     for(i=0;i<5;i++)         inf[i]=inf1[i];     printf("After input: \n");     print_info(a, inf, 5);     paixue(a,inf);     printf("After sort: \n");     print_info(a, inf, 5);     printf("Please input the name: \n");     gets(name);     search(name,a,inf);     return 0; } void paixue(int *p1,char *inf[]) {     int i,j,t;     char *temp;     for(i=0;i<4;i++)         for(j=i+1;j<5;j++)             if(*(p1+j) > *(p1+i))             {                 t=*(p1+i);                 *(p1+i)=*(p1+j);                 *(p1+j)=t;                 temp = inf[i];                 inf[i]=inf[j];                 inf[j]=temp;             } }  void print_info (int *pscore, char *inf[], int n) {     int i;      for (i = 0; i < n; i++) {         printf("%d  ", pscore[i]);         printf("%s\n", inf[i]);     } }  void search(char *p1,int *p2,char *inf[]) {     int i,j,flag=1;     for(j=0;j<5;j++)     {         /*         for(i=0;*(p1+i)!=' ';i++)             if(*(p1+i)!=*(inf[j]+i))             {                 flag=0;                 break;             }         //if(flag=1)         if(flag==1)         {             printf("%-3d",*(p2+j));             printf("%s",inf[j]);         }         flag=1;         */         if (strcmp(p1, inf[j]) == 0) {             printf("%-3d",*(p2+j));             printf("%s\n", inf[j]);         }     } }  供参考！


Question: c语言多线程

可以不用多线程，设计好函数时间分配就可以了两个函数不要用死循环，循环入到两个函数外层，只用一个就行了

我要是没记错的话pthread.h不是windows平台下的头文件，windows下要用windows.h还是什么的

引用 2 楼 gouyanfen的回复:那个是封装的一个线程库，VC6自己设计多线程，并不一定要用pthread，CreateThread就可以了，线程库拥有更多的线程管理和互斥、同步方面的东西,也是封装了原系统支持的东西。 其实多线程我实在是不太懂，请问大神让两个函数同时进行的问题可以不用多线程吗？（用的是easyx 想做一个小人接随机掉落的小球的游戏 怎么让控制小人的同时掉落小球？）

CreateThread为什么要包含<pthread.h>?


Question: C#

文件已经上传，地址https://download.csdn.net/download/caihouhui/11217138    如有问题可与我联系，邮箱caihh_xy@foxmail.com

引用 3 楼 user-1的回复:我找一下文件 ，晚点进我的空间下载吧 好的，是发到你的博客里吗

我找一下文件 ，晚点进我的空间下载吧

能不能发我一下11111

这个系统我有源码


Question: 关于文件，求助，我连题都没有读懂

个人理解是将数组内的数据进行分组，然后将分组结果放在.txt中，只不过这个文件是需要通过代码去创建的

乍一看，这道题目平平无奇，让人厌烦，仔细一揣摩，这道题有大恐怖啊！它居然用的是中英混写这种失传已久的写法！不对！！竟然还用了阿拉伯数字，天啊，百年难得一见，我胡汉三没白来！什么？？？居然还加了左右括号，恐怖，大恐怖啊，恐怖如斯！吓得我倒吸一口凉气！当场选择去世


Question: 指针与数组`函数

这题咋写哇


Question: 拜托各位大神帮忙写一下！

#include<stdio.h> int main() { 	int r; 	int PI=3.1415926; 	double v; 	printf("请输入圆球的半径：\n");     scanf("%d", &r);     v=( (4.0 / 3) * PI*r*r*r   );      printf("当R=%d时球体体积为：\n%.4lf\n", r, v); }

void sphere_volume() {     float volume = 0;     int r = 0;     scanf("%d", &r);      volume = (4.0 / 3) * 3.14 * (r * r * r);     printf("volume: %f\n", volume); }

去百度一下都比发帖快。 当然了，不排除有闲得慌的喜欢帮人写作业的人——虽然大概率也是百度出来的。

仅供参考，不喜勿喷！ 球体积： #define PI 3.1415926  double func(int r);  int main() { 	printf("请输入圆球的半径：\n"); 	int r; 	scanf_s("%d", &r); 	printf("当R=%d时球体体积为：\n%.4lf\n", r, func(r)); 	return 0; }  double func(int r) { 	return (4.0 / 3) * PI*r*r*r; } 阶乘： int func(int n);  int main() { 	int m, n; 	printf("请输入m,n的值：\n"); 	scanf("%d%d", &m, &n); 	printf("m!+n!的值为：\n%d", func(m) + func(n)); 	while (1); 	return 0; }  int func(int n) { 	if (n == 0 || n == 1) 	{ 		return 1; 	} 	return n * func(n - 1); } 素数因子： int isprime(int n);  int main() { 	printf("请输入一个整数m(m>1)：\n"); 	int m; 	scanf_s("%d", &m); 	if (m < 2) 	{ 		printf("输入无效！\n"); 		return 0; 	} 	if (isprime(m)) 	{ 		printf("%d是素数！\n", m); 	} 	else 	{ 		for (int i = 2; i < m; i++) 		{ 			if (m%i == 0) 			{ 				printf("%d、", i); 			} 		} 	} 	 	while (1); 	return 0; }  int isprime(int n) { 	if (n < 2) 	{ 		return 0; 	} 	for (int i = 2; i < n; i++) 	{ 		if (n%i == 0) 		{ 			return 0; 		} 	} 	return 1; } 素数和：  int isprime(int n); int sum1(int m, int n);  int main() { 	printf("请输入任意一个整数n(n>1):\n"); 	int n, sum = 0; 	scanf_s("%d", &n); 	if (n < 2) 	{ 		printf("输入无效！\n"); 		return 0; 	} 	for (int i = 2; i <= n; i++) 	{ 		if (isprime(i)) 		{ 			sum = sum1(sum, i); 		} 	} 	printf("1~%d之间的素数之和为：\n%d\n", n, sum); 	return 0; }  int isprime(int n) { 	if (n < 2) 	{ 		return 0; 	} 	for (int i = 2; i < n; i++) 	{ 		if (n%i == 0) 		{ 			return 0; 		} 	} 	return 1; }  int sum1(int m,int n) { 	return m + n; }


Question: 可以调适但运行出问题

引用 15 楼 星空夜色 的回复:已经结贴了，您可以看看结了没 Bingo！！！ 顺祝周末愉快！ ～

引用 13 楼 星空夜色的回复:[quote=引用 12 楼 拥抱Linux的回复:][quote=引用 10 楼 星空夜色 的回复:] 手机的话要怎么操作。。。 （1）手机的csdn的app不能结帖。别不相信，这就是牛比闪闪的csdn的手机app的功能缺失。 （2）一定要在手机上操作的话，和电脑上的操作是一回事，就是用手机浏览器打开csdn网址，把页面显示模式改成 电脑端 模式，然后浏览器里显示的网页就是普通网页而不是手机端的wap网页了，然后就登录、点开自己的帖子、结帖、给分。 ～[/quote] 好的，请等我回去就弄[/quote] 已经结贴了，您可以看看结了没

引用 11 楼 袁君元的回复:第一个for语句后多余了一个分号呀 谢谢，这个已经解决了

引用 12 楼 拥抱Linux的回复:[quote=引用 10 楼 星空夜色 的回复:] 手机的话要怎么操作。。。 （1）手机的csdn的app不能结帖。别不相信，这就是牛比闪闪的csdn的手机app的功能缺失。 （2）一定要在手机上操作的话，和电脑上的操作是一回事，就是用手机浏览器打开csdn网址，把页面显示模式改成 电脑端 模式，然后浏览器里显示的网页就是普通网页而不是手机端的wap网页了，然后就登录、点开自己的帖子、结帖、给分。 ～[/quote] 好的，请等我回去就弄

引用 10 楼 星空夜色 的回复:手机的话要怎么操作。。。 （1）手机的csdn的app不能结帖。别不相信，这就是牛比闪闪的csdn的手机app的功能缺失。 （2）一定要在手机上操作的话，和电脑上的操作是一回事，就是用手机浏览器打开csdn网址，把页面显示模式改成 电脑端 模式，然后浏览器里显示的网页就是普通网页而不是手机端的wap网页了，然后就登录、点开自己的帖子、结帖、给分。 ～

第一个for语句后多余了一个分号呀

引用 9 楼 拥抱Linux的回复:[quote=引用 8 楼 星空夜色 的回复:] 确实有用，谢谢，但是该怎么结贴  电脑上浏览器里点开自己的帖子，标题旁边就有  「结帖」、「给分」之类的按钮，点击或者输入分数，最后 提交 就可以了。 ～[/quote] 手机的话要怎么操作。。。

引用 8 楼 星空夜色 的回复:确实有用，谢谢，但是该怎么结贴  电脑上浏览器里点开自己的帖子，标题旁边就有  「结帖」、「给分」之类的按钮，点击或者输入分数，最后 提交 就可以了。 ～

引用 7 楼 拥抱Linux的回复:！ 第一个for循环的圆括号后面，多了一个分号。 ～ 另外，建议在使用for、while、if、switch-case这些结构的时候，务必把后面的代码块用花括号括起来，即使只有一行代码也括起来，提高可读性，减少书写错误。 ～ 如有帮助，烦请及时结帖、给分！：-） ～ 确实有用，谢谢，但是该怎么结贴

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

引用 1 楼 user-4的回复:array数组越界了，比如数组长度是2，你却访问了arr[2] #include <stdio.h> #define N 10 void main() { 	int array[N], MAX, i; 	for (i = 0; i < N; i++); 	scanf("%d", array + i); 	MAX = array[0]; 	for (i = 1; i < N; i++) 		if (MAX < array[i]) 			MAX = array[i]; 	printf("MAX=%d\n", MAX); }

引用 1 楼 user-4的回复:array数组越界了，比如数组长度是2，你却访问了arr[2] 我输入的5  9  8  7  10  67  3  980  9  12

引用 1 楼 user-4的回复:array数组越界了，比如数组长度是2，你却访问了arr[2] 什么意思，菜鸟没看懂

array数组越界了，比如数组长度是2，你却访问了arr[2]


Question: C语言作业

#include<stdio.h> struct student{     int id;     char name[10];     int score; };  int main() {     int i,j;     int way;     int stunum=2;     int sea_id;     int maxscore=0,maxid=0,minscore=100,minid=0;     double average;     struct student list[100]={{20144378,"zzm",60},{20144377,"zzy",50}};     struct student temp;     while(1)     {         printf("*********************************\n");         printf("2017电子工程c语言成绩管理\n");         printf("*********************************\n");         printf("请输入1-8选择进行下面操作\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");         scanf("%d",&way);         switch(way)         {         case 1:             system("cls");             printf("请输入学生信息\n");             scanf("%d%s%d",&list[stunum].id,list[stunum].name,&list[stunum].score);             printf("输入完成\n");             stunum++;             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 2:             system("cls");             printf("学生信息为\n");             printf("学号\t    名字  成绩\n");             for(i=0;i<stunum;i++)                 printf("%-12d%-6s%d\n",list[i].id,list[i].name,list[i].score);             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 3:             system("cls");             printf("请输入想查询的学号\n");             scanf("%d",&sea_id);             for(i=0;i<stunum;i++)             {                 if(list[i].id==sea_id)                 {                     printf("学号\t    名字  成绩\n");                     printf("%-12d%-6s%d\n",list[i].id,list[i].name,list[i].score);                     break;                 }             }             if(i==stunum)                 printf("没有找到该学生\n");             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 4:             for(i=0;i<stunum;i++)             {                 for(j=i+1;j<stunum;j++)                 {                     if(list[i].score<list[j].score)                     {                         temp=list[i];                         list[i]=list[j];                         list[j]=temp;                     }                 }             }             system("cls");             printf("学号\t    名字  成绩\n");             for(i=0;i<stunum;i++)                 printf("%-12d%-6s%d\n",list[i].id,list[i].name,list[i].score);             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 5:             for(i=0;i<stunum;i++)             {                 if(list[i].score>maxscore)                 {                     maxscore=list[i].score;                     maxid=i;                 }                 if(list[i].score<minscore)                 {                     minscore=list[i].score;                     minid=i;                 }                 average+=list[i].score;             }             average/=stunum;             system("cls");             printf("最高分:%d\n",list[maxid].score);             printf("最低分:%d\n",list[minid].score);             printf("平均分:%lf\n",average);             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 6:             system("cls");             printf("最高分学生学号：%d\n",list[maxid].id);             printf("最低分学生学号：%d\n",list[minid].id);             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 7:             system("cls");             printf("学号\t    名字  成绩\n");             for(i=0;i<stunum;i++)             {                 if(list[i].score>average)                     printf("%-12d%-6s%d\n",list[i].id,list[i].name,list[i].score);             }             printf("再次回车回到主界面\n");             getchar();             getchar();             break;         case 8:             return 0;             break;         default:             printf("请重新输入");         }         system("cls");     } }

这程序差不多得半天呢


Question: C语言，不使用全局变量将文本分散对齐的问题

请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

引用 4 楼 赵4老师 的回复:用全局变量不会死人的。 题目考的就是只用局部变量，快吐了，做了4天了

用全局变量不会死人的。

楼上这是使用了全局的。。。虽然错了

#include <stdio.h> #include <string.h> char words[45],temp[45],spec[100]; int count,len,word,spe,extra; void counts(); void justify();  int main(){ 	printf("Enter a line of text:"); 	gets(temp);//- read that reads in one line of text of not more than 45 characters (that is, reads until input is valid) 	count=0; 	len=strlen(temp); 	counts(); 	justify(); 	printf("123456789012345678901234567890123456789012345\n"); 	printf("%s",words); }  void counts(){//- count that counts and returns the number of gaps between words in one line of text 	int i; 	for(i=0;i<len;i++){ 		if(temp[i]==' '){ 			count++; 		} 		else {word++; 		} 	} 	spe=(45-word)/count; 	extra=(45-word)-(spe*count); }  void 	justify(){//- justify that prints out character by character in justified form, one line of text (see sample output below) 	int i,j,k; 	j=0; 	for(i=0;i<len;i++){ 		if(temp[i]!=' '){ 			words[j]=temp[i]; 			j++; 		}else{ 			for(k=0;k<spe;k++){ 				words[j]=' '; 				j++; 			} 			if(extra>0){ 				words[j]=' '; 				j++; 				extra--; 			} 		} 	} }

这个是老师给的思路图，但是这里的read实在是想不通是什么意思

引用 7 楼 Yang_Yida 的回复:[quote=引用 6 楼 赵4老师 的回复:] 悄悄告诉你，局部静态变量和全局变量很像。 意思是const char这样？ char line[45]； line=const char read（）；//或者是strcpy（line，read（））？ const char read（）{  printf("Enter a line of text:");  return "%s";//。。。能这样吗？ }[/quote] #include<stdio.h> #include<string.h> #include<stdbool.h> const char* read(); int count(char* t); void justify(int g,char* str);  int main(){ 	int k; 	for(k=0;k<3;k++){ 		if(k!=0){ 			printf("\n"); 		} 		char line[45]={0}; 		strcpy(line,read()); 		printf("123456789012345678901234567890123456789012345\n"); 		int gaps; 		gaps=count(line); 		justify(gaps,line); 	} }  const char* read(){ 	char temp[45]={0}; 	char* bk; 	printf("Enter a line of text:"); 	gets(temp); 	bk=temp; 	return bk; }  int count(char* t){ 	int i,len,spe,word,counts; 	spe=0; 	word=0; 	counts=0; 	len=strlen(t); 	for(i=0;i<len;i++){ 		if(t[i]==' '){ 			counts++; 		} 		else {word++; 		} 	} 	spe=(45-word)/counts; 	return spe; }  void justify(int g,char* str){ 	int i,k,j,count,extra,word,len;   	count=0;extra=0;word=0; 	char temp[45]={0}; 	len=strlen(str); 	for(k=0;k<len;k++){ 		if(str[k]==' '){ 			count++; 		}else{ 			word++; 		} 	} 	extra=(45-word)-(g*count); 	i=0; 	for(k=0;k<len;k++){ 		if(str[k]==' '){ 			j=0; 			while(j<g){ 				temp[i]=' '; 				j++; 				i++; 			} 			if(extra>0){ 				temp[i]=' '; 				i++; 				extra--; 			} 		}else{ 			temp[i]=str[k]; 			i++; 		} 	} 	temp[45]='\0'; 	for(k=0;k<i;k++){ 		putchar(temp[k]); 	} }    //真的是爆肝。。。终于做完了，有需要的朋友可以看看

引用 6 楼 赵4老师 的回复:悄悄告诉你，局部静态变量和全局变量很像。 意思是const char这样？ char line[45]； line=const char read（）；//或者是strcpy（line，read（））？ const char read（）{  printf("Enter a line of text:");  return "%s";//。。。能这样吗？ }

悄悄告诉你，局部静态变量和全局变量很像。


Question: InterlockedAnd64及InterlockedPushListSList(Ex)的疑问

第一个小问题已经搞明白了 原来是自旋锁的用法  InterlockedPushListSList(Ex)函数怎么使用，主要是不明白第二及第三个参数的如何使用 希望给个实例

仅执行一次和使用do while循环执行，语义怎么可能一样呢？ 《Windows核心编程》


Question: 数组排序从大到小

你输出的结果是数的地址，因为你的printf里面有&，把&去掉就可以了

统一回复一下:哦了谢谢各位

输出的时候，printf里去掉&

我靠，还冒泡呢。。

把printf里的&去掉，不然输出的是地址


Question: 小白求助：求推荐win10环境下可以安装的c语言编译软件

vs2015吧,那个Tubor v2.0太古老了，不行下个绿色版的

可以百度搜一下win10系统如何安装

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

CodeBlock MinGW 都很好，免费

Visual Studio 2017应该是VS里最新最稳定的版本了(2019刚出 可能还有一些bug)

vscode

嗯，还有个2019.

必须是Visual Studio 2012/2015/2017

Turbo C v2.0 ?如果一定要用这个，可以去下有人整合的工具，但是64位系统下面可能不行，这个问题与win10或win7无关

codeblock


Question: 小白求助

你的素数判断里面，按照你的思路2会判断为非素数，应该把m为2的情况单独列举出来

引用 2 楼 gouyanfen 的回复: int prime(int m) {   if(m>1) {   for(int i=2;i<m/2;i++)//上个习惯性输成0了    if(m%i==0)      return 0;      return 1;  } return 0; }  上个习惯性输成0了

int prime(int m) {   if(m>1) {   for(int i=0;i<m/2;i++)    if(m%i==0)      return 0;      return 1;  } return 0; }

你的prime函数会判断1也是素数，而题目要求1不是素数。你在主函数循环的时候把1也算进去了，所以你的最后结果都多了1。


Question: C语言while语句编程

谢谢各位大神 🍭🍭🍭🍭

引用 3 楼 威斯旺卡 的回复:[quote=引用 2 楼 至尊宝、 的回复:] 代码仅供参考，不喜勿喷！！#include<stdio.h> #include<math.h>  int func(int n);		//求阶乘  int main() { 	double x; 	int n = 0; 	double z = 0; 	printf("请输入x的值："); 	scanf("%lf", &x); 	while ((pow(x, n) / func(n)) >= pow(10, -6)) 	{ 		z += pow(x, n) / func(n); 		n++; 	} 	printf("f(x)的值为：%.6lf\n" , z); 	return 0; }  int func(int n) { 	int temp; 	if (n == 1 || n == 0) 	{ 		temp = 1; 	} 	else  	{ 		temp = n * func(n - 1); 	} 	return temp; } 把while后边改为while(分子/分母>1e-6) pow尽量少用，最好把分子和分母分别用函数计算出来，再返回给一个值[/quote]我本来是和你想的一样，分子分母分别写了个函数计算，后来又把分子那个删了，感觉还是pow更方便一些。

引用 2 楼 至尊宝、 的回复:代码仅供参考，不喜勿喷！！#include<stdio.h> #include<math.h>  int func(int n);		//求阶乘  int main() { 	double x; 	int n = 0; 	double z = 0; 	printf("请输入x的值："); 	scanf("%lf", &x); 	while ((pow(x, n) / func(n)) >= pow(10, -6)) 	{ 		z += pow(x, n) / func(n); 		n++; 	} 	printf("f(x)的值为：%.6lf\n" , z); 	return 0; }  int func(int n) { 	int temp; 	if (n == 1 || n == 0) 	{ 		temp = 1; 	} 	else  	{ 		temp = n * func(n - 1); 	} 	return temp; } 把while后边改为while(分子/分母>1e-6) pow尽量少用，最好把分子和分母分别用函数计算出来，再返回给一个值

就是第三题，提示在标题后面


Question: 小白求助，为啥sum不对？

你的判断素数的函数中应该把2单独讨论，按照你的for循环，2也被判断为非素数了

引用 2 楼 qq_45074415 的回复:还是搞不定啊，难道判断素数的函数不是这样的？ 当然不是。 ～

引用 1 楼 拥抱Linux的回复:！ 判断素数的函数不对，导致在main函数中变量count和变量sum统计的是数字6、8、9、10的个数与和。 再想想素数应该如何判断，修改代码，再多调试一下吧！ ～ 还是搞不定啊，难道判断素数的函数不是这样的？


Question: C链表参数问题

引用 3 楼 user-2的回复:如果你需要改变list（LNode*）的值，即改变头节点的地址，那么你传参的时候是需要用Linklist*（LNode**），但显然你插入以及删除是不需要修改头节点的地址，所以这两个函数没必要用linklist*。 我之前刚好写过一篇文章，你看对你有没有帮助 https://blog.csdn.net/qq_40946921/article/details/90047918 说得非常好！当时我没考虑这个功能。

函数设计要考虑他的独立性，插入链表，需要先决条件 1.给谁插入节点 2.节点的内容 3.插入节点的位置(头，尾，指定位置)  那么就需要三个参数最少 NODE * head(链表头) NODE 节点 ,int 插入位置  你的函数的e,q->data=e,为什么不直接读到q->data  同样的道理，删除节点，最起码要知道删除谁的节点，要删除节点的内容,如果有需要还应该设计个参数:节点匹配方式  以上是我的理解，希望对你有所帮助


Question: 热爱学习的我又来请教问题了。

转发点击抽奖

其实你想要测试这个问题的结果，你可以选择把p->age先初始化为特定的字符，重新定义一个 char * c_age=p->age[SIZE],然后strcpy之后打印出内存中的数字对比一下你就明白了 struct student { int num; char age[SIZE]; char comp_age[20];  } struct student *p=new student;   char * c_age=p->age[SIZE], strcpy(c_age,"hello world"); for (i=0;i<(SIZE+20);i+=4) printf("%08X\n",*(DWORD*)((DWORD)p-age+i)); 这样输出内存中的数字出来看下就明白了

引用 6 楼 gouyanfen 的回复:p->age[SIZE]这个是指向age这个这符数组的头地址+(sizeof(char)*SIZE),假定可以使用=赋值,那么越界的同时会把hello放到p->age结尾之后的地方: 假如:p-age分配的地址为0x10000;那么p->age[SIZE]其实指向的地方是0x10050谢谢  明白了

内存是个连续空间,age[SIZE]是什么取决于你的程序内存中的结构，溢出攻击就是采用这种方法，重新构造代码

引用 7 楼 weixin_45066336 的回复:age这个数组你只能取到SIZE-1，那么第SIZE个是什么？哈哈 忽略了  不过不影响重点。

age这个数组你只能取到SIZE-1，那么第SIZE个是什么？

strcpy(p->age,"hello");

引用 3 楼 自信男孩 的回复：[quote=引用 2 楼 小提琴家爱因斯坦 的回复:] [quote=引用 1 楼 user-5 的回复：]p->age[SIZE]="hello";  这种字符数组的整体赋值只能在字符数组初始化时使用，不能用于字符数组的赋值，字符数组的赋值只能对其元素一一赋值，赋值方法是错误的我知道是错的。但我不明白为什么是一堆乱码[/quote] 因为你把一个地址赋值给age[SIZE];而不是把字符串赋值给age中的元素。  另外，SIZE是age的长度，那么这样赋值也已经导致age越界了。  [/quote]不好意思 有点不明白。“hello”赋值相当于一个地址吗。size是80也不够吗

引用 2 楼 小提琴家爱因斯坦 的回复:[quote=引用 1 楼 user-5 的回复：]p->age[SIZE]="hello";  这种字符数组的整体赋值只能在字符数组初始化时使用，不能用于字符数组的赋值，字符数组的赋值只能对其元素一一赋值，赋值方法是错误的我知道是错的。但我不明白为什么是一堆乱码[/quote] 因为你把一个地址赋值给age[SIZE];而不是把字符串赋值给age中的元素。  另外，SIZE是age的长度，那么这样赋值也已经导致age越界了。

引用 1 楼 user-5 的回复：p->age[SIZE]="hello";  这种字符数组的整体赋值只能在字符数组初始化时使用，不能用于字符数组的赋值，字符数组的赋值只能对其元素一一赋值，赋值方法是错误的我知道是错的。但我不明白为什么是一堆乱码


Question: socket编程时，使用memcpy发生了一个很奇怪的段错误

越界是肯定的, 但是越界后是否出错要看实际情况 越界 是指访问 "this is server!"  这个 如果这个数据刚好放到一个内存区的末端, 越界到另外一段内存就可能会报错 实际情况可以直接调试看异常位置, 也可以用工具去查看exe, 看数据的位置

那你只能贴gdb的bt full信息了。

引用 6 楼 jiamianshiye_16_com 的回复：返回值和ip地址一样，头文件也是有的

inet_ntop()  你关注下这个函数的返回值，与ip， 的地址是否相符合，如果不符合，很 有可能是64位系统的问题。   #include <arpa/inet.h> 如果是64位系统，加上这个头文件。

1，把memcpy换成strcpy是没有问题的 2，把sizeof（buf）换成552没有问题，换成553就段错误 看来不仅仅是长度超了的问题，毕竟把ntohs和inet_ntop两行注释掉也没有问题 这里面看来还是很复杂的～

引用 3 楼 jiamianshiye_16_com 的回复:我觉得问题不在于越界。memcpy只是个复制内存函数，没有超出buf的范围，这个并没有问题，只是用法很奇怪，字符串赋值不是应该用strcpy么。  但是这个段错误，应该用gdb来调试，然后你把  bt  full 的信息都贴出来，这样比较好定位问题。 拷贝长度是1024，第二个参数其实是一个地址，那么拷贝的个数就是从这个地址开始的1024个字节，那么不就越界了吗？

越界了 ，这个字符串的长度也只有不到20个字符，但是你要拷贝1024个字符到buf里，因此很明显越界了。 建议改成： memcpy(buf, "xxx", strlen("xxx") + 1);

memcpy(buf, "this is server!", sizeof(buf)); //这句操作内存越界了啊， "this is server!"这个字符串没有1024这么长， //直接写成 char buf[1024] = "this is server!";就行了


Question: r需要报错

为什么呢？你们遇见过这种情况吗


Question: 求大佬帮忙看一下这个程序怎么改

仅供参考：//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

这个跟成员选择符“.”和解引用运算符“*”的优先级有关系  从这个表中可以看出，成员选择符“.”的优先级高于解引用运算符“*”，所以代码 *p.NO 相当于 *(p.NO) 而NO是整型，对整型进行解引用，肯定会报错，所以要改为 p->NO 或者 (*p).NO 以下是示例代码 struct myTest{ 	int a; 	char b; 	float c; }; int main() { 	myTest* test = new myTest(); 	test->a = 1; 	(*test).b = 'b'; 	//*test.c = 1.0f;//改行代码报错，“表达式必须包含类类型” 	delete test; 	return 0; }

p是指针，把.改成-> 一般指针用->，对象用.

p->NO

引用 2 楼 轻箬笠的回复:p是指针，把.改成-> 一般指针用->，对象用. 感谢大佬，没问题了

引用 1 楼 赵4老师的回复:p->NO 十分感谢，改对了


Question: 求助！

引用 1 楼 至尊宝、 的回复:答案是B。后自增的返回值为a原值的一个拷贝临时变量，而实际的a进行自增。你可以这样理解，后置的++为先运算在自增，因此第一次循环时，a=0，满足a<=2，参与完比较运算之后a自增变为了1，所以进入循环后第一个打印的为1，后边循环也一样。其实在参与比较的时候a就已经是1了，不过a++的返回值是a原值的一个临时变量为0。 ～ while的后面紧跟了一个分号哦～ ～

引用 7 楼 liups的回复:[quote=引用 5 楼 qq_45039499 的回复:] [quote=引用 1 楼 至尊宝、的回复:]答案是B。后自增的返回值为a原值的一个拷贝临时变量，而实际的a进行自增。你可以这样理解，后置的++为先运算在自增，因此第一次循环时，a=0，满足a<=2，参与完比较运算之后a自增变为了1，所以进入循环后第一个打印的为1，后边循环也一样。其实在参与比较的时候a就已经是1了，不过a++的返回值是a原值的一个临时变量为0。 我也选的B但是答案写的D[/quote] 首先你得注意2楼说的分号！这就排除了AB[/quote] 我明白了，谢谢您。

引用 5 楼 qq_45039499 的回复:[quote=引用 1 楼 至尊宝、的回复:]答案是B。后自增的返回值为a原值的一个拷贝临时变量，而实际的a进行自增。你可以这样理解，后置的++为先运算在自增，因此第一次循环时，a=0，满足a<=2，参与完比较运算之后a自增变为了1，所以进入循环后第一个打印的为1，后边循环也一样。其实在参与比较的时候a就已经是1了，不过a++的返回值是a原值的一个临时变量为0。 我也选的B但是答案写的D[/quote]不好意思  我疏忽了  没看到那个分号  答案应该是D  while后面跟了一个分号说明循环体里面没有任何内容，printf语句是在循环体外面的  所以只会输出一个值

引用 5 楼 qq_45039499 的回复:[quote=引用 1 楼 至尊宝、的回复:]答案是B。后自增的返回值为a原值的一个拷贝临时变量，而实际的a进行自增。你可以这样理解，后置的++为先运算在自增，因此第一次循环时，a=0，满足a<=2，参与完比较运算之后a自增变为了1，所以进入循环后第一个打印的为1，后边循环也一样。其实在参与比较的时候a就已经是1了，不过a++的返回值是a原值的一个临时变量为0。 我也选的B但是答案写的D[/quote] 首先你得注意2楼说的分号！这就排除了AB

引用 3 楼 自信男孩的回复:学则D，因为a++<=2，所以a++需要是3，最后a是4。后增，先把表达式的值与2比较，最后再算自增 每一次循环不都应该输出一个值吗？

引用 1 楼 至尊宝、的回复:答案是B。后自增的返回值为a原值的一个拷贝临时变量，而实际的a进行自增。你可以这样理解，后置的++为先运算在自增，因此第一次循环时，a=0，满足a<=2，参与完比较运算之后a自增变为了1，所以进入循环后第一个打印的为1，后边循环也一样。其实在参与比较的时候a就已经是1了，不过a++的返回值是a原值的一个临时变量为0。 我也选的B但是答案写的D

引用 2 楼 拥抱Linux 的回复:[quote=引用 1 楼 至尊宝、 的回复:] 答案是B。后自增的返回值为a原值的一个拷贝临时变量，而实际的a进行自增。你可以这样理解，后置的++为先运算在自增，因此第一次循环时，a=0，满足a<=2，参与完比较运算之后a自增变为了1，所以进入循环后第一个打印的为1，后边循环也一样。其实在参与比较的时候a就已经是1了，不过a++的返回值是a原值的一个临时变量为0。 ～ while的后面紧跟了一个分号哦～ ～[/quote]尴尬了  没注意


Question: c语言求助

帮忙看看哪里错了

void search_ticket_num() { 	printf("请输入要查询机票的编号\n"); 	fflush(stdin); 	char ss[10]; 	int j=0; 	gets(ss); 	printf("\n 航班号  机票编号  出发地 目的地  起飞时刻  到达时刻  登机口  座位号  姓名 \n"); 	for(int i=0;i<N;i++) 	{ 		if(strcmp(ss,passenger[i].ticket_num)==0) 		{ 			printf("%-8s%-10s%-8s%-8s%-10s%-10s%-8s%-8s%-6s%n",passenger[i].flight_num, 				passenger[i].ticket_num,passenger[i].start,passenger[i].destination, 				passenger[i].takeoff_time,passenger[i].arrive_time, 				passenger[i].gate_num,passenger[i].seat_num,passenger[i].name); 			j++; 		} 	} 	if(j==0) 	{ 		printf("\n您所查询的机票不存在,按任意键返回重新查询\n"); 		system("pause"); 		menu3(); 	} 	else 	{ 		printf("\n请记住所需的机票编号,按任意键返回主菜单\n"); 		system("pause"); 		rootmenu(); 	} }

void flight_into_deleteall() { 	printf("警告!您将删除所有航班信息,删除后不可恢复,继续请按Y,按其他返回航班维护菜单\n"); 	fflush(stdin); 	char cc; 	cc=getchar(); 	if(cc=='Y'); 	{ 		for(int k=0;k<flinum;k++) 		{ 			strcpy(all[k].flight_num,all[k+1].flight_num); 			strcpy(all[k].start,all[k+1].start); 			strcpy(all[k].destination,all[k+1].destination); 			strcpy(all[k].takeoff_time,all[k+1].takeoff_time); 			strcpy(all[k].arrive_time,all[k+1].arrive_time); 			all[k].num=all[k+1].num; 			all[k].left=all[k+1].left; 			all[k].price=all[k+1].price; 		} 		pp=&all[0]; 		flinum=0; 		printf("您已删除所有航班信息,按任意键返回主菜单\n"); 		system("pause"); 		rootmenu(); 	} 	else 	{ 		menu2(); 	} } void search_flight_num() { 	printf("请输入要查询的航班号\n"); 	fflush(stdin); 	char ss[10]; 	int j=0; 	gets(ss); 	printf("\n航班号    航班编号    出发地    目的地   起飞时刻    到达时刻  总票数  剩余票数  价格\n"); 	for(int i=0;i<M;i++) 	{ 		if(strcmp(ss,all[i].flight_num)==0) 		{ 			printf("%-8s%-10d%-8s%-8s%-10s%-10s%-8d%-10d%-4d\n",all[i].flight_num,i+1,all[i].start, 				all[i].destination,all[i].takeoff_time,all[i].arrive_time,all[i].num,all[i].left,all[i].price); 			j++; 		} 	} 	if(j==0) 	{ 		printf("\n您所查询的航班不存在,按任意键返回查询\n"); 		system("pause"); 		menu1(); 	} 	else 	{ 		printf("请记住所需的航班编号,按任意键返回主菜单\n"); 		system("pause"); 		rootmenu(); 	} } void search_destination_time() { 	fflush(stdin); 	char ss1[10],ss2[3],ss3[3]; 	int j=0; 	printf("请输入目的地\n"); 	gets(ss1); 	printf("请依次输入起飞时间介于的时刻(例如 09 回车 12)\n");     gets(ss2);     gets(ss3) ;     printf("\n航班号  航班编号  出发地  目的地  起飞时刻  到达时刻  总票数  剩余票数  价格\n");     for(int i=0;i<M;i++) 	{       if(strcmp(ss1,all[i].destination)==0&&strncmp(all[i].takeoff_time,ss2,2)>=0&&strncmp(all[i].takeoff_time,ss3,2)<=0) 	  {       printf("%-8s%-10d%-8s%-8s%-10s%-10s%-8d%-10d%-4d\n",all[i].flight _num,i+1,all[i].start, all[i].destination,all[i].takeoff_time,all[i].arrive_time,all[i].num,all[i].left,all[i].price);       j++; 	  } 	} 	if(j==0) 	{       printf("n您所查询到航班不存在,按任意键重新查询\n");       system("pause");       menu1(); 	} 	else 	{       printf("请记住所需的航班编号,按任意键返回主菜单\n");       system("pause");       rootmenu(); 	} } void ticket_book() {       printf("需要所要订购机票的航班编号,若已知则按Y继续执行,若未知请按其他键返回查询\n");       fflush(stdin);       char cc;       cc=getchar(); 	  if(cc=='Y') 	  { 		  int i,k; 		  printf("请输入要査询的航班编号\n"); 		  scanf("%d",&i);           k=i-1;           printf("\n航班号  航班编号  出发地  目的地  起飞时刻  到达时刻   总票数    剩余票数    价格\n");           printf("%-8s%-10d%-8s%-8s%-10s%-10s%-8d%-10d%-4d\n",all[k].flight_num,i,all[k].start,all[k].destination,all[k].takeoff_time,all[k].arrive_time,all[k].num,all[k].left,all[k].price); 		  if(all[k].left==0) 		  { 			  printf("\n没有机票了,按任意键返回主菜単\n");               system("pause");               rootmenu(); 		  }           printf("\n请认真核对，确认订票请按Y ,按其他键返回主菜単\n");           fflush(stdin);           char ccl;           ccl=getchar(); 		  if(ccl=='Y') 		  {              printf("\n请输入订票数\n");              int j;              scanf("%d",&j);              printf("\n请认真填写个人信息，暂不支持修改\n"); 			 if((int)all[k].left>=j) 			 { 				 for(int i=0;i<j;i++)  				 { 					 printf("\n请输入第%d位乘客信息\n", i+l);                      ticket_info_input(&all[k]);                      all[k].left=all[k].left-1; 				 }                  printf("\n您的机票信息\n");                  printf("\n航班号  机票编号 出发地 目的地 起飞时刻   到达时刻   登机口   座位号 姓名\n"); 				 for（int m=0;m< j;m++) 				 { 					 printf("%-8s%-10s%-8s%-8s%-10s%-10s%-8s%- 8s%-6s%\n",passenger[ticnum- j+m].flight_num, 						 passenger[ticnum-j+m].ticket_num,passenger[ticnum-j+m].start,passenger[ticnum-j+m].destination, 						 passenger[ticnum-j+m].takeoff_time,passenger[ticnum-j+m].arrive_time,passenger[ticnum-j+m].gate_num, 						 passenger[ticnum-j+m].seat.num,passenger[ticnum-j+m].name); 				 } 				 system("pause"); 				 rootmenu(); 			 } 			 else 			 { 				 printf("\n余票不足,请重新查询订购\n"); 				 system("pause"); 				 menul(); 			 } 		  } 		  else 		  { 			  rootmenu(); 		  } 	  } 	  else 	  { 		  menul(); 	  } } void ticket_cancel() { 	printf("需要所要退订机票的编号,若已知则按Y继续执行,若未知请按其他键返回查询\n"); 	fflush(stdin); 	char cc,ss[8]; 	cc=getchar(); 	if(cc=='Y') 	{ 		fflush(stdin); 		printf("请输入机票编号\n"); 		gets(ss); 		int n=0; 		for(int i=0;i<N;i++) 		{ 			if(strcmp(ss,passenger[i].ticket_num)==0) 			{ 				printf("\n航班号机票编号 出发地 目的地 起飞时刻  到达时刻  登机口  座位号  姓名  \n"); 				printf("%-8s%-10s%-8s%-8s%-10s%-10s%-8s%-8s%-6s%n", 					passenger[i].flight_num, passenger[i].ticket_num,passenger[i].start,passenger[i].destination, 					passenger[i].takeoff_time, passenger[i].arrive_time,passenger[i].gate_num,passenger[i].seat_num, 					passenger[i].name); 				printf("确认退票请按Y,按其他返回查找\n"); 				fflush(stdin); 				char ccl; 				ccl=getchar(); 				if(ccl='Y') 				{ 					for(int k=i;k<ticnum;k++) 					{ 						strcpy(passenger[k].flight_num,passenger[k+1].flight_num); 						strcpy(passenger[k].ticket_num,passenger[k+1].ticket_num); 						strcpy(passenger[k].start,passenger[k+1].start); 						strcpy(passenger[k].destination,passenger[k+1].destination) ; 						strcpy(passenger[k].takeoff_time,passenger[k+1].takeoff_time) ; 						strcpy(passenger[k].arrive_time,passenger[k+1].arrive_time) ; 						strcpy(passenger[k].gate_num,passenger[k+1].gate_num) ; 						strcpy(passenger[k].seat_num,passenger[k+1].seat_num) ; 						strcpy(passenger[k].name,passenger[k+1].name); 						strcpy(passenger[k].sex,passenger[k+1].sex); 						strcpy(passenger[k].id_num,passenger[k+1].id_num); 						strcpy(passenger[k].phone_num,passenger[k+1].phone_num) ; 						n++; 					} 					ticnum--; 					pp--; 					for(int j=0;j<M;j++) 					{ 						if(strcmp(passenger[i].f1ight_num,a11[j].f1ight_num)==0) 						{ 							all[j].left++; 						} 					} 					printf("您已退票成功\n"); 					system("pause"); 					rootmenu(); 				} 				else 				{ 					menu3(); 				} 			} 		} 		if(n==0) 		{ 			printf("您查询的机票不存在,按任意键返回重新查询\n"); 			system("pause"); 			menu3(); 		} 	} 	else 	{ 		menu3(); 	} } void search_ticket_flight_num() { 	printf("请输入要查询机票的航班号\n"); 	fflush(stdin); 	char ss[10]; 	int j=0; 	gets(ss); 	printf("\n航班号  机票编号  出发地  目的地  起飞时刻  到达时刻  登机口  座位号  姓名  \n"); 	for(int i=0;i<N;i++) 	{ 		if(strcmp(ss,passenger[i].flight_num)==0) 		{ 			printf("%-8s%-10s%-8s%-8s%-10s%-10s%-8s%-8s%-6s%\n", 				passenger[i].flight_num,passenger[i].ticket_num,passenger[i].start, 				passenger[i].destination,passenger[i].takeoff_time,passenger[i].arrive_time, 				passenger[i].gate_num,passenger[i].seat_num,passenger[i].name); 			j++; 		} 	} 	if(j==0) 	{ 		printf("\n您所查询的机票不存在,按任意键返回重新查询\n"); 		system("pause"); 		menu3(); 	} 	else 	{ 		printf("请记住所需的机票编号,按任意键返回主菜单\n"); 		system("pause"); 		rootmenu(); 	} } void search_ticket_name() { 	printf("请输入要查询机票的旅客姓名\n"); 	fflush(stdin); 	char ss[10]; 	int j=0; 	gets(ss); 	printf("\n 航班号  机票编号  出发地  目的地  起飞时刻  到达时刻  登机口  座位号  姓名  \n"); 	for(int i=0;i<N;i++) 	{ 		if(strcmp(ss,passenger[i].name)==0) 		{ 			printf("%-8s%-10s%-8s%-8s%-10s%-10s%-8s%-8s%-6s%n",passenger[i].flight_num, 				passenger[i].ticket_num,passenger[i].start,passenger[i].destination, 				passenger[i].takeoff_time, passenger[i].arrive_time, 				passenger[i].gate_num,passenger[i].seat_num,passenger[i].name); 			j++; 		} 	} 	if(j==0) 	{ 		printf("\n您所查询的机票不存在,按任意键返回重新查询\n"); 		system("pause"); 		menu3(); 	} 	else 	{ 		printf("\n请记住所需的机票编号,按任意键返回主菜单\n"); 		system("pause"); 		rootmenu(); 	} }


Question: 建立链表结点，删除包含输入年龄的结点

引用 楼主 coningg的回复:[quote=引用 楼主 coningg的回复:]  #include <stdio.h> #include <stdlib.h> struct Student{     int id;     char name[20];     char sex;     int age;     Student *next; }; void input(Student *stu, int n); void print(Student *stu); Student *del(Student *stu, int n); int main() {     Student s[3];     input(s, 3);     int m;     printf("请输入一个年龄:\n");     scanf("%d", &m);     print(del(s, m));     system("pause");     return 0; } void input(Student *stu, int n) {     Student *p;     int i;     for (p=stu, i=0; p<stu+n; p++, i++){         printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d,%s,%c,%d",&p->id,p->name,&p->sex,&p->age);         i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];     } } void print(Student *stu) {     Student *p;     for (p=stu; p!=NULL; p=p->next)         printf("%d,%s,%c,%d\n",p->id,p->name,p->sex,p->age); } Student *del(Student *stu, int n) {     Student *p, *head;     int i;     for (p=stu, head=p, i=1; p!=NULL; p=p->next)         if (p->age==n){             if (head==p)                 head=p->next;             else if (p->next==NULL)                 (p-i)->next=NULL;             else{                 (p-1)->next=p+1;                 i++;             }         }     return head; }  代码哪里错了[/quote]
为什么我的代码遇到相邻两个同学的年龄相同时就只删除前一个的情况呢

！ （1）虽然代码用了尾指针指向下一个所谓的结点，然而实际上是预先定义好了一个结构体数组，数组的成员本来就是线性连续排列的，那么这只是一个表面链表而已。 （2）结构体类型的名称没有使用typedef起别名，直接使用Student竟然能够通过编译，还能执行，有点儿匪夷所思。反正俺使用的gcc或者clang都是直接报错了的。 （3）输入数据的语句有问题，          printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d,%s,%c,%d",&p->id,p->name,&p->sex,&p->age);  虽然看起来用逗号分隔开了各个不同的输入数据，但是实际上 %s 把输入的第1个逗号后面的数据都吸收到字符串name里了。而敲下回车之后，scanf函数检测到输入缓冲区的这个回车符与格式化字符串中的下一个字符（逗号,）不一样，判断为输入异常，于是结束scanf，而后面的变量p->sex和p->age就没有获得数据，那么它们俩的值就是未初始化的值，是随机值。 所以，后面的 del 函数是找不到 p->age 的值为 19 的，除非正好有一个 p->age 的随机值是 19 。这么巧的话，可以去买彩票了！ （4）解决办法，把输入语句改为一下这样：  printf("请输入第%d名学生的学号 年龄 姓名 性别:\n", i + 1); scanf("%d %s %c %d", &p->id, p->name, &p->sex, &p->age);  也就是，用空格来分隔各个部分，在scanf的格式化字符串中显式地使用空格。 （5）Linux平台测试运行截图：  如有帮助，欢迎及时结帖、给分！ ：-） ～

你这个是个链表和数组的结合体，单项链表不存在后一个结点可以(p-1)得到前一个节点的情况的，需要临时指针记前一个节点。 赋值放入for不是好习惯 给你发一个单链表的节点删除代码你参考一下:     void EraseNode(Node* pos) //删除指定节点     {  	Lock();//锁定单链表          if (pos == _head)         {             _head = _head->_next;              delete pos; 	    pos=NULL;         }         else         {             Node* cur(_head);             while (cur->_next != pos)             {                 cur = cur->_next;             } 	   if(pos->_next==NULL) 	   { 		_tail = cur; 	  }              cur->_next = pos->_next;             delete pos;             pos = NULL;         } 		ULock();//解除锁定      }

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

scanf是通过空格或换行符来区分相邻的两个输入的。 void input(Student *stu, int n) {     Student *p;     int i;     for (p=stu, i=0; p<stu+n; p++, i++){         printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d %s %c %d",&p->id,p->name,&p->sex,&p->age);         printf("id:%d,name:%s,sex:%c,age:%d\n",p->id,p->name,p->sex,p->age);         i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];     } }  供参考～  链表操作建议还是使用堆上的空间，使用数组+next指针形式，反而在简单处理问题上复杂化了。

引用 楼主 coningg的回复:  #include <stdio.h> #include <stdlib.h> struct Student{     int id;     char name[20];     char sex;     int age;     Student *next; }; void input(Student *stu, int n); void print(Student *stu); Student *del(Student *stu, int n); int main() {     Student s[3];     input(s, 3);     int m;     printf("请输入一个年龄:\n");     scanf("%d", &m);     print(del(s, m));     system("pause");     return 0; } void input(Student *stu, int n) {     Student *p;     int i;     for (p=stu, i=0; p<stu+n; p++, i++){         printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d,%s,%c,%d",&p->id,p->name,&p->sex,&p->age);         i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];     } } void print(Student *stu) {     Student *p;     for (p=stu; p!=NULL; p=p->next)         printf("%d,%s,%c,%d\n",p->id,p->name,p->sex,p->age); } Student *del(Student *stu, int n) {     Student *p, *head;     int i;     for (p=stu, head=p, i=1; p!=NULL; p=p->next)         if (p->age==n){             if (head==p)                 head=p->next;             else if (p->next==NULL)                 (p-i)->next=NULL;             else{                 (p-1)->next=p+1;                 i++;             }         }     return head; }  代码哪里错了


Question: 笔试题求解

char arr = "string";很明显是错误的，不能将字符串常量对字符型变量进行赋值。

这里有个概念错误，a=1不是赋值语句，而是赋值表达式。 ！是对a=1这个表达式的值进行取反，即先将1对变量a进行赋值，a=1表达式的值为1，取反后为0，所以while循环控制条件始终不成立。

1.赋值后对a取反 2.最后一个不是错的么

!(a=1) 是对 a=1 这个赋值语句取反, 赋值语句是恒成立的,感觉没啥意义

1.a=1为赋值表达式，它的返回值为a的引用，所以a=1的返回值为1，！(a=1)即为假，因此循环不执行。  如果你把！(a=1)改为！(a=0)你就会发现变成了死循环，因为a=0返回值为0，！0即为真。 2.char str="string";很明显不对，如果是char* str="string";就对了

(a=1)若为真，!(a=1)就为假，这个取反是真假的反，而不是按位取反。

char arr = "string";这个还正确呢？是不是缺少一个*呢，char *arr = "string";没问题


Question: 求助

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

最好把整个代码粘贴出来

这种情况一般就是访问了非法内存  指针使用不当导致的


Question: 51单片机 keil软件

uint tCount=0;   //后面漏了分号

引用 1 楼 user-1的回复:看不太清楚，前面一句是否少了  ; 下面我发的是总程序，找不到错误在哪

我编译keil程序时显示出错，有那位大佬告知我的具体哪里错了，学习keil软件没有多长时间，求告知，谢谢各位大佬。  #include<reg51.h> #include<intrins.h>  #define uchar unsigned char #define uint unsigned int #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}    sbit DQ=P3^3; sbit MA=P1^0;      sbit MB=P1^1;     sbit PEM=P1^2; sbit LCD_RS=P2^0; sbit LCD_RW=P2^1; sbit LCD_EN=P2^2;  uchar code temp_DISP_Title[]={"Current temp :  "}; uchar Current_Temp_Display_Buffer[]={"TEMP: "}   uchar code_temperature_char[8]= {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00}	     uchar code df_Table[]= {0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9}               //温度小数位对照表   uchar Current=0; char Signed_Temp=0; uchar Temp_Value[]={0x00,0x00}; uchar Back_Temp_Value[]={0xFF,0xFF}; uchar Display_Digit={0,0,0,0}; bit DS18B20_IS_OK=1; uint tCount=0     void DelayXus(int x) {      uchar i;     while(x--) for(i=0;i<200;i++);  }  uchar LCD_Busy_Check()reentrant void Write_LCD_Command(uchar cmd) void Write_LCD_Data(uchar data) void LCD_Initialise() void Set_LCD_POS(uchar pos) void Write_NEW_LCD_Char()                              //液晶控制函数    void Delay(uint x) {    while(--x)  }                                                       //延时2   uchar Init_DS18B20() {   uchar	   DQ=1;Delay(8);DQ=0;Delay(90);   DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;   return status; }  uchar ReadOneByte() {   uchar i,data=0;   DQ=1;_nop_();   for(i=0;i<8;i++)    {      DQ=0;data>>=1;DQ=1;_nop_();_nop_();  if(DQ)data=0x80;Delay(30);DQ=1; } return data }   uchar  WriteOnebyte(uchar dat) {    uchar i;    for(i=0;i<8;i++)      {    DQ=0;DQ=data&0x01;    Delay(5);DQ=1;data>>=1;  } }   void Read_Temperature() {    if(Init_DS18B20()==1)      DS18B20_IS_OK=0; else   {     writeoneByte(0xCC); writeoneByte(0x44); Init_DS18B20(); writeoneByte(0xCC); writeoneByte(0xBE); Temp_Value[0]=ReadOneByte(); Temp_Value[1]=ReadOneByte(); DS18B20_IS_OK=1;    } }    void Display_Temperature() {    uchar i;    uchar t=150;    uchar ng=0;    if((Temp_Value[1]&0xF8)==0xF8)      {    Temp_Value[1]=~Temp_Value[1];    Temp_Value[0]=~Temp_Value[0]+1;    if(Temp_Value[0]==0x00)    Temp_Value[1]++;    ng=1;  } Display_Digit[0]=df_Table[Temp_Value[0]&0x0F]; Current=((Temp_Value[0]&0xF0>>4))|((Temp_Value[1]&0x07<<4)); Signed_Temp=!ng?CurrenT:-CurrenT; Display_Didit[3]=CurrenT/100; Display_Didit[2]=CurrenT%100/10; Display_Didit[1]=CurrenT%10 Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0'; Current_Temp_Display_Buffer[10]='.'; Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';  if(Display_Digit[2]==0&&Display_Digit[3]==0) if(ng) {   if(Current_Temp_Display_Buffer[8]=='')  Current_Temp_Display_Buffer[8]=='-';   else   if(Current_Temp_Display_Buffer[7]=='')  Current_Temp_Display_Buffer[7]=='-';   else   Current_Temp_Display_Buffer[6]=='-'  }   Set_LCD_POS(0x40);  for(i=0;i<16;i++)  Write_LCD_Data(Current_Temp_Dispaly_Buffer[i])    Set_LCD_POS(0x4E);  Write_LCD_Data(0x00);  Set_LCD_POS(0x4E);  Write_LCD_Data('C'); }   Void T0_INT0()interrup 1 {   TH0=-50000/256;   TL0=-50000%256;   Read_Temperature();    if(!DS18B20_IS_OK)return;   if(Temp_Value[0]!=Back_Value[0]||Temp_Value[1]!=Back_Value[1])    {     Back_Temp_Value[0]=Temp_Value[0]; Back_Temp_Value[1]=Temp_Value[1]; Display_Temperature();   }    if(Signed_Temp>=90)Signed_Temp=90;   if(Signed_Temp<=0)Signed_Temp=0      if(Signed_Temp>=20&&<=30)    {      MA=1;MB=0;  PWM=1;DelayXus(50);return; } PWM=1;DelayXus(Signed_Temp-30)    if(Signed_Temp>30)     {   MA=1;MB=0;   PWM=1;DelayXus(10);return; } PWM=1;DelayXus(Signed_Temp)    if(Signed_Temp<10)      {    MA=0;MB=1;    PWM=1;DelayXus(10);return;  }  PWM=0;DelayXus(10-Signed_Temp);     if(Signed_Temp>=10&&<=20)    {     MA=0;MB=1; PWM=0;DelayXus(10);return;    }    PWM=0;DelayXus(Signned_Temp);    else   {     MA=0;MB=0;   } }   void main() {   LCD_Intialise();   Read_Temperature();   Delay(5000);   Delay(5000);   TMOD=0x01;   TH0=-50000/256;   TL0=-50000%256;   IE=0x82;   TR0=1;   while(1); }

引用 5 楼 user-1的回复:uint tCount=0;   //后面漏了分号 谢谢，我明天改一下看看

引用 1 楼 user-1的回复:看不太清楚，前面一句是否少了  ; 确实没有拍全，有点失误

看不太清楚，前面一句是否少了  ;


Question: 51单片机初学，中断消抖问题

去抖不是这么去的……再说了在中断里调用delay(2000)，是不是疯了。

引用 1 楼 a763629657的回复:我想知道:1.迅速按下按键，为什么延时两秒之后数码管还会加一？ 2.为什么条件设置为p3.2==1还会让数码管加一？ 3.为什么迅速按下多次还会慢慢加一？ 按键按下，可以这样理解，按下再松开，电平由低变高，你要记录的是这个过程，延时消抖在这个过程里实现。


Question: 线性表顺序结构(C语言)

建议直接贴代码并且提供更多的代码，比如main函数里调用该函数的代码。

引用 1 楼 user-2 的回复:Student *stu 是个指针，没有分配空间，输入内容给stu[i]出错 没看到具体调用过程 P定义之前new 出空间让stu指向就可以了 SqlList * P=new SqlList; P->stu=new char [100];//分配100 char 的内存让stu 指向它 p->length=100; InitList_sq(P); delete P->stu; delete P; delete P->stu;

Student *stu 是个指针，没有分配空间，输入内容给stu[i]出错 没看到具体调用过程 P定义之前new 出空间让stu指向就可以了 SqlList * P=new SqlList; P->stu=new char [100];//分配100 char 的内存让stu 指向它 p->length=100; InitList_sq(P); delete stu; delete P;


Question: C语言fopen函数效率为什么怎么低下？？？ 如图

fclose(File * fp)是这样用的吧 File *fp; fp=fopen("1.txt","r"); fclose(fp);


Question: 类似天书了

也没那么天书了，分解下就能看明白  #include<stdio.h> int  main() {     printf("%d\n", 'c');     printf("%d\n", 'c'*-1);     printf("%d\n", ~('c'*-1));     printf("%c\n", ~('c'*-1)); }

这还算天书？步步高点读机的小女孩都轻松解决~~~ 给你看个接近天书的，双色球33个红球选6的APL代码如下（啥是APL请自行搜索）： x[⍋x←6?33]

'c'是一个整数，也是'c'的ASCII码 'c'*-1就是乘以负一 ~就是对这个乘积进行按位取反 如果要彻底搞明白 你首先要把整型变量的结构从比特位级别理解清楚 包括负数的结构（这里你需要了解补码） 然后要了解~的作用 然后就OK了

补码和位运算等搞清楚就好了


Question: 小白求教链队

不知道对不对，反正没有语法错误了 // ConsoleApplication4.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #define OK 1 #define ERROR 0 typedef char QElemType; typedef int Status; typedef struct Duilie { 	QElemType data; 	struct Duilie *next; }Duilie, *Dl; typedef struct { 	Dl front; 	Dl rear; }DL;  Status InitQueue(DL &G) {//初始化 	G.front = G.rear = new Duilie; 	G.front->next = NULL; 	return OK; } Status EnQueue(DL &G, QElemType e) {//入队 	Dl Q = new Duilie(); 	Q->data = e; 	Q->next = NULL; 	G.rear->next = Q; 	G.rear = Q; 	return OK; } Status DeQueue(DL &G, QElemType &e) {//出队 	if (G.front == G.rear) 		return ERROR; 	Dl Q; 	Q = G.front->next; 	e = Q->data; 	G.front->next = Q->next; 	if (G.rear == Q) 		G.rear = G.front; 	delete Q; 	return OK; } QElemType GetHead(DL G) {//取队头元素 	if (G.rear == G.front) 		return ERROR; 	return G.front->next->data; } Status QueueEmpty(DL G) { 	if (G.rear != G.front) 		return OK; 	else 		return ERROR; } int main() { 	return 0; }

怀疑不是找不到，而是不找或者找不到吧

建议提供更多代码和更多有关问题的说明。 代码写成这样，难道不自己编译一下，起码把错误去掉吧 if(G.rearG.front)         return OK;

你现在的问题是什么，都没说清楚，编译通不过，还是调用不能达到效果


线程不调用界面函数是不会建立消息队列的 消息发给线程进入线程的消息队列，消息循环将消息取出并分发给相应的窗口处理函数 如你所说，线程需要这个定时器消息干啥 还有窗口的也是可以接收并处理自己的定时器消息的

引用 14 楼 Intel0011 的回复:GetMessage确实收到了0x113消息，具体不知干嘛用的，对界面编程不熟悉，其实Windows有很多内部处理，不同版本的Windows内部也有区别，虽然表面看上去没变化 我觉得应该没吧，我既然指定窗口句柄它就没有，指定NULL它就有，应该是0x113消息不是发给窗口h的，所以GetMessage只接收窗口h的消息时没有0x113，如果0x113是发给线程的就说得通了，而且GetMessage指定NULL时是可以接收发给本线程的所有消息，能接收到0x113也是情理之中，您对这个推论怎么看？  （其实我还试过不创建窗口就捕获消息，结果没有消息，更没有0x113，所以这个0x113是有窗口的线程才有的？）

引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 user-2 的回复:] GetMessage 有这样的说明 If the function retrieves the WM_QUIT message, the return value is zero. 你误会了，我还分不清返回值和消息？ 你看看代码：  	while( GetMessage(&msg, h, 0, 0) ) 	{ 		printf("收到消息%d\n", msg.message); 		DispatchMessage ( &msg ); 	}  当关闭窗口后，会不断收到消息0，返回值0的话早跳出循环了[/quote] 关闭窗口后一般的处理是结束消息循环、进程退出，难道你没有结束循环，还是创建了多个窗口，将你的完整代码贴出来看看 还有这等怪事

引用 12 楼 Intel0011 的回复:1、改为NULL表示接收这个线程创建的所有窗口的消息，见MSDN，是的，一个线程可以创建多个窗口 2、系统在创建窗口的过程中会向窗口发送很多消息来完成创建的动作，没关闭窗口的时候却反而一直收到0x113号定时器消息可能就是其中之一，至于是干啥没关注 3、如果消息循环中无法收到WM_CLOSE，那肯定是非队列消息，直接发给窗口过程处理，没有经过消息循环 我测试了下，窗口过程中没有捕获到这个0x113消息，也只有在GetMessage指定为句柄为NULL时才会在消息循环中不断收到这个消息，所以这个消息是发给线程而不是窗口的吗？（其实指定句柄为h时没有收到此消息应该也可以推出这一点吧）

引用 11 楼 六道佩恩 的回复:[quote=引用 9 楼 Intel0011 的回复:] while( GetMessage(&msg, h, 0, 0) ) ---> 这个也有问题  改为 while( GetMessage(&msg, NULL, 0, 0) ) 理论上改为NULL的话，关闭窗口应该会阻塞吧？关闭窗口的确没再收到消息了，但没关闭窗口的时候却反而一直收到0x113号定时器消息，可我没设置定时器呀。 还有个问题就是，我在消息循环中竟然无法收到WM_CLOSE，窗口过程却能收到，难道WM_CLOSE是非队列消息吗？[/quote] 1、改为NULL表示接收这个线程创建的所有窗口的消息，见MSDN，是的，一个线程可以创建多个窗口 2、系统在创建窗口的过程中会向窗口发送很多消息来完成创建的动作，没关闭窗口的时候却反而一直收到0x113号定时器消息可能就是其中之一，至于是干啥没关注 3、如果消息循环中无法收到WM_CLOSE，那肯定是非队列消息，直接发给窗口过程处理，没有经过消息循环

引用 9 楼 Intel0011 的回复:while( GetMessage(&msg, h, 0, 0) ) ---> 这个也有问题  改为 while( GetMessage(&msg, NULL, 0, 0) ) 理论上改为NULL的话，关闭窗口应该会阻塞吧？关闭窗口的确没再收到消息了，但没关闭窗口的时候却反而一直收到0x113号定时器消息，可我没设置定时器呀。 还有个问题就是，我在消息循环中竟然无法收到WM_CLOSE，窗口过程却能收到，难道WM_CLOSE是非队列消息吗？

更正一下： 系统默认的DefWindowProc窗口处理函数是不会帮你处理WM_QUIT消息的 改为 DefWindowProc不处理WM_DESTROY消息 因为 窗口处理函数根本收不到WM_QUIT消息

不过理论上关闭窗口的话，不是会转换成WM_QIUT消息而结束消息循环吗？ ---> 这句话是有问题的  系统默认的DefWindowProc窗口处理函数是不会帮你处理WM_QUIT消息的 所以要写成 LRESULT MyProc( HWND h, UINT msg, WPARAM wParam, LPARAM lParam) {     switch (msg)    {       case WM_DESTROY:          PostQuitMessage(0);          return 0;    }     return DefWindowProc( h, msg, wParam, lParam); }  另外 while( GetMessage(&msg, h, 0, 0) ) ---> 这个也有问题 改为 while( GetMessage(&msg, NULL, 0, 0) ) 关闭窗口后，句柄h变为无效，while( GetMessage(&msg, h, 0, 0) ) 死循环，此时消息队列中没什么有用的消息可以取得

引用 3 楼 user-2 的回复:If the function retrieves a message other than WM_QUIT, the return value is nonzero.  If the function retrieves the WM_QUIT message, the return value is zero.   If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer. To get extended error information, call GetLastError.  Warning   Because the return value can be nonzero, zero, or -1, avoid code like this:  while (GetMessage( lpMsg, hWnd, 0, 0)) ... The possibility of a -1 return value means that such code can lead to fatal application errors. Instead, use code like this:  Hide Example  BOOL bRet;  while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) {      if (bRet == -1)     {         // handle the error and possibly exit     }     else     {         TranslateMessage(&msg);          DispatchMessage(&msg);      } } 抱歉抱歉，的确是返回值的问题，我之前一直没考虑到这点，以为是一直在发送WM_NULL。不过理论上关闭窗口的话，不是会转换成WM_QIUT消息而结束消息循环吗？

引用 5 楼 Intel0011 的回复:关闭窗口后一般的处理是结束消息循环、进程退出，难道你没有结束循环，还是创建了多个窗口，将你的完整代码贴出来看看 还有这等怪事  #include "stdio.h" #include "windows.h" LRESULT MyProc( HWND h, UINT msg, WPARAM wParam, LPARAM lParam) { 	return DefWindowProc( h, msg, wParam, lParam); } int main( void ) { 	WNDCLASS MyClass; 	MyClass.style 			=0;			 	MyClass.lpfnWndProc	=MyProc;	 	MyClass.cbClsExtra		=0;		 	MyClass.cbWndExtra	=0;	 	MyClass.hInstance		=NULL;		 	MyClass.hIcon			=NULL;			 	MyClass.hCursor		=NULL;		 	MyClass.hbrBackground	=NULL;	 	MyClass.lpszMenuName	=NULL;	 	MyClass.lpszClassName	="MyClass";	 	RegisterClass( &MyClass ); 	 	MSG msg; 	HWND h = CreateWindow( "MyClass", "新窗口", WS_OVERLAPPEDWINDOW,  							0, 0, 200, 200, NULL, NULL, NULL, NULL); 	ShowWindow(h, SW_SHOW);				 	UpdateWindow(h);					 	while( GetMessage(&msg, h, 0, 0) ) 	{ 		printf("收到消息%d\n", msg.message); 		DispatchMessage ( &msg ); 	} 	return 0; }

引用 3 楼 user-2 的回复:If the function retrieves a message other than WM_QUIT, the return value is nonzero.  If the function retrieves the WM_QUIT message, the return value is zero.   If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer. To get extended error information, call GetLastError.  Warning   Because the return value can be nonzero, zero, or -1, avoid code like this:  while (GetMessage( lpMsg, hWnd, 0, 0)) ... The possibility of a -1 return value means that such code can lead to fatal application errors. Instead, use code like this:  Hide Example  BOOL bRet;  while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) {      if (bRet == -1)     {         // handle the error and possibly exit     }     else     {         TranslateMessage(&msg);          DispatchMessage(&msg);      } } 无语，您能好好看看问题吗？我输出的是获取的消息值？为啥你老是谈GetMessage的返回值？

引用 1 楼 user-2 的回复:GetMessage 有这样的说明 If the function retrieves the WM_QUIT message, the return value is zero. 你误会了，我还分不清返回值和消息？ 你看看代码：  	while( GetMessage(&msg, h, 0, 0) ) 	{ 		printf("收到消息%d\n", msg.message); 		DispatchMessage ( &msg ); 	}  当关闭窗口后，会不断收到消息0，返回值0的话早跳出循环了


Question: 关于找不到标识符

引用 1 楼 user-6的回复:你PE函数的定义呢？ 对，没有定义了，所以导致出错了

既然问题解决了，那就把帖子给结了嘛！  不想给分的话，就点 不满意 不就行了？ 悬在 未解决 的版块里有什么意思呢？ 都发了这么多帖子了，还 0% 的结帖率，还是想想是不是应该厚道一点！

嗯嗯，问题已经解决！！！

最好把完整的代码粘贴出来，你直接制图一半，我们只能猜测你的PE是你的自定义函数

引用 2 楼 自信男孩的回复:这种问题很难定位，因为问题都需要大家去猜的。 懂了，谢谢谢

引用 3 楼 赵4老师的回复:VS IDE中，在不明白的符号PE上点鼠标右键，选转到定义。 懂了，谢谢谢(*°∀°)=3

引用 5 楼 六道佩恩的回复:看样子这里的PE应该是个函数或宏函数，但这个函数没有定义或声明 懂了，谢谢谢谢！！！

看样子这里的PE应该是个函数或宏函数，但这个函数没有定义或声明

或转到所有引用。

VS IDE中，在不明白的符号PE上点鼠标右键，选转到定义。

这种问题很难定位，因为问题都需要大家去猜的。

你PE函数的定义呢？


Question: 编写一个函数

所谓的回文串就是左右对称，根据这个思路就可以写出来了

引用 1 楼 轻箬笠 的回复:int main() { 	char buf[] = "ABCBA"; 	size_t size = sizeof(buf); 	size_t i; 	for (i = 0; i < size / 2; i ++) { 		if (buf[i] != buf[size - 1 - i]) 			break; 	} 	if (i == size / 2) 		printf("no\n"); 	else 		printf("yes\n"); 	system("pause"); 	return 0; }  size_t size = sizeof(buf); 这行代码换成这样或许更好： size_t size = strlen(buf); 如下代码，供参考： #include <stdio.h> #include <string.h>  int main() {     char buf[] = "ABCBA";     size_t size = strlen(buf);     size_t i;     for (i = 0; i < size / 2; i ++) {         if (buf[i] != buf[size - i])             break;     }     if (i == size / 2)         printf("no\n");     else         printf("yes\n");     system("pause");     return 0; }


Question: c语言错误运行不了

引用 2 楼 男爵 的回复：[quote=引用 1 楼 jsx_SEVEN的回复:]可能是编译器的问题，把 i 的声明放在前面试试 解决了，果然是把 i放for前面先定义，难道不能在for循环里定义吗 [/quote]这个就涉及到变量的作用域了，如果是在括号内定义的，它的作用域就只是在括号里，括号外面就不支持了，所以改在外面定义就可以了

引用 2 楼 男爵 的回复:[quote=引用 1 楼 jsx_SEVEN的回复:]可能是编译器的问题，把 i 的声明放在前面试试 解决了，果然是把 i放for前面先定义，难道不能在for循环里定义吗 [/quote] C语言不支持这样在for里定义i，C++是支持这样的操作的。

引用 1 楼 jsx_SEVEN的回复:可能是编译器的问题，把 i 的声明放在前面试试 解决了，果然是把 i放for前面先定义，难道不能在for循环里定义吗

可能是编译器的问题，把 i 的声明放在前面试试


Question: 首先在主函数中输入10个整数，然后在被调函数中对这10个数按降序排序。最后在主函数中输出结果。请将以下程序补充完整，最后提交完整的源程序。限定不能使用函数返回值

可以先学学排序算法 sort函数排序 https://blog.csdn.net/weixin_43956598/article/details/90241551 冒泡排序 https://blog.csdn.net/weixin_43956598/article/details/90176251 选择排序 https://blog.csdn.net/weixin_43956598/article/details/90178197 插入排序 https://blog.csdn.net/weixin_43956598/article/details/90181567 快速排序 https://blog.csdn.net/weixin_43956598/article/details/90215135 希尔排序 https://blog.csdn.net/weixin_43956598/articledetails/90234480 堆排序https://blog.csdn.net/weixin_43956598/article/details/90343547

引用 3 楼 自信男孩 的回复:[quote=引用 1 楼 2019别做废物 的回复:] #include <stdio.h> #define N 10 void sort(int a[],int n) { 	int i = 0; 	int j = 0; 	int temp = 0; 	for (i = 0; i < 10 - 1; i++) { 		for (j = 0; j < 10 - 1 - i; j++) { 			if (a[j] < a[j + 1]) { 				temp = a[j]; 				a[j] = a[j + 1]; 				a[j + 1] = temp; 			} 		} 	} } int main(void) { 	int a[N], i; 	for (i = 0; i < N; i++) { 		scanf("%d", &a[i]); 	}  	sort(a, N); 	for (i = 0; i < N; i++) { 		printf("%d,", a[i]); 	}   	return 0; }  这样做或许更好。  void sort(int a[],int n) {     int i, j;     int temp = 0;      for (i = 0; i < n - 1; i++) {         for (j = 0; j < n - 1 - i; j++) {             if (a[j] < a[j + 1]) {                 temp = a[j];                 a[j] = a[j + 1];                 a[j + 1] = temp;             }         }     } }[/quote]  emmm 有什么区别吗

引用 5 楼 至尊宝、 的回复:供参考#include<iostream> using namespace std;  void SortArray(int* p, int n);				//对数组进行排序，p数组，n数组元素个数 void ShowArray(const int* p, int n);		//打印数组  int main() { 	int a[10] = { 0 }; 	cout << "请输入10个整数：" << endl; 	for (int i = 0; i < 10; i++) 	{ 		cin >> a[i]; 	} 	SortArray(a, 10); 	ShowArray(a, 10); 	return 0; }  void SortArray(int * p, int n) { 	for (int i = 0; i < n - 1; i++) 	{ 		for (int j = 0; j < n - 1 - i; j++) 		{ 			if (p[j] < p[j + 1]) 			{ 				int temp; 				temp = p[j]; 				p[j] = p[j + 1]; 				p[j + 1] = temp; 			} 		} 	} }  void ShowArray(const int* p,int n) { 	cout << "排序后的结果为：" << endl; 	for (int i = 0; i < n; i++) 	{ 		cout << p[i] << ' '; 	} }不好意思  看错了 我是用c++写的 c的话你参考着改一改吧

#include <stdio.h>  #define N 10  void sort(int a[],int n) {     int i, j;     int temp = 0;      for (i = 0; i < n - 1; i++) {         for (j = 0; j < n - 1 - i; j++) {             if (a[j] < a[j + 1]) {                 temp = a[j];                 a[j] = a[j + 1];                 a[j + 1] = temp;             }         }     } }  void select_sort(int *a, int n) {     int i, j;     int temp, max;      for (i = 0; i < n - 1; i++) {         max = i;         for (j = i + 1; j < n; j++)             if (a[max] < a[j])                 max = j;          if (max != i) {                 temp = a[max];                 a[max] = a[i];                 a[i] = temp;         }     } }  int main(void) {     int a[N], i;     for (i = 0; i < N; i++) {         scanf("%d", &a[i]);     }      //sort(a, N);     select_sort(a, N);     for (i = 0; i < N; i++) {         printf("%d,", a[i]);     }     putchar(10);       return 0; }  供参考！

引用 1 楼 2019别做废物 的回复:#include <stdio.h> #define N 10 void sort(int a[],int n) { 	int i = 0; 	int j = 0; 	int temp = 0; 	for (i = 0; i < 10 - 1; i++) { 		for (j = 0; j < 10 - 1 - i; j++) { 			if (a[j] < a[j + 1]) { 				temp = a[j]; 				a[j] = a[j + 1]; 				a[j + 1] = temp; 			} 		} 	} } int main(void) { 	int a[N], i; 	for (i = 0; i < N; i++) { 		scanf("%d", &a[i]); 	}  	sort(a, N); 	for (i = 0; i < N; i++) { 		printf("%d,", a[i]); 	}   	return 0; }  这样做或许更好。  void sort(int a[],int n) {     int i, j;     int temp = 0;      for (i = 0; i < n - 1; i++) {         for (j = 0; j < n - 1 - i; j++) {             if (a[j] < a[j + 1]) {                 temp = a[j];                 a[j] = a[j + 1];                 a[j + 1] = temp;             }         }     } }

百度一下排序算法代码


Question: 为什么最后输出的成绩不是我第一个输入的成绩

数组的下标从0开始的

#include <stdio.h> #include<string.h>  #define N 5  struct student {     int id;     float score[3];     float sum,ave;     char name[10]; } stu[N];  int main() {     int i,j;     float a=0;     for(i=0;i<N;i++)     {         printf("请输入第%d名学生的学号和姓名：\n",i+1);         //scanf("%d,%s",&stu[i].id,&stu[i].name);         scanf("%d,%s",&stu[i].id, stu[i].name);         for(j=0;j<3;j++)         {             printf("请输入%s的第%d门成绩：\n",stu[i].name,j+1);             scanf("%f", &stu[i].score[j]);             a = a+stu[i].score[j];             //stu[i].sum = a;         }         stu[i].sum = a;         stu[i].ave = stu[i].sum/3;         printf("%s的平均分为%3.2f\n",stu[i].name,stu[i].ave);         a=0;     }       //printf("第一个人的第一门成绩为%3.2f",stu[1].score[1]);     printf("第一个人的第一门成绩为%3.2f",stu[0].score[0]); } 供参考，第一个人的下表应该从0开始。其他问题详见代码。


那是你的误用，不安全的代码，没报错不等于代码就是正确的，数组已经越界，不一定会报运行时错误，但肯定覆盖了别的地址上的byte，不同编译器结果也不见得一样。  第二个参数字节数理论上就是第一个参数的缓冲区长度才是安全的。  errno_t strcat_s(char *_Dst, rsize_t _SizeInBytes, const char * _Src);  还有种模板函数实现很显然 template<size_t __Size> errno_t strcat_s(char (&_Dst)[__Size], const char * _Src);

这是MSDN上的解释

引用 1 楼 user-3 的回复:num处应该用strlen(str1)替代吧？ 谢谢 但还是有个疑问。能看下我的回帖吗

引用 2 楼 636f6c696e 的回复:你理解错了哦，传入一个char *，strcat_s根本不可能知道他的实际长度，只能通过第二个入参来感知。 你的例子里第二个参数传入的是num，那么strcat_s计算后发现能够满足。 num如果改成strlen(str1)就会报错 谢谢。但我有个疑问。既然strcat_s增加一个参数num来确定dest的总容量，我理解可能在strcat_s内部是这样处理的: 首先得到dest的实际长度len1 和 source的实际长度len2，根据 num 和 （len + len2）来判断是否越界，从而返回ERANGE。 但是上面的程序，我将num改成 num = sizeof(str1)，就直接报错，而不是返回ERANGE，那这个strcat_s有啥意义呢。


Question: 用最新版的xcode写c语言为什么提示“stdih.h” file not found？

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

好好练练打字吧，一会是stdib一会是stdih 百度搜索stdib自动弹出stdlib的结果

引用 11 楼 weixin_42228722 的回复:[quote=引用 10 楼 六道佩恩 的回复：][quote=引用 6 楼 weixin_42228722 的回复:] 这个没问题了，底下又出现‘windows.h’和‘conio.h’ file not found了 你这是在windows平台吗？[/quote]macos[/quote] 额，既然不是windows平台，哪来的windows.h？怎么能用windows的API？

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

引用 10 楼 六道佩恩 的回复：[quote=引用 6 楼 weixin_42228722 的回复:] 这个没问题了，底下又出现‘windows.h’和‘conio.h’ file not found了 你这是在windows平台吗？[/quote]macos

引用 6 楼 weixin_42228722 的回复:这个没问题了，底下又出现‘windows.h’和‘conio.h’ file not found了 你这是在windows平台吗？

引用 1 楼 拥抱Linux 的回复:！ 头文件名应该是 <stdlib.h>，分别对应的大写字母是STDLIB.H，你少写了一个字母L的小写l。 欢迎结帖、给分！ ！ 虽然你的本意应该不是头文件可以大写的意思  不过这样写可能会略带误导  最好能强调一下 stdlib.h 要小写

引用 7 楼 拥抱Linux 的回复：[quote=引用 6 楼 weixin_42228722 的回复:] 这个没问题了，底下又出现‘windows.h’和‘conio.h’ file not found了 ～ 不是打击你，只是还没搞清楚这两个头文件<windows.h>、<conio.h>适用于哪个操作系统平台，也忘记了xcode到底在哪个操作系统平台，就贸然抄程序，真的合适么？ ～ 提问的问题都回答了，麻烦先把帖子结了，把分给了吧！ ～[/quote]第一次发帖，手机端找了半天没找到在哪儿结贴……回去用电脑结

引用 6 楼 weixin_42228722 的回复:这个没问题了，底下又出现‘windows.h’和‘conio.h’ file not found了 ～ 不是打击你，只是还没搞清楚这两个头文件<windows.h>、<conio.h>适用于哪个操作系统平台，也忘记了xcode到底在哪个操作系统平台，就贸然抄程序，真的合适么？ ～ 提问的问题都回答了，麻烦先把帖子结了，把分给了吧！ ～

注意拼写，应该是stdlib.h，你少了一个l（大写是L）

引用 1 楼 拥抱Linux 的回复：！ 头文件名应该是 <stdlib.h>，分别对应的大写字母是STDLIB.H，你少写了一个字母L的小写l。 欢迎结帖、给分！ ！傻逼了卧槽


Question: C语言

我是在linux下是可以的，有可能是环境不同，你可以从环境入手看看，尤其像结束符判断这些。

void upstr(char *pstr) {     if (islower(*pstr))         *pstr -= 32;     pstr++;     while (*pstr) {         if (islower(*pstr) && *(pstr-1) == ' ')             *pstr -= 32;         pstr++;     } } 供参考！


Question: VS2019是把\0字符串结尾显示成？的吗？

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

啊  太谢谢了  果然是我的问题  谢谢谢谢 我找了半天问题在哪 没想到在这个问题上面

不，是你的\0位置有问题  #include<stdio.h>  void main(void) { 	char a[10];//字符数组 	printf("请输入你的昵称"); 	char b; 	int c = 0;  	b = getchar(); 	while (b != '\n') 	{ 		if (c != 9) 		{ 			a[c] = b; 			b = getchar(); 			c++; 		} 		else 		{ 			printf("昵称太长了\n");  		} 	} 	a[c] = '\0';		//此处c不用加1，因为经过上面的c++，c已经是最后字符的下一个位置 	printf("%s", a); }


Question: C语言萌新学习中遇到的第一个问题

引用 9 楼 拥抱Linux 的回复:[quote=引用 8 楼 ooolinux 的回复:] 思路不错，不过如果要打印10行的三角呢？ 10行其实也还是小case，写10个case嘛！  嘿嘿，不瞒您说，上面的代码虽说是凑热闹加半开玩笑，不过初学C的时候，有一个统计平年、闰年中的日期是一年的第几天的小题目，用没有break的switch-case代码块，有12个case，写起来根本停不下来，而且读起来还又直观又简洁。上面凑热闹的思路就是因为想起了这个小题目。 嘛，条条大路通罗马，想了解一下就了解一下，不想了解的话就当个乐吧！：） ～[/quote]  ok~

引用 8 楼 ooolinux 的回复:思路不错，不过如果要打印10行的三角呢？ 10行其实也还是小case，写10个case嘛！  嘿嘿，不瞒您说，上面的代码虽说是凑热闹加半开玩笑，不过初学C的时候，有一个统计平年、闰年中的日期是一年的第几天的小题目，用没有break的switch-case代码块，有12个case，写起来根本停不下来，而且读起来还又直观又简洁。上面凑热闹的思路就是因为想起了这个小题目。 嘛，条条大路通罗马，想了解一下就了解一下，不想了解的话就当个乐吧！：） ～

引用 7 楼 拥抱Linux 的回复:～ 凑个热闹。  #include <stdio.h>  void prt123(void) { 	printf("123, "); }  int main(int argc, char const *argv[]) { 	for (int i = 3; i > 0; i--) { 		switch (i) { 		case 3: 			prt123(); 		case 2: 			prt123(); 		case 1: 			prt123(); 		default: 			printf("\n"); 			break; 		} 	} 	return 0; }   ：-）  思路不错，不过如果要打印10行的三角呢？

先学会怎么提问吧，请仔细描述到底哪里遇到问题了 不会换行？不会输出？还是其他什么？

需要换行的时候加换行符就可以啦

void func(void) {     printf("123, "); }   供参考～

双重循环。字数字数。

#include "stdio.h" void Print123( void ) { 	printf("123, "); } int main( void ) { 	Print123(); 	Print123(); 	Print123(); 	printf("\n"); 	Print123(); 	Print123(); 	printf("\n"); 	Print123(); 	return 0; }

有错别字 需要打成语言了  第一次发帖手抖


Question: 求大佬帮帮忙，统计函数部分一直不成功，求修改（C语言，数据结构，顺序存储）

引用 7 楼 笑欢浮生若梦的回复:谢谢解答，第一次做这一类作业，谢谢 不客气，哈哈哈我也是个小白

谢谢解答，第一次做这一类作业，谢谢

# 基本编译错误帮你解决咯，建议代码多写注释，不然别人看着吃力 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STR_LEN 20 #define MAX_COURSE_NUM 10 /*定义Course结构体 参数： id:课程编号 name:课程名称 Score：学分 Date:开课日期 */ typedef struct course { 	int id; 	char name; 	int score, date; }COURSE; //显示菜单 void getHome(); //插入课程信息// int Insert(COURSE course[], int num); //打印课程信息 void PrintLine(COURSE course[], int num); //查询课程信息 int Search(COURSE course[], int course_id); //删除课程信息 int Delete(COURSE course[], int course_id); //此学期的课数总计 int ComputeSumDate(COURSE course[], int course_date);  int main() { 	COURSE a[MAX_COURSE_NUM];//定义数组a[10] 	COURSE course; 	int res, num, course_id, course_date; 	int command;//指令  	while (1) { 		getHome();//显示菜单 		scanf("%d", &command);//提示用户输入指令 		getchar();//用于清除“/n” 		fflush(stdin);//清空缓存区 		switch (command) { 		case 1: 			printf("input the number of course\n"); 			scanf("%d", &num);//课程编号 			fflush(stdin); 			if (num>MAX_COURSE_NUM) { 				printf("Exceeds the maximum\n"); 				continue; 			} 			res = Insert(a, num); 			if (res == 2) { 				printf("success!\n"); 			} 			else { 				printf("false!\n"); 			} 			break; 		case 2: 			printf("input the course id you want to del:\n"); 			scanf("%d", &course_id); 			fflush(stdin); 			res = Search(a, course_id); 			if (res == -1) { 				printf("the course is not exist\n"); 			} 			else { 				Delete(a, res); 				num = num - 1; 			} 			break; 		case 3: 			printf("input the course number you want to search\n"); 			scanf("%d", &course_id); 			fflush(stdin); 			res = Search(a, course_id); 			if (res == -1) { 				printf("the course is not exist\n"); 			} 			else { 				printf("%d\n", res); 			} 			break; 		case 4: 			PrintLine(a, num); 			break; 		case 5: 			printf("input the course date you want to count\n"); 			scanf("%d", &course_date); 			fflush(stdin); 			res = ComputeSumDate(a, course_date); 			if (res == -1) { 				printf("the course is not exist\n"); 			} 			else { printf("%d\n", res); } 			break; 		case 6: 			return 0; 		default: 			printf("input error!\n"); 			break; 		}   	}    } int Insert(COURSE course[], int num) { 	int i; 	for (i = 0; i <= num - 1; i++) { 		printf("input the course id:\n"); 		scanf("%d", &course[i].id); 		fflush(stdin); 		printf("input the course name:\n"); 		scanf("%s", &course[i].name); 		printf("input the course date:\n"); 		scanf("%d", &course[i].date); 		printf("input the course score\n"); 		scanf("%d", &course[i].score); 		fflush(stdin); 	} 	return 2; } void PrintLine(COURSE course[], int num) { 	int i; 	if (num == 0) { 		printf("the course array is null\n"); 	} 	else { 		for (i = 0; i<num; i++) {  			printf("编号:%d 名字:%s 学分:%d 开课日期：%d,", course[i].id, &course[i].name, course[i].score, course[i].date); 			printf("\n");  		}   	} } int Search(COURSE course[], int course_id) { 	int i; 	for (i = 0; i <= MAX_COURSE_NUM; i++) { 		if (course[i].id == course_id) { 			printf("编号:%d,名字:%s,学分:%d,开课日期：%d,", course[i].id, &course[i].name, course[i].score, course[i].date); 			return i + 1; 		} 	} 	return -1; } int Delete(COURSE course[], int course_id) { 	int j; 	for (j = course_id; j <= MAX_COURSE_NUM; j++) { 		course[j - 1].id = course[j].id; 		course[j - 1].name = course[j].name; 		course[j - 1].score = course[j].score; 	} 	printf("success!\n"); 	return 1;  } int ComputeSumDate(COURSE course[], int course_date) { 	{ 		int i, sum = 0; 		for (i = 0; i <= MAX_COURSE_NUM - 1; i++) { 			if (course[i].date == course_date) 			{ 				sum++; 				i++; 			} 			else { i++; } 			printf("此学期的课数总计：%d\n", i); 		} 		return i; 	} 	return -1; }  void getHome() { 	printf("1.Insert course\n2.Del course\n3.Search course\n4.Display all course\n5.Count\n6.exit\n"); }

引用 2 楼 user-2_16_com的回复: int  home="1.Insert course\n2.Del course\n3.Search course\n4.Display all course\n5.Coun    t\n6.exit\n";  写的啥玩意儿。 这个是想显示菜单，怎么能用整型变量来搞呢，直接定义一个函数不就行了

看着像是大学生的作业，这种类似的问题实在是太多了  #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STR_LEN 20 #define MAX_COURSE_NUM 10 /*定义Course结构体   参数： id:课程编号 name:课程名称 Score：学分 Date:开课日期  */ typedef struct course{ 	int id; 	char name[MAX_STR_LEN]; 	int score; 	int date; }COURSE; //插入课程信息// int Insert(COURSE course[],int num); //打印课程信息 void PrintLine(COURSE course[],int num); //查询课程信息 int Search(COURSE course[],int course_id); //删除课程信息 int Delete(COURSE course[],int course_id);  int ComputeSumDate(COURSE course[],int course_date);  int main(){ 	COURSE a[MAX_COURSE_NUM]; 	COURSE course; 	int res,num,course_id,course_date; 	int command; 	char home[]="1.Insert course\n2.Del course\n3.Search course\n4.Display all course\n5.Count\n6.exit\n";  	while(1){ 		printf("%s",home); 		scanf("%d",&command); 		fflush(stdin);//清空缓存区 		switch(command){ 			case 1: 				printf("input the number of course\n"); 				scanf("%d",&num); 				fflush(stdin); 				if(num>MAX_COURSE_NUM){ 					printf("Exceeds the maximum\n"); 					continue; 				} 				res=Insert(a,num); 				if(res==2){ 					printf("success!\n"); 				}else{ 					printf("false!\n"); 				} 				break; 			case 2: 				printf("input the course id you want to del:\n"); 				scanf("%d",&course_id); 				fflush(stdin); 				res=Search(a,course_id); 				if(res==-1){ 					printf("the course is not exist\n"); 				}else{ 					Delete(a,res); 					num=num-1; 				} 				break; 			case 3: 				printf("input the course number you want to search\n"); 				scanf("%d",&course_id); 				fflush(stdin); 				res=Search(a,course_id); 				if(res==-1){ 					printf("the course is not exist\n"); 				}else{ 					printf("%d\n",res); 				} 				break; 			case 4: 				PrintLine(a,num); 				break; 			case 5: 				printf("input the course date you want to count\n"); 				scanf("%d",&course_date); 				fflush(stdin); 				res=ComputeSumDate(a,course_date); 				if(res==-1){ 					printf("the course is not exist\n"); 				}else{ printf("%d\n",res);} 				break; 			case 6: 				return 0; 			default : 				printf("input error!\n"); 				break; 		} 		command = -1;   	}    } int Insert(COURSE course[],int num){ 	int i; 	for(i=0;i<=num-1;i++){ 		printf("input the course id:\n"); 		scanf("%d",&course[i].id); 		fflush(stdin); 		printf("input the course name:\n"); 		scanf("%s",course[i].name); 		printf("input the course date:\n"); 		scanf("%d",&course[i].date); 		printf("input the course score\n"); 		scanf("%d",&course[i].score); 		fflush(stdin);   	} 	return 2; } void PrintLine(COURSE course[],int num){ 	int i; 	if(num==0){ 		printf("the course array is null\n"); 	}else{ 		for(i=0;i<num;i++){  			printf("编号:%d,名字:%s,学分:%d,开课日期：%d,",course[i].id,course[i].name,course[i].score,course[i].date); 			printf("\n");  		}   	} } int Search(COURSE course[],int course_id){ 	int i; 	for(i=0;i<=MAX_COURSE_NUM;i++){ 		if(course[i].id==course_id){ 			printf("编号:%d,名字:%s,学分:%d,开课日期：%d,",course[i].id,course[i].name,course[i].score,course[i].date); 			return i+1; 		} 	} 	return -1; } int Delete(COURSE course[],int course_id){ 	int j; 	for(j=course_id;j<=MAX_COURSE_NUM;j++){ 		course[j-1].id=course[j].id; 		strcpy(course[j-1].name, course[j].name); 		//course[j-1].name=course[j].name; 		course[j-1].score=course[j].score; 	} 	printf("success!\n"); 	return 1;  } int ComputeSumDate(COURSE course[],int course_date){ 	{ 		int i,sum=0; 		for(i=0;i<=MAX_COURSE_NUM-1;i++){ 			if(course[i].date==course_date) 			{sum++; 				i++; 			} 			else{i++;}  			printf("此学期的课数总计：%d\n",i); 		}  	} 	return -1; }

你说的统计函数，上面我没有改，你改成下面这样就没问题了  int ComputeSumDate(COURSE course[], int course_date) { 	{ 		int i, sum = 0; 		for (i = 0; i <= MAX_COURSE_NUM - 1; i++) { 			if (course[i].date == course_date) 			{ 				sum++; 				i++; 			} 		} 		printf("此学期的课数总计：%d\n", sum); 		return i; 	} 	return -1; }


Question: 搜了许久，实在不知道 ！什么意思

理解了谢谢你们的帮助

先不管【1】【2】填什么，程序走到循环里，e+new的时候，不知道e是多少，推断【1】应该是给e初始化，【2】肯定是循环条件 试试能用不  #include <stdio.h>  int main() { 	int i; 	double e, new; 	e = 1.0; 	new = 1.0; 	for (i = 1; new >= 1e-6; i++) 	{ 		new /= (double)i; 		e += new; 	} 	printf("%f\n", e); }

数学阶乘 1！=1 2！=2*1 3！=3*2*1 4！=4*3*2*1 n！=n*（n-1）*（n-2）*...*2*1


少1KB不代表有问题吧

没人用过么？？？？？


Question: Arduino 编程（C语言）字符串（char[]和String）的问题

看接收的HEX数据，看看是否包含0D 0A这类的回车换行符， 是否都在20～7F之间？ 换一个串口软件接收看看，可能是串口软件按接收到的数据分包了


Question: 看不懂了

切记！其实没有所谓的“多重指针”，永远只有一维指针，无论多少个*(星号)都好，它都只是一个指向xx的指针，跳出多重指针的局限，回归只有一维指针的基本思想。另外楼上全部正解。

j指向h，*j=h，h指向hello，即为hello的地址

怎么看不懂了，不就是指正的含义吗

这里的j是二级指针，它保存的是一级指针的地址，而h是一级指针，保存的是数据hello的地址；*是取一个指针指向单元的内容，j保存的是h的地址，*j就是取j所指向地址单元的值，也就是取h的值，h的值就是hello的地址咯！


Question: 多个等号，对结论有什么影响

for语句后直接是分号，代表该语句是空语句，不执行任何操作。紧接着执行后面的输出语句，由于i在for循环中进行了4次加1，所以最终i的值为4

for(i=0;i<=3;i++);  //运行的流程是i=0,1,2,3   当为3时，i与for中的3做比较，符合“i<=3”的条件，所以接着往下走。下一步走“i++”，此时i为4，不符合“i<=3”，所以跳出循环。此时i为4

这是一个完整的for循环： for(i=0;i<=3;i++)  //该循环下面只有一条语句，可以不加{}     printf("hello");  for(i=0;i<=3;i++)  //该循环有两条语句，必须加{}，表示两条语句都在循环里面 {     printf("hello");     printf("world"); }  for(i=0;i<=3;i++)  //该循环只有一条语句，下面那个world不在循环体里面     printf("hello"); printf("world");

不管是判断还是循环，你可以理解为执行的代码只有一行，即使用for、while，循环体都只有一行，你之所以能让循环体有多行代码，是因为你用大括号把它括起来了，使它组成了一条复合语句，所以还是一条语句。 for(i=0;i<=3;i++); 等价于 for(i=0;i<=3;i++)      ; 即它的循环体是一条空语句 所以循环结束后才输出i 所以结果是4


原来是这么判空 学习了

都在改编译告警了，连判空都不会么。。。

if(fp){  fscanf_s(...); }

引用 1 楼 user-4的回复:if (fp)    .... fscanf_s(if(fp),)？？？？？？

引用 3 楼 轻箬笠的回复:if(fp){  fscanf_s(...); } 谢谢大佬，谢谢大佬！！！

if (fp)    ....


Question: 这个哪里有问题吗。。

int cmp_score(void *a,void *b) {     DAT *m = (DAT *)a;     DAT *n = (DAT *)b;      if (m->average > n->average && fabs(m->average - n->average)>1e-6)         return 1;     else if (m->average < n->average && fabs(m->average - n->average) > 1e-6)         return -1;     else         return 0;      //return ((DAT*)b)->average-((DAT*)a)->average; } 问题出在这个函数，供参考！

int cmp_score(void *a,void *b)  {      return ((DAT*)b)->average-((DAT*)a)->average;  }  这个会损失精度， 改为  int cmp_score(const void *a,const void *b)  { 	 if (((DAT*)a)->average > ((DAT*)b)->average) { 		return -1; 	} 	else if (((DAT*)a)->average < ((DAT*)b)->average) { 		return 1; 	} 	else { 		return 0; 	}  }


Question: C语言小白

内层循环退出之后才开始下一次外层循环，除非break跳出

引用 1 楼 user-2的回复:1. 外层  i =  1   2   3   4   5 内层  i = 1 6-i=5  j<=5 j = 1、2、3、4、5          i = 2 6-i=4  j<=4 j = 1、2、3、4          i = 3 6-i=3  j<=3 j = 1、2、3          i = 4 6-i=2  j<=2 j = 1、2          i = 5 6-i=1  j<=1   j = 1  2. 外层  i =  1   2   3   4   5 内层  i = 1 6-i=5  j>=5 j = 5          i = 2 6-i=4  j>=4 j = 5、4          i = 3 6-i=3  j>=3 j = 5、4、3          i = 4 6-i=2  j>=2 j = 5、4、3、2          i = 5 6-i=1  j>=1  j = 5、4、3、2、1 谢谢啦，似乎懂了他这个出来的个数就代表每行的*号个数吧

谢谢啦，似乎懂了他这个出来的个数就代表每行的*号个数吧


Question: 萌新求助！萌新求助！萌新求助！

可以先读入一个字符数组 遍历判断，当判断到一个<nl>的时候，记录下位置，然后判断到</nl>的时候再次记录下位置，然后你读取时只要判断再在这两个位置之间就行了。 要方便点的话，可以用正则表达式相关的函数，比如regcomp、regexec、regfree、regerror 我说的是把上面这段文字用C语言读取的办法，不知道是不是你要的

请问，具体可以怎么做呢！

使用TinyXML库解析


Question: 求频度

求频度就是求时间复杂度吧


Question: C语言项目

建议贴出相关代码吧


Question: 数据结构与算法基础问题

堆调用者来说 对传入指针不进行修改就不需要& 需要修改就需要&

你得弄清楚加&的作用是什么，加了&说明是引用传递，你函数里修改形参会“间接“修改实参，而不加，你形参无论如何改变，实参都没有影响


Question: 在线等！大佬，求大佬帮忙改一下系统。救救孩子吧，多次出现函数定义非法

你这个代码真的看的我脑壳疼，自己写的？还是抄的？如果是抄的，能不能抄个没错误的，改半天改好排版，错误一大堆


ret = sendto(sock, msg, sizeof(msg), 0, (struct sockaddr*)&client_addr, len);  传的就是值。

检查下传入参数是否匹配类型吧，比如最后一个参数应传入int类型，非int *类型


Question: 求一段C代码

引用 1 楼 JhonDao的回复:可以变通一下，通过c语言代码来调用批处理命令。  #include <stdio.h> #include <windows.h>  int main() {     system("type 1.txt | clip");  //这是批处理命令      return 0; } 好吧，是电脑问题，我在虚拟机上试了一下可以有

引用 1 楼 JhonDao的回复:可以变通一下，通过c语言代码来调用批处理命令。  #include <stdio.h> #include <windows.h>  int main() {     system("type 1.txt | clip");  //这是批处理命令      return 0; } 我添加了windows.h的头文件，但是他还是说clip不是命令。 问题已经解决了 谢谢

引用 2 楼 zgl7903的回复:https://blog.csdn.net/ycc892009/article/details/6521565 https://docs.microsoft.com/zh-cn/windows/desktop/dataxchg/clipboard-operations 对啊，就是这些我看的云里雾里的 不过现在能用了，虽然不太懂 谢谢

#include "stdio.h" #include "windows.h" void FileToClip( const char* FileName )  { 	char str[500]; 	sprintf( str, "type %450s | clip", FileName ); 	system( str ); } int main( void ) { 	FileToClip("1.txt");	//你要粘贴进剪贴板的文件  	return 0; }

FILE *fp; 	fopen_s(&fp, "D:\\1.txt", "rb+"); 	fseek(fp, 0L, SEEK_END); 	long len = ftell(fp); 	HGLOBAL clipData = GlobalAlloc(GMEM_FIXED, len + 1); 	fseek(fp, 0L, SEEK_SET); 	fread(clipData, 1, len, fp); 	fclose(fp); 	((char*)clipData)[len] = 0; 	OpenClipboard(NULL); 	EmptyClipboard(); 	SetClipboardData(CF_TEXT, clipData); 	CloseClipboard();


Question: 输入字符串，把小写换成大写字母，去掉*，我哪里有问题啊，不懂

引用 4 楼 Italink的回复: 谢谢你了嗷，我已经懂了

引用 4 楼 Italink的回复: 明白了，是我上一个程序程序一直在运行

是我编译器的问题吗，为什么全是数字啊

引用 1 楼 Italink的回复:没懂你的代码什么意思，按你的要求改了一下，你看这样对吗？  #include<stdio.h> char* del(char* s); int  main() { 	char a[80]; 	gets(a);// 输入待处理的字符串;   	del(a); 	puts(a); //输出处理后的字符串; 	return 0; } char* del(char* s) { 	int i; 	int j; 	for (i = 0, j = 0; *(s + i) != '\0'; i++) 	{ 		if ('a' <= *(s + i) && 'z' >= *(s + i)) {	//小写->大写 ：-32 			*(s + j) = *(s + i) - 32; 			j++; 		} 		if (*(s + i) == '*')	//去除* 			continue; 	} 	*(s + j) = '\0'; 	return s; }  额，我试了一下，输出的全是数字

#include<stdio.h> char*  del (char *s); int  main()  {    char a[80];   gets(a);// 输入待处理的字符串;      del(a);   puts(a); //输出处理后的字符串;    return 0;   } char*  del (char *s) { int i; int j; for(i=0,j=0;*(s+i)!='\0';i++) { if('a'<=*(s+i)&&'z'>=*(s+i)) { *(s+j)=*(s+i)+'A' - 'a'; j++; continue; } if(*(s+i)=='*') continue; else { *(s+j)=*(s+i); j++; } //if(*(s+j)) //*(s+i)=*(s+j); } *(s+j)='\0'; }


Question: c++新人求助！关于结构体类型的set容器的删除元素操作

上面写错了，你的第一个元素应该是{num=1,a1="j"}，另外在循环中最后不要调用earse

set.erase()提供了4种重载，分别可以通过key，或者迭代器，或者迭代器范围来删除元素。 按你所说，是想通过key来删除元素，而你的key为结构体zhb1，所以删除的时候参数需要给一个结构体。 比如你set的第一个元素为{num=0,a1="j"}，删除它就调用s.earse({1,"j"});这里参数其实是创建了一个临时结构体 另外，删除的时候利用了重载的符号<,而你的<只比较了num，故调用s.earse({1}),也能删除第一个元素。

引用 3 楼 ＇ 你的胰脏好吃吗？ 的回复:如果我同时也想要通过后面的字符串（也就是a1）来删除set内的元素 该怎么办了 修改重载运算符<,只比较a1，但这样就会打乱你set容器的排序方式，如果不想打乱，你可以在原有的earse函数上再加上一层，遍历set，找到值为a1结构体的迭代器。通过迭代器来删除

如果我同时也想要通过后面的字符串（也就是a1）来删除set内的元素 该怎么办了