Question: 我又来了。。。

自己跟踪调试一下，看看你自己的代码流程，  需要 while （ 1 ） {         如果要***，输入1          如果要*** ，输入2         返回上层 ， 输入0        ch = getchar（）        if（ 1 == ch )   func1（）;        else (2==ch)    func2（）;        else ( 0 == ch )  break;     } } 需要这样的代码结构，才可以让用户不断的看到这一层的操作选择 你的代码结构不满足这种分层结构  如果是多层的， func1， func2 这个函数里面，也是这种while语句的结构，才能保持在这个层级当中不返回上级


Question: 一个二叉树的疑问求助

你自己先了解一下什么是完全二叉树不就会了嘛

换句话说，如果把那个淡颜色的数字的节点都补齐了，这些图都是完全二叉树

对于深度为K的，有n个结点的二叉树，当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 完全二叉树的特点是： 1）只允许最后一层有空缺结点且空缺在右边，即叶子结点只能在层次最大的两层上出现； 2）对任一结点，如果其右子树的深度为j，则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个  你的这个图里面， 有的数字颜色淡， 那是表示空缺的部分吧，以显示现存的叶子节点上的数字关系并不连续，他们并不是真实悬挂在那里的叶子节点， 应该是把他们拿掉之后再看。

完全二叉树是由满二叉树而引出来的。对于深度为K的，有n个结点的二叉树，当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

第一行右图的10节点是不是表示10节点已经被删除了。


Question: 这段程序有错误吗为什么结果不对呢？

printf("age:"); scanf("%d",p->age);         } p->next=NULL;  至少这就是错误的，  age是int类型，输入要取地址，  &p->age 才好


Question: printf与scanf

引用 8 楼 如风_Antoni的回复:如果要直接省略小数后的0，直接用%g最简单。 确实如此，上面两位的方法都是可行的，但一定条件下，用%g确实比较好

如果要直接省略小数后的0，直接用%g最简单。

引用 5 楼 與蘤舊縐的回复:[quote=引用 4 楼 无名D小兵 的回复:] [quote=引用 2 楼 與蘤舊縐的回复:]你的意思是scanf接收时，也就是你输入时是几位小数输出时也是几位小数吗，那只需要获取输入时的小数位数，然后在输出时指定即可  printf可以使用*作为占位符，printf("%.*d",位数,&数字)即可 就是要这样，不过我不大理解你的做法，但按压1楼说的，printf里用%g就可以了[/quote]  %g可以过滤后面的0，我认为你是需要保持输入和输出的小数位一致，比如输入1.500，输出2.500，这样的话你可以使用这个办法[/quote] 不过你的printf函数里为何会用到&

引用 5 楼 與蘤舊縐的回复:[quote=引用 4 楼 无名D小兵 的回复:] [quote=引用 2 楼 與蘤舊縐的回复:]你的意思是scanf接收时，也就是你输入时是几位小数输出时也是几位小数吗，那只需要获取输入时的小数位数，然后在输出时指定即可  printf可以使用*作为占位符，printf("%.*d",位数,&数字)即可 就是要这样，不过我不大理解你的做法，但按压1楼说的，printf里用%g就可以了[/quote]  %g可以过滤后面的0，我认为你是需要保持输入和输出的小数位一致，比如输入1.500，输出2.500，这样的话你可以使用这个办法[/quote] 查了一下资料后，明白你的意思了，你这个确实更加准确，同样谢谢了

引用 4 楼 无名D小兵 的回复:[quote=引用 2 楼 與蘤舊縐的回复:]你的意思是scanf接收时，也就是你输入时是几位小数输出时也是几位小数吗，那只需要获取输入时的小数位数，然后在输出时指定即可  printf可以使用*作为占位符，printf("%.*d",位数,&数字)即可 就是要这样，不过我不大理解你的做法，但按压1楼说的，printf里用%g就可以了[/quote]  %g可以过滤后面的0，我认为你是需要保持输入和输出的小数位一致，比如输入1.500，输出2.500，这样的话你可以使用这个办法

引用 2 楼 與蘤舊縐的回复:你的意思是scanf接收时，也就是你输入时是几位小数输出时也是几位小数吗，那只需要获取输入时的小数位数，然后在输出时指定即可  printf可以使用*作为占位符，printf("%.*d",位数,&数字)即可 就是要这样，不过我不大理解你的做法，但按压1楼说的，printf里用%g就可以了

引用 1 楼 寻开心的回复:float f = 1.0/3; printf（“%.10f”, f）;  输出指定小数点后的位数？    f = 1.5 还是printf("%g", f) 只输出1.5  自动过滤尾巴的0， 不会输出成1.50000这种样子 谢谢，果然使用%g就可以了


Question: localtime函数调用的参数太少

这么用吧 time_t time_seconds = time(0); 	struct tm now_time; 	localtime_s(&now_time,&time_seconds);


Question: 找1900到2000内的闰年，但出现了我也看不懂的问题

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

if语句成功要执行两行代码， 但是这两行代码，没有被组装到一起  j[x] = i;  i++； 后果就是，无论if是否成立 x++都被执行了。  j数组又没有初始化，里面存放的是就是乱七八糟的东西。 仅此而已。  这两行可以改为： j[x++] = i;  或者  j[x]=i,  i++;  或者  {     j[x] = i;    i++; }


Question: 求解答

哈哈，你看串行了，我说的第二题，第二题没说要降低复杂度

引用 4 楼 qq_45704330 的回复:可题说不能用循环，提示不就是让你用递归吗？这种公式求解是不是不能分开解，必须按着公式来呀  当时看着这题前后说法还是挺矛盾的，又不给迭代，还降低复杂度，还以为要搞什么高大上的算法，现在看起来也没多大问题，大概就是像你所说，想训练一下递归吧

递归没什么问题，但放着迭代不用搞递归与题意相悖，效率更低

第二题，我把分子和分母分别用递归，然后两个函数相除这样是不是不对

第一题，最简单的就是利用列组合公式，直接出结果。  因为是5个不同的数，答案就是： 5*4*3   要输出每个数的结果的话， 自己百度，这种排列组合的源码多的是  第二题   递推解决 int  f[10] = {1}， a[10]= {0};   float s[10]={0}; for ( i=2; i<10; i++ ) {       a[i] = s[i-1] + i;        f[i] = f[i-1] * i;        s[i] = s[i-1] + f[i] * 1.0/ a[i]; }  输出 s[8]*s[9];  大概就是这个样子了


Question: 初学者求教，为什么55会被调去中间，正确顺序应该是0 55 1 8 6 44 2 7 9 66

引用 11 楼 寻开心的回复:55 是第一个数， 必然会换走。 之所以，你看55不顺眼， 是因为0在最后一个， 0如果不是最后一个， 还有有第二个你看着不顺眼的呢  55被换走的过程，按照你的代码是先和0做了交换， 0跑到第一个， 55是最后一个 而后，66又和55做了交换， 55就占据了66的位置， 66是去了最后一个  这是符合题目要求的 懂了，谢谢你

找到最大最小的位置max和min， 这个你的代码已经找到了 做两个临时变量，   int vmax = *max， vmin=*min； if (min>max) { char * p = min; min=max; max=p; }; while (min>number ) *min = *(min-1), min--; while(max<number+9) *max = *(max+1), max++; *min = vmin;  *max = vmax; 这样应该就可以了

先找到最大和最小，然后交换得到最后的结果的。那为什么在找的中间会使55的位置发生变化

要得到你题目的结果。 要先循环找到最大和最小在数组当中位置 这两个位置把数组拆成三段， 前后两端各自向中间移动一格， 空出首位容纳最小和最大值。 要做到这个，比你的题目的难度要求就高了一些， 描述也不应该是你给的图那样了  找到最大最小的位置max和min， 这个你的代码已经找到了 做两个临时变量，   int vmax = *max， vmin=*min； if (min>max) { char * p = min; min=max; max=p; }; while (min>number ) *min = *min--; while(max<number+9) *max = *max++; *min = vmin;  *max = vmax; 这样应该就可以了

引用 7 楼 寻开心的回复:你的代码本来就是先找到最大和最小，然后交换得到最后的结果的。  你的题目要求应该也是这样的。标题的结果是你自己认为正确的答案，还是题目给出来的正确答案，怀疑是前者 那些数字是我自己输入的，发现位置发生了改变，答案给出的不是这些数字

引用 2 楼 寻开心的回复:哎， 说反了。  你把题目完整的贴出来。 道理就是上面说的， 这个交换是逐步进行的，还是最后一次进行的问题。 题目贴了啊，在程序图上面

能帮我编一下位置不变的程序吗

引用 1 楼 寻开心的回复:这是你的算法的问题  你的算法是找最大或者最小是渐进的过程，  不是一下就找到最大或者最小 55做为找到最大的66之前的最大值， 一度被安放到了最后一个，当遇到66的时候， 从最后一个移动到原来66所在的位置上， 变化就是这么产生的。  你要想中间的都不动，就要分步执行 首先是， 做一次次循环，找到最大和最小的位置，不做任何移动 然后，在循环结束后， 单独的做最小和0交换，最大和最后一个交换 我的程序不是让max和min分别指向最大值和最小值之后再交换位置吗，指针不是指向而已吗，为什么会使55的位置发生改变？

谁说正确答案是题目里面的那个顺序啊? 题目描述那个顺序就不是仅仅交换最大最小所能产生的， 是找到了最大和最小后， 移动数组里面的其他元素的位置才会产生的。  到底什么是正确的， 贴原始题目上来吧


Question: python小问题

藏的很隐蔽

我找到了，在其他开发语言里

我不怎么用python,CSDN没有这个版块吗

谢谢了，问题解决 呜呜呜，本菜鸡没找到python板块，大佬能告诉我在哪里吗

replace 不会改变原 string 的内容。print(line.replace('Python','C') 话说这里并不是Python版块


Question: 给一个long double变量赋值，输出不正确，为什么？

谢谢

发现了一个解决办法， 这个long doulbe 是C99上面才引入，老的C编译器不支持很正常 问题的毛病是出在printf函数上， 在c的编译器当中，都解决不了 用c++编译是可以搞定的，所以可以这样干  #include <cstdio>     // 不是stdio.h，而是cstudio，  c++里面用c的函数的头文件包含方法 #include <cstdlib>    // c++里面替代stdlib.h的方法  其他的不动就可以了。 printf这个时候用 %Lf , %Le, 就可以正常输出了  Dev C++亲测可用哈

如果你用的是 Windows，那么原因是微软的 C 运行时库对于 long double 的输出处理有 BUG。

编译器的事儿， 有的不支持long double （128位的）情况 改cout去试试吧


Question: 输出1000内的完数，但是执行没结果，各位大神指点哈

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

注意一下格式问题，还有就是z每次在x判断的时候都得赋初值0.


Question: 请问如何解决requires ANSI-style prototype的问题，谢谢！！！

void RDNB();  声明成这个样子 RDNB(b,8,0x50);  嗲用是这个样子 这个不匹配


Question: 请问如何解决requires ANSI-style prototype的问题，谢谢！！！

void RDNB();  声明成这个样子 RDNB(b,8,0x50);  调用是这个样子 这个不匹配


Question: 请问minigui不编译如何直接移植源码运行


Question: 任意输入一组整数，实现从小到大排列功能

scanf 的返回值      1 如果成功的按照format指定的格式有正确的输入， 那么返回值就是正确获得的数值的数量         输入2 4 7 9 5 返回值不是5， 而是返回了5次1，   因为scanf的format部分指定的是%d，只有一个数字要输入      2 如果要求输入整数， 你输入了一个字母，  那么返回的是 0      3 如果是输入过程当中， 用Ctrl+z或者是Ctrl+D， 或者是其他的什么错误， 返回的是EOF， 实际上-1  对于这种不知道多长数字的输入讨厌的地方就是这个， 到底什么时候才是输入的结束呢 从键盘输入， 你不敲回车，它就一直停留在等待输入的状态， 输入错了的数据，它也不会从键盘缓冲区当中自动清理掉错误的数据还留在那里等待你去处理掉。 除非用ctrl+z或者ctrl+d（不同的操作系统，可能还都不同）。 所以遇到这种不知道多长的数据是很讨厌的事情  一些算法比赛当中有这种测试题目，实际上都是从文件当中传递参数给过去， 用EOF是可以结束输入的 只是自己写代码的时候，遇到这种要求， 总是感觉不爽  不是错误， 只是不舒服

引用 3 楼 寻开心的回复:全局变量不用memset初始化，默认的就是0 局部数组初始化， int a[inf] = {0}; 这样就都初始化为0了。  你这个输入也有意思， 怎么才能确定输入完呢？ 什么时候scanf结果不是1？  交换数据为啥都要写成 temp = a; a=b; b=temp; 这种形式？  因为这种方式是真正的无损模式，适用任何支持 = 这种操作的类型。  别的方法要么首先于类型，要么有可能会产生溢出之类的操作结果。 你好 大佬 scanf的返回值不是成功输入几个数就是几吗 如果我输入了 2 4 7 9 5 那scanf的值就是5？然后我改成while(scanf("%d",&n)!=EOF)以后好像使用起来都一样 可以帮忙解释一下 因为我的理解是scanf的返回值不等于-1时执行while 请问是这样吗

引用 1 楼 與蘤舊縐的回复:你这是哪门排序方式啊，简单的冒泡需要双重循环，你这个我感觉还是接近冒泡，多半写错了吧  另外整数交换可以使用^，比如a=a^b;b=a^b;a=a^b，效率高点 好的 十分感谢 我再去尝试一下


Question: 清空剩余输入行？？？

引用 5 楼 寻开心的回复:还有， 楼主 去把别人都回答了，解决了你的问题的帖子，都给结个账去。  老这样，光提问题，不给分儿， 下次就不给你回答了 才用这个，不太会给分，我以为只要回答问题就会自动得分，这是在哪评分的？？

怎么给分啊，我不会啊

楼主是接着上次的问题提问的吧。  那就不是过滤一个回车符的问题 它这个代码配套使用的情况是这样的 要求输入一个数， 结果输入字符后面还可能有多个内容，并且有回车 需要把这一行都清理掉，那么用gets可以一次解决 不用这个函数，就是楼主那个代码了 不断的从键盘缓冲区提取字符， 直到提取到第一个回车符号为止， 让这一行所有的剩余输入都作废 这个不是，简单的处理掉一个回车符号

引用 2 楼 與蘤舊縐的回复:最后不需要contine了，看得出来吧 好像明白了一点点，谢谢

最后不需要contine了，看得出来吧

你是想说清楚缓冲区里的字符吗  getchar一下，就冲缓冲区中读取一个字符，标志位向后移动一位，也就是这个字符不会再被读取了，除非把标志位移回去，否则一直前进就不会再读取，这样的效果就类似于清除，\n就是最后判断那一下，也没了


Question: 求助大神

if(7<=m<=9) 这种写法的运行结果永远是真 7<=m 比较的结果只有0和1两种情况， 他们都小于9，  所以 这里永远成立

if(7<=m<=9) 这里不能这么写 if(7<=m && m<=9) 才是正确的写法

输入一月份，五间房，结果应该是350，但输出的是425

void main()  没这个定义。  int main 要求输入房间价格， 100是写死了的吧 然后，还有什么问题呢？   scanf的格式要求输入的时候，必须是月份，房间数的形式，输入错了就不能正确的读入m和n 不直到你的问题是什么


Question: 求助大佬，C语言文件操作问题

首次发帖，不知怎么做你才能得到区区的50分敬意

感谢指点，完成了

数据文件的格式应该是固定的， 不应该乱换  对你的这个种破事儿也有办法解决 char buffer[100]; fgets(fp, buffer);  // 读第一行 if ( buffer[0] == 'U') sscanf(buffer, "U%lf", &u); else sscanf("x%lf", &x); fgets(fp,buffer); // 读第二行 if ( buffer[0] == 'U') sscanf(buffer, "U%lf", &u); else sscanf("x%lf", &x);  fgets 从文件当中读取一行 sscanf从字符串，当中提取指定的数据

emmmmm这个在U是第一行的时候是对的，但是像现在这样，如果我把U和x在.txt中对调了，就是U与X的位置上下换，最后输出的U是0呀，怎样输出正确的值…有办法调整吗

谢谢，我改改哈

你那个原始的写法根本就不对， while里面一次一个读一个字符，读到最后退出while循环后，ch就是EOF标记0xff  while后面的处理都是白费的

FILE * fp = fopen("1.txt", "r"); if ( fp) { 	double u, x; 	fscanf(fp, "U%lf\n", &u);    // 注意尾巴要带回车符号的。 这个和scanf不同，没有它x就不正确了 	fscanf(fp, "x%lf", &x); 	printf("%lf %lf\n", u, x); 	fclose(fp); 	fp = NULL; }

是直接接fscanf还是放在while里呀

然后下面直接，接printf (“ %lf”,U)就行了嘛

那这样出来的x和U直接就是对应的了嘛，

两个都是double，就都是%lf 的格式读取就好啦 fp = fopen 之后 用两个fscanf语句读出就好了， 不用写的那么麻烦

fscanf（fp, "U %d", &u）; fscanf (fp, "x %f", &x);


Question: 有大神指导一下是什么错误吗？

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

函数声明要放在main函数之前

引用 6 楼 牛不才的回复:你的输入是不是不匹配 1 2 3  比如上面三个字，中间要有空格隔开的。另外检查一下是不是还有调试程序没关掉。 可以了，谢谢牛哥

你好，为什么这样也不行：#include<stdio.h>   	int max2(int x, int y, int z); 	 	int max1(int x, int y); 	 int main() {  	int a=0; 	int b=0; 	int c=0; 	int j=0; 	scanf("%d %d %d",&a, &b, &c); 	    j=max2(a, b, c);     	printf("max is:%d",j); 	 	return 0; 	  }   	  int max2(int x,int y,int z) {   	return max1(max1(x,y),z); }  int max1(int x,int y){  return(x>y?x:y);  }

scanf("%d %d %d", &a, &b, &c); 其他问题都是规范问题，这一行是个传参错误

#define _CRT_SECURE_NO_WARNINGS  #include<stdio.h> int max2(int x, int y, int z); int max1(int x, int y);  int main() { 	int a = 0; 	int b = 0; 	int c = 0;  	int j = 0;; 	scanf("%d %d %d", &a, &b, &c); 	j = max2(a, b, c); 	printf("max is:%d", j); 	return 0;  }   int max2(int x, int y, int z) { 	 	return max1(max1(x, y), z); }  int max1(int x, int y) {  	return(x > y ? x : y); }

引用 1 楼 牛不才的回复:函数声明要放在main函数之前 试过还是这样的错误


Question: 求大佬解答C语言问题

引用 5 楼 與蘤舊縐的回复:按任意键继续，所以呢 如第三个图，按任意键继续，按完直接重复，并没有显示让我输入

按任意键继续，所以呢

引用 3 楼 與蘤舊縐的回复:输入所需修改信息的学生姓名 那里输入了“小明\n”，\n被下面的scanf接收了 循环条件是ch1不等于8的时候，那为什么第二次循环的时候还是跳过了ch1的输入

我在前面有定义一个字符串数组，然后小明储存在里面，然后遍历链表，调出小明的信息。

你前面输入的小明那一句的\n被接收了

如果还是跳过，就在前面加一个getchar(); getchar(); 	scanf("%c", &ch1);  或者 scanf("\n%c", &ch1);  总之要把前面那个回车 先吃掉

你输入的内容会提交到缓冲区，程序去缓冲区接收内容，如果你一次性把所有的都输了，他也会慢慢接收，不然你可以试试在前面输入“小明（空格）1（回车）”看有什么效果

你是不是想这么写呀？ scanf("%c", &ch1);

引用 7 楼 與蘤舊縐的回复:都说了啊，按任意键继续，又被scanf接收了，你又没机会了 为什么他会跨语句接受呀

都说了啊，按任意键继续，又被scanf接收了，你又没机会了


Question: 一个关于字符串的小问题

@æµ©ä»  你再试一次  #include<bits/stdc++.h> using namespace std; int main() { 	string a = "185";     cout<<(sizeof(a))<< '\n'; 	return 0; }

不是一个字符串占这么多字节，是一个 string 对象占这么多字节，sizeof 根本算不出想要的字符串大小。

我输出了4鸭

编译器不同得到的结果 可能也不同，我这里得到的值是28 	string a = "185"; 	cout << (sizeof(a)) << '\n'; 	cout << sizeof string << endl; 	cout << a.size() << endl; 	cout << a.capacity() << endl; sizeof不是函数，string a = “185”；a的内存是动态分配再堆上面的 想要知道a的占用大小可以用a.size();  看它实际占用的大小用 a.capacity()


Question: c语言 用三维数组传递二维数组 做函数参数的问题

简单的说，  定义 int mapbox[2][N][N] = { 0, 0, ...... } void func( int map[N][N]);  调用 func(mapbox[i]) ；    这里调用后，发现数据不对了？  不是传参数的问题，你可以i简单的写一个代码来验证这点  #define N 10 int mapbox[3][N][N] ; void fun(int map[N][N]); int main () {     for ( int i=0; I<3; i++)         for ( int j=0; j<N;j++ )             for (int k=0; k<N; k++)                 mapbox[i][j][k] = i*100 + j*10 + k;     fun(mapbox[1]); // [0], [1],[2]  随便哪一个都可以     return 0; }; void fun(int map[N][N]) {     for (int i=0; i<N; i++ ) {         for ( int j=0; j<N; j++)             cout << map[i][j] << " ";         cout << endl;     } };

引用 2 楼 寻开心的回复:觉得数据错了，要考虑是不是数据组织的问题，还是其他的地方改了你的数据 太感谢了，非常非常感谢您。我会更加认真的检查程序的。

觉得数据错了，要考虑是不是数据组织的问题，还是其他的地方改了你的数据


Question: 求大佬帮我解答一下自动变量的相关问题

变量都有其生命周期的和有效作用域的 简单的说， 这种函数里面的变量， 都是在其声明所在的花括号范围内有效  比如 例子当中  int main（） {     int x;  // x在这个主函数里面处处有效     while（1） {          int y;  // y就在这个小范围内有效     } } 这个好理解吧。   while里面的 int y； 改成 int x； 就是你的代码当中的情况了 while 里面的int x； 和 上层的x是完全不同的两个变量， c/c++标准是允许这样定义和使用的  遇到这种情况，其实比较讨厌的， while里面你还没有办法用到上层的x， 除非在全局变量再定义一个x， 那样可以用::x来使用 例子：  int x = 3； // global  int main （） {     int x = 2;  // main     while (1 )  {           int x = 1;  //local;          cout << x << endl;  // 使用的是局部变量x           cout << ::x << endl; // 使用的全局变量x           break;    }    cout << x << endl;  // main    cout << ::x << endl; // global    return 0; }

#include <stdio.h>  int main() { 	int x = 30;               //原始的x  	printf("x in outer block: %d at %p\n", x, &x); 	{ 		int x = 77;           //新的x,隐藏了原始的x   这里的“隐藏”是什么意思？ 		// 这个时候存在两个x，一个是这个77，作用于就是最近的这个大括号 		//另一个就是外面原始的x，就近匹配原则，原始的x在这个大括号失效，只匹配77的这个x 		printf("x in inner block: %d at %p\n", x, &x); 	} 	printf("x in outer block: %d at %p\n", x, &x); 	while (x++ < 33)          //原始的x， 每循环一次x+1， 最后x=33，判断条件为false，再执行++ 操作，x为34 	{ 		int x = 100;          //新的x，隐藏了原始的x 		x++; 		printf("x in while loop: %d at %p\n", x, &x); 	} 	printf("x in outer block: %d at %p\n", x, &x);         //最后的x为什么等于34而不是33？  		return 0; }

非常感谢！没想到我悬赏100分都只有两个人回答我，哎....


Question: c语言结构体为什么这样不行

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

这么写pArray相当于是一个二维码数组 pArray[3][1], 楼主确定是这样的吗？          pArray[i]->name  = (char *) malloc(sizeof(char)*64);         pArray[i][0].name = ( char *) malloc(sizeof(char)*64);         (*(pArray+i))->name = (char *) malloc(sizeof(char*)*64);         (*(*(pArray+i))).name = (char *) malloc(sizeof(char*)*64);  pArray 是 (Person *)类型 所以*(Array + i)  才是和 pArray[i ]一样，都是 Person * 的类型

->运算符的优先级要高于* 所以你试一下这么写， （*（pArray+1））->name


Question: 用freopen()文件输入输出问题

引用 2 楼 寻开心 的回复:while( 3 == scanf("%d%d%d", &a, &b, &c)  )  改成这样就好了，这样确信正确的读入到了3个数， 才去循环 谢谢谢谢，终于对了！

scanf函数返回成功读入的数据项数，读入数据时遇到了“文件结束”则返回EOF。 EOF是-1， 不是0   while( 3. == scanf("%d%d%d", &a, &b, &c)  ) 这样


Question: python基础

好的好的，谢谢

准确的说，单纯一个age无法使得程序判断这个属性属于对象还是类 以下也是错误的  class demo:     age=0     def func1(self):         age = 1      def func2(self):         age += 1         return   而以下是可以的，这时age是属于类的  class demo:     def func1(self):         demo.age = 1      def func2(self):         demo.age += 1         return

你没有定义login_attempts，虽然你在上面的函数里用到了这个属性，但是下一个函数是无法识别该属性的 比如  class demo:     def func1(self):         age=1     def func2(self):         age+=1         return  d=demo() d.func1() d.func2()   而通过以下方式可以定义属性   class demo:     def func1(self):         self.age = 1#只需要规定age是self的属性即可      def func2(self):         self.age += 1         return


Question: Keil5 mdk版本无代码补全功能

我也是这个问题，楼主解决了吗

楼主解决了吗？

我也是这个问题


Question: 关于指针的一个简单问题

data是个指针变量，sizeof(data)不可能是0，应该和sizeof(tmp)一样，是8，估计你打印的是strlen(data)吧？ tmp = tt; tmp等于tt数组的首地址，即tmp==&tt[0] 数组第一个元素的地址（数组下标是0），所以tmp+1等于&tt[1]（数组第二个元素的地址），所以+4就是数组第四个元素的地址 所以 tmp = tt; //tmp为数组第一个元素的地址 char* data = (char*)tmp + 4 + 4; //data为数组第9个元素的地址（数组下标是8），第9个数组元素为字符串结尾符'\0'

+4就是指针往后移动4位，一开始tmp指向第一个a，那么移了8位之后就指到d的后面，也就是\0，sizeof是从指针当前指向位置开始计算的，所以是0


Question: Dev-c++编译不出结果？

引用 1 楼 與蘤舊縐 的回复:编译成功了，是无法执行 首先文件名以及文件路径内不要有中文，此外把你的程序发出来，多半有问题程序没有问题的，都是我之前编译好的以前运行都没有问题的。

程序没有问题的，都是我之前编译好的以前运行都没有问题的。

会不会是杀毒软件的原因？


Question: 帮忙看看哪里有问题

你确定你输入的时候，是要从键盘敲入 (1,2) 3 (4,5)  这样来输入吗？！  你最好scanf之后，printf一遍abrcd这五个数的值，看看是否正确的输入进来了  算是否在圆上的方法没有错，如果错了十有八九是你输入的数据的格式不对，没有能正确的获得那五个数的值


Question: c语言

我看明白为什么题目是用bool来做的了，明白了为什么只用if很难实现word++（至少对我来说），单词间的空格可以通过bool搭配来辨别有几个单词 很受大佬的体会整理逻辑几字影响，得静下心逐个代码慢慢看逐个理解 🙏

为啥？ 逻辑错误呗。 你先体会体会蓝色的代码的逻辑。  或者，你把word++， words++ 需要的条件单独罗列出来，写成独立的if语句 if（ *** ） word ++； if（ **** ） words ++；  不是什么条件都可以用 if  。。。 else if 。。。 else 。。。 这样无限的串联下去的。 要看他们是否满足这样的关系， 毕竟在这个长链条上哪一个if条件得到了满足，后面就都断掉了。你要确保这个长串的逻辑关系是正确的。  前面给的答复已经说了，为什么word++得不到执行， 就是因为前面的if条件满足了，后面的 else 里的就永远得不到执行了  设计这个长长的链条的时候， 整理好逻辑先

你的word++这一句永远也执行不到 因为当isapha（ch）成立的时候， 在words++那里就结束了整个if else 的处理， 然后就继续循环了  所以还是好好想想你的处理逻辑吧。

引用 2 楼 寻开心 的回复：蓝色的， 进来就先判断isalpha， 成立word就++， 这是一个独立的if语句，和后面的if之间没有关联。  而你的白色的部分， isalpha成立早早就结束了if链，根本就不会走到最后word部分的那个测试点我把if 的问题解决了 但是实现单词的增加word++实现不了请问是什么问题啊

引用 2 楼 寻开心 的回复：蓝色的， 进来就先判断isalpha， 成立word就++， 这是一个独立的if语句，和后面的if之间没有关联。  而你的白色的部分， isalpha成立早早就结束了if链，根本就不会走到最后word部分的那个测试点那我得把所有的else if改成if吗 if else里选择第一个符合的执行后面的else if跳过，如果都是if就会一一对比然后符合的话执行


Question: 求助matlab

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

谢谢您！


average明明两参数你传一个

求帮忙，好几次了，百度搜了好久都不知道怎么办，求详细解答，谢谢啦

引用 2 楼 與蘤舊縐的回复:average明明两参数你传一个 懂了，谢谢大佬知道了，谢谢大佬帮忙

二楼正解， 函数实现部分，要求两个参数指针和长度 声明和调用部分都是一个参数（指针）， 自然是不匹配的


Question: 问问问：我这个程序又是数组越界又是运行超时的，求帮忙看看到底哪里错了

引用 9 楼 qybao 的回复:为啥一定要保存到数组呢？只要输出结果正确就好了，找到最大字符的下标，打印下标前的信息，再打印（max），再打印下标后的元素即可了一个下标不够

我知道了，感谢感谢

输入字符串是100个x的时候，会如何？ 每个x后面要插入一个（max）总共多长，200放得下不

这题目 不要真的做插入操作  记录最大值 输出每一个字符的时候 做比较 不是最大就直接输出  最大就 %c(max)这样输出就完事了

int main() {    char str[200],ch;    int i,j;        while(gets(str)!=NULL) // gets不安全， 不能限制长度 <=100    {      ch=str[0];      for(i=1;i<strlen(str);i++)         if(ch<str[i])    // 注意：是"最大的字母"，即'a' == 'A'          ch=str[i];       for(i=0;i<strlen(str);i++)      {     if(ch==str[i])    // 调用完后, i+=5     {       for(j=strlen(str)-1;j>i;j--)    // j= strlen(str), 不要减1， 因为你连结束0都要copy     str[j+5]=str[j];   strncpy(&str[i+1],"(max)",5);   }  }     puts(str);    } }

害，我就是想知道为什么这个写法不越界就怪了，我有ac的代码，但是我这个数组开大后就超时，开小点就越界，为嘛呀，我想知道原因，我不要代码

长度100 插入(max) 最长600 你数组才200 GG

你这么个写法不越界就怪了……，方便的话给个网址，可以给你个ac代码

数组越界就把数组往大开开呗，超时了就优化代码


Question: emmm

应该是字符编码造成的， 你可以试试把printf语句拆开 先printf（汉字） printf（“%s”， name）； 再printf其他的

引用 3 楼 與蘤舊縐的回复:[quote=引用 2 楼 Alasebair 的回复:] [quote=引用 1 楼 與蘤舊縐的回复:]字符数组可以直接存，不过一个汉字需要占两个字符而已  #include <stdio.h>  int main(void) {     char name[40];     printf("Please input your name\n");     scanf("%s", name);     printf("your name is %s", name);     return 0; }  但是你看上图我想把这个输出到“楚晚宁”和“的”中间 [/quote]  看到了，是挺奇怪的，暂时没看出什么毛病来，%s在中间也是可以被识别的[/quote] 谢谢谢谢谢谢谢谢谢谢谢谢谢谢

引用 2 楼 Alasebair 的回复:[quote=引用 1 楼 與蘤舊縐的回复:]字符数组可以直接存，不过一个汉字需要占两个字符而已  #include <stdio.h>  int main(void) {     char name[40];     printf("Please input your name\n");     scanf("%s", name);     printf("your name is %s", name);     return 0; }  但是你看上图我想把这个输出到“楚晚宁”和“的”中间 [/quote]  看到了，是挺奇怪的，暂时没看出什么毛病来，%s在中间也是可以被识别的

引用 1 楼 與蘤舊縐的回复:字符数组可以直接存，不过一个汉字需要占两个字符而已  #include <stdio.h>  int main(void) {     char name[40];     printf("Please input your name\n");     scanf("%s", name);     printf("your name is %s", name);     return 0; }  但是你看上图我想把这个输出到“楚晚宁”和“的”中间


Question: 一道C编程题目求助，求思路

引用 1 楼 qybao 的回复:思路就是行循环，判断行奇偶行，比如奇数列顺输，偶数列逆输即可 for example int n = 5, p = 0, q = 0, j, k; for (j=0; j<n; j++) {     p += (j+1);     for (k=0,q=(j%2==1 ? p : q+1); k<j; k++) {        printf(“%d*”, j%2==1 ? q-k: q++);     }     printf(“”%d\n”, q); }  贪图方便，想偶数行的时候不计算q（想直接利用上一次循环的结果），考虑疏忽了，结果奇数行的时候最后一个q-k遗漏了，修改一下 int n = 5, p = 0, q, j, k, f; for (j=0, f=1; j<n; j++, f*=-1) { //加个f控制递增递减     p += (j+1);     q=(j%2==1 ? p : p-j);//奇数行偶数行的起始     for (k=0; k<j; k++, q+=f) {        printf("%d*", q);     }     printf("%d\n", q); }

// 写个函数， 从iStart开始，输出len个数，按照nWay=1从小到大，nWay=-1从大到小  int printLine (int iStart, int len, int way) {  int j;  if ( way ==1) {  for ( j=iStart; j<iStart+len-1; j++ ) printf("%d*", j);  printf("%d\n", j);  } else {  for (  j=iStart+len-1; j>iStart; j-- ) printf("%d*", j);  printf("%d\n", j);  }  return iStart + len;  }   int main(){  int iStart = 1, nWay = -1;  int j, n;  scanf("%d", &n);  for ( j =1; j<=n; j++ )  iStart = printLine(iStart, j, nWay*=-1);  return 0;  };


Question: 求大神帮忙修改

不过我现在已经解决了，非常感谢

不不不，输了0的！！！

没有输出就说明还在while循环， 打破循环的条件是输入数值0 怀疑，输入数据的时候，没有最后用0结束

代码没看出问题啊  不会是楼主输入数据的时候没有用 0 做结束吧

引用 7 楼 user-2的回复:不可以，getchar是获得字符，你要获得的是整形，不一样 好的，非常感谢！！！

不可以，getchar是获得字符，你要获得的是整形，不一样

顺便问问大神，while测试条件这块可不可以写成(num=getchar())!=0

引用 4 楼 user-2的回复:真没看出什么问题 难道你一开始就输入了非法数据？ 要不 while(scanf("%d",&num)==1&&num!=0) { 改成以下试试 while(1) {     scanf("%d",&num);     if (num==0) break; 好的，我先去试试。谢谢

引用 2 楼 victorial666的回复:[quote=引用 1 楼 user-2的回复:]没看出问题啊，即使不进入while，至少也会打印找不到奇偶数的信息啊，你的运行不出结果值的是什么？ 难道是int main(void)的问题，把void去掉，改成int main() 把值输进去后没有结果[/quote] 我删了之后还是没结果

引用 1 楼 user-2的回复:没看出问题啊，即使不进入while，至少也会打印找不到奇偶数的信息啊，你的运行不出结果值的是什么？ 难道是int main(void)的问题，把void去掉，改成int main() 把值输进去后没有结果


Question: 一个简单的问题

明白了，谢谢大家

a是string对象，不支持与int类型的2做+运算，故报错。 +=属于赋值运算符，赋值运算右边如果与左边的数据类型不一致，将右边表达式的类型转换为左边的类型。 2为int，'0'为字符，可以做+运算，结果为50——int（字符'0'ASCII码值为48）。 所以 a += 2 + '0';语句为 a += 50; 50为字符'2'的ASCII码值 因此a将是"1232"  如此解译，可否？

string +=重载 支持int类型 +重载 不支持int类型

string a = "123"; a = a+2 + '0';//1 这个会先计算a+2，类型不一致，编译出错 a += 2 + '0';//2 这个会先计算右边得到'2'，再追加到字符串a的后面（类型复合字符串相加）

第一行，即便你把 2+‘0’用括号括起来也不行， 他两个的运算结果会当作int来处理 第二行之所一行， 是默认做了int和char之间的转换了  第一行需要。a = a + char （2+‘0’）； 才可以

因为第二行是先计算 2 + ‘0’ 结果还是一个字符， 和a合并成“1232”这样的字符串 第一行是先来a + 2 这个不行， string 和 整数之间无加法


Question: 蓝桥杯试题 算法提高 实数相加（c语言详细注释）

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

[quote=引用 楼主 My dream. 的回复:] 引用资源限制 时间限制：1.0s   内存限制：512.0MB 问题描述 　　计算两个实数相加的结果。 　　 }[/code] 前后补零，倒序相加就是

引用 2 楼 user-3的回复:上面 strlen(a)-i 改为 strlen(a)-i-1 明白了，谢谢大佬我修改一下

引用 2 楼 user-3的回复:上面 strlen(a)-i 改为 strlen(a)-i-1 具体那一行，我咋没找到呀？

上面 strlen(a)-i 改为 strlen(a)-i-1

找小数点和求整数位数和小数位数可以再简化一些 找到小数点就break循环，整数位数就是i，小数位数就是strlen(a)-i 判断有没有小数，就判断小数位数是否大于0即可，没必要用fa，fb


Question: 这个结果跟预期的怎么不一样啊

懂了，谢谢大佬你好厉害

比如： p.a1[2] = ( 2020 - 0) % 100  = 20 并不是你期待的2 其他也是同类问题  可以按照你的思路再改，  （） % 100 / 10； 后面 %1000 / 100；  % 10000 / 1000 问题是写的多累啊  for (I=3; I>=0; I--) p.a1[I] = a%10, a/=10;

p.a1[3] = a % 10;     p.a1[2] = (a/10)%10;     p.a1[1] = (a/100)%10;     p.a1[0] = (a/1000)%10; 这样才是， 至于你的为什么不对， 想想吧  比如： p.a1[2] = ( 2020 - 0) % 10  = 20 并不是你期待的2 其他也是同类问题

不应该是 2  0    2  0  1   1   1   1 吗


Question: 求问这个codeblocks输出字符的问题


Question: c语言

https://www.zhihu.com/question/29460422/answer/177884613  https://www.cnblogs.com/WhyEngine/p/3885126.html  http://tieba.baidu.com/p/5443042391?traceid=

有个函数能画出心形曲线， 按照这个曲线分布来放照片就好了 找找去


Question: 大佬帮帮忙

引用 1 楼 寻开心 的回复:1  新建一个源文件，写个最简单的hello world类的程序， 确保代码无误的编译试试 2  软件有问题吗？ 退出软件重启，  任务管理器有没有多个同名软件都关闭 3  电脑重启 4  软件重装， （腾讯电脑管家-软件管理-dev c++） 5  换同类软件调试 6  系统重装 7  砸了电脑买个更高级的 8  删库跑路以后上工地会日子去  就这么几个过程， 自己看着办能撑到第几关 听君一席话，胜读十年书，直接选一波8，待我历尽千帆，归来仍少年！！！

楼上所有办法了，哈哈


Question: 小萌新求教各位大佬，c语言函数调用怎么有效返回到主函数使用？比如我下面这道题

不要假设自己的输入数据就一定正确  初学的时候，要习惯于每次输入数据后， 再printf输出一遍，确认没有问题， 然后再写后面的代码，  这也是分段调试的步骤， 每完成一段计算工作，输出一下结果验证无误再进行后续的调试，前面的结果不正确，后面都是白忙活。

引用 2 楼 寻开心的回复:三个数是float类型， scanf怎么能是%d呢，  是%f格式，   格式不对，所以读入的三个数都变成了0 谢谢指教，这下茅塞顿开了

定义全局变量或则return返回值，主函数设一个值接收就可以


Question: update Docker for windows 鱼都被烤红了

最后挣扎一下

最后顶一波，没人就结了

引用 8 楼 super_admi 的回复:现在不是说docker都逐步要被淘汰了吗？容器技术这几年也发展很快啊，前两年k8s还火热，今年又会是谁？  [quote=引用 7 楼 與蘤舊縐 的回复:] [quote=引用 6 楼 super_admi 的回复:] 一盆冷水浇上去，鱼就不红了。  哎，windows装docker真是作大死了[/quote][/quote]  配环境没办法了，，淘不淘汰无所谓，满足这会儿需求就行

现在不是说docker都逐步要被淘汰了吗？容器技术这几年也发展很快啊，前两年k8s还火热，今年又会是谁？  引用 7 楼 與蘤舊縐 的回复:[quote=引用 6 楼 super_admi 的回复:] 一盆冷水浇上去，鱼就不红了。  哎，windows装docker真是作大死了[/quote]

引用 6 楼 super_admi 的回复:一盆冷水浇上去，鱼就不红了。  哎，windows装docker真是作大死了

一盆冷水浇上去，鱼就不红了。

人工置顶

现在显示的是installaction canceled，自己还把自己取消了，某不是我理解错洋文了

引用 2 楼 user-2 的回复:有烤鱼吃多好啊 你把docker卸载再重装试试  不存在的，根本不知道问题从何而来，现在装了2.0版本，勉强可用，但还是无法升级，主要是一直零进度卡那了，倒也没报错，怕不是在外网下载新版本被墙了

有烤鱼吃多好啊 你把docker卸载再重装试试

现在连启动都不成了


Question: 请教

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 2 楼 weixin_46252966 的回复:[quote=引用 1 楼 user-2的回复:]中断实现的，定义了timer0()为中断1 程序在中间进入while（1）后不就应该进入了死循环吗，怎么可以再次进入最后的断点程序运行数码管的代码[/quote] 中断并不是你程序实现的，是硬件实现的，你去了解一下中断是怎么回事就明白了。

引用 1 楼 user-2的回复:中断实现的，定义了timer0()为中断1 程序在中间进入while（1）后不就应该进入了死循环吗，怎么可以再次进入最后的断点程序运行数码管的代码

中断实现的，定义了timer0()为中断1


Question: 急问：我这个C语言程序第十行后面不加getchar（）；为什么就错了

这个是数据例子，那为什么在输入第二组数据的第一个数据回车后就直接又回车了一次才能再输入第二个数，最后结果怎么连A也被删除了呀，缓冲区我懂了，就是为什么在这个奇怪的位置回车了一次

scanf默认以空格和回车作为分隔符，这里在读取你输入的一个字符之后，\n并没有从缓冲区中被去除，而你在while中使用的gets是可以接收这个回车的


Question: 请大神解惑scanf与gets的相关问题

引用 2 楼 寻开心的回复:scanf是有过滤回车的功能的，比如，还是上面的代码， 第一个scanf要求输入N的时候，你不输入数字，随便先敲多少次回车都可以，然后再输入一个数，再次回车， 这是scanf才会读出数到N里面去。 这才跑到循环里面去。 谢谢您。是因为录入N的时候，已经有一个回车在缓冲区内，所以导致fets少录一个数据，是这个意思吗？

引用 4 楼 寻开心的回复:是的  for里面gets后面，加一个puts，你就能知道答案， 写代码，测试一下 好的好的，谢谢您，以后一定注意

因为scanf 是用户输入回车之后才开始从键盘缓冲区里面提取内容的，但是回车键依然在缓冲区里面 这个时候，第一个循环的gets获得是回车 如果循环里面用的是scanf，会把键盘缓冲区的回车键过滤掉继续向下处理的


Question: 关于宏定义的一个问题

明白了明白了

上面误字，就会有->就没有

引用 2 楼 æµ©ä» 的回复:? 那写这句话是干什么的 就是BYTE_ORDER == LITTLE_ENDIAN 的时候，所有代码里有memrev16ifbe(p)的地方都会用空格覆盖掉 比如有 某行代码有函数调用 memrev16ifbe(p); 在BYTE_ORDER == LITTLE_ENDIAN 的时候该行代码就变成空白，也就是相当于源代码没有这一行，所以BYTE_ORDER == LITTLE_ENDIAN的时候就会有 memrev16ifbe(p) 处理

引用 2 楼 æµ©ä» 的回复:? 那写这句话是干什么的#if (BYTE_ORDER == LITTLE_ENDIAN) #define memrev16ifbe(p) #define memrev32ifbe(p) #define memrev64ifbe(p) #define intrev16ifbe(v) (v) #define intrev32ifbe(v) (v) #define intrev64ifbe(v) (v) #else #define memrev16ifbe(p) memrev16(p) #define memrev32ifbe(p) memrev32(p) #define memrev64ifbe(p) memrev64(p) #define intrev16ifbe(v) intrev16(v) #define intrev32ifbe(v) intrev32(v) #define intrev64ifbe(v) intrev64(v) #endif  BYTE_ORDER == LITTLE_ENDIAN 的时候没用 不等于的时候是 intrev64(v)

? 那写这句话是干什么的

意思就是空白  #define memrev16ifbe(p) 就是空白的 代码里面调用这个宏的那行代码 空行


Question: 如何使用C语言在汉语句子中匹配两个字？

引用 6 楼 apkipa1的回复:strstr，请。 哦吼，发现新大陆，谢谢

只是单纯的查找是否含有子串，直接用strstr就好了

strstr，请。

strcmp，每个字用一个字符数组存储，然后依次取出要查询的数组的两个字节，比较

引用 3 楼 與蘤舊縐的回复:单纯strncmp是不够的，这还需要把字符串每四个字节切开遍历比较，还是先比较前两个字节，也就是第一个字效率高些 那是怎么一次比较2个字节呢？我比较迷糊。。。

strncmp这个函数能用

char数组里面，汉字占两个字节，你两两一组比较。鉴于里面可能混杂英文字母，可以一个一个跳。手机端不好打代码，就不给示例了


Question: 为什么我这个程序输入4，5。结果是4，输入-34，12，结果是0？

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

太感谢你了，我还一个字一个字的对

你这输入是不是用的中文逗号，中英文有区别


Question: 这个错误咋回事啊

这样啊，虽然指针移来移去不知道是什么鬼但应该知道怎么做了，谢谢大佬

引用 3 楼 m0_46252768 的回复:这样啊  那我想利用一个调用函数把一些整数的各个位置的数提取出来再传递到main函数里应该怎么做呢 那你最终结果应该保存到一个数组里，而不是保存在一个数里面

你这个m+1,+2之类的，不知道指针会移到哪里去了（猜测是移到m自己的地址了，所以*(m+x)得到内存信息是r的地址，所以给一个地址复制造成错误了） 如果想指针在一块内存区域移动来控制变量，那就采用结构体吧，至少结构体能保证成员变量的地址连续，否则真没法控制指针会指向哪个区域了（理论上局部连变量也是连续的，但是谁先谁后真不好说）

m=&d; d是test函数的局部变量，这个变量分配在test调用时候的栈内存当中 m+1, m+2,.....就是在栈里面移动， 栈里面的内容可能是局部变量也可能是其他的参数 这种代码不是非常精通栈内存分配的不要玩儿 而且这种代码不具备可移植性，不同的编译器上完全可能不同的效果，局限性很大

*（m+1）  *（m+2） 这些指针指向哪儿去了啊，  乱操作， 把函数的堆栈破坏了


Question: c语言小白提问：字符串的输出

每次新建源文件方式玩儿吧。  用工程项目还要配置，弄不好就各种毛病， 熟练了之后再琢磨花样

太可了，复制一遍内容成功了？？？但是原先那个cpp运行后还是黑屏。内容一样啊为嘛？？？

关闭所有的工程。 新建源文件， 把这些代码放进去。 编译运行，然后呢， dev 什么反馈？ 代码没有问题，如果不出结果，应该是dev出问题了。  也许dev也染病毒了， 这几天都开始出毛病

? 没有错误啊！ 找什么错误


Question: 杨辉三角

你看书都是倒着看吗？！     想要源码baidu一下，非常多；  想要学习，就自己写啊，  基础练习必须自己做

代码如下：   #include<iostream> using namespace std; int a[101][101]; int main() { 	int i,j,n; 	cin>>n; 	for(i=0;i<n;i++) 	{ 		a[i][0]=1; 		a[i][i]=1; 	} 	for(i=2;i<n;i++) 	{ 		for(j=1;j<n;j++) 		{ 			a[i][j]=a[i-1][j-1]+a[i-1][j]; 		} 	} 	for(i=0;i<n;i++) 	{ 		for(j=0;j<=i;j++) 		{ 			cout<<a[i][j]<<" "; 		} 		cout<<endl; 	}  	return 0; }


Question: 刚重装了64位win7系统，刚装c。调试一直都是出现这个。请问一下，该怎么做。谢谢大家。

？？？在线急等。谢谢各位。

引用 9 楼 寻开心的回复:dev c++ （腾讯电脑管家 -- 软件管理 - dev c++。50MB左右） visual studio 最新版  （ https://blog.csdn.net/qq_43058685/article/details/96837923  ） 谢谢，一下就好了。我磨了一上午没装好VC6.0

引用 7 楼 寻开心的回复:VC 6.0 ?  太老了，兼容性不好， 换编译器吧。 帅哥换哪一个合适点？！

VC 6.0 ?  太老了，兼容性不好， 换编译器吧。

这样的话你也可以修改读写权限，不是非常重要的文件还是比较容易修改的，至于怎么改就需要查一下了，win7不太熟悉

好的。安装的时候他提示过有几个只读文件，无法写入，我点了重试，就通过了。估计就是这里。

sorry，说错了，洋文~~他说的是没有在这个文件里找到相应的信息  还是上网一查比较容易，不过这样也不排除是编译器的问题，可能编译器在安装时需要向这几个文件里写入什么  如果网上找不到的话可以先试试换个编译器，看看有没有效果

系统里有这两个文件的。

首先，int main return 0，不过和你的问题关系不大  问题是缺少一些dll文件，看路径是系统里少了点东西，重装编译器是没用的，你可以在网上搜一下这几个文件，应该容易找到弥补办法，大概再装个什么东西就可以搞定了


Question: 来自C语言基础萌新的问题

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 2 楼 寻开心的回复:if (x=0) 这个不是判断是赋值，  要if （ x == 0 ） 懂了，十分感谢。已经明白了

if (x=0) 这个不是判断是赋值，  要if （ x == 0 ）

最好加上括号，不然自己也会懵逼


Question: 求告知

把你写的程序贴出来看看就知道了，肯定是你的程序有错

多半是你写错了，这个就是用到循环里的

哦哦，不好意思，没看到，谢谢

printf("enter the first score");     while(scanf("%f",&score)==1);     {         if(score<MIN||score>  while那行，最后放个分号， 是怎么个意思  删了那个分号

这是我打的程序，还是不行

#include<stdio.h> int main(void) {     const float MIN=0.0;     const float MAX=100.0;     float score;     float total=0.0;     int n=0;     float min=MAX;     float max=MIN;     printf("enter the first score");     while(scanf("%f",&score)==1);     {         if(score<MIN||score>MAX)         {             printf("%0.1f is an invalid value.try again:",score);             continue;         }         printf("accepting %0.1f:\n",score);         min=(score<min)?score:min;         max=(score>max)?score:max;         total=total+score;         n++;         printf("enter next score:");      }     if(n>0)     {         printf("average of %d score is %0.1f.\n",n,total,total/n);         printf("low=%0.1f,high=%0.1f\n",min,max);     }     else         printf("no valid scores were entered.\n");     return 0; }


Question: 求大神告知


Question: 帮我看看我的按照学号排序程序有什么问题？怎么没有输出？

%s都要换成%c %s是输入字符串， %c才是输入一个字符 put_name函数scanf("%c", &a[i]); 否则，10次输入名字都是用后一个覆盖前一个，最后保留的只是最后输入的字符串而已  按照道理，应该是 char   name[10][20] 这样的定义才能支持长的名字  没有输出是因为paixu函数printf那里%s格式，但是参数a[i]是char，类型不匹配造成指针不对


Question: 一道程序题的疑问求助

奇数行以num开始，逐个++，偶数行以num+i开始，逐个--。依次输出

引用 2 楼 Brown_IT小白 的回复:#include <stdio.h>  int main() {     int count;     int i, j;     int num = 0;     int temp;      printf("Please input the array size:");     scanf("%d", &count);      for (i = 1; i <= count; i++)     {         temp = ((i % 2) ? num : num + i);         for (j = 1; j <= i; j++)         {             (i % 2) ? printf("%d", ++temp) : printf("%d", temp--);             (j < i) ? printf("*") : printf("\n\n");         }         num += i;     }      return 0; }  能说一下思路吗

#include <stdio.h> #include <stdlib.h> //  从iStart开始，输出len个数，按照nWay=1从小到大，nWay=-1从大到小输出一行 int printLine (int iStart, int len, int way) {     int j;     if ( way ==1) {         for ( j=iStart; j<iStart+len-1; j++ ) printf("%d*", j);         printf("%d\n", j);     } else {         for (  j=iStart+len-1; j>iStart; j-- ) printf("%d*", j);         printf("%d\n", j);     }     return iStart + len; }  int main(){     int iStart = 1, nWay = -1;     int j, n;     scanf("%d", &n);     for ( j =1; j<=n; j++ )         iStart = printLine(iStart, j, nWay*=-1);     return 0; }

两层循环直接控制输出就行呀


Question: 有序数组中插入一个数  不改变排列

好的  做出来了  谢谢了

引用 1 楼 寻开心的回复:a是字符数组 读入的是整数， 往字符数组里面插入一个整数？？ 先统一了数据格式再说  而且，a数组你也没有初始化，里面都有什么？怎么就是已经排序了的数组呢， 这步还没有呢！  int a[] = {1,3,5,6,8,10}; 读入int类型的m 然后才是你的这个算法，而且你这里有没有考虑a数组当中有很m一样大的数的情况 要求的是自己输入的有序数组  需要区分从大到小排序与从小到大排序

那你就自己scanf输入呗， 没有这个已经存在的有序序列， 什么也做不了啊


Question: 一道选择题求助

编程被搞成了律师，尽搞抠字眼的问题了

很明显是d，保护的成员不行，私有可以通过友元外部访问


Question: （C语言）请问我的这个程序是怎么错了

delta = b * b -4 * a * c; 这句放在输入之前，用的是变量的随机值计算的，结果无法确定，应该放到 scanf("%d"), &c; 这条语句之后  scanf("%d"), &a; scanf("%d"), &b; scanf("%d"), &c;  这几句输入语句写错了,应该是 scanf("%d", &a); scanf("%d", &b); scanf("%d", &c);   else if (0 == delta)  浮点数不能直接用“==”号比较，判断其是否与某个数相等，应该用两个数相减所得的值取绝对值是否在误差范围内，你可以这样写 else if(fabs(0 - delta) < 0.00001)，这里的0.00001就是你的误差允许范围

你这输入输出可以精简一波

引用 3 楼 qybao 的回复:强行转换一下  0==（int）delta 这样强行转换也不精确，最好是有个精度判断，比如delta<=0.00000001之类的

强行转换一下  0==（int）delta

引用 1 楼 真相重于对错 的回复:浮点数不能与0直接比较请问怎么改？

浮点数不能与0直接比较


Question: (合并顺序表)为什么在oj上输出的结果和本地不同？

注意内存泄漏，把不该有值的地方都弄成null，链表做oj题目的通病


Question: 指针，请大佬指点

好的好的，十分感谢

要看单词是怎么定义的啦，那些字符可以包含进入单词， 此外的是否都算作是分隔符 int num(char *str) {     int flag = 0; int count=0;     for ( int j=0; j<strlen(str);  j++ ) {         if ( str[j]<'A' || str[j]>'z' || (str[j]>'Z' && str[j]<'a') ) // 不是组成单词的字母都视为分隔符             flag = 0;         else {             if ( 0==flag ) {  flag=1; count++; }             //  遇到第一个能组成单词的字符的时候单词计数加一         }     }     printf("%d\n", count);     return count; }

这种情况还真没有考虑，应该怎么改呢

不光是逻辑运算的优先级，逻辑也不对，比如 输入 a1b 按你的逻辑会得到2个单词（如果这是期待结果那无话可说，如果这个不算单词，那逻辑就是错的） a进入for满足while，i++字符变为1满足if，count就累加一次，然后i++字符b进入for，满足while，然后i++字符变为结尾满足if，count累加变为2，之后还没退出循环（i没到达80），所有后面如果有垃圾信息也会导致统计结果不对

问题好像解决了，应该是main函数的a[80]没有初始化，好神奇

引用 5 楼 寻开心 的回复:逻辑是有问题 while和if如果是判断是否是字母的话，要考虑考虑优先级的问题， 需要补充上括号，要不&& 和 ｜｜同级，都从左到右执行 而且也无法区分是否字母开头，以及是否字母结束的情况 #include<stdio.h> #include<string.h> void num(char *pc) { 	int i=0,count=0; 	for(i=0;i<80;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++; 			} 		} 	} 	printf("单词个数 = %d",count);  } int main() { 	char a[80]; 	puts("输入单词:"); 	gets(a); 	num(a); }   是改成这样吗

引用 6 楼 user-2 的回复:那不应该啊，把它改成指针试试 #include<stdio.h> int main() { char a[80]=" a b "; int i,count=0; char *p = a; for(i=0;i<80;i++) { while(*(p+i)>=65&&*(p+i)<=90||*(p+i)>=97&&*(p+i)<=122) { i++; if(*(p+i)<65||*(p+i)>90&&*(p+i)<97||*(p+i)>122) count++; } } printf("%d",count); }  如果换成这样也正确，那就证明的我的推想可能是对的 因为你的a没有初始化，可能有内存有垃圾信息，所以应该加个判断是字符串结尾符就退出循环。 这个是对的，那为什么我的第一个程序不对呢

#include<stdio.h> int main() { 	char a[80]=" a b "; 	int i,count=0; 	for(i=0;i<80;i++) 	{ 		while(a[i]>=65&&a[i]<=90||a[i]>=97&&a[i]<=122) 		{ 			i++; 			if(a[i]<65||a[i]>90&&a[i]<97||a[i]>122) 			count++; 		} 	} 	printf("%d",count); } 应该是一个道理，这个是对的，一换到指针就多了一个

对的呀

我觉得逻辑有问题啊，你确定运行结果正确吗？

没道理啊。 结果也不对 编译运行输入 a b结果输出1


Question: 判断一个数是否是素数？？

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

楼上正解，可能是超范围了

两个可能 1  数学定义1不是素数， 需要特殊处理 2. 看看原始题目要求吧，是不是n的范围超过了int的范围了

引用 1 楼 寻开心的回复:n是2的时候呢？它是不是素数 是素数，他的输出是Yes

是素数，他的输出是Yes


Question: 求大佬帮忙解答一下！！！

引用 2 楼 真相重于对错 的回复:[quote=引用 1 楼 user-3 的回复:] struct pnames treas = {"Brad","Fallingjaw"};   //这段代码中的字符串是常量，所以在静态区，结构体的指针指向了静态区的常量字符串，这样编程没问题，只是要注意常量不可修改就可以了（也就是字符串的内容不能修改）。 不太对啊！ char a[20]="12334"; a可不是在静态区，这个意思是用“12334”初始化a这个数组 如果写成 char* a="12345"，a才是。。。 [/quote] 我看错了

引用 1 楼 user-3 的回复:struct pnames treas = {"Brad","Fallingjaw"};   //这段代码中的字符串是常量，所以在静态区，结构体的指针指向了静态区的常量字符串，这样编程没问题，只是要注意常量不可修改就可以了（也就是字符串的内容不能修改）。 不太对啊！ char a[20]="12334"; a可不是在静态区，这个意思是用“12334”初始化a这个数组 如果写成 char* a="12345"，a才是。。。


Question: 算法分析的问题

引用 2 楼 qybao 的回复：这个只是统计的 i 的起点和终点的变换而已 我们设 j=i+1 (i从0到N-1就相当于j从1到N)，所以i=j-1，代入等式左边，也就是 j 从1到N，求和（N-(j-1)+1)(N-(j-1))/2，整理即可得到 (N-j+1)(N-j+2)/2，j 和 i 只是个变量的名字而已，把 j 换成 i，既可的 i 从1到N， 求和  (N-i+1)(N-i+2)/2，这个就是等式右边，所以等式左边可以转换为等式右边哦，谢谢想懵了

第一个公式里面的i都换成（i-1） (N-i+1)(N-i) = ( N-i+1+1)(N-i+1) = (N-i+2)(N-i+1) = (N-i+1)(N-i+2)

这个很明显的啊，你把n-1换成n把i换成i-1代换一下就是第二个式子


Question: 蓝桥杯C语言的程序我老出现运行错误是为什么

函数严格必须要有返回值

蓝桥杯要求必须用 int main() {     return 0; }的格式

你这样输出是截断取整，不是四舍五入

做题就先看清人家的要求

的确是四舍五入 没问题 这里不是答案错误 是运行错误  所以应该是 没有return 0  导致测评机认为程序没有正常退出  按照运行错误判定

printf是有四舍五入功能的啊 double d = 0.12345678； printf("%lf", d);  结果是0.1234568  它是“运行错误”， 不是答案错误！

printf 尾巴也不要有\n, 有的也会认为是多余的数据

int main（） {   。。。。   return 0； } 这个代码结构不要乱省略


Question: 用C语言写一个程序（IP查询系统，详细如下），谢了！有思路也行，看一下吧，谢谢了！

请问还要吗，我这边有。

utf-8转码怎么弄啊

ip地址不过是32位整数，或者把他设为4个8位整数 查询不要按字符串操作，直接用整数操做。

加油，我也想知道

编码是个问题 此外，对于这么大的数据文件， 最好预处理一遍，做个索引，定位一下1.0.0.0开始的在文件什么位置， 2.0.0.0开始的什么位置， 这样比直接搜索要快很多

先写个交互界面，然后用fopen打开文件，用sscanf判断输入的ip是否正确，fgets读取文件数据，定义个结构体将数据放进去，然后写个函数找到那一行输出，因为是UTF8文件所以中文会乱码，在网上找个转码的函数。我目前大概就做这么多。

有木有啥思路啊

湘大的？我也在写

多谢支持。看看先


Question: 求助c语言指针知识

指针类型有多种，但是他们都是内存的地址， 因此是统一的，大小是一样的 就好比门牌号， 都是统一派发的，同样的格式，只是内容不同而已  指针类型变量也是变量，当然是可以修改的， 指针的运算只有比较，和对整数的加减这样的操作

不管什么类型的指针其内存信息都是一个地址，对于32位机来说，最大寻址长度只有4个字节（一个字节8位，4个字节就是32位），所以不管什么类型的指针，都是只用4个字节的内存就足够保存一个地址信息了，也就是指针变量本身的内存只需要4个字节就可以了，所以指针类型的内存大小都一样，只占用4个字节。当然64位机的最大寻址长度是64位=8字节。

p 一开始先指向 a，然后 p++ 使得 p 指向了 a 的后一个 int (如果把 &a 看作数组，那么此时 p 指向 (&a)[1])。指针本身也是一个对象，所以可以做类似对于 a 所做的事。但是指针的运算和算数运算法则不同，对 p 的加减实质是让 p 向前/后指指定个元素，或者求两个指针间差多少个元素。不同类型的的指针所占的内存空间大小不一定相同(然而你现在能遇到的机器中，所有类型指针的大小确实一样)，所以书上的说法不准确。

引用 2 楼 寻开心的回复:看来还是没有理解指针是什么 p=&a；    a，x，p等所有的变量都是在内存当中保存，保存的具体的位置就是内存地址， 指针就是内存地址 你可以把变量地址理解成房子的门牌号，变量的内容就是房子里面的人，地址和内容是完全不同的两个概念 int a=3；   p = &a； 房子的门牌号放到p里面了，  房子里面住的是3 p++ 的意思是，就是邻居的门牌号  你可以printf("%g", p); 这种方式来输出指针， 自己写代码来看p++后指针的变化 不是只差1，具体差多少要看指针的类型 就好比街道上邻居的门牌号往往相差2而不是1一样 int 是32bits的时候， p++ 和 p相比差4 这些都可以通过自己输出p的值来查看 感谢 那就是说指针变量p也和一个变量一样可以进行计算改变他的值？它自己本身也有一个储存单元 但是书上说 不同类型指针变量所占的内存空间大小都是相同的 这又是怎么回事呢？

p++相当于 p=p+1，这里p指向了p+1的地址，所以p不再指向a的地址了


Question: 萌新求教

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 3 楼 New me的回复:flag只是用来标记的，设0/1本质上没有区别，只要可以检测出flag是否发生变化就行 那为啥前面一个和后面一个程序比较起来，后面一个可以输出等腰直角三角形

引用 1 楼 寻开心的回复:就不能把图正过来吗？！ 看着累 不是，你点击那个图，然后就变正了

就不能把图正过来吗？！ 看着累


Question: 初来乍到的小萌新，想请教大佬们一个问题。

好的，我明白了，非常感谢您的帮助！

这也是属于不确定的行为， 不要去研究了， 不同的编译器结果不同 https://blog.csdn.net/happy__888/article/details/103836384


Question:
因为病毒的缘故，所以要在家学习，可是这个代码怎么运行起来是4的无限次循环呢？想不出缘故
题目如下

引用 4 楼 寻开心的回复:交作业可以 要学习，可不能偷这个懒 好的好的 谢谢提醒

交作业可以 要学习，可不能偷这个懒

引用 2 楼 寻开心的回复:题目本意是让你移动数组里面的元素内容， 然后显示移动好的数组 你这个好， 直接显示，  投机取巧  我也是和别人学的，对啊，你说得对，我果然生疏了

if （i=n-m） 这个是赋值， 不是判断，要 == 才行


Question: 指针，请大佬指点

引用 19 楼 寻开心 的回复:指向数组的指针啊。   不扩起来意思就不一样了，那就是一个指针的数组啦  拗口 数组的指针  vs  指针的数组 嗯，谢谢

引用 16 楼 寻开心 的回复:#include <stdio.h> #include <string.h>  void sortStr( char (*name)[40], int n) { 	for (int i=0; i<n-1; i++) 		for (int j=i+1; j<n; j++) { 			if ( strcmp(name[i], name[j])<0) { 				char temp[40]; 				strcpy(temp, name[i]); 				strcpy(name[i], name[j]); 				strcpy(name[j], temp); 			} 		} } void sort1( char * str) { 	char (*name)[40] = (char (*)[40]) str; 	sortStr(name, 10); } int main() { 	char book_name[10][40]={"DON QUIXOTE","EUGENIE GRANDET","MADAME BOVARY", "THE HUNCHBACK OF NOTRE DAME","FAUSTUS","BLACK AND RED","WAR AND PEACE", "Anna Karenina","Hamlet","Resurrection"}; 	sort1((char*)book_name); 	for (int i=0; i<10; i++)  	   printf("%s\n", book_name[i]);  	return 0; } (char (*)[40]) str;请问这个是什么意思，把*()起来的作用是什么呢

引用 15 楼 ?Victor.?? 的回复:[quote=引用 14 楼 寻开心 的回复:] 非要用char *作为参数的函数形式， 那就要利用二维数组实际上也是一维数组的方式， 做一下强制转换吧。 嗯，谢谢，这个题也是很神奇[/quote] (char (*)[40]) str;请问这个是什么意思，把*()起来的作用是什么呢

引用 14 楼 寻开心 的回复:非要用char *作为参数的函数形式， 那就要利用二维数组实际上也是一维数组的方式， 做一下强制转换吧。 嗯，谢谢，这个题也是很神奇

引用 10 楼 user-2 的回复:不是=号，是逗号，复制粘贴的时候手误了 嗯嗯，对了，谢谢

引用 8 楼 user-2 的回复:或者你直接改成指针的形式不用数组的形式  f(strcmp(s+min*40, s+j*40)>0) // strcpy(temp,s+i*40); //用指针的形式代替数组的形式 strcpy(s+i*40, s+min*40); strcpy(s+min*40, temp); 这个对了，谢谢

不是=号，是逗号，复制粘贴的时候手误了

引用 7 楼 user-2 的回复:main方法调用的时候要转换一下sortStr((char*)book_name); sortStr方法里复制的时候取一下地址 if(strcmp(&s[min*40],&s[j*40])>0) //  strcpy(temp,&s[i*40]); //注意字符串复制的地址就可以了 strcpy(&s[i*40]=&s[min*40]); strcpy(&s[min*40]=temp);  还有一点小问题

引用 4 楼 user-2 的回复:[quote=引用 3 楼 ?Victor.?? 的回复:] 但题目给的是void sortStr(char *s)，这个不改的话有什么办法吗，确实指针有问题 那就做一下二维数组和一维数组的转换（因为数组的内存是连续的，二维数组也可以用一维来访问） void sortStr(char *s) { char temp[40]; int min,i,j; for(i=0;i<9;i++) { min=i; for(j=i+1;j<10;j++) { if(strcmp(s[min*40],s[j*40])>0) //一维数组和二维数组的下标关系，一维移动40个下标就变成二维的第一个元素的地址 min=j; // } if(i!=min) { strcpy(temp,s[i*40]); //注意字符串复制的地址就可以了 strcpy(s[i*40]=s[min*40]); strcpy(s[min*40]=temp); } } }     [/quote] 不好意思，又麻烦您了

引用 3 楼 ?Victor.?? 的回复:但题目给的是void sortStr(char *s)，这个不改的话有什么办法吗，确实指针有问题 那就做一下二维数组和一维数组的转换（因为数组的内存是连续的，二维数组也可以用一维来访问） void sortStr(char *s) { char temp[40]; int min,i,j; for(i=0;i<9;i++) { min=i; for(j=i+1;j<10;j++) { if(strcmp(s[min*40],s[j*40])>0) //一维数组和二维数组的下标关系，一维移动40个下标就变成二维的第一个元素的地址 min=j; // } if(i!=min) { strcpy(temp,s[i*40]); //注意字符串复制的地址就可以了 strcpy(s[i*40]=s[min*40]); strcpy(s[min*40]=temp); } } }

另外void sortStr(char *s)这里改成void sortStr(char **s) 或者 void sortStr(char *s[10])

把sortStr方法的以下代码注释掉 for(i=0;i<10;i++) puts(s[i]); 在main方法的sortStr(book_name);之后追加以下代码 for(int i=0;i<10;i++) puts(book_name[i]);


Question: 求解

数组不能一句话输出 要循环，一个个的输出

引用 1 楼 寻开心的回复:这种基础练习自己写， 错了再贴代码提问 这个怎么能让数组这样输出？

这种基础练习自己写， 错了再贴代码提问


Question: 求大佬帮忙

好的 谢谢大佬，你辛苦了

你的代码太神奇了， 改不出来， 只能让他编译通过而已 原则上，是不应该有其他函数再次调用main（）函数的， 既然你写了，就留给你自己处理吧  #include<stdio.h> #include<stdlib.h> int teacher1(); int teacher2();   int main() { 	int n;  	printf("**这是课程设计答辩预约系统**\n"); 	printf("教师请输入1，学生请输入2：\n"); 	scanf("%d", &n); 	getchar(); 	if (n == 1) 	{ 		teacher1(); 	} 	else if (n == 2) 		printf("ok\n");  	else 	{ 		printf("你的输入有误，请重新输入。\n\n"); main(); 	} }  int teacher1() { 	int i, j; 	char a[8], b[8] = { 't','e','a','c','h','e','r' }; 	for (i = 1; i != 0;) 	{ 		printf("请输入正确的用户标识：\n"); 		printf("(老师请输入teacher,学生请输入学号)\n"); 		scanf("%s", a); 		getchar(); 		for (j = 0; j < 8; j++) 			if (a[j] == b[j])  			{ 				teacher2(); 				i = 0; 				break; 			} 			else  			{ 				printf("你的输入有误，请重新输入。\n\n"); 				i++; 				break; 			} 	} 	return 0; }  int teacher2() { 	FILE* p;  	if ((p = fopen("file.txt", "w+")) == NULL) 	{ 		printf("建立文件出错\n"); 		exit(0); 	} 	struct teacher 	{ 		char time[11]; 		int a[13]; //  = { 1,2,3,4,5,6,7,8,9,10,11,12 }; // 这种初始化方法和编译器有关，支持c++11才行  		int b[13]; 	} teachers[10]; // 修改了   	int a, b, c, i, j, n, m, k;   	for (i = 0; i < 10; i++) // 修改了  	{ 		printf("请输入可预约的答辩日期：\n"); 		printf("格式为：xxxx-xx-xx(年-月-日)\n"); 		printf("(中间的横杆用减号代替)\n"); 		scanf("%d-%d-%d", &a, &b, &c); 		if (b <= 0 || b > 12) 		{ 			printf("你的输入有误，请重新输入。\n\n"); 			teacher2(); 		} 		else if (c <= 0 || c > 31) 		{ 			printf("你的输入有误，请重新输入。\n\n"); 			teacher2(); 		} 		else if ((a % 4 == 0) && (b == 2) && (c >= 30)) 		{ 			printf("你的输入有误，请重新输入。\n\n"); 			teacher2(); 		} 		else if ((a % 4 != 0) && (b == 2) && (c >= 29)) 		{ 			printf("你的输入有误，请重新输入。\n\n"); 			teacher2(); 		} 		else if (((b = 4) || (b = 6) || (b = 9) || (b = 11)) && (c == 31)) 		{ 			printf("你的输入有误，请重新输入。\n\n"); 			teacher2(); 		} 		else 		{ //			struct teacher[i];  			sprintf(teachers[i].time, "%d-%d-%d", a,b,c); // teacher1.time = { 'a','-','b','-','c' }; 			for (j = 1; j <= 12; j++) 			{ 				printf("请输入第%d时段可预约人数：\n", j); 				printf("(每节课答辩人数少于5比较合适)\n"); 				scanf("%d", &teachers[i].b[j-1]); 			}  			printf("继续设置日期请输入1，\n"); 			printf("预览预约设置请输入2，\n"); 			printf("退出本角色请输入0。\n"); 			scanf("%d", &n); 			switch (n)  			{ 			  	case 1: 				  i++; 				  break; // 修改    				case 2:  				{   			  		for (int p = 0; p <= i; p++)  			 		{ 		  				printf("%s\n", teachers[p].b[k]);   					}   					break;    					// 修改    				 }  				 case 0: main(); 				  	break; 			} 		} 	} }

抱歉，我以为全复制过来了，现在刚刚学，基础可能没打好 这是寒假作业，如果可以的话能帮我把错说一下吗。回去我一定好好再看看书

#include<stdio.h> #include<stdlib.h> int teacher1(); int teacher2();   void main() {     int n;  	printf("**这是课程设计答辩预约系统**\n"); 	printf("教师请输入1，学生请输入2：\n"); 	scanf("%d",&n);    getchar(); 	if(n==1)  	{   teacher1();  	}      else if(n==2) 	       printf("ok\n"); 	     else 		{	 		 printf("你的输入有误，请重新输入。\n\n");          main(); 		} 			   }  int teacher1()  {	int i,j; 	 char a[8], b[8]={'t','e','a','c','h','e','r'};        for(i=1;i!=0;)	  		{ printf("请输入正确的用户标识：\n");	 	      printf("(老师请输入teacher,学生请输入学号)\n"); 	      scanf("%s",a); 		  getchar(); 		  for(j=0;j<8;j++) 	      if(a[j]==b[j]) 				 		  { teacher2(); 		     i=0; 			   break; 		  }		 	      else 		 	 		  { printf("你的输入有误，请重新输入。\n\n"); 		   i++; 		    break; 		  } 		} 	   return 0;  }  int teacher2() { FILE *p;     if((p=fopen("file.txt","w+"))==NULL) 		{ printf("建立文件出错\n");           exit(0); 		}    struct teacher   { 	  char time[11]; 	  int a[13]={1,2,3,4,5,6,7,8,9,10,11,12};       int b[13];   };  	int a,b,c,i,j,n,m,k,p; 	  	for(i=0;i<0;) 	{   printf("请输入可预约的答辩日期：\n"); 	    printf("格式为：xxxx-xx-xx(年-月-日)\n"); 	    printf("(中间的横杆用减号代替)\n");         scanf("%d-%d-%d",&a,&b,&c); 	    if(b<=0||b>12) 		{	printf("你的输入有误，请重新输入。\n\n"); 			    teacher2(); 		} 		else if(c<=0||c>31) 		{	printf("你的输入有误，请重新输入。\n\n"); 			    teacher2(); 		} 		else if((a%4==0)&&(b==2)&&(c>=30)) 		{	printf("你的输入有误，请重新输入。\n\n"); 			    teacher2(); 		} 		else if((a%4!=0)&&(b==2)&&(c>=29)) 		{	printf("你的输入有误，请重新输入。\n\n"); 			    teacher2(); 		} 		else if(((b=4)||(b=6)||(b=9)||(b=11))&&(c==31)) 		{	printf("你的输入有误，请重新输入。\n\n"); 			    teacher2(); 		} 		else 		{struct teacher[i];	 		teacher1.time={'a','-','b','-','c'}; 		 for(j=1;j<=12;j++) 			{  printf("请输入第%d时段可预约人数：\n",j); 		       printf("(每节课答辩人数少于5比较合适)\n"); 		       scanf("%d",tacher[i].b[j-1]); 			} 		  		 printf("继续设置日期请输入1，\n"); 		  printf("预览预约设置请输入2，\n"); 		  printf("退出本角色请输入0。\n");           sacnf("%d",&n); 		  switch(n) 		  case 1:i++; 		  case 2: {  for(p=0;p<=i;p++) 		              { 		                 printf("%s\n",teacher[p].b[k]); 						   } 			          } 				  } 		  case 0:main(); 		} 	}   }

贴你到是贴全啊。 void main（） 要改成 int main（）  72行的错误是 int a,b,c,i,j,n,m,k,p; 这里的p，和FILE *p;重复定义了  后面还一堆别的错 刚学的基础还不会， 搞这么长的做什么啊

双击了还是不知道哪里错 可能我还有没学到的 求指点

在错误提示栏目里面双击那个提示， 能够定位到出错的行 你这种截图不放文本代码的， 这么长的图，没法看。 自己定位到72行，看看哪一行的问题吧


Question: C语言基础问题，输出结果不对，求指导

谢谢你，非常感谢。

const double CROP = 2e16；


Question: 有大佬能讲一下 这是为什么吗

不知道你的编译环境是什么。 看错误输出的描述是工程/项目不对。 新建的工程/项目的时候，应该有类型的选择的

引用 1 楼 寻开心的回复:你的工程不对，要新建一个桌面的控制台应用，然后再在里面写代码 没听懂  我是按照书上说的 新建 然后再在源文件新建  然后就开始写了

你的工程不对，要新建一个桌面的控制台应用，然后再在里面写代码


Question: c语言数组和指针问题求解

引用 4 楼 qybao的回复:你把pp改变了，又不想变回来，又想得到原来的信息，这怎么可能呢？变了就是变了，想恢复就要变回来 比如 int n = 5; n++; //n已经变成6了，你还怎么能得到原来的信息5，所以你只能变回来，要么n--，要么n=5，这一步是必须的，不是多此一举  在你这个例子中，可以不改变pp，通过i的改变来获取数组信息就好了，即取*(pp+i)，这样pp就不变，还是指向A[0]，通过pp+i，i的变化是的pp+i的地址变化，pp始终不变 这个*(pp+i),完美解决了我的问题，使指针尽量与变量地址和内容唯一对应，不然++--的次数多了，容易乱。 打印数组内容，实际上只需要计算机帮我打印一下，并不想改变指针的值。

再次让pp = A不就完了嘛！  A是数组变量， 它的地址永远不可能更改 p++跑到了尾巴，要会来干嘛非要--回来啊， 直接pp=A不就回来了嘛 还有指针不是只有p++，p-- 还有 p += 4；  p -= 8； 这样的操作，都可以大幅度的变化

引用 1 楼 qybao的回复:int *pp = A //pp指向A[0]的地址 pp++ 相当于 pp=pp+1 pp最初指向A[0]的地址，所以相当于 pp=&A[0]+1(A[0]的地址+1) 相当于 pp=&A[1](A[1]的地址)，所以pp++的结果就是pp指向了A[1] pp[0]就是从pp这个地址取下标为0的元素，因为pp指向A[1]的地址，所以下标为0的元素就是A[1] 你好，大哥，在pp++后，想通过pp访问A[0]的内容，有没有更好的办法？


Question: 请大佬指点一下

谢谢帮助

一楼正解  字符串 “123456”， 把其中的一个改成'\0'，变成。“123\056”,  那么用它再做字符串操作的时候， 它就等同于“123”了。  字符串被截断了。

字符串以'\0'为结尾，确保strcat拼接正确


Question: calloc问题和strlen

strlen  是返回字符串长度的，以char指针形式遍历， 碰到'\0'就返回

1）strlen(ST) 这个表达式在编译时就过不了吧 ？  2）从指针 ST中是无法获取 所指数据 数组元素个数。

strlen() 函数只能对字符串使用不能对结构数组使用啊，strlen(ST)会把 10 个 stu 的内容都解释成字符，只要遇到 0 就解释成字符串末尾 '\0' ，所以第一个结构的 age 成员被设置成 0 后就被strlen看成字符串末尾了。没有 for 循环由于有 testf 函数，它的 tt 成员被设置成了 0 所以字符串长度为 1。


Question: 求大佬帮助

int GetMax(int input) { int maxValue = 0;//用于储存计算过程中的最大值  int init_value = input; int a = 0;  while(init_value > 1) { if(init_value %2 == 1) { init_value *= 3; init_value +=1; } else { init_value /=2; } if(init_value > maxValue) maxValue = init_value; } return maxValue; };

用max记录当前出现过的最大n，直到n=1

按照要求写代码呗 初始最大值就是输入的值 然后每生成一步，和记录的最大值比较后并保存  自己写， 错了再贴上来代码提问


Question: 帮忙看看哪里错了

scanf("%d %d ",&a,&b); scanf("%d%d", &a, &b); 这样就好了 别在第二个%d后面留空格，给自己找麻烦


Question:
请问这里#define int datatype不是将int替换为datatype吗
那下面结构体中怎么又datatype elem[maxsize

引用 13 楼 weixin_46394248 的回复:这是为什么啊 书里面代码错了，这里应该是typedef 而不是#define

这是为什么啊

怎么正确看书 就是看那些语法规则，函数原型的说明 那些算法的原理和运行到逻辑 看懂了这些， 那些示范代码可以一行不看， 看不懂这些，看那些代码也是瞎子点灯

尽信书不如不信书！  看编程的书，要看示范代码之外的文字 ， 那些文字才是重点，  示例代码重来都不是重点 代码只是示范或者验证那些文字的内容的，读懂了那些文字再看示范 懂了那些文字，这些示范有错误你也能自己来找。  不明白算法或者代码思路的情况下直接看代码，就是瞎子摸象， 执行对了不知道为什么，错了就更不知道为什么了 根源还是在没有看书，没有正确的看书

引用 8 楼 真相重于对错的回复:它原意似乎是 typedef  int datatype; 对对对，原意应该是typedef，现在终于反应过来了

它原意似乎是 typedef  int datatype;

宏定义不需要加 ；

引用 5 楼 寻开心的回复:管他哪儿的， 编译器上不通过，就错了。 不能不信书，也不能尽信书！ 嗯嗯谢谢！！！！！！！

管他哪儿的， 编译器上不通过，就错了。 不能不信书，也不能尽信书！

引用 2 楼 寻开心的回复:顺序也翻了 #define datatype int 这样才对 我刚开始是觉得是错的，顺序反了，但是这书是文泉学堂下载的所以有点怀疑😂

引用 2 楼 寻开心的回复:顺序也翻了 #define datatype int 这样才对 这本书是清华大学的文泉学堂下载的，表示懵逼

顺序也翻了 #define datatype int 这样才对

#define int datatype 后面没有分hao1


Question: C语言通讯录管理读写出错

int main()  {  printf("\n\t\t 欢迎使用通讯录管理系统");  printf("\n\t\t 文件导入中...请稍后...\n\n\n\n\n");  system("cls"); NO=loadfile(); 缺少了这个赋值， 导致虽然正确读出了数据。 但是没有告知全局变量， 它还是认为student数组里面有效数据是0个

1 可能和你readfile后面后，没有调用fclose函数关闭文件有关系 导致write不成功没有保存  2 可能和你的student数组的管理有关系， 清理了没有保存


Question: C语言通讯录管理系统读写出错为什么？

什么是内存数据管理？

数据没了的原因未必在这两个函数上， 也有可能在你的内存数据管理上  此外感觉你这个磁盘文件组织有问题，缺少了一个有多少条记录的信息在文件当中 应该先写入一个整数，表示记录有多少条， 然后再循环写入每个记录 读的时候，先出记录条数，然后再循环读取每条的记录  启动程序后     判断数据文件是否存在， 如果有就loadfile加载到内存     如果有了记录变更就writefile到磁盘


Question: 步进电机正反转

移到单片机那个区去问？齿轮动轴不动有可能是电机坏了


Question: C语言套接字问题

引用 2 楼 寻开心的回复:sys/types.h：数据类型定义  sys/socket.h：提供socket函数及数据结构  netinet/in.h：定义数据结构sockaddr_in  arpa/inet.h：提供IP地址转换函数  netdb.h：提供设置及获取域名的函数  sys/ioctl.h：提供对I/O控制的函数  sys/poll.h：提供socket等待测试机制的函数    其他在网络程序中常见的头文件  unistd.h：提供通用的文件、目录、程序及进程操作的函数  errno.h：提供错误号errno的定义，用于错误处理  fcntl.h：提供对文件控制的函数  time.h：提供有关时间的函数  crypt.h：提供使用DES加密算法的加密函数  pwd.h：提供对/etc/passwd文件访问的函数  shadow.h：提供对/etc/shadow文件访问的函数  pthread.h：提供多线程操作的函数  signal.h：提供对信号操作的函数  sys/wait.h、sys/ipc.h、sys/shm.h：提供进程等待、进程间通讯（IPC）及共享内存的函数    建议：在编写网络程序时，可以直接使用下面这段头文件代码  #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <fcntl.h> 还有就是那个SOCKET代表什么意思呢？

引用 2 楼 寻开心的回复:sys/types.h：数据类型定义  sys/socket.h：提供socket函数及数据结构  netinet/in.h：定义数据结构sockaddr_in  arpa/inet.h：提供IP地址转换函数  netdb.h：提供设置及获取域名的函数  sys/ioctl.h：提供对I/O控制的函数  sys/poll.h：提供socket等待测试机制的函数    其他在网络程序中常见的头文件  unistd.h：提供通用的文件、目录、程序及进程操作的函数  errno.h：提供错误号errno的定义，用于错误处理  fcntl.h：提供对文件控制的函数  time.h：提供有关时间的函数  crypt.h：提供使用DES加密算法的加密函数  pwd.h：提供对/etc/passwd文件访问的函数  shadow.h：提供对/etc/shadow文件访问的函数  pthread.h：提供多线程操作的函数  signal.h：提供对信号操作的函数  sys/wait.h、sys/ipc.h、sys/shm.h：提供进程等待、进程间通讯（IPC）及共享内存的函数    建议：在编写网络程序时，可以直接使用下面这段头文件代码  #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <fcntl.h> 谢谢啊，这个结帖是怎样弄啊？

#include <sys/socket.h>   #include <netinet/in.h>   应该是这两个


Question: 请教问题，关于二级指针问题

引用 2 楼 寻开心 的回复:void initList( List ** list ) { *list = NULL };  int main() {     List * list;     List ** l = &list;     initList(l);     list = addList(list, 10); .... 谢谢！


Question: 请大佬看看这个问题

谢谢

变量在定义的时候，它的地址就已经固定了， 无伦怎样都不能改变量的地址， 只能去改变量的值！

int a； 做这个定义的时候，a 的地址就固定了， 不会再改变 int * pA = (int *) p; 这样可以

请问： 如果把int a=*(int*)p 改为*（(int*)p） = a 这样会不会改变a的地址呢

int main(){ void *p = malloc(sizeof(int));   cout << p << "\n";   // p是malloc的指针   int a = *(int*)p;     cout << &a;       // 这里输出的a的地址， 根本就不是一个东西，结果自然就不一样 }  int a = * (int*)p; 这句的作用是什么？ 把p转换成int类型指针， 然后取指针指向的的内容赋值给了a；  所以这句只是给a赋值  让p指向a的语句是。p = &a；

#include <iostream> #include <cstdlib>  int main(){     using namespace std;     void *p = malloc(sizeof(int));   cout << p << "\n";   int a =10;    p=&a;    cout << p << "\n";   cout << &a<<endl;   cout<<a<<endl;   return 0; }


Question: 求大神解答

ABCD固定才可以把直线固定，这里说他们为常量，应该是编程的时候，直接指定ABCD的值 const float A = 1.0， B=1.0f，C=1.0f, D=1.0f;  这样 float x0, y0, z0; 程序代码让用户输入x0，y0和z0 然后根据计算出d并输出的意思  代码自己写，很简单的 无非#inlcude <math.h> 用sqrt和fabs函数而已


Question: turbo c 压缩问题

引用 6 楼 寻开心的回复:turbo c 看着名字就觉得亲切， 当年就是靠它学的c语言。   Turbo C / Borland C / Visual C++ 一路过来哈哈   哈哈😁😁😁😁😁

引用 5 楼 早打大打打核战争的回复:turbo c太老了，64位系统上不能运行，还要装DOsBox，下这个吧：https://filehippo.com/download_dev-c/ 谢谢谢谢谢谢✔😁😁😁😁

引用 1 楼 早打大打打核战争的回复:怎么还用30年前的东西~~~ 大神！可不可以教我下载个turbo c

大神，可不可以给我个turbo c

引用 1 楼 早打大打打核战争的回复:怎么还用30年前的东西~~~ 我不会……我不懂啊！我想自习c所以想下个turbo  c

怎么还用30年前的东西~~~


Question: while语句判定问题

^_^楼上正解，么得毛病

判断字符是不是你输入的回车键 如果遇到了回车键，循环就结束了


Question: 数组与指针

这个程序代码是有问题的。 prinf函数里面的几个参数执行的先后顺序是未定义行为，结果会因不同的编译器而不同 要避免写这种代码 参看我的博客 https://blog.csdn.net/happy__888/article/details/103836384


Question: 为什么调试结果和运行结果不一样

你是指循环里面的最后一个x和外面的x吧，这个是因为自加的原因


Question: 一道C语言问题求解

%u 是unsigned int类型指定，在scanf当中 好好看看书，无符号整数和有符号整数的区别，就在高位上。有符号的，把最高位当作符号位， 无符号的整数把最高位当作有效数字位。  sizeof(int) 可以告诉你int是多少BYTE的，  len = 8*sizeof（int） 就是多少位（bits）  找最高位，就要用到位运算符  unsigned int flag = 1<<(len-1);   构造出来二进制的 1000 0000 0000 0000 0000 0000 0000 0000   对应的16进制就是 0x8000000 函数传入进来的unsigned int数 u ，用u和它做位运算：  u & flag  就可以判断高位是否是1了   int fun(unsigned u) {    if ( u & ( 1<<31 ) return -1 ; else return 1; }  基础知识： 数的二进制表示， 位运算。  多看看书吧

最高位用除余得到 首先是类型不同，无符号类型和有符号类型，其次是数据范围不同


Question: c语言gets()函数问题

引用 2 楼 哟呵咯游 的回复:额，那我这是编译器的问题么 我也不太懂，觉得跟编译器关系不大吧。你结尾加没加 return 0？或者 1 往后的数字确实可能是编译器在程序运行完成之后显示的什么值。要不你在 for 循环之后再加个打印换行看看啥结果。

引用 5 楼 哟呵咯游 的回复:新建数组都要初始化吗？ 我记得整型就没这个问题 整形也需要初始化的（当然除非有的编译器自动初始化了） 可以参考以下帖子，没有初始化时整形数组打印出来的信息 https://bbs.csdn.net/topics/395735254

引用 4 楼 user-2的回复:你没有初始化s，所以数组里的信息是不确定的，即s[1]不一定是'\0'  有的编译器可能会帮你初始化，有的可能不会，所以最好还是自己初始化一下 memset(s, '\0', sizeof(s)); 新建数组都要初始化吗？ 我记得整型就没这个问题

首先你使用了 cout 和 endl，这不是 C++ 么，你好像来错论坛了。另外我用codeblocks编译了一下并没有什么问题。

额，那我这是编译器的问题么


Question: 老哥们帮我看看这是怎么用的

一个写在循环里的，一个循环外面的

while外面的scanf是吸收回车键， 执行后key[i] 就是'\n' 后面的key[I] = 0 又把它覆盖掉了， 这样就可以让key作为字符串来使用了  不吸收这个回车， 那么会影响以后的scanf操作


Question: VS Code 配置C环境 编译时 no such file

最后那个划线部分可以看到，gcc命令路径错了，缺少"\"，要在设置里面改一下应该

当前文件夹里没有你那些 头文件啥的，你把头文件下载一下就行啦


Question: vs2019 打开文件操作 运行会报错

vs就是骚  建议引用那一个头文件，直接免去一切烦恼

引用 1 楼 寻开心的回复:错误提示很清楚，  fopen是不安全的用法， 要用fopen_s来替代  err = fopen_s(&fp, "filename", "r");     if(err == 0) {         printf("The file 'filename' was opened\n");     }     else {         printf("The file 'filename' was not opened\n");     } 成功了，非常感谢前辈


Question: matlab 读取excel 筛选特定值所在行代码求助

楼主解决了吗？我也遇到这样的问题了

走过路过大家看看吼，感激不尽☹


Question: 求教求教

看看scanf函数的说明，  scanf遇到回车，空格，tab等分隔符时候的处理方法 简单的说 scanf的时候，遇到用户输入回车才开始真正的读取数据， 没有回车的时候，一直等待用户输入/修改/删除输入的内容 用户所有输入的内容，系统会把他们按照输入的顺序放在内存当中，这段内存就叫做键盘缓冲区 键盘缓冲区保留了用户输入的所有的字符包括回车，甚至多行都在里面（复制，粘贴这种情况下） 除了%c（指定读取字符）， scanf在从缓冲区提取数据的时候，会把上一行输入的回车留在键盘缓冲区当中 下次读取非字符类数据的时候会自动过滤这个回车，但是读取字符类型就会把这个回车键读取出来 例如 第一行要输入一个整数，第二行要输入一个字母这种需求，就需要特殊处理 第一行输入整数，并回车；scanf获得了整数，但是回车还在缓冲区里面，如果再scanf（“%c”）就会返会你不想要的这个回车了 要过滤掉这个回车，就用getchar（） 然后再scanf的时候， 输入字母再回车，就可以正常获得输入的字母了  仔细看scanf的帮助函数吧

大致可以理解为就是读取回车符


Question: 帮帮菜鸟

y = pow（x， pow（a+b， c））  double pow（double x, double y）计算x的y次方 这个函数自己看看帮助   #include <math.h>


Question: 这里的elementtype是tree node吗

赫夫曼树第一句写 假设H->Size个权值已经存在H->Elements[]->Weight里。是不是就等价于H->Elementtype等于TreeNode。

引用 3 楼 寻开心的回复:显然不是啊。   你可以对一堆整数排序， 也可以对一堆浮点数排序， 到底对什么类型排序， 是在ElementType里面定义的 定义那里也明确了， ElementType * data;  这是一个数组。  堆排序是利用了树结构， 但是ElementType是节点里面的数据， 并不是节点啊 https://www.cnblogs.com/MOBIN/p/5374217.html， 你再好好看看吧 那insert那句解释 将新T插入最小堆。T是一个树节点，而最小堆是一个elementtype的数组，为什么能够插入。

实际使用当中哈夫曼树里面ElementType的结构应该是是      struct ElementType {               char ch;               float Weight;       }  这样的东西，每个字符，占据的百分比。  它是一个结构数据，哈夫曼树是要根据每个字符的权重不同来设置不同的编码， 权重越大编码越短 struct  TreeNode  {       ElementType data;       TreeNode *left, *right; }  这样的结构才是完整的， 否则光有weight是对谁做编码啊？！  堆排序是堆排序， 哈夫曼树是哈夫曼树，  两套伪代码都是出于各自的目的而编写的， 没有合并到一起呢  ElementType就是要排序和处理的数据的类型， 它并不是树节点， 树节点是要包含ElementType以及Left，Right这些关联关系的数据的

引用 1 楼 寻开心的回复:上面整个堆排序，下面整个哈夫曼树， 这是闹那样啊？！  ElementType往往指的是用户自定义的数据类型，任何类型都可以。  它可以是int、float、struct...  就是用来排序的数据的类型 就是insert为什么一个节点可以直接插入堆，这是不是说堆的数据单位是树结点


Question: C语言练习题求解

百度都有，练习题就自己尝试尝试吧


Question: 用函数求最大公约数最小公倍数

百度都有的，做法也很多滴


Question: if语句判定

引用 10 楼 初学小菜的回复:这个if不加括号就执行一个语句而且还是得在满足条件的时候才执行，不满足就跳过这一个语句，你的目的是想执行3个语句 明白了明白了，多谢指教。

引用 11 楼 寻开心的回复:自己把代码整理一下， 按照分号分开，一句一行 结果如下 if (intA<intB)       intT = intA; intA = intB; intB = intT;  // 0就是这么出来的  if (intB<intC) .....  第一个if语句判断不成功， 所以就执行了 intA=intB这一句，以及后面的。。。  楼上那么多层都在说让你加括号，变成 if ( intA<intB) {      intT = intA;      intA = intB；     intB = intT； } if (intB<intC) {    。。。。  这样才是完整的if要执行的思路。  看看书上的例子， 是如何写代码的， 要学习书上的编码习惯 懂了懂了，是我的思路错了还有一些细节问题，感谢纠正。

首先不执行第一个if语句，然后执行把a=b,b=t,然后执行下一个

引用 7 楼 初学小菜的回复:不是不执行…… 那是什么……………

不是不执行……

引用 5 楼 初学小菜的回复:……一步一步跑一下就知道呗 如果像你说的那样，不执行后面那几个的话，那他的结果肯定不是5 0 3，你说呢

……一步一步跑一下就知道呗

引用 1 楼 初学小菜的回复:不加花括号就执行一个，你要是三个都想执行就是用，分开别用; 是这样吗？那它的结果为什么5 0 3

引用 2 楼 初学小菜 的回复：养成良好的代码习惯，加上局面括号

养成良好的代码习惯，加上局面

不加花括号就执行一个，你要是三个都想执行就是用，分开别用;


Question: 求解，感谢

int main() { 	int i,n,m,a[1001],k=-1,b[1001]; 	scanf("%d",&n); 	for(i=0;i<n;i++) 	{ 		scanf("%s%d%d",stu[i].a,&stu[i].n1,&stu[i].n2); 	} 	scanf("%d",&m); 	for(i=0;i<m;i++) 	{ 		scanf("%d",&a[i]); 		for ( int j=0; j<n; j++) { 			if ( a[i] == stu[j].n1) { 				b[i]=j; 				break; 			}; 		} 	} 	for(i=0;i<m;i++) 	{ 		printf("%s %d\n",stu[b[i]].a, stu[b[i]].n2);	 	} return 0; }

for(i=0;i<n;i++) {        //  scanf("\n"); // 没有必要         scanf("%s%d%d",  stu[i].a,&stu[i].n1,&stu[i].n2); } 这里scanf的时候， 读取a的时候不能取地址，数组名字本身就是地址了   然后你读取m后，循环判断a[i] == stu[i].n1 这个也不对， 应该再开一个循环比对stu[j] 才对吧


Question: 一道选择题求助

private友元可以，保护的不能被外部访问，选d


Question: 求助！有关segmentation fault

引用 1 楼 寻开心的回复:scanf("%s %lf %s", a[i].name, a[i].age, a[i].tel);  age要取地址啊，  name和tel是数组，本身就是地址。 age是double类型，输入数据需要取地址的 啊我傻了现在正常了，谢谢你啊！


Question: PTA 1002 A+B for Polynomials 为什么测试点2过不了？

直接怼哈希表 再逆序排序一下 #include<iostream> #include<map> #include<string> using namespace std; int main() {     map<int,double> fp;     int T=2;     while(T--)     {         int n;         cin>>n;         for(int i=0;i<n;++i)         {             int a;             double b;             cin>>a>>b;             if(!fp.count(a)) fp.emplace(a,b);             else fp[a]+=b;             if(fp[a]==0) fp.erase(a);         }     }     int size=fp.size();     cout<<size;     map<int, double>::reverse_iterator it;     for(it= fp.rbegin();it!=fp.rend();++it)     {         cout<<" ";         cout<<it->first<<" ";         printf("%.1lf",it->second);     }     return 0; } ```c++    ```

引用 1 楼 初学小菜 的回复:一看就是数组越界了，你往大开开不就行了 额，我第一次的代码我觉得不会数组越界。K就10个，while判断里也不会越界啊，我不大会用c++，能跟我详细说下吗？

一看就是数组越界了，你往大开开不就行了

引用 6 楼 初学小菜 的回复:你可以参考一下，做oj题目不建议这么开动态数组，要不就是静态要不就是stl 嗯嗯，你说的对，我正在学着改，谢谢你的回复

引用 3 楼 寻开心 的回复:while (i < k1 || j < k2) {         if (j == k2 || n1[i] > n2[j] ) { 当  j <k2， i==k1的时候会如何？    while条件满足       if 的第一个条件不满足，会执行第二个条件的判断：   n1[i]>n2[j]       此时i为k1， n1[k1] 越界了  类似的 i<k1,  j==k2的情况也会越界  这就是while语句里面的 || 条件的锅; 你的第二种写法就没有这个问题了 你是对的！！是我的判断写错了

你可以参考一下，做oj题目不建议这么开动态数组，要不就是静态要不就是stl

#include <iostream> #include <iomanip> using namespace std; double a[1005]; int main(){ 	int n,k,x,m,count = 0; 	double y; 	cin>>m; 	for(int i = 0; i < m; i++){ 		cin>>x>>y; 		a[x] += y; 	} 	cin>>m; 	for(int i = 0; i < m; i++){ 		cin>>x>>y; 		a[x] += y; 	} 	for(int i = 0; i < 1001; i++){ 		if(a[i] != 0) count++; 	}  	cout<<count; 	for(int i = 1001; i >= 0; i--){ 		if(a[i] != 0){ 			cout<<" "<<i<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<a[i]; 		} 	} 	return 0; }

测试点2过不了，应该是当系数为负数是你的代码输出不了，你可以试一下


Question: 【求助】realloc函数错误

引用 1 楼 user-1的回复:把realoc后面的*sizeof（int）刚到realoc的括号里，即改为LISTINCREMENT*sizeof（int） 解决了，谢谢大佬


Question: 一道C语言问题求解

指代和内存占用不同，int:定义整数类型变量的标识符。需声明无符号类型的话就需要在类型前加上unsigned。

int fi(unsigned int i) { 	return (int)i > 0 ? 1 : -1; }


Question: 八皇后问题

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 4 楼 user_qym 的回复：送你一个AC代码: #include<bits/stdc++.h> using namespace std; int g[15],cnt,lx[35],ly[35],k[15],n; void dfs(int x) { 	if(x>n) 	{	 		cnt++; 		if(cnt<=3) 		{ 			for(int i=1;i<n;i++) 				cout<<g[i]<<" "; 			cout<<g[n]<<endl; 		} 		return; 	} 	else 	{ 		for(int i=1;i<=n;i++) 		{ 			if(!k[i] and !lx[x-i+n] and !ly[x+i]) 			{ 				k[i]=1; 				lx[x-i+n]=1; 				ly[x+i]=1; 				g[x]=i; 				dfs(x+1); 				k[i]=0; 				lx[x-i+n]=0; 				ly[x+i]=0; 				g[x]=0; 			} 		} 	} } int main() { 	cin>>n; 	dfs(1); 	cout<<cnt; 	return 0; }谢谢哦～

哦不对，这个是全局变量的问题sorry，我用得不熟练就搞错了

我后来又改了，是一处语句位置出了问题，多谢啦

你可以看一下我写的八皇后，对比一下，我觉得可能是没记录走过的位置，回朔的时候没释放走过的位置，你这个条件太多可能漏写


Question: 【二进制漏洞相关】fscanf读取shellcode时遇到0x0A时读取停止

这也牵涉到文件的存储格式， 二进制文件格式是要明确的知道这种数据的长短的，你不能放一个非固定长度的数据到二进制文件里面去 字符串这种数据二进制保存的时候，都是先写入一个整数，表示字符串的长度，再写入对应长度的数据。这样二进制读取的时候，先读区出长度，再读区指定长度的数据放到字符串里面去的。

二进制文件，你就不能用fscanf这种命令，要用的是fread，读取固定的长度进来

fscanf（或者fgets）和scanf的区别就是， scanf不会把回车读入， fscanf会把回车读入的 最简单的办法，把读入的字符串用strlen计算一下长度，然后把最后的一个字符用'\0'替换就好了

修改你的 shellcode。fscanf 的限制是没法改变的，除非你可以直接获取该进程内存的读写权。

引用 1 楼 真相重于对错的回复:想一下当你用scanf时候 scanf("%d %d",&a,&b)是怎么输入的？靠什么来决定两个数的哪个是哪个？ 靠的是分隔符，空格可以作为分隔符。因此你不要用fscanf获取，而用fgets 额。。目前思考是源码改不了的情况，他那边就是先fopen文件然后用fscanf输入字符串的


Question: 救救孩子吧，分数都给你

这怕不是寒假作业吧  这类玩意在市场上还是明码标价的，没人会为了没用的分数特地给你写的，除非是真的闲  自己写写看吧，有具体问题再问


Question: 蓝桥杯2016年本科b组第六题，想用一个递归去写结果和正确答案不一致

0~9，你是不是弄成1~10了，

老哥厉害，我太粗心了，忽略了它其实是十个数字

递归提前结束了 if(num1==10) //这里应该改成num1==11，因为要排10个数，你main方法是从1开始排的a[i][j]=1;，排10个数的话num1最终要变到11才算10个数排满 更直观一点的做法就是把数组的0都初始化为-1，然后main从0开始a[i][j]=0;，每次排完还原成-1，这样的if(num1==10)用10就可以了


Question: 5647: C实验题：玩命的复读机  结果对了 但是总是runtime error

感谢！！！！！

void fdj(char *p) {     char * q = p；     for(p;*p;p++)     {         printf("%c",*p);     }     printf("\n");     free(q); }  或者 void fdj(char *p) {     printf("%s\n", p);     free(p); }

指针我刚刚学 虽然懂了你们说哪里错了 但是改不来，正确的程序能看看吗，我不知道怎么回复你们，这个网站还不会用.....

for(p;*p;p++) 这里p变了 free(p); //所以这里释放的内存地址就不对了

要不就不要修改 p，直接 printf %s，要不就保存原始指针的副本，然后再 free，不然肯定出错。


Question: 求助，为什么这样输入输出字符串不报错

引用 1 楼 qybao的回复:数组就是一片连续的内存地址，scanf只是把你输入的字符串（%s形式）存入了数组首地址开头的这块内存，所以只要这片内存合法，就可以输入。 换个方式来讨论，比如 int a = 5; char *c = (char*)&a; scanf("%s", c); //字符指针接收输入字符串，这样你就没问题了吧。但其实这个字符指针指向的是int的地址，这个和你用int数组接收字符串是一个道理，就是往一块内存区域保存输入内容 很详细，十分感谢，我明白了！

这种操作叫做未定义行为，其最可怕之处在于：它是错的，然而它有时候就是不发作，但一旦发作，一般都很要命。所以请规范编码。


Question: 关于C语言scanf语句的疑问

不一样的，如果是整数形式，输入非整数，直接就返回文件结尾，所以拿不到输入结尾的 当然如果输入缓存没被清空（stdin没有fflush）的话，所以你可以继续读取字符getchar之类的来获取输入字符，最终也能拿到输入结尾

引用 1 楼 user-1的回复:可以的 对于字符的输入结尾结尾来说一般是'\n'换行符，对应的ascii码是10 文件结尾符是EOF，可以通过scanf的返回值来直接获得，输入结尾符只能在输入字符串的字符里获得，也就是要判断数组元素是否为'\n' 如果输入的是整数的话，文件结尾与输入结尾一样是吗？


Question: 求助！大佬们用c就行

引用 2 楼 qybao 的回复：题目要求不够严谨吧，如果k=n-1，那么留哪个？因为不管留哪个，最大值和最小值都是自己，差都为0k=n-1，这没问题啊。题目要求输出差值，这个情况输出0。

引用 2 楼 qybao的回复:题目要求不够严谨吧，如果k=n-1，那么留哪个？因为不管留哪个，最大值和最小值都是自己，差都为0 学长出的题，当时也是这样说的，所以默认少于n-1

引用 1 楼 初学小菜的回复:是没有思路嘛？还是就想要代码呢 代码。。。。。。。。

是没有思路嘛？还是就想要代码呢


Question: c语言switch不管执行哪个case都会执行到default

scanf函数返回的是成功输入的个熟,不是传进去的东西

在这回答一下，刚才也遇到了，方便后人查看吧。scanf确实有读取缓存的问题，会把回车当做下一个循环输入的值，所以可以在scanf下一句加个getchar();来吃掉这个缓存区的回车，有效解决了case与default同时输出的问题。

引用 7 楼 qq_46239680 的回复:[quote=引用 3 楼 gouyanfen 的回复：]明显scanf的问题，你输入了一个字符，第一次读入了这个字符，循环第二次读入了你输入的回车符，所以你每次输入X回车，循环了两次 解决办法进入switch后清空缓冲或者不用scanf用getch我试了两种办法 都可以解决我刚刚的问题 [/quote] 有用及时结贴，谢谢

引用 3 楼 gouyanfen 的回复：明显scanf的问题，你输入了一个字符，第一次读入了这个字符，循环第二次读入了你输入的回车符，所以你每次输入X回车，循环了两次 解决办法进入switch后清空缓冲或者不用scanf用getch我试了两种办法 都可以解决我刚刚的问题

我刚刚试了getchar效果是一样的

引用 4 楼 qq_46239680 的回复:请问如何清空缓存啊 我试了getchar但是有些字母变成了乱码 我说是用getch不是getchar两个是不同的函数getch不需要回车就会返回。 请空flush(stdin)

请问如何清空缓存啊 我试了getchar但是有些字母变成了乱码

这有啥区别吗 不都是返回default里的值吗 ch会不会也是不管怎么样都执行一次

你为啥不printf ch一下


Question: C语言if问题

a/b那里有问题，这里是整除了，你可以乘一个浮点数进行运算

引用 1 楼 初学小菜的回复:那就说明sum只满足if那个条件呗 不不不，就是怎么换都是只输出ok

那就说明sum只满足if那个条件呗


Question: 为什么运行结果不完整？

谢谢

如果只是要反转，用不到true==1 这些判断啊 。也无需判断n是否为偶数。 完整的题目要求是什么呢？ 只是把输入的n位整数反转的话，一个循环交换就可以了 for ( I=0, j=n-1; I<n/2; I++, j-- ) { int temp =a[I]; a[I]=a[j]; a[j]=temp; };   可能需要考虑的只是，100这种数倒过来是001，还是要当作1输出呢

for(int i=n;i>n/2;i--) {.  // i要从n-1开始，否则 a【i】就越界了


Question: c语言练习题求助：有关二维指针存储多行文本以及动态分配问题

求助：多⾏⽂本⽤char** text来进⾏存储，使⽤动态分配内存为其开辟内存空间，避 免内存空间的浪费。 在遍历的过程中，保障性能⾼效。 要如何实现


Question: c语言小学生求帮助

main尽管是主函数，但是也是函数，作为函数基本格式是：函数返回值类型 函数名（参数列表）{函数体} 例如：int main（） {     return 0； } 没有返回值可以是void（当然c中是这样，c++就要求是int main了）

int  main()


Question: 请大佬瞧一瞧，我有点懵

引用 5 楼 寻开心 的回复:达标了 还可以这样 int *p = a+k-1;                 // p就是&a【k-1】 也就是第k个元素 while ( p < a +n -1) {       // p没有到最后一个元素    *p = *(p+1);    p++; }; *p = 0; // 最后一个用0填充就更好了 谢谢

okk,谢谢大佬帮助

从思路或者功能上来说是对的。这是实现方式的问题，题目要求用指针，我的理解是用memcpy之类的方式来完成，你现在的方式还是相当于数组遍历，指针的意义不大。 另外，pi[i]=a[i+1]; 这里会造成数组越界（i=9时，i+1=10）  我理解的做法是 输入k，判断k是否在0-9之间，不在则结束程序（提示删除位置不对） 如果k==8，则直接舍弃最后一项（也就是打印前9项），如果k<8，则memcpy(&a[k], &a[k+1], (9-k)*sizeof(int)) ，然后打印前9项

引用 1 楼 寻开心 的回复:功能是对的， 但是不是用的指针，而且也应该在原来的数组里面删除，不要借助另外一个。 #include<stdio.h> int main() { 	int a[10]={1,2,3,4,5,6,7,8,9,10}; 	int i,k,n=10,*p=a; 	printf("input k="); 	scanf("%d",&k); 	for(i=k-1;i<n;i++)    		*(p+i)=*(p+i+1);         n--; 	printf("After delete:\n");     for(i=0;i<n;i++)          printf("%d ",a[i]);     return 0; } 请问这次可以吗？


Question: 求助,为什么程序逐步调试的结果和直接运行的结果不同

srand(time(NULL)); 从create函数里面拿出来，放到main函数里面第一条去执行  整个程序当中srand函数只需要调用一次就好了  运行的时候， 执行很快， time（NULL） 返回的都是同一个值， sround初始化的结果就相同 调试的时候， 一步一步走， time（NULL）返回的值就不同，所以结果会不同 ps time（NULL）返回的是当前到1970/1/1/0:00时刻的秒数，作为随机数的初始化种子使用

srand 的时机错了，导致每次播种的种子都是一样的，所以结果不随机。


Question: c语言基础问题，请大佬们指点

好的，明白你的意思了

用你原来main方法 void main () {     int i;     int arr[10]={0}; int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};      msdradix_sort(crr,0,9,6,1);     for(i=0;i<10;i++) { printf("%d",crr[i]); //这里换成打印crr，你就能理解我说的是什么意思了 printf("\n"); } }

我都说了，你的排序方法msdradix_sort(int arr[],int begin,int end,int w,int in) 的参数arr就是个传入传出参数，排序结果就保存在参数arr里，如果你只是希望arr和crr不一样，那最简单的方法就是 void main () {     int i;     int arr[10]={0}; int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};     memcpy(arr, crr, sizeof(crr)); //把crr复制给arr      msdradix_sort(arr,0,9,6,1); //直接用arr作为参数，因为排序结果就保存在arr里     for(i=0;i<10;i++) { printf("%d",arr[i]); printf("\n"); } }

补充一下，我想将crr这个数组作为参数输入函数并得到一个名字不一样的排序结果arr

排序结果是arr呀，怎么是crr

你的arr都没用到，也没传到排序方法里 看排序方法，好像排序好的结果也是存在crr，那你直接打印crr就好了


Question: 求大佬看看

试一试用getchar()换_getchar()?  参考链接


Question: if嵌套语句执行顺序

是的，就是这么回事，除非第一个if后面有花括号把它后面的内容括起来，否则跟第二个if没关系

引用 1 楼 user-1的回复:哪有if嵌套？ 第一个if是独立的 第二个if和else if和else是一套的 这么说那第一个if成立也执行第二个if，不成立也执行第二个if？


Question: 输入问题

<CR>应该是windows 上的enter了，按照这个情况来看  参考链接


Question: C语言关于strcpy函数的问题求解

好好查看文档说明，理解一下strcpy的参数的意义 拿你的例子来说 aaaccc （开始的字符串） pq（当前指针的位置，p对第一个a，q对第二个a） printf("%s\n", q);打印q地址开始的字符串就是 aaccc（从第二个a开始打印） 到这里没问题吧 strcpy(p,q); 就是把q地址开始的字符串拷贝到p地址开始的内存里，也就是把 aaccc 拷贝到 第一个a开始的位置 所以拷贝后的内存为 aaccc pq（p和q地址不变，但字符串往前挪了） printf("%s\n", q); p和q的位置没变，打印q地址开头的字符串就是 accc  也就是p和q的地址不变，但字符串的往前挪了一个位置，所以q就相当于指向下一个字符串元素

好的我明白了。一开始没注意


Question: devcpp 调试中的[下一步]按钮不亮

应该不会，发个图看看，是不是哪弄错了

引用 1 楼 與蘤舊縐的回复:打断点，点调试 你还没开始调试呢，哪来下一步 点了断点和调试了 它仍然是灰色的）

打断点，点调试 你还没开始调试呢，哪来下一步


Question: 求解

我怎么觉得这是物理学的追及问题，一只蛙在x位置以速度为m向西行走，另一只蛙在y位置以速度为n向西行走，问两只蛙何时能追及？ 只要两个速度不一样，必然能追上，把速度快的放在后面，速速慢的放在前面（因为只有速度快的追上速度慢的），两者的初始相聚距离为（假设x在前，y在后，即x>y），如果速度快的在前则相距为 L+x-y(相当于要多绕一圈才追上)，如果速度快的在后，则相距为x-y，根据物理的追及公式计算就可以了 所以 只要 m!=n 并且 (x-y)%|m-n| == 0 或者 (L+x-y)%|m-n| == 0就可以追及 追及时跳跃次数为 (x-y)/|m-n| 或者  (L+x-y)/|m-n|


Question: codeblacks

最简单的方式就是用其他IDE吧，比如VS Code ， dev之类的


Question: 各位大佬，请问这个怎么改

嗯，问题解决了，谢谢

double root(double n, double p, double q, double r, double t) {     double f = 1.0;     for (int i=0; fabs(f)>1e-5; f=(p*pow(n,3)+q*pow(n,2)+r*n+t)/(3*p*pow(n,2)+2*q*n+r), n-=f, i++);     return n; }  这里要有个初始化， 否则。 fabs(f)>1e-5 这个条件就没有成立


Question: C语言if问题

while(i<b){ //是不是该对b做一些限制， c=s[I]; //否则b大于6，一直猜不中的话s就会数组越界 另外，a后续都没用到，特意输入a有什么意义吗？

#include<stdio.h> int main() { int a,b,i=0,c; int e; int count=0; scanf("%d%d",&a,&b); int s[6]; for(e=0;e<6;e++){ scanf("%d",&s[e]); } while(i<b){ c=s[i]; if(c==b){ break; } else{ if(c>b){ printf("Too big\n"); } if(c<b){ printf("Too small\n"); } i++; }  count++; } if(count==1) printf("Bingo!\n"); else{ if(count<=3&&count>1) printf("Lucky You!\n"); if(count>3&&count<=b) printf("Good Guess!\n"); if(count==0) printf("Game Over\n"); }  return 0; }

我知道哪的问题了，谢谢你们

既然if条件无伦是否满足都要执行，那干嘛还要if啊， 去掉if呗， 直接执行拉到

代码贴出来看看

那多半是你写错了


Question: c语言指针问题

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

解引用空指针。

*q = NULL; //q是空指针（也就是p指向一个无效的地址），所以 *q = *(p+5); //这里会发生空指针错误（也就是不能往p指向的地址里写信息）


Question: 请问为什么这个for循环只执行了一次鸭

循环条件s<x， 就看你x输入了什么了，因为第一次循环后，s=s+f 增大了，s可能就不满足循环条件了。 另外，n最好初始化为0，否则n有可能统计的不对

循环的判断条件问题

scanf 的输入格式， 好好看看。  指定的格式， 和后面配合的变量之间类型必须匹配， 不匹配获得的结果就不对  你的代码用lf格式，要求的就是一个double类型的地址， 而x是long double doube 是64bits的浮点数，  long double 是128bits的浮点数，  他们不匹配  所以，你输入的是4.3， 实际上x获得的结果还是0呢

#include<stdio.h> int main() { long double x,f=2; int n;  // 这里没有初始化，应该是int n=0； scanf("%lf",&x); // lf是double， Lf才是long double； x和f没有必要long double， double足够了 // lf 和 long double 搭配， 输入的x就不是你想要的。  这里增加一个printf函数，你能看到输入的4.3，变成了0   for(long double s=0;s<x;n++) { s=s+f; f=f*0.98; } printf("%d",n); }

输入4.3，输出的n为什么为0鸭


Question: notepad++配置c编译 出现问题

引用 1 楼 N-n-N 的回复:环境变量没有设置？看截图，成功执行gcc是在notepadproject目录下执行的你试试在其他路径下面执行成不成功


Question: 关于用指针交换两个数

那你的意思就是说他第一段代码交换了那两个变量的地址了？但实际上并没有交换。只是把变量的地址值传给了swap()。

引用 38 楼 咸鱼自翻身的回复:交换地址怎么可以用一级指针。。。要用二级指针啊。 一级指针是地址二级指针也是地址，交换的换就是地址交换了。

交换地址怎么可以用一级指针。。。要用二级指针啊。

第二个能实现但多此一举了，swap函数定义里你完全可以只用两个指针代替形参，声明一个整型变量用作中间交换

交互地址的地址用二级指针。

引用 32 楼 咸鱼自翻身的回复:想要交换地址肯定要用指针的指针啊，也就是二级指针。最重要的是函数参数的传递仅仅只是值传递，在第一段中只是把变量的地址值传过去了，而且swap（）并没有改变什么，两个变量的地址并没有被交换。你可以用printf("%d,%d",*(&a),*(&b));这个语句的输出结果与最初定义的变量a,b的值相比较来判断，如果相同则地址没交换，如果相反则地址交换了。但你的第一段的代码并没有交换地址。 是的。但是交换地址也可以用一级指针，可以参考31楼的说法。还有也可以用数组来交换。

引用 31 楼 Changerman的回复:第一个 直接 int t； 用指针运算符去做交换就可以了 是的。主要是这两段程序的对比，你可以仔细看下。

搜索  "C 语言的参数传递"

第一个 直接 int t； 用指针运算符去做交换就可以了

终于有了一个我能看懂的帖子。。。

每一个只是交换了指针，对原变量无影响。 第二个使xx，yy的内容发生了改变

就是换了xx和yy的内容，一开始xx的内容是x的地址，yy是y的地址，x的内容是m的地址，y的内容是n的地址 现在交换*xx和*yy，也就是交换了xx和yy的内容，也就是xx指向了y，那么**xx就是xx取了两次值，也就是*y，就是n，这总行了吧

引用 11 楼 與蘤舊縐的回复:是不是换了m和n的地址打印一下m和n就行，你会发现实际上是没有交换的 的确m，n没有交换，但是*xx，*yy的值变了。也就是说xx，yy的指向地址变了，跟第一段程序的效果是相同。但是第二段程序为什么会互换成功。我的疑问在这。

是不是换了m和n的地址打印一下m和n就行，你会发现实际上是没有交换的

4楼

引用 8 楼 flamesP 的回复:引用 6 楼 與蘤舊縐 的回复:*是取值符号，p=q是把q的内容赋给p，但你要知道p和q的内容都是地址而不是m和n的值，这样的交换只是换了pq的指向而已，并没有交换m和n的值这个我明白，我的疑问是 在我的第2个例子中，*a = *b; 二级指针a，b改变的是一级指针x，y的指向，为什么这个地方就能改变两个数m，n的地址，成功互换两个数字。  上面跟你讲了

你要换的是*p和*q


Question: c语言萌新来啦

编译器问题，不必纠结

c++ 当然不支持，c 语言还有可能支持，而且你书上的写法太老了，建议按 1 楼的写法写。

int main(){ …… return 0; }  你书上这种写法还真从来没见过


Question: 用穷举法（三重循环）编写C语言程序

for (int i = 1; i < 10; i++) for (int j = 0; j < 10; j++) for (int k = 0; k < 10; k++) { if ((i*100+j*10+k)%11 == 0 && i!=j && j!=k && i%k) printf('%d%d%d\n",i,j,k); }

需要三重循环吗，一重循环就好了 for (int i=123; i<1000; i++) {     if (i%11==0 && i%10 != (i%100)/10 && i%10 != i/100 && (i%100)/10 != i/100) { //整除11，并且个位!=十位，个位!=百位，十位!=百位         printf("%d\n", i);     } }

题目说的很详细了，直接写就可以呀

for ( i=11*12; i<=(1000/11)*11; i+=11)       if ( i%10 != (i%100)/10 && i%10 != i/100 && (i%100)/10 != i/100)             printf("%d\n", i);  直接从11的倍数开始判断，三位是否相同； 每次自增11依然满足倍数关系


Question: 求大佬帮我逐行逐句解释这个函数中的每一条代码是什么意思！！

char *s_gets(char *st,int n) {     char *ret_val;     char *find;      ret_val = fgets(st,n,stdin);  // 当用户键入回车后，从键盘读取内容到st当中， 最多n个字符；   // 如果输入不到n个字符，那么fgets会把回车作为最后一个字符读入进来，回车后面是‘\0’ // 如果用户输入的超过了n个字符，那么只返回前n个字符， 后面还在键盘缓冲区当中      if (ret_val)     {         find = strchr(st,'\n');  // 检查st字符串当中是否包含了回车         if (find)             *find = '\0';  // 把字符串当中的回车替换为字符串结束标记。         else             while (getchar() != '\n')    continue;             // st当中没有回车，这就是输入长度超过n的情况，那么把键盘缓冲当中的其他字符都读取出来，知道把回车也读出为止               }     return ret_val; }  这个函数就自己实现的gets_s()函数     从键盘读不超过n个字符的一个字符串，并把键盘缓冲区当中的回车符也吸收掉     如果用户输入的字符超过n个，那么也只把前n个字符放到st当中，  后面的字符全部从键盘缓冲区当中清理掉，为后面输入清理现场

引用 1 楼 N-n-N 的回复:看起来像早有没有换行看起来像找有没有换行

看起来像早有没有换行


Question: 朋友们，问个问题

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 3 楼 寻开心的回复:贴文本的代码提问比较好，  图片的看着费劲 谢谢，下次一定注意，第一次发帖子

贴文本的代码提问比较好，  图片的看着费劲

解决了，答案是a！=0

求大家帮帮忙，总共只有50分，全给出去了


Question: 求解

int m, n;     char c;     while  (T-- ) {          scanf("%d",  &m);          while( (c=getchar()) != '\n') {                 scanf("%d", &n);                 m = lcm(m,n);          }          printf("%d\n", m);     }

引用 1 楼 寻开心的回复:第二个while语句不应当存在 改为：  while(T--) {    scanf（"%d%d", &m, &n);     i = ,,,, } 就好了 还是不对呀 输出的是： 2 3 5 7 15 15 105


Question: vc++ 6.0 C语言

引用 1 楼 與蘤舊縐 的回复：+=和-=是并在一起的，不要有空格  另外C语言没有void main的写法 C99一般为int main() {return 0} C11为int main(void) {retuen 0}问题已解决 谢谢您 书上格式是这样的 三者有什么区别嘛！想请教下


Question: 求助一到简单的c语言题目

非常感谢！！！！

你这样少加了最后一项，因为最后一项小于e（题目要求），不满足for的循环条件没有进入循环体，所以漏加了 改成     double pi=0,j=1.0;     for(int i=1;;i++,j*=-1.0){         pi+=4*j/(2*i-1);         if (1.0/(2*i-1) < e) break;      }         return pi;


Question: c语言中 数组中元素个数为什么会小于下标？

引用 1 楼 與蘤舊縐 的回复：int num[4]表示定义一个int类型，长度为4的数组，该数组的下标从0开始，分别是0,1,2,3为什么题中只有一个1啊

int n[4]={1}的意思是四个元素，每一个元素都是1


Question: 这种题大佬们能看明白吗，怎么做呀呀呀

引用 4 楼 apkipa1 的回复:你百度一下编辑距离就能查到相关信息了，这里我帮你找了一些： CSDN 博客解法： https://blog.csdn.net/chichoxian/article/details/53944188 简书： https://www.jianshu.com/p/a617d20162cf 英文版维基百科，带算法： https://en.wikipedia.org/wiki/Edit_distance 谢谢谢谢

题目链接是什么意思呀

需要代码就发一下题目链接哈

哦，谢谢

题目说的很清楚了呀，直接根据题目意思写就可以


Question: C语言

在座的各位至少都会一点~~皮毛

你要干嘛呀


Question: 请求解决

引用 1 楼 寻开心的回复:隐藏不了， 这个是调试环境/IDE/VS自己模拟的一个环境，这些信息是IDE自带的  你编译出来的exe文件，在磁盘上找到它， 双击运行的时候就不会有这个提示  不用管它的 好的，谢谢帮忙。


Question: 使用#pragma once出现#pragma once in main file这个错误 （有图） 求具体解决方案

引用 8 楼 何方月 的回复:我遇到了同样的问题，虽然代码可以运行，但是看着这个警告就很难受，有没有大佬说下这个warning是咋回事，怎么解决下 这个和你用的编译器也有关系，比如我用Devcpp就有这个警告，用VS2019就没有

#pragma once和#if……是不需要同时使用的，前者可以单独起作用

不要重复导入头文件

不是这些原因

看到 Output Filename 就能明白了，你在试图直接编译头文件，于是 #pragma once 明显是没有意义的(就像在源文件里写 #pragma once 一样)，于是编译器提出警告。

这样吧 我重换个例子 刚刚那个例子要包含头文件  把方法一和方法二的头文件命名为SeqList.h 方法（一）：加#pragma once不行（去掉stdio.h无意义，当然也不行） #pragma once  #include<stdio.h>  #define MaxSize 100  typedef char DataType;  typedef struct { 	DataType list[MaxSize]; 	int size; }SeqList;  void ListInitiate(SeqList *L) { 	L->size = 0; }  int ListLength(SeqList L) { 	return L.size; }  int ListInsert(SeqList *L,int i, DataType x) { 	int j; 	if(L->size>=MaxSize) 	{ 		printf("数组已满无法插入!\n"); 		return 0; 	} 	else if(i<0||i>L->size) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		for(j=L->size;j>i;j--) 		L->list[j]=L->list[j-1]; 		L->list[i]=x; 		L->size++; 		return 1; 	} }  int ListDelete(SeqList *L,int i,DataType *x) { 	int j; 	if(L->size<=0) 	{ 		printf("顺序表已空无数据可删!\n"); 		return 0; 	} 	else if(i<0||i>L->size-1) 	{ 		printf("参数i不合法"); 		return 0; 	} 	else 	{ 		*x=L->list[i]; 		for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j]; 		L->size--; 		return 1; 	} 	 }  int ListGet(SeqList L,int i,DataType *x) { 	if(i<0||i>L.size-1) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		*x=L.list[i]; 		return 1; 	} }  方法（二）： #ifndef SeqList_H #define SeqList_H  #include<stdio.h>  #define MaxSize 100  typedef char DataType;  typedef struct { 	DataType list[MaxSize]; 	int size; }SeqList;  void ListInitiate(SeqList *L) { 	L->size = 0; }  int ListLength(SeqList L) { 	return L.size; }  int ListInsert(SeqList *L,int i, DataType x) { 	int j; 	if(L->size>=MaxSize) 	{ 		printf("数组已满无法插入!\n"); 		return 0; 	} 	else if(i<0||i>L->size) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		for(j=L->size;j>i;j--) 		L->list[j]=L->list[j-1]; 		L->list[i]=x; 		L->size++; 		return 1; 	} }  int ListDelete(SeqList *L,int i,DataType *x) { 	int j; 	if(L->size<=0) 	{ 		printf("顺序表已空无数据可删!\n"); 		return 0; 	} 	else if(i<0||i>L->size-1) 	{ 		printf("参数i不合法"); 		return 0; 	} 	else 	{ 		*x=L->list[i]; 		for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j]; 		L->size--; 		return 1; 	} 	 }  int ListGet(SeqList L,int i,DataType *x) { 	if(i<0||i>L.size-1) 	{ 		printf("参数i不合法！\n"); 		return 0; 	} 	else 	{ 		*x=L.list[i]; 		return 1; 	} }  #endif  却是可以的。 那为什么第一种方法防包含不行呢？为什么加#pragma once不行？

防包含两种方法 方法（一）：加#pragma once不行（去掉stdio.h无意义，当然也不行） #pragma once  #include<stdio.h> #include"AdjMGraph.h"  typedef struct { 	int row; 	int col; 	int weight; }RowColWeight;  void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) { 	int i,k; 	Initiate(G,n); 	for(i=0;i<n;i++) 		InsertVertex(G,V[i]); 		 	for(k=0;k<e;k++) 		InsertEdge(G,E[k].row,E[k].col,E[k].weight); }  方法（二）： #ifndef AdjMGraphCreate_H #define AdjMGraphCreate_H  #include<stdio.h> #include"AdjMGraph.h"  typedef struct { 	int row; 	int col; 	int weight; }RowColWeight;  void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) { 	int i,k; 	Initiate(G,n); 	for(i=0;i<n;i++) 		InsertVertex(G,V[i]); 		 	for(k=0;k<e;k++) 		InsertEdge(G,E[k].row,E[k].col,E[k].weight); }  #endif  确是可以的。 那为什么第一种方法防包含不行呢？为什么加#pragma once不行？

当前文件被源文件引用后应当是不需要导入stdio.h的，当然导入后是否会引起这个错误不清楚  另外.h文件容易出一些神奇的问题，如果实在不行，可以重建为.hpp文件试试


Question: 为啥两个scanf语句在输入的时候会出错啊

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

地址都没有肯定不行呀

&n,&m   少了&


Question: 麻烦大佬们帮忙看一下这个代码有啥问题

输入那里错了，加上&哈

反而指定了长度会报错

啊，我之前一直没指定过


Question: C语言结构体输入输出问题

void	main() { 	struct stu 	{ 		int num; 		char name[20]; 		float c; 	}; 	struct stu s[5]; 	int i; 	for(i=0;i<4;i++) 	{ 		scanf("%d",&s[i].num); 		getchar();            //接收回车符 		gets(s[i].name); 		scanf("%f",&s[i].c); 	} 	printf("\nNo. Name C \n"); 	i=0; 	for(i=0;i<4;i++) 	{ 		printf("%-5d",s[i].num); 		printf("%-20s",s[i].name); 		printf("%-6.1f",s[i].c); 	}  	getchar(); } 输入方式为： 1 aa 100 2 bb 200 3 cc 300 4 dd 400

{ 	struct stu 	{ 		int num; 		char name[20]; 		float c; 	}; 	struct stu s[5]; 	int i; 	for (i = 0; i < 4; i++) 	{ 		scanf("%d", &s[i].num); 		gets(s[i].name); 		scanf("%f", &s[i].c);  	} 	printf("\nNo. Name C \n"); 	i = 0; 	for (i = 0; i < 4; i++) 	{ 		printf("~%-10d", s[i].num); // 		printf("~%-20s", s[i].name); 		printf("~%-6.1f\n", s[i].c); 	} }

如果你一定要使用这个代码的话，只能这样输入 201gaoxin 79 202lingpingzhi 82 203 yuelingshan 76 以此类推

可以了,谢谢

我改了您说的问题 可输入输出的还是有问题 如图 明明我想输的是5条数据,但我要输到第六条才能执行 输出的结果也不是预期的样子

第一个问题： for(i=0;i<4;i++) { scanf("%d",&s[i].num); getchar();//这里需要加入这句，才能正常完成输入。 gets(s[i].name); scanf("%f",&s[i].c); } 第二个问题： for(i=0;i<4;i++) { printf("%-10s",s[i].num);//这里很明显不能用s，只能用d，因为你的数据类型是int printf("%-20s",s[i].name); printf("%-6.1f",s[i].c); }


Question: MQTT重连问题

问题1：因为你进程最大的fd数量就是1024啊 估计底层用的select，所有已经句柄泄露了，再创建链接fd肯定申请不出来就会是-1 啊。问题2：client 放成员变量里，就不用connect失败就去destory了

感谢提供了思路，我这也碰到相同的问题，不过没有你那个socketFd值的问题，我的是不断重连后会开启新的链接导致很多挂起的无用线程。我比较纳闷的是重连用了同样的clientId，为何不会报错呢？

我也是遇到这个问题了，重连不会释放之前的client线程，导致线程溢出，请问你是怎么解决呢？

这个搞不清楚。

代码在公司，特殊时期在家不出门，在网上求问。


Question: 这是什么神操作？

#include差不多只是简单的复制粘贴而已


Question: 前面四个头文件都没问题，然后到了源文件出现SeqList矛盾，求大神解释

没做好吧。 在每个.h的开头，马上加一个 #pragma once        (我的是c++) 你你这此文件实测，加上过后没问题，能生成

现在加一个测试迪克迪特拉斯函数也是 (第六部分Dijkstra.h) #include<stdio.h>  #include"AdjMGraph.h"  void Dijkstra(AdjMGraph G,int v0,int distance[],int path[]) { 	int n=G.Vertices.size; 	int *s=(int *)malloc(sizeof(int)*n); 	int minDis,i,j,u; 	 	for(i=0;i<n;i++) 	{ 		distance[i]=G.edge[v0][i]; 		s[i]=0; 		if(i!=v0&&distance[i]<MaxWeight)path[i]=v0; 		else path[i]=-1; 	} 	s[v0]=1; 	 	for(i=1;i<n;i++) 	{ 		minDis=MaxWeight; 		for(j=0;j<n;j++) 			if(s[j]==0&&distance[j]<minDis) 			{ 				u=j; 				minDis=distance[j]; 			} 		if(minDis==MaxWeight)return; 		s[u]=1; 		for(j=0;j<n;j++) 			if(s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j]) 			{ 				distance[j]=distance[u]+G.edge[u][j]; 				path[j]=u; 			} 	} }  (第七部分 测试迪克斯特拉函数.c) #include<stdio.h> #include<stdlib.h>  #include"AdjMGraph.h" #include"AdjMGraphCreate.h" #include"Dijkstra.h"  void main(void) { 	AdjMGraph g; 	char a[]={'A','B','C','D','E','F'}; 	RowColWeight rcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}}; 	int i,n=6,e=9; 	int distance[6],path[6]; 	 	GreatGraph(&g,a,n,rcw,e); 	 	Dijkstra(g,0,distance,path); 	 	printf("从结点%c到其他各节点的最短距离为:\n",g.Vertices.list[0]); 	for(i=0;i<n;i++) 		printf("到结点%c的最短距离为%d\:n",g.Vertices.list[i],distance[i]); 		printf("从结点%c到其他各节点最短路径的前一结点为:\n",g.Vertices.list[0]); 		for(i=0;i<n;i++) 			if(path[i]!=-1) 				printf("到结点%c的前一结点为%c:\n",g.Vertices.list[i],g.Vertices.list[path[i]]); }

不是，防包含会更混。。。错误更多

#pragma once 或者 #define .....

以上是编译器结果，求大神解答


Question: 刚学编程，怎么才能把登陆系统和登陆后的内容联系在一起呢？

fopen w 或者 a

创建文件的函数当然是有的，在向文件中写入数据的函数中添加参数，当文件不存在时先创建文件  这种情况下一般肯定是将账户信息和账户对应的数据分离开来，至于怎么联系，方法有很多，真想不出来大不了把文件名设置成用户名或用户id  进一步可以使用数据库存储数据


Question: 各路大神帮小弟瞅瞅

vc6 对浮点支持有坑，解决方案： 1. 在使用浮点数之前先初始化/赋值一个浮点对象。 2. 更换更新的开发工具，如 Visual Studio 2019。


Question: 初学C语言的一个疑惑

引用 1 楼 user-2的回复:你是想问为什么程序会输出1000吧？那你就要看函数的递归和打印的顺序了 b=x%2; f(x/2); //先递归 printf("%d",b); //后打印 也就是函数会一直调用到最后一步才会逆推回来打印 最后一步递归，f(0)，递归结束返回0，回到倒数第二步递归f(1)的printf，参数x是1，b=x%2是1，所以打印1，然后递归结束返回0，回到倒数第三步递归f(2)的printf，参数是2，b=x%2是0，所以打印0，然后递归结束返回0，回到倒数第四步递归f(4)的printf，参数是4，b=x%2是0，所以打印0，然后递归结束，回到最初的函数调用f(8)的printf，参数是8，b=x%2是0，所以打印0，至此函数f(8)调用结束返回0。 所以最终打印结果为1000 看明白了，谢谢大佬解答


Question: 请问为什么字母数是10个

好的，问题解决了，谢谢

int a,b,s,d; 首先你要初始化


Question: 同一行使用两个strlen()出现bug

strlen 返回值类型是无符号类型  j<strlen(p) 是无符号比较  如果 j 是 -1 无符号 -1 是 无符号最大数  比较结果0 退出循环  循环里面 if j== -1 这个条件无法成立  所以错误


Question: 为什么执行是这个结果？不应该啊

main的crr和jscxc_sortc的crr不是同一个东西，要么把crr声明为全局变量，要么作为参数传到jscxc_sortc

未初始化的局部变量，内容随机（运行N次，可能N次都不一样）。你的crr变量就是这种。 如果需要确定的值，需要明确初始化。  变量未初始化之前不要使用

crr未初始化，且中间未使用


Question: C++问题求助，简单程序

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

&是引用，是原来变量的别名，和原来变量是同一个地址 比如你有个名字，还有个昵称，不管叫哪个，都是你，引用能起到一个别名的作用

没看明白问题是什么？


Question: 搞不懂的输出，感觉输出不正确。新手求解。

意思是输入n阶行列式，将行列式传递到函数中，将行列式最下面一行乘对应的数加到上面各行，变成 1350 2370 5480 1341这样。


Question: C语言新生求助各位前辈

你用的fwrite，存放是二进制格式的东西，除了名字外，那些double之类的都是二进制的，所以是乱码。不碍事，只要功能对的就成了。存成可读的格式，效率差，不如你这个。


Question: 各位大神帮忙看看  递归函数求最大公约数 程序有点bug

int func(int min,int max) {     return max%min ？ func(max%min,min) ：min; //如果max可以整除min，min就是最大公约数 }

int func(int min,int max) {     return max%min ？ func(max%min,min) ：max%min; }


Question: C语言字符输入输出

感谢您的答复，非常详细，谢谢！

引用 4 楼 去死吧^爱情^ 的回复:fgets(buf,sizeof(buf),stdin);这行不太清楚 这是从标准输入（也就是控制台）接收输入的字符串，第一个参数是保存输入字符串的字符数组（或字符指针），第二个参数是控制接收输入字符的长度（一般为了安全，指定不超过数组的长度），第三个参数是输入源（也就是这个字符串从哪来的，可以从文件来，也就是文件指针，或者stdin，表示标准输入）。 当然，用gets也行，也就是gets(buf)，不过这个没有长度参数控制（输入可能会超过数组的长度），所以相对来说不如fgets安全。 具体你可以自己网上查看一下fgets或gets的文档说明。

引用 1 楼 user-2的回复:用fgets比较好吧, for example char buf[100]; fgets(buf, sizeof(buf), stdin); for(int i=0, j=0; i<strlen(buf); i++, j++)  {     if ((j+1)%3==0) printf("\n");     printf("%c-%d ", buf[i], buf[i]); } fflush(stdin);  fgets(buf,sizeof(buf),stdin);这行不太清楚

引用 1 楼 user-2的回复:用fgets比较好吧, for example char buf[100]; fgets(buf, sizeof(buf), stdin); for(int i=0, j=0; i<strlen(buf); i++, j++)  {     if ((j+1)%3==0) printf("\n");     printf("%c-%d ", buf[i], buf[i]); } fflush(stdin);  谢谢你的回复，我会参考

刚开始学习C语言，这个有点难懂。


Question: 求解C怎么实现屏幕找色功能

嗯。我也知道是遍历像素，但是不知道具体的方法 网上查了很多也没找到，难道是我找的方法不对吗。opencv是什么我也不知道，我果然懂的还是太少了 😅

用opencv。可以遍历所有像素。

HWND GetDesktopWindow() HDC GetDC(HWND hWnd)； COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)；

你遍历一下屏幕的像素不是就找到了？

不是找某点的颜色噢，是知道了某个颜色  找有没有和这颜色相似的，有就返回坐标。


Question: C语言求不等式与等式的解

引用 7 楼 GKatHere的回复:   // 推理 // 0.038f + 0.46e <= 2.56*10^9 此为直线，且其一面有效 // q = f^0.4 * E^0.6 此为曲线 //  如图，当Q越大时，曲线向直线无效方向移动，故最大Q时，当为曲线与直线的相切点 double LIM_ = 2.56e9; double getlim(double _f, double _e) { 	return 0.038* _f + 0.46*_e; } double getf(double _e) { 	return (LIM_ - 0.46*_e) / 0.038; }  double gete(double _f) { 	return (LIM_ - 0.038*_f) / 0.46; } double getq(double _f, double _e) { 	return pow(_f, 0.4) * pow(_e, 0.6); } // 此处采用 log2快速逼近 void feq() { 	double e = 0, f=0, lim, q, lastq = -1; 	double d = 1; 	int n = 0, m = 0; 	do  	{ 		n++; 		e = gete(f+d); 		q = getq(f+d, e); 		if (!d)				// double最小极限为0 		{ 			m++; 			//	如果此点处q是最大， 			//		1: 则此点为曲线直线唯一相交点，即为相切点 			//		2: 此点两侧任意点的q值必比原q小 			//		3: 如果任意一侧q值比原值大，那么此点为相交点，不是切点 			double PRI = 1e-4;		//	检测精度，太大无效，太小则double精度有限 			double fc = f + PRI; 			double ec = gete(fc); 			double qc = getq(fc, ec); 			if (qc > q) 			{ 				d = PRI; 				continue; 			} 			 fc = f - PRI; 			 ec = gete(fc); 			 qc = getq(fc, ec); 			 if (qc > q) 			 { 				 d = -PRI; 				 continue; 			 }  			break; 		} 		if (q > lastq) 		{ 			f += d; 			d *= 2; 			lastq = q; 		} 		else 			d /= 2; 	} while (1);  	printf("\n迭代次数：%d, %d, ", n, m);  	e = gete(f); 	lim = getlim(f, e); 	q = getq(f, e);; 	printf("\n正解：%e, %e, %e,%e", f, e, lim, q);  	double fe = f / e; 	double feq = LIM_ /( 0.038 *fe + 0.46) * pow(fe, 04);  	f = 3.339e9; 	e = 2.65e10; 	lim = getlim(f, e); 	q = getq(f, e);; 	printf("\n原解：%e, %e, %e,%e", f, e, lim, q); }  迭代次数：2305, 2,  正解：2.688306e+010, 3.344443e+009, 2.560000e+009,7.698139e+009 原解：3.339000e+009, 2.650000e+010, 1.231688e+010,1.157162e+010  注意：原解有误， f 与e 值大误，Q值小误 你用你的代码，然后，他没有数据哇，我在前面加了一个includemath和stdio，不然运行不了

给你一个参考思路： 在前提 0.038 F + 0.46 E <= 2.56 * 10^9 下，因为求的是 Q = F^0.4 * E^0.6 的最大值，易得 F 和 E 越大越好，那么可以转化前提为0.038 F + 0.46 E == 2.56 * 10^9，可求得 F 和 E 的关系式，代入 Q 中，得到一个表达式，可通过数学方法得知其有极值，再大致预估根的位置，然后迭代求解即可。

引用 3 楼 user-2的回复:[quote=引用 2 楼 22% 的回复:] 我不会用你说的第二个软件，我想看看C语言代码怎么写这种题，怎么得到答案 题目是什么？从你的图片里完全看不出。你应该精确地定义一下。[/quote] 就是最上面的两个式子，求最大Q值，得出下面三个结果

引用 2 楼 22% 的回复:我不会用你说的第二个软件，我想看看C语言代码怎么写这种题，怎么得到答案 题目是什么？从你的图片里完全看不出。你应该精确地定义一下。

引用 1 楼 user-2的回复:看不懂，你是想用 C 语言计算 Mathematica 表达式还是直接求解这些式子？ 我不会用你说的第二个软件，我想看看C语言代码怎么写这种题，怎么得到答案


Question: C语言练习题求解

有点尴尬，之前练习过

再来个逆推的，这个要求必须要有2个及以上的元素才行 unsigned long long test2(int iNum, int* arr1, int* arr2) {   unsigned long long lMax_2[2] = {arr1[iNum-1], arr2[iNum-1]};   unsigned long long lMax_1[2] = {arr1[iNum-2]+lMax_2[1], arr2[iNum-2]+lMax_2[0]};   unsigned long long lMax[2] = {lMax_1[0], lMax_1[1]};   int* arrTem[2] = {arr1, arr2};   for(int i = iNum-3; i >= 0; —i)   {     lMax[0] = arrTem[0][i] + (lMax_1[1] > lMax_2[1] ? lMax_1[1] : lMax_2[1]);     lMax[1] = arrTem[1][i] + (lMax_1[0] > lMax_2[0] ? lMax_1[0] : lMax_2[0]);     memcpy(lMax_2, lMax_1, sizeof(lMax_2));     memcpy(lMax_1, lMax, sizeof(lMax_1));   }   return lMax[0] > lMax[1] ? lMax[0] : lMax[1]; }

引用 20 楼 luj_1768 的回复：19楼代码可能通不过：使用的专有词太多（IMax, size, iLoop）；另外，iLoop的取值需要跟踪一下。stack<vector> sTem 改为 stack<vector<int>> sTem。 .cpp可以编译过

引用 23 楼 weixin_45826375 的回复:再来个逆推的，这个要求必须要有2个及以上的元素才行 有理，那我来个顺推法，元素个数不限  #ifndef MAX #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif  long long ftp_(const int n, const int* a, const int* b) { 	long long fp[3] = { a[0], b[0], 0 }; // a, b, 0 	for (int nn = 1; nn < n; nn++) 	{ 		long t0 = MAX(fp[1] + a[nn], fp[2] + a[nn]); 		long t1 = MAX(fp[0] + b[nn], fp[2] + b[nn]); 		long t2 = MAX(fp[0] + 0, fp[1] + 0); 		fp[0] = t0, fp[1] = t1, fp[2] = t2; 	}  	return MAX(MAX(fp[0], fp[1]), fp[2]); }

先来个计算所有的然后比较的方法 unsigned long long test1(int iNum, int* arr1, int*   arr2) {   unsigned long long lMax = 0L;   unsigned long long lTem = 0L;   stack<vector> sTem;   sTem.push(vector<int>());   sTem.top().push_back(0);   sTem.top().push_back(1);   int* arrTem[2] = { arr1, arr2 };   stack<unsigned long long> sTemMax;   sTemMax.push(0L);   int iLoop = 0;   while(sTem.size() > 0)   {     if(sTem.top().size() < 1)     {       sTem.pop();       sTemMax.pop();       —iLoop;       lTem = sTemMax.size() > 0 ? sTemMax.top() : 0L;       continue;     }     int iTem = sTem.top().back();     sTem.top().pop_back();     lTem += iTem < 0? 0 : arrTem[iTem][iLoop];     if(++iLoop < iNum)     {       sTem.push(vector<int>());       sTem.top().push_back(iTem < 0? 0 : -1);       sTem.top().push_back(iTem < 1? 1 : 0);       sTemMax.push(lTem);     }     else     {       lMax = lTem > lMax? lTem : lMax;       lTem = sTemMax.top();       iLoop = ((int)sTemMax.size()) - 1;     }   }   return lMax; }

谢谢分享学习中谢谢大家

引用 4 楼 GKatHere 的回复：题目有误，根据输入，8+4是第2天与第3天，不是第2天与第4天。 输入、输出不说了，只说算法： 因为不能两天完成同一BOSS的任务，那么头一天选取了BOSS 1，第二天必选取BOSS 2； 即是：（单数位列表 + 双数位列表 ） 与 （双数位列表 + 单数位列表 ），两者之间取最大值。 以例： 9 3 5 7  5 8 4 1， 取（9 +5） +（ 8 +1） 与 (3 +7)+(5+4)的最大值不一定，你可以第二天什么都不干然后第三天选另一个的啊

引用 14 楼 浅ღ᭄ꦿ夏࿐的回复:想知道1e9什么意思，是1到9吗？ 1en = 10^n

感觉第一个样例最大报酬只有24

想知道1e9什么意思，是1到9吗？

谢谢分享学习中谢谢大家

方便发一下题目链接吗？

路过，这题目，阔以哇

如下：要不a取 0,2,4,6,8,...., b取 1,3,5,7,9....; 要不b取 0,2,4,6,8,...., a取 1,3,5,7,9....;  int a[] = {9, 3, 5, 7 }; int b[] = {5, 8, 4, 1 }; int c = max(a[0] + a[2] + b[1] + b[3], a[1] + a[3] + b[0] + b[2])

引用 4 楼 GKatHere的回复:题目有误，根据输入，8+4是第2天与第3天，不是第2天与第4天。 输入、输出不说了，只说算法： 因为不能两天完成同一BOSS的任务，那么头一天选取了BOSS 1，第二天必选取BOSS 2； 即是：（单数位列表 + 双数位列表 ） 与 （双数位列表 + 单数位列表 ），两者之间取最大值。 以例： 9 3 5 7  5 8 4 1， 取（9 +5） +（ 8 +1） 与 (3 +7)+(5+4)的最大值 你所说的单数位列表和双数位列表是啥，好像没有学过

引用 9 楼 j: )的回复:[quote=引用 7 楼 j: )的回复:]最简单的思路就是设两个数组a、b，两种情况，a取单数下标元素b取双数下标元素，取所有值的和，另一种反过来，对比两种的大小情况就行了 lz没看懂我可以完整写出来[/quote] 好的，这样好像是错的，不一定选取相邻两条就是最大薪酬

引用 7 楼 j: )的回复:最简单的思路就是设两个数组a、b，两种情况，a取单数下标元素b取双数下标元素，取所有值的和，另一种反过来，对比两种的大小情况就行了 lz没看懂我可以完整写出来

不错不错不错不错


Question: 这是怎么了呀（初学帖）

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 1 楼 user-2的回复:已经好久没见到了赵老师了，你肯定是之前做了什么鬼畜的操作，贴出来的部分是没有问题的 系啊系啊确实这样，另一个帖子里已经晓得啦


Question: 大神们，帮忙看一下这段C函数为什么不正确？当输入大于1的数后，总是死掉

int recursion(int n) {     if（0 == n ） return 1； int z;  z=recursion(n-1)*n;  return(z); }    0! 是1，不是0哈

咳咳，上面写了个错别字，执行“不”到

楼上的意思是，你的递归执行起来，最后一步执行一到。 举个例子： 6！=6*5*4*3*2*1 int recursion(int n) { int z;  z=recursion(n-1)*n;  return(z); } 你的n=6传进去之后会做这样的步骤： z=recursion(5)*6     z=recursion(4)*5         z=recursion(3)*4             z=recursion(4)*3                 z=recursion(3)*2                     z=recursion(2)*1                         z=recursion(1)*0            ====》做到这一步的时候我们并不知道1的递归是多少，0的递归又是多少 虽然你在主函数里面定义了，但那只能说明是你输入的数字是0和1的时候输出的值是多少，在执行函数的过程中并不会回到主函数里面，只有最后把你输入的6！求完了才会继续去执行 printf("%d的阶乘是%d\n", n, c); 所以，你写的递归函数是没有出口的，运行不到最后一步。

我想可能是你没搞懂递归

主程序跟你递归有关系吗？仔细再想想

但是我主程序里面用if语句只有n大于1才调用递归程序啊？

递归没有出口 int recursion(int n) { if(n==1)  return 1; int z;  z=recursion(n-1)*n;  return(z); }


Question: PAT题，输出不了.

引用 4 楼 阿里巴巴和四十大盗滴 的回复:[quote=引用 2 楼 真相重于对错 的回复:] 程序逻辑错误一大堆 1、count 在一次循环中，加了两次 2、如果a是偶数，它等于它的一半，之后的判断有时又会执行一次，例如10的一半是5，之后if(a%2==1)又被执行，如够是a=2,那么寻魂永不结束 第二个，如果是2的话，只循环1次，我跑了一下，输出是1.[/quote] 如果你能输出1，说明你的编译器是错误的，该换编译器了

引用 1 楼 user-2 的回复:if后面用花括号{} if(a%2==0) { a=a/2; count+=1; } if(a%2==1) //其实这里用else就好 { a = 3*a+1; a=a/2; count+=1; } 代码没问题了，但是超时。

引用 2 楼 真相重于对错 的回复:程序逻辑错误一大堆 1、count 在一次循环中，加了两次 2、如果a是偶数，它等于它的一半，之后的判断有时又会执行一次，例如10的一半是5，之后if(a%2==1)又被执行，如够是a=2,那么寻魂永不结束 第二个，如果是2的话，只循环1次，我跑了一下，输出是1.

懂了，pat新手。 谢谢


Question: 用C语言求一个二维数组元素的最大值及其所在行和列

没错的，如果你想显示出正确的行列的话，那就最后一句改成printf("最大值=%d\n行号= %d\n列号= %d\n",max,row+1,colum+1);

嗯，下标是从0开始的

程序运行怎么个不正确了？行号和列号都是从0开始的，难道你期待的是从1开始算的？那就if里的row和colum都再加1就可以了。

没看出来哪里不对


Question: Easy x图形界面库的一些问题

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

引用 1 楼 與蘤舊縐 的回复:前一个建议你查一下文档，easyx安装的时候会给你安装一个说明文档，不想查也可以直接画一个画布大小的其他颜色的矩形  后一个直接把后一张图片放在需要的位置即可，还是放图片的那个函数  哦哦  感谢感谢


Question: 简单C程序，存款多种利率问题

还问个问题看到有贴子说要结贴怎么弄？

虽然有点迷糊的解决啦，但是学会了怎么调试。感谢

m的计算也可以移出去了

那么估计根本没进switch，建议你单步跟踪看一下，另外各个变量定义的时候赋初值，b和m最好赋初值

引用 1 楼 與蘤舊縐的回复:既然都是一样的，那么就直接把这两句放在switch后面，里面的全去掉 可是直接放到最后面，运行时b的值就是0，不知道为什么

既然都是一样的，那么就直接把这两句放在switch后面，里面的全去掉


Question: 求助，这个是我把问题简化出来的，就那个结构体我不能按格式输入生产日期，谢谢产日期，不会搞，谢谢

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

scanf("%d*c%d*c%d", &year, &month, &day); 这样你输入 2000-12-21  还是 2000/12/21 还是2000/12- 21都可以了 *c表示从键盘读取一个字符但是不存储到变量里面去， 所以三个数字之间你可以放任何一个字符来分割他们都可以

scanf("%d-%d-%d",&goods[i].pro_time.year,&goods[i].pro_time.month,&goods[i].pro_time.day);

提前谢谢各位的帮助了


Question: 请问	long int show_time = 1L

如同1楼解释 windows系统下 long int 和 int是一样的，都是32位的  默认输入的整数都是int，默认输入的浮点数都是double  好好看数， c语言里面的字面量的表示

就是 1转换为long 再赋值给show_time,默认1是int,这个看用什么写代码，有的不写也可以，有的不行.


Question: 帮帮忙，看看有什么问题

#include<stdio.h> #include "stdafx.h" int main() { 	int i,n,count; 	printf("欢迎来到我的系统！\n"); 	count=2; 	for(i=0;i<3;i++) 	{ 		printf("请输入密码!"); 		scanf("%d",&n); 		if(n==123456) 		{ 			printf("密码正确!"); 			break;  		} 		else  		{  			count--; 			printf("你还有%d次机会",count); 			if(count=0) 			{printf("你的账号已经被冻结！");  			} 		} 	} 	return 0; }

引用 1 楼 寻开心的回复:if(n=123456)  是  == 才对 嗯，我改了，但是无论我输入什么它都显示密码正确

if(n==123456)  因为 = 是赋值，无法完成变量与常数的比较的。

if 判断相等是 ==

if(n=123456)  是  == 才对


Question: C语言


Question: 关于c结构体初始化的问题

引用 7 楼 无敌阿晨的回复:谢谢各位 我自己改好了。。。 等我研究一下咋删。。

谢谢各位 我自己改好了。。。

引用 3 楼 真相重于对错 的回复:c语言不能这么写，你这是c++的写法  楼主的代码都搞出class了， 这个不可能是c的

c语言不能这么写，你这是c++的写法

StackTop  = new Node{oneSet, StackTop};

stack():StackSize(0),StackTop(NULL){}; 你在构造函数这里的才叫初始化 StackTop=(node*){oneSet,StackTop}; 你这叫初始化吗？？ 你把一个node结构体强制转为 node *？？？这样也行吗

C++ 问题请去 C++ 论坛提问。

引用 4 楼 寻开心 的回复:[quote=引用 3 楼 真相重于对错 的回复:] c语言不能这么写，你这是c++的写法  楼主的代码都搞出class了， 这个不可能是c的[/quote] 看清楚标题，和栏目？


Question: 出现异常，不知道怎么解决

while ((a[i] != '\0') || (b[i] != '\0'))  -》 while ((a[i] != '\0') && (b[i] != '\0')) ？

scanf_s("%s", a,80);指定下长度，而且最后printf("big-string\n", a);这个a没意义啊，你可以写成printf("big-string is a:%s\n", a);


Question: 萌新求教

引用 1 楼 不闻窗外事的回复:等号运算是从右往左，首先，a*3等于9，然后a-=9 表示为a=a-9；所以a等于-6；a+=a表示为a=a+a；a=-12 那个图片里的倒数第二行a+=-6,是不是a=a+(-6),然后右边的a是不是在前面已经算出是-6了，然后直接一代就行了

引用 6 楼 花海呀 的回复:这个咋结帖啊？找了好久都不晓得@_@ 帖子标题旁边有结帖按钮，如果看不见就用电脑版登录。

引用 4 楼 apkipa1的回复:#2 和 #3 是正解，这属于未定义行为。写这些代码的作者明显不了解迂腐的 C 语言标准，建议换书看。 这个咋结帖啊？找了好久都不晓得@_@

我想他想表达的意思应该是a+=a-=3，即a-3+（a-3），也就是a-=3之后a已经发生变化，这和程序的结果是一致的

按着这么3行算下来不一定是-12，a+=a-=1，那a在-=的时候是变了还是没变呢，这感觉就和a+=a++是一个问题  按楼上的说法第一行的结果是-12可以理解  但如果他的意思是这三行算下来是-12，那就有点诡异了  试了下连续计算下每行的结果分别是-12 -42 -36，拍的不全，看不明白什么意思


Question: win32 API中的A后缀和W后缀，A是指ANSI还是ASCII？

所以说CreateWindowA 这个指的是ANSI

ANSI包含ASCII ASCII只是英文字母和符号，占一个字节 ANSI每个国家都有自己的标准，如中国GBK编码，这些编码是多字节编码。  英文占一个字节，如中文可能占两个字节，或3个字节，或4个字节

官网上的一句话 In the ANSI version of this function, the name is limited https://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilea?redirectedfrom=MSDN

ANSI和ASCII都是单字节编码，不同是ASCII是7位编码（最高位保持为0），ANSI是8位编码

ASCII码是不可能ASCII码的，ASCII码一共就那么几个，输入中文咋办，比如路径


Question: 这里是老陌的留言板，欢迎前来交流呀~

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

这个程序没有问题。 通过运行可以得出最后的结果是这样的： 最大值=10 行号= 2 列号= 1  因为数组下标默认是从0开始的，所以这里的行和列对应的就是第三行第二列。 如果你觉得不够直观，可以在最后输出时改成这样： printf("最大值=%d\n行号= %d\n列号= %d\n",max,row+1,colum+1);  引用 1 楼 weixin_45671534 的回复:#include <stdio.h>  void main()  {  int i,j,row = 0 ,colum = 0,max;  int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};  max = a[0][0];  for(i=0;i<=2;i++)  for(j=0;j<=3;j++)  if(a[i][j]>max)  {  max = a[i][j];  row = i;  colum = j;  }  printf("最大值=%d\n行号= %d\n列号= %d\n",max,row,colum);  }  这个程序运行出来行和列不对呀


Question: C内存问题

引用 1 楼 寻开心 的回复:void minStackPush(MinStack *obj, int x) {         obj->length++;         if (obj->length > obj->size)         {                 int **content = (int **)malloc(sizeof(int *) * 2 * obj->size);                 memset(content, 0, sizeof(int *) * 2 * obj->size);                 memcpy(content, obj->content, sizeof(int *) * (obj->length - 1));                 safe_free(obj->content);                 obj->content = content;                 obj->size = obj->size * 2;         } 老铁牛逼，我看一下午都没能看出来


Question: C# 用oledb写dll插件运行报错 生成exe程序可以正常运行

我才学不久   谢谢你了

从你的数据库连接字符串来看，你只是连接EXCEL，用得着这么大阵仗？  建议NPOI来读写EXCEL。

这个问题应该和应用程序池里面的没有关系  因为生成exe的时候可以用  然后主程序是用反射去调用这个dll程序     平台目标也不能改   改成X86就调用不了了 现在老阔好大


Question: scanf在读入时到底发生了什么

引用 2 楼 寻开心 的回复:你这样看不出来问题， 做测试就要做成能发现问题的 union  M {    long long int ll;    int n[2];    short  s[4];    char   c[8] } u; 做成这样的一个联合体，   然后你再测试你的代码去  先说我认为的答案 scanf第一个字符串指定了后面的内容的格式，  第二个开始起， 都是一个一个的内存地址 按照指定的格式， 把读入数据放到指定的内存当中去，在这个过程当中并没有做内存地址的安全性检测，是假定你给的地址都是对的 你指定要读入一个long int（windows下long int和int都是32位的）， 但是你传递给他的是一个char 类型的地址 这样有没有问题？ 有问题， 只是未必显现出来。 windows当中， int是4个字节， 低位字节在前，高位字节在后 因此读入一个整数的时候， 如果不超过255那么，它所占据的有效地址就是char所在的空间， 超出的时候才占据了更高地址的空间 为测试这点， 你定义一个char c【4】这样的数组， scanf（“%d”， c）； 这样，你输入不同的数，然后看c【0】～c【4】内容的变化就可以验证这一点。  你的代码可以运行，并感觉没错，那恐怕只是scanf读取的数据所破坏掉的内存空间，并没有被使用， 效果没有显现出来而已 char a = 0； char b = 0; char c = 0; char d = 0; scanf("%d", &b);  你输入65535，然后看看c和a的值是否发生变化了（ 具体是a还是c变了，取决于编译器，大部分编译器会把栈地址做成向下增长，也就是b的地址比a的地址低，所以b存放int的时候，必然向上增长覆盖a的空间。） 或者用前面给的那个union结构体， 看看同一空间下，不同的数值变化，就知道内存占据的情况了例子不好  char str[sizeof (int)] = ""; 然后 scanf %d str 可以明确看到操作结果

不一定，在32位系统里，long和int是等长字节数。都是4字节的。建议sizeof(long)和sizeof(int)对比下。在64位系统里，你这句话是成立的。


Question: c语言 BFS

我看题目是输入多行测试数据，然后输出多行结果。 你代码是输入一行测试数据，然后输出一行结果？

你理解一下意思……就是你搜的次数太多了，搜过的可能没标记好

引用 3 楼 一股清流~的回复:超时说明递归用多了 没有用递归，我用的是广度优先搜索...

超时说明递归用多了

提了十个问题，一个帖子也不结的，还是不回答了。

#include<stdio.h> #include<string.h> typedef struct {     int x;     int y;     int dis[1][2];     int veer; } Q; Q que[10005];  int f[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; char map[105][105],book[105][105]; int n,m,i,j,k,x1,x2,y1,y2,tx,ty,l,head,tail,flag;  int main() {     int num;     while(scanf("%d",&num)!=EOF) {         while(num--) {             memset(book,0,sizeof(book));             scanf("%d %d",&n,&m);                          for(i=0; i<n; i++) {             getchar();                 for(j=0; j<m; j++)                     scanf("%c",&map[i][j]);             }             scanf("%d %d %d %d %d",&k,&x1,&y1,&x2,&y2);             head=tail=0;             que[tail].x=x1-1;             que[tail].y=y1-1;             que[tail].veer=-1;             que[tail].dis[0][0]=0;             que[tail].dis[0][1]=0;             tail++;             book[x1-1][y1-1]=1;             flag=0;              while(head<tail) {                 if(que[head].veer>k) {                     head++;                     continue;                 }                 for(l=0; l<4; l++) {                     tx=que[head].x+f[l][0];                     ty=que[head].y+f[l][1];                     if(tx<0||tx>=n||ty<0||ty>=m||map[tx][ty]=='*')                         continue;                     if(map[tx][ty]=='.'&&book[tx][ty]==0&&que[head].veer<=k) {                          book[tx][ty]==1;                         que[tail].x=tx;                         que[tail].y=ty;                         que[tail].dis[0][0]=f[l][0];                         que[tail].dis[0][1]=f[l][1];                         tail++;                         if(que[head].dis[0][0]==f[l][0]&&que[head].dis[0][1]==f[l][0])                             que[tail].veer=que[head].veer;                         else                             que[tail].veer=que[head].veer+1;                         if(tx==x2-1&&ty==y2-1&&que[tail-1].veer<=k) {                             flag=1;                             break;                         }                     }                  }                 if(flag) break;                 head++;             }             if(flag) printf("yes\n");             else printf("no\n");         }     }     return 0; } 原代码有bug,修改一下依然超时


Question: 算法实训代码


引用 4 楼 與蘤舊縐的回复:手机上用的是clang吧  这什么软件，dev还是vc，看看lib里有没有string.h头文件吧，没有就重装，换个靠谱的 重装啦谢谢你!!!!

引用 5 楼 真相重于对错的回复:建立的工程类型不对，建立win console类型工程 谢谢我换了一个程序重装了一下，可以用了，但是运行起来很慢..

建立的工程类型不对，建立win console类型工程

引用 1 楼 一股清流~的回复:你这个是缺头文件，你用了strcat，这个函数的头文件是string.h QAQ怎么办呀，手机上的编译软件不加也可以

引用 1 楼 一股清流~的回复:你这个是缺头文件，你用了strcat，这个函数的头文件是string.h 我重新加了还是一样的错误

你这个是缺头文件，你用了strcat，这个函数的头文件是string.h


Question: 求组合数

错误原因是整数除法    i/(i-n+m);  是整数除法， 比如2/3结果就会是0。3/2是1  s *= i/(i-n+m);  是先计算 *= 的右侧， 右侧是整数除法， 结果就不正确  s = s*i/(i-n+m);  会先计算s*i而后再去除以(i-n+m);  因为s*i已经包含了后者的因子， 除法结果还是正确的  换成float类型， float除法结果可以保证正确性

如果是个浮点类型的就没问题，整形就得考虑运算符优先级了

C语言的运算符优先级是先算‘*’，再算‘/’,在错误的代码里先算了‘*=’右边的表达式，然后才算乘号，所以值不对。