Question: libevent Resource   temporarily unavailable 错误

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


Question: 一道csp考试类型题目疑问

这道题还是没有找到具体的错误，但是如下解法更加直观和简便，而不是直接暴力逐个读取整个字符串，尤其是sscanf的应用，不过还请大佬帮我找找上面的代码的错误  #include<iostream> #include<string> #include<string.h> #include<vector> #include<stdlib.h> #include<algorithm> using namespace std; struct info { 	string name; 	int cnt; 	int time; 	bool operator <(const info& the_info) 	{ 		if(cnt != the_info.cnt) 			return cnt > the_info.cnt; 		else if(time != the_info.time)  			return time < the_info.time; 		else 			return strcmp(name.c_str(),the_info.name.c_str())<0; 		}  };  int main() { 	int n,m; 	scanf("%d%d",&n,&m); 	char name[100]; 	vector<info> list; 	while(~scanf("%s",name)) 	{ 		int time=0,num=0; 		info std; 		std.name=name; 		for(int i=0;i<n;i++) 		{ 			char s[50]; 			scanf("%s",s); 			int l=strlen(s); 			int t,n; 			if(s[0] == '-')continue; 			else if(s[l-1]==')') 			{ 				sscanf(s,"%d(%d)",&t,&n); 				time+=t+n*m; 				num++; 	 		} 			else 			{ 				time+=atoi(s); 				if(atoi(s) != 0) num++; 	 		}  		} 		std.cnt=num; 		std.time=time; 		list.push_back(std); 	} 	sort(list.begin(),list.end()); 	for(vector<info>::iterator it=list.begin();it!=list.end();it++) 	{ 		printf("%-10s %2d %4d\n",it->name.c_str(),it->cnt,it->time); 	} 	return 0;	 }

引用 1 楼 初学小菜 的回复：感觉格式错了，你都用%-10d了为啥还要加一个空格呢？终于有人看了但是应该不是这里的问题，中间有空格是因为题目要求输出之间除了左右对齐，还要两两有空格，不过谢谢你啊！

感觉格式错了，你都用%-10d了为啥还要加一个空格呢？


Question: 麻烦大佬看下这个c语言问题出在哪里

scanf_s("%d%s%f", &student1.num, student1.name, 20,  &student1.score);  供参考～  需要指定name的长度。

把scanf_s改成scanf。 scanf_s和scanf的参数不一样，具体可以谷歌百度自己查看两个函数的说明。 另外，最好struct student结构体定义放在main方法的上面（当然这个和这次的问题无关）。


Question: C语言文件和链表

建议直接贴代码～

为什么都喜欢用黑底，我看教程视频里也大多数用黑底。

想看清图片中的代码很费劲。直接贴代码多好

读不进去文件   文件打开依然为空


Question: 为什么C语言编译成功却运行出错

应该是环境的问题，建议将错误信息百度一下，找一下原因和解决办法。

void main()？！得是int main()（不知道是不是这个，反正得这么写，其他的编辑器，像dev-c++、VS2019都会报错）

编译 -  链接 - 执行 你这个是链接没有过， link.exe error 估计是VC6 没有安装正确， 这么古老的软件不建议继续用 dev c++ 或者升级到 visual studio 2019去吧

估计是vc6.0的问题，找个devc++用吧


Question: 华氏摄氏温度转换题目的疑问，求解？

建议 scanf("%d %d")中间不要有空格 %d表示打印整数， %6.1f 表示打印6位，小数点后一位

可能测试点没有出100以上的限定条件%d%6.1f是printf的格式化输出%6.1f说的是输出长度占6位比如0.46789在该条件下输出就是   0.5（前面有三个空格）， 至于if else的问题，你else后面没有加{   }所以else只会针对printf（”fahr celsius“）到；就截止了


Question: 新手学习编程 刚刚碰触实例编程

我是用的vs 2015 的c 写的


Question: 发生访问位置冲突

char string[100]是字符数组 直接使用数组名称，相当于取数组首地址 所以scanf的时候，不能 &string，使用string就可以

字符串输入 不用 &string, 直接 scanf（"%s", string); scanf_s需要的参数建议百度一下

因为我在做程序的时候并不知道该长度确切是多少，所以我查阅的资料用的是sizeof（string），这样做对吗？

因为scanf不检查读入的缓存区字符串长度，所以scanf会越界存储。所以标准委员会建议用scanf_s代替scanf。 这个长度，应是字符数组的长度-1，或者等于字符串大小。

感谢感谢，我查阅资料也有看到这个长度参数，现在已经加上了，能不能问一下这个长度参数到底代表什么呢？

用不用&都试过了，还是访问冲突


Question: makefile通配符wildcard的问题

两个展开的阶段不一样，用 wildcard 表示在 Makefile 执行过程中就展开，不用 wildcard 表示在调用具体命令时让 shell 进行展开，或者由被调用程序自行决定是否展开。


Question: 第1次第2次都有正确输出第三次执行时就出现了Segmentation fault错误

贴出代码吧，这样能更好的解决你的问题～

引用 2 楼 proorck2019 的回复:关于malloc和free的问题， 我猜你执行了2次malloc，3次free  for(i=0;i<10;i++) {          myfunc(); }  malloc与free是成对的

看看是否越界吧 + 代码说话

没代码不好说

关于malloc和free的问题， 我猜你执行了2次malloc，3次free

没代码没真相


Question: 大佬们这道题怎么做

这样的题自己也不会做，这是从没看过书吗

for example double c=0, r=0, s=0; scanf(“%lf%lf”, &c, &r); s = c*r; printf(“本金：%.2lf\n”, c); printf(“利息：%.2lf\n”, s); printf(“合计：%.2lf\n”, c+s);

这个直接写不就行了……

floor是math.h里面的函数，要包含头 或者用// 后面的那个代码替换 s = ((int）s)/100.0

这道题应该自己做，没有什么技术难点 #include <stdio.h> int main(void) { 	double c = 0, r = 0, s = 0; 	scanf_s("%lf %lf", &c, &r); 	s = c * r / 100; 	printf("本金： % .2lf\n", c); 	printf("利息： % .2lf\n", s); 	printf("合计： % .2lf\n", c + s); 	return 0; }

引用 5 楼 寻开心的回复:有一个问题需要注意 在中国的利率计算， 分之后是截断  不是四舍五入， 123.456 当做123.45.   printf语句输出结果是四舍五入123.46 所以不能直接输出， 还要做结果的转化的 要么是用floor函数，要么自己做一下截断处理的转化  double c=0, r=0, s=0; scanf(“%lf%lf”, &c, &r); s = c*r; s = floor(s) / 100.0;  // s = ((int) s)/100; printf(“本金：%.2lf\n”, c); printf(“利息：%.2lf\n”, s); printf(“合计：%.2lf\n”, c+s);  不过，这是到测试题， 也许不用这样。 大佬不行哦，在pta上一提交就显示错误


Question: 初学者，想请问在c语言中 for循环内有scanf语句，为什么不能自己输入

引用 3 楼 自信男孩 的回复:#include <stdio.h> int main() {     int i;     int a[]={0,1,2,3,4,5,6,7,8,9,10};     int number;     scanf("%d",&number);     if (number > sizeof(a)/sizeof(a[0]))         number = sizeof(a)/sizeof(a[0]);     for(i=0;i<number;i++){         scanf("%d",&a[i]);         printf("%d",a[i]);     }     return 0; } 供参考～ 代码基本上没问题，注意number输入的值，若输入0，那么是不会进入循环的。当然也不能输入大于sizeof(a)/sizeof(a[0])的值，因为会导致数组越界。谢谢

你输入完要输入的数字后按了回车确认，回车键也是会算到你输入的字符中的。比如你要输入 5，实际输入的就是 5 \n。scanf读取完5后 ，\n还留在缓冲区里。

如何解决呢

scanf("%d\n",&number);试试这样


Question: C语言：中缀表达式转后缀表达式并进行逆波兰求值（可以输入小数）？

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

用double存数值就可以了吧


Question: 大佬来瞧瞧，基础问题书上没有他还考的题

顾名思义， 可以理解成 C++是C的升级版。

引用 2 楼 ?Victor.?? 的回复：[quote=引用 1 楼 與蘤舊縐 的回复:] 条件都没给全，难道还是个论述题  所以说教育出现了问题[/quote]肯定选b的……这有啥歧义码？

强行可以，那没什么好说的，免得给你带沟沟里

引用 1 楼 與蘤舊縐 的回复:条件都没给全，难道还是个论述题  所以说教育出现了问题

条件都没给全，难道还是个论述题


Question: 不懂

引用 2 楼 寻开心的回复:看一下ASCII表， 常见的空白字符， 空格，tab和回车当中， 空格的ascii值最大 所以第一个while可以把这些值都过滤掉 从第一个while退出的时候， ch里面已经有了一个值， 这个值已经是大于空格的ascii了 所以直接进入第二个while的循环，第二个while循环急需提取字符，直到遇到一个ascii小于等于空格的字符为止

ascll码，因为小于空格的都是控制符。这里主要过滤的是\n


Question: c语言程序运行半路停止，编译器没有显示错误和警告，什么地方出错了，求指点。。。

while(!feof(fp)) 判断不了连续3个读操作，比如 c_num时候读成功，此时已经到文件结尾了，下一个c_name就出错了。所以可以用fscanf的返回值来判断，然后break循环

void app(void) { FILE *fp; struct career *p; if((fp=fopen("car.text","r"))==NULL) { printf("打开失败!\n"); exit(1); } while(!feof(fp)) { fscanf(fp,"%s\n",p->c_num); fscanf(fp,"%s\n",p->c_nam); fscanf(fp,"%s\n",p->c_car); printf("%s\n%s\n%s\n",p->c_num,p->c_nam,p->c_car);  对于p这个野指针， 没有初始化， 鬼知道p指向哪儿去了


Question: 合并中文TXT文件的问题

引用 6 楼 Kalasapower 的回复:[quote=引用 2 楼 gouyanfen的回复:]明显编码不对，一个是gbk,一个是utf8 对对对，就是这个编码问题，请问怎么解决[/quote] 转为统一的格式再存回去了解一下这个函数WideCharToMultiByte

引用 2 楼 gouyanfen的回复:明显编码不对，一个是gbk,一个是utf8 对对对，就是这个编码问题，请问怎么解决

引用 1 楼 user-3的回复:你不贴代码出来，没人愿意看图说话的 哈哈，昨天糊涂了

引用 楼主 Kalasapower的回复:C语言中合并两个中文txt文件时，第二个中文txt文件变成了乱码，求大佬帮忙指点 #include "stdio.h" #include "stdlib.h" int main() { 	FILE *fp1, *fp2; 	char ch; 	if ((fp1 = fopen("C:\\Users\\DELL\\Desktop\\3.txt", "wt+")) != NULL) 	{ 		if ((fp2 = fopen("C:\\Users\\DELL\\Desktop\\1.txt", "rt+")) != NULL) 			for (; (ch = fgetc(fp2)) != EOF;) 				fputc(ch, fp1); 		fclose(fp2); 		if ((fp2 = fopen("C:\\Users\\DELL\\Desktop\\2.txt", "rt+")) != NULL) 			for (int i = 0; (ch = fgetc(fp2)) != EOF; i++) 				fputc(ch, fp1); 		fclose(fp2); 		fclose(fp1); 	} 	printf("\n"); 	system("pause"); 	return 0; }

找一个读二进制的工具，看一看。

明显编码不对，一个是gbk,一个是utf8

你不贴代码出来，没人愿意看图说话的


Question: 大佬们救救我吧

引用 3 楼 ?Victor.??的回复:sleep作用这是暂停，不是终止 这两个sleep作用不一样呀 sleep(snake speed)应该是让食物停留一段时间 sleep(5000)是让游戏分数显示5秒钟之后再出来“按任意键退出……那堆东西” 哦哦，感谢感谢

引用 1 楼 ?Victor.??的回复:让程序运行暂停5秒钟 不是已经有了Sleep（snake speed）了吗，那个Sleep（5000）不就没用了吗，不是很懂

让程序运行暂停5秒钟


Question: 怎么实现这种参数先展开的宏定义？

int ucT1 = 2; int ucT2 = 6; #define     mT1AndT2    ucT1, ucT2 #define     And(x, y)      x &= y #define wraperAnd(arg) (And(arg)) #include <iostream> using namespace std; int main(){     cout << wraperAnd(mT1AndT2) << endl; }  打包一下就可以了

注意等价替换，括号也会替换进去。所以只有一个参数～

在宏体中，如果宏参数前加个#，那么在宏体扩展的时候，宏参数会被扩展成字符串的形式。

宏的展开顺序是从外向里的， 和函数都调用的从里向外的顺序是反的 你这个想法不行

可能表达的不清楚。只是举了个简单的例子。 实际是有很多的要这样执行。 unsigned char ucT1;  unsigned char ucT2; unsigned char ucT3; unsigned char ucT4;  #define     mT1AndT2    (ucT1, ucT2) #define      mT1AndT3    (ucT1, ucT3) #define      mT1AndT3    (ucT1, ucT4)  #define     And(x, y)      x &= y  #define     Or(x, y)      x |= y  main()  {      And(mT1AndT2);      Or(mT1AndT2);      And(mT1AndT3);  }

unsigned char ucT1; unsigned char ucT2; #define     mT1AndT2    (ucT1)&(ucT2) 直接这样就好了


Question: 这个warning: left-hand operand of comma expression has no effect是怎么回事？

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

warning: left-hand operand of comma expression has no effect [-Wunused-value] 这里明确的告诉你了， 逗号表达式

逗号也是合法的表达式， 编译器给你这样的提示，够意思啦   所以不能忽略编译器的任何警告呢 养成0警告编程的习惯是必要的

double lAX = sqrt(pow( (n*(A.y-camera.y)-m*(A.z-camera.z) ), 2)                           + pow( ( l*(A.z, camera.z)-n*(A.x-camera.x) ), 2)                           + pow( (m*(A.x-camera.x)-l*(A.y-camera.y)), 2));    // Only Formula's step I 这里是 A.z - camera.z 吧


Question: 求大佬看看！

引用 1 楼 qq_46382116 的回复:这个是之前一个大佬写的，看了我还是不会写  所以，还是要自己写， 然后别人帮你改错误 否则，结果还是这样 最终就是找人要完整的源码  那还学个屁啊

这个是之前一个大佬写的，看了我还是不会写


Question: 请问#define 和 typedef有什么区别

type就是类型的意思，typedef就是type-define，可以理解为用于类型的定义

#define是替换 typedef是别名  #define int INT 不能把基本数据类型替换了 typedef int INT 但是可以给基本数据类型赋予一个别名  #define是预处理语句，是在编译之前完成替换的，因此可以作为编译开关使用。 typedef是语言的关键字，参与编译，可以像extern一个变量那样，参与编译（这个是我脑补的）  书里一般的介绍是。 #define INT 0 可以作用于数值 typedef int 0 只能用于类型替换  然而#define INT int * 无法实现较为复杂的类型替换 而typedef int * INT 可以方便的简化复杂类型  我估计更重要的区别可能是宏函数和函数指针的区别，这两者各有优缺点。


Question: MATLAB的一个小问题


Question: C语言基础题出现错误，想了好久，求各位大佬纠错

while (scanf("%3s", a)!=EOF)  //用%s, 并且提供数组长度: 详情查阅scanf官方文档

tql，真大佬 已关注666

引用 1 楼 Dreamypurple 的回复:想起来了，加一个getchar()就可以了，如果哪位大佬能解释一下getchar()这个函数，分就给您了谢谢~ %c是会匹配'\n'即换行符的，所以会出现楼主的现象

while(scanf("%c%c%c",&a[0],&a[1],&a[2])!=EOF)，还剩一个\n在缓冲区里

getchar()就是接收一个字符，包括空格，回车


Question: 关于sqrt有多个重载函数问题的解决方案

定一个double类型的就完事儿了 第一种情况，无需处理， 函数都参数可以是表达式， 计算完结果后再传值进去的 第二种情况， 参事是double类型， 你传参给他float类型，编译器会自动做类型转换的


Question: 请问double x=-b/(2*a)与 x=(-1*b)/(2*a)、x=(0-b)/(2*a)有什么区别

引用 4 楼 m0_46108109 的回复：负号的优先级比算术优先级低？可是我感觉，无论先取负再计算还是先计算再取负，结果都没区别吧？

引用 3 楼 寻开心 的回复：abc是什么类型？ abc如果是整数类型，那么 -b/(2*a) 和 -1.0*b/(2*a)是有区别的， 前者是整数处罚，结果只是整数， 后者才是浮点数的触发 但是 -b/(2*a) 和 （0-b)/(2*a)没区别， 除非是(0.0-b)/(2*a); 才有整数和浮点数的区别abc都是浮点数类型……

负号的优先级比算术优先级低？


Question: 编程

引用 1 楼 與蘤舊縐的回复:你打了断点，停在第一行了，按f11编译运行，f5是调试 好的😄谢谢

你打了断点，停在第一行了，按f11编译运行，f5是调试


Question: 救急！！！

#include<iostream> using namespace std; int main() { 	int n,m,a[10001]={},i,j,b,max=-1,max_1[10001],sum=0; 	cin>>n>>m; 	for(i=1;i<=n;i++)     {     	for(j=1;j<=m;j++)     	{     		cin>>b;     	    a[b]++; 		} 	} 	for(i=1;i<=n;i++) 	{ 		if(a[i]>max) max=a[i]; 	} 	for(i=1;i<=n;i++) 	{ 		if(a[i]==max) max_1[++sum]=i; 	} 	for(i=1;i<=sum;i++) 	{ 		cout<<max_1[i]<<" "; 	} 	return 0; }

鬼知道你那个测试数据要考虑多少种合法和非法的选票情况 这种题本来就是给练手的，一个不行，还继续第二题？！ 自己玩儿去吧

代入范例是对的，但AC不了，只有60分

#include<stdio.h> #include <string.h> #include<stdlib.h> #define MAXN 1010  int vote[MAXN]; int choices[MAXN]; int main() {     int N, M, i, j;     scanf("%d%d", &N, &M);     for (i=0; i<N; i++) {         memset(choices, 0, sizeof(choices));         for ( j=0; j<M; j++) {             int choice;             scanf("%d", &choice);             if ( choice <1 ||  choice >N ) continue; //无效的票             choices[choice]++;              if (choices[choice]>1 ) break;//             // 一个人，给另外一个人投了多次票， 比如这一行数据是1 1 1 这样的情况             // 如果不需要处理这种情况，注释掉这行即可         }         if ( j==M) {             for ( j=0; j<N; j++ )                 vote[j] += choices[j];         };     }     int maxChoice=vote[1];     for (i=2; i<N; i++)         if ( vote[i] > vote[maxChoice]) maxChoice = i;     for ( int i=1; i<N; i++)         if ( vote[i] == vote[maxChoice])             printf("%d ", i);     return 0; }


Question: 大佬们请问这个怎么改呀，纯小白。。。

#include <stdio.h> void printf_jisuan(int, int); int main (void) { int x,sum; sum = 5; printf("游戏开始\n"); printf("石子的总数目为：%d\n",sum); printf("请玩家输入取出的石子数目："); scanf("%d",&x); printf_jisuan(x, m); return 0; } void printf_jisuan(int x, int sum); // int *a ,int *sum) { if (x>3 || x < 1) printf("输入错误，请重新输入\n"); else  sum=sum-x; { if(sum>0) printf ("石子的数目为：%d\n",sum); printf_jisuan(x, sum); if(sum == 0) printf ("游戏结束，胜利"); else printf ("输入的石子数目过大，请重新输入\n"); printf_jisuan(x, sum); } }  这么改能让编译通过， 但是你这个printf_jisuan函数都逻辑太高深了，看不懂是个什么玩儿法


Question: 救救孩子吧

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

引用 1 楼 寻开心的回复:scanf("%lf,%d,%lf", &rate, &n, &capital); 你这是要求输入0.00225，10，1000 输入时候中间的逗号不能省略 谢谢大哥 我晓得了

要么输入0.00225，10，1000 要么改scanf("%lf,%d,%lf", &rate, &n, &capital);为scanf("%lf%d%lf", &rate, &n, &capital);


Question: 为什么会这样啊。而且要两个等于号

引用 7 楼 穷人没资格上闲鱼的回复:[quote=引用 2 楼 weixin_46294972 的回复：][quote=引用 1 楼 穷人没资格上闲鱼的回复:]这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。 那怎么修改啊[/quote]你的程序是想干什么呢？想让程序输出不乱码的结果，把第二行改成a=10就行，最后输出的值是10[/quote] 搞好了，懂了谢谢

引用 2 楼 weixin_46294972 的回复：[quote=引用 1 楼 穷人没资格上闲鱼的回复:]这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。 那怎么修改啊[/quote]你的程序是想干什么呢？想让程序输出不乱码的结果，把第二行改成a=10就行，最后输出的值是10

a+a==20这是要做什么？首先根据符号优先级，a+a限制执行，然后再与20比较。最后结果什么也没变化，即a的初始值没有被改变。

a = 10; 这是赋值， 不是判断a是不是和10相等 a == 10 这是判断 a 和 10是否相等  20  = 10 + a； 这种是非法代码， = 是赋值语句，左边必须是一个变量； 程序还不会自动求等式解方程呢？

局部变量不会有初值，保存的应该是以前堆栈里遗留下来的值，有时候恰好等于0 应该先定义 int a=0；

引用 1 楼 穷人没资格上闲鱼的回复:这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。 那怎么修改啊


Question: 为什么0X44不是使用%#x

%x是按字节对齐来输出16进制的（也就是输出的必然是偶数个数），1个字节有8位，0x44是 0100 0100刚好8位 而0x3不满一个字节（奇数个数），如果用%x，会变成0x03（凑满一个字节 0000 0011），所以要用%#x，一个#代表1个数


Question: C语言

API一般不提供源码，而是只给你函数的声明和文档，在文档中一般包含了这个函数使用的样例。 API一般是后端提供给前端的应用程序接口。

什么样的api，网络的，还是其他的等等。

就是函数的源代码 比如字符串拷贝strcpy，字符串长度strlen等等，各种函数的源代码。 用相应的函数名和源码作为关键字谷歌百度一下吧

API=应用程序接口


Question: 如何在C语言中嵌入汇编语言？

引用 5 楼 gouyanfen 的回复:引用 4 楼 赤勇玄心行天道 的回复:[quote=引用 3 楼 gouyanfen 的回复:] 你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  [quote=引用 楼主 赤勇玄心行天道 的回复:] 本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标，如果你想用汇编重写自己的库函数，那就不要用C写了，直接汇编写，要不你没法绕过编译器，只要用C编译器编译，用C内嵌汇编然后编译会多了一些转换比如堆栈处理之类就达不到你想要的效果了，而且只能针对固定的CPU架构来写,没有通用性。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标 是库函数，不是编译器，笔误

引用 4 楼 赤勇玄心行天道 的回复:引用 3 楼 gouyanfen 的回复:你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  [quote=引用 楼主 赤勇玄心行天道 的回复:] 本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标，如果你想用汇编重写自己的库函数，那就不要用C写了，直接汇编写，要不你没法绕过编译器，只要用C编译器编译，用C内嵌汇编然后编译会多了一些转换比如堆栈处理之类就达不到你想要的效果了，而且只能针对固定的CPU架构来写,没有通用性。

引用 3 楼 gouyanfen 的回复:你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  引用 楼主 赤勇玄心行天道 的回复:本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。

引用 1 楼 qybao 的回复:那还是需要了解汇编语言的 找本汇编语言的教程先学习吧 那有没有教程讲解C语言嵌入汇编的呢？

那还是需要了解汇编语言的 找本汇编语言的教程先学习吧

引用 10 楼 m0_46108109 的回复:可能是你的句法写的不好，看文章说，C编译出来的代码几乎和汇编一样。 例如++； 你写成i+1，可能效率就低点。  ++和+1是一样的汇编代码，但这个和编译器有很大关系的，不同的编译器结果可能是不同。

引用 8 楼 gouyanfen 的回复:这方面帮不到你什么了，只能看啃汇编语言了 哦，好的，感谢您的回答，我还是先去找找汇编语言的教程吧。

这方面帮不到你什么了，只能看啃汇编语言了

引用 5 楼 gouyanfen 的回复:引用 4 楼 赤勇玄心行天道 的回复:[quote=引用 3 楼 gouyanfen 的回复:] 你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  [quote=引用 楼主 赤勇玄心行天道 的回复:] 本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标，如果你想用汇编重写自己的库函数，那就不要用C写了，直接汇编写，要不你没法绕过编译器，只要用C编译器编译，用C内嵌汇编然后编译会多了一些转换比如堆栈处理之类就达不到你想要的效果了，而且只能针对固定的CPU架构来写,没有通用性。[/quote]  我想的就是某些函数用汇编写，某些函数还是用C语言写，我现在就是不知道怎么入手，有没有相关的教程？


Question: 关于char类型疑惑

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

scanf_s("%c%c%c", &a, 1, &b, 1, &c, 1);  改成这样试试, scanf_s对于%c需要制定长度。

scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。 少一个参数。


Question: c语言给数组进行选择排序报错

引用 1 楼 user-2 的回复：max函数和系统函数同名，改成别的名字如maxind试试对啦，谢谢

哦哦，对啦，谢谢

max函数和系统函数同名，改成别的名字如maxind试试


Question: 两组枚举怎么取巧形成映射

这种方法解决连续的枚举是不错的方法，处理跳变的枚举有没有更好的方法？

我的看法：     打个比方： { NAME1 = 29， NAME3 = 78，NAME2 = A3} {name3   = 4BC, name1   = 759,name2  =37954} 大写和小写相互映射   这里6个数值你认为程序中要不要存下来？ 如果要，那么到这里我们至少需要6个内存空间大小 那么： array1[3] = { NAME1 = 29，NAME2 = A3，   NAME3 = 78}; array2[4] = {name1   = 759, name2  =37954, name3   = 4BC}; 到这里映射已经自然建立完毕了。  至于啥name1这些和下标的映射就很随意了 如一个枚举 enum { NAME1 = 0, NAME2, NAME3, name1 = 0, ... }names;  也可以define

将两组枚举建立映射表？这方法不巧

搞个map?

支持一楼的办法，建立一个第二种枚举类型的数组， 这个数组的下标刚好就是第一组的枚举值

如果UART2_CMD_T一直是累加1，这个方法还是不错的，但是枚举成员值有跳动，如 EN_UART2_CMD_TEST = 0xF0,那这个方法会浪费内存。

鉴于第一个枚举是从零开始的，可以考虑用数组。下标是输入，值是输出。


Question: VC编程，求助大佬

引用 5 楼 qq_42690590 的回复:我还是用devc++吧 这就对了嘛，明智的选择

我还是用devc++吧

能不用他吗

引用 2 楼 qq_42690590的回复:[quote=引用 1 楼 ?Victor.??的回复:]这个代码好奇怪呀 #include<stdio.h> int main() { printf("hello world"); return 0; } 要是这也不对的话，就是编译器出问题了 就是编译器有问题，该怎么解决呢？[/quote] 我用的VC6.0，好像是要改文件名还是咋的

引用 1 楼 ?Victor.??的回复:这个代码好奇怪呀 #include<stdio.h> int main() { printf("hello world"); return 0; } 要是这也不对的话，就是编译器出问题了 就是编译器有问题，该怎么解决呢？


Question: 把结构体放在栈中的用法一般是在什么情况下使用的？

局部变量 和 函数的实参都是栈对象 动态分配的都是堆对象 还用全局变量和静态变量区呢  大概的位置关系如上图   动态内存是可以开的很大， 但是什么都是不是无限的， 在任何现存系统上都有物理限制

1占用内存不大，2使用完后由栈自动释放，这种情况下可以用dog1

我能想到的。 1.考虑占用空间。如果申请的对象占用内存过大。那么你比如栈里定义char a[999999]; 这个肯定会运行崩溃的。 2.考虑对象的运行生存期。如果想生存期特别长，就用堆内存。


Question: C语言有个i,i++问题,a=(i++,i)，为什么a不等于i 逗号的顺序不是从左到右吗？

解决了

那你为什么调试的结果和输出结果不一样呢？

我晕，我是让你只打印a和i，因为这样才能确认逗号表达式的结果 你后来的打印又++i了，i又变了，所以跟逗号表达式没关系了

刚刚发的不好，是这样的

输出的结果和调试的结果不一样

你看看

你打印出来确认了吗？ i只有一次++不可能变到6啊 a=(5, 5) 所以a为5，i也为5

但是结果a=5,i=6这怎么解释 逗号表达式不是先i++，后i，所以a=i a不是应该等于i=5吗 就算是未定义行为两者也应该相等 要么都是6 要么都是5

我懂，我还是等大佬回答吧，你解释不清

你看看逗号表达式的语法规则和计算顺序自然明白，不相等才是对的

我说的是a为什么和i不相等

你自己的++i看不到？


Question: C语言一个代码不同编译器不同结果

不同的编译器，参数表达式执行顺序可能不一样，有的从左到右，有的从右到左。你也可以在方法内打印两个参数的地址，看看哪个先压栈哪个后压栈

百度搜一下，未定义行为，c/c++标准并为定义函数参数的求值顺序，这些规则由编译器定义，因此不同编译器可能有不同处理方式，这样的代码尽量不要写

说明代码是错的  完毕


Question: 关于C语言问件的写入问题

结贴就是感谢了  引用 9 楼 m0_46078443 的回复:[quote=引用 8 楼 user-1的回复:][quote=引用 7 楼 m0_46078443 的回复:] [quote=引用 5 楼 user-1的回复:]fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？[/quote] 你去仔细看看stdout是个什么东西，本质是一段缓存，他的接口定向就什么设备，就是刷新缓存到设备，可以是文件，可以是终端，也可以是其它硬件。[/quote] 哦好的，大概有些了解了，感谢你呀[/quote]

引用 8 楼 user-1的回复:[quote=引用 7 楼 m0_46078443 的回复:] [quote=引用 5 楼 user-1的回复:]fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？[/quote] 你去仔细看看stdout是个什么东西，本质是一段缓存，他的接口定向就什么设备，就是刷新缓存到设备，可以是文件，可以是终端，也可以是其它硬件。[/quote] 哦好的，大概有些了解了，感谢你呀

引用 7 楼 m0_46078443 的回复:[quote=引用 5 楼 user-1的回复:]fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？[/quote] 你去仔细看看stdout是个什么东西，本质是一段缓存，他的接口定向就什么设备，就是刷新缓存到设备，可以是文件，可以是终端，也可以是其它硬件。

引用 5 楼 user-1的回复:fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？

查资料百度上的并不权威，还是看专业的资料好些。

引用 3 楼 m0_46078443的回复:[quote=引用 2 楼 user-1的回复:][quote=引用 1 楼 m0_46078443 的回复:] [quote=引用 楼主 m0_46078443的回复:]C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现[/quote] fflush(文件打开名柄),不是stdout[/quote] 哦，真的也，可我百度的是说fflush(stdout)来输出缓存区数据的呀，这。。。[/quote] 哦，是不是文件就是这样不是文件才是fflush(srdout)

引用 2 楼 user-1的回复:[quote=引用 1 楼 m0_46078443 的回复:] [quote=引用 楼主 m0_46078443的回复:]C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现[/quote] fflush(文件打开名柄),不是stdout[/quote] 哦，真的也，可我百度的是说fflush(stdout)来输出缓存区数据的呀，这。。。

引用 1 楼 m0_46078443 的回复:[quote=引用 楼主 m0_46078443的回复:]C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现[/quote] fflush(文件打开名柄),不是stdout

引用 楼主 m0_46078443的回复:C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现


Question: 蛮有意思的一题

所需要时间， 一毫秒不到。时间为O(n), 空间为常数    int cr(const char* c, const int a,  char* r) { 	r[0] = c[0]; 	int n = 1; 	for (int i = 1; i < a; i++) 	{ 		bool b = 0; 		for (int j = 0; j < n; j++) 		{ 			if (c[i] == r[j]) 			{ 				b = 1; 				break; 			} 		} 		if (!b) 			r[n++] = c[i]; 	}  	r[n] = 0; 	return n; } int ma(const char* m, const int a, const char* r, const int b, const char** tb ) { 	const char* srb = 0; 	int srn = a+1;  	const char* rt[0xff] = {0}; 	int rtn = 0; 	for (int i = 0; i < a; i++) 	{ 		int fat = -1; 		for (int j = 0; j < b; j++) 		{ 			if (m[i] == r[j]) 			{ 				fat = j; 				break; 			} 		} 		if (fat <0) 			continue; 		bool blnk = 0 == rt[fat] ; 		rt[fat] = m +i; 		if (blnk) 		{ 			rtn++; 			if (rtn >= b) 			{ 				const char* curb = (const char*)(-1), *cure = 0; 				int curbN = 0; 				for (int k = 0; k < b; k++) 				{ 					if (curb > rt[k]) 					{ 						curbN = k; 						curb = rt[k]; 					} 					if (cure < rt[k]) 						cure = rt[k]; 				} 				int curN = cure - curb; 				if (curN < srn) 				{ 					srb = curb; 					srn = curN; 				}  				rt[curbN] = 0; 			} 		}  	}  	if (!srb) 		return 0; 	*tb = srb; 	return srn+1; }    int ft(const char* y,   const char* x, const char** mr) {  	int yn = strlen(y); 	int xn = strlen(x); 	char r[0xff+1];  	//	去重 	int nc = cr(x, xn, r); 	//	匹配 	//	最短组合 	return  ma(y, yn, r, nc, mr); }  void fft(const char* y, const char* x) { 	const char* mr = 0;  	LARGE_INTEGER lgb, lge, lgt; 	QueryPerformanceFrequency(&lgt);  	QueryPerformanceCounter(&lgb); 	int mrn = ft(y, x, &mr); 	QueryPerformanceCounter(&lge);  	for (const char* b = mr; b < mr + mrn; b++) 	{ 		printf("%c", *b); 	} 	printf(",\tCPU时间戳(毫秒): %f, \r\n", (lge.LowPart - lgb.LowPart)*1000.0f / lgt.LowPart); }  int _tmain(int argc, _TCHAR* argv[]) { 	const char* y = "obzcopzocynyrsgsarijyxnkpnukkrvzuwdjldxndmnvevpgmxrmvfwkutwekrffnloyqnntbdohyfqndhzyoykiripdzwiojyoznbtogjyfpouuxvumtewmmnqnkadvzrvouqfbbdiqremqzgevkbhyoznacqwbhtrcjwfkzpdstpjswnpiqxjhywjanhdwavajrhwtwzlrqwmombxcaijzevbtcfsdcuovckoalcseaesmhrrizcjgxkbartdtotpsefsrjmvksqyahpijsrppdqpvmuocofuunonybjivbjviyftsyiicbzxnwnrmvlgkzticetyfcvqcbjvbufdxgcmesdqnowzpshuwcseenwjqhgsdlxatamysrohfnixfprdsljyyfhrnnjsagtuihuczilgvtfcjwgdhpbixlzmakebszxbhrdibpoxiwztshwczamwnninzmqrmpsviydkptjzpktksrortapgpxwojofxeasoyvyprjoguhqobehugwdvtzlenrcttuitsiijswpogicjolfxhiscjggzzissfcnxnvgftxvbfzkukqrtalvktdjsodmtgzqtuyaqvvrbuexgwqzwduixzrpnvegddyyywaquxjxrnuzlmyipuqotkghfkpknqinoidifnfyczzonxydtqroazxhjnrxfbmtlqcsfhshjrxwqvblovaouxwempdrrplefnxmwrwfjtebrfnfanvvmtbzjesctdgbsfnpxlwihalyiafincfcwgdfkvhebphtxukwgjgplrntsuchyjjuqozakiglangxkttsczhnswjksnuqwflmumpexxrznzwxurrysaokwxxqkrggytvsgkyfjrewrcvntomnoazmzycjrjrqemimyhriyxgrzcfuqtjhvjtuhwfzhwpljzajitrhryaqchnuawbxhxrpvyqcvhpggrpplhychyulijhkglinibedauhvdydkqszdbzfkzbvhldstocgydnbfjkcnkfxcyyfbzmmyojgzmasccaahpdnzproaxnexnkamwmkmwslksfpwirexxtymkmojztgmfhydvlqtddewjvsrmyqjrpycbmndhupmdqqabiuelacuvxnhxgtpvrtwfgzpcrbhhtikbcqpctlxszgpfbgcsbaaiapmtsucocmpecgixshrrnhyrpalralbccnxvjzjllarqhznzghswqsnfuyywmzbopyjyauknxddgdthlabjqtwxpxwljvoxkpjjpfvccyikbbrpdsyvlxscuoofkecwtnfkvcnzbxkeabtdusyhrqklhaqreupakxkfzxgawqfwsaboszvlshwzhosojjotgyagygguzntrouhiweuomqptfjjqsxlbylhwtpssdlltgubczxslqjgxuqnmpynnlwjgmebrpokxjnbiltvbebyytnnjlcwyzignmhedwqbfdepqakrelrdfesqrumptwwgifmmbepiktxavhuavlfaqxqhreznbvvlakzeoomykkzftthoemqwliednfsqcnbexbimrvkdhllcesrlhhjsspvfupxwdybablotibypmjutclgjurbmhztboqatrdwsomnxnmocvixxvfiqwmednahdqhxjkvcyhpxxdmzzuyyqdjibvmfkmonfxmohhshpkhmntnoplphqyprveyfsmsxjfosmicdsjrieeytpnbhlsziwxnpmgoxneqbnufhfwrjbqcsdfarybzwaplmxckkgclvwqdbpumsmqkswmjwnkuqbicykoisqwoootrdpdvcuiuswfqmrkctsgrevcxnyncmivsxbpbxzxpwchiwtkroqisnmrbmefbmatmdknaklpgpyqlsccgunaibsloyqpnsibwuowebomrmcegejozypjzjunjmeygozcjqbnrpakdermjcckartbcppmbtkhkmmtcngteigjnxxyzaibtdcwutkvpwezisskfaeljmxyjwykwglqlnofhycwuivdbnpintuyhtyqpwaoelgpbuwiuyeqhbvkqlsfgmeoheexbhnhutxvnvfjwlzfmvpcghiowocdsjcvqrdmkcizxnivbianfpsnzabxqecinhgfyjrjlbikrrgsbgfgyxtzzwwpayapfgueroncpxogouyrdgzdfucfrywtywjeefkvtzxlwmrniselyeodysirqflpduvibfdvedgcrzpzrunpadvawfsmmddqzaaahfxlifobffbyzqqbtlcpquedzjvykvarayfldvmkapjcfzfbmhscdwhciecsbdledspgpdtsteuafzbrjuvmsfrajtulwirzagiqjdiehefmfifocadxfuxrpsemavncdxuoaetjkavqicgndjkkfhbvbhjdcygfwcwyhpirrfjziqonbyxhibelinpllxsjzoiifscwzlyjdmwhnuovvugfhvquuleuzmehggdfubpzolgbhwyeqekzccuypaspozwuhbzbdqdtejuniuuyagackubauvriwneeqfhtwkocuipcelcfrcjcymcuktegiikyosumeioatfcxrheklookaqekljtvtdwhxsteajevpjviqzudnjnqbucnfvkybggaybebljwcstmktgnipdyrxbgewqczzkaxmeazpzbjsntltjwlmuclxirwytvxgvxscztryubtjweehapvxrguzzsatozzjytnamfyiitreyxmanhzeqwgpoikcjlokebksgkaqetverjegqgkicsyqcktmwjwakivtsxjwrgakphqincqrxqhzbcnxljzwturmsaklhnvyungjrxaonjqomdnxpnvihmwzphkyuhwqwdboabepmwgyatyrgtboiypxfavbjtrgwswyvcqhzwibpisydtmltbkydhznbsvxktyfxopwkxzbftzknnwipghuoijrbgqnzovxckvojvsqqraffwowfvqvfcmiicwitrhxdeombgesxexedlakitfovtydxunqnwqqdeeekiwjnwoshqcsljiicgobbbuqakjdonjawgjlezdnqhfdqnmsuavxdpnfzwipmspiabveaarshzwxmirgkmfncvtdrdvfxkpxlkdokxgtwcskmjryyymcthfnkasinihaunohkxaibtsqelockaefjmsuolebtnepauwmrxutspjwaxbmahsjtkfkxlnszribmeofbkyvbjscjtqjakuwvcgunvnonvqbbggfshauqsyznokqbhowjusypfnecffenojfvlblgzntqzlrgzprvhqnpfrrkzxznieiuivajivzijsqijigtatifmbplzqahuidegfoobpymkputzamzvweiyvvzlwihgmmmrcburbgbsdxrfjsbiylitghgcpqjbevvgypxcybubyoijijrhuzcdijfybqbfowlookqmlnplbxvjjosfqviygqyhgamuwzjklbyzopkrnhbywtfoqomweldmlrhjqswctubiknzzvcztyehouvnyiqnvkufaobehxhrjvtisxjlxoumipzjarwvbsaegdkpbsjmpevjbewzuqnfhoohhmdjgfpmjzdmtmykqvtucptwfidpwtwffzolffzqfdearclkyeecuzabjeqhxpmfodsvisnpxrqowdawheydfyhoexvcmihdlzavtqlshdhdgjzpozvvackebhgqppvcrvymljfvooauxcjnbejdivikcoaugxwzsulgfqdtefpehbrlhaoqxwcancuvbqutnfbuygoemditeagmcveatgaikwflozgdhkyfqmjcruyyuemwbqwxyyfiwnvlmbovlmccaoguieu"; 	const char* x = "cjgamyzjwxrgwedhsexosmswogckohesskteksqgrjonnrwhywxqkqmywqjlxnfrayykqotkzhxmbwvzstrcjfchvluvbaobymlrcgbbqaprwlsqglsrqvynitklvzmvlamqipryqjpmwhdcsxtkutyfoiqljfhxftnnjgmbpdplnuphuksoestuckgopnlwiyltezuwdmhsgzzajtrpnkkswsglhrjprxlvwftbtdtacvclotdcepuahcootzfkwqhtydwrgqrilwvbpadvpzwybmowluikmsfkvbebrxletigjjlealczoqnnejvowptikumnokysfjyoskvsxztnqhcwsamopfzablnrxokdxktrwqjvqfjimneenqvdxufahsshiemfofwlyiionrybfchuucxtyctixlpfrbngiltgtbwivujcyrwutwnuajcxwtfowuuefpnzqljnitpgkobfkqzkzdkwwpksjgzqvoplbzzjuqqgetlojnblslhpatjlzkbuathcuilqzdwfyhwkwxvpicgkxrxweaqevziriwhjzdqanmkljfatjifgaccefukavvsfrbqshhswtchfjkausgaukeapanswimbznstubmswqadckewemzbwdbogogcysfxhzreafwxxwczigwpuvqtathgkpkijqiqrzwugtr"; 	fft(y, x);  	y = "dhs5goe13j45ddsfoea"; 	x = "esd"; 	fft(y, x);  	 y = "sdjajkcfaknfjdash   "; 	 x = "anc"; 	fft(y, x);  	return 0;  }

顶一下

引用 10 楼 qybao 的回复:找出B每个不同字符在A的下标，并且统计B有多少个不同的字符，从第一个下标开始找，直到B的字符下标都出现，算出两个下标了间隔，取间隔最小的一组即可。  想法一致，先去重，再按这法子找，这个思路已经有java的实现了，原贴中哪一层有链接来着

引用 8 楼 與蘤舊縐 的回复：[quote=引用 7 楼 初学小菜 的回复:] [quote=引用 4 楼 與蘤舊縐 的回复：][quote=引用 3 楼 初学小菜 的回复:] 没有时间复杂度要求，set暴力直接做不就行了……  总得对自己有点要求，你看人家js毫秒级出解，C能虚了他[/quote]方便的话可以发出oj链接呀，搞一下不就知道那个速度更快了[/quote]  看上面发的原帖链接，不是oj[/quote]那就么得意思了……

引用 7 楼 初学小菜 的回复:[quote=引用 4 楼 與蘤舊縐 的回复：][quote=引用 3 楼 初学小菜 的回复:] 没有时间复杂度要求，set暴力直接做不就行了……  总得对自己有点要求，你看人家js毫秒级出解，C能虚了他[/quote]方便的话可以发出oj链接呀，搞一下不就知道那个速度更快了[/quote]  看上面发的原帖链接，不是oj

引用 4 楼 與蘤舊縐 的回复：[quote=引用 3 楼 初学小菜 的回复:] 没有时间复杂度要求，set暴力直接做不就行了……  总得对自己有点要求，你看人家js毫秒级出解，C能虚了他[/quote]方便的话可以发出oj链接呀，搞一下不就知道那个速度更快了

引用 4 楼 與蘤舊縐 的回复：[quote=引用 3 楼 初学小菜 的回复:] 没有时间复杂度要求，set暴力直接做不就行了……  总得对自己有点要求，你看人家js毫秒级出解，C能虚了他[/quote]10的6次以下都是0ms

引用 4 楼 與蘤舊縐 的回复：[quote=引用 3 楼 初学小菜 的回复:] 没有时间复杂度要求，set暴力直接做不就行了……  总得对自己有点要求，你看人家js毫秒级出解，C能虚了他[/quote]多大数据10的9次？

引用 3 楼 初学小菜 的回复:没有时间复杂度要求，set暴力直接做不就行了……  总得对自己有点要求，你看人家js毫秒级出解，C能虚了他

没有时间复杂度要求，set暴力直接做不就行了……

顶一下，但是不想做，今天脑子被微分方程搞炸了


Question: 怎么定义一个指针，指向指针数组

使用typedef定义指针数组为PA，再用PA*定义你需要的内容。 这样做可以降低复杂度。

引用 1 楼 user-2 的回复:**((int *[10])(*p) + 1) = 1; //这样试试 [code=c] #include<stdio.h> int main() {  int i;  int* risks[10];  risks[1] = &i;  int** p;//指向指针数组的指针  p = &risks[0];  **(p + 1) = 1;  printf("%d\n", *risks[1]);  return 0; } 我写成这样了。

**((int *[10])(*p) + 1) = 1; //这样试试


Question: 请大佬指点一个C语言链表的问题

引用 2 楼 user-1的回复:第一,data没有分配内存，简单点就改为chat data[500],记得初始化为0。 第二，把head=head->next，修改为head=q 已经解决了，谢谢

快看吐了，水平有限，实在找不出解决办法


搞定！搞定！搞定！

引用 楼主 snow_zhao_2017 的回复:用base64_decode解析一个加密字符串生成的文本第二个字符是\0  生成的文本长度是24,我是通过char a[]一个个看发现的，现在我要把这个生成的字符串传给另外一个函数，不知该怎么办 要解密的字符串是这个： YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG 你的问题在于myfunc处理的问题，他接收的参数应该是byte * str,int len,这样才可以在内部处理二进制串，你只给一个参数，遇到0之后就出错了

我怀疑你不知道什么叫二进制。

所谓的二进制数据，就是一连串01组成的字节，具体要看编码与解码是否正确， 只有去判断编码之前和解码之后的数据是否二进制相等。 比如你要把整形3编码，他的二进制数据就是0x00000003,编码为一个base64的字符串，然后解码，看看数据还是不是0x00000003

引用 3 楼 真相重于对错 的回复:[quote=引用 2 楼 snow_zhao_2017 的回复:] [quote=引用 1 楼 真相重于对错 的回复:] base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。 代码部分是这样的 char * str=base64_decode("YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG"); char * abc=myfunc(str); printf("%s",abc);  -----base64解密其它字符串是正确的，如上面就出错了，不知怎么搞[/quote] 你认为二进制数据是可以打印的？？？？？[/quote]  myfunc调用时的实际参数是解码后字符串的一部分，主要就是myfunc调用不了完整的参数

引用 2 楼 snow_zhao_2017 的回复:[quote=引用 1 楼 真相重于对错 的回复:] base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。 代码部分是这样的 char * str=base64_decode("YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG"); char * abc=myfunc(str); printf("%s",abc);  -----base64解密其它字符串是正确的，如上面就出错了，不知怎么搞[/quote] 你认为二进制数据是可以打印的？？？？？

引用 1 楼 真相重于对错 的回复:base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。 代码部分是这样的 char * str=base64_decode("YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG"); char * abc=myfunc(str); printf("%s",abc);  -----base64解密其它字符串是正确的，如上面就出错了，不知怎么搞


Question: C语言2个问题

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

puts是遇到'\0'停止输出。e没有'\0'，因此会出现越界。  a[0]。strcpy，肯定会越界的。

引用 6 楼 AKK188888881 的回复:  为什么？为什么第二个不警告？ 第一个编译器知道后面的字符串太长了。 第二个编译器不知道运行时字符串是否太长。  第二个越界读取了字符串，不是不警告，是因为这个警告一直没有纳入C标准，所以有的编译器警告，有的不警告。

为什么？为什么第二个不警告？

改成了printf还存在乱码   #include<stdio.h> #include<string.h>  int main() { 	char c[]={"C program"}; 	char d[]={"Hello"}; 	char e[]={'C',' ','p','r','o','g','r','a','m'}; 	int i; 	for(i=0;i<=4;i++) 		c[i]=d[i]; 	printf("%s\n",c);  	printf("%s\n",e); 	 	return 0; }

另外，这里面的用法gets是不可信的，可以注入非法字符串，产生内存coredump

占用的静态数据分区，由于没有定义结束符，puts实际可能会发生越界访问，这个显示时随机的

为什么超出了5个字节还是不会发出警告？   #include<stdio.h>  int main() { 	char str[5]; 	gets(str); 	puts(str); 	return 0; }

#include<stdio.h> #include<string.h>  int main() { 	char c[]={"C program"}; 	char d[]={"Hello"}; 	char e[]={'C',' ','p','r','o','g','r','a','m'}; 	int i; 	for(i=0;i<=4;i++) 		c[i]=d[i]; 	puts(c);  	puts(e); 	 	return 0; }        #include<stdio.h>  int main() { 	char e[]={'C',' ','p','r','o','g','r','a','m'}; //	for(i=0;i<=8;i++) 		puts(e); }       #include <string.h>  int main() { 	char a[0]; 	 	//将"abcd"保存到a中 	strcpy(a,"abcde"); 	//输出a中的字符串 	puts(a); 	//将"1234"保存到a中 	strcpy(a,"1234"); 	//输出a中的字符串 	puts(a); }


Question: makefile .c.o为什么不算首项


Question: C语言刚开始学的菜鸟，跪求大佬解答一下

谢谢大佬，抽空耐心解答，真的非常的感谢！

这段代码错误的地方： 1.void GetStudentInfo(int a,stu p[a]) =》函数传递 数组参数 这种写法是错误的。  2. stu networkClass[n]; => 数组不能用变量来定义长度。 将你的代码修改了一下  #include <stdio.h> #define N 40  typedef struct student {     char name[12];     int num;     int score; }stu;  void GetStudentInfo(stu p[], int n) {     int i;     for(i=0; i<n; i++)         scanf("%s%d%d",&p[i].name,&p[i].num,&p[i].score); }  void OutputStudentInfo(stu p[], int n) {     int i;     for(i=0; i<n; i++)         printf("姓名：%s\t学号：%d\t成绩：%d\n", p[i].name,p[i].num,p[i].score); }  int main() {     int i, n;     printf("请输入班级学生数：\n");     scanf("%d", &n);      stu networkClass[N]={0};      printf("请输入学生信息：姓名 学号 成绩\n");     GetStudentInfo(networkClass, n);       printf("\n学生的信息为：\n");     OutputStudentInfo(networkClass, n);       return 0;  }

void OutputStudentInfo(int b,stu q[b]) 换成stu *q试试


Question: 严蔚敏数据结构第八章的边界标识法释放内存空闲右邻区问题

引用 3 楼 KID6200 的回复:这个之前是我看错了，我忘记是可利用表了，再问个问题，为什么书上说递归看起来十分清晰？虽然很妙但我每次看都要看好久 简单的递归思路可能会很清晰，但复杂的递归还是需要一定想象能力和理解能力的，所以不能一概而论。也就是说具体情况具体分析

引用 3 楼 KID6200 的回复:为什么书上说递归看起来十分清晰？虽然很妙但我每次看都要看好久  很正常， 看别人的东西总是不如自己想的容易 你随便看看别人提问的代码，尤其是关于哪些pta，oj，csp的， 哪一个代码让你能一次看明白的， 尽管都觉得很简单的初级题目  和递归都没啥关系， 什么代码都是别人的看着难 出来工作后就会更认识到这点——每人愿意接别人的项目来修改或者急需， 都想重头再来  道理很简单， 解决问题点方法是不同的，一个问题可以以多种解法， 只要和你的想法不一致，你就看着别扭 听老师讲课不同，那是重头到尾引着你走，一步一步的 而看代码，看到的就是直接到表现，内部的关系都要自己去理解 理解慢一点儿也正常，多看看就好了

递归只能想一层，不然你大脑会死机的，一层没问题，退出条件没问题就可以不用想了.

应该是不一定相邻。我们看到的内存不是物理内存，而是虚拟内存。是通过mmuy映射过的。  对于链表，相邻的节点的内存不一定是相邻的。

毗邻是链表上的节点之间的毗邻关系，不是内存地址上的 内存地址上的毗邻不能等同于链表上的毗邻 哪怕链表是用数组来实现的，上述说明也是如此 也许初始化的时候链表上节点内存是1234这样顺序放入的，但是通过增删改查之后， 相邻的节点之间在内存上关系就可能是任何的情况，可能是38519，可以是任何的其他的关系。


Question: 十进制转换为k进制

如果余数是大于9，那是不是应该要把这个余数转成一个别的字符？比如16进制，10用A表示，11用B表示等等，大于9的用字母表示。怎么把大于9的余数转成字母，注释里已经说明了


Question: 求帮

到这里找找原因吧 https://blog.csdn.net/qq_45861670/article/details/104015023


Question: 顺序表插入和删除

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

引用 2 楼 weixin_45682176 的回复:[quote=引用 1 楼 自信男孩的回复:]因为4和Y中间除了逗号之外，还有一个空格，去掉这个空格试试。  #include<stdio.h> #include<stdlib.h>  #define MAX 100 typedef struct SeqList {     char Data[MAX];     int last; }SeqList;  SeqList * CreateSeqList(SeqList *L) {     int z=1;     int i=0;     char x;     printf("\n\t输入结点数，以'x'为结束标志\n");     while(z)     {         printf("\t输入一个字母，按回车");         scanf("%c",&x);         getchar();         if(x!='x') {             L->Data[i]=x;             i++;         } else {             z=0;         }     }//;     L->last = i;     return L; }  int SearchList(SeqList *L,char X) {     int i=0;     while((i<=L->last)&&(L->Data[i]!=X))         i++;     if(i<=L->last)         return i;     else return -1; }  int InsList(SeqList *L,int i,char x) {     int j;     if(L->last==MAX)     {         printf("表已满，无法插入！\n");         return -1;     }     if(i<0||i>L->last+1)     {         printf("位置不合法!!!\n");         return 0;     }     for(j=L->last;j>=i-1;j--)         L->Data[j]=L->Data[j-1];     L->Data[i-1]=x;     L->last++;     return 1; }  void DeList(SeqList *L,int i) {     int j;     if(i<1||i>L->last)     {         printf("不存在第i个元素");         //return 0;         return;     }     for(j=i-1;j<=L->last-1;j++)         L->Data[j]=L->Data[j-1];     L->last--; }  int LenList(SeqList *L) {     return L->last; }  void ShowList(SeqList *L) {int i;     if(L->last==0)         printf("顺序表为空\n");     printf("遍历顺序表如下\n");     for(i=0;i<L->last;i++)         printf("\tData[%d]=%c",i,L->Data[i]);     printf("\t总共%d个元素\n",L->last); }   int main() {     int s,i,I,j=1;     char x;     int n;     SeqList *L;     L=(SeqList *)malloc(sizeof (struct SeqList));     L->last=-1;     while(j)     {         printf("线性表子链系统 \n");         printf("1--------建  表\n");         printf("2--------插  入\n");         printf("3--------删  除\n");         printf("4--------显  示\n");         printf("5--------查  找\n");         printf("6--------求表长\n");         printf("7--------返  回\n");         printf("请选择菜单号(1~7)!!!\n");         scanf("%d",&s);         getchar();          switch (s) {             case 1:                 L = CreateSeqList(L);                 break;              case 2:                 printf("输入插入的位置i和插入的数据x\n");                 scanf("%d ,%c",&i,&x);                 I=InsList(L,i,x);                 if(I==1)                     printf("插入成功!!!\n");                 break;              case 3:                 printf("输入删除数据的位置:");                 //scanf("%d", i);                 scanf("%d", &i);                 DeList(L,i);                 break;              case 4:                 if(L->last==-1)                     printf("请先建立线性表\n");                 else                     ShowList(L);                 break;              case 5:                 printf("请输入查找元素:");                 scanf("%c",&x);                 I=SearchList(L,x);                 printf("该元素的下标为：%d\n",I);                 break;              case 6:                 n=LenList(L);                 printf("线性表长度为：%d\n",n);                 break;              case 7:                 j=0;exit (0);                 break;              default:                 printf("\n输入错误，请重新输入！！！");                 break;         }         /*            if(s==1)            L=CreateSeqList(L);            else            if(s==2)            {            printf("输入插入的位置i和插入的数据x\n");            scanf("%d,%c",&i,&x);            I=InsList(L,i,x);            if(I==1)            printf("插入成功!!!\n");            }            else            if(s==3)            {            printf("输入删除数据的位置:");            scanf("%d",i);            DeList(L,i);            }            else            if(s==4)            {            if(L->last==-1)            printf("请先建立线性表\n");            else            ShowList(L);            }            else            if (s==5)            {            printf("请输入查找元素:");            scanf("%c",&x);            I=SearchList(L,x);            printf("该元素的下标为：%d\n",I);            }            else            if(s==6)            {            n=LenList(L);            printf("线性表长度为：%d\n",n);            }            else            if(s==7)            { j=0;exit (0);            }            else printf("\n输入错误，请重新输入！！！");            */     }     return 0;  } 供参考～ 已解决，我前天把输入位置和输入数据分开了，就成功了，谢谢[/quote] 对于s的if else建议改成switch ... case 其他还有问题，建议对比代码找出自己的问题～

引用 1 楼 自信男孩的回复:因为4和Y中间除了逗号之外，还有一个空格，去掉这个空格试试。  #include<stdio.h> #include<stdlib.h>  #define MAX 100 typedef struct SeqList {     char Data[MAX];     int last; }SeqList;  SeqList * CreateSeqList(SeqList *L) {     int z=1;     int i=0;     char x;     printf("\n\t输入结点数，以'x'为结束标志\n");     while(z)     {         printf("\t输入一个字母，按回车");         scanf("%c",&x);         getchar();         if(x!='x') {             L->Data[i]=x;             i++;         } else {             z=0;         }     }//;     L->last = i;     return L; }  int SearchList(SeqList *L,char X) {     int i=0;     while((i<=L->last)&&(L->Data[i]!=X))         i++;     if(i<=L->last)         return i;     else return -1; }  int InsList(SeqList *L,int i,char x) {     int j;     if(L->last==MAX)     {         printf("表已满，无法插入！\n");         return -1;     }     if(i<0||i>L->last+1)     {         printf("位置不合法!!!\n");         return 0;     }     for(j=L->last;j>=i-1;j--)         L->Data[j]=L->Data[j-1];     L->Data[i-1]=x;     L->last++;     return 1; }  void DeList(SeqList *L,int i) {     int j;     if(i<1||i>L->last)     {         printf("不存在第i个元素");         //return 0;         return;     }     for(j=i-1;j<=L->last-1;j++)         L->Data[j]=L->Data[j-1];     L->last--; }  int LenList(SeqList *L) {     return L->last; }  void ShowList(SeqList *L) {int i;     if(L->last==0)         printf("顺序表为空\n");     printf("遍历顺序表如下\n");     for(i=0;i<L->last;i++)         printf("\tData[%d]=%c",i,L->Data[i]);     printf("\t总共%d个元素\n",L->last); }   int main() {     int s,i,I,j=1;     char x;     int n;     SeqList *L;     L=(SeqList *)malloc(sizeof (struct SeqList));     L->last=-1;     while(j)     {         printf("线性表子链系统 \n");         printf("1--------建  表\n");         printf("2--------插  入\n");         printf("3--------删  除\n");         printf("4--------显  示\n");         printf("5--------查  找\n");         printf("6--------求表长\n");         printf("7--------返  回\n");         printf("请选择菜单号(1~7)!!!\n");         scanf("%d",&s);         getchar();          switch (s) {             case 1:                 L = CreateSeqList(L);                 break;              case 2:                 printf("输入插入的位置i和插入的数据x\n");                 scanf("%d ,%c",&i,&x);                 I=InsList(L,i,x);                 if(I==1)                     printf("插入成功!!!\n");                 break;              case 3:                 printf("输入删除数据的位置:");                 //scanf("%d", i);                 scanf("%d", &i);                 DeList(L,i);                 break;              case 4:                 if(L->last==-1)                     printf("请先建立线性表\n");                 else                     ShowList(L);                 break;              case 5:                 printf("请输入查找元素:");                 scanf("%c",&x);                 I=SearchList(L,x);                 printf("该元素的下标为：%d\n",I);                 break;              case 6:                 n=LenList(L);                 printf("线性表长度为：%d\n",n);                 break;              case 7:                 j=0;exit (0);                 break;              default:                 printf("\n输入错误，请重新输入！！！");                 break;         }         /*            if(s==1)            L=CreateSeqList(L);            else            if(s==2)            {            printf("输入插入的位置i和插入的数据x\n");            scanf("%d,%c",&i,&x);            I=InsList(L,i,x);            if(I==1)            printf("插入成功!!!\n");            }            else            if(s==3)            {            printf("输入删除数据的位置:");            scanf("%d",i);            DeList(L,i);            }            else            if(s==4)            {            if(L->last==-1)            printf("请先建立线性表\n");            else            ShowList(L);            }            else            if (s==5)            {            printf("请输入查找元素:");            scanf("%c",&x);            I=SearchList(L,x);            printf("该元素的下标为：%d\n",I);            }            else            if(s==6)            {            n=LenList(L);            printf("线性表长度为：%d\n",n);            }            else            if(s==7)            { j=0;exit (0);            }            else printf("\n输入错误，请重新输入！！！");            */     }     return 0;  } 供参考～ 已解决，我前天把输入位置和输入数据分开了，就成功了，谢谢


Question: 菜鸟自学c入门，求大神解答一下困惑

long int 最大是2147483647

越界了，超出long int表示的范围了。  建议用字符串比较合适。  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) {     char str[32];     int ret, len, sum = 0, i;      printf("请输入数字:");     ret = scanf("%s", str);      while (ret && str[0] == '-') {         printf("请输入大于0的数字:");         ret = scanf("%s", str);     }     do {         len = strlen(str);         i = 0;         while (str[i]) {             sum += str[i++] - '0';         }         if (sum == 0) {             printf("请输入大于0的数字:");             ret = scanf("%s", str);         }     } while (sum == 0);       printf("位数：%d, 各位数之和为%d\n", len, sum);      return 0; } 供参考～   对于以0开头的数字，就会有问题，建议完善一下

引用 5 楼 ?Victor.??的回复:试试这个 #include <stdio.h> int main() {     int sum=0; 	int count=0;     long long int num;     printf("请输入数字：");     scanf("%lld",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%lld",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }  %l64d是什么操作 现在没啥问题了

引用 5 楼 ?Victor.??的回复:试试这个 #include <stdio.h> int main() {     int sum=0; 	int count=0;     long long int num;     printf("请输入数字：");     scanf("%lld",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%lld",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }  %l64d是什么操作 好的 万分感谢

引用 3 楼 ?Victor.??的回复:[quote=引用 2 楼 m0_46379100 的回复:] [quote=引用 1 楼 ?Victor.??的回复:]long int 最大是2147483647 我使用long long后为什么总是会输出12位数，而且各位数只和也不正确[/quote] 你贴一下源码，我试一试[/quote] #include <stdio.h> #include <stdlib.h> #include <math.h> int main() {     int sum=0,count=0;     long long num;     printf("请输入数字：");     scanf("%l64d",&num);     do{         if(num<0)         {             printf("请输入大于0的数字:");             scanf("%l64d",&num);         }     }while(num<0);       while(num!=0)     {         sum+=num%10;         num/=10;         count++;     }     printf("位数%d，各位数之和为%d。\n",count,sum); }

引用 2 楼 m0_46379100 的回复:[quote=引用 1 楼 ?Victor.??的回复:]long int 最大是2147483647 我使用long long后为什么总是会输出12位数，而且各位数只和也不正确[/quote] 你贴一下源码，我试一试

引用 1 楼 ?Victor.??的回复:long int 最大是2147483647 我使用long long后为什么总是会输出12位数，而且各位数只和也不正确


Question: 关于C语言中限时的问题

SetTimer一时爽

游戏开始的时候time_t start = time(NULL); 在每次游戏过程中判断: if (time(NULL) - start >= 60) {       game_over(); }

vc mfc 里面有定时器

可以考虑用多线程，一个线程用于计时，定为线程1，另一个线程用于处理得分，定为线程2。

可以考虑用多线程，一个线程用于计时，一个用于计分。


Question: debug可以运行，但是run就会异常终止

救救孩子吧，本来一直靠debug发现错误修正，结果现在debug运行也不报错


Question: 求解

为了避免上一次的输入缓存残留的回车符造成影响，控制得当可以不需要前面的空格 比如 scanf(“%d”, &a); scanf(“%c”, &c); printf(“%d,%d\n”, a, c); 输入 5回车 看看第二行scanf会不会等待输入？看看c是什么？

都可以加，也可以不加，运行时没什么区别的


Question: 大神帮忙看看这道删除链表哪里有问题啊…

建议直接贴代码～

前面的代码是没有空头结点的ListNode链表，如果有初始化的时候多一次判断就是了

struct ListNode * delete（struct ListNode * head） {              if ( NULL == head ) return head;                // 空表           if ( NULL == head->next ) return head;     // 只有一个元素的表           ListNode* pFirst, * pSecond;           pFirst = head;  pSecond  = head->next;           while ( pSecond ) {                  if ( pFirst->val == pSecond->val ) {                       pFirst->next =pSecond->next;                       free(pSecond);                       pSecond = pFirst->next;                       continue;                 }                 pFirst = pSecond;                 pSecond = pSecond->next;           }           return head; // 无论如何head指针都不会变 }

删除第一个while上面的两句代码。删除第一个if第三句p=p->next

引用 1 楼 user-4 的回复：删除第一个while上面的两句代码。删除第一个if第三句p=p->next还是不对，他输出的还是1233啊


Question: MiniGui 大号逻辑字体有脏点

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

本帖子已结，处理方法看我博客


Question: realloc错误

引用 2 楼 tjw316248269 的回复:[quote=引用 1 楼 自信男孩 的回复:] realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 注意，要用keys作为返回值，即 keys = realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 我后来改成了用keys做返回值，说我数组越界，我看我程序其他地方，不存在越界情况。所以应该还是这里出问题了。 最重要的是，为什么我在windows跑这个，没有返回值，keys的size也realloc了？Linux下gcc就不行了[/quote] 问一下你的keys里之前有没有内容？看到你用strlen了，需要确认一下传入keys时，里面是否有字符串？ 如果没有，那么就会有问题。

引用 1 楼 自信男孩 的回复:realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 注意，要用keys作为返回值，即 keys = realloc(keys, (bufLen + KEY_LEN) * sizeof(char)); 我后来改成了用keys做返回值，说我数组越界，我看我程序其他地方，不存在越界情况。所以应该还是这里出问题了。 最重要的是，为什么我在windows跑这个，没有返回值，keys的size也realloc了？Linux下gcc就不行了


Question: 有没有人会这道题的

dai+m*i 顺序存储跟数组一样

画图，或者用数组。

看起来是一个小学5年纪的数学应用题 也就涉及一点加减乘除四则运算  不会请从小学数学开始重新学习

3楼说得对  引用 3 楼 m0_46108109 的回复:dai+m*i 顺序存储跟数组一样


Question: 求大佬指点！数据结构与算法

要原码谷歌百度一下就好了 要问问题就自己先写代码，有不对的地方再贴出来询问

数据结构的题目，离不开画图。


Question: 兼容任务，跪求大佬写一下


Question: 想请大神们帮我看看这个为什么运行出来没结果

单步执行、设置断点，试试。


Question: dev c++搞事情，请教大神

引用 1 楼 與蘤舊縐 的回复:没有引用你想干嘛，dev可不会自动导包 哎呀呀，忘了声明了，尴尬尴尬

这种最好定义头文件，可以用.hpp，关于h和hpp百度即可

没有引用你想干嘛，dev可不会自动导包


Question: 当选择全部时如何让显示所有的数据？

可以判定所选定的下拉选项的索引， 也可以判断选择项的内容


Question: 求解

引用 2 楼 自信男孩的回复:是因为输入1后，后面b接收的是换行符'\n'，所以c接收的是a。你可以通过b的输出可以知道接收的是换行符 嗯嗯多谢(o^^o)那我在%c前面加个空格就都可以了 还想再问一下为什么下面%f不需要在前面加空格

把scanf("% c", &b); %和c中间的空格去掉试试看

是不是按了2次换行符?


Question: 用LED灯做一个三秒全亮。

通过p2口。

就是需要一个LED灯延时三秒的程序。


Question: fgets问题

引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 自信男孩 的回复:] 注意数组越界是未定义行为，即可能没问题。 这个没问题，可能是系统分配的字节数比你要求的多导致的。但是这个不要寄希望系统多分配，要根据实际需要来决定申请多少个 所以就是说这种赋值方式可能出错可能没错，实际编程中即使不报错也不要写这种有风险的代码对吗？[/quote] 当然，不能让数组越界呢。所以，要根据需要多申请一些空间。

引用 1 楼 自信男孩 的回复:注意数组越界是未定义行为，即可能没问题。 这个没问题，可能是系统分配的字节数比你要求的多导致的。但是这个不要寄希望系统多分配，要根据实际需要来决定申请多少个 所以就是说这种赋值方式可能出错可能没错，实际编程中即使不报错也不要写这种有风险的代码对吗？


Question: 求大佬帮小白我看看这个源代码，哪里错了，能运行为啥它就出不来结果

直接发代码多好

没带放大镜，看不清楚。

引用 3 楼 weixin_46298094 的回复:[quote=引用 1 楼 ?Victor.??的回复:]看不清 我私发给你好不，帮我看看[/quote] 好的，能力有限，不一定能看明白

引用 1 楼 ?Victor.??的回复:看不清 我私发给你好不，帮我看看

抱歉抱歉，那个没加载原图

看不清


Question: 【C语言】"abc" 和 { 'a', 'b', 'c' } 有什么区别？

引用 9 楼 关于0318 的回复:[quote=引用 1 楼 真相重于对错 的回复:] 引用 3 楼 lin5161678 的回复: 引用 8 楼 自信男孩 的回复: 可不可以这样理解： "abc" 返回一个地址，指向 'a'，并且后续有 'b', 'c', '\0' { 'a', 'b', 'c' } 返回一个一个值，这个值就是 'a', 'b', 'c'[/quote]不可以

引用 1 楼 真相重于对错 的回复: 引用 3 楼 lin5161678 的回复: 引用 8 楼 自信男孩 的回复: 可不可以这样理解： "abc" 返回一个地址，指向 'a'，并且后续有 'b', 'c', '\0' { 'a', 'b', 'c' } 返回一个一个值，这个值就是 'a', 'b', 'c'

第一个是字符串，第二个是字符数组。当然第一个也是字符数组，只不过第一个字符数组比第二个每个数组都多一个'\0'

引用 4 楼 关于0318 的回复:[quote=引用 3 楼 lin5161678 的回复:] "abc" 作为 char数组初始化项的时候 是{ 'a', 'b', 'c', 0 }的简写 其他地方 "abc"是一个char[4] 数组 这两行是不是有笔误，大佬，我看着有点不太明白[/quote] char str[] = "123"; 和 char str[] = {'1', '2', '3', 0}; 意思完全一样  这里的 "123" 是  {'1', '2', '3', 0} 的简写 除了初始化char数组这种情况之外的 "123"是一个char[4]数组 和  {'1', '2', '3', 0} 完全没关系

然后，你再看一下啊  char str[]="abc"; size_t s = sizeof(str)；是多少？

引用 2 楼 关于0318 的回复:[quote=引用 1 楼 真相重于对错 的回复:] 第二个每一个最后一个字符不是\0  可是我试了一下 [/quote] char a[]={'a','b','c'}; size_t s =sizeof(a); 看看 s是多少，而不是看s[3]是不是等于‘\0';

引用 3 楼 lin5161678 的回复:"abc" 作为 char数组初始化项的时候 是{ 'a', 'b', 'c', 0 }的简写 其他地方 "abc"是一个char[4] 数组 这两行是不是有笔误，大佬，我看着有点不太明白

"abc" 作为 char数组初始化项的时候 是{ 'a', 'b', 'c', 0 }的简写 其他地方 "abc"是一个char[4] 数组  这里 "abc"是作为 char*的初始化 注意 这里不是 char[] 初始化  这里的"abc"是一个数组 而不是 简写  和   { 'a', 'b', 'c', 0 } 完全没联系   char *b[] = {   { 'a', 'b', 'c' },   { 'b', 'c', 'd' } } b[0]是一个char*  初始化必须是一个char* 或者可以转换为char*的表达式  { 'a', 'b', 'c' } 不符合这两个条件 这里是语法错误

引用 1 楼 真相重于对错 的回复:第二个每一个最后一个字符不是\0  可是我试了一下

第二个每一个最后一个字符不是\0


Question: 求解

没错啊，，，，八进制是要写成 061 啊，十六进制是要写成 0x 开头啊。相信你自己！

int a = 061; int b = 0x30; int c = 48;    建议自己写个小程序把这个三个变量输出一下，以%d输出。 自己验证一下～


Question: 红色输入函数代码要求循环5次，但是运行编译的时候是输入6次，为什么？

引用 1 楼 自信男孩 的回复: scanf("%f",&a[i]); 去掉'\n' 标准输入是行缓冲，因此不需要用'\n'匹配，需要输入换行符才会将缓冲区的数据刷到内存里。感谢

[code=c]scanf("%f",&b[i]);[/code 这个也是，去掉'\n'


Question: pta Reversing Linked List 求助

说一下需求吧

求大佬指点啊QAQ

引用 6 楼 939493 的回复:[quote=引用 3 楼 自信男孩 的回复:] 说一下需求吧 求大佬帮我看一下我的代码什么地方有问题！！ 这道题我想用纯链表做... 79行到105行的代码我改过了   List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL;                                List f;     f=L2->Next;  [/quote]  说一下需求，是指代码的需求，就是这个代码是实现什么什么的。 楼主的代码最好能定义多个函数，不要都写到main函数里，代码可读性不好。

引用 3 楼 自信男孩 的回复:说一下需求吧 求大佬帮我看一下我的代码什么地方有问题！！ 这道题我想用纯链表做... 79行到105行的代码我改过了   List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL;                                List f;     f=L2->Next;

引用 4 楼 寻开心 的回复:List L2,x1,x2;     x1=newL->Next;     x2=x1->Next;     L2=newL;     for(i=0;i<n;i++){         if(x2->Next){  80行前后这一段，你能确保newL当中至少有两个元素吗？ 如果只有一个元素的话，x2 = x1->next， x2就是NULL， for循环里面的x2->next就是错误访问了 我改了一下这部分代码  List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL; 段错误的问题是没了 但是我自己运行跟样例是一样的 提交还是错误..   引用 4 楼 寻开心 的回复:List L2,x1,x2;     x1=newL->Next;     x2=x1->Next;     L2=newL;     for(i=0;i<n;i++){         if(x2->Next){  80行前后这一段，你能确保newL当中至少有两个元素吗？ 如果只有一个元素的话，x2 = x1->next， x2就是NULL， for循环里面的x2->next就是错误访问了 我改了一下这部分代码  List L2,x1,x2,x3;     x1=newL->Next;     L2=(List)malloc(sizeof(Node));     L2->Next=NULL;     x2=L2;     while(x1){     	x3=(List)malloc(sizeof(Node));     	x3->adress=x1->adress;     	x3->data=x1->data;     	if(x1->Next){     		x3->nextadress=x1->Next->adress; 		}else{ 			x3->nextadress=-1; 		} 		x2->Next=x3; 		x2=x3; 		x1=x1->Next; 	} 	x2->Next=NULL; 自己测试的数据是对的 但是提交了就是错误的....


Question: 求助！！！c语言：数值数组为什么只能利用循环才能输出所有元素？

没有办法，这是打印格式的规则。%s会从数组首地址开始按字符打印，直到遇到'\0'字符才结束打印，%d就只是打印一个整形。 而且数组的地址是个数组指针，所以printf("%d\n",&arr); 就是打印一个地址而已

字符数组是因为有'\0'，即字符串结束标记。%s输出其实是一个字符一个字符输出直到遇到'\0'结束。  %d输出是输出内存4个字节（32位系统）的内容。

数组就是数组，代表的是是同类型的一个连续的存储区域； 但是直接拿数组的名字使用的时候，除了sizeof函数，都是在把它当做指针来使用的 函数传参的时候一样， 数组的名字就是指针，你无法把一个数组所有的数据都作为参数传进去  其实你可以想一下，自己如何来实现这个printf函数来打印数组的 你可以定义一个函数MyPrintf（），要打印数组，你如何传递参数？  需要一个指针，还需要一个大小 光传递一个指针进去是不行的 void MyPrintf(int a[10]) {        printf("%d\n",  sizeof(a) / sizeof(int)); } int main () {      int a[10];      printf("%d\n",  sizeof(a)/sizeof(int));      MyPrintf(a);     return 0; }  你猜， MyPrintf函数会打印出什么？  1， 2， 还是10？   试验告诉我们，函数传参进来后，你即便传递给它的是一个数组对象，但是传递进来的它还就是一个指针 你不知道他的大小，自然就无法打印整个数组了

对于数值数组你也可以使用printf("%s",arr)；进行打印，但是由于数值数组的值中是否有‘\0’值，却不得而知，打印的也可以是乱码。 对于字符数组，如果printf中的输出控制符使用%c,或乾%d，也是要逐一遍历字符数组才可以的。


Question: c语言怎么样才能够统计文件中每行有多少个空格，并只保留每行中的第一个空格(｡•́︿•̀｡)

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

引用 8 楼 giarffe2333 的回复:[quote=引用 7 楼 自信男孩 的回复:] 用fscanf可以的。但是需要三个%s(fscanf("%s  %s  %s", word, means[1], means[2]);）  另外，也可以通过fgets先读取一行，然后用strtok_r/strtok分开。  每个单词建立一个结构体，一个word，两个means  struct words_msg { char word[16]; char means[2][32]; }; 但是有的单词没有两种意思，读取的时候不会出错吗[/quote] 那试试第二种方法，strtok

救救孩子吧

😶放错图片了，第一张图片错了

正则表达式，可以完成。

引用 5 楼 giarffe2333 的回复:[quote=引用 3 楼 user-4 的回复:] 每次读取一行，然后找到第一个空格所在位置，把这个空格改成'\0'，这一行就分成两个部分了 有办法每次读取一行吗[/quote] fgets() 函数每次读一行，然后 strchr() 找到第一个空格出现的位置，将这一位置为 '\0' 并记录下一位的地址，这样一行就被分为两个单词和释义两个部分

引用 7 楼 自信男孩 的回复:用fscanf可以的。但是需要三个%s(fscanf("%s  %s  %s", word, means[1], means[2]);）  另外，也可以通过fgets先读取一行，然后用strtok_r/strtok分开。  每个单词建立一个结构体，一个word，两个means  struct words_msg { char word[16]; char means[2][32]; }; 但是有的单词没有两种意思，读取的时候不会出错吗

引用 4 楼 proorck2019 的回复:正则表达式，可以完成。 啊？正则表达式怎么用呢..

引用 3 楼 user-4 的回复:每次读取一行，然后找到第一个空格所在位置，把这个空格改成'\0'，这一行就分成两个部分了 有办法每次读取一行吗


Question: 这个for循环实现的数学意义是什么？

if(num % i == 0) {     flag =0;     break; }   建议加一个break，跳出循环，提高程序的效率。  如果能整除，则说明不是素数。

判断是否是质数

最繁琐的是 for(i = 2;i < num;i++) { if(num % i == 0) { flag =0; }  现在只是for(i = 2;i < num/2;i++),减少一半的计算量

引用 2 楼 喜欢做我自己的回复:判断是否是素数，如果一个数可以被除1以外的整数整除，那么除数最大为该数的一半，这样就不需要进行从1到这个数的穷举计算，这样可以减少一半的计算量 能花一个for循环的计算程序框图吗我是初学者有些东西还是不太能感悟

有可能是判断素数


Question: 这个表达式怎么弄？

在所有的运算符里面，逗号的优先级是最低的。

逗号两侧是不同的部分，=的作用范围只在逗号之前

按照你的想法应该这么写： y=((x=a+b),b+c) 因为c语言中逗号运算符的优先级是最低的

y=(x=a+b),b+c 这种写法相当于： (y=(x=a+b)),(b+c)

会不会是因为逗号表达式，是从右往左计算的？


Question: C语言

同一层的宏定义最好都贴在左边写

因为英语有事态 define和defined是不同的含义 define宏定义 defined宏定义过  #ifdef是if define的缩写 #elif是else if的缩写 直接SECOND，未明含义，SECOND被忽略了

#define不加d是声明，后面在运用时就应该加上d呢。  https://www.cnblogs.com/droidxin/p/3446451.html


Question: 想请教一个关于c语言PlaySound函数的问题

啊啊啊还真是这个原因 对于相对路径我之前一直理解错了 谢谢！

要和exe文件在一起的 更准确的说， 是要在执行目录下（exe都不一定在执行目录下） ide调试状态， 项目设置上会有执行目录的设置，不同的编译环境不一样 编译出来的exe比如在d:\abc\123.exe 你完全可以在c：\>的cmd提示符下，输入d:\abc\123.exe这个时候，执行目录就是c：\ 你也可以cmd进入d：\abc\目录下输入123.EXE来执行，此时执行目录就是d:\abc 、


Question: 线程中某函数返回局部变量地址后立即使用，理论上是否一定会取到正确的值？

不正确  首先 最基本的 程序优化有可能把整个函数优化掉  根本不存在函数调用 不存在返回  你的分析就是空中楼阁 毫无意义

不要做未定义行为，也不要浪费时间思考这种问题，堆栈清理由谁做，什么时候做，怎么做是没有标准的，具体要去查你所使用编译器的堆栈调用方式


Question: 一个结构体声明时，就算用到之后才会声明的别的结构体也不要紧？

你这里不能做的是这样的： typedef struct dog {      struct fish * afish;    // fish将在下面才会声明，但是这里就可以使用，这么做我实际用vs运行了，正常。     fish weight; }dog;   typedef struct fish {         dog weight; }fish;  dog里面有fish类型变量，fish里面有dog类型变量， 这样就互相嵌套没完没了了，这种怎么都不行的 但是 dog *， fish *类型变量就无所谓 他们都是指针而已， 定义结构关键是能知道结构的大小， 能确定大小，你可以定义

你自己试验一下就知道了，可以通过的  某些编译器如果不让，那大不了在最上边加上 struct fish; struct dog; 告知有这种类型存在就是了


Question: 两个结构体声明相互包含对方的指针，不需要额外做点什么就能通过编译？

本来就可以，我想你理解错了书本的意思。指针随便你指什么类型都可以，就算是从未出现过的结构体也行(用迂腐的语言讲，这是不完整的类型，相对应的是完整类型)，只不过不能解引用罢了。

不建议把结构体互相包含，这样做的意义是什么？相互之间定义使用起来也不好区分吧  如果需要，可以再定义一个结构体包含这两个结构体的内容。

这两个结构体其实结构一样，只是名字不一样，定义一个结构体其实就可以了 typedef struct anystr {     Any any;     int weight; } fish, dog, *Any;

结构的定义要解决什么事儿呢？  它只是确定结构的大小，每个元素各自占据多大地方 指针都是一样的，64位系统占据8个字节， 你说知道他是什么类型的指针有多大的差异呢  你再定一个这里根本没有导结构类型估计都能过 typedef struct dog {     struct fish * fish1;    // 包含下面将要声明的结构体fish指针     struct cat * cat;     struct monkey * monkey;      int weight; }dog;


Question: c语言动态定义数组空间报错？

引用 6 楼 lin5161678 的回复：看起来是vs vs不支持C99 不能用VLA嗯嗯，我懂啦

引用 5 楼 m0_46108109 的回复：这个好像是在C99中添加的，在C11中又不支持了。 你把ide的c标准换为c99试试。好的，谢谢，我也是看了视频教程后报错了，现在明白了

引用 4 楼 xdn1ce 的回复：https://blog.csdn.net/dreamiond/article/details/73181115?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task  不能用变量定义数组大小，这种情况你就直接定义一个足够大的数组就行，类似 int arr[200]；这种。谢谢，懂了

C语言不支持不定长数组。所以，建议用malloc/free申请动态数组。

另外 就算支持VLA 你的代码也是越界操作了

看起来是vs vs不支持C99 不能用VLA

引用 1 楼 ?Victor.?? 的回复：动态定义是什么操作？ 如果想用动态的话，还是malloc比较靠谱 发一下源码，让大家看看你想干什么吧由于我是c语言的萌新，看了视频教程后，我按照他的方法动态定义数组然后就报错了


Question: 链表问题

#include<stdio.h> #include<string.h> #include<stdlib.h>  typedef struct data{     char name[30];     struct data *next; }node;  void output(node *head) {     node *p = head->next;     //while(p != NULL)     while(p)     {         printf("%s ",p->name);         p = p->next;     }     printf("\n"); } void insertlist(node *head,int n,char *run) {     int j = 1;     node *p,*pre = head;     while(j <= n && pre->next)     {         j++;         pre = pre->next;     }     p = (node *)malloc(sizeof(node));     strcpy(p->name,run);     p->next = pre->next;     //printf("1");     pre->next = p; } void deletelist(node *head,char *run) {     int j = 0;     node *p,*pre = head;      p = head->next;      while (p && strcmp(p->name, run) != 0) {         pre = pre->next;         p = p->next;     }     if (!p) {         printf("Can't find it!\n");         return;     }      pre->next = p->next;     free(p);     /*     while(strcmp(pre->name,run))     {         pre = pre->next;     }     p = (node *)malloc(sizeof(node));     p = pre->next;     pre->next = p->next;     free(p);     */ } void searchlist(node *head,char *run) {     node *pre;     pre = head->next;      int j = 1;     while(pre && strcmp(pre->name,run) != 0)     {         j++;         pre = pre->next;     }     if (!pre)         printf("Can't find it!\n");     else         printf("%d\n",j); } int main(void) {     int n;     char run[30];     node *head;     head = (node *)malloc(sizeof(node));     head->next = NULL;     while(scanf("%s",run) != EOF)     {         if(!strcmp(run,"insert"))         {             scanf("%d%s",&n,run);             insertlist(head,n,run);         }         else if(!strcmp(run,"show"))         {             output(head);         }         else if(!strcmp(run,"search"))         {             scanf("%s",run);             searchlist(head,run);         }         else if(!strcmp(run,"delete"))         {             scanf("%s",run);             deletelist(head,run);         }     }     return 0; }  供参考～  问题比较多，建议楼主对比代码找出自己的问题～


Question: 结构体只能通过复制本尊才能在不同的.c文件中使用吗？

你写在头文件然后include啊 不光是c语言，很多语言也是一样的，需要import相应的包，其实就include差不多

引用 1 楼 寻开心 的回复:结构体也是类型的一种而已， 它又不是变量 h文件里面只是它的声明，这种声明拷贝多少份都没有关系 关键是这种类型的对应的变量， 全局变量， 一个工程里面同名的只能有一个  谢谢！  我还是觉得那种把原始形式到处复制的方式好浪费，也好别扭


Question: 两个.h文件中相互需要对方的元素，标准做法是怎样做的？

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

最好的可扩展的方案书把相互调用的部分提出出来，作为另外的文件，这样就避免了相互调用，避免相互调用这种耦合性是非常重要的

前置声明即可

引用 5 楼 寻开心 的回复:A引用B的类型， B引用A类型，这种事儿很常见的啊 只要前置声明一下另外一个类型就好了 和两个文件还是一个文件都没有关系 都是属于结构定义，又不是变量声明，不会冲突 不知道相互引用的意义在哪里？使用起来不觉得容易混淆吗？

引用 9 楼 我叫侯万楼 的回复:前置声明即可  引用 9 楼 我叫侯万楼 的回复:前置声明即可  前置声明是什么样子的？ 可以直接写出来让我看看吗？

#pragma once 这样就可以了，你试试看 不用#endif

5楼正解 前置声明一下就可以

#if !define 了解一下！

可不可把所有引用放在一个头文件里 然后在相应头文件里分别定义。

引用 3 楼 user-10 的回复:这就是你程序设计的问题了，不光是c语言，其他语言也有差不多的机制，要import相应的包（package），所以就看你怎么设计这些package了，对于c来说，就是看你怎么设计这些头文件了  谢谢！

引用 1 楼 user-10 的回复:a和b不要交叉include，把交叉的部分抽出来做个c.h，在c.h里include a和b 比如在你这个例子中可以把haha放到c.h，你的应用程序直接iclude c就好了，因为c已经include a和b了  有没有简单无脑的处理头文件的办法，如果一个工程很大的话，每次都要费神怎么安排头文件的话，感觉好累啊


Question: c语言求助

没看出 有啥问题， strcpy内存重叠也是可以的，不会出问题 void deletestr(char * str, const char * strd) {     while (1) {         char * pos = strstr(str, strd);         if ( NULL == pos ) return;         strcpy(pos, pos+strlen(strd));         printf("%s\n", str);     } } int main(int argc, const char * argv[]) {     char str[] = {"00111001110011000010000"};        printf("01234567890123456789012\n%s\n", str);     deletestr(str, "1");     printf("01234567890123456789012\n%s\n", str);     return 0; }  你试试看看， 是在什么地方输出不正常的 正常情况下，deleteStr函数当中strcpy每执行一次， 输出字符串会短一个字符 01234567890123456789012 00111001110011000010000 0011001110011000010000 001001110011000010000 00001110011000010000 0000110011000010000 000010011000010000 00000011000010000 0000001000010000 000000000010000 00000000000000 01234567890123456789012 00000000000000

试过了不行，搞了3天了头皮发麻

源串和目标串重叠，用另外一个函数。


Question: 关于c语言结构体的知识盲点

typedef struct后面没有加名字，所以才有这么回事，这里定义成员属性的时候是不认别名的

引用 1 楼 程序代码的回复:做链表当然不能这样定义 虽然知道不能这样定义   不过为什么可以通过呢  而且运行也没错误。。   想不通

做链表当然不能这样定义


Question: 你们是怎么一看自己写的方法就知道这个方法来自哪个文件的？

我是菜鸟,我的理解是按照功能模块新建文件夹和头文件,同模块相关函数在同一头文件中.这样在那个模块里面就编写那个模块的东西.不会混淆,也很容易找到.见名知意变知道在那个头文件里面

靠文档，除了敲代码，还需要写文档。

选个智能点的编辑器也行，jetbrains的IDE都支持显示函数具体信息的，包括来自哪里，不过需要开启一下

你自己都说出答案了啊。 命名规则 不能所有变量都a，b，c，d，函数都fun1，fun2的 行数名字和文件名字长点没关系，现代的编辑器都带自动输入功能的， 输入几个字母后面就自动出来了


Question: Dev-C++小白求助

第一个问题练习编程的时候别新建项目，直接新建源文件。

①都是工程文件，不用管他们。 ②我觉得是路径里的空格造成的。

重新安装dev，选腾讯管家或者360软件库里的那个


引用 8 楼 proorck2019的回复:我猜问题在于66.obj，把vc关了再开行不？ 谢谢大家我弄好了 有不会的可以问

引用 8 楼 proorck2019的回复:我猜问题在于66.obj，把vc关了再开行不？ 不是的要改程序

我猜问题在于66.obj，把vc关了再开行不？

拜托大家帮帮忙

引用 5 楼 Jiayoubiancheng 的回复:[quote=引用 3 楼 與蘤舊縐的回复:][quote=引用 2 楼 自信男孩 的回复:] 没学，还是什么原因？  如果是代码编译问题，建议贴出源码～  应该是编译器设置问题，错误下面已经显示了error spawning，前几天有个一样的问题，应该和代码无关[/quote] 对啊 百度上说改路径 我改好了就闪退了  然后又不行了[/quote]  没用过，没什么好办法，或许你可以换个安装包试试，另外CSDN的帖子周围也不是只有广告，你看周边都是和你的问题相关的，可以看看

引用 3 楼 與蘤舊縐的回复:[quote=引用 2 楼 自信男孩 的回复:] 没学，还是什么原因？  如果是代码编译问题，建议贴出源码～  应该是编译器设置问题，错误下面已经显示了error spawning，前几天有个一样的问题，应该和代码无关[/quote] 对啊 百度上说改路径 我改好了就闪退了  然后又不行了

老师要用vc的

引用 2 楼 自信男孩 的回复:没学，还是什么原因？  如果是代码编译问题，建议贴出源码～  应该是编译器设置问题，错误下面已经显示了error spawning，前几天有个一样的问题，应该和代码无关

没学，还是什么原因？  如果是代码编译问题，建议贴出源码～

前几天看到有人和你同一个问题，听说百度的办法都没用，建议你方便的话还是换一个编译器吧，新手用dev还是比较友好的


Question: strncmp测试问题，十六进制

引用 3 楼 寻开心 的回复:strncmp只比较两个字符串的前n个数是否一致 abcd和ABCD作为字符， 是不一样的， strncmp是字符的比较，所以结果就不同  至于第二个为什么相同， 是因为， 0x00是字符串的结束标志 strncmp遇到结束就自动停止了，并不会再去比较后面的字符 两个都是空字符串，结果就是一样，所以是0返回是因为0x00，没有类比strcmp，谢谢大佬

引用 4 楼 自信男孩 的回复:0x00不就是0，就是'\0'了吗？因为strncmp认为已经到了字符串末尾，所以后面的就不比较了。所以认为是相同的。谢谢，我笨了，既然是strcmp的扩展，其特性居然没有引用过来

引用 1 楼 user-3 的回复:那是因为0x00是字符串结束符，所以只比较了第一个字符 是因为0x00的原因，谢谢大佬

如果是这样，建议用memncmp内存比较

那是因为0x00是字符串结束符，所以只比较了第一个字符


Question: 萌新插入排序求助，找不到哪里有问题。。

引用 3 楼 a____jun的回复:你的逻辑有问题  所以你的方法是错误的！ 下面是我写的排序代码  供参考  ~  #include<stdio.h> int main() { int a[6]={10,4,9,5,0,2}; int i,j,temp; for(i=0;i<6;i++) { 	for(j=i+1;j<6;j++) 	if(a[i]>a[j]) 	{ 		temp=a[i]; 		a[i]=a[j]; 		a[j]=temp;	 	} }  for(i=0;i<6;i++) printf("%d ",a[i]); return 0; } 怪不得，谢谢啦

引用 2 楼 與蘤舊縐的回复:交换之前用a[j]和a[i]比不正确，如果要把3移动到6、7之前，第一次637，第二次比的就是6和7了，逻辑有点问题 好的，多谢(o^^o)


Question: 【求教贴】我的编译器瓦特啦

引用 4 楼 與蘤舊縐的回复:重启、重装，完事皆解 我已经卸载过了⊙_⊙

引用 5 楼 yshuise的回复:你写的代码如此奇怪！ 跟郝斌学的…

你写的代码如此奇怪！

重启、重装，完事皆解

那就有点迷了，看编译信息却时常是编译了这个文件啊

引用 1 楼 與蘤舊縐的回复:你是只运行，未重新编译，用f11重新编译试试 试过了，f9编译 f10运行，还有f11编译运行……

你是只运行，未重新编译，用f11重新编译试试


Question: 学生求助！！请大神看一下错在了哪里？

谢谢大佬解答

for(i=1;;i++) { a=a/10; if(a/1==0) { break; } 这里循环出来以后a的值已经是0了 int f(int a) { int b = a; int i;   e=b/pow(10,n-1); 这样改一下


Question: visual studio 是不是对c语言的语法有很强的自动容错处理啊？

省略了很多东西，少了很多坑，便于开发、效率高、麻烦少，不利于深入学历、不利于理解一些东西的本质。

这个是C编译器的行为。C编译器即使不声明函数，也可以调用。但是会出现链接错误。gcc也是一样的： 只会提示  warning: implicit declaration of function 'fun'

这不算吧，警告可能不影响代码执行。  楼主最好贴出代码～针对具体代码来讨论～

引用 楼主 wow334 的回复:比如：  一个a.c文件中的方法，连原型都不写，在main.c也能调用。  这和书上说的c语言语法完全不一样啊。  是不是visual studio 是不是对c语言的语法有很强的自动容错处理？  我要怎么设置visual studio，让它严格遵照c语言书上的语法规则。 visual studio 管理工程有自动管理源文件的，编译查找源文件，如果你要写跨平台，就必须按照C的标准来写。

语言在进步，就按vs中规定的语法来吧。 应该不是vs的问题，是语言版本改进了。


Question: C语言

请问api源码在哪里找呀？

建议找api的源码，源码里有。


Question: C语言

字符串长度为6 i从0到5 size=7,size-i-2从5到0

size - 1好理解，因为数组下表是从0开始的。-2也好理解一些，即不修改最后一个字符'\0'，逆序我想是不改变字符串结束标记的。


Question: 7-9 三角形判断（15 分）

楼主问题解决了吗，我也遇到了同样的问题。。

楼主只有最后一道题错， 说明错误不是在公式本身上， 要是公式有错， 那就不是一道题的问题了 应该还是边界条件的可能性更大

引用 5 楼 真相重于对错 的回复:其实就是求fabs (y2-y1/x2-x1)和 fabs(y3-y1/x3-x1) 是否相等  不是fabs都，那个不对滴 是  fabs( (x1-x2)*(y2-y3) - (x2-x3)*(y1-y2)) < 1e-12  不能多套fabs  写到这个，不得不抱怨楼主，你就不能弄两个中间变量啊  dx1=x2-x1， dy1=y2-y1， dx2=x3-x1， dy2=y3-y1 这一遍遍的算麻烦不说， 恢复还要一遍一遍的重复敲    dy1/dx1  和 dy2/dx2 相当于是斜率 斜率必须相同才是对的，  -dy1/dx1 和 dy1/dx1 可不是在一条直线上啊（斜率k和-k是关于坐标轴对称的关系）  只能是 fabs( dx1*dy2 - dx2*dy1) < 1e-12 这么判断

分数比较，其实是通分后或者化简后，分子比分子，分母比分母，只要点的坐标是用整形表示，就不用考虑浮点。

引用 9 楼 真相重于对错的回复:算面积也要涉及浮点数运算，不精确。 最好是计算这3个点之间的矢量， 上边我回复有点问题，三角函数早丢了，计算 (y2-y1) /(x2-x1) 和(y3-y1) /(x3-x1) 是否相等。两个分数分别转化为最简式，通过约分，判断分母是否相等且分子是否相等，相等则无法形成三角形，不等既可以。 我也是这么想的，我就是把除法转化成乘法，防止它分母万一是0，具体在浮点数运算的时候到底哪个地方会有精度的不准确啊，还望大佬指教

引用 1 楼 寻开心的回复:if((x1-x2)*(y2-y3)==(x2-x3)*(y1-y2)) 这么等就是不对的 浮点数的等要用       fabs（它们的差）<1e-12; 长知识了，但是我改掉之后还是不可以的，之前我换成海伦公式算面积，是可以通过的，所以我觉得这个判断相等的地方应该不是关键问题

引用 5 楼 真相重于对错的回复:其实就是求fabs (y2-y1/x2-x1)和 fabs(y3-y1/x3-x1) 是否相等 这个地方我明白了，之前就一直没注意到这点，但是我现在不明白的是求面积的地方为什么不对

怎么单独回复一层的呀。。。

三点不共线即可组成三角形，没有必要算距离

逻辑看起来好像没什么问题 printf结束要加\n吧？


Question: 编写程序

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

引用 4 楼 qq_45464245 的回复:[quote=引用 2 楼 自信男孩的回复:]一个函数一个函数看，比如如下函数就是判断素数的。 intIsPrime(intn)  这个是判断因子的  voidFactorizePrime(intn) 同学     怎么结算帖子知道吗[/quote] 自己研究一下，如果长期在论坛里讨论问题，建议自己研究一下。

引用 2 楼 自信男孩的回复:一个函数一个函数看，比如如下函数就是判断素数的。 intIsPrime(intn)  这个是判断因子的  voidFactorizePrime(intn) 同学     怎么结算帖子知道吗

是不是那两个break不在同一层循环里？

这个程序怎么理解  看不懂


Question: 编写程序，从键盘输入10个学生的基本情况（学号，姓名，性别及三门课程成绩），存放在结构体数组当中，计算所有同学的总分，并按总分排降序后输出

作业？应该自己动手完成。

#include<stdio.h>  typedef struct student{     int ID;     char name[10];     char sex[2];     float score1,score2,score3;     float sum; }ST;  int main() {      ST s[10],*p;     int i, j;     float sum;     p=s;     printf("输入十个学生信息（姓名，学号，性别，三科成绩）：");      for (i = 0; i<10; i++)     {         //scanf("%s",&p->name);         scanf("%s", p->name);         scanf("%d",&p->ID);         //scanf("%s",&p->sex);         scanf("%s", p->sex);         scanf("%f%f%f",&p->score1,&p->score2,&p->score3);         printf("\n");         p++;   //只想下一个元素     }     printf("continue");     p = s;   //重新指向s     for (i = 0; i<10; i++)     {         sum = (p->score1) + (p->score2) + (p->score3);         p->sum = sum;         p++;     }     //student temp;     printf("continue");     struct student temp;     for (i = 0; i<10 - 1; i++)     {         for (j = 0; j<10 - 1 - i; j++)         {             if (s[j].sum<s[j + 1].sum)             {                 temp = s[j];                 s[j] = s[j + 1];                 s[j + 1] = temp;             }         }     }     printf("成绩排序后：\n");     for (i = 0; i<10; i++)     {         printf("%s,%d,%s,%0.2f\n",s[i].name,s[i].ID,s[i].sex,s[i].sum);     }     return 0; }  供参考～  注意p再输入时要p++,计算总成绩时要p = s;

使用结构体指针，那就是要把结构体变成结构体指针啦  你可以把数组定义成 ST*  s[10]; 读数据的时候  for 循环     ST * p = (ST*) malloc ( sizeof(ST));     s[i] = p;    scanf 数据到 p->score1, p->score2, .....  后面就都类似了   偷懒的办法， 代码当中凡是用到s[i]. 这种语句的地方 都来一个： ST* p = &s[i]; 然后不用s[i]. 操作，都改成 p->操作


Question: 关于socket通信send和recv中buffer长度的问题

offset = byte_num; 改成 offset += byte_num;

引用 11 楼 beastsam 的回复:[quote=引用 10 楼 轻箬笠 的回复:] [quote=引用 6 楼 beastsam 的回复:] [quote=引用 4 楼 轻箬笠 的回复:] recv和send的处理方式不太一样。一般我们都是循环接收的，以保证数据的完整性。所以通行的办法是弄个固定长度的报文头，报文头中带报文长度数据，然后循环接收，直到长度满足要求为止。最简单的报文头就是，前4个字节（即int）就代表了报文的长度。  这个难道不是应该是tcp层处理的么？我理解tcp分片，但是不应该是系统接收完所有的4096分片后才把数据返回给recv里的buf么？而且我看很多教程说循环接受是为了防止发送的数据超过recv里buf的长度，但是我这个并没有超过啊？[/quote] 这个还真不是，曾经在项目中碰到过，发送几百个字节，第一次接收只有几十个字节的情况。[/quote]  这样啊，好吧，谢谢您，我还有个关于带宽的问题不知道您了解么？ 我的虚拟机开了3个系统，分别运行了10个客户端，一个中继转发，10个服务器，1个客户端通过中继连接1个服务器，我让服务器同时开始传输200KB的文件，大小分成4096的数据块，发送间隔35ms 我的中继上传和下载带宽都设置的是1MiB/S，虚拟机之间延迟为0,但是我在中继用wireshark抓包发现他的上传和下载每秒的峰值只有0.5MiB，请问这个为什么不是1MiB?[/quote]  额，是我蠢了，没事，是时间间隔的问题

引用 8 楼 qybao 的回复:[quote=引用 5 楼 beastsam 的回复:] TCP分片这个我知道，但是按理来说recv的工作原理难道不是等接收够4096所有的分片包后才把数据返回给recv里的buf么？而且buf长度是足够接收的啊？多次接收的这个我理解是recv中设置的buf长度不够，所以需要循环多次接收，不知道我这么理解问题在哪 通道流一般是有缓存的，它会等到缓存满了就往buf送，这个缓存不一定就是4096（也就是不一定会等到4096才往buf送），所以正确的做法就是循环接收，因为你不能保证一次就接收完整。[/quote]  我还想再请教您一个问题  我的虚拟机开了3个系统，分别运行了10个客户端，一个中继转发，10个服务器，1个客户端通过中继连接1个服务器，我让服务器同时开始传输200KB的文件，大小分成4096字节的数据块，发送间隔35ms 我的中继上传和下载带宽都设置的是1MiB/S，客户端和服务器的带宽设置的是不限制，虚拟机之间延迟为0,但是我在中继用wireshark抓包发现他的上传和下载每秒的峰值只有0.5MiB，请问这个为什么不是1MiB?

引用 10 楼 轻箬笠 的回复:[quote=引用 6 楼 beastsam 的回复:] [quote=引用 4 楼 轻箬笠 的回复:] recv和send的处理方式不太一样。一般我们都是循环接收的，以保证数据的完整性。所以通行的办法是弄个固定长度的报文头，报文头中带报文长度数据，然后循环接收，直到长度满足要求为止。最简单的报文头就是，前4个字节（即int）就代表了报文的长度。  这个难道不是应该是tcp层处理的么？我理解tcp分片，但是不应该是系统接收完所有的4096分片后才把数据返回给recv里的buf么？而且我看很多教程说循环接受是为了防止发送的数据超过recv里buf的长度，但是我这个并没有超过啊？[/quote] 这个还真不是，曾经在项目中碰到过，发送几百个字节，第一次接收只有几十个字节的情况。[/quote]  这样啊，好吧，谢谢您，我还有个关于带宽的问题不知道您了解么？ 我的虚拟机开了3个系统，分别运行了10个客户端，一个中继转发，10个服务器，1个客户端通过中继连接1个服务器，我让服务器同时开始传输200KB的文件，大小分成4096的数据块，发送间隔35ms 我的中继上传和下载带宽都设置的是1MiB/S，虚拟机之间延迟为0,但是我在中继用wireshark抓包发现他的上传和下载每秒的峰值只有0.5MiB，请问这个为什么不是1MiB?

引用 6 楼 beastsam 的回复:[quote=引用 4 楼 轻箬笠 的回复:] recv和send的处理方式不太一样。一般我们都是循环接收的，以保证数据的完整性。所以通行的办法是弄个固定长度的报文头，报文头中带报文长度数据，然后循环接收，直到长度满足要求为止。最简单的报文头就是，前4个字节（即int）就代表了报文的长度。  这个难道不是应该是tcp层处理的么？我理解tcp分片，但是不应该是系统接收完所有的4096分片后才把数据返回给recv里的buf么？而且我看很多教程说循环接受是为了防止发送的数据超过recv里buf的长度，但是我这个并没有超过啊？[/quote] 这个还真不是，曾经在项目中碰到过，发送几百个字节，第一次接收只有几十个字节的情况。

引用 8 楼 qybao 的回复:[quote=引用 5 楼 beastsam 的回复:] TCP分片这个我知道，但是按理来说recv的工作原理难道不是等接收够4096所有的分片包后才把数据返回给recv里的buf么？而且buf长度是足够接收的啊？多次接收的这个我理解是recv中设置的buf长度不够，所以需要循环多次接收，不知道我这么理解问题在哪 通道流一般是有缓存的，它会等到缓存满了就往buf送，这个缓存不一定就是4096（也就是不一定会等到4096才往buf送），所以正确的做法就是循环接收，因为你不能保证一次就接收完整。[/quote]  您说的应该没错，因为当我把虚拟机的通信延迟设置成0之后，就没问题了，看来还即使recv的buf足够，但还是需要循环接收。

引用 5 楼 beastsam 的回复:TCP分片这个我知道，但是按理来说recv的工作原理难道不是等接收够4096所有的分片包后才把数据返回给recv里的buf么？而且buf长度是足够接收的啊？多次接收的这个我理解是recv中设置的buf长度不够，所以需要循环多次接收，不知道我这么理解问题在哪 通道流一般是有缓存的，它会等到缓存满了就往buf送，这个缓存不一定就是4096（也就是不一定会等到4096才往buf送），所以正确的做法就是循环接收，因为你不能保证一次就接收完整。

引用 3 楼 xian_wwq 的回复:tcp是基于流的，不是发100，就一定收100 有可能收了95个，然后又收了5 和网络状况没有直接关联， 所以tcp数据接收，进行“拼包”（一次发送多次接收）、“分包”（多次发送一次接收）是基本操作。  对啊，但是tcp难道不是应该在底层等待接收完所有的4096分片的包之后才把数据返回给recv里的buf么？

引用 4 楼 轻箬笠 的回复:recv和send的处理方式不太一样。一般我们都是循环接收的，以保证数据的完整性。所以通行的办法是弄个固定长度的报文头，报文头中带报文长度数据，然后循环接收，直到长度满足要求为止。最简单的报文头就是，前4个字节（即int）就代表了报文的长度。  这个难道不是应该是tcp层处理的么？我理解tcp分片，但是不应该是系统接收完所有的4096分片后才把数据返回给recv里的buf么？而且我看很多教程说循环接受是为了防止发送的数据超过recv里buf的长度，但是我这个并没有超过啊？

引用 1 楼 qybao 的回复:一个包不一定能送完数据，可能送多个包 所以你应该用循环接收，直到byte_num为-1才算接受完。每次接收到的数据自己保存，最后再拼装成一个完整的数据 int byte_num = 0, offset = 0； char data[4096] = {0}; while(byte_num != -1) { //多次接收直到没有数据     byte_num = recv(server_sock_fd, buf_rec, 4096, 0);     memcpy(data+offset, buf_rec, byte_num); //把每次接收的数据保存     offset = byte_num; }  TCP分片这个我知道，但是按理来说recv的工作原理难道不是等接收够4096所有的分片包后才把数据返回给recv里的buf么？而且buf长度是足够接收的啊？多次接收的这个我理解是recv中设置的buf长度不够，所以需要循环多次接收，不知道我这么理解问题在哪


Question: 计算机二级c程序填空，无法调试

看看是Debug模式，还是Release模式。前者可以正常调试


Question: 为什么我觉得vs2017经常报的错误和真正的错误相差万里？

我也是免费社区版，完全没有你说的情况

感觉还是和语言关系大一点吧，当然IDEA还是智能点


Question: 【新人求助】printf("%ld\n", sizeof(int * ));在64位的电脑上输出结果，为什么不是8而是4呢

生成时不看windows系统是多少位的，而是看生成时选取的平台是什么。 如果选32位生成，当然还是32位的

sizeof 是在编译时确定的，不是在运行时确定的。

引用 2 楼 寻开心 的回复:windows下 int 和 long int 都是32位的， long long int才是64位的 楼主的是int *.是指针v哦  VC6.0不支持64位系统吧编译器应该是还是32位的。

vc6 出生时，64系统还不普及，应该不能够生成64位的程序。


Question: 二叉树的序列化与反序列化——二叉树与字符串的转换，超时bug

这就是一个二叉树的中序遍历过程，再遍历的过程当中，输出或者读取界节点内容  // 输出 void  ioOutput（TreeNode* pTree， FILE* fp ){            输出  pTree->data;            if ( pTree -> left )  ioOutput( pTree->left， fp) ; else 输出 #；            if （pTree->right) ioOutput(pTree->right， fp); else 输出# }  // 读入 TreeNode * ioInput（FILE * fp) {          ElementType data = 读入数据          if ( data  == '#' ) return NULL;          TreeNode * pTree = (TreeNode*) malloc(TreeNode);          pTree->data = data;          pTree->left = ioInput(fp);          pTree->right = ioInput(fp);           return pTree; }

"你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。" 这里所说的字符串，并不一定是文字字符串，也可以是二进制的吧。所以你可以省略，文字到数字的转换过程。 另外 char *str = (char*)malloc(sizeof(char) *12);  // char str [12]就行了，二叉树不会太深

换了一种方式写。终于过了，虽然耗时和耗内存比较大。 /**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     struct TreeNode *left;  *     struct TreeNode *right;  * };  */ /** Encodes a tree to a single string. */ void dfs(struct TreeNode *root, char *s); struct TreeNode* de(char* data, int *index, int len); char* serialize(struct TreeNode* root) {     if(root == NULL)         return NULL;     char *re = (char*)malloc(sizeof(char) * 5000);     re[0] = '\0';     dfs(root, re);     return re;    } void dfs(struct TreeNode *root, char *s) {     if(root == NULL)     {         strcat(s, "#");         return;     }     char *str = (char*)malloc(sizeof(char) *12);     sprintf(str, "%d ", root->val);     //itoa(root->val, str, 10);  itoa函数与ANSI标准是不兼容的；     strcat(s, str);     //strcat(s, " ");     free(str);     dfs(root->left, s);     dfs(root->right, s); } /** Decodes your encoded data to tree. */ struct TreeNode* deserialize(char* data) {          if(data == NULL)         return NULL;     int index = 0;     int len = strlen(data);     return de(data, &index, len); } struct TreeNode* de(char* data, int *index, int len) {     //int len = strlen(data);     if((*index) >= len)         return NULL;     if((*index) < len && data[*index] == '#')     {         (*index)++;         return NULL;     }       int flag = 1;     if(data[*index] == '-')     {         flag = -1;         (*index)++;     }      else if(data[*index] == '+')        {         (*index)++;     }     struct TreeNode * root = (struct TreeNode *)malloc(sizeof(struct TreeNode));     root->val = 0;     while((*index) <= len && data[*index] >= '0' && data[*index] <= '9')     {         root->val *= 10;         root->val += (int)(data[(*index)] - '0');         (*index)++;     }     root->val *= flag;     (*index)++;     root->left = de(data, index, len);     root->right = de(data, index, len);     return root; }  // Your functions will be called as such: // char* data = serialize(root); // deserialize(data);


Question: 提问

字符串拷贝 把a拷贝给p->name

一个百度就搞定的问题还来论坛提问？这个就是C 的API，一下就知道结果的，无语了

好像是把字符串a的内容复制到结构体成员name中


Question: 求朋友们帮忙解释一下这个超简单的计算题！！！

从运算符优先等级的角度出发，结果自然就出来了  单目运算符，双目运算符，括号运算符等等

引用 2 楼 ?Victor.?? 的回复:[quote=引用 1 楼 與蘤舊縐 的回复:] 什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的 有一事不明，为什么我算出q=22，而不是21呢[/quote]  一个变量一行只能一个++, --, 如果出现多个，写这个代码的人直接烧死祭天即可。

对于有歧义性的表达式不建议写和深入的研究，跟编译器有关系呢。代码的移植性有问题～

不用纠结的话真是太好了蟹蟹

握爪，我也是这样得的答案啊，输进去得的是上面给的答案，苦恼

书里明确说了不能这么做，如果一定要做的话。 p=18 q=21 i=8 j=8

引用 2 楼 ?Victor.??的回复:[quote=引用 1 楼 與蘤舊縐 的回复:] 什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的 有一事不明，为什么我算出q=22，而不是21呢[/quote] 都说了编译器不一样答案不一样，天知道他是什么见鬼的逻辑

引用 1 楼 與蘤舊縐 的回复:什么资料，直接放弃吧，void main和连续自增简直就是在挑战程序员的底线，不用纠结了，本来就不能这么做，不同编译器对其理解是不同的 有一事不明，为什么我算出q=22，而不是21呢


Question: 结构体别名 和 结构体名字一样会有问题吗？

不建议，当你用别名定义了一个数组的时候，例如这样typedef struct fish{int weight;}fish[100]； fish kano;这时候用vs就会报错

最好自己试一试，这样可能更直观的理解和验证～

没问题，但是不建议这么做。起别名就是考虑不一样的名字，提高代码的可读性。

做工程的时候 为了规范 一般别名都是结构体的名字加上_t 比如说名字是list 别名就是list_t 这样是表示是用typedef取的别名 同理你经常会看见int32_t int16_t之类的名字

加个typedef其实不过是为了修改方便，另外可以取多个别名，fish，*pfish……

为什么要别名呢，其实很简单  如果没有别名，那么定义的时候类型就是struct fish，如果有别名，类型就是fish，短了点


Question: C 指针和数组入门问题

编译不过吧

先取值，地址后移一次

首先，ptr=&sz就错了，数组名就是指针，还对指针取地址，肯定是错的，应该把取地址符去掉才行。执行完这条语句之后，ptr就指向了数组的第一个元素的地址，那么ptr++的意思是用完之后再加一，意思就是先*ptr再ptr加1。比如说ptr现在指向第0个元素，那么先输出第0个元素，下次就输出第一个元素。还不懂去我的主页看看我写的指针的文章

楼主你的编译器挺神奇啊！估计是我的编译器版本太新了。我这边ptr1=&sz;是肯定报错的 我们一般都这么写：ptr1=&sz[0];

*ptr1++先解引用后增量 *++ptr1先增量后解引用

指向下一个数组元素

引用 23 楼 luj_1768 的回复:*ptr1++先不说。先说说ptr1=&sz; 这个表达式在早初是可以在vc60通过的，后来忽然就报错了。可能推荐这样赋值：*ptr1=sz; 看好了吧？类型匹配避开了指针与引用的复杂性，都是double 类型。一般数组和指针是同构的，只是指针比较便于表示非正则数据。 你这个*ptr1=sz 就是直接错误  更不靠谱

引用 29 楼 xiaoxiangqing 的回复:*ptr1++-->*的优先级高，所以是先*ptr,再++++优先级高

引用 15 楼 Cedar_Guo的回复:++优先级虽然高于*,但是++属于右结合型。所以先进行取值，然后地址再加一，指向下一个数组元素 它两个的优先级不是一样的吗？

遇到这种类似问题，能编译的话自己单步运行一下，理解会更深一点

*ptr1++，在这里可以改写为：ptr1[i]。差异是循环后ptr1指针内容不变，但可读性应该要高一些。

指针的移动，先访问第一个元素，i=1，i<5成立 继续访问下一个元素，以此类推直到i<5不成立。最后打印输出。

楼主，你的编译器不靠谱呀！应该使用C-FREE5.0 编译器。      我用C-FREE5.0 编译器编译后发现是错误的。      把 ptr1=&sz;  修改为 ptr1=sz;  编译通过

首先前面ptr1=&sz就错了，指针其实就是存储数据的一个地址，&是取地址运算符，而数组名其实就是数组首元素的地址，即&sz[0]==sz

引用 16 楼 lin5161678 的回复: 好烦哦，你看看我在 7 楼说的好吧，我第二次评论只是想提醒楼主不要过分纠结环境。 哪来的这么多杠精啊？有脑子不？

printf("%.2lf \n",*ptr1);  ptr++;

``` hello ```

不是*ptr1++，是ptr1++吧，这个指针ptr1指的是头地址（就是sz[0]）后面的++就是循环一次加一次，地址往后移，这样就可以依次把sz[0]，sz[1]，sz[2]…直到循环结束

引用 13 楼 关于0318 的回复:[quote=引用 12 楼 u012538549 的回复:] 一方面有的同学学习 c 语言可能就是学校的一门课程，跟将来就业没关系； 另一方面，如果刚学习就在 linux 环境的话，还是有点困难的，也没必要。 codeblock 虽然在正经生产环境不怎么用，但是学习还是可以的。 楼主只要下载正经的版本就可以了，切记不要一开始对自己太苛刻，步步为营 => 寸步难行。 [/quote] 指针类型不匹配就是错 哪来这么多歪理 C里面是一个警告  C++直接Error糊你一脸 哪个老师说这样做没问题  那就是误人子弟


Question: 麻烦大佬帮忙看看

不可以吧，s没有指向吧

不可以，野指针。结果未定义，即结果可能正常，也可能出现段错误。  建议把char *s = NULL;初始化

引用 2 楼 ?Victor.?? 的回复:指针指向字符串，可以呀 对，你还要搞一个数组

指针指向字符串，可以呀

s没有指向任何位置，gcc下打印结果为null，但其他编译器下可能报错，这么干没啥意义


Question: 小白学c语言，请问各路大神这两道题怎么写程序

引用 12 楼 寻开心 的回复:用getchar（）达不到要求，因为你输入什么就显示什么 getch（）可以做到， 因为你输入什么它都不显示 可以运行了，虽然跟自己想的不太一样，感谢老哥的指导！

if(ch-'0'>=0&&ch-'0'<=9) {            putchar(ch);             putchar('\n');         } else           putchar('erro');              }

while ( (ch =getch()) != EOF ) {         if ( ch>= '0' && ch <= '9' ) putchar(ch); };

引用 6 楼 寻开心 的回复:第一个题做到挺好的啦 ，你那个担心可以稍微改一下， 让用户输入x和z两个就可以了，反正y是计算输出的  第二个题继续自己做 #include <conio.h> 然后 char ch = getch（）利用这个函数，可以获得用户的键盘输入但是不显示，其他都可以自己来了这是第二个题，但是if else 好像不匹配，大神帮忙看看问题出在哪，感谢！

getch()函数是一个不回显函数，当用户按下某个字符时，函数自动读取，无需按回车

引用 6 楼 寻开心 的回复:第一个题做到挺好的啦 ，你那个担心可以稍微改一下， 让用户输入x和z两个就可以了，反正y是计算输出的  第二个题继续自己做 #include <conio.h> 然后 char ch = getch（）利用这个函数，可以获得用户的键盘输入但是不显示，其他都可以自己来了#include<stdio.h> int main()  {     char ch;     ch=getchar();     if(ch-'0'>=0&&ch-'0'<=9)	            putchar(ch);             putchar('\n');         else           putchar('erro');              }

引用 2 楼 寻开心 的回复:x小于0，y=x-10； 看x是多少了 x等于0 ，y=y+3； 就是 5； x大于0， y=z； 就是2；  y的结果就要看x输入什么了感觉老师的意思是z和y不赋值，满足条件直接输出就行

引用 1 楼 寻开心 的回复:你的题在哪儿呢， 光有这代码题在这，不好意思我把我写的发上来了

你的题在哪儿呢， 光有这代码


Question: 一个不是数学问题的数学问题

引用 6 楼 與蘤舊縐 的回复:主要还是用来配合一下markdown语法，写点东西 Markdown是一种可以使用普通文本编辑器编写的标记语言，通过简单的标记语法，它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本，用于扩展Markdown的功能（如表格、脚注、内嵌HTML等等），这些功能原初的Markdown尚不具备，它们能让Markdown转换成更多的格式，例如LaTeX，Docbook。Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具，如Pandoc；要么基于网站，如GitHub和Wikipedia，在语法上基本兼容，但在一些语法和渲染效果上有改动。 是这东西吗？

主要还是用来配合一下markdown语法，写点东西

引用 4 楼 與蘤舊縐 的回复:去学一下latex吧，各路奇奇怪怪的符号都能念了 LaTeX（LATEX，音译“拉泰赫”）是一种基于ΤΕΧ的排版系统，由美国计算机学家莱斯利·兰伯特（Leslie Lamport）在20世纪80年代初期开发，利用这种格式，即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能，能在几天，甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式，这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。这个系统同样适用于生成从简单的信件到完整书籍的所有其他种类的文档。 是这东西吗？

去学一下latex吧，各路奇奇怪怪的符号都能念了

引用 2 楼 user-2 的回复:念 派 吧，表示连乘积（几个数连乘） 谢谢，原来是派大写了

念 派 吧，表示连乘积（几个数连乘）


Question: c语言作业

自己百度， 百度百科里面有现成的代码


Question: 一个指针方面的小问题

发现问题可以从根源上找找 也就是说你可以试试从地址上查找俩者的区别

已验证，就是如 7 9 楼大佬说的那样，问题已解决，感谢7、9楼和其他各位大佬！

引用 2 楼 关于0318 的回复:版本是这个：gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 越界是指哪里？  如果第七行放在第六行前，那么输出就只有一个 “1”， 如果第六行放在第七行前，每次执行的输出不一样。  越界是说 char *p = &a; *(p+2) = '2'; //越界是指这里 *(p+1) = '\0';//和这里，因为这里的内存不是a的了 a的内存空间之后可能是p的内存空间（或者反过来，要看编译器了，这是方法栈给局部变量分配的空间），p是个指针变量，也有自己的内存空间，你可以打印 printf("%p %p\n", &a, &p); //看看它们的地址 如果p在a之后，那么*(p+2) = '2', *(p+1) = '\0'就覆盖了指针的信息(指针是4个字节)，那样只是修改了p的内存信息，对程序影响不到（只是p的信息不再是a的地址），所以能正常打印（打印结果也应该是确定的，就是1） 但如果p在a之前，那a以后的内存可能就不可预知了，所以可能导致运行不正常

多个局部变量在内存当中的地址关系，因编译器不同而不同， 不具有普遍性 所以基于这种地址关系假设的写法都没有可移植性，尽量避免这么去写

int main(){   char a = '1';   char *p = &a;   *(p+2) = '2';   *(p+1) = '\0';  首先第六第七行都是属于指针越界操作 p取的是a的地址， p+1就是相邻a地址的下一个地址，下一个地址已经不是a了，a也不是数组，所以p+1和p+2都跑到a的外面了  其次，关于六和七行顺序颠倒后结果不同的问题 局部变量a和p都是在系统栈里面分配的， a和p谁在高地址不一定，要看编译器 如果p的地址比a的地址高， p指向a，p+1和p+2很可能就指向了p变量所在地地址 那么第六行操作，会改变p指针自身的值， 再执行第七行的时候，p已经不原来的p了 第六和第七交换，因为对p的改变不同，所以结果不同  你可以如下测试 p = &a;  printf("Address a:%p Address p:%p\n", p, &p); 执行完第六行和第七行，之后，你再次输出printf("%p\n");就可以看到p指针的变化了

你这个是非法操作，啥结果都正常

引用 4 楼 关于0318 的回复:[quote=引用 3 楼 user-5 的回复:] 我没有安装gcc我用vs试没有问题，具体原因，你想知道，可以在每一步执行之后把这段内存中的数据都显示一次看看变化。  你说的 vs 不会是 vscode 吧[/quote] Visual Studio 2010 c++

引用 3 楼 user-5 的回复:我没有安装gcc我用vs试没有问题，具体原因，你想知道，可以在每一步执行之后把这段内存中的数据都显示一次看看变化。  你说的 vs 不会是 vscode 吧

引用 1 楼 user-5 的回复:你用的是什么编译的，这个输出应该是一样的，虽然你越界操作了 版本是这个：gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 越界是指哪里？  如果第七行放在第六行前，那么输出就只有一个 “1”， 如果第六行放在第七行前，每次执行的输出不一样。

你用的是什么编译的，这个输出应该是一样的，虽然你越界操作了


Question: windows串口接收过程中拔掉的识别和处理(C/C++)

引用 2 楼 scitachi 的回复:[quote=引用 1 楼 轻箬笠 的回复:] 楼主可以看下这位的回复。 https://bbs.csdn.net/topics/392297287 [quote=引用 3 楼 躺着睡的蜗牛 的回复:] 写下我曾经的一个做法  串口10ms读一次数据。  如果数据读取失败，并且GetLastError()返回值不为ERROR_SUCCESS和ERROR_IO_PENDING时， 错误计数加1。 当错误计数超过20时，设置串口为断开状态。 如果错误计数小于20并且读取数据成功时， 削除错误计数。  如果是usb相关的，可以考虑处理WM_DEVICECHANGE[/quote]  感谢回复。 不过这种做法貌似是默认不会存在隔很久才接收到一次数据的情况吧？ 假如十几分钟后才来一条数据，实际并没有断线，是不是也视为了断开？[/quote]  不好意思，理解好像有点错误。 如果断开连接，输入缓冲区里的数据还正常么？ 用ClearCommError 是不是就读不出来有多少数据了？

引用 1 楼 轻箬笠 的回复:楼主可以看下这位的回复。 https://bbs.csdn.net/topics/392297287 [quote=引用 3 楼 躺着睡的蜗牛 的回复:] 写下我曾经的一个做法  串口10ms读一次数据。  如果数据读取失败，并且GetLastError()返回值不为ERROR_SUCCESS和ERROR_IO_PENDING时， 错误计数加1。 当错误计数超过20时，设置串口为断开状态。 如果错误计数小于20并且读取数据成功时， 削除错误计数。  如果是usb相关的，可以考虑处理WM_DEVICECHANGE[/quote]  感谢回复。 不过这种做法貌似是默认不会存在隔很久才接收到一次数据的情况吧？ 假如十几分钟后才来一条数据，实际并没有断线，是不是也视为了断开？

楼主可以看下这位的回复。 https://bbs.csdn.net/topics/392297287 引用 3 楼 躺着睡的蜗牛 的回复:写下我曾经的一个做法  串口10ms读一次数据。  如果数据读取失败，并且GetLastError()返回值不为ERROR_SUCCESS和ERROR_IO_PENDING时， 错误计数加1。 当错误计数超过20时，设置串口为断开状态。 如果错误计数小于20并且读取数据成功时， 削除错误计数。  如果是usb相关的，可以考虑处理WM_DEVICECHANGE


Question: 大佬们，本人大一菜鸡，最近作业完成吃紧，写了个代码，却不知道为何运行错误，烦请那位大佬能够解疑答惑，小弟感激涕零

代码还没贴全，你的问题是什么。

兄弟，你这个C语言程序复杂呀！


Question: 求大佬指点，数据结构与算法

void insertList(DLNode * p, ElementType x) {        if ( NULL== p ) return;        DLNode * pT = (DLNode*) malloc (sizeof(DLNode));        if (!pT)             return NULL;        pT->data = x;        pT->prior = p->prior;        pT->next = p;        p->prior = pT; }  多加一句对pT申请空间之后的判断。 另外，这个函数还有问题，如果p是头结点，那么这样的函数还能可以吗？需要考虑p的位置是头还是中间，还是尾。  引用 1 楼 寻开心 的回复:void insertList(DLNode * p, ElementType x) {        if ( NULL== p ) return;        DLNode * pT = (DLNode*) malloc (sizeof(DLNode));        pT->data = x;        pT->prior = p->prior;        pT->next = p;        p->prior = pT; }

头尾节点没有所谓的， p的prior或者next节点正确设置了就好，可以在调用方处理 如果想更通用，要改造一下， 有返回就好了  DLNode* insertList(DLNode * p, ElementType x) {        if ( NULL== p ) return NULL;        DLNode * pT = (DLNode*) malloc (sizeof(DLNode));        if (NULL == pT) return NULL;        pT->data = x;        pT->prior = p->prior;        pT->next = p;        p->prior = pT;        return pT;         }  把插入位置有效性的检测放到函数实现里面，还是在调用之前检测各有各的好处 放在外面就要求使用者更清楚自己要做什么， 可以减少函数内部的判断， 提高函数自身的执行效率 放在函数里面，函数可以更稳健


Question: C语言

可以这么做，但是不建议这么做，因为需要考虑代码的可读性。

引用 3 楼 关于0318的回复:害，楼上说得太多了吧，一楼说得对。 刚开始不要有那么多顾虑，甚至不要考虑格式什么的，虽然好习惯要坚持，但是不要把“最好那么做”和“必须那么做”混为一谈。 收到，谢谢指教

引用 2 楼 寻开心的回复:连续加是允许的 不过还是建议你分开写， 出问题的时候容易调试  开数组，用循环加这种同类的数还是更方便一些 包括你那个scanf函数也是 scanf那么多数据， 自己数的过来吗？对不上就是错误了 同样是建议分开写 好的，谢谢指教

可以连续加，这是最基本的表达式啊


Question: curl以put形式发送文件，总是报错403，很急

我ssl设置了，http也提示设置成功，其他证书没需要的

403说明无权访问，你访问的网址是不是需要什么证明书之类的。


Question: 用递归的方法将一个整数n转换成字符串。例如输入256，输出"256"

引用 1 楼 user-2的回复:第一次调用递归函数n=256，n/10==25，递归          第二次调用递归函数n=25，n/10==2，递归                  第三次调用递归函数n=2，n/10==0，不递归，打印2%10=2，退出函数          第三次调用函数退出后，回到第二次调用的代码，接着后面的代码打印25%10=5，退出函数  第二次调用函数退出后，回到第一次调用的代码，接着后面的代码打印256%10=6，退出函数  整个递归函数调用结束，主程序退出 谢谢谢谢                    谢谢谢谢

引用 3 楼 qq_45464245的回复:[quote=引用 2 楼 寻开心的回复:]voidtranvers(intn) {tie    if(n/10!=0)      tranvers(n/10);   // 先调用这个函数，就是先处理10位以上的部分， 它会递归输出10以上部分的数字      printf("%c",n%10+'0'); //  后执行这个不分，就是后输出个位上的数字； 和前一个调用结合得到256这种从高到底的输出顺序 // 把上面这两行颠倒一下，得到的就是652的顺序了 }  此外，也提问了好几次了，该给满意的帖子结账了吧。 总是提问不结贴就没人再给你答复啦 怎么结贴          怎么结贴[/quote] 我刚用  不知道怎么弄

引用 2 楼 寻开心的回复:voidtranvers(intn) {tie    if(n/10!=0)      tranvers(n/10);   // 先调用这个函数，就是先处理10位以上的部分， 它会递归输出10以上部分的数字      printf("%c",n%10+'0'); //  后执行这个不分，就是后输出个位上的数字； 和前一个调用结合得到256这种从高到底的输出顺序 // 把上面这两行颠倒一下，得到的就是652的顺序了 }  此外，也提问了好几次了，该给满意的帖子结账了吧。 总是提问不结贴就没人再给你答复啦 怎么结贴          怎么结贴


Question: 这个值怎么判定的

从左往右计算，0

引用 8 楼 自信男孩 的回复:[quote=引用 1 楼 ?Victor.?? 的回复:] 0 1.0/b==0; 0*a==0; 你的理解有问题的.  1.0/b = 1.0/2 = 0.500000 0.500000*a = 0.500000 * 1 = 0.500000  最后c = 0;因为c是整型数据,因此会取整得0.[/quote] 抱歉，我搞混了，先运算，再int类型转换

引用 4 楼 qq_45464245 的回复:[quote=引用 1 楼 ?Victor.??的回复:]0 1.0/b==0; 0*a==0; 这个1.0÷b不应该＝0.5吗[/quote] 不要忘记有类型隐式提升, 1.0/b会按照double类型的除法计算,1.0/b *a;都会按照double类型数据计算

引用 1 楼 ?Victor.?? 的回复:0 1.0/b==0; 0*a==0; 你的理解有问题的.  1.0/b = 1.0/2 = 0.500000 0.500000*a = 0.500000 * 1 = 0.500000  最后c = 0;因为c是整型数据,因此会取整得0.

你用int 定义a,b,c; 除了强制类型转换，否则怎么运算都不会出现小数

我觉得 1.0/b=0.5 c语言中，整数除以浮点数得出结果是浮点数。  当除数或者被除数之一（只要有一个）是浮点数（或double），进行的就是浮点数除法，会把另一个除数或者被除数转换为精度更高的进行除法（例如int转为float，float转为double）结果为浮点数。只有当除数和被除数都是int类型时，显示的结果值才是整数。

引用 4 楼 qq_45464245 的回复:[quote=引用 1 楼 ?Victor.??的回复:]0 1.0/b==0; 0*a==0; 这个1.0÷b不应该＝0.5吗[/quote] 那么 int d=0.5;d等于多少？？

引用 1 楼 ?Victor.??的回复:0 1.0/b==0; 0*a==0; 这个1.0÷b不应该＝0.5吗

我目测是0吧

1.0/b==0; 当然是 0.5 呀  引用 1 楼 ?Victor.?? 的回复:0 1.0/b==0; 0*a==0;

0 1.0/b==0; 0*a==0;


Question: 求解

1111111111111111 +1后变成 10000000000000000，高位超出范围，被自动舍弃了，所以就只剩 0000000000000000


Question: c语言新手，为何用整型常量定义数组长度并初始化时，会报错说不能初始化

引用 4 楼 與蘤舊縐 的回复:[quote=引用 3 楼 穷人没资格上闲鱼 的回复:] [quote=引用 2 楼 與蘤舊縐 的回复:] 除了刚才说的，你这里错误的原因还有={0}，这是不允许用在用变量定义长度的数组初始化的 您好，感谢您的解答，请问想让该长度10的数组所有元素都为0，那是用for循环逐一赋值比较好吗？是否有更简洁的还不报错的初始化方法呢？[/quote]  你的赋值在一般情况下是可以的，一般来说for循环赋值看起来麻烦了点，其实效率还是不错的，想搞点高级的那就用string.h的memse函数，直接把数组的所有值都重置为0，但对于长度10的数组来说，可能效率还不如for循环[/quote] 感谢您的耐心解答，懂了！

引用 3 楼 穷人没资格上闲鱼 的回复:[quote=引用 2 楼 與蘤舊縐 的回复:] 除了刚才说的，你这里错误的原因还有={0}，这是不允许用在用变量定义长度的数组初始化的 您好，感谢您的解答，请问想让该长度10的数组所有元素都为0，那是用for循环逐一赋值比较好吗？是否有更简洁的还不报错的初始化方法呢？[/quote]  你的赋值在一般情况下是可以的，一般来说for循环赋值看起来麻烦了点，其实效率还是不错的，想搞点高级的那就用string.h的memse函数，直接把数组的所有值都重置为0，但对于长度10的数组来说，可能效率还不如for循环

引用 2 楼 與蘤舊縐 的回复:除了刚才说的，你这里错误的原因还有={0}，这是不允许用在用变量定义长度的数组初始化的 您好，感谢您的解答，请问想让该长度10的数组所有元素都为0，那是用for循环逐一赋值比较好吗？是否有更简洁的还不报错的初始化方法呢？

C语言用const修饰的变量依旧是变量，可以叫做常变量或者只读变量，因为该变量依旧可以通过指针修改，只是不能直接改，在C++中这样的操作是可行的，另外C99之后已经可以用变量定义数组长度，但在此之前该变量需要初始化，不同编译器对该特性的支持不同，所以尽量还是不要这么用


Question: visual stdio2019

重新启动或配置头文件，自己写一个头文件，我的博客里面有一个专栏就是各种各样的c++库 https://blog.csdn.net/cool99781/category_9720519.html 自己找吧

引用 2 楼 初学小菜的回复:说明你没有这个头文件 我会注意这个问题的，谢谢

谢谢谢谢，麻烦了

引用 1 楼 自信男孩的回复:不会是中英文的问题吧 绝了，还真是，谢谢大哥

说明你没有这个头文件

不会是中英文的问题吧


Question: 求大神解答

引用 2 楼 自信男孩的回复:建议分开写,不要++和--前置和后置放在一起. 这样的表达式有副作用,对于代码移植性很差. 好的，谢谢大神指点

引用 1 楼 與蘤舊縐的回复:自增自减运算符只能单独使用，a+a++和以及你这种写法都是不可以的 好的，谢谢大神

引用 3 楼 阿帕奇Hehe的回复:这种同一个变量的自加自减出现在同一个语句中，在C中约定俗成的是不允许这样使用的。不同的编译器可能出现不一样的结果，初学者不要这样编写代码。要分开。 好的，这是看视频课件老师给讲的内容，可能是特意拿出来的

自增自减运算符只能单独使用，a+a++和以及你这种写法都是不可以的


Question: 这个我用双重循环超时了，大佬给个优化的建议

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

int dx=x2-x1， dy=y2-y1; if (dx == 0  )  return dy-1; if (dy == 0  )    return dx-1;  此时dx和dy都不是0了 计算 dx和dy的最大公因数c return （dx-1）/ (dx/c); 或者 return  (dy-1) /(dy/c);

x1，y1， x2，y2构成直线  y  =  y1 +    (y2-y1) / (x2-x1) * (x-x1)     其中 x1< x < x2 把(y2-y1)/(x2-x1)做成最简分数a/b ，(x2-x1-1) / b 就是答案  考虑到， 有可能线段是一条垂直的线段， 所以要判别一下，如果是垂直的用另外一一组公式 x = x1 + (x2-x1) / (y2-y1) * (y-y1),   其中y1<x <y2


Question: 一元多项式求值 求大神看看这个为啥会警告，谢谢了

pn.data = (PolyTerm *)malloc(sizeof(PolyTerm) * n);

float Evaluate(SqPoly pn,float x);   int main(void) {    int i,n;    SqPoly pn;    PolyTerm data;    float x,f1;    clrscr();    printf("Please input the terms of number of the pn:\n");    scanf("%d",&n);    pn.data = (PolyTerm*) malloc( sizeof(PolyTerm) * n );       pn.length=n;    printf("Please input the coef of the pn:\n");    for (i=0;i<n;i++)   scanf("%d",&pn.data[i].coef);    printf("Please input the exp of the pn:\n");    for (i=0;i<n;i++)   scanf("%d",&pn.data[i].exp);    printf("Please input the x to solve:");    scanf("%f",&x);    Evaluate(pn,x);    return 0; }


Question: C语言，实在做不出来

引用 2 楼 lin5161678的回复:首先你写一个 给数字排序的代码 然后 这段代码里面  2个数字的比较 改成字符串的比较 2个数字的交换 改成字符串的交换 完事 谁能帮我补一下sort函数啊

引用 2 楼 lin5161678的回复:首先你写一个 给数字排序的代码 然后 这段代码里面  2个数字的比较 改成字符串的比较 2个数字的交换 改成字符串的交换 完事 是做C语言题，要求就是写一个sort函数

可以用现成的字符串比较函数

有没有人帮帮我啊

#include<stdio.h> #include<string.h>  void bubble_sort(char (*a)[10], int n) {     int i,j;     char tmp[10];      for (i = 0; i < n; i++)         for (j = 0; j < n - i - 1; j++)             if (strcmp(a[j], a[j+1]) > 0) {                 strcpy(tmp, a[j]);                 strcpy(a[j], a[j+1]);                 strcpy(a[j+1], tmp);             } }  int main( ) {     char a[3][10];     int i;     for(i=0;i<3;i++)         gets(a[i]);     bubble_sort(a, 3);     for(i=0;i<3;i++)         puts(a[i]);      return 0; } 供参考~

#include<stdio.h> #include<string.h> void sort(char a[4][10]) { 	int i,j; 	for(i=0;i<2;i++) 	for(j=i+1;j<3;j++) 	if(strcmp(a[i],a[j])>0) 	{ 		strcpy(a[3],a[i]); 		strcpy(a[i],a[j]); 		strcpy(a[j],a[3]); 	} }  int main( ) {     char a[3][10];     int i;     for(i=0;i<3;i++)         gets(a[i]);     sort(a);     for(i=0;i<3;i++)         puts(a[i]); } 你看能行不！

求大佬帮忙看一下啊


引用 楼主 ??(Dream)的回复:每次编译都出现 工程名.exe- 2errors 搞定啦已经解决问题啦

什么错误写清楚，神也猜不出来


Question: 代码出现乱码恢复

麻烦可以说下怎么用二进制打开吗

用二进制打开。或者另存为其他编码格式。 一般存为多字节编码就可以。

我没用记事本打开啊。我用的ue

那个fffe，是记事本的文件头，你用记事本打开，会自动给你加上。

大佬怎么用二进制方式打开啊。我就16进制查看我的代码是这样的。开头的FF FE 怎么都删不掉。删掉了或者更改了保存重新打开还是在。

用二进制方式打开这个文件，找到你复制过来的哪个部分，删除掉不行吗？ 显然后面的这个图是用文本方式打开的


Question: gcc内嵌汇编堆栈计算出错

补充一下 我写错了 应该是ebp+6 因为16位下是 ip 不是eip ip 2字节 + push ebp 4字节 应该访问ebp+6

你在你编译的C上加上  __asm__(".code16\r\n");

16位下，能访问32为寄存器？？


Question: 编写一个mul函数求一到十的乘积，帮忙看一下代码哪里错了，为什么结果不对

没有返回值,即自定义函数没有将返回值返给main函数,所以main函数里的n还是一个随机值.  修改的方法:  int mul(void) {     int i, n = 1;     for (i = 1; i < 10; i++)         n = n * i;     return n; }  int main(void) {       int n;     n = mul();     printf("%d\n", n);

不对很正常，2个错误，1：mul的n是形参，不是指针或者引用，值无法传递出去. 2.printf，不用取地址，你这个是打印N的地址，不是值.  3. 换一个编译器吧，比如vs2017，别用这种上古编译器了

调用函数没有返回值，要用int mul (int n)

可以看一下参数按值传递和引用传递的区别 void mul(int n)修改为void mul(int &n)


Question: 大一菜鸟求救课设

引用 1 楼 寻开心的回复:初一的菜鸟要代码也是没有 课设的问题都不是论坛能解决的， 不是多难， 而是几百行代码没人闲的无聊写这个。 你有具体问题不会的话，贴自己的代码出来，一般来说还是会有人回答的 纯要代码， 自己百度吧 完全不会写

引用 2 楼 ?Victor.??的回复:事实证明，课设报告这种东西只是个形式，你东拼西凑都可以，没人会仔细运行你的代码，看有没有bug，水一水就过去了，重要的是文采要好，显得你的项目多么高大上 主要是答辩过程不行


Question: 求大佬指点

这个是c函数的定义？ C里面还能这么定义函数吗？   c里面没有引用的说法， &是取地址，但是这个是函数定义阶段啊，  只能void( linklist *p);   c++里面void void f(linklist &p);   这是引用，和后者的区别是它等同于把调用时候传参的变量传递进去了，而不是变量的值，因此函数里面对p的修改，可以带回到函数外面； 后后者对p值的修改只在函数内部有效。

区别大了，前者是地址传递（虽然是变相寻址实现的），后者是值传递（指针传递也属于值传递） LZ测试一下看看，哪个函数的参数的地址和main函数的变量的地址一样？  void t1(int &a) { //地址传递     printf("%p\n", &a); }  void t2(int a) { //值传递     printf("%p\n", &a); }  void t3(int *a) { //值传递     printf("%p\n", &a); }  int main(int argc, const char * argv[]) {     int p = 0;     int &p1 = p;     int *p2 = &p;     printf("main: %p\n", &p);     t1(p1);     t2(p);     t3(p2);     return 0; }


Question: 数据结构

i=0，执行n次 i=1，执行n-1次 i=2，执行n-2次 ... i=n-1，执行1次 所以一共执行 n+(n-1)+(n-2)+...+1 = n*(n+1)/2次，也就是O(n^2)


Question: 根据火车出发时间和到达时间，编写整个旅途所用的时间

引用 6 楼 寻开心的回复:int main() {     intks,js,xs,fz;      scanf("%d%d",&ks,&js);    // ks 开始时间， js结束时间     xs=js/100-ks/100;              // js/100 提取的是到达时候是几点， 1404到达， 1404/100 就是14；这是计算时差       fz=js%100-ks%100;           // js%100是提取结束时间是几分， 1404到达， 1404%100 就是4；这是计算分差     if(fz<0){xs=xs-1;fz=60+fz;}  // 也是在判断，分上做减法不足底情况；如果不足借来一小时不足     printf("%02d:%02d",xs, fz);      return0; } 想法没有什么差别  关键是你自己想明白， 不用计算机，你自己用脑袋怎么算的， 计算机实现的是你脑子里面都想法 不需要和别人的想法一样， 只要你的想法对就可以 嗯嗯       谢谢

引用 4 楼 寻开心的回复:拆开eTime1404，后eH=14哈  自己算时间差也是这样啊，  分钟不够减，借来一个小时呗， 一个小时是60分钟 你好  可以帮我看看这个程序吗这个是这个题的答案有点看不懂 #include<stdio.h> intmain() { intks,js,xs,fz; scanf("%d%d",&ks,&js); xs=js/100-ks/100; fz=js%100-ks%100; if(fz<0){xs=xs-1;fz=60+fz;} printf("%02d:%02d",xs,fz); return0; }

开始时间sTime 1220  拆开 sH=12（12小时），  sM=20（20分钟）    结束时间eTime 1404 拆开 eH=13，  eM=04  em比sM小啊，  直接做减法不行， 所以要从小时那儿借来一个小时，也就是60分钟， 变成 60+04 = 64 再减去20 ，就是44分钟 然后eH-sH-1  就是14 - 12 -1 = 1 用时 1小时44分钟

引用 1 楼 寻开心的回复:int sTime, eTime； 开始时间 和 到达时间  拆分出来小时和分钟 int  sH, sM, eH, eM; sH = sTime / 100;  sM = sTime % 100; eH = eTime/100; eM = eTime%100;  if ( eM< sM ) {      用的分钟数：  eM+60-sM      用的小时数：  eH-sH-1; // 被上分钟哪儿借走了一小时 } else {      用的分钟数：  eM-sM;      用的小时数：  eH-sH;  }  代码自己写吧， 也不知道你要求的输出格式是什么 这个能在具体点吗  有点看不懂


Question: 大哥们啊，这怎么回事啊，帮帮我吧，求求你们了。

你把错误信息输入百度搜索试试 可能是不兼容的问题.vs不支持这样的项目名


Question: C语言求大佬解答

引用 5 楼 寻开心的回复:  眼神不好， 看不明白那都是啥， 眼神好的继续回答吧   emmmmm

眼神不好， 看不明白那都是啥， 眼神好的继续回答吧

引用 1 楼 寻开心的回复:关键的f函数都做了什么都不知道，如何解答？ 把看不清的部分，自己敲成代码，贴文字出来再提问 我用笔写出来了呀。。

int * r[] = {  int 地址,   int 地址 }

*p 取p地址指向的值 或者取数组的第一个值，  **r 可以理解为 地址的地址指向的值，也可以理解成 地址数组中的第一个地址 指向的值。  int   a = 10 ; int  *p = a ; int **r= & p ;  或者  int p[] = { 10, ... } ;    即:  *p == p[0] ;  int * r = { &p[1], &p[2] } ;    这里 r 是地址数组， **r = *r[0]  , 就是取地址数组中的第一个地址，然后再取指向的值


Question: C语言问题

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

这么简单，自己先写，出问题再说


Question: 为什么这个赋值会失败呢？

少一句ret = sushu(a); 需要ret去接受sushu函数的返回值.

sushu（）里面的return出来的返回值，在主函数要有个变量接收啊 没有变量接收， 返回值就丢了  main函数里面的ret和sushu里面的ret不是同一个变量， 风牛马不相及  好好看看书，关于函数部分， 函数如何返回值，主要就三种 1 借助全局变量 2 函数的return val； 3 函数的指针/引用类型的参数  借助文件什么的传递数据就不算了

作用域问题 ret=sushu(a);


Question: 有大佬帮忙看下嘛，C语言课程球星管理系统

哥我也是西邮的，你这个程序搞好了嘛，我都快疯了


Question: c语言while输出

linux下用sleep()/usleep();Windows下可以用Sleep()  注意下参数的表示意义可能不一样,不如有的是秒,有的是毫秒

肯定会，你这个是单线程的

while(n<maxSize){ if (n%100000==0){输出} n++ }

#include <stdio.h> #include <windows.h>  int main(void) { 	int nDelayTime = 0; 	while(1) 	{ 		nDelayTime++; 		if(nDelayTime == 1000) 		{ 			nDelayTime=0; 			printf("hello world\n"); 		} 		Sleep(1); 	} 	return 0; } 每次延时1ms，积累1000次也就是1s，这样做不会影响其他部分

sleep()函数


Question: 求解这道题！！！

这个不是直接写就行了嘛……哪里不会呢

基础题，自己做 错了贴代码来提问，就有人回答了 要源代码的基础题或者课设题，都没有答案

还没有人帮我一下吗？！？！

顶

顶


Question: 编程实现字符串连接函数strcat的功能，将字符串t连接到字符串s的尾部

连接完数组a溢出了，把a[]改成a[10]


Question: leetcode回文串问题提交出现heap-buffer-overflow

我好像找到问题在哪里了     for (k = output_head_position, l = 0; k <= output_tail_position; k++, l++)     {         output_s[l] = s[k];     } 这个地方中的out_put_s是由     char *output_s = (char *)malloc(sizeof(char) * (size)); 动态分配定义的，在输入了最后一个字符到output_s变量后，由于没有字符串的结束标志，所以在leetcode提交后会继续向最后有一个字符之后遍历，所以出现了越界问题，但是当我将生成的空间多预留一位，并且手动加入'\0'标志后，输出结果是这样的  请问该如何解决啊

heep是堆，越界了，超限

引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 自信男孩 的回复:] for (x = i + 1, y = j - 1; x <= y; x++, y--)    16                 {    17                     if (s[x] == s[y] && x != y) {    18                         length += 2;    19                     } else if (x == y) {    20                         length += 1;    21                     } else if (s[x] != s[y]){    22                         length = 0;    23                         break;    24                     }    25                 }  楼主有没有考虑到,当外层循环i=size-1时,x = i+1,就是x=size已经越界了吧 另外,x++还继续增长[/quote] 这个地方在第for里面是有个x<=y的判断条件的，当i=size-1的时候，x=size，j=size-1，y=size-2，x>y，后面的代码应该会跳过执行，为什么还是会出现这种错误啊

引用 1 楼 自信男孩 的回复:for (x = i + 1, y = j - 1; x <= y; x++, y--)    16                 {    17                     if (s[x] == s[y] && x != y) {    18                         length += 2;    19                     } else if (x == y) {    20                         length += 1;    21                     } else if (s[x] != s[y]){    22                         length = 0;    23                         break;    24                     }    25                 }  楼主有没有考虑到,当外层循环i=size-1时,x = i+1,就是x=size已经越界了吧 另外,x++还继续增长


Question: c语言斐波那契数列，运行失败求解

引用 6 楼 寻开心的回复:又一个不知道那位体育老师教的代码结构 int main () {  ....   return 0; } 是标准的结构  另外， 这种递归实现的方法， n不能天大，否则非常的慢甚至堆栈溢出 更适合用递推的方式来解决 int fun(int n) {     int f1 = 0;    int f2 = 1;    int f =0;    for ( int j=2; j<=n; j++ ) {         f = f2 + f1;          f1=f2;          f2=f;    } return f; };  真的，感谢感谢！

引用 4 楼 程序mode的回复:它可以提示你哪里错了 哇哦  真的哎谢谢！

它可以提示你哪里错了

引用 1 楼 程序mode的回复:主函数用整型或空类型运算就是int main（），或者void main（） 真的哎没错了， 非常谢谢！

主函数用整型或空类型运算就是int main（），或者void main（）


Question: 前辈们救救孩子吧！-非常感谢！

引用 3 楼 _肆 的回复:总的逻辑是上面这样，for循环可以用math库里面的double pow(double x, double y)求次方函数代替，要往严谨了说，输入值的范围的限制得写一套提示，输入格式说“测试数据有多组，执行到文件结尾”，不知道是写个数组一次接收多组输入呢，还是读文本文件中的输入数据，都有对应的一套固定写法  执行到文件结尾不是必须从文件中读.不要忘了标准输入也是可以输入EOF的.Linux下是ctrl+d,windows下是ctrl+z.

引用 4 楼 Kyrieup 的回复:[quote=引用 3 楼 _肆的回复:]总的逻辑是上面这样，for循环可以用math库里面的double pow(double x, double y)求次方函数代替，要往严谨了说，输入值的范围的限制得写一套提示，输入格式说“测试数据有多组，执行到文件结尾”，不知道是写个数组一次接收多组输入呢，还是读文本文件中的输入数据，都有对应的一套固定写法 嗯，应该是从文件读取，其他的都试了都不对[/quote] 执行到文件结尾不是必须从文件中读.不要忘了标准输入也是可以输入EOF的.Linux下是ctrl+d,windows下是ctrl+z.

引用 3 楼 _肆的回复:总的逻辑是上面这样，for循环可以用math库里面的double pow(double x, double y)求次方函数代替，要往严谨了说，输入值的范围的限制得写一套提示，输入格式说“测试数据有多组，执行到文件结尾”，不知道是写个数组一次接收多组输入呢，还是读文本文件中的输入数据，都有对应的一套固定写法 嗯，应该是从文件读取，其他的都试了都不对

引用 7 楼 qybao的回复:算法有问题吧，小数点1万位，超出double的精度了 借用LS的代码修改一下  int main() {     int n, m, p;     int i, k=0;     while (scanf("%d%d%d", &n, &m, &p) == 3) {         n %= m; //取余，为了计算小数         for (i = 0; i < p; i++) {             n *= 10; //像减法一样借位，借10倍             k = n / m; //借位后求出商即为小数点数             n %= m; //继续取余求下一位小数         }        printf("%d\n", k);     }     return 0; } 这个算法真的很巧，多谢(o^^o)

#include <stdio.h>    int main(void) {     int n, m, p;     int i;     double output;      while (scanf("%d%d%d", &n, &m, &p) == 3) {         output = n * 1.0/ m;          for (i = 0; i < p; i++)             output *= 10;          printf("%d\n", (int)output % 10);     }       return 0; }     供参考~

首先将float output=(float)n/m 转为浮点数， 获取第一位小数：(output*10)%10 获取第二位小数：(output*100-)%10 其他类似


Question: 结构体问题

那就不清楚了。 struct note{}； 既不叫声明，也不叫定义，而是叫模板。  struct note game;才叫声明或定义，试试在这里赋值，或改成。 struct {     char name_0[5][10] = {"zhang","wang","zhao","liu","miao"};     int numble[5]; }game;

结果对了，但是警告还在，第五行那里

scanf("%s",&name_1[10]); 应该是         scanf("%s",name_1);          for(int j = 0;j < n;j++) 应该是         for(int j = 0;j < 5;j++)


Question: 二级C语言的程序设计题

引用 3 楼 寻开心 的回复：float只有6～7位有效数字， 1234.567， 从1开始数， 到了6和7，已经是有效数字的边缘了，后面再折腾也准不了 double有12～13位可以支持你的折腾解决了 非常感谢

引用 3 楼 寻开心 的回复：float只有6～7位有效数字， 1234.567， 从1开始数， 到了6和7，已经是有效数字的边缘了，后面再折腾也准不了 double有12～13位可以支持你的折腾我再试试

引用 1 楼 寻开心 的回复：自己仔细看看题目 要求的是double类型 你的float类型 精度不够啊1234.567 float型够了呀

double f;     scanf("%lf", &f);     int v = f* 100+0.5;     f = v/100.0;     printf("%lf\n", f);

自己仔细看看题目 要求的是double类型 你的float类型 精度不够啊


Question: C语言求助 找不出bug

明显不可以，第一个，内存没有NEW或者malloc,第二，一级指针不能修改指针地址，如果不明白第二个就搜二级指针。第一个都不明白的话就够呛了。

引用 2 楼 user-3 的回复:void CS(char* src) {      char *srcptr, *replaceptr;       int srcLength = strlen(src);    //这里得到的值不一定就是15，有可能是大于等于0的任何数，      char replacement[15] = "C is awesome!";      srcptr = src;      replaceptr = replacement;      if (srcLength >= 15) {          for (int i = 0; i < 15; i++)       *srcptr++ = *replaceptr++;      } }   char * replace_string() {     char str[15];     CS(str);     return str; }  str是一个局部变量，且是指针，当这个函数执行完成后，内存被系统回收了，所以返回值这个指针是有问题的。 解决方法一。将str以指针的方式通过形参和实参进行传值。 解决方法二。将char str[15]修改为：char * str = (char *) malloc(15),当然处理完str后记得要free  void CS(char* src) {      char *srcptr, *replaceptr;       int srcLength = strlen(src);    //这里得到的值不一定就是15，有可能是大于等于0的任何数，      char *replacement = "C is awesome!";      srcptr = src;      replaceptr = replacement;       }  改成这样可以吗 char * replace_string() {     char *str;     CS(str);      }  int main(int argc, char ** argv) {     char * ret = replace_string();     printf("replaced string = %s\n", ret);     return 0; }

if (srcLength >= 15) {          for (int i = 0; i < 15; i++)       *srcptr++ = *replaceptr++;      } 加这句话有什么意义吗，长度就是0呀

语法有严重的问题，replace_string返回的是临时内存，离开replace_string内存就释放了，你还用指针指向它.


Question: 咬文嚼字

引用 1 楼 與蘤舊縐的回复:不能这么说，你感觉C++项目里写C语言也可以编译运行，但实际上不过是编译器自动识别了C++和C而已  两个语言还是有不可互通之处的，比如C99之后的标准支持用变量给数组定义长度，这种特性是C++不具备的，具体可百度，什么名字不记得了 提交了，这是一道多选题 选项是ABCD，都是奇奇怪怪的问题 我选了ABCD


Question: C语言初学，求大佬帮忙改个错误

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

#include<stdio.h> int main() {     double w,h,BMI;     //BMI=w/(h*h);     printf("请输入体重(kg)\n");     scanf("%lf", &w);     printf("请输入身高(m)\n");     scanf("%lf",&h);     BMI=w/(h*h);     //printf("BMI=%f\n",BMI);     printf("BMI=%lf\n",BMI);     return 0; }  供参考~

引用 4 楼 寻开心的回复:[quote=引用 1 楼 ?Victor.?? 的回复:] scanf("%lf")爱鸥，不是I  这是10.0的眼神儿才能看出来的， l和I的区别啊[/quote] 艾欧更高一些

引用 3 楼 寻开心的回复:#include<stdio.h> int main() {     double w,h,BMI;     BMI=w/(h*h);             // w和h 都不知道是几呢， 就开始算个鬼啊     printf("请输入体重(kg)\n");     scanf("%If",&w);     printf("请输入身高(m)\n");     scanf("%If",&h);     printf("BMI=%f\n",BMI);     return 0; } 知道了，非常感谢

引用 1 楼 ?Victor.??的回复:scanf("%lf")爱鸥，不是I 为什么输出的结果一直是-0.000000

引用 1 楼 ?Victor.??的回复:scanf("%lf")爱鸥，不是I 感谢感谢，改过来了

引用 1 楼 ?Victor.?? 的回复:scanf("%lf")爱鸥，不是I  这是10.0的眼神儿才能看出来的， l和I的区别啊

爱鸥，艾弗，不是爱，艾弗

scanf("%lf")爱鸥，不是I