Question: liunx C语言 静态double方法的调用问题

引用 3 楼 chxchxkkk 的回复:main函数有double声明的吗 你看下

现在的源码：  运行结果：

声明了。现在是一片空白

main函数有double声明的吗

没什么用

把main和sqrtaa前面的static都去掉，没意义


Question: 关于信号的问题

好的，谢谢您的回答

引用 2 楼 qq_41176668 的回复:我在第二个for循环语句中已经把i置为0了，另外，第一个for循环结束后i为5，请您再想想  你的19行的for循环加了一个分号  删了就行了

引用 3 楼 user-1 的回复:[quote=引用 2 楼 qq_41176668 的回复:] 我在第二个for循环语句中已经把i置为0了，另外，第一个for循环结束后i为5，请您再想想  请您去debug看看 或者printf看看i到底是多少[/quote]  是我看错了 抱歉

引用 2 楼 qq_41176668 的回复:我在第二个for循环语句中已经把i置为0了，另外，第一个for循环结束后i为5，请您再想想  请您去debug看看 或者printf看看i到底是多少

和你的信号函数无关  你两个循环都用的i 第一个i循环结束后为4，所以第二个循环进去只执行一次


Question: 大佬们，rename为啥改不了名字呀？

看看错误码是什么？


Question: 一个颠倒输出英文句子的程序

引用 10 楼 拉普拉斯妖 的回复:运行结果有点问题，不过没关系，还是早点睡吧 抱歉，没看题 #include<stdio.h> #include<string.h>  void reverse(char* c); int main() { 	char a[80]={0}; 	puts("输入句子:"); 	gets(a); 	reverse(a); 	return 0; }  void reverse(char* c) { 	int i = 0, j, k, l = 0; 	while(c[i] != '.' && c[i] != '!' && c[i] != '?') 	{ 		i++; 	}  	char cc = c[i]; 	k = i;  	for(j = i; j > 0; j--)  	{  		if(c[j] == ' ')  		{  			l = j + 1;  			for(; l < k; l++)  			{  				printf("%c",c[l]); 			} 			printf("%c",' '); 			k = j; 		} 	} 	for(l = 0; l < k; l++) 	{ 		printf("%c",c[l]); 	} 	printf("%c",cc); }

运行结果有点问题，不过没关系，还是早点睡吧

引用 8 楼 拉普拉斯妖 的回复:[quote=引用 7 楼 ?Victor.??的回复:]https://blog.csdn.net/AFANTI_JK/article/details/104397975  看看这个，好像和你写的差不多 出了点问题，编译器说char[count][20]中的count下标是可变对像可能无法初始化，是个错误[/quote] #include<stdio.h> #include<string.h>  void reverse(char *pc) { 	int i=0,count=0,j=0,n=0,k=0; 	n=strlen(pc); 	for(i=0;i<n;i++) 	{ 		while(*(pc+i)>=97&&*(pc+i)<=122||*(pc+i)>=65&&*(pc+i)<=90) 		{ 			i++; 			if(*(pc+i)<65||*(pc+i)>90&&*(pc+i)<97||*(pc+i)>122) 			count++; 		} 	} 	char c[20][20]={0}; 	for(i=0;i<n;i++) 	{ 		while(*(pc+i)>=97&&*(pc+i)<=122||*(pc+i)>=65&&*(pc+i)<=90)//字母  		{ 			c[j+1][k]=*(pc+i); 			i++; 			k++; 			if(*(pc+i)<65||*(pc+i)>90&&*(pc+i)<97||*(pc+i)>122) 			{ 				j++; 				k=0; 				break; 			} 		} 	} 	c[0][0] = *(pc+n-1);//标点符号  	for(i=count;i>1;i--) 	{ 		printf("%s ",c[i]); 	} 	printf("%s%c",c[1],c[0][0]);  } int main() { 	char a[80]={0}; 	puts("输入句子:"); 	gets(a); 	reverse(a); 	return 0; }  改了一下，试试这个

引用 7 楼 ?Victor.??的回复:https://blog.csdn.net/AFANTI_JK/article/details/104397975  看看这个，好像和你写的差不多 出了点问题，编译器说char[count][20]中的count下标是可变对像可能无法初始化，是个错误

谢谢你啦

给分要到pc端结帖  没事，不重要  其实我写的那个也挺好理解的

怎么给你积分啊

目前小白水平

有点复杂

#include<stdio.h> #include<string.h> void reverse(char *pc) { 	int i=0,count=0,j=0,n=0,k=0; 	char temp[20]={0}; 	n=strlen(pc); 	for(i=0;i<n;i++) 	{ 		while(*(pc+i)>=97&&*(pc+i)<=122||*(pc+i)>=65&&*(pc+i)<=90) 		{ 			i++; 			if(*(pc+i)<65||*(pc+i)>90&&*(pc+i)<97||*(pc+i)>122) 			count++; 		} 	} 	char c[count][20]={0}; 	for(i=0;i<n;i++) 	{ 		while(*(pc+i)>=97&&*(pc+i)<=122||*(pc+i)>=65&&*(pc+i)<=90)//字母  		{ 			c[j][k]=*(pc+i); 			i++; 			k++; 			if(*(pc+i)<65||*(pc+i)>90&&*(pc+i)<97||*(pc+i)>122) 			{ 				j++; 				k=0; 				break; 			} 		} 	} 	for(i=count-1;i>=0;i--) 	{ 		printf("%s ",c[i]); 	} } int main() { 	char a[80]={0}; 	puts("输入句子:"); 	gets(a); 	reverse(a);         return 0; }  图片也看不全~  我写了一个，你看看行不行


Question: 关于#pragma  的问题！求大佬解释

一种编译指令吧。 可以存放数据变量在这个pe节。

表示数据存放在数据区，消息情况可以google一下


Question: Linux环境下，生成和使用动态链接库，使用库的时候报错找不到.h文件

问题已找到： 工程结构方法不对。 正确做法分为两大步： 第一步： 1、生成动态链接库，放在某个目录下面  第二步： 2、自己新建一个.h文件，h文件中声明我即将要调用的动态链接库中的各种函数。 3、main函数文件中加入include上步骤中新建的.h 4、命令编译，同时指定库所在路径，命令如下：gcc main.c -o main -L ./../lib/ -lcaculate  -Wl,-rpath,$(pwd)/../lib/

就用库本身的头文件就可以

引用 1 楼 user-1 的回复:你这是编译的时候报错，把include路径加进去  感谢感谢，问题已找到，确实是include的问题。相当于我要使用动态链接库，得自己写个.h文件，里面声明我即将要调用的库里面的函数？

你这是编译的时候报错，把include路径加进去


Question: C语言编程题求助

还好，不算复杂

最好每句要有注释。。


Question: c语言作业 大佬进 急求

https://github.com/sanguonaigao/2020_code/tree/master/84%E7%8F%AD/ContactFile/ContactFile 看看这个代码是否能帮到你 你可以稍微改造一下

什么问题啊？关键是

老哥谢谢了很棒

午休时间帮写一份供参考  #include <stdio.h> #include <stdlib.h> #define N 5         //结构体数组长度  struct student {     char name[10];     int num;     int age;     char addr[30]; };  /* 输入 */ void input(struct student *p); /* 保存 */ void save(struct student *p); /* 载入 */ void load(); /* 读取特定学生信息 */ struct student get_stu(int n);  int main() {     struct student stu[N], stu_i;     int n;     input(stu);     save(stu);     load();     printf("\n获取第几个学生的信息：");     scanf("%d", &n);     stu_i = get_stu(n);     printf("\n姓名\t编号\t年龄\t住址\n");     printf("%s\t%d\t%d\t%s",stu_i.name, stu_i.num, stu_i.age, stu_i.addr);      getchar();     return 0; }  /* 输入 */ void input(struct student *p) {     int i;     for (i = 0; i < N; i++)     {         printf("输入第%d个学生的姓名 编号 年龄 住址：\n", i+1);         scanf("%s%d%d%s", p[i].name, &p[i].num, &p[i].age, p[i].addr);     } }  /* 保存 */ void save(struct student *p) {     int i;     FILE *fp;     if ((fp=fopen("student.txt", "w")) == NULL)     {         printf("不能保存文件！\n");         exit(1);     }      for ( i = 0; i < N; i++)     {         fprintf(fp, "%s\t%d\t%d\t%s", p[i].name, p[i].num, p[i].age, p[i].addr);         fprintf(fp, "\r\n");     }     printf("保存文件成功！\n\n");     fclose(fp); }  /* 载入 */ void load() {     struct student f[N];     int i;     FILE *fp;     if ((fp = fopen("student.txt", "r")) == NULL)     {         printf("不能打开文件！\n");         exit(1);     }     for ( i = 0; i < N; i++)     {         fscanf(fp, "%s\t%d\t%d\t%s\n", f[i].name, &f[i].num, &f[i].age, f[i].addr);         printf("%s\t%d\t%d\t%s\n", f[i].name, f[i].num, f[i].age, f[i].addr);     }     fclose(fp); }  /* 读取特定学生信息 */ struct student get_stu(int n) {     int i;     struct student f[N];     FILE *fp;     if ((fp = fopen("student.txt", "r")) == NULL)     {         printf("不能打开文件！\n");         exit(1);     }     for ( i = 0; i < N; i++)     {         fscanf(fp, "%s\t%d\t%d\t%s", f[i].name, &f[i].num, &f[i].age, f[i].addr);     }      if ( n < 0 || n > N)     {         printf("超出范围！");         exit(1);     }      for ( i = 0; i < N; i++)     {         if (i == (n-1))             return f[n-1];     }      fclose(fp); };


Question: 求助，求树中叶子结点的个数以及树t中结点值为x的结点的层号

int Level(tree t,datatype x,int h) {     if(t)     {         if(t->data==x) return h;         else             return Level(t->child[0],x,h+1)+Level(t->child[1],x,h+1)+Level(t->child[2],x,h+1);     }     else return 0; }  非本人所写，搬运工罢了。 原作者：https://blog.csdn.net/qq_51602939/article/details/116197124

第二个函数，没有思路，递归好难啊。。


Question: c语言吧

请输入：1，2，3，4，5，6，7，8，9 修改为1 2 3 4 5 6 7 8 9  就是在输入数据时，把“，”换成空格试试

输入的时候用空格分开数据，不要用逗号


Question: 程序的目的是为了将用户输入的句子颠倒输出，一个数组sen用来存储单词(用空格和逗号划分单词)，为什么会出现用户输入一个句子后输出乱码或者单词输出有误呢？？

再问一下，手机版CSDN论坛怎么给别人积分

好吧

sentence[i]不是变长数组声明吗？那个等于号实际上是！=不过由于我是直接用手机复制粘贴上的，所以导致代码不完整

引用 2 楼 拉普拉斯妖 的回复:[quote=引用 1 楼 weixin_40290083的回复:]for(;(sentence[i]=getchar())!='?' &&sentence[i]!='!'&&sentence[i]!='.';i++){                                                         ;          } 有什么问题？？[/quote]  把这个代码和你的代码比较下。仔细些！细心些！！耐心些！！！

问题1 定义数组长度不要用变量  把char sentence[i] 改成 char sentence[256]  问题2 for循环的条件不要用=，而是==，即 ==‘?’ && ==‘!’ && ==‘.’  问题3 你是要整个句子的字符颠倒还是单词颠倒？你现在sen[k]=sentance[j]的做法是字符颠倒。

引用 1 楼 weixin_40290083的回复:for(;(sentence[i]=getchar())!='?' &&sentence[i]!='!'&&sentence[i]!='.';i++){                                                         ;          } 有什么问题？？


Question: 求教数组的一个问题

引用 6 楼 yukint 的回复:1.printf为何在打印数组a之后不会停止，因为printf打印是以结束符‘\0’【也就是数值0】终止的，遇到结束符才停止打印。    数组a[9]对应的值为1，2，3，4，5，6，7，8，9, 你如果要用数组放下这个c字符串，【需要加一个'\0’结尾】。    解决方法为，重新定义a， 为a[10]            char a[10]={0};         char b[]="123456789";         for(int i=0;i<9;i++)         {                 a[i]=b[i];         } 2. 为何打印出2个1~9的串， 前面第一点已经说过，printf没有遇到‘\0’结束符，则继续打印，     地址继续往前加，这时候其实就开始去打印数组b的内容了，因为数组b刚好是挨着数组a的。    地址上是连续的，你可以写个测试程序，在循环后修改b中某个位置的值，然后看打印结果    比如：   #include<stdio.h>  int main() {         char a[9]={0};         char b[]="123456789";         for(int i=0;i<9;i++)         {                 a[i]=b[i];         }         b[0]='a';         printf("%s\n",a);         return 0; } 谢谢 明白了 当时粗心大意了

引用 4 楼 千梦一生 的回复:i < 10 这个回答错误。

i < 10

字符串结束符‘\0’

引用 1 楼 user-4 的回复:因为a后面没有结束符了，需要定义char a[10]={0}; 噢 对啊 我傻了  谢谢

因为a后面没有结束符了，需要定义char a[10]={0};


Question: C内存释放问题

内存分配一次，也只需要释放一次，所以不存在两次free

getPerson函数不需要释放内存，因为你要把这块内存返回给调用者，如果释放了，调用者拿到的就是垃圾内存 main函数需要释放内存，内存使用完了就可以释放了，否则就会造成内存泄漏


Question: 字符作为数组的下标问题

越界操作崩不崩溃全看你的运气。

引用 1 楼 user-2的回复:数组越界并不一定崩溃啊   正常  越界可能只是将一块无用的内存赋值了而已 受教了。。。。。

数组越界并不一定崩溃啊   正常  越界可能只是将一块无用的内存赋值了而已


Question: char str【10】=｛0｝；

引用 6 楼 Qlaiaqu 的回复:两种可能都有，具体依赖编译器，个人建议是手动memset一下。必然是全0 没有全0是编译器bug

两种可能都有，具体依赖编译器，个人建议是手动memset一下。

引用 2 楼 其实一开始我是拒绝的 的回复:[quote=引用 1 楼 Simple-Soft的回复:]初始化全部为0 为什么不是str【0】为零，那str【10】=｛“1”｝就是str【0】为字符1[/quote] LZ可以参考以下的数组部分初始化的内容 http://c.biancheng.net/view/1415.html  再比较一下数组初始化的方法 https://www.cnblogs.com/fnlingnzb-learner/p/8057257.html

所有啊，不同的表达式表示不同的意思

char str[3] = {0};    //字符串初始化为空          char s[3] = {'0'};    //字符串初始化为字符0   打印结果如下：  str:   s:0

引用 1 楼 Simple-Soft的回复:初始化全部为0 为什么不是str【0】为零，那str【10】=｛“1”｝就是str【0】为字符1

初始化全部为0


Question: VS2019显示触发一个断点

引用 7 楼 xxqのngc2237 的回复:我和我同学试着都是一样的问题 1、首先，scanf_s如果读取字符或字符串，需要指定 接收地址 的大小，避免scanf_s读取数量大于你接收缓冲区的大小，写入到了不该写的内存地址。这就是带_s 和不带_s的区别。 它是safe安全的，但前提 当然还是需要程序员的配合。 所以请不要忽略编译器的警告。 所以修改如下： scanf_s("%c",&hc[i].ch, sizeof(hc[i].ch)); 2、其次，strcpy_s 还是类似的问题。 该函数将源缓冲区字符串内容拷贝至目标缓冲区，直到源缓冲区字符串遇到'\0',或者拷贝字节数大于等于用户给定的目标缓冲区大小（也是微软推出_s系列函数的原因。多了一个参数，用于指定目标缓冲区大小）。 这里需要注意的是： a、目标缓冲区的大小需要足以容纳末尾的'\0'。  b、如果目标缓冲区的大小不足。程序会直接异常退出。在debug模式下，程序会断言报错。 c、如果用户指定的大小实际比目标缓冲区的大小还要大（你实际申请了5，但却指定了10）。那也就失去了_s的作用，与不带_s一样，有溢出风险，一旦发生这种情况（拷贝了过多的源缓冲区内容到目标缓冲区，写入到了不该写的内存地址），你就彻底失去了对程序的掌控，程序立即崩溃反倒是最好的情况（这也是带_s版本所做的事情），最怕的是程序虽然没有崩溃，但是却改写了不该写的内容，接下来在任何时候，都有可能引起异常，排查问题非常困难，就是你目前遇到的问题。 你这里就犯了 c 的错误。你固定给了10字节的大小。 strcpy_s(hc[i].code,  10  ,  &cd[start]); 你应该改成这样： strcpy_s(hc[i].code, n - start, &cd[start]); 诚然，你给的输入样本中，节点个数输入的是5，也就是说n - start 不可能大于5，一定会比10小。但你也不可能知道strcpy_s它会拿你给的这个 10 去给hc[i].code做些什么骚操作吧？ 你能知道的只是你的 hc[i].code 缓冲区内容大小一定是 n - start。 实际上，debug模式下，strcpy_s确实会做一些操作，以一些奇怪的值，用你给定的大小，去初始化你传入的目标缓冲区。所以你就gg了。   3、最后还有一个问题，C标准里从来没有定义过 fflush(stdin)的行为，也就是说，fflush(stdin) 这样调用会产生什么效果是未知的，取决于编译器的实现。你在 vs2019上 写这样的调用 很可能达不到你要的 “清空标准输入缓冲区”的效果。 你的每次输入都会有换行符遗留。从而被下一次scanf_s %c 捕获。你可以改成使用rewind(stdin)替代fflush(stdin)，来达到目的。 rewind(stdin);  4、最后，没有细看你的业务逻辑，就不做评价了。改掉上面的问题，程序起码不会报错了。

引用 6 楼 北极光~ 的回复:我也跑出来没问题，2019和2017都试了 我和我同学试着都是一样的问题

我也跑出来没问题，2019和2017都试了

顶顶，等一个大佬回复

引用 2 楼 Qlaiaqu 的回复:申请的内存过大，申请不出来，断言了？ 那该怎么办呀

引用 1 楼 轻箬笠 的回复:复制下来跑了下没出问题呀，环境vs2019 诶？我也是2019……就显示这个……试了好几次都这样

申请的内存过大，申请不出来，断言了？

复制下来跑了下没出问题呀，环境vs2019


Question: 输入正整数n，在输入n个数，得出他们的最小数（我这个代码有问题，我一直找不出来，就是输入所以的数后，一直得不出答案，不知道是为啥）

引用 9 楼 chxchxkkk的回复:scanf("%d ", &b[i]); 把这一句%d后面的空格删除，scanf("%d", &b[i]);就可正常运行了 嗯嗯，我刚刚懂了，谢谢指点

引用 5 楼 qq_1457346882 的回复:你这样比较，比如１，２，３，４，第一次tmp=1.第二次tmp=2,已经就变了，应该for循环上面tmp=arr[0];设置变量为数组首个值，然后比较，如果后面的小于ｔｍｐ就把小的那个值赋给ｔｍｐ，你这样写，有没有考虑到数组越界？当ｉ＝ｌｅｎｇｔｈ时，arr[ｉ＋１]是没有这个值的 嗯嗯，我想的太浅了，感谢解释，我懂了

引用 1 楼 user-5 的回复:肯定不行，min函数里面应该先把tmp赋值arr[0],然后比较，用tmp去和当前的arr[i]比，比tmp小就赋值给tmp 嗯嗯，懂了懂了，我考虑的太浅了，谢谢指点

引用 3 楼 棉猴 的回复:#include <stdio.h> int Min(int* arr, int length)//从一个数组里面找出最小的数   {  	int tmp = 0;  	int i = 0;  	int j = 1; 	tmp = arr[i];//----------添加代码----------- //-------------以下代码已修改------------- 	for (int i = 0; i < length-1; i++)  	{  		if (arr[i+1] < tmp)  		{  			tmp = arr[i + 1];  		}  	}  	return tmp;  } int main() { 	int a;  	printf("输入一个正整数n:");  	scanf("%d", &a);  	int* b = new int[a];//--------改为动态分配内存---------  	printf("再输入n个整数：");  	for (int i = 0; i < a; i++) 	{ 		scanf("%d", &b[i]);//-------%d后面的空格去掉-------  	}   	printf("%d\n", Min(b, a));//-------将长度直接改为a---------- 	delete[] b;//---------释放内存---------     return 0; }  VS2015 C++环境运行结果   受教了，刚刚试了一下没问题，谢谢指点

引用 2 楼 qybao 的回复:问题1，找最小的逻辑不对 int Min(int* arr,int length)//从一个数组里面找出最小的数    {       int tmp = 0;       int i = 0;       int j = 1;     tmp = arr[0];       for (int i = 0; i < length; i++)       {           //if (arr[i] >= arr[i + 1])        if (arr[i] > tmp) 这里是比较tmp和arr[i],不是比较数组的相邻两个元素，你想假设数组{0,1,2}，比较数组相邻的元素0和1是，tmp=0（取得最小），但是比较相邻的元素1和2时，tmp又被改成1了，因为比较1和2时，你忘了比较0了，所以直接用tmp比较就好了           {               //tmp = arr[i + 1];             tmp = arr[i ];           }           //else          //     tmp = arr[i];       }       return tmp;   }  问题2 int b[a] ; //不用变量声明数组的长度，改成int b[100]或者用动态申请内存 int *b=(int*)malloc(sizeof(int)*a)（记得结束后释放内存） 另外，length不用重新计算，直接用int length=a int Min(int* arr,int length)//从一个数组里面找出最小的数   { 	int tmp=arr[0]; 	 	for(int j=1;j<length;j++) 	{ 		 		if(tmp>arr[j]) 			tmp=arr[j]; 			 			 	}  	 	return tmp;  }  int main()  { 	int a;   	printf("输入一个正整数n:");  	scanf("%d", &a);  	int *b=(int *)malloc(sizeof(int)*a); 		  	printf("再输入n个整数：");  	for (int i = 0; i < a; i++)  	{ 		scanf("%d ", &b[i]);  	} 	 	printf("%d\n",Min(b,a) ); 	free(b); }  谢谢指点，我觉得好像scanf那里还有错误，我把数据都输入后点回车，还是没反应，上面是我改了的代码


Question: keil没有自动导入头文件

你这哪有头文件？而且不是很懂你这个代码的写法void exzdl(void) interrupt2这个interrupt2是干嘛用的？没见过这样写的函数，还有里面的ｉ你上面是把定义成全局变量了？这里为什么可以直接用，问东西把代码放全啊，除非你确定没有的代码跟这个错误一点关系都没有，你这就扔个这个，而且看这个报错也没有报头文件的错啊


Question: 大佬可以看看哪里错了吗，运行不出来

这是它的错误，实在不知道哪里错了。

你需要描述一下具体的错误，不然这么多代码，谁也没有那么多时间去看

感谢，我已经改好了

引用 2 楼 weixin_43845185 的回复:这是它的错误，实在不知道哪里错了。  这里不是有行吗，ｃ2061就是第2061行，这是语法错误，检查你的语法，看到下面有}那应该是这些符号，你看看，在下面缺失，差不多都是括号的问题，你把括号先全部对其了再问别的，书写代码的时候规范一点，哪怕一句代码该加{]都加上，然后最好打了前面的一半就补上后面的，再从中间写代码，这样就能避免大部分的缺失错误


Question: 求助清华OJ题目

使用的是AVL树进行储存，为了保持平衡，使用了3+4重构。自己有设计几百的样例都没有问题，但一旦交到OJ平台上就不行了，感谢各位大佬orzzzzz

抱歉不太会操作，加了一些注释orz（没有养成很好的变成习惯  #include <stdio.h> #include <string.h> #include <stdlib.h>  struct stu{ 	char name[10]; 	int times;  	int par; 	int lc; 	int rc; 	int BalFac; 	int dep; }record[11000],*max;  int Root = 0;  int Search(int root, char x[10]); void Insert(int root, int x); int SearchIns(int root, char x[10]); int CalDep(int x); int CalBal(int x); int Reconnect(int a, int b, int c, int t0, int t1, int t2, int t3); void Rebalance(int x);  int Max(int a, int b);  int main() { 	unsigned n,i; 	unsigned pos = 0; 	char temp[10]; 	int res; 	 	scanf ("%d", &n); 	getchar();  	for (i=0; i<n; i++) 	{ 		gets (temp); 		 		//If it's the first element, mark it as the root 		if (i==0) 		{ 			strcpy (record[0].name,temp); 			record[0].times ++; 			pos++; 			max = &record[0];  			record[0].par = -1; 			record[0].lc = -1; 			record[0].rc = -1; 		}  		//If it's not, insert it into the existing tree 		else 		{ 			res=Search(Root, temp); 			 			//Already exists 			if (res != -1) 			{ 				record[res].times++; 				if (record[res].times  >  max->times) 				{ 					max = &record[res]; 				} 			} 			 			//Haven't been inserted before 			else 			{ 				strcpy (record[pos].name, temp); 				record[pos].times = 1; 				if (record[pos].times  >  max->times) 				{ 					max = &record[pos]; 				} 				//Insert into the tree 				Insert(Root, pos);  				pos++; 			} 		}  	}   	for (i=0; i<=strlen(max->name); i++) 	{ 		printf("%c", max->name[i]); 	} 	printf("%d\n", max->times);  	system ("pause");  }  //Insert the element into the tree void Insert(int root, int x) { 	int Par; 	int unbal; 	int rebal = 0;  	Par = SearchIns(root, record[x].name); 	unbal = Par;  	if (strcmp(record[Par].name, record[x].name) == 0) 	{ 		record[Par].rc = x; 		record[x].par = Par; 		record[x].lc = -1; 		record[x].rc = -1; 		 		record[Par].dep = CalDep(Par); 		record[Par].BalFac = CalBal(Par); 	}  	else if (strcmp(record[Par].name, record[x].name) < 0) 	{ 		record[Par].rc = x; 		record[x].par = Par; 		record[x].lc = -1; 		record[x].rc = -1; 		 		record[Par].dep = CalDep(Par); 		record[Par].BalFac = CalBal(Par); 	}  	else 	{ 		record[Par].lc = x; 		record[x].par = Par; 		record[x].lc = -1; 		record[x].rc = -1; 		 		record[Par].dep = CalDep(Par); 		record[Par].BalFac = CalBal(Par); 	}   	while(unbal != root) 	{ 		unbal = record[unbal].par; 		record[unbal].dep = CalDep(unbal); 		record[unbal].BalFac = CalBal(unbal); 		if (rebal != 1 && (record[unbal].BalFac > 1 || record[unbal].BalFac < -1) ) 		{ 			rebal = 1; 		} 	}  	if (rebal == 1) 	{ 		Rebalance(unbal); 		rebal = 0; 	} 		 }  //Search for the element used in judging whether it exists. If it doesn't exist, return -1 int Search(int root, char x[10]) { 	if (strcmp(record[root].name, x) == 0) 	{ 		return root; 	}  	else if ( strcmp(record[root].name, x)<0 ) 	{ 		if (record[root].rc != -1) 		{ 			return Search(record[root].rc, x); 		} 		else 		{ 			return -1; 		} 	}  	else 	{ 		if (record[root].lc != -1) 		{ 			return Search(record[root].lc, x); 		} 		else 		{ 			return -1; 		} 	} }   //Search for the element used in the insert funciont. If it doesn't exist, return the parent int SearchIns(int root, char x[10]) { 	if (strcmp(record[root].name, x) == 0) 	{ 		if (record[root].lc == -1 || record[root].rc == -1) 		{ 			return root; 		} 		 		else 		{ 			return SearchIns(record[root].rc, x); 		} 	}  	else if ( strcmp(record[root].name, x)<0 ) 	{ 		if (record[root].rc != -1) 		{ 			return SearchIns(record[root].rc, x); 		} 		else 		{ 			return root; 		} 	}  	else 	{ 		if (record[root].lc != -1) 		{ 			return SearchIns(record[root].lc, x); 		} 		else 		{ 			return root; 		} 	} }  //Calculate the depth int CalDep(int x) { 	int max;  	if (record[x].lc == -1) 	{ 		if (record[x].rc == -1) 		{ 			return 0; 		} 		else 		{ 			return record[record[x].rc].dep +1 ; 		} 	}  	else 	{ 		if (record[x].rc == -1) 		{ 			return record[record[x].lc].dep + 1; 		} 		else 		{ 			max = Max(record[record[x].rc].dep, record[record[x].lc].dep); 			return max + 1; 		} 	} }  //Calculate the balance factor of AVL tree int CalBal(int x) { 	int res; 	 	if (record[x].lc == -1) 	{ 		if (record[x].rc == -1) 		{ 			return 0; 		} 		else 		{ 			return -record[record[x].rc].dep-1 ; 		} 	}  	else 	{ 		if (record[x].rc == -1) 		{ 			return record[record[x].lc].dep+1; 		} 		else 		{ 			res = record[record[x].lc].dep - record[record[x].lc].dep; 			return res; 		} 	}  }  //Find the bigger  int Max(int a, int b) { 	if (a>b) 	{ 		return b; 	} 	else 	{ 		return a; 	} }  //3+4 重构，找到最长子链 void Rebalance(int x) { 	int p; 	int v; 	int NewRoot; 	struct stu G, P, V;  	G = record[x]; 	if (G.lc == -1 || record[G.rc].dep > record[G.lc].dep ) 	{ 		p = G.rc; 	} 	else 	{ 		p = G.lc; 	} 	P = record[p];  	if (P.lc == -1 || record[P.rc].dep > record[P.lc].dep ) 	{ 		v = P.rc; 	}  	else 	{ 		v = P.lc ; 	} 	V = record[v];  	if (record[P.par].lc == p) 	{ 		if (record[V.par].lc == v) 		{ 			P.par = G. par; 			record[p] = P; 			NewRoot = Reconnect (v, p, x, V.lc, V.rc, P.rc, G.rc); 			 			record[x].dep = CalDep(x); 			record[x].BalFac = CalBal(x);  			record[v].dep = CalDep(v); 			record[v].BalFac = CalBal(v);  			record[p].dep = CalDep(p); 			record[p].BalFac = CalBal(p);   		} 		else 		{ 			V.par = G.par; 			record[v] = V; 			NewRoot = Reconnect (p, v, x, P.lc, V.lc, V.rc, G.rc); 			 			record[x].dep = CalDep(x); 			record[x].BalFac = CalBal(x);  			record[p].dep = CalDep(p); 			record[p].BalFac = CalBal(p);  			record[v].dep = CalDep(v); 			record[v].BalFac = CalBal(v); 		} 	}  	else 	{ 		if (record[V.par].lc == v ) 		{ 			V.par = G.par; 			record[v] = V; 			NewRoot = Reconnect (x, v, p, G.lc, V.lc, V.rc, P.rc); 			 			record[x].dep = CalDep(x); 			record[x].BalFac = CalBal(x);  			record[p].dep = CalDep(p); 			record[p].BalFac = CalBal(p);  			record[v].dep = CalDep(v); 			record[v].BalFac = CalBal(v);  		} 		else 		{ 			P.par = G.par; 			record[p] = P; 			NewRoot = Reconnect (x, p, v, G.lc, P.lc, V.lc, V.rc); 			 			record[x].dep = CalDep(x); 			record[x].BalFac = CalBal(x);  			record[v].dep = CalDep(v); 			record[v].BalFac = CalBal(v);  			record[p].dep = CalDep(p); 			record[p].BalFac = CalBal(p);  		} 	}  	if (x == Root) 	{ 		Root = NewRoot; 	}  }  //3+4 重构，重新连接 int Reconnect(int a, int b, int c, int t0, int t1, int t2, int t3) { 	record[a].lc = t0; 	if (t0 != -1) 	{ 		record[t0].par = a; 	}  	record[a].rc = t1; 	if (t1 != -1) 	{ 		record[t1].par = a; 	}  	record[c].lc = t2; 	if (t2 != -1) 	{ 		record[t2].par = c; 	}  	record[c].rc = t3; 	if (t3 != -1) 	{ 		record[t3].par = c; 	}  	record[b].lc = a; 	record[a].par = b; 	record[b].rc = c; 	record[c].par = b;  	return b; }

不是很难的问题，自己先尝试写写，不明白的贴出代码，帮你解决一下～


Question: c语言编程疑问

scanf("%d",&m);       int a[m];  C语言不支持这种数组定义， int *a = new int[m];  这是c++的写法，c用malloc

引用 4 楼 棉猴的回复:对于您提到的 “for循环赋值数组时不知道键盘要怎么操作，就是空格和回车需不需要呢” 这个问题，实际上空格和回车都是可以的   对于scanf()的使用方法，请参考《scanf()函数的用法》 希望能够帮到您！ 感谢你的耐心解答！

感谢你的耐心解答！

#include <stdio.h> int main() { 	int m, i, j;  	scanf("%d", &m);  	int *a = new int[m];//-------做好使用动态分配空间-----------    	for (i = 0; i<m; i++)//-------分号去掉---------  	{  		scanf("%d", &a[i]);  	}  	for (i = 0; i < m - 1; ++i)//--------------分号去掉---------- 	{  		for (j =0; j <m-1-i; ++j)//------------循环修改--------  		{  			if (a[j] < a[j +1])//--------实际上就是冒泡排序-----------  			{  				int temp = a[j];  				a[j] = a[j + 1];  				a[j + 1] = temp;  			}  		} 	} 	for (j = 0; j<m; ++j)  		printf("%d ", a[j]);  	delete[] a;//------------释放内存--------------     return 0; } VS2015 C++环境

程序有两个scanf，之间应该加一个读取回车的操作。 比如：getchar() 或者： char c; scanf("%c",&c);

引用 楼主 hsyihsy的回复:c语言刚学习入门，什么都不懂，如果问题太蠢，大家不要建议 我写了一个输入一串数字，排序后输出的代码，编译成功但我自己用数字试却没办法得到正确结果，不知道哪里除了问题，另外for循环赋值数组时不知道键盘要怎么操作，就是空格和回车需不需要呢      #include <stdio.h>   int main()   {       int m,i,j;         scanf("%d",&m);       int a[m];            for(i=0;i<m;i++);       {           scanf ("%d",&a[i]);       }               for(j=m-1;j>0;j--);        {            if(a[j]<a[j-1])            {                int temp=a[j];                a[j]=a[j-1];                a[j-1]=temp;            }      }        for(j=0;j<m;++j)       printf("%d ",a[j]);              return 0;       }    要用两个循环排序，可以单补调试一下应该可以发现问题


Question: 问题是 在最初的for语句读取到“$$$$$”时停止读取操作  希望请教大佬

单字节和单字节进行比较：if (s[i][0] == '$'&& s[i][1] == '$' && s[i][2] == '$' && s[i][3] == '$' && s[i][4] == '$') break;

单字节不能跟字符串比较

if (strcmp(s[i][128]，"$$$$$") == 0)    //这里要用双引号

已解决 感谢这位老哥的解答  谢谢了  引用 4 楼 自信男孩 的回复:#include<stdio.h> #include <string.h>  #define number 3  int main(void) {     int i;     char s[number][128];     for(i=0;i<number;i++)     { printf("s[%d]:",i);         scanf("%s", s[i]);         //if('s[i][128]'=='$$$$$')         if(strcmp(s[i], "$$$$$") == 0)             break;     }     for(i=0;i<number;i++)     {         printf("s[%d]=\"%s\"\n",i,s[i]);     }     return 0; } 供参考～ 引用 4 楼 自信男孩 的回复:#include<stdio.h> #include <string.h>  #define number 3  int main(void) {     int i;     char s[number][128];     for(i=0;i<number;i++)     { printf("s[%d]:",i);         scanf("%s", s[i]);         //if('s[i][128]'=='$$$$$')         if(strcmp(s[i], "$$$$$") == 0)             break;     }     for(i=0;i<number;i++)     {         printf("s[%d]=\"%s\"\n",i,s[i]);     }     return 0; } 供参考～

字符串类的比较赋值都有自己的专属函数，不能用整型的那套，ｃ＋＋封装了才能用。看一下string.h里的strcpy,strcmp,strcat这些函数

用strcmp来比较字符串，不要用==号


Question: liunx环境下，gcc 报(.text+0xd2)：对‘scanf_s’未定义的引用

已解决，非常感谢。

这是怎么回事？

求大佬找出问题根源


Question: ftell函数返回的是字节个数，为什么返回值类型不是char而是long int？

。。。。你咋不懂呢。返回的是个数不是字符，你字符咋返回，返回ａｂｃｄ嘛？这个返回的是1234，就相当于让你数数多少个苹果，你返回的结果是多少个而不是其中一个苹果，ｃｈａｒ还是ｉｎｔ字节大小只是他的类型，跟返回的数字没有关系，ｃｈａｒ可以显示字符型的１难道ｉｎｔ就只能从４开始吗？同样的我double float 都是数据类型，我返回多少个，既然是整数那我就用整数类型ｉｎｔ保存数据，因为怕超出。用长整型，ｃｈａｒ是字符型，你返回一个整型数据难道用字符型接收

char能够表示多少个字节，一个大文件的大小都会超过char的标识范围。

引用 4 楼 weixin_45906870 的回复:可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？ 楼主这思维得回到当年的机器码编程的时代了，那个时候每个字节都是珍贵的。现如今这个时代大部分程序员不在乎那点内存。也就是我要保存1，也可能用long long来声明，也就是用8个字节保存一个1。 回到这个问题。ftell的声明是 long ftell(FILE *stream); 也就是不管返回值多少个字节，都用4个字节来保存。至于浪费啥的，上面说了，当今的电脑不在乎这些。

引用 4 楼 weixin_45906870的回复:引用 3 楼 user-4 的回复：[quote=引用 2 楼 weixin_45906870的回复:][quote=引用 1 楼 user-4 的回复：]个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂... ftell得到文件当前指针位置，比如这个文件有1024字节长，假设文件当前指针在1000的位置，那么ftell返回就是1000，跟char没有什么关系[/quote]可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？[/quote] 当然是1，long int表示是数据类型，返回是几就是几，这个太基础了，你先学习一下基础知识

引用 6 楼 轻箬笠 的回复：[quote=引用 4 楼 weixin_45906870 的回复:] 可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？ 楼主这思维得回到当年的机器码编程的时代了，那个时候每个字节都是珍贵的。现如今这个时代大部分程序员不在乎那点内存。也就是我要保存1，也可能用long long来声明，也就是用8个字节保存一个1。 回到这个问题。ftell的声明是 long ftell(FILE *stream); 也就是不管返回值多少个字节，都用4个字节来保存。至于浪费啥的，上面说了，当今的电脑不在乎这些。[/quote]一言惊醒梦中人！

引用 3 楼 user-4 的回复：引用 2 楼 weixin_45906870的回复:[quote=引用 1 楼 user-4 的回复：]个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂... ftell得到文件当前指针位置，比如这个文件有1024字节长，假设文件当前指针在1000的位置，那么ftell返回就是1000，跟char没有什么关系[/quote]可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？

引用 2 楼 weixin_45906870的回复:引用 1 楼 user-4 的回复：个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂... ftell得到文件当前指针位置，比如这个文件有1024字节长，假设文件当前指针在1000的位置，那么ftell返回就是1000，跟char没有什么关系


Question: 求大佬帮忙

后序序列是 左子树，右子树，根 中序是 左子树，根，右子树 你看到这两个排列应该知道根肯定是后续的最后一个，通过这个根可以把中序分割为左子树后序，右子树后序。对左右子树迭代按上述操做，就可以把二叉树画出来。

我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《图解—由两种遍历方式建立二叉树》, 一起来围观吧 https://blog.csdn.net/qq_40946921/article/details/88867838?utm_source=app


Question: 用户需要录入每名同学的三门成绩和该同学姓名存储在数组中，最终按照平均成绩从高到底排列，并将包括姓名，每门成绩和平均成绩等情况，按照排列顺序输出。

引用 7 楼 chxchxkkk 的回复：这样的题一般用结构体数组能帮我写一下完整代码么

这样的题一般用结构体数组

引用 5 楼 弦之弈 的回复：用一个结构体数组吧 struct{ char name[]; int score[3]; }student[];完整的代码能帮忙写一下嘛  谢谢了

引用 1 楼 user-3 的回复：你可以再定义一个二维数组比如name[100][30]来存储姓名求帮帮忙 写一下

我知道定义一个数组 但是 之后就不会了= =

你可以再定义一个二维数组比如name[100][30]来存储姓名


Question: 求助cannot convert file to const char的bug怎么解决

请参考《C++中printf()函数的用法10-1》 希望能够帮到你！

#include <stdio.h>  //int mian(void) int main(void) {     FILE *fp;      char b[100];     int c;     char a[100];      if((fp=fopen("gifts.dat","r"))==NULL)         printf("ファイルをオープンできません。\n");     else{         while(fscanf(fp,"%s%s%d",a,b,&c)==3){             //printf(fp, "%-10s %-10s %d\n",a,b,c);             printf( "%-10s %-10s %d\n",a,b,c);             //fclose(fp);         }         fclose(fp);     }     getchar ();      return 0; } 供参考～  三个错误，建议对比代码找出自己的问题。

printf(fp, "%-10s %-10s %d\n",a,b,c);应该是fprintf吧

printf使用错了，第一个参数fp是FILE*类型，第一个必须是char类型


Question: 求助C语言循环结构实训题

引用 1 楼 ?Victor.?? 的回复:#include<stdio.h> #include<math.h> int main() {  double e,d,i,l=1.0,x;  scanf("%lf",&x);  for(i=1;i<100;i++)  {   l*=i;   d=pow(x,i);   e+=d/l;  }  printf("%lf",e+1);  return 0; } 供参考~  i<=100这个要改一下


Question: 关于父子进程问题

那你是怎么执行程序的？是不是打开一个终端，终端默认启动了bash（否则的.bash_profile定义的环境变量被什么读入的）？ 如果是这样，那你的父进程是bash没问题啊


Question: 编写一个菜单

引用 1 楼 user-1的回复:console程序还是win32还是mfc啥的? 偶，我自己搞定了


Question: C#数组


Question: 有没有哪位知道的，可以请你帮忙指导一下吗，谢谢

Sqlite库没有安装吧


Question: 小白求助

引用 7 楼 城南吖 的回复:[quote=引用 5 楼 N-n-N的回复:][quote=引用 4 楼 城南吖 的回复:] [quote=引用 2 楼 N-n-N的回复:] #include<iostream> using namespace std; int *id_n,*s_new; void search(int id,int n); void input(int id[],float scores[],int n); int main(){ string temp; int long=-1; int x; while(1){ cout<<"输入1 存储，输入2 查询，非法输入退出"; cin>>x; if(x==1){ cout<<"存储成绩\n";  cout<<"请输入学号" cin>>temp; string id=split(temp," "); int longa=sizeof(scores)/sizeof(scores[0]);  cout<<"请输入成绩\n" cin>>temp; string scores=split(temp," "); long=sizeof(scores)/sizeof(scores[0]); if(longa==long){ int idx[long]; int score[long]; for(int i=0;i<long;i++){ idx[i]=atoi(id[i]); score[i]=atoi(scores[i]); } input(idx,score,long); cout<<"成功"<<endl; } } elseif(x==2){ cout<<"输入查询学号"\n; int y; cin>>y; if(long==-1){ cout<<"未存储\n"; continue; } search(y,long); } else{ return 0; } } return 0; } void search(int id,int n){ for(int i=0;i<n;i++){ if(id_n[i]==id){ cout<<"成绩"<<s_n[i]<<endl; return; } } } void input(int id[],float scores[],int n){ id_n=new int[n]; s_n=new int[n]; for(int i=0;i<n;i++){ id_n[i]=id[i]; s_n[i]=scores[i]; } }  友情提示:随手写的 没测试过 不能保证正确，还有格式要改一下 自己的作业最好自己写 谢谢，这是c吗？老师让用c语言的指针写[/quote]用的是c++ 毕竟我以前都在写c++， 不过也没多大区别，你就看看这个思路吧，然后把一些c++的函数改成c的函数[/quote] 只上过几节c的网课，对c++不了解，[/quote]  我很少写c 不过c和c++还是有点区别的，一个是面对对象 一个是面对过程，不过看名字也看得出来，c++是c同根同源的改进版（这么说不太严谨），但是思路应该还是这个思路，你去百度找找教程自己写写吧，现在很少有人有时间在网上是会代码回复的，最多也就说下思路（除非给钱）所以还是要靠自己

引用 5 楼 N-n-N的回复:[quote=引用 4 楼 城南吖 的回复:] [quote=引用 2 楼 N-n-N的回复:] #include<iostream> using namespace std; int *id_n,*s_new; void search(int id,int n); void input(int id[],float scores[],int n); int main(){ string temp; int long=-1; int x; while(1){ cout<<"输入1 存储，输入2 查询，非法输入退出"; cin>>x; if(x==1){ cout<<"存储成绩\n";  cout<<"请输入学号" cin>>temp; string id=split(temp," "); int longa=sizeof(scores)/sizeof(scores[0]);  cout<<"请输入成绩\n" cin>>temp; string scores=split(temp," "); long=sizeof(scores)/sizeof(scores[0]); if(longa==long){ int idx[long]; int score[long]; for(int i=0;i<long;i++){ idx[i]=atoi(id[i]); score[i]=atoi(scores[i]); } input(idx,score,long); cout<<"成功"<<endl; } } elseif(x==2){ cout<<"输入查询学号"\n; int y; cin>>y; if(long==-1){ cout<<"未存储\n"; continue; } search(y,long); } else{ return 0; } } return 0; } void search(int id,int n){ for(int i=0;i<n;i++){ if(id_n[i]==id){ cout<<"成绩"<<s_n[i]<<endl; return; } } } void input(int id[],float scores[],int n){ id_n=new int[n]; s_n=new int[n]; for(int i=0;i<n;i++){ id_n[i]=id[i]; s_n[i]=scores[i]; } }  友情提示:随手写的 没测试过 不能保证正确，还有格式要改一下 自己的作业最好自己写 谢谢，这是c吗？老师让用c语言的指针写[/quote]用的是c++ 毕竟我以前都在写c++， 不过也没多大区别，你就看看这个思路吧，然后把一些c++的函数改成c的函数[/quote] 只上过几节c的网课，对c++不了解，

引用 3 楼 城南吖 的回复:让用指针完成对小白来说好难这个看起来可以普普通通的用数组写完欸..不知道为什么要指针搞得挺复杂的，不太清楚是什么意思

引用 4 楼 城南吖 的回复:[quote=引用 2 楼 N-n-N的回复:] #include<iostream> using namespace std; int *id_n,*s_new; void search(int id,int n); void input(int id[],float scores[],int n); int main(){ string temp; int long=-1; int x; while(1){ cout<<"输入1 存储，输入2 查询，非法输入退出"; cin>>x; if(x==1){ cout<<"存储成绩\n";  cout<<"请输入学号" cin>>temp; string id=split(temp," "); int longa=sizeof(scores)/sizeof(scores[0]);  cout<<"请输入成绩\n" cin>>temp; string scores=split(temp," "); long=sizeof(scores)/sizeof(scores[0]); if(longa==long){ int idx[long]; int score[long]; for(int i=0;i<long;i++){ idx[i]=atoi(id[i]); score[i]=atoi(scores[i]); } input(idx,score,long); cout<<"成功"<<endl; } } elseif(x==2){ cout<<"输入查询学号"\n; int y; cin>>y; if(long==-1){ cout<<"未存储\n"; continue; } search(y,long); } else{ return 0; } } return 0; } void search(int id,int n){ for(int i=0;i<n;i++){ if(id_n[i]==id){ cout<<"成绩"<<s_n[i]<<endl; return; } } } void input(int id[],float scores[],int n){ id_n=new int[n]; s_n=new int[n]; for(int i=0;i<n;i++){ id_n[i]=id[i]; s_n[i]=scores[i]; } }  友情提示:随手写的 没测试过 不能保证正确，还有格式要改一下 自己的作业最好自己写 谢谢，这是c吗？老师让用c语言的指针写[/quote]用的是c++ 毕竟我以前都在写c++， 不过也没多大区别，你就看看这个思路吧，然后把一些c++的函数改成c的函数

引用 2 楼 N-n-N的回复: #include<iostream> using namespace std; int *id_n,*s_new; void search(int id,int n); void input(int id[],float scores[],int n); int main(){ string temp; int long=-1; int x; while(1){ cout<<"输入1 存储，输入2 查询，非法输入退出"; cin>>x; if(x==1){ cout<<"存储成绩\n";  cout<<"请输入学号" cin>>temp; string id=split(temp," "); int longa=sizeof(scores)/sizeof(scores[0]);  cout<<"请输入成绩\n" cin>>temp; string scores=split(temp," "); long=sizeof(scores)/sizeof(scores[0]); if(longa==long){ int idx[long]; int score[long]; for(int i=0;i<long;i++){ idx[i]=atoi(id[i]); score[i]=atoi(scores[i]); } input(idx,score,long); cout<<"成功"<<endl; } } elseif(x==2){ cout<<"输入查询学号"\n; int y; cin>>y; if(long==-1){ cout<<"未存储\n"; continue; } search(y,long); } else{ return 0; } } return 0; } void search(int id,int n){ for(int i=0;i<n;i++){ if(id_n[i]==id){ cout<<"成绩"<<s_n[i]<<endl; return; } } } void input(int id[],float scores[],int n){ id_n=new int[n]; s_n=new int[n]; for(int i=0;i<n;i++){ id_n[i]=id[i]; s_n[i]=scores[i]; } }  友情提示:随手写的 没测试过 不能保证正确，还有格式要改一下 自己的作业最好自己写 谢谢，这是c吗？老师让用c语言的指针写

让用指针完成对小白来说好难

定义一个结构体数组，两个for循环输入，别忘了两个for之间的回车getchar()，然后for中嵌套一个if判断，输出对应成绩即可。


Question: 问个问题

加个ｖｏｉｄ就是说明没有参数，不给输参数，函数功能没区别，ｉｎｔ　main()   int main(void)都一样执行ｍａｉｎ一样，只不过加了ｖｏｉｄ如果调用是传参了会报错

#include <stdio.h>  void test1() {     printf("test1\n"); }  void test2(void) {     printf("test2\n"); } int main() {     test1(1, 2);   //不会有错误     test2(1, 2);   //报错 参数个数不匹配     return 0; }


Question: 在线急求C语言编程题

ｗｈｉｌｅ循环用于不知道具体多少的比较好 定义ｓ＝０，ｆｌｏｇ＝１；ｘ＝３；ｙ＝２； 循环体 ｓ+=(x*flog)/(y*y); flog=-flog; x+=2; y+=2; 这种题不难，主要去找规律，把规律找到，基本都是一个式子求值，然后再改变变量值

用一个for循环，结束条件就是题目中给出的条件


Question: 求助大佬们  , 有关  ' ++ i '  在调试过程中和在编译运行时结果不同的问题

int i = 0，n=10,x=2; int a[10] = {0}; a[i++] = 1; printf("%d\n\n",i); ----------------------------------------- int i = 0，n=10,x=2; int a[10] = {0}; a[i] = 1; i++; printf("%d\n\n",i); ----------------------------------------- 轮流测试，观察i

把编译结果清楚掉，重新编译一边试试。。。。

你还可以看内存。打开memery。运行一步看一下数组的内存变化。 因为你的数组内的值看上去也不大正常。 --------------------------------------------------------------- 以及，把++单独分离开后，是否还有问题。 找到问题处在哪个地方

【···· ····】一个点代表一个字节。  rax长度为8字节。  在rax中低4个字节为eax。  如果【···· ····】作为rax 其中的····为eax  eax作为rax的一部分

14、15、16行需要跟踪一下 这三行就干一个事情，吧i+1。关键行是15行。 需要调试看一下寄存器，看一下关键值。  第14行执行完后，到第15行时。edx中的值应当为i的值【还未增加时】的结果才正常。 执完第15行，到第16行时。eax中的值应当为i++后的结果才正常。  你可能要在汇编界面运行下这三行。看看右边寄存器展示的值是多少。15行断点看edx【增前的i】，16行断点看eax【增后的i】

我死了，我还没学汇编

64位的调试运行环境，int是32位的。直觉上以为问题兴许是出在这里了。 这64位程序的汇编没有经验。看的头晕眼花，边查边看，还需要点时间。

引用 7 楼 千梦一生 的回复:[quote=引用 6 楼 好了么 的回复:] [quote=引用 5 楼 千梦一生 的回复:] 确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。 下面是我执行了三步的截图，你在自己电脑上也会出现这种情况吗？ [/quote] 图片已被删除...[/quote] 不好意思哈，我没注意到

引用 6 楼 好了么 的回复:[quote=引用 5 楼 千梦一生 的回复:] 确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。 下面是我执行了三步的截图，你在自己电脑上也会出现这种情况吗？ [/quote] 图片已被删除...

引用 5 楼 千梦一生 的回复:确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。 下面是我执行了三步的截图，你在自己电脑上也会出现这种情况吗？

引用 2 楼 千梦一生 的回复:[quote=引用 1 楼 千梦一生 的回复:] 啊！这... 你单步跟踪调试，看看啊[/quote] 单步跟踪，每运行一步，那个 i 的值都加1，根本没有按照  a[i ++]那个条件来

这个问题，确实有趣，值得学习。楼主调试后发现什么端倪，请分享一下。

引用 1 楼 千梦一生 的回复:啊！这... 你单步跟踪调试，看看啊

啊！这...


Question: 请教大佬c语言

printf("%s %s %d",s[i].sub,s[i].name,s[i].time);

scanf("%s",&a); ==》》这里a是字符数组，不用取地址符号 if(a==s[i].sub) ==》》字符串不能这样直接比较，要用 if (strcmp(a, s[i].sub) == 0)这样比较


Question: 求大神看看哪里出错了TAT

楼主解决了吗

if(w[l]=w[k]) 这个应该是你手误了，应该是==

跟踪调试一下，看死在哪里


Question: 简单的用函数判断是否为素数的程序，运行出来并不能正确判断，求指教

引用 4 楼 user-1的回复:break后面的代码都不用了，直接返回1，break那里返回0 非常感谢😁😁

引用 4 楼 user-1的回复:break后面的代码都不用了，直接返回1，break那里返回0 嗯嗯嗯   好的

break后面的代码都不用了，直接返回1，break那里返回0

引用 1 楼 user-1的回复:break那里直接返回0，表示已经不是素数了 大佬  那直接在我这个上改应该怎么改呢，函数部分不改的情况下

bool is_prime(int number) { 	if(number <=2) 		return true; 	for(int i=2;i<number;i++) 	{ 		if(number % i==0) 			return false; 	} 	return true; }

break那里直接返回0，表示已经不是素数了


Question: 在liunx上运行C,报错，求解答

非常不小心，一直没想到。 是我没写这个方法的主体 图解如下：

包含math.h头文件


Question: 求助C语言循环结构实训题

引用 3 楼 斥包乐氶的 的回复:请教前辈，为什么我没有权限编辑自己的回复 这个论坛好像没提供修改回复的功能吧？所以如果回复错了就再回复一次吧

引用 2 楼 qybao 的回复://问题1 int main() {     double s=0, k=1.0;     int n=1;     while((k=1.0/(n*n))>=0.000001) {         s += k;         n++;     }     printf("%f\n", s);     return 0; }  //问题2 int main() {     double s=0, k=1.0;     int m=1,n=0;     while((k=1.0/m)>=0.000001) {        s += k;        n++;        m += n;     }     printf("%f\n", s);     return 0; }     请教前辈，为什么我没有权限编辑自己的回复

题目还是很简单的，给你个思路自己尝试去写写一下 首先，你这不知道ｎ是多少，所以最好就是死循环，循环中判断退出条件 １。可以看到分子固定不变，又是连加，可以知道肯定是sum=sum+1/x;这样的，那么ｘ是多少呢，找规律，是逐个加一的平方，那么是不是可以定义一个变量，每次循环变量加一，而ｘ为变量*变量 ２。同理，此时分母可以看到分别差1.2.3.4.5...也就是原本变量加差值，同样的，而此时ｘ初值为１，同样定义一个变量，每次循环将该变量加一，也就是获得了每次需要加的差值，而需要加的ｘ也在变，所以变量加一后将ｘ也更新，ｘ＝ｘ＋变量，具体包括ｘ的变量名随你自己取 这是关键的累加程序代码思路，累加完成后就要判断什么时候退出，这里放前面还是放后面你自己根据题目考虑，退出就是ｉｆ判断１／ｘ是不是小于10的负６次方，如果是ｂｒｅａｋ；就好了


Question: 关于结构体的疑问！

你这个数组就定义了3个长度，没办法添加进去了。建议把中括号[]里面填一个大于3个数字，比如10.这样可以添加新的成员进去的

你定义nowbook[]数组大小就是3了。怎么加？  1、直接开始定义nowbook[100]=...，后面就 nowbook[0]={}   、nowbook[1]={} .。。加到100即可 2、直接用vector，有新书就push_back就好了

我可以哦，下载什么，积分不能购买吗？

另外，想利用函数来实现，可以吗

没有积分太痛苦了，VIP太贵，有没有哪个大神帮忙下两个文件，只需要4积分，给他发个红包


一样的，老版本是带下划线的


Question: 如下代码，基础地方不太明白

感谢终于明白了

补充一下，上面第二个for循环中i的起始值是1，因为括号里面赋值为1了

#define  N  10   //你上面的这里忘了加 # 了  #include <stdio.h>   int main()   {   float f[N],x=0.0;   int i;      for(i=0;i<N;i++)  //  我相信这行代码你看得懂。这个循环结束后i等于10。为什么是10？这是因为N等于10，当i等于9时循环还会继续；当i等于10时循环才会结束。     scanf("%f", &f[i]);   //我觉得你应该知道scanf函数怎么用。这里是给数组f[N]输入10个浮点数。为什么偏偏是10个？因为上面预处理定义了N的值是10。如果看不懂那个预处理，当我这段话没说。   for(i=1;i<=N;i++) //这里i=1循环这个i值为多少   {          x = x + f[i-1]        ;     //这个填空你应该看得懂吧？为什么要填f[i-1]呢？因为数组f[N]的元素是从f[0]到f[9]。     printf("sum of NO -%d  %f\n", i, x);       //上面这里是不是忘了加%d了？我给你补上了   }    return 0;  }   我把数组中的元素分别赋值从1到10（当然你也可以赋其他值），编译结果如下： 1 2 3 4 5 6 7 8 9 10 sum of NO -1  1.000000 sum of NO -2  3.000000 sum of NO -3  6.000000 sum of NO -4  10.000000 sum of NO -5  15.000000 sum of NO -6  21.000000 sum of NO -7  28.000000 sum of NO -8  36.000000 sum of NO -9  45.000000 sum of NO -10  55.000000  如果还是不懂，你可以把我完善后的代码复制，自己编译后想想

for(i=0;i<N;i++)  //  i值和下面i值相比区别是?i最后值是多少（１）     scanf("%f", &f[i]);   //这里i=0，输入值有啥用　　　　　（２）   for(i=1;i<=N;i++) //这里i=1循环这个i值为多少　　　　　（３）   {                 ;     //填空     printf("sum of NO -  %f\n", i, x);     }  （１）for循环中这一句代表的循环次数，本质上与下面的无关，只是他们之间刚好都是每次循环加一的状态，刚好一致，所以就直接使用了for循环变量的值 (２)ｓｃａｎｆ函数是将数据写入变量的地址，ｉ等于０时f[０]是这个数组的首地址，你所定义的ｆ[10]实际使用是ｆ[0]到[9]这样的十个，数组指针，下标首地址都是０开始而不是１开始，这里你可以去看下指针方便理解，或者仔细了解下数组，推荐数组，因为指针可能更“底层”一点，相对数组比较难理解 （３）这里ｉ值不解释，给你讲下for for循环中分号隔开的分别是，变量，条件，更改变量值语句，当然都可以为空，那是另一种用法，先不说。变量，用于跟后面的条件一起控制循环次数，条件不说，你能理解，就是比较是不是满足，满足就执行循环，不满足退出循环。后面的ｉ＋＋，＋＋是双目运算符，分前后位置。这里后＋＋你可以理解为i=i+1;就是每执行一次循环就将ｉ的值加一，ｆｏｒ循环是通过变量看是否满足条件，满足执行循环体也就是｛｝中的内容，执行完毕后执行改变变量值的语句，再进行判断是否满足条件，构成循环，你按照这个把ｉ的值列出来你就懂了 第一次循环　循环前i=0,循环后ｉ＋＋　，ｉ＝１ 第二次循环　循环前i=1，循环后ｉ++，ｉ＝２ 就这样


Question: 求大佬帮我看看这段代码

加个循环读取

fgets就是读取一行，你要多读几次


Question: 一道C语言编程题

我刚刚试着编了一下，但是还是有错误但是我不知道咋改啊 #include<stdio.h> void main() { 	int max,min; int i,n,sum=0,t=0; int a[i]; float avge; printf("请输入学生的个数:"); scanf("%d",&n); printf("请输入%d个学生的成绩:"); {for(i=0;i<n;i++) scanf("%d",&a[i]); max=a[n-1]; min=a[0]; for(i=0;i<n;i++) {if(min>a[i]) min=a[i]; if(max<a[i])    max=a[i]; if(a[i]<60) t++; sum+=a[i]; } avge=sum*1.0/n; printf("最大值%d\n,最小值%d\n,不及格人数%d\n,平均分%lf",max,min,t,avge); }}

引用 2 楼 qq_47712720 的回复:[quote=引用 1 楼 chxchxkkk的回复:]这样的数组题不难吧，就是个排序和判断 刚学C语言，我做了一早上了[/quote] 给你个思路 定义变量： int max, min; //最大值、最小值 int i, sum = 0, t = 0; float avge; //平均值 int arr[10]; //假定10个学生 //数组输入应该会吧 max = arr[9]; min = arr[0]; for (i=0; i<10; i++) {     if (min > a[i])        min = a[i]      //比最小值小则赋值给最小值     if (max < a[i])       max = a[i]     //比最大值大则赋值给最大值     if (a[i] < 60)       t++;              //不及格人数     sum += a[i]; } avge = sum * 1.0 / 10; //平均值  输出 max min avge t

引用 1 楼 chxchxkkk的回复:这样的数组题不难吧，就是个排序和判断 刚学C语言，我做了一早上了

这样的数组题不难吧，就是个排序和判断

引用 5 楼 弦之弈的回复:int main() { 	int max, min, ave, unq; 	int i; 	int n;  // number of students 	scanf("%d",&n); 	char c; 	scanf("%c",&c); 	int str[n];	 //   	for(i=0 ; i<n ; i++) 	{ 		scanf("%d",&str[i]); 	} 	max = str[0]; 	min = str[0]; 	for(i=0 ; i<n-1 ; i++) 	{ 		if(str[i]>str[i+1]) 		{ 			max = str[i]; 			min = str[i+1]; 		} 		else 		{ 			min = str[i]; 			max = str[i+1]; 		} 	} 	unq = 0; 	for(i=0 ; i<n ; i++) 	{ 		if(str[i] < 60) 		{ 			unq++; 		} 	} 	ave = 0; 	for(i=0 ; i<n ; i++) 	{ 		ave = ave+str[i]; 	} 	ave = ave/n; 	// print  }  大概就是这样，题主加上输出和.h应该就行了 我知道了谢谢

引用 5 楼 弦之弈的回复:int main() { 	int max, min, ave, unq; 	int i; 	int n;  // number of students 	scanf("%d",&n); 	char c; 	scanf("%c",&c); 	int str[n];	 //   	for(i=0 ; i<n ; i++) 	{ 		scanf("%d",&str[i]); 	} 	max = str[0]; 	min = str[0]; 	for(i=0 ; i<n-1 ; i++) 	{ 		if(str[i]>str[i+1]) 		{ 			max = str[i]; 			min = str[i+1]; 		} 		else 		{ 			min = str[i]; 			max = str[i+1]; 		} 	} 	unq = 0; 	for(i=0 ; i<n ; i++) 	{ 		if(str[i] < 60) 		{ 			unq++; 		} 	} 	ave = 0; 	for(i=0 ; i<n ; i++) 	{ 		ave = ave+str[i]; 	} 	ave = ave/n; 	// print  }  大概就是这样，题主加上输出和.h应该就行了 谢谢！！！ 我会了谢谢谢谢


Question: 这段问题出在哪？

p是一个野指针，不能直接*p = n;因为可能会导致段错误。 建议可以p = &n;

指针p没有指向，应该先给指针p赋值

应该这样  #include<stdio.h> int main(){     int *p,n;     scanf("%d",&n);      p=&n;     printf("%d\n",*p); }

p是个野指针

是p没有分配空间，就直接赋值了

引用 1 楼 user-5 的回复:这有什么问题？运行赋值手显示存储空间未定义

这有什么问题？


Question: C语言函数题在线求助

学习了，，，

感谢分享！！

这个问题 我不太了解啊

引用 24 楼 user-4的回复:[quote=引用 23 楼 Master Chicken 的回复:] 题目的.c文件，现在只用写.h文件，谢谢大佬了！！ 只用写头文件？真的不是很理解你的题目要求，是要你学会运用宏定义的if else，还是要你学会函数功能的不同实现？ 那你就按你之前发消息的截图，改一改就好 #ifndef SOURCE_H #define SOURCE_H int *counts(const char* const s); #else //加个else吧，但是你的main怎么调用？main也用#if和#else控制吗？ void countLetters(const char* const s, int *counts, int size)  {     int i=0, j=0;     for (;s[i]!='\0'; i++)      {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z'))          {             j = s[i]%32 - 1;             if (j<size)                  counts[j]++;         }     } } #endif[/quote] 编译过了为啥无输出

引用 24 楼 user-4的回复:[quote=引用 23 楼 Master Chicken 的回复:] 题目的.c文件，现在只用写.h文件，谢谢大佬了！！ 只用写头文件？真的不是很理解你的题目要求，是要你学会运用宏定义的if else，还是要你学会函数功能的不同实现？ 那你就按你之前发消息的截图，改一改就好 #ifndef SOURCE_H #define SOURCE_H int *counts(const char* const s); #else //加个else吧，但是你的main怎么调用？main也用#if和#else控制吗？ void countLetters(const char* const s, int *counts, int size)  {     int i=0, j=0;     for (;s[i]!='\0'; i++)      {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z'))          {             j = s[i]%32 - 1;             if (j<size)                  counts[j]++;         }     } } #endif[/quote] 大佬你这个我试过了过不了编译。解释下题目意思：写两个函数，第一个函数在source.c已经写好了（题目给的），现在要提交的是source.h

引用 23 楼 Master Chicken 的回复:题目的.c文件，现在只用写.h文件，谢谢大佬了！！ 只用写头文件？真的不是很理解你的题目要求，是要你学会运用宏定义的if else，还是要你学会函数功能的不同实现？ 那你就按你之前发消息的截图，改一改就好 #ifndef SOURCE_H #define SOURCE_H int *counts(const char* const s); #else //加个else吧，但是你的main怎么调用？main也用#if和#else控制吗？ void countLetters(const char* const s, int *counts, int size)  {     int i=0, j=0;     for (;s[i]!='\0'; i++)      {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z'))          {             j = s[i]%32 - 1;             if (j<size)                  counts[j]++;         }     } } #endif

引用 22 楼 user-4 的回复:[quote=引用 21 楼 Master Chicken 的回复:]  现在不是只用写第二个函数吗，第一个函数在.c文件了题目帮写了，这个改怎么解决 只要函数名不相同就可以了呀，人家有没有写好main函数？ 第一个函数名你就不改用人家写好的countLetters，第二个函数名就改成countLettersExt（名字不重复即可）  或者你可以用宏来控制，比如 #ifdef Fun_2 void countLetters(const char* const s, int *counts, int size) {     int i=0, j=0;     for (;s[i]!='\0'; i++) {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) {             j = s[i]%32 - 1;             if (j<size) {                 counts[j]++;             }         }     } } #endif 编译时加上-DFun_2参数  你最好是题目提供已经写好的代码都贴出来[/quote]#include "source.h"  int* countLetters(const char * const s) {     int len = strlen(s);     int* arr = (int*)malloc(sizeof(int)*26);     memset(arr, 0, sizeof(int)*26);     for(int i = 0; i < len; ++i) {         if(islower(s[i]))             arr[s[i] - 'a']++;         else              arr[s[i] - 'A']++;     }     return arr; }题目的.c文件，现在只用写.h文件，谢谢大佬了！！

引用 21 楼 Master Chicken 的回复:现在不是只用写第二个函数吗，第一个函数在.c文件了题目帮写了，这个改怎么解决 只要函数名不相同就可以了呀，人家有没有写好main函数？ 第一个函数名你就不改用人家写好的countLetters，第二个函数名就改成countLettersExt（名字不重复即可）  或者你可以用宏来控制，比如 #ifdef Fun_2 void countLetters(const char* const s, int *counts, int size) {     int i=0, j=0;     for (;s[i]!='\0'; i++) {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) {             j = s[i]%32 - 1;             if (j<size) {                 counts[j]++;             }         }     } } #endif 编译时加上-DFun_2参数  你最好是题目提供已经写好的代码都贴出来

引用 19 楼 user-4的回复:c你就改成变量都定义在函数的最开始，然后new改成malloc，delete改成free 你的代码问题是 #ifndef SOURCE_H int *counts(const char* const s); #endif 的函数声明，和你函数定义的地方不一致 函数定义是 void countLetters(const char* const s, int *counts, int size){}  int* countLetters1(const char* const s) {     int i=0, j=0;     int *res = (int*)malloc(sizeof(int)*26);     memset(res, 0, sizeof(int)*26);     for (;s[i]!='\0'; i++) {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) {             j = s[i]%32 - 1;             res[j]++;         }     }     return res; }  void countLetters2(const char* const s, int *counts, int size) {     int i=0, j=0;     for (;s[i]!='\0'; i++) {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) {             j = s[i]%32 - 1;             if (j<size) {                 counts[j]++;             }         }     } }  int main() {     int i=0;     int *counts1 = countLetters1("ABcaB");     for (i=0;i<3;i++) {         printf("counts[%d]=%d\n", i, counts1[i]);     }     free(counts1);          int counts2[10];     memset(counts2, 0, sizeof(counts2));     countLetters2("abCdEfghiJkLmnOpqrStuvwXYz", counts2, 10);     for (i=0;i<10;i++) {         printf("counts[%d]=%d\n", i, counts2[i]);     }     return 0; } 现在不是只用写第二个函数吗，第一个函数在.c文件了题目帮写了，这个改怎么解决

引用 18 楼 Master Chicken 的回复:问题截图  countLetters改成两个函数名countLetters1和countLetters2，如果你要用isLower，要引入相应的头文件#include <ctype.h>

引用 16 楼 user-4 的回复:[quote=引用 15 楼 Master Chicken 的回复:]  对不起我知道可是编译过不了啊 把你写的代码发到这里吧，不要用截图的方式发信息，这样方便指出你程序的问题点 [/quote]#include <stdlib.h> #include <string.h> int* countLetters(const char* const s) {     int *res = (int *) malloc(sizeof(int)*26);     memset(res, 0, sizeof(int)*26);     int i=0;     for (;s[i]!='\0'; i++) {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) {             res[s[i]%32 - 1]++;         }     }     return res; }   void countLetters(const char* const s, int *counts, int size) {     int i=0, j=0;     for (;s[i]!='\0'; i++) {         if ((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) {             j = s[i]%32 - 1;             if (j<size) {                 counts[j]++;             }         }     } }问题截图

引用 13 楼 user-4 的回复:[quote=引用 10 楼 user-4 的回复:] [quote=引用 9 楼 Master Chicken 的回复:] 是啊c语言函数名不能相同啊可题目两个函数名不是相同吗 我觉得主要是理解题目的意图，而不是纠结函数名是否相同，c不支持重载，你就写成两个函数名 比如一个叫couterLetters1，一个叫countLetters2[/quote] 而且题目并不需要完整的程序（不要求你提供main），只是让你提供函数，所以题目的本意只是考你能不能根据要求实现函数的功能，而不是真的让你用c写两个同名函数[/quote]题目写了.c 文件

引用 15 楼 Master Chicken 的回复:对不起我知道可是编译过不了啊 把你写的代码发到这里吧，不要用截图的方式发信息，这样方便指出你程序的问题点

引用 13 楼 user-4的回复:[quote=引用 10 楼 user-4 的回复:] [quote=引用 9 楼 Master Chicken 的回复:] 是啊c语言函数名不能相同啊可题目两个函数名不是相同吗 我觉得主要是理解题目的意图，而不是纠结函数名是否相同，c不支持重载，你就写成两个函数名 比如一个叫couterLetters1，一个叫countLetters2[/quote] 而且题目并不需要完整的程序（不要求你提供main），只是让你提供函数，所以题目的本意只是考你能不能根据要求实现函数的功能，而不是真的让你用c写两个同名函数[/quote] 对不起我知道可是编译过不了啊

这么说吧你用不同函数名编译也过不了

引用 10 楼 user-4 的回复:[quote=引用 9 楼 Master Chicken 的回复:] 是啊c语言函数名不能相同啊可题目两个函数名不是相同吗 我觉得主要是理解题目的意图，而不是纠结函数名是否相同，c不支持重载，你就写成两个函数名 比如一个叫couterLetters1，一个叫countLetters2[/quote] 而且题目并不需要完整的程序（不要求你提供main），只是让你提供函数，所以题目的本意只是考你能不能根据要求实现函数的功能，而不是真的让你用c写两个同名函数

引用 10 楼 user-4的回复:[quote=引用 9 楼 Master Chicken 的回复:] 是啊c语言函数名不能相同啊可题目两个函数名不是相同吗 我觉得主要是理解题目的意图，而不是纠结函数名是否相同，c不支持重载，你就写成两个函数名 比如一个叫couterLetters1，一个叫countLetters2[/quote] 而且只用提交函数

引用 10 楼 user-4的回复:[quote=引用 9 楼 Master Chicken 的回复:] 是啊c语言函数名不能相同啊可题目两个函数名不是相同吗 我觉得主要是理解题目的意图，而不是纠结函数名是否相同，c不支持重载，你就写成两个函数名 比如一个叫couterLetters1，一个叫countLetters2[/quote] 可是题目规定了函数名啊？

引用 9 楼 Master Chicken 的回复:是啊c语言函数名不能相同啊可题目两个函数名不是相同吗 我觉得主要是理解题目的意图，而不是纠结函数名是否相同，c不支持重载，你就写成两个函数名 比如一个叫couterLetters1，一个叫countLetters2


Question: C语言memcpy拷贝结果出错

问题找到了  中途修改过WIFISaveInfor2[x][y]定义的y的值，但在extern中忘记修改了。谢谢各位了

建议在memcpy之前打印一下WIFISaveInfor2[i]，确保该数组的长度和内容是否是你想到的

1.首先 写代码要有删繁就简的能力  提问的时候 如果提出的问题让别人看着无法理解 说明你没有梳理问题的能力 未知会有很多 重要的是思路要清晰，至少可以把问题最小子模块化，然后你就知道问题在哪了。  2.问题可能出在buf太小了 40够不够 考虑好  其次当顺序定义 buf buf2 buf3的时候在内存布局会是连续的 也就是说 当你附近的被拷贝过界了 就有可能对其他数据的值产生影响。 memcpy这个函数除了在不能使用同一缓冲区进行拷贝下 未定义之外 系统函数问题不大、大的是你可能存在数组越界的操作。


Question: 为啥a=0？

因为p1为K的地址，所以p1==&m不成立，也就是为false. 值对应0


Question: 不懂就问:在学数据结构，照着书上的写前序遍历创建二叉树

引用 5 楼 user-1的回复:所以不能用&引用 好的，谢谢您嘞

所以不能用&引用

引用 3 楼 user-1的回复:你这是c还是c++，纯c是不支持引用的，你改成*T 纯cccccc

你这是c还是c++，纯c是不支持引用的，你改成*T

引用 1 楼 user-1的回复:没有包含头文件?可以贴下完整代码就知道了 #include<stdio.h> #include<malloc.h>  typedef struct BiTNode { 	char data; 	struct BiTNode* lchild, * rchild; }BiTNode,*BiTree;  void CreateBiTree(BiTree &T) {  //先序遍历创建二叉链表 	char ch; 	printf("请输入结点值(# 结束)："); 	scanf("%c",&ch); 	if (ch == '#')  T = NULL; 	else 	{ 		T = (BiTree)malloc(sizeof(BiTNode)); 		T->data = ch; 		CreateBiTree(T->lchild); 		CreateBiTree(T->rchild); 	} }  void PreOrderTraverse(BiTree T) { //前序遍历二叉树T的递归算法 	if (T) { 		printf("%c", T->data); 		PreOrderTraverse(T->lchild); 		PreOrderTraverse(T->rchild); 	} }  void InOrderTraverse(BiTree T) { //中序遍历二叉树T的递归算法 	if (T) { 		InOrderTraverse(T->lchild); 		printf("%c", T->data); 		InOrderTraverse(T->rchild); 	} }  void PostOrderTraverse(BiTree T) { //中序遍历二叉树T的递归算法 	if (T) { 		PostOrderTraverse(T->lchild); 		PostOrderTraverse(T->rchild); 		printf("%c", T->data); 	} }  void main() { 	BiTree T; 	CreateBiTree(&T); 	printf("前序遍历："); 	PreOrderTraverse(T); 	printf("中序遍历："); 	InOrderTraverse(T); 	printf("后序遍历："); 	PostOrderTraverse(T); }

没有包含头文件?可以贴下完整代码就知道了


Question: 如何用C语言设计程序？

用不着数据库这么复杂的，用个结构体数组就行了

这个不是表格形式么？第一时间应该能想到数据库啊

就是一些简单计算，先让用户输入学生人数，然后再输入每个学生的成绩等等


Question: 求助C语言循环结构

其他已解决  还剩这两个

引用 1 楼 朕守山河 的回复:你这个问题是啥？就是  这是 五个图片嘛   每个的流程图和程序   单纯 只有程序或  流程图  也行

你这个问题是啥？


Question: 求大佬们帮忙看看这段代码

十分感谢，我还以为是其他的意思

这段英文的意思就是“请输入写入到文件中的单词，在每行的起始位置处按下#按键来结束输入。” 从下面的输入可以看到，当输入结束时，按下#键即可


Question: VS链接libffi静态库

我在https://github.com/winlibs/libffi/issues/3找到了相似的问题,已经解决了,谢谢帮忙。

引用 1 楼 棉猴 的回复:请参考《VS2015动态库编程基础篇资源汇总》 希望能够帮到你！ 你好,感谢你的回答 我看了一下你写的文章,但是这不是我问题的关键,从我的编译结果来看,库编译是正确的,而且链接也没有错误,函数应该是可以调用的,可是并没有如期的实现,而是未找到函数符号

请参考《VS2015动态库编程基础篇资源汇总》 希望能够帮到你！


Question: 消息队列问题，求大佬解惑

问题已解决，卡住原因是 scanf("%[^\n]",buf); 不知为何只能输入一次，改为fgets输入后问题解决。 丢包原因是msgsnd输入参数有误，改正后解决。

父进程部分的break前面打印一句话，看下有可能break跳出来了


Question: 求大佬帮写个c语言 我写了一部分

求大哥们指点一下贴个代码

引用 6 楼 ?Victor.?? 的回复:就是用原函数吧  x*x*x/3+x*x+x第三个没有原函数吧

就是用原函数吧  x*x*x/3+x*x+x

引用 4 楼 斥包乐氶的 的回复:你的问题太太太复杂了！ 我只是第三个不知到怎么写，前两个大概会了

你的问题太太太复杂了！

有大佬吗别沉了呀

有大神帮着完善一下吗

#include<stdio.h> #include<math.h> int main() {double integral(double(*)(double),double,double,int n); double fsin(double); double fcos(double); double a1,b1,a2,b2,c,(*p)(double); int n=20; printf("input a1,b1:"); scanf("%lf,%lf",&a1,&b1); printf("input a2,b2:"); scanf("%lf,%lf",&a2,&b2); p=fsin; c=integral(p,a1,b1,c); printf("The integral of sin(x)is:%lf\n",c); p=fcos; c=integral(p,a2,b2,c); printf("The integral of cos(x)is:%lf\n",c); return 0; } double integral(double(*p)(double),double a,double b,int n) {     int i;     double x,h,s;     h=(b-a)/n;     x=a;     s=0;     for(i=1;i<=n;i++)         {x=x+h;         s=s+(*p)(x)*h;         }     return(s); }     double fsin(double x)     {         return sin(x);     }     double fcos(double x)     {         return cos(x);     }


Question: tcp分片问题

因为你从B上抓到的是组包之后的，A分片发给B，B会先组包，然后再提交给协议栈（TCP/IP协议栈）


Question: 求字符串最大的一个

引用 2 楼 面包牛奶天生一对的回复:问题都没说清，怎么帮？是求若干个字符中，长度最大的还是单纯比较字符串大小？都不说清 比较字符串的大小

so,楼主的问题是什么？


Question: 用C语言的循环语句输出如下图案

在循环里： 1.输出空格数（每行+2） 2.输出图形

你这都是列输出，判断列⭐起始位置就行，结束位置都是上一列+1用for和if嵌套可以了

嵌套循环就可以了 for(n=0; n<5; n++) 	{ 		for(i=0; i<=n; i++) 		{ 			printf("  "); 		} 		printf("*****\n"); 	}

有具体代码吗


Question: C语言个人所得税计算器，求助大佬帮忙开头和主体部分

没有细写，你自己参考着修改吧  #include <stdio.h>  int refer[10][2] =     {         { 1600, 0},         { 500, 5},         { 2000, 10},         { 5000, 15},         { 20000, 20},         { 40000, 25},         { 60000, 30},         { 80000, 35},         { 100000, 40},         { 100000, 45},     };   float getSalary() {     float n = -1;     while (1)     {         printf("输入员工工资：\n");         scanf("%f", &n);         if (n >= 0 && n < 1000000)             return n;         else         {             printf("输入0-1000000之间的数：\n");             scanf("%f", &n);         }     } }  float prvtaxcal(float m, int arr[][2], int n) {     float temp = 0.0;     int i;     if (m <= arr[0][0])         return 0;     else     {         temp = m - arr[0][0];         if ( temp < arr[1][0])             return temp * arr[1][1] / 100.0;         else if (temp > arr[1][0] && temp <= arr[2][0])             return temp * arr[2][1] / 100.0;         else if (temp > arr[2][0] && temp <= arr[3][0])             return temp * arr[3][1] / 100.0;         else if (temp > arr[3][0] && temp <= arr[4][0])             return temp * arr[4][1] / 100.0;         else if (temp > arr[4][0] && temp <= arr[5][0])             return temp * arr[5][1] / 100.0;         else if (temp > arr[5][0] && temp <= arr[6][0])             return temp * arr[6][1] / 100.0;         else if (temp > arr[6][0] && temp <= arr[7][0])             return temp * arr[7][1] / 100.0;         else if (temp > arr[7][0] && temp <= arr[8][0])             return temp * arr[8][1] / 100.0;         else if (temp > arr[9][0])             return temp * arr[9][1] / 100.0;     } }  int main(void) {     float salary = 1.0, tax = 0.0;     do     {         salary = getSalary();         tax = prvtaxcal(salary, refer, 9);         printf("工资：%-10.2f, 纳税：%-10.2f\n", salary, tax);     } while (salary > 0);       return 0; }

谢谢大佬大大的帮助

题目具体要求是什么呢？

俩题目要求 是个截图，谢谢大佬


Question: 浙大PAT习题，找了一晚上都找不出错在哪  哥哥们进来看看

老哥们帮忙看下吧


Question: 求大佬帮写

比如： int a[10], b[10], *p, *q, i; p = a; q = b; for (i=0; i<10; i++) {     *(q+i) = *(p+i); }  for (i=0; i<10; i++) {     printf("%d ", *(q+i)); }


Question: c语言结构体

供参考  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct Student {     char name[20];     int age;     int math;     int english;     int chinese;     float avge; } Stu;  int main() {     Stu s[3];     int i;      for (i=0; i<3; i++)     {         printf("输入第%d个学生的姓名 年龄 数学成绩 英语成绩 语文成绩：\n", i+1);         scanf("%s%d%d%d%d", s[i].name, &s[i].age, &s[i].math, &s[i].english, &s[i].chinese);         s[i].avge = (s[i].math + s[i].english+s[i].chinese) * 1.0 / 3;         getchar();     }      for (i=0; i<3; i++)     {         printf("%s学生的平均分为：%.2f\n", s[i].name, s[i].avge);     }      getchar();     return 0; }


Question: 哪位大神帮帮忙

引用 6 楼 做或不做的回复:1.改控制台颜色很简单 在C里 有一些头 然后百度即可 2.校车管理系统 (1)顺序表 或者 链表操作使用其中之一  结构体定义 (2)scanf getc sprintf sscanf 等一些文件读写的操作 注意一些fflush的操作 (3)排序 查询 函数指针的排序  (4)动态规划算法 还可以根据深度遍历和广度遍历对路线规范 这个一般写出来 就是优秀毕业设计了 本科生大多写不出来 (5)业务逻辑调查 把他整合进你的代码 好的，谢谢你了

教你，网上随便找一个页面模板，套下来，你这主要还是一个数据库的增删查改，功能现成的写进去

引用 3 楼 user-3的回复:先学习，复习一周，再做 可是5天后就要交

先学习，复习一周，再做

引用 1 楼 user-3的回复:不是很难的啊 可我不会啊，这是期末的作业

不是很难的啊


Question: 请问一个数组下标效率的问题

我拿Linux来解释，不完全准确，可以近似这样理解。  当你malloc了200W字节的时候，系统实际上给你开了个空头支票。你虽然拿到了分配的内存的地址，但底层的物理内存压根就没有分配，只是做了个备案。当你开始往内存中写东西的时候，系统才开始给你分配真正的物理内存，而且容易想象，你写的地址的offset越大，系统需要真正准备的物理内存越多，花的时间越长。  想要准确的解释，可以去看虚拟内存这块。

引用 7 楼 alldying 的回复: 我觉得你可以把cc转为unsigned int 然后再运算+偏移，不要用他本身的类型 *(cc+150000)='a' 这个运算是 cc+sizeof(char)*150000 *(char*)((int)cc+150000)='a'; 这样看会不会快些

修改成 *(char*)((int*)cc+150000)='a'; 后，运行2次，第一次有大幅改善，第二次结果跟之前差不多，结果如下  2.1.   1589128544,452039,1589128544,452045 2.2.   1589128544,452047,1589128544,453108   2.1.   1589128846,724661,1589128846,724667 2.2.   1589128846,724669,1589128846,724929  后来再多次运行，结果类似第二次。  猜测，第一次刚好如你上面所说，cc分配在同一物理页了，所以快了很多，因为单从数组来说，操作各个位置的复杂度应该是O(1)，但是到寻址这一步，如果跨了分页，那么离起点越远就步骤越多，越耗时。

谢谢gouyanfen的回复。   1、改成偏移10，结果差不多，这个测试是想知道对一个大数组的不同位置，由其是距离起点不同距离的位置赋值是否耗时一致；  	char  **cc; 	cc = malloc(sizeof(char  *)*2000000); 	gettimeofday(&tv1, 0); 	*(cc + 10) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.1.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  	gettimeofday(&tv1, 0); 	*(cc + 1500000) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  测试结果  2.1.   1589123428,159323,1589123428,159328 2.2.   1589123428,159329,1589123428,159613  2、变量是char类型是因为实际项目中这里是个自定义的结构，结构大小没法保持和总线位数一样；  3、虽然这个测试的目的不是内存分配效率，不过，怎样才能分配在一个物理内存页呢，那样的话赋值效率应该也会高些；

引用 5 楼 alldying 的回复:不好意思，刚刚描述有点错，是200W时对不同位置赋值，耗时不一样，下面是代码和结果  	char  **cc; 	cc = malloc(sizeof(char  *)*2000000); 	gettimeofday(&tv1, 0); 	*(cc + 0) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  	gettimeofday(&tv1, 0); 	*(cc + 1500000) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  测试结果  2.1589117027,554010,1589117027,554014 2.1589117027,554016,1589117027,554282 你这个测试不是很合理，*(cc+0)='a';编译器没有那么笨的，会优化的，所以你应该改一下位置不要用偏移为0, 其次你的变量为char类型，那么在偏移寻址，地址操作时就多了几个寻址取数的汇编码的寻址最快的是和总线相同位数的 再有一个你测试分配内存测试效率，应该尽量分配在一个物理内存页中。

不会有差别的，你把测试结果贴出来

赋值是一样，关键是这个数组大小不一样，一个20W，一个2W，是否大小不一样导致寻址过程不一样呢

这里赋值不都一样吗？

补充，耗时集中在赋值，不在malloc，malloc的差距可以忽略。


Question: 错误	LNK2019	无法解析的外部符号

引用 1 楼 user-1的回复:printf("%\n");  这一句里把%去掉，当然不去掉也不影响运行，但是会有个警告 不知道你的vs是什么版本的，我是vs2019,在第一行加上一句 #define _CRT_SECURE_NO_WARNINGS  //这一句是为了scanf不报错 #include<stdio.h> #define N 10 然后运行正常，并没有你报的错误  我也是2019，按照你的方法试了，还是报错。


Question: 求大佬解决

因为 sum 随着循环的叠加，永远不可能等于n for (n = 2; n <=1000; n++)     {       sum=0;//加上这一句         for (i = 1; i < n; i++)         {             if (n % i == 0)             {                 sum = sum + i;              }

没结果表明 n == sum 条件不满足

引用 1 楼 真相重于对错的回复:每次需要把sum赋值为0 好的谢谢，那个运行窗口 没结果是怎么回事 也改了

每次需要把sum赋值为0


Question: 代码如下，请教一下，输出是什么

输出：7  1、i++是在第一轮做完以后进行的 2、第一轮时j=2，后面根据i的变化而变化 3、不加花括号肯定有变化，不加的话第一层的循环只循环sum=1

等于7啊，外层循环最后一次起作用

{ sum=1;//i执行i++了吗?       for( j=i;j<7;j++)//这个地方i赋值给j，j值变为2对吧     ===》》这里i的值还是1，下次才++.          sum=sum+j; }//这里嵌套不加花括号效果变了对吗? ===》》这里for循环体只有 sum = sum+j一条语句，所以可以不用花括号


Question: 代码如下，请教大家输出是什么，详细说说谢谢各位

continue是不向下循环，而是继续执行循环i++

引用 楼主 C语言没学好 的回复:#include <stdio.h>   int main( )  { int i=10,s=0;    for(i=1;i<=10;i++)//这个不太懂，continue，效果是什么    {  if(i%3!=0) continue;       s=s+i; }//循环10次，带入数值9+6+3是这个吗      printf("%d",s);    return 0;  } 实现了什么效果 实现的效果应该是找到第一个能被三整除的数。 首先循环应该懂然后ｉｆ语句是不能被三整除continue,这个单词的作用是跳过本次循环执行下一次循环，一旦执行了这个关键字语句就不会执行下面的语句而是直接全部跳过。 继续往下，ｓ＝ｓ＋ｉ，这是给ｓ赋值，看似是求和，紧接着打印，但是后面接了return0，代表程序结束返回值为０，直接到此直接结束了，就不会再运行，因此求和只求了一次，而初始值为０　，所以可以看作找到第一个被３整除的数也就是３

自顶

目前是个无限循环

if(i%3!=0) continue;  意思是如果不能整除3，则跳过本次循环进入下一次，比如 i=5 5 % 3 ！= 0; 那么进入下一次 i = 6;


Question: 代码如下，功能是：从键盘输入10个字符，输出其中数字字符

getchar()是输入一个字符，putchar()是输出一个字符

getchar和scanf的作用是相似的，输入 putchar是输出  填空为：continue;   意思是输入的数据不是数字就不再执行后面的内容，重新回到for，开始新一轮


Question: c语言求助！！！删除指定字符

去掉scanf中的'\n'。然后再试试～

代码细节逻辑没怎么看 至少输入 你可以这么写         scanf别读char 这个C实现本身就容易弄蒙圈人  如果弄清为什么 还不如记得以后别这么用         fflush(stdin); 	c = getchar();


Question: 代码如下，填空题

感谢，我懂了

最好调试着看，一看就明白了。跑一下程序。

单条语句是可不用加花括号的 if(condition)  expression_1; 等价于 if(condition) { expression_1; }   这里就是 for(){    for(){     } } 将里面的一整个for循环看做一条语句，就不用加括号。   最底层的if的理解也是一样的  if后面是多条语句，所以加上花括号；但是if语句块是一个整体，没有别的语句，就不用了加花括号。  m是满足if条件的一组(i,j,k)的数量。   #include <stdio.h>  int main( )   {  int i,j,k,m=0;       for(i=0;i<=20;i++) {  //这里为啥不加花括号       for(j=0;      ;j++) {   //j<=50答案明白了          for(k=0;k<=100;k++){//最底层for不懂和if嵌套怎么判定             if(i*5+j*2+k==100)              { m++;printf("i=%d,j=%d,k=%d\n",i,j,k);}}}}      printf("m=%d",m);      return 0;   }

这是一个for嵌套 如果for（）后面没有{}，那么这个for循环只管这它下面的一条代码


Question: 代码如下，这是填空题，可以详细说说吗

引用 4 楼 qq_1457346882的回复:上面答案是错的。。。 这种题首先看你的图案，去找你空格的规律，我不知到题目是就这样的，还是你电脑自己打得，反正都会对齐，你数就好了，如果是电脑就鼠标按好移动，看看有几个格子，这里第一行４个，第二行两个，第三行０，所以规律你会发现ｉ是０，１。２而（２－ｉ）*２恰好可以满足。所以应该填j=2*(2-i); ｓ的赋值不是空，是空格，同样下面的例子可以看到。数的就是空格 j<2*i+1这句跟填的一样，是控制循环次数的，也就是打印的数量，*就是×号２*ｉ＋１就是２乘以ｉ的值再加一，然后ｊ小鱼这个值的时候就执行循环体 最后，这是二层嵌套不是三成，嵌套层数是指包含的，你这是一个外循环包含两个内循环，内循环是独立的，不是包含关系，只有两层三个，层代表的是层次，不是个数 谢谢，终于懂了

引用 5 楼 C语言没学好 的回复:[quote=引用 4 楼 qq_1457346882的回复:]上面答案是错的。。。 这种题首先看你的图案，去找你空格的规律，我不知到题目是就这样的，还是你电脑自己打得，反正都会对齐，你数就好了，如果是电脑就鼠标按好移动，看看有几个格子，这里第一行４个，第二行两个，第三行０，所以规律你会发现ｉ是０，１。２而（２－ｉ）*２恰好可以满足。所以应该填j=2*(2-i); ｓ的赋值不是空，是空格，同样下面的例子可以看到。数的就是空格 j<2*i+1这句跟填的一样，是控制循环次数的，也就是打印的数量，*就是×号２*ｉ＋１就是２乘以ｉ的值再加一，然后ｊ小鱼这个值的时候就执行循环体 最后，这是二层嵌套不是三成，嵌套层数是指包含的，你这是一个外循环包含两个内循环，内循环是独立的，不是包含关系，只有两层三个，层代表的是层次，不是个数 谢谢，终于懂了[/quote] 恩，不知道你是不是程序员工作以后，像这种题有多少空格如果能过通过一定方法得到确定的就不要靠眼睛看，那是猜的，当然这是电脑，如果是纸上那只能数，纸上的格式肯定是对其的。尽量能稳则稳，笔试机考很多坑的

自顶

#include <stdio.h>  int  main()  {       char c= '*',s=' ';//这里 不是 空， s赋值是个空格， 想打印一个空 格字符       int i,j;      for(i=0;i<3;i++)      {           for(j=   2-i         ;j>0; j--)//打印每行 的空格 ， 不知 是 2 1 0还是 3 2 1             printf("%c",s);          for(j=0;j<2*i+1;j++) //j<2*i+1是得到 1，3，5， 每行 打印的 * 数量              printf("%c",c);          printf("\n");       }//三层for嵌套结束       return 0;  }

填：3-i  需要填空的这一行是用来循环输出*前面空格的，由于每一行的空格数量不同，意味着最外层循环每一轮都将影响j的初始值。所以j需要和i关联，即最大的空格数量减去i。  2*i+1：表示*的数量是以1.3.5.7.9....的顺序递增。数学的等差数列~


Question: puts(a)的输出结果：

引用 1 楼 user-1的回复:你这不是下了断点吗，单步执行看呗 谢谢你回复，单步执行的时候，值的变化规律不理解

你这不是下了断点吗，单步执行看呗


Question: C语言新手一道初学者题不知道哪里出错了，求助

引用 2 楼 @大愚@的回复:这应该是==号 可是输入正确的也显示no了

这应该是==号

有人能告诉我一下吗？

你的for循环里的退出条件有问题，你是不超过20个就一直循环，如果你就只有3个字符，那剩下的都是没有赋值得所以只需要访问这三个字符即可,字符串结束符是'\0'所以只要不等于'\0',就会一直访问

你的for循环的退出条件有问题 你这是小于20但你不一定输入20个字符，所以你的退出条件是字符串的元素不等于 '\0'


Question: 关于程序出现乱码

fflush(stdin);加在scanf之后，可以清除输入缓存区。 中文字符是两个char 存储，也就是说[0][1]加起来才表示一个字符。所以你要计算好位置。

引用 7 楼 Simple-Soft 的回复:scanf("%c ", &str); 再做一次，第一次把上面的回车接收 不过没懂他为什么第一次读回车

引用 7 楼 Simple-Soft 的回复:scanf("%c ", &str); 再做一次，第一次把上面的回车接收 可以了，但要输两次这个字符

scanf("%c ", &str); 再做一次，第一次把上面的回车接收

引用 5 楼 Simple-Soft 的回复:scanf两次，就把回车去除了，因为你按回车了，所有会接收到两个字符，一个是d，一个是回车 懂你的意思了，但是程序要怎么写？不太会

引用 3 楼 Simple-Soft 的回复:a[location - 1] = a[str] 这里错了，改成 a[location - 1] = str 我尝试过这么改，改完之后输入的那个字符会变成回车插入

引用 1 楼 user-3 的回复:全输入英文字符会出现这样的问题吗

全输入英文字符会出现这样的问题吗


Question: 循环嵌套for

循环比较简单  你只要掌握了循环这些语句的意思和用法你就知道了

引用 1 楼 user-2的回复:下次希望楼主问问题能写得详细点，可以的话把代码全部写上...不要让我们去猜...  因为楼主没说a和b的类型，我假设a和b都是int类型。 for(a=1; a<6; a++)      这段代码的意思是：当a=1时，如果a<6为真，则执行for下面的一段代码（这里楼主没有把代码写上。也可能是真的没有代码），执行完后a=a+1(a++的意思就是a=a+1，a++和++a的意思不同，要注意)（即a=2）。这里是第一次循环。  第二次循环：当a=2时，如果a<6为真，则执行代码（和第一次循环一样），执行完后a=a+1，即a=3。 第三次循环：当a=3时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=4。 第四次循环：当a=4时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=5。 第五次循环：当a=5时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=6。 第六次循环：当a=6时，a<6为假，此时直接跳出循环，for下面的代码不会执行，a也不会继续加一，此时a=6。  然后到for(b=0;b<a;b++)，这里楼主没说有没有在上面那个for的嵌套内....我很为难啊，我就假设没有在嵌套内吧....那么此时a=6代入循环内。 第一次循环：当b=0时，如果b<6为真，则执行代码，执行完后b=b+1，即b=1。（第一次赋值） 第二次循环：当b=1时，如果b<6为真，则执行代码，执行完后b=b+1，即b=2。（第二次赋值） 第三次循环：当b=2时，如果b<6为真，则执行代码，执行完后b=b+1，即b=3。（第三次赋值） 第四次循环：当b=3时，如果b<6为真，则执行代码，执行完后b=b+1，即b=4。（第四次赋值） 第五次循环：当b=4时，如果b<6为真，则执行代码，执行完后b=b+1，即b=5。（第五次赋值） 第六次循环：当b=5时，如果b<6为真，则执行代码，执行完后b=b+1，即b=6。（第六次赋值） 第七次循环：当b=6时，b<6为假，此时直接跳出循环。这里就没有再赋值了。 所以b被赋值了6次  假设b循环在a循环的嵌套内，为了方便楼主理解，我写了代码如下： #include <stdio.h>  int main() {         int a,b;         int cnt=0;                  //cnt是用来计数的。         for (a=1; a<6; a++)         {             for(b=0; b<a; b++)             {                 cnt++;             //每执行一次循环，cnt就加1             }         }         printf("cnt=%d\n", cnt);    //最后输出cnt结果是15          return 0; }  至于三个for嵌套...一样的道理，实在不懂麻烦楼主举个例子。 不要告诉我你没看懂..... 哦，辛苦你了，这个问题我一开始很懵，因为看到csdn有人说是嵌套循环for由内而外(最开始为外，嵌套for为内)，标题已经说明循环嵌套for，我看了你解释完全明白了，由内而外虽说不错、实质上并非是这样。谢谢你了


Question: 图片是一个练习作业

解释起来相当麻烦...简单举个例子吧  a                          ————二维数组首元素的地址（每个元素都是内含4个int类型元素的一维数组） a+2                      ————二维数组的第3个元素（即一维数组）的地址 *（a+2）              ————二维数组的第3个元素（即一维数组）的首元素（一个int类型的值）地址 *（a+2）+1         ————二维数组的第3个元素（即一维数组）的第2个元素（也是一个int类型的值）地址 *（（*a+2）+1） ————二维数组的第3个一维数组元素的第2个int类型元素的值，即数组的第3行第2列的值（a[2][1]）  如果不懂的话不要追问，解释起来太费劲。建议看书或者等其他大佬


Question: 好几个C语言表达式看不懂

明白了感谢

三目，逻辑非，递增

引用 2 楼 m0_47292308 的回复：[quote=引用 1 楼 weixin_45906870的回复:]第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假 [/quote]if（a）的意思是如果a不是零，就执行b++ 感叹号表示否定，所以if（！a）意思是如果a是零，所以判断为假

引用 3 楼 m0_47292308 的回复：[quote=引用 2 楼 m0_47292308的回复:][quote=引用 1 楼 weixin_45906870的回复:]第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假 [/quote] 你再看看，为啥提示答案为三(这是在一本书上看到)[/quote]答案错了吧

编译运行k=5

引用 2 楼 m0_47292308的回复:[quote=引用 1 楼 weixin_45906870的回复:]第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假 [/quote] 你再看看，为啥提示答案为三(这是在一本书上看到)

引用 1 楼 weixin_45906870的回复:第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假


Question: c

先判断(y--)这个整体与-1比较，然后再算--。

后置++或--，是先原数，然后再自增（自减）比如这个 while(y-- !=-1），先判断y != -1,然后y--。下次循环的时候y是--后的值了。

这是y--的设计，先做事，再--


Question: 程序是用来将用户输入的字母与数字混合的电话号码变为纯数字的，但程序在输出电话号码时确只输出一个空格是怎么回事？？？还有一点，这个CSDN分数怎么给？？

先把char letter[i]改成letter[15]，再去看别的问题


Question: 数据结构问题求助

printGraph时不要用 G->verts[i].firstedge=G->verts[i].firstedge->next 的方式来遍历下一个节点，你这样就会覆盖G->verts[i].firstedge的信息，原来的信息就丢失了，只剩下最后邻接点NULL，所以第二次就打印不了了。 用个临时指针变量来遍历，即  for(i=0; i<G->vertNum; i++){ printf(“%d %c    “, i, G->verts[i].vertinfo); edgeNode *p = G->verts[i].firstedge;//用临时变量p来遍历 while(1){ if(p==NULL) { printf(“^”); break; } printf(“%d->”, p->adjvert); p=p->next; //用临时变量，不会覆盖G->verts[i].firstedge原来的信息 } printf(“\n”); }


Question: fgetc和getc这两个函数有什么区别？？

引用 3 楼 chxchxkkk 的回复：楼主真勤奋，3点多还没睡觉学的不好，太焦虑了

楼主真勤奋，3点多还没睡觉

函数和宏的区别，建议查查。多自己动手吧，遇到问题不要着急一点一点的去搜索和研究，需要多花时间和经历。

两个的功能是完全一样的  从文件中读取字符，只是两个函数的定义上不同而已。一般来说，getc比fgetc读取速度快吧 没必要深究  int fgetc(FILE*stream) #define getc(_stream)(--(_stream)->_cnt>=0?0xff&*(_stream)->_ptr++:_filbuf(_stream))


Question: 如何将一个端口上收到的包转发到另外一个端口

报文太大的话raw socket用sendto发不过去。

如果网络程序简单，可以试试端口转发。无非tcp 连接 tcp监听。来回捣数据。recv数据直接send给另一端。 参考lcx

你要开发虚拟网卡驱动的节奏。


Question: 数组中数字右移问题

这样写最简单吧  你的太晕了看的 void rotateArray(int *a, int n, int k) {     int s[10];     for(int i=0;i<n;i++){         if(i+k>9){             s[(i+k)%10] = a[i];         }         else         {             s[i+k] = a[i];         }     }     for(int i=0;i<10;i++){         a[i] = s[i];     } }

按照你的思路也可以  void rotateArray(int *a,int n,int k) { 	for(int i=0;i<k;i++) 	{ 		int temp = a[n-1]; 		for(int j=n-1;j>0;j--) 		{ 			a[j]=a[j-1];		 		} 		a[0]=temp; 	} }

给一个简单的方式 void rotateArray(int *a,int n,int k) { 	int *temp = new int[n]; 	memcpy(temp,a+(n-k),sizeof(int) * k); 	memmove(a+k,a,sizeof(int) * (n-k)); 	memcpy(a,temp,sizeof(int) * k); 	delete []temp; }

void rotateArray(int* a, int n, int k) {         int* left = new int[k];     int* right = new int[n - k];     memcpy(left, a + (n - k), sizeof(int) * k);     memcpy(right, a, sizeof(int) * (n - k));     memcpy(a, left, sizeof(int) * k);     memcpy(a + k, right, sizeof(int)*(n - k)); }

引用 2 楼 user-4的回复:pre_temp=*a;  a在这里应该是数组吧，这一句应该不对。 要怎么改呢，不太会指针

引用 1 楼 Simple-Soft的回复:你的目的是要做什么？你的右移函数里面本身并没有改变数组本身 比如说输入1 2 3 4 5 6 7 8 9 0 然后输入4 得到7 8 9 0 1 2 3 4 5 6

pre_temp=*a;  a在这里应该是数组吧，这一句应该不对。

你的目的是要做什么？你的右移函数里面本身并没有改变数组本身


Question: C语言函数 关于素数判断

引用 10 楼 @大愚@的回复:质数是只能被1和他本身整除。假设是p = 39,在执行for循环的语句块，在执行if语句但if语句不满足，执行else。你的程序就说p是质数但39不是，所以你应该把else里的语句块应该放在for循环的外面. 我懂了谢谢你

引用 6 楼 真相重于对错的回复:if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。 懂了懂了懂了谢谢谢谢

引用 9 楼 爱流王的回复:for(i=2;i<=p;i++) {     if(p%i==0)     {             break;             return 0;     }     else             return  1; }  你这个for循环不管咋样都只能执行一次呀 了解了了解了谢谢你谢谢你

引用 7 楼 qq_46521413 的回复:[quote=引用 6 楼 真相重于对错的回复:]if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。 对的啊 如果等于零的话，我们跳出循环就可以了，因为它就一定不是素数了呀[/quote]因为你没有return 所以在现代一点儿编译器会报错。 老的编译将是返回一个不确定的值，那么在外层怎么知道到是，还是不是。

引用 6 楼 真相重于对错的回复:if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。 对的啊 如果等于零的话，我们跳出循环就可以了，因为它就一定不是素数了呀

引用 4 楼 Simple-Soft的回复:把源代码文件发给我，我帮你改一下qq 3405187170 不用麻烦您了 您告诉我哪里有漏洞就好了 我自己改 感觉我就是漏掉了某一种情况

把源代码文件发给我，我帮你改一下qq 3405187170

引用 1 楼 Simple-Soft的回复:不能等于p，小于p 对的对的，应该是不能等p，但是还是有问题

引用 1 楼 Simple-Soft的回复:不能等于p，小于p 你这个问题我已经改过了，但是问题那不在这，因为我把等号去掉的话还是不对

不能等于p，小于p


Question: 这段代码运行的时候为什么会提示重复释放p的空间呢？

#include<stdio.h> #include<stdlib.h>  #define maxVertNum 100  typedef struct node{     int adjvert;     struct node *next; }edgeNode;//边结构体  typedef struct{     char vertinfo;     edgeNode *firstedge; }vertNode;//顶点结构体  typedef struct{     vertNode verts[maxVertNum];     int vertNum,edgeNum;  //顶点数和边数 }ALGraph; //图结构体  void creatGraph(ALGraph *G,int flag){     int i,j,p,q;     edgeNode *s;     printf("请输入顶点数和边数：");     scanf("%d %d",&G->vertNum,&G->edgeNum);     for(i=0;i<G->vertNum;i++){  //初始化顶点表         getchar();         printf("请输入第%d个顶点信息：",i+1);         G->verts[i].vertinfo=getchar();         G->verts[i].firstedge=NULL;     }     for(j=0;j<G->edgeNum;j++){  //初始化边表         printf("请输入相连接的顶点信息：");  //0 1         scanf("%d%d",&p,&q);         s=(edgeNode*)malloc(sizeof(edgeNode));         s->adjvert=q;         s->next = G->verts[p].firstedge;         G->verts[p].firstedge=s;         if(flag==0){//若为无向图则1 0 添加             s=(edgeNode *)malloc(sizeof(edgeNode));             s->adjvert=p;             s->next=G->verts[q].firstedge;             G->verts[q].firstedge=s;         }     } } void printGraph(ALGraph *G){     int i;     for(i=0;i<G->vertNum;i++){         printf("%d %c   ",i,G->verts[i].vertinfo);         while(1){             if(G->verts[i].firstedge==NULL){                 printf("∧");                 break;             }             printf("%d->",G->verts[i].firstedge->adjvert);             G->verts[i].firstedge=G->verts[i].firstedge->next;         }         printf("\n");     } } //void main(){ int main() {     int flag;     ALGraph *G;     printf("该图是否为有向图？ 是1/否0\n");     scanf("%d",&flag);     G=(ALGraph *)malloc(sizeof(ALGraph));     creatGraph(G,flag);     printGraph(G);     printGraph(G); }#include<stdio.h> #include<stdlib.h>  #define maxVertNum 100  typedef struct node{     int adjvert;     struct node *next; }edgeNode;//边结构体  typedef struct{     char vertinfo;     edgeNode *firstedge; }vertNode;//顶点结构体  typedef struct{     vertNode verts[maxVertNum];     int vertNum,edgeNum;  //顶点数和边数 }ALGraph; //图结构体  void creatGraph(ALGraph *G,int flag){     int i,j,p,q;     edgeNode *s;     printf("请输入顶点数和边数：");     scanf("%d %d",&G->vertNum,&G->edgeNum);     for(i=0;i<G->vertNum;i++){  //初始化顶点表         getchar();         printf("请输入第%d个顶点信息：",i+1);         G->verts[i].vertinfo=getchar();         G->verts[i].firstedge=NULL;     }     for(j=0;j<G->edgeNum;j++){  //初始化边表         printf("请输入相连接的顶点信息：");  //0 1         scanf("%d%d",&p,&q);         s=(edgeNode*)malloc(sizeof(edgeNode));         s->adjvert=q;         s->next = G->verts[p].firstedge;         G->verts[p].firstedge=s;         if(flag==0){//若为无向图则1 0 添加             s=(edgeNode *)malloc(sizeof(edgeNode));             s->adjvert=p;             s->next=G->verts[q].firstedge;             G->verts[q].firstedge=s;         }     } } void printGraph(ALGraph *G){     int i;     for(i=0;i<G->vertNum;i++){         printf("%d %c   ",i,G->verts[i].vertinfo);         while(1){             if(G->verts[i].firstedge==NULL){                 printf("∧");                 break;             }             printf("%d->",G->verts[i].firstedge->adjvert);             G->verts[i].firstedge=G->verts[i].firstedge->next;         }         printf("\n");     } } //void main(){ int main() {     int flag;     ALGraph *G;     printf("该图是否为有向图？ 是1/否0\n");     scanf("%d",&flag);     G=(ALGraph *)malloc(sizeof(ALGraph));     creatGraph(G,flag);     printGraph(G);     printGraph(G); } 供参考～

malloc返回的是地址值，即申请的空间的首地址，而free的参数就是这个地址值，所以只要给对了地址值，在任何地方都是可以释放的。 很明显p是释放了两次。

是reset里面free了一次，外面又free了一次

我知道了 我想实现的操作是改变P的值  但是在函数reset()做的工作实际上只是改变了形参p的值


Question: vs2010  C语言键盘录入

因为要回车，回车符也是一个字符

printf("请输入性别m/f:"); scanf("%c",&gender); scanf("%c",&gender); 这里为啥要输入两遍呢

有两个地方有错，第一个地方可以这样改 	scanf("%15lf",&sal); 第二个地方printf的地方错了，gender=%s要改成gender=%c


Question: 关于写文件的问题

我好像知道了，a参数我之前以为是打开文件后写入的位置是文件的最后，但是这个位置是固定的；实际上这个位置是会变的，如果打开文件后，有其他程序向该文件加入了内容，那么当写入时，会自动写入到其他程序添加的内容后面，这个好像是a参数自动实现的，这个之前真的没注意过

引用 1 楼 宾灬 的回复:这个你得去了解写入文件时的内部实现原理了，也许在实现上保证了原子性。 关键是这是打开写入两步操作，就算写入是原子的，那打开的时候是各自打开各自的，线程打开文件的位置应该是相同的啊，难道是参数a会在其他线程写入数据时自动后移？？？

引用 2 楼 自信男孩 的回复:你把文件打开和关闭放到父线程里试试，其他线程只操作写操作，我想这样就会复现你说的会有覆盖问题吧 这样应该更不会啊，这样的话缓冲区只有一个，每个线程都是往后面加入数据，所以不会出现覆盖。也许是因为用的a参数的原因

这个你得去了解写入文件时的内部实现原理了，也许在实现上保证了原子性。


Question: 函数递归调用的参数问题

引用 9 楼 真相重于对错的回复:计算机学科，往好里说是一个比较严谨的学科，不好里说它比较死性，差一点都不成。你多一个分号，一个字母，一个括号，它都会认为你是错误的。 所以，不能体会这样的细微差别的人，我的意见是，最好不要入行。你不太适合这个行业。 受教了，感谢批评

引用 7 楼 真相重于对错 的回复:如果还不明白？ 那拿个具体的数来说： 比如： deep=1; Weight_BN(t->lchild,deep+1); Weight_BN(t->rchild,deep+1); 相当于 Weight_BN(t->lchild,2); Weight_BN(t->rchild,2); ============================ Weight_BN(t->lchild,++deep); Weight_BN(t->rchild,++deep); 相当于 Weight_BN(t->lchild,2); Weight_BN(t->rchild,3); 有一点懂了，那如果下层再嵌套调用，会不会是这样 Weight_BN(t->lchild,++deep); Weight_BN(t->rchild,++deep); Weight_BN(t->lchild,2); { Weight_BN(t->lchild,4); Weight_BN(t->rchild,5) } Weight_BN(t->rchild,3) { Weight_BN(t->lchild,6); Weight_BN(t->rchild,7) }会这样吗

因为只有一个ma。

引用 1 楼 user-2 的回复:看起来这儿苏湖是没有问题，你可以在函数入口输出一下deep的值看看，看两种情况下有什么差别 引用 3 楼 真相重于对错 的回复:Weight_BN(t->lchild,deep+1);//这里如果是++deep Weight_BN(t->rchild,deep+1);//这里的deep就是会是上一个函数参数加一，也就是没有遍历同一层的数据，因此出错。 像这个++k,就没事，可是到了树里面就不行了

引用 3 楼 真相重于对错 的回复:Weight_BN(t->lchild,deep+1);//这里如果是++deep Weight_BN(t->rchild,deep+1);//这里的deep就是会是上一个函数参数加一，也就是没有遍历同一层的数据，因此出错。 可是，++deep的话并没用到指针，递归不是系统内部堆栈吗，如果没通过指针的话，++deep从下一层返回的话，deep的值不应该会回来吗。遍历同一层的话，比如第一层是A,deep是1，然后递归调用到下一层的B，deep自增1,deep是2，再假设B的下一层是C,++deep不应该到了3吗。然后分别对应CC[deep]的值应该也变化啊，如果在递归回去，deep不是指针的话，B对应的deep不应该还是2吗，可是我测试了一下好像不是。诶，我感觉我知识好匮乏。


Question: 为什么我这二叉树的创建函数形参传参用指针会始终为空树，用引用就可以？

引用 12 楼 @大愚@ 的回复:地址的地址???感觉有点问题？？？ 是我表述有问题

地址的地址???感觉有点问题？？？

引用 10 楼 @大愚@ 的回复:因为指针是指向变量的地址，操作指针只能改变地址，而不是变量本身。我也是才学这个数据结构，我感觉数据结构里的能用引用尽量不要用指针我想懂了，这里是改变的地址，相当于这个地址就是一个变量的值，所以要传递地址的地址过去

地址相当于银行卡，它指向的内存相当于银行账户。传递给函数相当于你把这个银行卡的副卡给了你家人，你家人往副卡里面存钱，钱会到达你的账户。但是副卡是副卡，主卡是主卡。你家人修改副卡的账号是不管用的。  其实就是实参与形参是两个东西，但是指向了同一个内存地址。通过指向才做到参数的双向传递。

引用 7 楼 @大愚@ 的回复:引用就是变量的别名，操作这个别名就是操作这个变量就是这个树，而指针不能直接访问这个树为什么指针不能直接访问？我之前写链表都是用指针没有用过引用，如果是纯C，没有引用该怎么办

引用 3 楼 九华山小和尚 的回复:引用 2 楼 qq_24683975 的回复:[quote=引用 1 楼 九华山小和尚 的回复:] 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。[/quote]我用的指针是tree*

引用 4 楼 九华山小和尚 的回复:引用 3 楼 九华山小和尚 的回复:[quote=引用 2 楼 qq_24683975 的回复:] [quote=引用 1 楼 九华山小和尚 的回复:] 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。[/quote] 不过你这个创建树的写法我还没试过，我也在复习树，我创建普通的二叉树的话都是用字符串创建的。你这个用来创建整形树挺好的。[/quote]我这个字符型也是可以的，我只是懒得写所以先用整型试试

引用 3 楼 九华山小和尚 的回复:引用 2 楼 qq_24683975 的回复:[quote=引用 1 楼 九华山小和尚 的回复:] 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。[/quote] 不过你这个创建树的写法我还没试过，我也在复习树，我创建普通的二叉树的话都是用字符串创建的。你这个用来创建整形树挺好的。

引用 2 楼 qq_24683975 的回复:引用 1 楼 九华山小和尚 的回复:我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。

我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗


Question: 结构体指针转为数组的问题

引用 5 楼 自信男孩 的回复：&master[1]等价(master + 1); 如果master是一个数组，那么&master[i]就是下表为1的地址。  但是前提是master需要申请空间，否则这样操作可能会出现段错误。因为master还是一个野指针。正解

引用 3 楼 真相重于对错 的回复:[quote=引用 2 楼 宾灬 的回复:] 所有的数据在内存中都是字节序列。 master和&master[0]是一样的。 &master[1] 表示从master开始的第二个字节的地址 不对哦，master[1]相当于master+1,因为master是spi_master类型，所以每次+1，相当于指针从master向后移动sizeof(spi_master)个字节[/quote] 是的。

引用 2 楼 宾灬 的回复:所有的数据在内存中都是字节序列。 master和&master[0]是一样的。 &master[1] 表示从master开始的第二个字节的地址 不对哦，master[1]相当于master+1,因为master是spi_master类型，所以每次+1，相当于指针从master向后移动sizeof(spi_master)个字节

取master的下标为1的地址，我是这么理解的


Question: C语言拷贝二维数组的第二行结果拷贝到的结果是第一行的一部分

无代码无真相，这样提问谁也没法回答

无代码，无真相。。。


Question: C语言求值顺序

无序

建议先弄明白：a = x + y + z;的执行顺序就可以知道函数的调用顺序了。

按优先级运算的吧

1、2、3吧

确实。无序。 参考：https://blog.csdn.net/weixin_38239856/article/details/70040757


Question: 请教各位高手，这里的循环为什么会出现这种现象

你的循环体里会对a, b做修改吗？可以提供更多的关于a, b的操作

引用 1 楼 user-4的回复:strlen返回无符号类型  如果字符串a长度小于字符串b的长度 因为是无符号类型 所以会变成一个非常大的正数 所以会循环很多次 你说的太对了！谢谢！

int m=strlen(a) - strlen(b)+1; for (i = 0; i < m; i++){……} 要是改成这样呢？

哥们，你程序不完整，都看不到字符串a和字符串b的实际是什么样的。。。请发完整一点


Question: 什么时候会用到NULL？求求大佬回答下

文件打开失败会返回NULL，那么什么时候会失败呢，要根据打开格式分别来区分。比如"r"打开，那么当文件不存在时（路径不对）会失败。 "w"格式打开时，如果文件是只读的，那么打开会失败。但是如果文件不存在会被创建，但不会返回NULL。

非常感谢大佬们

你看fopen的使用说明啊，文件打开失败会返回NULL，打开失败的原因挺多的，比如文件不存在啦（如果你的打开方式支持文件不存在则创建该文件则不会返回NULL），系统不允许你打开该文件啦，等等

比如 w打开 没找到这个文件需要创建 但是你没有创建文件的权限 那就会返回NULL 比如 w打开 找到文件 需要清空文件内容 但是你没有修改文件的权限或者文件只读 就会返回NULL


Question: 能帮忙看一下错在哪吗

引用 11 楼 棉猴的回复:#include<stdio.h>  int main() { 	int m, i, max, min; 	float sum, aver; 	int a[100] = { 0 }; 	printf("请输入m个数:\n"); 	scanf("%d", &m); 	scanf("%d", &a[0]);//-----------a[0]改为&a[0] 	sum = max = min = a[0]; 	for (i = 1; i < m; i++) 	{ 		scanf("%d", &a[i]);//----------a[i]改为&a[i] 		sum = sum + a[i]; 		if (a[i] > max) 		{ 			max = a[i]; 		} 		if (a[i] < min) 		{ 			min = a[i]; 		} 	}  	aver = sum / m; 	printf("max=%d min=%d average=%.2f", max, min, aver);      return 0; } VS2015 C++环境  谢谢 ！！！

引用 1 楼 @大愚@的回复:你的再录入a[0]时是不是少一个取地址符& 抱歉 后面的scanf没加& 刚刚才分清了

对 结果一样 是那个意思 先输入一个值 给Max min sum 再。。。

引用 6 楼 user-3的回复:建议把代码粘贴出来，不然有大佬愿意看或指点要重新自己敲一遍？？ #include<stdio.h> int main() {  int m,i,max,min;  float sum,aver;  int a[100];   printf("请输入m个数：\n");  scanf("%d",&m) ;//输入m的值   scanf("%d",a[0]);//输入a[0];   sum=max=min=a[0];  for(i=1;i<m;i++)     {  scanf("%d",a[i]);        sum=sum+a[i];        if (a[i]>max) max=a[i];        if (a[i]<min) min=a[i];     }  aver=sum/m;   printf("max=%d min=%d average=%.2f",max,min,aver); return 0; }

引用 6 楼 user-3的回复:建议把代码粘贴出来，不然有大佬愿意看或指点要重新自己敲一遍？？ 括号对的 先输一个 分别赋值给Max min sum 再输入其他的 谢谢建议 代码附上

看你的代码好像是录入一个数就下标为0的数组元素

建议把代码粘贴出来，不然有大佬愿意看或指点要重新自己敲一遍？？

scanf("%d",&a[0]); 这句是想一次把所有数据都输入吗？可只能接收到一个啊

结果还和图一样？？？

大括号没匹配上吧

引用 1 楼 @大愚@的回复:你的再录入a[0]时是不是少一个取地址符& 好像还是不可以

你的再录入a[0]时是不是少一个取地址符&


Question: 编写函数求二维数组中的所有奇数之和与所有偶数之和

用余数算法%来每个判断下，奇数相加，偶数相加就可以了嘛

学了别的发现指针都不会用了。。。。

给我写，我会在if里面写“(a[i][j]&1)”。写驱动写习惯了

给我写，我会在if里面写“(a[i][j]&1)”。写驱动写习惯了。

引用 12 楼 自信男孩的回复:[quote=引用 10 楼 风吟xqy 的回复:] [quote=引用 8 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h>  #define N 5 #define M 6 void fun(int (*a)[6],int n,int m,int *odd,int *even);//函数声明。其中odd返回奇数的和，even返回偶数。  int main() {     int a[N][M]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},{25,26,27,28,29,30}};     int (*p)[M] = a;     //int qishu,oushu;     int qishu = 0, oushu = 0;   //odd even     //fun(p,5,6,&qishu,&oushu);     fun(p, N, M, &qishu, &oushu);     printf("qishu_sum=:%d\noushu_sum=:%d",qishu,oushu); /*     int odd, even;      odd = even = 0;      fun(p, N, M, &odd, &even);     printf("odd = %d\t, even = %d\n", odd, even);  */     return 0; } void fun(int (*a)[6],int n,int m,int *odd, int *even) {     *odd=0;     *even=0;     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             //if (*(*(a + i) + j)%2==0)             if (a[i][j]%2==0)             {                 *odd = *odd + a[i][j];             }             else if (a[i][j] % 2 == 1)             {                 *even = *even + a[i][j];             }         }     }     //return *odd,*even;  } 供参考～  odd， even作为指针，那么就会把结果带出函数，不需要返回。 根据题意，函数参数里面要是a[][]喔[/quote] 别喔了，a[][]和int (*a)[M]是等价的。 基本的C语言建议多学多练～[/quote] 这里还是知道的

引用 21 楼 w4505021990的回复:louzhu牛逼哟 xiongdi牛逼噢

引用 20 楼 weixin_42878936的回复:厉害欧，有点东西 哪有，我是萌新

louzhu牛逼哟

厉害欧，有点东西

引用 10 楼 风吟xqy 的回复:[quote=引用 8 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h>  #define N 5 #define M 6 void fun(int (*a)[6],int n,int m,int *odd,int *even);//函数声明。其中odd返回奇数的和，even返回偶数。  int main() {     int a[N][M]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},{25,26,27,28,29,30}};     int (*p)[M] = a;     //int qishu,oushu;     int qishu = 0, oushu = 0;   //odd even     //fun(p,5,6,&qishu,&oushu);     fun(p, N, M, &qishu, &oushu);     printf("qishu_sum=:%d\noushu_sum=:%d",qishu,oushu); /*     int odd, even;      odd = even = 0;      fun(p, N, M, &odd, &even);     printf("odd = %d\t, even = %d\n", odd, even);  */     return 0; } void fun(int (*a)[6],int n,int m,int *odd, int *even) {     *odd=0;     *even=0;     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             //if (*(*(a + i) + j)%2==0)             if (a[i][j]%2==0)             {                 *odd = *odd + a[i][j];             }             else if (a[i][j] % 2 == 1)             {                 *even = *even + a[i][j];             }         }     }     //return *odd,*even;  } 供参考～  odd， even作为指针，那么就会把结果带出函数，不需要返回。 根据题意，函数参数里面要是a[][]喔[/quote] 别喔了，a[][]和int (*a)[M]是等价的。 基本的C语言建议多学多练～

17楼　一个字输入错误：循环次搂　更正为：循环次数  p 的初值（数组元素首址），可以把int a[][]用强制类型转换赋值给 p吧？

难道不可以在void fun() 定义一个变量 int *p ， 　把“首个元素”的地址赋值给它； 然后for循环用 p遍历取出所有元素的值来处理？ （循环次搂 以m和n的值可计算出来）

来混个十几分，感谢楼主

引用 14 楼 自信男孩的回复:[quote=引用 13 楼 风吟xqy 的回复:] [quote=引用 12 楼 自信男孩的回复:][quote=引用 10 楼 风吟xqy 的回复:] [quote=引用 8 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h>  #define N 5 #define M 6 void fun(int (*a)[6],int n,int m,int *odd,int *even);//函数声明。其中odd返回奇数的和，even返回偶数。  int main() {     int a[N][M]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},{25,26,27,28,29,30}};     int (*p)[M] = a;     //int qishu,oushu;     int qishu = 0, oushu = 0;   //odd even     //fun(p,5,6,&qishu,&oushu);     fun(p, N, M, &qishu, &oushu);     printf("qishu_sum=:%d\noushu_sum=:%d",qishu,oushu); /*     int odd, even;      odd = even = 0;      fun(p, N, M, &odd, &even);     printf("odd = %d\t, even = %d\n", odd, even);  */     return 0; } void fun(int (*a)[6],int n,int m,int *odd, int *even) {     *odd=0;     *even=0;     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             //if (*(*(a + i) + j)%2==0)             if (a[i][j]%2==0)             {                 *odd = *odd + a[i][j];             }             else if (a[i][j] % 2 == 1)             {                 *even = *even + a[i][j];             }         }     }     //return *odd,*even;  } 供参考～  odd， even作为指针，那么就会把结果带出函数，不需要返回。 根据题意，函数参数里面要是a[][]喔[/quote] 别喔了，a[][]和int (*a)[M]是等价的。 基本的C语言建议多学多练～[/quote] 这里还是知道的[/quote] 哦[/quote] 哈哈，谢谢大佬

引用 13 楼 风吟xqy 的回复:[quote=引用 12 楼 自信男孩的回复:][quote=引用 10 楼 风吟xqy 的回复:] [quote=引用 8 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h>  #define N 5 #define M 6 void fun(int (*a)[6],int n,int m,int *odd,int *even);//函数声明。其中odd返回奇数的和，even返回偶数。  int main() {     int a[N][M]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},{25,26,27,28,29,30}};     int (*p)[M] = a;     //int qishu,oushu;     int qishu = 0, oushu = 0;   //odd even     //fun(p,5,6,&qishu,&oushu);     fun(p, N, M, &qishu, &oushu);     printf("qishu_sum=:%d\noushu_sum=:%d",qishu,oushu); /*     int odd, even;      odd = even = 0;      fun(p, N, M, &odd, &even);     printf("odd = %d\t, even = %d\n", odd, even);  */     return 0; } void fun(int (*a)[6],int n,int m,int *odd, int *even) {     *odd=0;     *even=0;     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             //if (*(*(a + i) + j)%2==0)             if (a[i][j]%2==0)             {                 *odd = *odd + a[i][j];             }             else if (a[i][j] % 2 == 1)             {                 *even = *even + a[i][j];             }         }     }     //return *odd,*even;  } 供参考～  odd， even作为指针，那么就会把结果带出函数，不需要返回。 根据题意，函数参数里面要是a[][]喔[/quote] 别喔了，a[][]和int (*a)[M]是等价的。 基本的C语言建议多学多练～[/quote] 这里还是知道的[/quote] 哦

int main() { 	int a[N][M] = { { 1,2,3,4,5,6 },{ 7,8,9,10,11,12 },{ 13,14,15,16,17,18 },{ 19,20,21,22,23,24 },{ 25,26,27,28,29,30 } }; 	int qishu, oushu; 	fun(a, N,M,&qishu,&oushu); 	return 0; } void fun(int a[][M], int n, int m, int *odd, int *even) { 	 	int result[2] = { 0 }; 	for (int i = 0; i < n; i++) 	{ 		for (int j = 0; j < m; j++) 		{ 			result[a[i][j] & 0x1] += a[i][j];  		}  	} 	*odd = result[1]; 	*even = result[0];  }

引用 8 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h>  #define N 5 #define M 6 void fun(int (*a)[6],int n,int m,int *odd,int *even);//函数声明。其中odd返回奇数的和，even返回偶数。  int main() {     int a[N][M]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},{25,26,27,28,29,30}};     int (*p)[M] = a;     //int qishu,oushu;     int qishu = 0, oushu = 0;   //odd even     //fun(p,5,6,&qishu,&oushu);     fun(p, N, M, &qishu, &oushu);     printf("qishu_sum=:%d\noushu_sum=:%d",qishu,oushu); /*     int odd, even;      odd = even = 0;      fun(p, N, M, &odd, &even);     printf("odd = %d\t, even = %d\n", odd, even);  */     return 0; } void fun(int (*a)[6],int n,int m,int *odd, int *even) {     *odd=0;     *even=0;     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             //if (*(*(a + i) + j)%2==0)             if (a[i][j]%2==0)             {                 *odd = *odd + a[i][j];             }             else if (a[i][j] % 2 == 1)             {                 *even = *even + a[i][j];             }         }     }     //return *odd,*even;  } 供参考～  odd， even作为指针，那么就会把结果带出函数，不需要返回。 根据题意，函数参数里面要是a[][]喔

根据题意，函数参数里面要是a[][]喔


Question: 求助【泪目】

// 题目要根据系统是大段 还是小端存储  还要根据系统int是几个字节 通常是4个字节但是也有8个或更多的的情况 	// 这道题考察的是对数据类型在内存中的存储 有一定了解 可以看看深入理解计算机系统这本书 	// 以4字节为例 每个字节代表8位 所以就是32位         int m = 1000; 	printf("0x%02x\n", (m & 0x000000ff) >> 0); 	printf("0x%02x\n", (m & 0x0000ff00) >> 8); 	printf("0x%02x\n", (m & 0x00ff0000) >> 16); 	printf("0x%02x\n", (m & 0xff000000) >> 32);  	// 	3、7、13、17、23、27 	for (int i = 0; i < 32; i++) { 		int bit_mask = 1 << i; 		if (m & bit_mask) { 			printf("bit:%d->%d\n", i, 1); 		} 		else { 			printf("bit:%d->%d\n", i, 0); 		} 	}

int a = 0x12345678;  unsigned char* b = &a;  printf("%d,%d,%d,%d\n",*b,*(b+1),*(b+2),*(b+3));  printf("%d",(a>>X)&1);//X代表第几位

你可以设置一个数组来存放这些bit，开始的时候先把数组初始化都赋值0，再用该数组存放这个数的二进制，再把数组进行转置。然后通过下标就可以访问这个数组中的元素了.

应该是位移加掩码来做。


Question: 利用raw socket从一个端口抓包，然后发到另一个端口，包太大，发不过去怎么办？

假设抓的包有2000个字节，该如何拆成2个包，需要计算checksum以及分片信息吗？另外Jumbo Frame该怎么用？谢谢！

raw socket从一个端口抓包有多大你得说一下，要么分开发，要么用Jumbo Frame（巨型帧）

怎样对一个完整的大包进行拆解，拆开的数据是不是还有计算checksum，以及分片ID等等

拆开，分多次发送。每次发送固定大小。 接收端多次接收，然后组成一个完整的包。


Question: 练习题，有几处地方看不懂

引用 6 楼 棉猴的回复: 这个更加看不懂了

int main() { 	int i, j, m, n, x; 	for (i = 1; i < 168 / 2 + 1; i++) //枚举i的值，从1到168/2 	{ 		if (168 % i == 0) //保证i×j=168 		{ 			j = 168 / i;//保证i×j=168 			if (i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)//保证(i+j)/2和(x-j)/2正好是整数，没有余数 			{ 				m = (i + j) / 2; 				n = (i - j) / 2; 				x = n * n - 100; 				printf("%d + 100 = %d * %d\n", x, n, n); 				printf("%d + 268 = %d * %d\n", x, m, m);//这个表达式看懂了，if花括号为啥回在这呢 			} 		} 	}

楼主的想法很难想  X+100=N*N  X+100+168=M*M（M,N均为整数，且M>N)  两式相减：  168=（M+N）*（M-N）  i,j替换了m+n和m-n  所以就变成了找168的因子

int square[70] = { 0 }; 	for (int i = 0; i < 70; i++) { 		square[i] = (i + 1) * (i + 1); 	} 	int find = 0; 	for (int i = 0; i < 70; i++) { 		if (square[i] - 168 > 0) { 			int t = square[i] - 168; 			for (int j = 0; j < 70; j++) { 				if (t == square[j]) { 					int t = square[j] - 100; 					if (t < 0) { 						break; 					} 					printf("%d\n", t); 				} 			} 		} 	} 	return 0;    没看懂你代码的脑回路  你学代码的时候 找答案不能找写的菜的学习  要学写代码至少要找个靠谱的学啊  至少看着if else不能那么乱的人学  你的代码可能就是判断一个数是不是平方数  然后加上奇奇怪怪的逻辑   给你写个我写的穷举解法 建议用csdn你发代码至少加上网页标签  有的时候提问比你自身问的问题更重要   可以去leetcode网站学写代码 通常完成里面所有的习题  当你都弄明白时  你已经身前身后无人了  至少在中国的码农级别里是 专家级的

自顶


Question: 一个double 类型的函数，给他一个int类型的值作为返回值，会出现什么问题鸭？？

我把add类型改成 int 后，return 的时候函数自动将其转换成了double 类型，而 小 转换成 大的是不会溢出的； 但是算阶乘的时候，由于 int 的范围比 double的小，所以当数据很大的时候就会产生溢出，这时候就会出错。  我还特意将 add 的类型定义为 long long 试了一下（完全正确！！）：   现在来看这个题目：为什么只有测试点1会出错呢？？可能是这个点测试的数据比较大，其他的比较小。（我只能这么理解了）

等价这样：int a; a = 1.1; 相当于把一个浮点数赋值给一个int类型。所以，可以自己试一下int a = 110.323234;看看a输出的结果是多少

int范围不够吧，这个应该012都会出错？3固定=1，应该不会错

就类型转换啊 假如你是return a 返回值标明的是double 那么你可以理解为会有这样一步操作 return (double)(a) 即最后返回一个转换后的double变量


Question: vscode调试成功的同时跳出弹窗“任务出错”

引用 1 楼 风吟xqy 的回复:这好像是更新版本以后的bug，我今天更新之前没有，更新之后和你一样 我也是之前没有，今天突然就有了

这好像是更新版本以后的bug，我今天更新之前没有，更新之后和你一样


Question: 小学生问题，困扰好几天，有大佬给下解释吗

引用 4 楼 真相重于对错的回复:好好想想， 1%3  列个式子 感谢，我弄明白了

引用 3 楼 user-2的回复:我打错了，尴尬...不过思路是没有错的 1除以3，等于0余1，取余数，所以a等于1 哦，我可能一下子没反应过来，谢谢

好好想想， 1%3  列个式子

引用 1 楼 user-2的回复:楼主你搞错了。  除法运算符：/      C语言用符号/表示除法。例如13/5得2。余数舍去。 求模运算符：%    用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数。例如，13%5得3。简单来说这个运算符是用来取余数的。  为了让楼主更好地理解，我简单写一下代码如下： #include <stdio.h>  int main() {     int a,b;     a = 1%3;    //1除以3，等于0余3，取余数，所以a等于3     b = 1/3;     //1除以3，等于0余3，取商，所以b等于0     printf("a=%d, b=%d\n", a,b);      return 0; } 编译后结果：a=1, b=0  还有不懂的请继续提问 那不该=3吗，你这个不对


Question: 位置指示器指的是文件指针吗？

引用 1 楼 Simple-Soft 的回复：指的是指向文件的当前位置的标志，就是表示从什么地方开始写文件或者读文件，这个指示器还可以可以自己指定这个指示器是指针吗？

文件指针是FILE*类型的 它表示指向了一个FILE结构 这个结构里记录了你当前读写的文件的一些信息 比如你读写的哪个文件？以怎样的方式读写的？读写到哪里了之类的 当你用fputc写入了一个字符后 这个FILE结构里的记录肯定要改变对吧 其实，记录你写入的位置要后移1字节对吧，这样你下次写的时候就不会写在上次写的地方了，而是在上次写的那个字节刚好后面的一个字节 指针没有改变，它依然指向那个FILE结构，这个FILE结构在内存中的位置也没变过，只是这个结构里的一点数据发生了改变

好抽象啊...

指示器就是一个标识，标识的值表示处于文件的什么位置（相对于第一个字节的偏移量）打开文件时这个值由内核在维护。读写这个文件都是从这个标识位置开始的。读了或写了多少字节，这个标识的值就增加多少。


Question: c语言请教大佬

if(*p == c) 改成 （*（p+i) == c)才合适吧。

删除不是这种删除方式，你要是给他赋值'\0'了，就表示字符串结尾了，当然输不出东西了。


Question: eof用于文件结束和文件错误时的函数返回值，计算机本质上是如何靠eof判断是文件结束还是错误呢

操作系统打开一个文件，会创建一个文件句柄，该文件句柄指向了一块内存描述该文件，其中包含了文件当前位置和文件的大小，feof只是判断文件位置是否表示已经在文件末尾了，然后返回结果。

自顶

有大佬帮忙解答一下吗？


Question: 发帖真的有人回吗？

%c就是用来输出字符的

引用 6 楼 自信男孩 的回复:[quote=引用 4 楼 weixin_47633905 的回复:] [quote=引用 2 楼 自信男孩 的回复:] 为什么不自己试试呢？编程还是要多实践的 试了只知道结果，不知道为啥[/quote] 通过结果不会倒推吗？为什么会输出这个结果，可以加一些debug信息出来，比如16进制格式的怎么表示的，二进制是什么，等等[/quote]  谢谢，现在会玩了

引用 5 楼 user-3 的回复:[quote=引用 3 楼 weixin_47633905 的回复：][quote=引用 1 楼 user-3 的回复:] 编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。 超级感谢你，如果将程序第4/5行改为：        c1=197;         c2=198;      运行结果输出的信息是不是和“上溢出”（这个词只是听过）有关？这样197-128=69对应E，198-128=70对应F[/quote]溢出这个概念楼主最好先别去深究，这涉及到二进制运算，要了解清楚必须学好计算机组成原理中的原码，补码，反码等相关知识，如果要在这里讲的话就要打太多字了，您现在有个印象就好，实在想知道就去补充一下计算机组成原理的相关知识。[/quote] 谢谢你，现在懂了

为什么不自己试试呢？编程还是要多实践的

引用 4 楼 weixin_47633905 的回复:[quote=引用 2 楼 自信男孩 的回复:] 为什么不自己试试呢？编程还是要多实践的 试了只知道结果，不知道为啥[/quote] 通过结果不会倒推吗？为什么会输出这个结果，可以加一些debug信息出来，比如16进制格式的怎么表示的，二进制是什么，等等

引用 3 楼 weixin_47633905 的回复：[quote=引用 1 楼 user-3 的回复:] 编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。 超级感谢你，如果将程序第4/5行改为：        c1=197;         c2=198;      运行结果输出的信息是不是和“上溢出”（这个词只是听过）有关？这样197-128=69对应E，198-128=70对应F[/quote]溢出这个概念楼主最好先别去深究，这涉及到二进制运算，要了解清楚必须学好计算机组成原理中的原码，补码，反码等相关知识，如果要在这里讲的话就要打太多字了，您现在有个印象就好，实在想知道就去补充一下计算机组成原理的相关知识。

引用 2 楼 自信男孩 的回复:为什么不自己试试呢？编程还是要多实践的 试了只知道结果，不知道为啥

引用 1 楼 user-3 的回复:编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。 超级感谢你，如果将程序第4/5行改为：        c1=197;         c2=198;      运行结果输出的信息是不是和“上溢出”（这个词只是听过）有关？这样197-128=69对应E，198-128=70对应F


Question: raw socket 用sendto函数发包，包大于MTU就返回sendto: Message too long，发送失败

我利用raw socket从一个端口抓包，然后将抓到的包发送另外一个端口，结果从一个端口上抓的包太大，调用sendto发不到另外一个端口。

自己分包发送，定义自己的包头

sendto不是发udp的函数吗？少放点数据多发几次，然后在终端按照序号重组不就可以了。不需要太复杂吧。

自己组包很复杂吧！要计算分片ID，还要算checksum？


Question: 请教大神c语言，希望能给编辑一下

忘记“拉格朗日插值多项式”了


Question: c语言的弹出提醒。

首先要#include "windows.h" 然后 MessageBox( NULL, "提示的内容", "标题", 0 ); 或 MessageBox( GetConsoleWindow(), "提示的内容", "标题", 0 ); 第4个参数表示设定按钮类型，自己去查查吧

参考这个改下 https://blog.csdn.net/lazyyjq2/article/details/52768414

引用 1 楼 usecf的回复:AfxMessageBox("你现在的护理工作为如下:"+top->number+":"+top->content); 跟在这个后面试试 有错误，他说，cannot add two poiters

控制台程序吧？AfxMessageBox()是MFC的函数，在控制台程序里面要添加对MFC的支持。


Question: c语言请教大佬

引用 5 楼 qq_47279096 的回复:[quote=引用 2 楼 qq_1457346882的回复:]你定义的参数是数组地址，传入的是值 int *max(int a[],int n) int a[]要传ａ（首地址） big=max(b[0],n); small=min(b[0],n); *ｐ=ａ,就是ｐ取ａ的首地址了，没必要＆ａ[０]；多了反而容易弄错 如果是取a[1]的地址就是&a[1]吗[/quote] 如果取a[1]看你是初始化还是怎么样，如果是初始化的话&a[1]可以，如果不是，是程序中ｐ取ａ地址后想要通过ｐ找a[1]地址，直接ｐ＋１就行了，a[１]可以看成*(a+1),数组操作的本质也是指针的移动。p=&a[0]=>p=&*(a+0)取值*取址&抵消，p=a+0;=>p=a;p+1=a+1;a+1可以表示成＆*(a+1)=>&a[1];指针很灵活的，也很容易错，要好好理解一下

引用 2 楼 qq_1457346882的回复:你定义的参数是数组地址，传入的是值 int *max(int a[],int n) int a[]要传ａ（首地址） big=max(b[0],n); small=min(b[0],n); *ｐ=ａ,就是ｐ取ａ的首地址了，没必要＆ａ[０]；多了反而容易弄错 如果是取a[1]的地址就是&a[1]吗

//int *max(int a[],int n) int max(int a[],int n) {     int *p=&a[0],i;     for(i=0;i<n;i++)     {         if(*p<a[i])             p=&a[i];     }     return *p; }  //int *min(int a[],int n) int min(int a[],int n) {     int *p=&a[0],i;     for(i=0;i<n;i++)     {         if(*p>a[i])             p=&a[i];     }     return *p; } int ave(int a[],int n) {     int i,sum=0;     for(i=0;i<n;i++)     {         sum+=a[i];     }     return sum/n; } //#include <stdio.h> int main() {     int b[10]={1,2,3,4,5,6,7,8,9,10},n=10,big,small,pingjun;     //big=max(b[0],n);     big=max(b, n);     //small=min(b[0],n);     small=min(b, n);     //pingjun=ave(b[0],n);     pingjun=ave(b,n);     printf("%d %d %d\n",big,small,pingjun);     return 0; } 供参考～  big = max(&b[0], n); 也可以这样的。

还有你这个返回值也有问题 int *min(int a[],int n)你定义的返回值类型是指针，但你ｒｅｔｕｒｎ的是值，建议把指针好好看看，不同地方的*有不一样的含义

你只说有问题，没说具体什么现象？编译问题还是运行问题？


Question: C语言循环遇到了一些问题

int  create_cjlist(Select sclist[],int sccount,Course clist[],int ccount,Student slist[],int scount,Score cjlist[],int *cjcount) { 	int a[99]={0}; 	int i,j,k,z=0,b=0; 	float zxf=0.0,zcj=0.0; 	for(i=0;i<scount;i++)//依次循环知道把slist里面的数据输出完 	{ 		for(j=0;j<sccount;j++)//sclist 		{ 			for(k=0;k<ccount;k++)//clist 			{ 				if(strcmp(sclist[j].xh,slist[i].xh)==0) 				{ 					if(strcmp(sclist[j].kh,clist[k].kh)==0) 					{ 						strcpy(cjlist[i].xh,slist[i].xh); 						strcpy(cjlist[i].xm,slist[i].xm); 						cjlist[i].cj[z++]=sclist[j].cj; 						b++; 						zxf+=clist[k].xf;  						zcj+=sclist[j].cj; 					} 				}	 			}  		} 		printf("%f  %f  %d\n",zxf,zcj,b); 	    cjlist[i].zxf=zxf; 		cjlist[i].zpj=zcj/cjlist[i].zxf; 		a[i]=b; 		zcj=0;zxf=0;z=0;b=0; 	} 	*cjcount=i; }这些是我的代码


Question: 如图，解释下题目和答案

引用 7 楼 weixin_45906870的回复:选D，C语言规定用0X表示十六进制的前缀  举个例子： #include <stdio.h>  int main() {     int c;     c = 0x80;      //这里的80是十六进制的，因为前面加了0x，x用大写或小写都可以     printf("%d\n", c);    //%d是以十进制的方式输出，十六进制的80转变成十进制就是128      return 0; }  补充一下，如果是用八进制表示一个数字，那就在这个数字前面添加一个零，比如 c = 080，表示八进制的八十 十进制没有前缀 前面三个能不能举个例子

引用 16 楼 weixin_45906870的回复: 奇怪，我的编译器是codeblocks，编译没问题呀.... 你看错了，0x是16进制

引用 13 楼 m0_47292308的回复:[quote=引用 9 楼 weixin_45906870的回复:]对前面三个选项举个例子如下：  #include <stdio.h>  int main() {     double a = 2;     int b;     b = 3L*a;                       //这里在3后面加L表示这个3是Long int类型，L大小写都可以，不加L默认3是int类型     printf("b = %d\n", b);   //虽然前面是用long int和double类型相乘，但并不影响这里的结果。输出b依然是int类型     b = 3F*a;                       //这里在3后面加L表示这个3是float类型，F大小写都可以，不加F默认3是int类型     printf("b = %d\n", b);        b = 3U*a;                      //这里在3后面加L表示这个3是unsigned类型，U大小写都可以，不加U默认3是int类型     printf("b = %d\n", b);      return 0; }  还有不懂的请继续追问 谢谢你了，我终于懂了[/quote] 还想问一下，输出结果是啥，修改之处会有啥不一样，我编译器报错了

再问一下，输出结果是啥，修改之处会有啥不一样

奇怪，我的编译器是codeblocks，编译没问题呀....

引用 14 楼 weixin_45906870 的回复:既然是八进制 怎么可能有8  080是错的可以的，你可以先编译试试，不会出错的[/quote] [Error] E:\*****.c:4:2: invalid digit "8" in octal constant

引用 10 楼 lin5161678 的回复：[quote=引用 7 楼 weixin_45906870 的回复:] 选D，C语言规定用0X表示十六进制的前缀  举个例子： #include <stdio.h>  int main() {     int c;     c = 0x80;      //这里的80是十六进制的，因为前面加了0x，x用大写或小写都可以     printf("%d\n", c);    //%d是以十进制的方式输出，十六进制的80转变成十进制就是128      return 0; }  补充一下，如果是用八进制表示一个数字，那就在这个数字前面添加一个零，比如 c = 080，表示八进制的八十 十进制没有前缀既然是八进制 怎么可能有8  080是错的[/quote]可以的，你可以先编译试试，不会出错的

引用 9 楼 weixin_45906870的回复:对前面三个选项举个例子如下：  #include <stdio.h>  int main() {     double a = 2;     int b;     b = 3L*a;                       //这里在3后面加L表示这个3是Long int类型，L大小写都可以，不加L默认3是int类型     printf("b = %d\n", b);   //虽然前面是用long int和double类型相乘，但并不影响这里的结果。输出b依然是int类型     b = 3F*a;                       //这里在3后面加L表示这个3是float类型，F大小写都可以，不加F默认3是int类型     printf("b = %d\n", b);        b = 3U*a;                      //这里在3后面加L表示这个3是unsigned类型，U大小写都可以，不加U默认3是int类型     printf("b = %d\n", b);      return 0; }  还有不懂的请继续追问 谢谢你了，我终于懂了

引用 11 楼 lin5161678 的回复：[quote=引用 9 楼 weixin_45906870 的回复:] 对前面三个选项举个例子如下：  #include <stdio.h>  int main() {     double a = 2;     int b;     b = 3L*a;                       //这里在3后面加L表示这个3是Long int类型，L大小写都可以，不加L默认3是int类型     printf("b = %d\n", b);   //虽然前面是用long int和double类型相乘，但并不影响这里的结果。输出b依然是int类型     b = 3F*a;                       //这里在3后面加L表示这个3是float类型，F大小写都可以，不加F默认3是int类型     printf("b = %d\n", b);        b = 3U*a;                      //这里在3后面加L表示这个3是unsigned类型，U大小写都可以，不加U默认3是int类型     printf("b = %d\n", b);      return 0; }  还有不懂的请继续追问后缀f 要求是浮点常量  3f是错的 [/quote]感谢

引用 9 楼 weixin_45906870 的回复:对前面三个选项举个例子如下：  #include <stdio.h>  int main() {     double a = 2;     int b;     b = 3L*a;                       //这里在3后面加L表示这个3是Long int类型，L大小写都可以，不加L默认3是int类型     printf("b = %d\n", b);   //虽然前面是用long int和double类型相乘，但并不影响这里的结果。输出b依然是int类型     b = 3F*a;                       //这里在3后面加L表示这个3是float类型，F大小写都可以，不加F默认3是int类型     printf("b = %d\n", b);        b = 3U*a;                      //这里在3后面加L表示这个3是unsigned类型，U大小写都可以，不加U默认3是int类型     printf("b = %d\n", b);      return 0; }  还有不懂的请继续追问后缀f 要求是浮点常量  3f是错的

引用 7 楼 weixin_45906870 的回复:选D，C语言规定用0X表示十六进制的前缀  举个例子： #include <stdio.h>  int main() {     int c;     c = 0x80;      //这里的80是十六进制的，因为前面加了0x，x用大写或小写都可以     printf("%d\n", c);    //%d是以十进制的方式输出，十六进制的80转变成十进制就是128      return 0; }  补充一下，如果是用八进制表示一个数字，那就在这个数字前面添加一个零，比如 c = 080，表示八进制的八十 十进制没有前缀既然是八进制 怎么可能有8  080是错的

引用 3 楼 Simple-Soft的回复:选D，x不能放在后面，可以放到前面，int i=0x123; 请问这样写是表示什么

引用 1 楼 Zhao Tao的回复:答案是X啊 这些字幕加在数字后面表示后缀更容易区分而已，L表示long类型，F是float，U是unsigned 能说说怎么回事吗……哭晕在厕所

那怎么加，比如说

选D，x不能放在后面，可以放到前面，int i=0x123;

采纳一下吧。


Question: 如图不求答案，求解释，为啥转义字符转换之后a不见了

引用 4 楼 weixin_45906870的回复:我也是初学者....帮你查找了下资料...  \r是回车符，它的作用是把位置移动到当前行的开始处。也就是说在这一行中，不管\r前面有多少东西，都会被删去，所以a被删除了。 \b是退格符，它的作用是在当前位置向左移动一位，在移动的同时把字符i删除了。  这两个转义字符所说的移动并非只是单纯的移动，而是指在移动的同时删除移动过程中覆盖的字符。 OK，你说得对，我懂了

能不能看看我问啥

最好能记住几种常用的符号 \r是回车符，相当于光标会回到本行行首 \b是退格符，相当于删除光标前一个字符 \r是换行符，相当于光标会移到下一行的行首 \t是制表符，相当于光标会跳转tab键的距离 等等

自顶