Question: 关于求解n个有序数组的交集

引用 1 楼 user-1 的回复:int *merge_common(int *a, int *b,  int len_a, int len_b) 改成 int *merge_common(int *a, int *b,  int *len_a, int len_b) 并且 return p之前加入 *len_a = common_n //记录合并后的长度  main方法 int *p = 0 改成 int *p = a;  调用函数的时候改成 p = merge_common(p, b, &t, n1);  删掉 t = sizeof(p)/sizeof(int) //这个值是1，p是指针，sizeof取得的只是指针的大小不是内存的大小 你好，非常感谢，我修改了下代码，之后优化了下，解决了问题，得到了新的理解


Question: 把有序数组有序的放入队列中，求大神看为啥不行

#include <iostream>  using namespace std;  #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 10  typedef int status; typedef int Qelemtype;  typedef struct{     Qelemtype  *base;     int front;     int rear; }squene;  status lnitquene(squene &Q); status Enquene(squene &Q,Qelemtype &e); status Dequene(squene &Q,Qelemtype &e); int length(squene Q); void insert();  int main() {     insert();     return 0; }  status lnitquene(squene &Q) {     Q.base = new Qelemtype[MAXSIZE];     if(!Q.base)         exit(OVERFLOW);      Q.front = Q.rear = 0;      return OK; }  status Enquene(squene &Q,Qelemtype &e) {     if((Q.rear+1)%MAXSIZE == Q.front)         return ERROR;      Q.base[Q.rear] = e;     Q.rear=(Q.rear+1)%MAXSIZE;      return OK; }  status Dequene(squene &Q,Qelemtype &e) {   if(Q.front ==Q.rear) return ERROR;     e=Q.base[Q.front];     Q.front=(Q.front+1)%MAXSIZE;     return OK; }  int length(squene Q){     return (Q.rear-Q.front+MAXSIZE) % MAXSIZE; } void insert() {     squene S;     Qelemtype e;     lnitquene(S);      //int a[3]={2,9,0};     //int b[3]={1,4,2};     int a[3]={0, 2, 9};     int b[3]={1, 2, 4};     int c[3]={3,6,8};      int i=0,j=0,k=0;     i = j = k = 0;     while (i < 3 && j < 3 && k < 3)     {         //if (a[i] < b[j] < c[k])         if (a[i] <= b[j] && a[i] <= c[k])             Enquene(S,a[i++]);         //else if (b[j] < a[i] < c[k])         else if (b[j] <= a[i] && b[j] <= c[k])             Enquene(S,b[j++]);         else if (c[k] <= a[i] && c[k] <= b[j])             Enquene(S, c[k++]);     }     printf("i = %d, j = %d, k = %d\n", i, j, k);     while (i < 3 && j < 3) {         if (a[i] < b[j])             Enquene(S, a[i++]);         else             Enquene(S, b[j++]);     }     while (i < 3 && k < 3) {         if (a[i] < c[k])             Enquene(S, a[i++]);         else             Enquene(S, c[k++]);     }      while (j < 3 && k < 3) {         if (b[j] < c[k])             Enquene(S, b[j++]);         else             Enquene(S, c[k++]);     }     printf("i = %d, j = %d, k = %d\n", i, j, k);     while (i < 3)         Enquene(S,a[i++]);     while (j < 3)         Enquene(S,b[j++]);     while (k < 3)         Enquene(S,c[k++]);     printf("新的有序数组为:");     while(S.front!=S.rear)      {         Dequene(S,e);         cout<<e;     }     cout<<endl; }   供参考～


Question: C语言

谢谢大家我用数组搞定了

问题不太清晰，最好举例说明。 一般可以用指针来返回多个参数。

定义成数组，这个数组可以全局的也可以是静态的。然后直接返回数组。当然也可以用传入传出参数。

std这种标准库，也有C语言版本的

bool Func(std::list<int>& out);

我理解你的意思是想返回一个for循环得到的多个结果给上一层函数使用，这个简单，你在外面定义一个数组比如int arr[30]，然后把数组作为一个函数参数进行使用，如 int  for_func(int *p_arr)，其中，for_func（）这个函数内部进行for循环计算，把arr作为实际参数传给p_arr即可，如果还不清楚，百度一下：C语言数组当函数参数。


Question: C语言初学者问问题

引用 5 楼 Chen_jiajie1234 的回复:“嵌套模型”是什么。以前学C语言没提到过这个概念。 循环里面套着循环

啥叫嵌套模型？ 是嵌套循环？还是嵌套判断？还是嵌套函数？

“嵌套模型”是什么。以前学C语言没提到过这个概念。

我也不知道关于嵌套循环一般会出哪些问题

就是嵌套循环

你得说清楚你要问的到底是啥？嵌套模型太泛了。


Question: C语言结构体

引用 楼主 weixin_46250143 的回复:#include<stdio.h> int mian() {     struct Vistor     {         char name[10];         int age;         int pay;     };								//定义了一个结构体，成员分别为名字，年龄，应付feiyong      typedef struct Vistor s;		// 将结构体名字简化为s      s vistor;     printf("请输入游客的名字");     while(vistor.name!='/n')		//当游客名字输入为n时，停止输入，否则一直输入          scanf("%s",vistor.name);     printf("该游客应付费用为");	     pay_ment(&vistor);				//传结构体地址调用函数      return 0; } void pay_ment(s *p)					//定义一个函数计算各个年龄段的人应付款  {     if((*p).age>18)					//年龄大于18则付款20          (*p).pay=20;     else							//小于则免费          (*p).pay=0; }  这个typedef为什么没有把结构体名改为s呢！！！！！  报错如下 ||=== 构建文件: "无目标" 在 "无项目" 中 (编译器: 未知的) ===| C:\Users\86147\Documents\电梯程序.c||In function 'mian':| C:\Users\86147\Documents\电梯程序.c|13|warning: multi-character character constant [-Wmultichar]| C:\Users\86147\Documents\电梯程序.c|13|warning: comparison between pointer and integer| C:\Users\86147\Documents\电梯程序.c|16|warning: implicit declaration of function 'pay_ment' [-Wimplicit-function-declaration]| C:\Users\86147\Documents\电梯程序.c|19|error: unknown type name 's'| ||=== 构建 失败: 1 error(s), 3 warning(s) (0 分, 0 秒) ===|    把结构体定义放在最外面  你在main函数中定义了结构体 就只能在main函数里面使用  其它函数无法使用。  顺便说一句 int mian 改为int main

#include<stdio.h> struct Vistor {     char name[10];     int age;     int pay; };								//定义了一个结构体，成员分别为名字，年龄，应付feiyong typedef struct Vistor s;           // 将结构体名字简化为s int main() { 	void pay_ment(s *);      s vistor;     do      {         printf("请输入游客的名字\n");         scanf("%s,%d",vistor.name,&vistor.age);         printf("\n");         pay_ment(&vistor);          //传结构体地址调用函数     }     while(strcmp(vistor.name, "n"));  //当游客名字输入为n时，停止输入，否则一直输入     return 0; } void pay_ment(s *p)					//定义一个函数计算各个年龄段的人应付款 {     if((*p).age>18)					//年龄大于18则付款20     {         (*p).pay=20;         printf("该游客应付20元");     }     else							//小于则免费     {         (*p).pay=0;         printf("该游客免费\n");     } }   嘿嘿，哪个是刚开始写的时候没注意，细节上好多问题，bug好多 这个是我自己新写的。编译没有问题，但是vistor.age在用scanf赋值时，没有反应 不管我输入大于18还是小于18，输出都是免费，这是什么问题呢？  黑窗口的显示是这样的，程序还有点瑕疵，想先问下这是什么问题导致的 请输入游客的名字 fgdk,56  该游客免费 请输入游客的名字 fjgkd,12  该游客免费 请输入游客的名字 fkd,555  该游客免费 请输入游客的名字

#include<stdio.h>  struct Vistor { 	char name[10]; 	int age; 	int pay; };  typedef struct Vistor s; // 将结构体名字简化为s   void pay_ment(s *p);  //int mian() int main() { 	s vistor; 	int i; 	printf("请输入游客的名字"); 	//while(vistor.name!='/n') //当游客名字输入为n时，停止输入，否则一直输入  		//scanf("%s",vistor.name);  	i = 0; 	while (i < 10 && scanf("%c", &vistor.name[i]) && vistor.name[i] != 'n') 		i++;  	if (i < 10) 		vistor.name[i] = 0; 	else 		vistor.name[i-1] = 0;  	vistor.age = 19; 	printf("该游客应付费用为"); 	pay_ment(&vistor); //传结构体地址调用函数  	printf("%s %d %d\n", vistor.name, vistor.age, vistor.pay); 	return 0; } void pay_ment(s *p) //定义一个函数计算各个年龄段的人应付款  { 	if((*p).age>18) //年龄大于18则付款20  		(*p).pay = 20; 	else //小于则免费  		(*p).pay=0; }   供参考～

除了一楼说的还要注意：     while(strcmp(vistor.name, "n") )    //当游客名字输入为n时，停止输入，否则一直输入         scanf("%s",vistor.name);  pay_ment函数要在使用之前进行定义  另外，根本就没有输入age，后面的pay_ment函数执行就没有意义   基础知识太弱了， 好好看看书


Question: c语言

你在说什么？看不明白，起码把背景需求和代码发一下吧～

引用 1 楼 自信男孩 的回复：你在说什么？看不明白，起码把背景需求和代码发一下吧～解决了，就是c语言里面的指针一个分支


Question: 大佬们，救救孩子吧！C语言课程设计，不能用链表和全局变量。很急，就快要验收了。

其实是个很有用的练手题，如果把比赛等同于比较、比对，就看出其实用价值了。如果做一个足球比赛的仿真组织规划套组程序，那么非常多的应用都可以参照编程了。

楼上给的代码，就是把全部的比赛结果一股脑一起输入了，和题目输入每轮比赛的比分,并可以存储。最后每轮比赛的积分榜要求不符。不过我怀疑你们老师出题也根本没考虑这个循环赛具体是意思，当作数学题的排列组合问题了，以为就是个双层循环，哎。。。。。。

循环赛的轮转表生成还是个比较麻烦的算法，涉及分治算法，从题目看可能也不是老师要考的点，可能需要先手工配置好每轮那个和那个队比赛，这样么又不通用了。

引用 15 楼 是小菜 的回复:[quote=引用 13 楼 寻开心的回复:]增加个辅助结构，记录一下 sturct  Score {     int nTeamA;     int nTeamB;    int nScoreA;    int nScoreB; } scores[45];  输入的时候，输入数据到这里 从这里可以统计出，楼上的代码当中Team的数据， 后续的就都可以了 厉害感谢感谢[/quote] 你先仔细看看那代码能不能用吧

先别急着谢呢，那代码合适吗，第一队第一轮比9场，开玩笑？

引用 1 楼 chxchxkkk的回复:用结构体数组 我用结构体数组尝试了一下，但是我这学的一般，没做出来

用结构体数组

引用 13 楼 寻开心的回复:增加个辅助结构，记录一下 sturct  Score {     int nTeamA;     int nTeamB;    int nScoreA;    int nScoreB; } scores[45];  输入的时候，输入数据到这里 从这里可以统计出，楼上的代码当中Team的数据， 后续的就都可以了 厉害👍🏻👍🏻👍🏻感谢感谢

引用 11 楼 x422833523的回复:#include <stdio.h>  #define BIGGER 1 #define SMALLER 0 #define EQUAL 2  typedef struct Team { 	int team_num;     //for 队伍编号 	int score;		 //for 积分 	int win_balls;	 //for 胜球 	int lose_balls;  //for 输球 }team;  void team_init(team *T) { 	int i; 	for(i = 0;i<10;i++) 	{ 		T[i].team_num = i;	 	} }  void team_input_score(team *T) { 	int i,j; 		for(i = 0; i < 9; i++) 	{ 		printf("NO.%d round\n", i+1);//第几轮 		for(j = i + 1; j < 10; j++) 		{ 			printf("team%d vs team%d\n", i, j); 			printf("input  team[%d] score\n", i); 			scanf("%d",&T[i].win_balls); 			T[j].lose_balls = T[i].win_balls; 			printf("input  team[%d] score\n", j); 			scanf("%d",&T[j].win_balls); 			T[i].lose_balls = T[j].win_balls; 			 			if(T[i].win_balls > T[j].win_balls) 			{ 				T[i].score += 3; 			} 			else if(T[i].win_balls < T[j].win_balls) 			{ 				T[j].score += 3; 			} 			else 			{ 				T[i].score += 1; 				T[j].score += 1; 			} 		} 	} }  //交换队伍排位 for排序 void swap_team(team *a, team *b) { 	team tmp; 	memcpy(&tmp, a, sizeof(team)); 	memcpy(a, b, sizeof(team)); 	memcpy(b, &tmp, sizeof(team)); }  void print_team(team T) { 	printf("team[%d].score = %d\n", T.team_num, T.score); 	printf("team[%d].winballs = %d\n", T.team_num, T.win_balls); 	printf("team[%d].loseballs = %d\n", T.team_num, T.lose_balls); 	printf("\n"); }  //比较队伍排名先后 int compare(team a, team b) { 	if(a.score > b.score) 	{  		return 	BIGGER;	 	} 	else if(a.score < b.score) 	{ 		return SMALLER; 	} 	else 	{ 		if((a.win_balls - a.lose_balls) > (b.win_balls - b.lose_balls)) 		{ 			return BIGGER; 		} 		else if((a.win_balls - a.lose_balls) < (b.win_balls - b.lose_balls)) 		{ 			return SMALLER; 		} 		else 		{ 			if(a.win_balls > b.win_balls) 			{ 				return BIGGER; 			} 			if(a.win_balls > b.win_balls) 			{ 				return SMALLER; 			} 			else 			{ 				return EQUAL; 			} 		} 	} }  //给队伍冒泡排序 void Bubble_Sort(team *T) { 	int i, j; 	for(i = 0;i < 9;i++) 	{  		for(j = 0;j < 9 - i; j++) 		{ 			if(SMALLER == compare(T[j], T[j+1])) 			{ 				swap_team(&T[i], &T[j]); 			} 		} 	} }  int main() { 	int i,j; 	team teams[10] = {0}; 	 	team_init(teams); 	team_input_score(teams); 	Bubble_Sort(teams);  	for(i =0;i<10;i++) 		{ 			print_team(teams[i]); 		} 	return 0; }  棒棒哒！

引用 11 楼 x422833523 的回复:#include <stdio.h>  #define BIGGER 1 #define SMALLER 0 #define EQUAL 2  typedef struct Team { 	int team_num;     //for 队伍编号 	int score;		 //for 积分 	int win_balls;	 //for 胜球 	int lose_balls;  //for 输球 }team;  void team_init(team *T) { 	int i; 	for(i = 0;i<10;i++) 	{ 		T[i].team_num = i;	 	} }  void team_input_score(team *T) { 	int i,j; 		for(i = 0; i < 9; i++) 	{ 		printf("NO.%d round\n", i+1);//第几轮 		for(j = i + 1; j < 10; j++) 		{ 			printf("team%d vs team%d\n", i, j); 			printf("input  team[%d] score\n", i); 			scanf("%d",&T[i].win_balls); 			T[j].lose_balls = T[i].win_balls; 			printf("input  team[%d] score\n", j); 			scanf("%d",&T[j].win_balls); 			T[i].lose_balls = T[j].win_balls; 			 			if(T[i].win_balls > T[j].win_balls) 			{ 				T[i].score += 3; 			} 			else if(T[i].win_balls < T[j].win_balls) 			{ 				T[j].score += 3; 			} 			else 			{ 				T[i].score += 1; 				T[j].score += 1; 			} 		} 	} }  //交换队伍排位 for排序 void swap_team(team *a, team *b) { 	team tmp; 	memcpy(&tmp, a, sizeof(team)); 	memcpy(a, b, sizeof(team)); 	memcpy(b, &tmp, sizeof(team)); }  void print_team(team T) { 	printf("team[%d].score = %d\n", T.team_num, T.score); 	printf("team[%d].winballs = %d\n", T.team_num, T.win_balls); 	printf("team[%d].loseballs = %d\n", T.team_num, T.lose_balls); 	printf("\n"); }  //比较队伍排名先后 int compare(team a, team b) { 	if(a.score > b.score) 	{  		return 	BIGGER;	 	} 	else if(a.score < b.score) 	{ 		return SMALLER; 	} 	else 	{ 		if((a.win_balls - a.lose_balls) > (b.win_balls - b.lose_balls)) 		{ 			return BIGGER; 		} 		else if((a.win_balls - a.lose_balls) < (b.win_balls - b.lose_balls)) 		{ 			return SMALLER; 		} 		else 		{ 			if(a.win_balls > b.win_balls) 			{ 				return BIGGER; 			} 			if(a.win_balls > b.win_balls) 			{ 				return SMALLER; 			} 			else 			{ 				return EQUAL; 			} 		} 	} }  //给队伍冒泡排序 void Bubble_Sort(team *T) { 	int i, j; 	for(i = 0;i < 9;i++) 	{  		for(j = 0;j < 9 - i; j++) 		{ 			if(SMALLER == compare(T[j], T[j+1])) 			{ 				swap_team(&T[i], &T[j]); 			} 		} 	} }  int main() { 	int i,j; 	team teams[10] = {0}; 	 	team_init(teams); 	team_input_score(teams); 	Bubble_Sort(teams);  	for(i =0;i<10;i++) 		{ 			print_team(teams[i]); 		} 	return 0; }   题目要求：  输入每场比赛的成绩， 那就要45个数据呢 根据45场比赛统计出上述代码需要的数据就完整了  45场比赛输入两队的编号和各自的进球数目就可以了 上面代码的输入部分稍微改造一下就可以了

难道你要和自己打一场？

10个足球队进行9轮循环赛。 我感觉哪里不对。难道不应该至少10轮才叫循环赛呀

引用 5 楼 ggglivw的回复:1.确实太简单。2.真要写也不是几行，10行代码能写完。你可以自己写，有问题贴出来大家回答。如果类似的题目几百行都要写了调试，我们都没时间工作了，全部给论坛做题。。。 哦哦  好的  谢谢大佬了

引用 3 楼 ggglivw的回复:看描述很简单，结构体数组轻松搞定，没有必要用链表和全局变量，根本不需要的。 大佬，我一个初学者就算知道用结构体数组也编不出来。在你们看如此简单，在我看来，天要塌了

看描述很简单，结构体数组轻松搞定，没有必要用链表和全局变量，根本不需要的。


Question: 请教文件IO显示BMP图片问题，初学，请朋友们帮忙看看

引用 4 楼 user-1 的回复:[quote=引用 3 楼 猪头少年喜挨揍 的回复:] [quote=引用 2 楼 user-1 的回复:] [quote=引用 1 楼 猪头少年喜挨揍 的回复:] 问题已经自行解决，跨行赋值时没有跨过正确的字节数。另外想请问用char型缓冲区最终赋值到LCD显示屏上为什么底色和原图片不一样，使用int型缓冲区就会和原图一样？ char 256色? 其他色值保存不了了。 int可以全保存。 要看你bmp是8位 16位 还是24位 32位[/quote] 朋友你好，我使用的BMP图片是24位位图的，上面的问题我补充详细些： 我用char buf[800*480*4]写入到LCD中显示的图片底色暗黄，用int buf[800*480]写入到LCD就和原图一样 白色的底色是不是为 0xffffffff就行？char型数组保存不了吗？[/quote] char ,其范围 对应整数-128~+127 unsigned char 对应的整数范围为0~255.  24位位图。表示由2的24次方种颜色组成。 16位色的总数是65536,是2的16次方。24位颜色称为真彩色,可以达到人眼辨别的极限。颜色数1677万多色,是2的24次方。  char的范围不够。int满足。[/quote]  好，谢谢你。我上面的都打错了，代码中用的是unsigned char 。但我知道该搜索什么信息了。十分感谢

char型数组写入LCD  int型数组写入LCD底色是白色的，不知道为什么上传不了。

引用 3 楼 猪头少年喜挨揍 的回复:[quote=引用 2 楼 user-1 的回复:] [quote=引用 1 楼 猪头少年喜挨揍 的回复:] 问题已经自行解决，跨行赋值时没有跨过正确的字节数。另外想请问用char型缓冲区最终赋值到LCD显示屏上为什么底色和原图片不一样，使用int型缓冲区就会和原图一样？ char 256色? 其他色值保存不了了。 int可以全保存。 要看你bmp是8位 16位 还是24位 32位[/quote] 朋友你好，我使用的BMP图片是24位位图的，上面的问题我补充详细些： 我用char buf[800*480*4]写入到LCD中显示的图片底色暗黄，用int buf[800*480]写入到LCD就和原图一样 白色的底色是不是为 0xffffffff就行？char型数组保存不了吗？[/quote] char ,其范围 对应整数-128~+127 unsigned char 对应的整数范围为0~255.  24位位图。表示由2的24次方种颜色组成。 16位色的总数是65536,是2的16次方。24位颜色称为真彩色,可以达到人眼辨别的极限。颜色数1677万多色,是2的24次方。  char的范围不够。int满足。

引用 2 楼 user-1 的回复:[quote=引用 1 楼 猪头少年喜挨揍 的回复:] 问题已经自行解决，跨行赋值时没有跨过正确的字节数。另外想请问用char型缓冲区最终赋值到LCD显示屏上为什么底色和原图片不一样，使用int型缓冲区就会和原图一样？ char 256色? 其他色值保存不了了。 int可以全保存。 要看你bmp是8位 16位 还是24位 32位[/quote] 朋友你好，我使用的BMP图片是24位位图的，上面的问题我补充详细些： 我用char buf[800*480*4]写入到LCD中显示的图片底色暗黄，用int buf[800*480]写入到LCD就和原图一样 白色的底色是不是为 0xffffffff就行？char型数组保存不了吗？

引用 1 楼 猪头少年喜挨揍 的回复:问题已经自行解决，跨行赋值时没有跨过正确的字节数。另外想请问用char型缓冲区最终赋值到LCD显示屏上为什么底色和原图片不一样，使用int型缓冲区就会和原图一样？ char 256色? 其他色值保存不了了。 int可以全保存。 要看你bmp是8位 16位 还是24位 32位

引用 4 楼 user-1 的回复:[quote=引用 3 楼 猪头少年喜挨揍 的回复:] [quote=引用 2 楼 user-1 的回复:] [quote=引用 1 楼 猪头少年喜挨揍 的回复:] 问题已经自行解决，跨行赋值时没有跨过正确的字节数。另外想请问用char型缓冲区最终赋值到LCD显示屏上为什么底色和原图片不一样，使用int型缓冲区就会和原图一样？ char 256色? 其他色值保存不了了。 int可以全保存。 要看你bmp是8位 16位 还是24位 32位[/quote] 朋友你好，我使用的BMP图片是24位位图的，上面的问题我补充详细些： 我用char buf[800*480*4]写入到LCD中显示的图片底色暗黄，用int buf[800*480]写入到LCD就和原图一样 白色的底色是不是为 0xffffffff就行？char型数组保存不了吗？[/quote] char ,其范围 对应整数-128~+127 unsigned char 对应的整数范围为0~255.  24位位图。表示由2的24次方种颜色组成。 16位色的总数是65536,是2的16次方。24位颜色称为真彩色,可以达到人眼辨别的极限。颜色数1677万多色,是2的24次方。  char的范围不够。int满足。[/quote]  你好，你的回答是说char的范围不够，但我代码中使用了unsigned char buf[800*480*4]数组，这个数组的字节，可以完整地把BMP的所有颜色数据拷贝下来，最后写入LCD也应该不会少了什么信息。能从这方面帮我讲讲吗？用char不行的具体原因。谢谢


Question: C语言结构体问题

哇，终于解决了，谢谢你

引用 5 楼 weixin_46250143 的回复:等会，我刚刚又试了一下，还是没有任何改变，跟原来的错误一模一样，就是scanf赋值那条语句一直报错，我的是.c文件，用的是codeBlocks编译运行的 C:\Users\86147\Documents\结构体练习02.c|13|warning: declaration does not declare anything| C:\Users\86147\Documents\结构体练习02.c|19|error: expected identifier before 'long'| C:\Users\86147\Documents\结构体练习02.c|20|error: expected identifier before 'long'| C:\Users\86147\Documents\结构体练习02.c|20|error: too few arguments to function 'hahaha'| 不要用long作名称，long是内定字符

谢谢三位！！超级感激！

int volumn; 	struct Box 	{ 		int ln;			// xx 		int width; 		int height; 	};                   	struct Box s;        	printf("请输入立方体的长宽高"); 	scanf("%d,%d,%d", &s.ln, &s.width, &s.height);      //xx 	volumn = hahaha(s.ln, s.width, s.height);                   //xx 	printf("%d", volumn);

调用体积函数改成 volumn=hahaha(s.long, s.wigth, s.height); 注意结构体变量的使用

volumn=hahaha(long,width,height);                   //调用函数 ====>>>  volumn=hahaha(s.long,s.width,s.height);                   //调用函数


Question: 把有序数组有序的放入队列中，其中lnitquene为初始化，enquene为入队列，求大神帮看为何不行

贴完整代码吧，其他的代码靠猜吗？


Question: c语言开发效率比java低是哪些因素导致的？

基本上就2个，越界和野指针。其他的问题都是必现

这个不是啥不好的习惯，看你会不会用

看到有老师说指针和越界的问题，我就想起我自己： 我写代码有个不太良好的习惯，就是大量使用指针。 当然，说它不良好是相对的。如果写的是底层代码，用的话，那很正常。 但如果使用的是高级语言，写一些顶层应用的那些代码，就不是一个好习惯了。

开发效率上来讲有2点，1是开发的速度，轮子的丰富程度，2是出错的调试问题。这2点JAVA都比纯C好很多，纯C优点就是简单，语法简单，规则简单，各种可控，没有太多花哨的东西，然后就没有然后了。 如果开发人员经验不够丰富，项目复杂了以后来一点点越界和野指针要找死人。

类比就像，你造电脑，底层语言从材料开始干。 高级语言从器件开始干。 这下懂了吧。  另外一点很重要的就是 ：java是面向对象的理念进行设计的。这也是为什么被成为面向对象语言的原因之一。 面向对象编程时一种理念、设计、想法。java，c++...高级语言的设计就遵循了这个理念。 这也是为什么他们都有类、对象、继承、重载、多态等等东西（）关键字嘛  面向对象编程的优点具体可以百度了，开发效率是其一吧，

代码偏底层。程序员需要写比java更多的代码。 代码更复杂繁琐。申请的内存要负责释放。不释放错误释放是新手常见的问题。java自动回收

C语言的malloc/free要配对使用，否则就是内存泄露。  java的库比C大很多，许多功能已经做好了，直接调用就行。


Question: 无头指针的循环链表，删除一个特定值所在的结点的前驱。死循环了……

引用 1 楼 自信男孩 的回复:#include<stdio.h> #include<stdlib.h>  struct node{     int data;     struct node *next; };  typedef struct node NODE;  NODE* creat() {     int x;     NODE *p,*s,*r;     p = (NODE*)malloc(sizeof(NODE));     s = p;     scanf("%d",&x);     p->data = x;     //while(x!=-1)     while(1)     {         scanf("%d", &x);         if (x == -1)             break;         r=(NODE*)malloc(sizeof(NODE));         r->data = x;         p->next = r;         p = r;     }     p->next = s;      return(s); }  //NODE* shuchu(NODE *L) void shuchu(NODE *L) {     NODE *p;      p = L;     //while(p) {     while(p->next != L) {         printf("%d",p->data);         p = p->next;     }     printf("%d",p->data); }  NODE *delprev(NODE *p,int b){      NODE *L,*r,*k;     L=p;      while(L->next->data!=b)     {    r=L;         L=L->next;}     k=L->next;     r->next=k;     free(L);     return(k); }  int main() {     int a;     NODE *L,*p;      printf("新建链表\n输入值以-1结尾：");     p = creat();     shuchu(p);     printf("指定结点p的值：");     scanf("%d",&a);     L = delprev(p,a);     shuchu(L); } 供参考～  楼主的是循环链表，但是shuchu函数没有特殊处理，所以是死循环呢。  其他地方也做了修改，供参考～    啊啊啊啊 感谢


Question: c语言教程里的一段关于虚拟地址的问题，请教？

你的书是错的。编译完成后，决定的只是 a、b 的相对地址(相对于基址)，而绝对地址不作保证。实际上，现代操作系统会特意改变基址的位置，以使 a、b 的绝对地址发生变化。经过特殊配置的或者较老的操作系统是不支持这种地址随机化的操作的。 注：C 语言标准只规定 a、b 在单独的每次程序的执行过程中的地址从不变化，但未曾保证多次执行程序还能保持地址相同。

引用 4 楼 GKatHere 的回复:不要在调试中运行，直接双击文件运行。  直接双击文件运行也是每次结果都不同

不要在调试中运行，直接双击文件运行。

想弄清楚这个问题，需要了解一下可执行文件的结构

引用 1 楼 自信男孩 的回复:每次运行时，分配的内存位置不一样呗。这应该是正常的～你的电脑里一直在运行着程序，可能上次使用的位置被别的程序使用了，也是有可能的。  上面输出的都是虚拟地址而不是物理地址， 那意思是说书上说的是错的吗？不可能每次运行输出的地址都一样。


Question: c语言中为啥给三个数组赋值不能使用同一变量i，有哪错误吗

没返回值能运行？

for循环内声明变量是c99特性，一些比较老的编译器不支持，比如大学生都在用的vc6

你这个c和c++混用，一会 cout << ，一会scanf。有特殊的用意吗？ 理论上三个 for(int i=0; i<3; i++)里面的 i 是互不影响的。

引用 3 楼 user-5 的回复:啥意思？没看明白？ 是不能定义三次i？ 还是说想在同一个for循环里同时输入三个数组？ 比如 scanf(“%d%d%d”, &a[i], &b[i], &c[i]); 都有一点吧，后者可以实现吗

引用 4 楼 自信男孩 的回复:[quote=引用 2 楼 huotiana 的回复:] 确定，用c编写后有错误， --------------------Configuration: 调试 - Win32 Debug-------------------- Compiling... 调试.cpp D:\c程序\调试.cpp(10) : error C2374: 'i' : redefinition; multiple initialization         D:\c程序\调试.cpp(7) : see declaration of 'i' D:\c程序\调试.cpp(13) : error C2374: 'i' : redefinition; multiple initialization         D:\c程序\调试.cpp(7) : see declaration of 'i' D:\c程序\调试.cpp(15) : warning C4508: 'main' : function should return a value; 'void' return type assumed 执行 cl.exe 时出错.  调试.obj - 1 error(s), 0 warning(s) 我的环境里测试了，没问题～LINUX +C[/quote] 手误是LINUX+C++

引用 2 楼 huotiana 的回复:确定，用c编写后有错误， --------------------Configuration: 调试 - Win32 Debug-------------------- Compiling... 调试.cpp D:\c程序\调试.cpp(10) : error C2374: 'i' : redefinition; multiple initialization         D:\c程序\调试.cpp(7) : see declaration of 'i' D:\c程序\调试.cpp(13) : error C2374: 'i' : redefinition; multiple initialization         D:\c程序\调试.cpp(7) : see declaration of 'i' D:\c程序\调试.cpp(15) : warning C4508: 'main' : function should return a value; 'void' return type assumed 执行 cl.exe 时出错.  调试.obj - 1 error(s), 0 warning(s) 我的环境里测试了，没问题～LINUX +C

代码没问题呢，楼主确定是是用c++/g++编译的吗？


Question: PTA  7-2 说反话-加强版

#include<stdio.h>  //#define M 500000 #define M 512  int main() {     char s[M];//,b[M];     int cnt, i, j, k;     //int i,k,j,h=0;     k=0;     while(k < M - 1 && (s[k]=getchar())!='\n')         k++;     s[k] = '\0';      cnt = 0;     for (i = k-1; i >= 0; i--) {         if (s[i] == ' ' && s[i+1] != ' ') {             for (j = i+1; j < i + 1 + cnt; j++)                 putchar(s[j]);             if (cnt > 0)                 putchar(' ');             cnt = 0;         }         if (s[i] != ' ')             cnt++;     }     for (j = i+1; j < i + 1 + cnt; j++)         putchar(s[j]);      putchar(10);   #if 0     k=k+1;     for(i=k;i>0;i--)     {         s[i]=s[i-1];     }     s[0] = ' ';      j=0;      for(i=k-1;i>=0;i--)     {         if(s[i]!=' ')         {             j++;             b[j]=s[i];         }         else if(j!=0)         {             for(h=j;h>0;h--)             {                 printf("%c",b[h]);             }             if(i!=0)                 printf(" ");             j=0;         }     } #endif     return 0; } 供参考～


Question: 大神们 这个程度应该怎么编写

用log10求位数，其他没什么困难

供参考  #include <stdio.h> #define ARRLEN 10  int main() {     int i, j=0, n, k;     int a[ARRLEN] = {0};     printf("请输入一个整数：\n");     scanf("%d", &n);      i=n;     //判断输入的整数位数     while(i)     {         j++;         i /= 10;     }      //取出各个位的数字     i = 0;     for (k=0; k<j; k++)     {         i = n % 10;         a[k] = i;         n /= 10;     }      printf("输出每一位：\n");     for (k=j-1; k>=0; k--)     {         printf("%d ", a[k]);     }      printf("\n逆序输出每一位：\n");     for (k=0; k<j; k++)     {         printf("%d ", a[k]);     }      return 0; }

既然都是限定在正整数了，直接求模求余取出各位数据，然后再排个序（或者不需要排序都可以）

看来必须要使用数组了， 相关函数：atoi, itoa


Question: opengl 设置颜色为黑色之后取色仍然为白色

引用 1 楼 user-1 的回复:不应该把color放到begin，end之间？ 也不行...

不应该把color放到begin，end之间？


Question: 算法测试题求助

能否帮帮我这位小弟弟啊 我是真的不知道该怎么做了

算通项公式啊 这纯粹是数学问题  以i一个为例子: T(n).   -  T(n-1) = n^2 T(n-1) - T(n-2) = (n-1)^2 .... T(2) - T(1)  = 2^2 T(1).           = 1 所以 T(n) = 1 + 2^2 + 3^2 + .... + n^2 = 1/6*n*(n+1)*(2n+1)  这就是O（n^3)啦   第二题， T（n） =  log（1） + log（2） + 。。。 + log（n） = log 10^( log(1) + log(2) + ... log(n) ) = log(10^log(1) * 10^log(2) * ... 10^log(n)) = log (1 * 2 *3 *.. *n) = log(n!) O(log(n!)) 和O(nlog(n))是等价的， 这TMD要用斯特林公式还要证明极限， 高数的事儿就不讲了  都是类似的问题， 高数要不好，就该干嘛就干嘛去吧， 总不能在开高数讲堂吧


Question: C语言枚举

(1)c++中不允许枚举自增,如果要编译,请改为.c而不是.cpp (2)枚举只是数字常量的便携记住的名称,在内存中不存在enum SEASONS的任何相关的值,代替的是整形数字,解决方法:  #include <stdio.h> char **season={"spring","summer","autumn","winter"};  int main(int argc,char **argv){     int n =4;     puts(season[n-1]);     return 0; }

哇，我懂了。刚才试了一下，非常感谢！！

这个sesaons[season]中的season是数字常量4吧，而且它是枚举类型的变量，对吧，枚举类型的变量都是数值！！这句话也没错是吧。

再定一个char *的数组呗 char * seasons[] = {"", "SPRINT", "SUMMER","AUTUTMN","WINTER" } printf("%s", seasons[season]);

引用 1 楼 寻开心 的回复:第一个问题 enum按照定义，里面的元素数值不一定是连续的， 完全可以四个元素分别是1， 8，200， 5000 那么元素的++，得到的结果是什么？ 未知 严格的编译器会检测， 认为enum类型没有自增的操作， 至少会给予警告  第二个问题 枚举是int值而不是字符串 另外printf指定格式是%d输出一个整数，也不是要求输出一个字符串啊    那请问第二问该怎么输出WINTER呢，该使用什么格式


Question: 希望可以解答一下

要实现交换，值传递是不行的，正如楼上所说。传地址才能实现。

sub1这个函数是打算做交换的吧。建议用swap作为函数名。或swap_int。 实际的结果是都不能做交换，原因是参数是值传递，实参a3, a4与sub1中的x, y是相互独立的，sub1函数里交换了x, y的值，但是这两个值是函数内部的变量，函数调用结束会自动释放，因此不会影响a3, a4的值，同理也是a1, a2


Question: 函数

a1是全局变量，a1的值是最后一次给其赋值的值。 第一次是300赋值个a1，得到100，第二次是a1赋值给a1，即还是保存100. a2, a3，a4的值不变，不变的原因是交换的参数是变量而非地址。

void sub1(int x,int y)  { a1=x; x=y; y=a1; } 函数改成： void sub1(int *x, int *y) {     a1=*x;     *x = *y;     *y = a1; } main函数中这样调用 sub1(&a3, &a4);

因为sub1这个函数是传值调用，也就是说这个函数获得参数值的一份拷贝。函数修改这个拷贝值，但并不影响调用程序实际传递给它的参数。


Question: 字节对齐的问题

第一个char一个字节，第二个short int 进行两字节对其，第一个char与short int之间因为对齐，所以这两个总共占4个字节。第三个char因为前面是两字节对其，按理说第三个char应该占2个字节，这三个放一起应该是6个字节，但是第四个是int，所以char要进行4字节对其，所以char相当于占了4个字节，加上int4个字节共12个字节，如图所示。


Question: 类中定义枚举类为数据成员

引用 3 楼 真相重于对错的回复:估计是他拿类型当实例用。  [quote=引用 2 楼 棉猴 的回复:] 没有问题啊，VS2015 C++环境 class DataType { private: 	enum type { type_in, type_char, type_float }; 	union { 		int num_int; 		char num_char; 		float num_float; 	}; }; int main() { 	return 0; } [/quote] 对，一开始以为定义在后边也是枚举名，就糊涂了。现在明白了，谢谢！

引用 4 楼 真相重于对错的回复:class A{ enum type{....}; } 代表他是一个类型，要使用必须 A::type o=.... ========== class A{  enum{ ....}type; 代表的是一个匿名的枚举。type是一个字段 可以通过 A a; a.type 访问。。。 明白了谢谢！

估计是他拿类型当实例用。  引用 2 楼 棉猴 的回复:没有问题啊，VS2015 C++环境 class DataType { private: 	enum type { type_in, type_char, type_float }; 	union { 		int num_int; 		char num_char; 		float num_float; 	}; }; int main() { 	return 0; }

前面代表的是类型名


Question: visual studio 小白求助贴

扩展名改成cpp?

楼主的代码是C++的，建议改成cpp后缀～

你这是新建了C项目吧


Question: 改错程序找不到错误了，但是运行结果确是不对的，不知道该怎么办了

改一下这条语句：  item = fact(i) * 1.0/multi(2*i+1); 这样保证除法运算是浮点数除法而不是int类型的除法。

引用 1 楼 user-2的回复:(double)fact() 好的，谢谢你

(double)fact()


Question: 大神帮我看看我的程序哪里出错了，麻烦帮忙改正

两个问题：switch后面不能加分号;否则和后面的case 连不起来。第二个，需要switch后加大括号，把case都括起来～

6基础打好吧，编译器都明确指出来了

后面加上大括号把case判断都括起来

switch


Question: 帮忙看看怎么优化代码

引用 8 楼 proorck2019 的回复:在SD中添加times++，计算执行次数，然后分析算法复杂度。如果确实无法优化，建议放弃。  好的，谢谢

你可以用记忆化搜索试试

引用 7 楼 harryzhjx 的回复:[quote=引用 6 楼 自信男孩 的回复:] [quote=引用 5 楼 harryzhjx 的回复:] [quote=引用 3 楼 自信男孩 的回复:] 递归函数建议明确一下退出条件，看到你的if, else里都调用了自身。那么SD怎么退出呢？  if(n==180){     print(b);     return;  //这样退出是否符合你的要求，如果符合建议试一下 }     我想只输出一个结果，应该怎么跳出递归呢？ [/quote] 试一下了吗？  另外，根据你的需求定义跳出的位置呢。你想什么时候就退出了？[/quote]  我试了，还是很慢[/quote]  if(n==180){     //print(b); // print太慢，不要     return;   }

你在SD里边又调用SD，可能这是慢的原因吧。

引用 6 楼 自信男孩 的回复:[quote=引用 5 楼 harryzhjx 的回复:] [quote=引用 3 楼 自信男孩 的回复:] 递归函数建议明确一下退出条件，看到你的if, else里都调用了自身。那么SD怎么退出呢？  if(n==180){     print(b);     return;  //这样退出是否符合你的要求，如果符合建议试一下 }     我想只输出一个结果，应该怎么跳出递归呢？ [/quote] 试一下了吗？  另外，根据你的需求定义跳出的位置呢。你想什么时候就退出了？[/quote]  我试了，还是很慢

引用 5 楼 harryzhjx 的回复:[quote=引用 3 楼 自信男孩 的回复:] 递归函数建议明确一下退出条件，看到你的if, else里都调用了自身。那么SD怎么退出呢？  if(n==180){     print(b);     return;  //这样退出是否符合你的要求，如果符合建议试一下 }     我想只输出一个结果，应该怎么跳出递归呢？ [/quote] 试一下了吗？  另外，根据你的需求定义跳出的位置呢。你想什么时候就退出了？

引用 3 楼 自信男孩 的回复:递归函数建议明确一下退出条件，看到你的if, else里都调用了自身。那么SD怎么退出呢？  if(n==180){     print(b);     return;  //这样退出是否符合你的要求，如果符合建议试一下 }     我想只输出一个结果，应该怎么跳出递归呢？

运算的时间特别长，希望高手能帮忙出出建议，简化一下


Question: 大佬们，这个文件为什么无法输出啊！！！

fp没有获取fopen的返回值。另外，ch 要定义成int类型，因为定义为int才能和EOF比较的～

引用 2 楼 user-2的回复:fp=fopen(xxxx 你打开文件却没获取文件句柄。  啊啊啊，原来如此

fp=fopen(xxxx 你打开文件却没获取文件句柄。

大佬们，求助啊。。。。


Question: 就是把一个算式中的运算符和数分别存在两个数组，求大神看看为何不行

感谢大哥，关注你了

#include <iostream> #include <cstring> using namespace std;  int main() {     int a[10] = {0};     char b[10];     char c[15];     int d=10;     cout<<"请输入算式:";     fgets(c, 15, stdin);      int k = 0, j = 0;     for(int i=0;i<strlen(c);i++)     {         if(c[i]>=48 && c[i]<=57)         {              while(c[i]>=48 && c[i]<=57)             {                 a[k] = a[k]*d + c[i]-'0';                 i++;             }             if (c[i] != ' ' && c[i] != '\t' && c[i] != '\n')                 b[j++]  = c[i];             k++;         } else if (c[i] != ' ' && c[i] != '\t' && c[i] != '\n')             b[j++] = c[i];     }     printf("j = %d\n", j);      cout<<"算式中的数字有:";     for(int i=0;i<k;i++)         printf("%d\t",a[i]);     cout<<endl;     cout<<"算式中的运算符有:";     for(int i=0; i < j;i++)         printf("%c", b[i]);     cout<<endl;     return 0; } 供参考～  建议楼主写代码还是要仔细一些，比如：  printf("%c",a[k]); 这个输出运算符的？


Question: 求指点

引用 3 楼 chxchxkkk的回复:printf("%d %d %d", a, b,c); 这里的%d 之间加个空格就不连在一起了 好，谢谢。。。。

引用 1 楼 user-2的回复:输入？？ scanf("%d %d %d"... 11 22 33 什么意思。。。

输入？？ scanf("%d %d %d"... 11 22 33


Question: C语言指针函数问题求解

引用 1 楼 寻开心的回复:p=&a[2];         /*将p  指向数组元素a[2]*/ for(i=4;i>=0;i--)     printf("  %d",p[i] );  此时的p[i] 等价于 a[2+i]  根据循环，输出的结果就是a[6], a[5], a[4], a[3]和a[2]  p = &a[4]; for ( i=0; i<=4; I++ )     printf("%d", *p--); 这样倒序输出 谢谢


Question: C语言

还有一个技巧补充，毕竟从文件读入要写文件打开和读取等操作，要改代码 下面的技巧，可以不用改代码，那就是利用windows 命令行的管道能力 windows命令管道，可以用文件替代键盘输入 cmd下，比如你的exe是1.exe 那么 1.exe < a.txt 就可以让a.txt当中的内容当做键盘输入的内容到1.exe文件里面去 这样程序代码不用改， 通过编辑1.txt来修正你重复使用的输入内容了

其实这是一个用户体验的问题 要改一下程序的控制逻辑     加一行输出， 提示用户，你刚才输入的是什么， 是否确认，是就继续其他的，否则就返回重新输入 问题是这么做，当你输入的都对的时候，还要一个个的测试，会觉得很麻烦  均衡的办法， 把你要输入的数据，都放入文件当中，让程序从文件当中去读 要改就改文件里面的内容， 改了你可以再确认后保存，然后再去运行程序，规避这个问题


Question: vs code怎么用

没有设置过GCC的路径吧   之前电脑上有装过codeblocks之类的吗？

应该是没有引入C的库和头文件。需要配置一下你的环境～

vscode写java的吧，注意vs的图标，写c用的程序不是这个。

初学就别折腾vscode了，乱码等一系列问题太恶心  装个dev c++省点事

引用 5 楼 qq_46344220 的回复:[quote=引用 3 楼 5250的回复:]没有设置过GCC的路径吧   之前电脑上有装过codeblocks之类的吗？ 好像没得怎么办[/quote]  之前电脑没有装过任何编程的东西吗？如果是的话，我从开头告诉你

引用 7 楼 qq_46344220 的回复:[quote=引用 4 楼 liups的回复:]从图中看至少有一个问题：文件夹和文件名称不能用中文！ 其他请参考本人博客： https://blog.csdn.net/liups/article/details/102512769 还是有点懵[/quote] 图中可以看出有中文：前端和C语言！gcc不能有这种中文！

引用 4 楼 liups的回复:从图中看至少有一个问题：文件夹和文件名称不能用中文！ 其他请参考本人博客： https://blog.csdn.net/liups/article/details/102512769 还是有点懵

引用 2 楼 自信男孩的回复:应该是没有引入C的库和头文件。需要配置一下你的环境～ rmmmm具体怎么办？

引用 3 楼 5250的回复:没有设置过GCC的路径吧   之前电脑上有装过codeblocks之类的吗？ 好像没得怎么办


Question: 子函数的注释影响了主函数的输出，求解答

引用 6 楼 m0_46108109的回复:哦，我知道了。是这样的，程序运行时，需要将代码链接进堆栈。 例如printf需要将库函数链接进程序的堆栈，第二次调用时，可以复用这段代码。  你如果没在函数中加入printf，那么在主函数第一次调用printf时，printf的代码，覆盖了你原来的堆栈。 所以找不到原来的数据了。  你可以测试，在别处先调用一回printf，就能得到你想要的结果。 当然这个效果依然是未定义，系统并不做此保证。 并没有用，我在主函数里和子函数里都加了printf一个空格，还是老样子。甚至把子函数原来的printf改掉让他不输出c[160]也得不到结果，哦，把输出数组c改成输出指针p倒是没影响，return的是c还是p也没影响。  不过如果在注释掉子函数的情况下，在主函数的printf后面再加一个printf *c，*c就接收不到数据了。如果主函数仅有一个printf去输出*c，倒是有数据。这可能是因为所谓“覆盖”的关系。

引用 4 楼 qq_36058799 的回复:[quote=引用 1 楼 真相重于对错的回复:]你返回了函数内部局部变量的地址了，出现什么结果都是可能的 嗯，确实是没有想到是因为局部变量的问题。我也想过在主函数里定义数组c再把地址传到子函数，但一则不想改，二则实在想知道为什么输出不对。但若是因为局部变量被消除的原因，为什么在不注释子函数printf的情况下，输出又是对的呢[/quote] 出现什么结果都是可能的，还是按规范去写代码吧

引用 1 楼 真相重于对错的回复:你返回了函数内部局部变量的地址了，出现什么结果都是可能的 嗯，确实是没有想到是因为局部变量的问题。我也想过在主函数里定义数组c再把地址传到子函数，但一则不想改，二则实在想知道为什么输出不对。但若是因为局部变量被消除的原因，为什么在不注释子函数printf的情况下，输出又是对的呢

引用 2 楼 m0_46108109的回复:char c[160]是局部变量，具有自动存储期，但函数退出时，其地址所存储的内容可能被擦除。 你在函数内打印了一次，能够正常显示，应该是未定义的，系统并不做此保证。 当函数内未打印时，返回的这个地址很可能已经被写入了别的内容。 可我在主函数里输出*c的时候，内容确实是a，甚至*c+4也是1，如果因为是局部变量而没得到数据的话，*c不该有值。在*c明明有值的情况下，printf %s却不能输出数据，实在是没搞懂

你返回了函数内部局部变量的地址了，出现什么结果都是可能的


Question: 大神们这是哪里出问题了啊？

引用 1 楼 寻开心 的回复:首先 第一个for循环，寻找第一个空格的代码有问题 加入， 字符串一个空格都没有， 会如何 i会一直跑到数组结束，或者遇到没有初始化的都数组当中随机出现的某个字符碰巧是空格的时候停止 然后第二个for循环就不知道执行什么了 需要在第一个循环上补充，遇到'\0'也要截止。 或者i从0到strlen(a);  其次，你的第二个循环里面判断了字母是不是大小写或者数字， 但是题目说了只要不是空格的都算单词的组成部分（0除外） 那么当你遇到有标点符号的时候，怎么办？ 所以，第二个循环代码里面只要判断 空格 '\0'和其他字符这三种情况就可以了  这样啊，谢谢大神了！

单词是指连续的不包括空格的字符串 所以只要不是空格，都可以认为是单词的组成部分， 不限于大小写字母和数字


Question: 怎答案是啥啊

char int 'c' 3 %c %d  基本的语法知识，建议楼主还是学一下吧。不学习，确实一个做不出来呀


Question: c语言作业题求助！！！

scanf("%d,%c,%f",&a,&b,&c); if((fp=fopen("int.txt","w"))==NULL)  前面人说的是少了，那个fp=， 没有把fp赋值，后面的fprintf（fp，。。。）的时候，fp是个什么鬼是未知的，所以写不成功

引用 2 楼 自信男孩的回复:fprintf(fp,"%d,%s,%f",a,b,c); 改成： fprintf(fp,"%d,%c,%f",a,b,c);  你没发现第一个程序，没有吧fopen的返回值赋值给fp吗？ 我同学给我发的是他修改之前的代码。。。我改了，但还是空白

引用 2 楼 自信男孩的回复:fprintf(fp,"%d,%s,%f",a,b,c); 改成： fprintf(fp,"%d,%c,%f",a,b,c);  你没发现第一个程序，没有吧fopen的返回值赋值给fp吗？ 他给我发的是他改之前的代码，我晕

你第一个代码 scanf("%d,%c,%f",&a,&b,&c); 这一句，scanf函数中用逗号分隔了，输入的时候也要输入逗号

第一个的fp好像没指向


Question: c语言：尾牙将近问题

报出每个人获得的奖金金额， 这句应该是报出奖金总额啊 否则都报出来了，还算个什么劲儿 总额 除以 获奖名单人数 就是每个人的奖金数 这个有什么难点需要提问？


Question: 跪求解答，帮忙修改

引用 8 楼 寻开心的回复:scanf("%lf",&c);	 for(d=1;d<=b;d++)	a-=(a*c);	  这两行中间， 加上一句 printf("a:%lf b:%d c:%lf\n", a,b,c); 然后，你看看你通过输入获得到的abc各自是多少？  a，b，c输入的不对，才导致for循环计算的结果出问题 谢谢，我还是小白

什么意思啊？你要运行下再修改😂

正确的输出应该是  a：10000 b：10  c：0.0088 这才是你期待的结果 但是实际上你输出应该是   a:0.0088. b:1000 c:10

你看看，你输入的位置 a=0.0008 b=1000 c=10 你可以在获得三个输入之后 printf("a:%lf b:%d c:%lf\n", a,b,c); 看看结果是什么

#include <stdio.h> #include <Windows.h> int main() {	 int b,d;	double a,c;		 printf("请输入现在的年折损率:\n");//折损率为c 	printf("请输入你的金额:\n");//金额为a 	 printf("您预期存钱年数:\n");//预存年数为b 	 COORD loc;     loc.X=21;     loc.Y=0;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);	 scanf("%lf",&a);	 COORD joc;    loc.X=15;     loc.Y=1;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);	 scanf("%d",&b);	 COORD koc;     loc.X=15;     loc.Y=2;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);	 scanf("%lf",&c);	 for(d=1;d<=b;d++)	a-=(a*c);	 printf("经计算您现有货币将折损为:%lf",a);	 return 0; }

引用 1 楼 寻开心的回复:a -= a*c c是百分比吧， 你这里的10，应该是0.1    还有不要为了你自己省事儿，贴图而不贴代码 都图自己省事儿，就没人回答你问题了 #include <stdio.h>#include <Windows.h>int main(){	int b,d;	double a,c;		printf("请输入现在的年折损率:\n");//折损率为c 	printf("请输入你的金额:\n");//金额为a 	printf("您预期存钱年数:\n");//预存年数为b 	COORD loc;    loc.X=21;    loc.Y=0;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);	scanf("%lf",&a);	COORD joc;    loc.X=15;    loc.Y=1;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);	scanf("%d",&b);	COORD koc;    loc.X=15;    loc.Y=2;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);	scanf("%lf",&c);	for(d=1;d<=b;d++)	a-=(a*c);	printf("经计算您现有货币将折损为:%lf",a);	return 0; }

引用 1 楼 寻开心的回复:a -= a*c c是百分比吧， 你这里的10，应该是0.1    还有不要为了你自己省事儿，贴图而不贴代码 都图自己省事儿，就没人回答你问题了 这里的10是b


Question: 小白：c语言中头文件只做声明还需要加 #ifndef 吗？

最好加一下，这样以后还可以扩展进行变量定义

最好加一下，这样以后还可以扩展进行变量定义

建议在编译环境里试一下，把你的猜想都试一下。

仅仅函数声明加不加#ifndef问题不大  #ifndef  _***_H_ #define _***_H_ 声明部分 #endif  是防止头文件被多次#include的时候，一方面可能造成冲突，一方面也是浪费  就你这个问题来说，还涉及不到这种情况； 函数多次声明没影响


Question: 使用C语言实现带头结点链栈的以下基本操作：

请不要来混贴子，谢谢


Question: 单词计数不运行哪里有问题呢？

#include<stdio.h> #define N 100 int main() {     char a[N];     int j=0,i=0;     printf("Please input some words :\n");     fgets(a, N, stdin);     while(a[i]!='\0') {         if(a[i]==' ')             j++,i++;         else             i++;     }     j++;     printf("Words' number is %d",j);     return 0; } 供参考～  如果少了else i++,while循环可能是死循环～

char *a[N];  --->char a[N];  gets(*a);      ---> gets(a);


Question: C语言指针，在网上找了答案，有部分代码看不明白，输入一串字符，提取其中单词，并按顺序输出，有一小节代码理解有点问题，希望各位帮忙解答，谢谢谢谢！！！

谢谢谢谢！！！我明白了

假设输入是  get_words()函数中， 	for (i = 0; i<ln; i++) 	{ 		if (str[i] == ' ' || str[i] == '.' || str[i] == ',') 		{ 			str[i] = '\0'; 		} 	} 以上代码将输入的“123,abc.456”修改为“123\0abc\0456”,之后 for (j = 0, words[j++] = str + i; i<ln; i++) 	{ 		if (str[i] == '\0') 		{ 			words[j++] = str + i + 1; 		} 	} 代码的主要作用是根据分隔符“\0”，将“123\0abc\0456”分割成“123”、“abc”和“456” 这个时候，可以看一下words里面的值，实际上保存的是以上三个字符串的地址  比如，我们知道第一个地址，是0x0133fbb4,该内存中保存的就是第一个字符串“abc”  而对于 for (i = 0; str[i] == '\0'; i++); 代码的含义，主要是为了防止如下格式的输入  此时，i的值会变为4，表示输入的字符串在起始位置有4个无效的分隔符，在用分隔符分隔字符串时，利用之后的for循环条件words[j++] = str + i，跳过这些无效的分隔符。

首先这个函数是用来统计单词个数的  for(i=0;str[i]=='\0';i++);  这句话是过滤输入句子中前面的空格，标点的      for(j=0,words[j++]=str+i;i<ln;i++) {         if(str[i]=='\0') {             words[j++]=str+i+1; } }  words[j++]=str+i 记录第一个单词   if(str[i]=='\0') 找到下一个单词   words[j++]=str+i+1; j会+1


Question: 乐扣岛屿最大面积问题

int maxAreaOfIsland(int **grid, int gridSize, int *gridColSize) {     if (gridSize == 0 || gridColSize[0] == 0)         return 0;     curret_area = 0; // 补充这么一句看看     int i, j, m, n;     m = gridSize;     n = gridColSize[0];     int max_area = 0;

是不是current_area初始的问题呢？ 此时m和n都是1， grid[i][j]也都是0， 如果current_area初始不是0，就直接返回current_area的值  貌似current_area是全局变量， 默认初始化是0  但是，如果程序是支持多个样本测试的话， 这个current_area最好在maxAreaOfIsland一进来的时候，人工初始化一下

是这个问题，我刚才已经解决了，不过还是谢谢


Question: C语言里的一个简单语句

a[i][j] =a[i][j] * 2;  简写


Question: C语言putchar

看看这两幅图有区别么？

字符串就需要用双引号的，注意看一下字符串后面的[]，这是类似char str[32] = "hello"; str[3]

把双引号扩上的字符串当中一个char[]数组来看就好了 后面不是还有按照下标取数组里面元素的[]操作嘛  三目运算符（条件） ？表达式1 ： 表达式2； 由条件决定执行表达式1还是表达式2  表达式就是用字符数组里面取字符  拆开了仔细看看，没有特别的地方 能理解了"012345"[3] 就是'3'这个字符，剩下的就是正常的代码了

引用 1 楼 user-4的回复:字符串必须用双引号 能不能帮我解析一下这行代码

字符串必须用双引号


Question: 用free来释放内存一般是在什么时机释放？

是一种共享资源，与别的程序一同共享的资源。 你大可以去公共厕所锁上门蹲一天的时间。这种行为别人除了说你素质不好以外，拿你是没有什么办法的

事实上有多种释放方式，例如立即释放、延时释放等，具体可参考各种垃圾回收器的算法。

free释放，如果程序一直执行，那么不用的时候建议手动释放free。如果程序运行完就退出了，那么程序退出系统也会把你malloc的内存释放的。但是，建议养成习惯，不用的时候就释放。

什么时候不用了就什么时候释放 malloc的内存是系统内存，所有应用共享的内存空间， 不用了就立刻释放， 对总体性能有好处


Question: 可以给几个函数指针的应用场景吗？

//////////////////////////////////////////////////////////////////////// //文件名: void_pointer.c //作者: cfjtaishan //日期: 2013-03-21 //描述: 泛型函数指针的运用. //说明: //    1. 实现了整型数组的求最大元素和字符串数组汇总求最大的字串; //    2. 实现了对整型数组和字符串数组进行冒泡排序; ////////////////////////////////////////////////////////////////////////  #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>  //这两个宏用于作为编译开关 #define INTEGE #define STRING   #define LEN 10 #define DAYS 7  //声明泛型函数指针 typedef int (*pfunc)(const void *, const void *); typedef void (*fswap)(void *, void *);  //函数声明 int compare_intege(const void *a, const void *b); int compare_string(const void *a, const void *b); void swap_for_intege(void *p, void *q); void swap_for_string(void *p, void *q); void *my_max(void *pbuf, const int len, const int size, pfunc cmp); void bubble_sort(void *pbuf, const int len, const int size, pfunc cmp, fswap swap); void initize_arr(int *arr, const int len); void show_arr(const int *arr, const int len);  int main(int argc, char *argv[]) { #ifdef INTEGE     int arr[LEN], *max;     initize_arr(arr, LEN);     printf("Show the arr arguments: \n");     show_arr(arr, LEN);     max = (int *)my_max(arr, LEN, sizeof(int), compare_intege);     printf("Max integer is %d\n", *max);     bubble_sort(arr, LEN, sizeof(int), compare_intege, swap_for_intege);     printf("After sort: \n");     show_arr(arr, LEN); #endif  #ifdef STRING     int i;     char *week[DAYS] =     { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};     char **max_str = (char **)my_max(week, DAYS, 4, compare_string);    //指针长度为4 	printf("--------------------------------------------------------------\n"); 	printf("Max string is ");     puts(*max_str);     bubble_sort(week, DAYS, 4, compare_string, swap_for_string);    //指针长度为4     printf("After bubble sort: \n");      for (i = 0; i < DAYS; i++)     {         printf("%s  ", week[i]);     }     putchar('\n'); #endif      return 0; }  ////////////////////////////////////////////////////////////////////////// // 函数名: initize_arr // 描述 : 初始化数组。 // 参数: //    [in/out] arr -- 整型数组的首地址; //    [in] len -- 整型数组最大长度; // 返回值: 无。 // 说明: ////////////////////////////////////////////////////////////////////////// void initize_arr(int *arr, const int len) {     int i;     srand(time(NULL));      for (i = 0; i < len; i++)     {         arr[i] = rand() % 1000;    //产生1000以内的随机数     } }  ////////////////////////////////////////////////////////////////////////// // 函数名: show_arr // 描述 : 打印数组元素值。 // 参数: //    [in] arr -- 整型数组的首地址; //    [in] len -- 整型数组最大长度; // 返回值: 无。 // 说明: ////////////////////////////////////////////////////////////////////////// void show_arr(const int *arr, const int len) {     int i;      for (i = 0; i < len; i++)     {         printf("%d  ", arr[i]);     }     putchar('\n'); }  ////////////////////////////////////////////////////////////////////////// // 函数名: compare_intege // 描述 : 比较两个整数的大小。 // 参数: //    [in] a -- 一个整型数据的地址; //    [in] b -- 另一个整型数据的地址; // 返回值: //    若*a > *b，则返回正整数； //    若*a == *b 则返回0； //    若*a < *b，则返回负正整数; // 说明: ////////////////////////////////////////////////////////////////////////// int compare_intege(const void *a, const void *b) {     return *(int*)a - *(int *)b; }  ////////////////////////////////////////////////////////////////////////// // 函数名: compare_string // 描述 : 比较两个字符串的大小。 // 参数: //    [in] a -- 一个字符串的地址; //    [in] b -- 另一个字符串的地址; // 返回值: //    和strcmp的返回相同. // 说明: ////////////////////////////////////////////////////////////////////////// int compare_string(const void *a, const void *b) {     return strcmp(*(char **)a, *(char **)b); }  ////////////////////////////////////////////////////////////////////////// // 函数名: my_max // 描述 : 求数据集中的最大值。 // 参数: //    [in/out] pbuf -- 泛型数据的首地址; //    [in] len -- 泛型数据的最大长度; //    [in] size -- 泛型数据的长度; //    [in] cmp -- 回调函数; // 返回值: //    最大数据的首地址. // 说明: ////////////////////////////////////////////////////////////////////////// void *my_max(void *pbuf, const int len, const int size, pfunc cmp) {     char *max = pbuf;     int i;     for (i = 0; i < len; i++)     {         if (cmp(max, pbuf + i * size) < 0)         {             max = pbuf + i * size;         }     }      return max; }  ////////////////////////////////////////////////////////////////////////// // 函数名: bubble_sort // 描述 : 冒泡排序。 // 参数: //    [in/out] pbuf -- 泛型数据的首地址; //    [in] len -- 泛型数据的最大长度; //    [in] size -- 泛型数据的长度; //    [in] cmp -- 回调函数; //    [in] swap -- 回调函数; // 返回值: 无. // 说明: ////////////////////////////////////////////////////////////////////////// void bubble_sort(void *pbuf, const int len, const int size, pfunc cmp, fswap swap) {     int i, j;      for (i = 0; i < len - 1; i++)     {         for (j = 0; j < len - i -1; j++)         {             if (cmp(pbuf + j * size, pbuf + (j + 1) * size) > 0)             {                 swap(pbuf + j * size, pbuf + (j + 1) * size);             }         }     } }  ////////////////////////////////////////////////////////////////////////// // 函数名: swap_for_intege // 描述 : 交换两个数据。 // 参数: //    [in] p -- 一个整型数据的地址; //    [in] q -- 另一个整型数据的地址; // 返回值: 无. // 说明: ////////////////////////////////////////////////////////////////////////// void swap_for_intege(void *p, void *q) {     int tmp;     tmp = *(int*)p;     *(int *)p = *(int *)q;     *(int *)q = tmp; }  ////////////////////////////////////////////////////////////////////////// // 函数名: swap_for_string // 描述 : 交换两个数据。 // 参数: //    [in] p -- 一个字符串的地址; //    [in] q -- 另一个字符串的地址; // 返回值: 无. // 说明: ////////////////////////////////////////////////////////////////////////// void swap_for_string(void *p, void *q) {     char *str;     str = *(char **)p;     *(char **)p = *(char **)q;     *(char **)q = str; }  函数指针的例子，供参考～

回调函数，一般框架里会大量用的。  举几个例子 比如，你用智能指针shared_ptr 是可以自定义删除器的，这个删除器就是个函数指针  还有集合排序的时候，指定比较器，也可用函数指针  再比如，libevent里面就使用了大量的回调函数技术，很多关键的函数比如evconnlistener_new_bind的参数都有函数指针类型的。

windows系统开发的时候，很多的回调函数都函数指针， callback  很多地方都可以用，就看你怎么设计你的程序了，简单的举两个例子： 比如， 菜单命令， if（ 用户输入 == 1 ） fun1（） else if（用户输入==2） fun2（） 这些命令很像是不是 那么我们可以建立一个函数指针的数组， 比如 void （*funcs[10])(void); funcs[0] =fun1; funcs[1]=fun2; .... 菜单命令就可以直接   funcs[用户输入]； 不用一堆if else了， 主要先检测一下用户输入的是有效数字   其二 二叉树，经常会用， 遍历有不同的方法， 中序，先序，后序；  不管那种方法，你都需要在每个节点上进行操作 也许不通的情况下，需要不同的操作， 怎么办呢， 写一堆重复的函数吗 不用， 写一个通用的遍历，然后在每个节点上调用函数指针完成不同的任务 更常见的sort函数里面的cmp函数指针就是类似的情况   总之，就是类似的控制流程下， 不同的操作； 都可以把这些操作换成不同的函数指针来执行，那么控制流程就一个就好了  慢慢体会吧， 应用做多了， 自然就遇到了


Question: 大神帮帮我/用C输出9×9乘法表

void main(void) { 	const char *pstr = "*123456789"; 	for (int i = 1; i < 10; i++) 	{ 		printf("%c\t", pstr[i]); 	} 	printf("\r\n"); 	for (int i = 1; i < 10; i++) 	{ 		printf("%d\t", i); 		for (int j = 1; j <= i; j++) 		{  			printf("%d\t", j*i); 		} 		printf("\r\n"); 	} 	system("pause"); }

搞错了 再来 #include<stdio.h>   int main() {     for(int m=0;m<10;m++){         if(m==0){             printf(" * ");         }         else{             printf("%3d ",m);         }     }     printf("\n");     for(int i=1;i<10;i++){         printf(" %-2d ",i);         for(int j=1;j<=i;j++){             printf(" %-2d ",i*j);         }         printf("\n");     }     return 0; }

int main() {     for(int i=1;i<10;i++){         for(int j=1;j<=i;j++){             printf("%2d ",i*j);         }         printf("\n");     }     return 0; }

引用 1 楼 寻开心的回复:基础题目自己去写吧  要学习，就要自己写  否则没有意义 我最后输出不了这样

引用 2 楼 weixin_46538912 的回复:[quote=引用 1 楼 寻开心的回复:]基础题目自己去写吧  要学习，就要自己写  否则没有意义 我最后输出不了这样[/quote] 能输出什么样子就贴什么样子代码上来就好，只要自己写的

基础题目自己去写吧  要学习，就要自己写  否则没有意义


Question: 就是把一个算式中的运算符和数分别存在两个数组，求大神看看为何不行

数字有'0'-'9'，带小数的还有'.'。运算符'+''-''*''/'直接字符比较就好了。

if(c[i]>=48 && c[i]>=57) { while(c[i]>=48 && c[i]>=57)  至少这两个地方不行吧， 怎么两个都是>=呢


Question: C语言调试问题。for循环3次，调试的时候只能出现最后一次，就是第三次的结果，那如何调试的时候输出i=1（第二次）时候的sum的大小呢

假设需要查看第 5 次循环的某个变量，可以用这种方法按到第 5 次后，再在for循环内你要查看的变量的下一行打断点，这时就能看到要看到的变量的值了，这种。

那你就调试啊， 做断点， 设置断点之后， 可以改变量的值， dev c++， 我记得是在左侧的表达式窗口  不过这么做有什么意义呢？  程序每次都要这样来运行吗

或者不改for条件（）里面的代码，改循环体内的部分    sum += i+1；  关键是你自己要搞明白， i只是控制循环多少次的， 在循环体里面每次的i是什么，而你要的sum到底要加什么，加到数和i之间是什么关系  越来越发现，初学者总是在搞不清楚自己目的的情况下就开始写代码， 然后结果可想而知  你要先做到， 不用计算机敲代码， 自己来模拟计算机的执行， 那么要怎么做这个求和 初始是0 第一次循环加1， 第二次循环加2，。。。。。 现在说起来很简单吧， 为啥你写代码就不对呢？  你就不觉得加到那个数不对吗？ 还是就没有想过它应该是加多少呢  想想吧， 不在这个题目上，而是在怎么学写代码上 先搞明白自己要做什么，再写代码去

不是这个意思，我的意思是 可以查看任何一步时对应的sum

for 循环范围上你改一下啊， for ( i=1; i<=n; i++ )

这样只能输出i=0到2分别对应的sum的值，我想要调试，就是如何跳到第二次循环i=1，然后你输入sum，sum的结果就是1而不是最终i=2对应的sum=3这种结果

for () {      sum += I;    printf .... }  for后面加花括号，把prinf语句包进去


Question: 小白的疑问之关于单链表的创建与尾插法

用%d输入数字应该不会出现这种情况了。getchar()比较特殊

'\n'也是一个节点。所以长度翻倍了吧

引用 1 楼 寻开心的回复:因为你这种写法就是双倍的 a 是一个节点，然后回车是一个节点，b又是一个点，回车又是一个节点 x = getchar（）第一次获得到是字符，第二次获得的是回车啊， 依次类推 一夜惊醒梦中人，感谢感谢👍🏻👍🏻


Question: 各路大神看看这是什么情况

也不能说和高度没有关系， 毕竟0.8s的时候， 7位置就可以进来， 1s的时候7位置的就进不来了

h=5 k=1.8 球从上面落下到车顶面的时间 5*t*t = 3.2  t = 0.8s  v =5.0, 所以车跑了4米 9-4  车位置是 5， 5+2.5 = 7.5，  [5, 7.5] 范围， 容纳5，6，7三个球才对 但是球只有在0 1 2 3 4 这个5个位置接纳不到   但是车继续向前跑， 一秒钟的时候所有的球落地那一刻， 车跑了5米， 刚好赶上在4的位置都球接触地面的那一刻  所以，这个车没有侧挡板儿， 是个胶体类的东西，粘上就算

引用 1 楼 寻开心 的回复:这个车估计是胶体做的，两侧没有挡板之类的， 碰到了就粘上了  所以这题有没有小车高度都没关系

引用 2 楼 user-2 的回复:你的理解有问题了，为什么9-4他也没说间距是一米 0 1 2 3 4 5(车)  他所有的数据都没有单位，我是按照单位长度理解的  小球之间1个单位长度，输入的s是9个单位长度

你的理解有问题了，为什么9-4他也没说间距是一米 0 1 2 3 4 5(车)

这个车估计是胶体做的，两侧没有挡板之类的， 碰到了就粘上了


Question: 小白求教

1、a/b 商 a%b 余 2、118 /100 = 1 (百位) 118/10%10 = 1 (十位)  118 % 10 = 8（个位） 3、char a = 'a', 前一个字符 a-1, 后一个字符 a+1;


Question: 萌新求教。。

不会就看书啊  这些基础的问题， 必须要自己来尝试解决  自己写吧， 代码错了，贴出来后帮你改 但是不会你自己一行代码不写就来要源码 那样对你学习毫无意义


Question: 头结点初始化

有些差异 c下不可以 c++下才可以， &在这里是引用， 这个是c++的特性，c不支持

可以的，功能是一样的


Question: C语言小白求教

引用 4 楼 chxchxkkk 的回复:在for循环外加一句： if (i==5)     printf("Thanks");  大佬你好  可否移步看看我的帖子

在for循环外加一句： if (i==5)     printf("Thanks");

哦，好像真是审错了。 不能用数组，就用多个变量，叫a1, a2，等。把scanf重复多遍，分别赋值后，再输出菜单。

引用 1 楼 proorck2019的回复:输出菜单容易，多写几行printf就行了。  记得去电脑上结贴给分数。 啥玩意 你审题了么

输出菜单容易，多写几行printf就行了。  记得去电脑上结贴给分数。


Question: 运算符问题，求解。

引用 4 楼 proorck2019的回复:问题①： 执行效果上没有区别，但是a*=b的格式可以少写一遍a，当a的名字很长时，这样写能快一点。  问题②： 先用值还是先加一，按从左往右的顺序记忆，a++，先出现a，则先用a的值；++a，先出现++，则先加一。  记得去电脑上结贴给分数。 可以的话你可以到我另一个贴子“jdk的安装”，帮忙解决一下，那里有150分，没人帮忙挺急的，搞定之后我再加200分给你。

你可以到我另一个贴子“jdk的安装”那里有150分，可以的话帮忙解决一下，还可以再加200分给你，挺急的。

引用 4 楼 proorck2019的回复:问题①： 执行效果上没有区别，但是a*=b的格式可以少写一遍a，当a的名字很长时，这样写能快一点。  问题②： 先用值还是先加一，按从左往右的顺序记忆，a++，先出现a，则先用a的值；++a，先出现++，则先加一。  记得去电脑上结贴给分数。 不好意思我已经结贴了，感谢你的回答。

有 a=b+1 不用说了  a=b++; 是a=b; b+=1;  a=++b; 是b+=1; a=b;

引用 1 楼 ?Victor.??的回复:应该没有吧   还有一个问题，就是a=b+1；a=b++；a=++b；这三者有区别吗？

应该没有吧


Question: 循环链表之约瑟夫环问题

引用 1 楼 寻开心的回复:既然是环，你就要检测最后一个， q == q->next的情况 此时的删除要特殊处理的，直接输出这个q的数据，然后释放q就好了  你的后续的free_tmp只有一个数据的环下面， q->next  = q->next->next 依然是自身赋值给自身， free函数释放的也是它 感谢您的回答，我明白问题所在了，犯了一个先入为主的低级错误，在剩下最后一个环的时候，其实释放的是q－>next也就是q，但是q－>next置null，q被释放了并没有将q置为null，所以又跑进while，至于被释放了的q被拿来用，并再次被赋值q－>next（null），为什么没退出，在错误的操作上再出错也没有在探究的意义了，感谢您

感谢您的回答，判断是可以解决，但我疑问在于，为什么我将最后一个节点释放了，并置为NULL，而它还能跑进while。

while ( q ) { if (q == q->next ) {     // 无论m是多少，对只有一个节点的环来说，最终选定的必然还是这个唯一的节点，     printf("%p\t%d\r\n",q, q->data);     free(q);     q = NULL; } else  if ( j++ < m ) { q = q->next; } else { free_tmp = q->next; printf("%p\t%d\r\n",free_tmp,free_tmp->data); q->next = q->next->next; free(free_tmp); free_tmp = NULL; j = 1; }


Question: C语言程序设计实验与习题指导（第3版）实验2-4-7 求组合数 (15分)

同问！老哥，现在会了没？

求大神


Question: 二维数组的问题

能否用变长数组取决于你的编译器对 c99 的支持程度。

c语言数组长度必须是个常量值，不支持变量

应该是因为n是变量吧


Question: #C 单链表

引用 1 楼 user-1 的回复:value =insert->value;反了。 if(previous = NULL){这是赋值了，改==。 细心点啊  啊啊啊啊啊 咋就没看见 太蠢了 多谢！


Question: 近似求pi

那你想还要什么条件呢？！  temp是什么？  它就是那一长串加法公式当中，当前最后加入的一项，只要这个项比eps小就可以结束了


Question: 为什么printf什么都不输出

我的C语言老师教我们“传值”、“传址”。

关键是你在函数里面改了PT， 但是你带不出来函数， 它只在函数体内有效 传参永远传递的是值，而不是变量本身 虽然， 你把main里面变量的地址传递进去了， 但是你改不变量本身的地址 函数里面那个PT仅仅是个临时变量， 和main的PT之间一毛钱关系都没有 回到主函数，PT还是原来的PT，根本就没有变化  相当于你在函数体内申请了一个新的内存，然后改了那个内存里面的数据 出了函数回到主函数，那个内存地址没有带回来， 不知道扔哪儿去了， 然后还用原来的PT里面的数据输出， 所以就没有所以了

mian函数里已经定义了一个结构体对象，系统已经开辟了内存，你调用初始化函数，你使用的是传引用，所以函数里面处理的已经是你创建的对象的地址，就不需要在malloc了，你再使用malloc使得你开辟后的地址，被你malloc的地址覆盖了，你输入的数据再你的malloc的地址种，而main中的结构体并没有做任何操作，仍然是空的！去掉malloc那句试试！


Question: c语言用埃拉托色尼算法求最大公约数！初始了一个2-n的数组，作为候选质数，我的本意是将2，3，5，7的倍数置零，但我不知道我的代码错在了何处？？

for(i=0,j=2;  j<=x,i<x-1;  j++,i++)  这个地方错了 逗号表达式， 只会返回最后执行的结果， 第一个判断就无效了 这里必须是|| 或者 && 才是你的目的


Question: 关于C语言PTA题目掉入陷阱的数字一题

引用 4 楼 寻开心 的回复:第一 你的sumn没有初始化，第一次执行的while （sumn!=sun)的时候可能是任何的值  第二 如果传入的n就是0，会如何谢谢，谢谢

引用 6 楼 ?Victor.?? 的回复:楼主是买的题吗  我找了半天没找到  应该是sumn初始化，pta之类对这方面要求挺高的谢谢，我去试试。

引用 6 楼 ?Victor.?? 的回复:楼主是买的题吗  我找了半天没找到  应该是sumn初始化，pta之类对这方面要求挺高的不是我买的题，是老师布置的作业中的一道题。

嗷，n=0，你已经考虑过了 就看sumn的初值吧

抱歉啊，忘了发题目要求了。

在pta的哪里呀  我也去做一做  用你的代码试试


Question: 两个链表合并，在我的基础上帮忙修改一下

引用 8 楼 寻开心的回复:  这个和pa和pb哪一个短没有关系 而是和pa、pb里面date最大值有关系 最大值小的那个（那怕它里面包含到节点数目远超另外一个）会先被全部插入到pc当中去，剩下的另外一个需要直接挂接到pc尾巴上  问题是在while（pa&&pb）成立的时候， 他们还都没有到达尾部呢， 此时还在交叉着往pc后面挂节点中，这个时候执行这两句代码就不是正确的位置 我表达错误，是根据pa和pb的值大小决定执行哪一条语句,与长短无关无

这么多代码，得边调试边修改。再调试看看吧。

引用 10 楼 user-2的回复:这篇代码在我的TC2环境里编译出错，没法儿调。 你用的是什么开发环境？ devc++

这篇代码在我的TC2环境里编译出错，没法儿调。 你用的是什么开发环境？

引用 5 楼 寻开心的回复:[quote=引用 3 楼 ?Travelers 的回复:] [quote=引用 1 楼 寻开心的回复:]while(pa&&pb){      if(pa->data<=pb->data){           pc->next=pa;pc=pa;pa=pa->next;       } else{          pc->next=pb;pc=pb;pb=pb->next;       }      pc->next=pa?pa:pb;      free(Lb); }  那两行你的目的是做什么呢？  写出的代码首先要自己相信是对的，那就肯定就有自己认为合理的解释， 说一说吧。   pc->next=(pa?pa:pb),把pa和pb中那个比较长的链表的剩余部分赋值给pc,与pc连接[/quote]  所以啊， 这个比较得在while的外面啊。问题是你把他们放到while语句里面了呀[/quote] 如果放在while语句里面就是当pa和pb中较短的执行完了之后就会直接退出while语句，就不会执行  pc->next=pa?pa:pb;这么理解对吗？

引用 3 楼 ?Travelers 的回复:[quote=引用 1 楼 寻开心的回复:]while(pa&&pb){      if(pa->data<=pb->data){           pc->next=pa;pc=pa;pa=pa->next;       } else{          pc->next=pb;pc=pb;pb=pb->next;       }      pc->next=pa?pa:pb;      free(Lb); }  那两行你的目的是做什么呢？  写出的代码首先要自己相信是对的，那就肯定就有自己认为合理的解释， 说一说吧。   pc->next=(pa?pa:pb),把pa和pb中那个比较长的链表的剩余部分赋值给pc,与pc连接[/quote]  所以啊， 这个比较得在while的外面啊。问题是你把他们放到while语句里面了呀

引用 2 楼 寻开心的回复:看代码应该是二路归并，也许你有别的要求也未尝不可 如果二路归并的话，那两行代码就不应该在while语句里面 while中的语句是比较，pc会连接上pa和pb每次比较之后较小的值

引用 1 楼 寻开心的回复:while(pa&&pb){      if(pa->data<=pb->data){           pc->next=pa;pc=pa;pa=pa->next;       } else{          pc->next=pb;pc=pb;pb=pb->next;       }      pc->next=pa?pa:pb;      free(Lb); }  那两行你的目的是做什么呢？  写出的代码首先要自己相信是对的，那就肯定就有自己认为合理的解释， 说一说吧。   pc->next=(pa?pa:pb),把pa和pb中那个比较长的链表的剩余部分赋值给pc,与pc连接


Question: C语言 随机生成100以内的数，放入数组中并用冒泡排序，间歇出错（我是 ）

的确，这个flag完全没有用，不知道写来是干嘛的

在 BubbleSort中，你这flag干啥用的~~  if(flag==0) return; 这句删掉就好了

这个要看脸       你还是回回炉，好好看看冒泡吧，所有的书上都有的 你那个flag的作用好好研究研究


Question: C语言for语句

在2楼代码的基础上，添加printf i j k，有利于研究执行顺序。

如果不是嵌套，则从上向下依次运行。如果是嵌套，则从里向外运行3楼的兄弟比喻的很到位

房子有很多书，一本一本的读，从第一本开始，一页一页的翻，从第一页开始，一行一行的看，从第一行开始，一个字一个字的啃！

就是每执行一次外层  里层全执行一遍  for(int i=0; i <3; i++)//循环1 {      for(int j=0; j<3; j++)//循环2      {             for(int k=0; k<3; k++)//循环3             {                     语句;              }       } }  i=0 j=0 k=0  i=0 j=0 k=1  i=0 j=0 k=2  i=0 j=1 k=0  所以循环1执行3次 循环2执行9次 循环3执行27次

俄罗斯的套娃


Question: 求助一道题！！！！我要晕了

引用 2 楼 寻开心 的回复：更简单的 https://blog.csdn.net/sinat_34684122/article/details/81673605谢谢你 这个题要makefile吗 才接触虚拟机有点迷茫

引用 2 楼 寻开心 的回复：更简单的 https://blog.csdn.net/sinat_34684122/article/details/81673605非常感谢您 我终于搞出来了


Question: 取消对NULL指针的引用，求助各位大佬

或者，在25行赋值之前统一写一行 if ( NULL ==node1 || NULL==node2 || ..... ) return;   它这个检测就是让你malloc后要有一个对NULL的判断之后再做其他的处理

警告的意思是让你检查指针是否是NULL的意思 你这个是VS2019？ VS2019下strcpy都变成strcpy_s了， 而且提示啥时候变成这样的中文说明了  if ( node1 != NULL ) {      node->age = ...... }

严重性	代码	说明	项目	文件	行	禁止显示状态	详细说明 警告	C6011	取消对 NULL 指针“node1”的引用。	day06	C:\USERS\ADMINISTRATOR\DESKTOP\单向动态链表.C	25

把警告的地方贴出来， 在哪行？ 警告的具体原文是什么？

1楼大佬这个方法还是不行啊，VS2019上还是提示一样的警告。。。非常感谢大佬的回复

struct Teacher* node1 = (struct Teacher *) malloc(sizeof(struct Teacher));     其他几个也都如此处理  别的地方没有问题


Question: 关于eclipse编写c语言的问题

引用 3 楼 寻开心的回复:多简单啊， 好好学习， 玩儿什么游戏！！！ 哈哈哈哈哈好的嘛

引用 2 楼 smwhotjay的回复: 不好说，我玩某个私人小作坊游戏，再打开浏览器就会打不开网页。但qq之类正常。重启就好了。估计是某个流氓插件驱动之类的。 是了流氓插件太多

引用 1 楼 proorck2019的回复:去eclipse专区问，会不会好一点？ 好的谢谢大佬提醒！

多简单啊， 好好学习， 玩儿什么游戏！！！

去eclipse专区问，会不会好一点？


引用 7 楼 qybao 的回复:不是不置0，是你打印得不对 fd_set是个结构体，里面有数组，被你当长整形打印了，打印出地址信息了。 你要自己写个函数显示read_set的内存信息而不是转成长整形 其实我也很纳闷，我知道是个结构体，但是我之前在百度看到说可以作为ld，我就按这个打印的，一直感觉很奇怪。而且，除了这个read_set, 其他的都置0了啊，这是怎么回事，碰巧吗？  然后我刚刚按照这个定义写，我看它内部成员应该就是fds_bits  #define __FD_SET(fd, fdsetp)   (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] |= (1<<((fd) & 31)))  想打印 (fd_set *)(fdsetp))->fds_bits[x] （其实我也还不知道打印哪一位。。） gcc会报错说没有fds_bits这个成员，我该怎么打印它啊？

引用 5 楼 qybao 的回复:服了你了，sock_fd哪变化了？，是你自己少打了一个参数 为了确认，我还特意把你的代码复制运行了一遍 printf("222 sock_fd is %d, read_set is %ld, write_set is %ld, select is %ld\n", sock_fd, read_set, write_set, select_read_set);    printf("PPP sock_fd is %d, read_set is %ld, write_set is %ld, select is %ld\n", sock_fd, read_set, write_set, select_read_set);  socket值是随机的，尤其是客户端，每次生成socket的端口也是随机的 ....对不起，我傻了。。。 我还有两个问题，方便说一下嘛  after FD_ZERO, read_set is 36904976, write_set is 0, select_read_set is 0 111 sock_fd is -1, read_set is 16, write_set is 2147483574, select_read_set is 0 sock_fd is 3 222 sock_fd is 3, read_set is 139845989938512, write_set is -104, select_read_set is 1844674407370955161 333 sock_fd is 3, read_set is 2, write_set is 139845989365066, select_read_set is 4 PPP sock_fd is 3, read_set is 16, write_set is 139845989364247, select_read_set is 0 QQQ sock_fd is 3, read_set is 8, write_set is 3, select_read_set is 0  1.  read_set 怎么就置不了0？ 我就只把这块拉过来      fd_set read_set; 	fd_set write_set; 	fd_set select_read_set;   	FD_ZERO(&read_set); 	FD_ZERO(&write_set); 	FD_ZERO(&select_read_set); 	printf("after FD_ZERO, read_set is %ld, write_set is %ld, select_read_set is %ld\n", read_set, write_set, select_read_set);  跑出来的结果就会是这样after FD_ZERO, read_set is 140734867392568, write_set is 0, select_read_set is 0。 怎么没置0啊？ 2. 还是回到上面的问题，'write_set' 'select_read_set', 我根本没操作，怎么也发生变化了。  你跑出来的结果是怎么样的，我就很费解我明明没操作，怎么就值改变了。

引用 3 楼 qybao 的回复:FD_ISSET是怎么判断吧，你去看看它的源码吧 #define __FD_ISSET(d, set)  ((__FDS_BITS (set)[__FD_ELT (d)] & __FD_MASK (d)) != 0) 源码里有各个宏的定义 http://www.pandademo.com/2016/11/linux-kernel-select-source-dissect/ 多谢，那我代码那个操作符莫名变化那个问题，你知道是为什么吗？我在置0之后，直到FD_SET并没有对其进行任何操作(甚至write_set select_read_set根本没操作)，不应该变化啊。我应该是犯了一些很基本的错误，但我却不知道哪里有问题。

引用 1 楼 user-2 的回复:把 -1 set 上去有点看不懂啊，fd_set 本质是位图，set 就是将对应位置1，clear 是置0，socket() 函数当前进程可以使用的最小文件描述符 那个-1随便循环的，不要care。。 set是置1本来是很明确的，可是在第二个程序那边，很奇怪，看这个打印的 PPP sock_fd is 20, read_set is 16, write_set is 140083557847575, select is 0 QQQ sock_fd is 0, read_set is 8, write_set is 3, select is 0 中间是格了一个FD_SET， 首先按道理，sock_fd不应该变化，可是变化了，从20变成了0，read_set是被FD_SET操作的，暂且不说sock_fd咋变成的20又变成了0 对sock_fd=20或者0，read_set不应该是8，这应该不是FD_SET搞的鬼，可我想不明白是怎么回事。 而且write_set select_read_set根本没操作，也变化了，感觉很奇怪。


Question: 尾插法输出结果缺少一个，怎么修改

r=L;      for(i=1;i<n;i++){          s=(LinkList)malloc(sizeof(LNode));  这里i=0;i<n; 或者 I=1;i<=n 才对， 否则就是少了一个


Question: 求代码，拜托大佬

得写五百行 。

数据结构可以使用链表解决。

最好自己写，遇到具体问题再问，不然你的知识是不会有长进的。

自己写 源码就自己百度去吧


Question: codeup上的问题 求求各位大佬告诉我哪儿错了

int main(){     char str1[100]={0};     char str2[100]={0};     int x[100]={0};     while(scanf("%s", str1) != EOF){         char judge[100]={0};  这几个地方全部初始化为0，才和你后后面的memset匹配的上 局部变量数组是没有默认的初始化数值的


Question: 求问c语言实现 关于分段函数不等式的问题

首先理论上是可以证明的     x%2=1 和 x%2=0 实际上就是说x是奇数还是偶数； y也是如此     奇数： x = 2*m+1， y=2*n+1     偶数： x = 2*m，     y=2*n 分四种情况证明，f（x，y）<= x*x*y*y  这里x和y一定是整数，否则%操作就没有意义了   程序证明： 构造出分段函数： int f(int x, int y) { return x%2 ? ( y%2?x*y : 2*(y+1)) : ( y%2 ? (x+1)*y : 2*x*y); };  然后就是对于不同的x和y去比较    f(x,y) 和 x*x*y*y的大小问题了  这个时候用穷举法， 如果给出x和y的范围 如果没有范围，也就是x和y是任意的整数，那穷举办法就无效了  程序不能证明，只能来模拟，而且只能模拟有限范围的


Question: 计算s并输出   s=1+1/1+2+1/1+2+3+....+1/1+2+3+...+n

这就一个for循环  double s=1, v=1; for (int i=1; i<=n; i++) {     s += 1/(v+i); }

引用 楼主 C  ?r    o?的回复: #include<stdio.h> int main() { 	double s=0; 	int n,i,sum=0; 	scanf("%d",&n); 	for(i=1;i<=n;i++)            	{ 	   sum=sum+i; 	   s=s+(1.0/sum); 	 	 }  	 printf("%.2lf",s); 	 return 0;  }

v = v+i;


Question: C语言内存分区

引用 1 楼 user-1的回复:你整理的有点瑕疵，不过也没办法，毕竟不同的编译器和操作系统对于数据在内存中的安排方式都是不太一样的。这些东西你有个概念就可以了，如果要学计算机组成原理等更底层的话再深入了解。在 C 语言中，你只需要知道各种对象的生命周期就足以解决许多问题了。  注：不准确的地方： 1. const 对象不一定在静态存储区内，例如局部 const 对象就可以在自动存储区内。 2. 普通的字面量不一定就不占内存，例如编译器可能会把一个 double 字面量存在静态存储区内，在代码用到时直接访问对应的内存，而不是将数据和指令捆绑在一起。更别说还有复合字面量的存在了。 感谢指点，现在c学完了，正在读c++ primer，学完后会考虑计算机组成原理的


Question: C语言结构体内存对齐问题

内存对齐一般是指按字节大小来分配内存，也就是说一般你申请不到占用不满一个字节的内存（即使是用位占用符） 比如 char *c = (char*)malloc(sizeof(char)/2); //想按半个字节来申请内存，但系统实际会自动按一个字节来分配内存 或许有些编译器支持内存压缩之类的设定

这跟编译器，以及项目的设置有关。

不知道，我知道你最后少写个分号

引用 14 楼 真相重于对错的回复:试一下面代码，具体看看输出什么#pragma pack(8) struct A { 	char a; 	int b; 	char c[15]; 	char d[10]; };  int main() { 	cout << "A size 为" << sizeof(A)<<endl; 	cout <<"a 偏移量"<<offsetof(A,a)<< endl; 	cout << "b 偏移量" << offsetof(A, b) << endl; 	cout << "c偏移量" << offsetof(A, c) << endl; 	cout << "d偏移量" << offsetof(A, d) << endl;     return 0; } 编译器 vs2015,你可以编译为32位程序，再把它编译为64位，看看有何区别？ 再修改#progma pack的参数，把它改为1，2，4，8，16 看看有何却别。 非常感谢，已经搞清楚啦

引用 13 楼 5250的回复:[quote=引用 12 楼  的回复:] [quote=引用 10 楼 5250的回复:][quote=引用 7 楼  的回复:] [quote=引用 5 楼 5250的回复:]struct A{      char a;      int b;      char c[15];      char d[10]; }  char a占据一个字节，分配内存时位置是0，1，2，3...分配的。所以此时char a在0的位置。 是int，占据4个字节，分配内存时是0,4,8...分配的，现在0的位置被占据了，所以int b在4的位置，占据4个字节,为4,5,6,7。1,2,3是空的，这就是字节对齐的其中一种。 c[15]和d[10]同理占据[8,22]和[23,32]，此时这个结构体总共占用了33个字节[0,32]，因为字节对齐的原因，总的字节数要是结构体中最大的数据类型字节的整数倍,即4的整数倍，所以33+3=36，这个结构体总共占据36个字节。 明白了，谢谢咯。之前一直纠结为char c数组分配多少空间，它是15个字节，可是直接15个字节也不太方便访问，但我访问的时候又确实是只有15个字节，所以很疑惑15个字节的话cpu要怎么方便访问。[/quote]  数组的话，就成员一个个分配呀   char a[15] 就是连续分配15char型的内存。[/quote] 那cpu想要访问c数组中的数据的话，一下读取四个字节，这样不是会多读取d的一个字节么，为什么不是给c分配16个，这样方便读取c 跟d中的数据么[/quote]  cpu访问的话，也是看数据类型的,int型会从读取4个字节，char型的每次读取一个字节呀[/quote] 非常感谢，明白了，之前进了死胡同，还一直以为会以4字节去访问，char类型的话无论是字符还是数组都会以1字节为单位去访问

引用 12 楼  的回复:[quote=引用 10 楼 5250的回复:][quote=引用 7 楼  的回复:] [quote=引用 5 楼 5250的回复:]struct A{      char a;      int b;      char c[15];      char d[10]; }  char a占据一个字节，分配内存时位置是0，1，2，3...分配的。所以此时char a在0的位置。 是int，占据4个字节，分配内存时是0,4,8...分配的，现在0的位置被占据了，所以int b在4的位置，占据4个字节,为4,5,6,7。1,2,3是空的，这就是字节对齐的其中一种。 c[15]和d[10]同理占据[8,22]和[23,32]，此时这个结构体总共占用了33个字节[0,32]，因为字节对齐的原因，总的字节数要是结构体中最大的数据类型字节的整数倍,即4的整数倍，所以33+3=36，这个结构体总共占据36个字节。 明白了，谢谢咯。之前一直纠结为char c数组分配多少空间，它是15个字节，可是直接15个字节也不太方便访问，但我访问的时候又确实是只有15个字节，所以很疑惑15个字节的话cpu要怎么方便访问。[/quote]  数组的话，就成员一个个分配呀   char a[15] 就是连续分配15char型的内存。[/quote] 那cpu想要访问c数组中的数据的话，一下读取四个字节，这样不是会多读取d的一个字节么，为什么不是给c分配16个，这样方便读取c 跟d中的数据么[/quote]  cpu访问的话，也是看数据类型的,int型会从读取4个字节，char型的每次读取一个字节呀

引用 10 楼 5250的回复:[quote=引用 7 楼  的回复:] [quote=引用 5 楼 5250的回复:]struct A{      char a;      int b;      char c[15];      char d[10]; }  char a占据一个字节，分配内存时位置是0，1，2，3...分配的。所以此时char a在0的位置。 是int，占据4个字节，分配内存时是0,4,8...分配的，现在0的位置被占据了，所以int b在4的位置，占据4个字节,为4,5,6,7。1,2,3是空的，这就是字节对齐的其中一种。 c[15]和d[10]同理占据[8,22]和[23,32]，此时这个结构体总共占用了33个字节[0,32]，因为字节对齐的原因，总的字节数要是结构体中最大的数据类型字节的整数倍,即4的整数倍，所以33+3=36，这个结构体总共占据36个字节。 明白了，谢谢咯。之前一直纠结为char c数组分配多少空间，它是15个字节，可是直接15个字节也不太方便访问，但我访问的时候又确实是只有15个字节，所以很疑惑15个字节的话cpu要怎么方便访问。[/quote]  数组的话，就成员一个个分配呀   char a[15] 就是连续分配15char型的内存。[/quote] 那cpu想要访问c数组中的数据的话，一下读取四个字节，这样不是会多读取d的一个字节么，为什么不是给c分配16个，这样方便读取c 跟d中的数据么

引用 4 楼 qybao的回复:上面举的例子可能不恰当，sizeof(char)/2 就是0了，不过就是表明一下这个意思 struct A {     int a:1; //a只使用内存的1个bit，但是A也会分配4个字节大小的内存 } A a; printf("%d", sizeof(a)); get it!

引用 7 楼  的回复:[quote=引用 5 楼 5250的回复:]struct A{      char a;      int b;      char c[15];      char d[10]; }  char a占据一个字节，分配内存时位置是0，1，2，3...分配的。所以此时char a在0的位置。 是int，占据4个字节，分配内存时是0,4,8...分配的，现在0的位置被占据了，所以int b在4的位置，占据4个字节,为4,5,6,7。1,2,3是空的，这就是字节对齐的其中一种。 c[15]和d[10]同理占据[8,22]和[23,32]，此时这个结构体总共占用了33个字节[0,32]，因为字节对齐的原因，总的字节数要是结构体中最大的数据类型字节的整数倍,即4的整数倍，所以33+3=36，这个结构体总共占据36个字节。 明白了，谢谢咯。之前一直纠结为char c数组分配多少空间，它是15个字节，可是直接15个字节也不太方便访问，但我访问的时候又确实是只有15个字节，所以很疑惑15个字节的话cpu要怎么方便访问。[/quote]  数组的话，就成员一个个分配呀   char a[15] 就是连续分配15char型的内存。

引用 2 楼 真相重于对错的回复:这跟编译器，以及项目的设置有关。 是的，我没有表达清楚具体想问的是什么😂

引用 1 楼 老英捉小奇的回复:不知道，我知道你最后少写个分号 感谢指正，疏忽了。

引用 5 楼 5250的回复:struct A{      char a;      int b;      char c[15];      char d[10]; }  char a占据一个字节，分配内存时位置是0，1，2，3...分配的。所以此时char a在0的位置。 是int，占据4个字节，分配内存时是0,4,8...分配的，现在0的位置被占据了，所以int b在4的位置，占据4个字节,为4,5,6,7。1,2,3是空的，这就是字节对齐的其中一种。 c[15]和d[10]同理占据[8,22]和[23,32]，此时这个结构体总共占用了33个字节[0,32]，因为字节对齐的原因，总的字节数要是结构体中最大的数据类型字节的整数倍,即4的整数倍，所以33+3=36，这个结构体总共占据36个字节。 明白了，谢谢咯。之前一直纠结为char c数组分配多少空间，它是15个字节，可是直接15个字节也不太方便访问，但我访问的时候又确实是只有15个字节，所以很疑惑15个字节的话cpu要怎么方便访问。

看你的编译器以及系统。Linux 32位系统是默认以4字节对齐的，对于64位系统，那么应该是8字节对齐； 建议你在自己的环境下写程序，判断一下（sizeof)


Question: PTA 1004 成绩排名 (20point(s)) c(gcc)

数组内存分配在栈区，在编译之初就得要确定，而malloc函数是动态分配的内存，位于堆区，可以在运行过程中申请和释放

else if (students[i].score < last_student.score)             last_student = students[i]; 请问下这一句last_student.score不是-1吗？任意输入一个大于0的数都比它大，那这个执行语句什么时候才能执行呀？last_student.score里不是要放最后一名的成绩吗

引用 1 楼 chxchxkkk 的回复：int student_num; scanf("%d",&student_num); struct student students[student_num]; C语言不支持这样定义数组，必须给定一个常量值变长数组，可以支持的

#include<stdio.h> #include <stdlib.h>  struct student{     //char name[10];     //char code[10];     char name[32];     char code[32];     int  score; };  int main(void) {     int student_num;     scanf("%d",&student_num);     struct student *students = (struct student *)malloc(sizeof(struct student) * student_num);     if (!students)         exit(0);      int i;     struct student first_student = {"","",-1};     struct student last_student;     for (i=0;i<student_num;i++)     {         scanf("%s %s %d",students[i].name,students[i].code,&students[i].score);         if (students[i].score > first_student.score)             first_student = students[i];         if (i==0)             last_student = first_student;         else if (students[i].score < last_student.score)             last_student = students[i];         //else          //   ;     }      printf("%s %s\n",first_student.name,first_student.code);     printf("%s %s\n",last_student.name,last_student.code);      return 0; }  供参考～  C语言不支持变长数组，另外，name, code对于测试用例而言，已经越界了。所以建议增加数组长度(name, code)


Question: 求大神指点单链表

#include <stdio.h> #include <stdlib.h> #include <string.h> struct node {     int data;     struct node *link; } head; typedef struct node NODK; void createList(NODK *head, int n) {     NODK *p, *q;     int i;     p = head; //    p = (NODK *)malloc(sizeof(NODK)); //    head->link = p;     for (i = 1; i <= n; i++)     {         q = (NODK *)malloc(sizeof(NODK));         scanf("%d", &q->data);         q->link = NULL;         p->link = q;         p = q;     } } void outputList(NODK *head) {     NODK *p;     p = head->link;     while (p)     {         printf("%6d", p->data);         p = p->link;     } } int main() {     printf("input 5 number: ");     createList(&head, 5);     outputList(&head);     return 0; }

引用 7 楼 5250的回复:或者你可以这样改，有点儿啰嗦  #include <stdio.h> #include <stdlib.h> #include <malloc.h> struct node {     int data;     struct node *link; } head; typedef struct node NODK; void createList(NODK *head, int n) {     NODK *p, *q;     int i;     p = (NODK *)malloc(sizeof(NODK));     head->link = p;     for (i = 1; i <= n; i++)     {         q = (NODK *)malloc(sizeof(NODK));         scanf("%d", &q->data);         q->link = NULL;         p->link = q;         p = q;     } } void outputList(NODK *head) {     NODK *p;     p = head->link;     while (p)     {         printf("%6d", p->link->data);         p = p->link;     } } int main() {     printf("input 5 number: ");     createList(&head, 5);     outputList(&head);     return 0; } 好的，万分感谢，，，

引用 1 楼 自信男孩的回复:create函数里把head = p;改成head->next = p; 建议直接贴代码，还可以帮你调试一下～ 改了之后有输出，但是好像是错误的

引用 1 楼 自信男孩的回复:create函数里把head = p;改成head->next = p; 建议直接贴代码，还可以帮你调试一下～ #include<stdio.h> #include<stdlib.h> #include<malloc.h> struct node{ 	 int data; 	 struct node *link; }head; typedef struct node NODK; void createList(NODK *head,int n){ 	 NODK *p,*q; 	 int i; 	 p=(NODK *)malloc(sizeof(NODK)); 	 head=p; 	 for(i=1;i<=n;i++){ 		 q=(NODK *)malloc(sizeof(NODK)); 		 scanf("%d",&q->data); 		 q->link=NULL; 		 p->link=q; 		 p=q; 	 } } void outputList(NODK *head){ 	 NODK *p; 	 p=head->link; 	 while(p->link!=NULL){ 		printf("%6d",p->data); 		p=p->link; 	} } int main(){ 	 printf("请输入5个结点的值："); 	 createList(&head,5); 	 outputList(&head); 	 return 0; }

引用 2 楼 鲁宇科 的回复:[quote=引用 1 楼 自信男孩的回复:]create函数里把head = p;改成head->next = p; 建议直接贴代码，还可以帮你调试一下～ #include<stdio.h> #include<stdlib.h> #include<malloc.h> struct node{ 	 int data; 	 struct node *link; }head; typedef struct node NODK;  void createList(NODK *head,int n){ 	 NODK *p,*q; 	 int i; 	 p=(NODK *)malloc(sizeof(NODK)); 	 head=p; 	 for(i=1;i<=n;i++){ 		 q=(NODK *)malloc(sizeof(NODK)); 		 scanf("%d",&q->data); 		 q->link=NULL; 		 p->link=q; 		 p=q; 	 } } void outputList(NODK *head){ 	 NODK *p; 	 p=head->link; 	 while(p->link!=NULL){ 		printf("%6d",p->data); 		p=p->link; 	} } int main(){ 	 printf("请输入5个结点的值："); 	 createList(&head,5); 	 outputList(&head); 	 return 0; }[/quote]  你的head指向了p(head=p) p又指向了q(p = q)； 链表结尾处q-link = null，也就等同于head= null 你的head一直都在改变，所以就没有输出了。

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

#include<stdio.h> #include<stdlib.h> #include<malloc.h>  struct node{     int data;     struct node *link; }head;  typedef struct node NODK;  void createList(NODK *head,int n) {     NODK *p,*q;     int i;     //p=(NODK *)malloc(sizeof(NODK));     //head->link = p;     p = head;     for(i=1;i<=n;i++){         q=(NODK *)malloc(sizeof(NODK));         scanf("%d", &q->data);         q->link=NULL;         p->link=q;         p=q;     } } void outputList(NODK *head) {     NODK *p;     p = head->link;     //while(p->link!=NULL){     while(p){         printf("%6d",p->data);         p=p->link;     } } int main(){     printf("请输入5个结点的值：");     createList(&head,5);     outputList(&head);     return 0; } 供参考～


Question: 求大佬告知“命令行参数”是什么意思？？

引用 2 楼 寻开心 的回复：https://blog.csdn.net/thelostlamb/article/details/79304203看了还是不懂，究竟啥叫命令行，有什么用？

首先c语言main函数的标准写法： 第一种形式：    int main (void)     {      ……      return 0;     }   第二种形式：   int main (int argc, char *argv[ ])     {     ……     return 0;     }  第二种就是楼主说的命令行参数的定义形式，比如你使用第二种定义形式，在运行程序时需要  ./a.exe  参数  才能运行

就是电影里那些高手，都在控制台里劈里啪啦的敲键盘。因为图形工作界面占用资源。 所以高手都是在命令行里配置一些东西 int argc, char *argv[ ] 第一个参数是 命令行参数的个数 第二个参数是一个字符串数组 其中第一个字符串是程序的名字，因为程序有可能被改名。 后面的参数，一般用于配置程序


Question: C语言实验

引用 9 楼 老英捉小奇的回复:[quote=引用 8 楼 weixin_46549758的回复:][quote=引用 7 楼 老英捉小奇的回复:]题上整那个scanf干啥的？变量不是都有值吗 不知道哇，让输入abd？[/quote] 太难了，看不懂，那就随便输输abd试试[/quote] 可能是想说用scanf，abd又被重新赋值了

引用 8 楼 weixin_46549758的回复:[quote=引用 7 楼 老英捉小奇的回复:]题上整那个scanf干啥的？变量不是都有值吗 不知道哇，让输入abd？[/quote] 太难了，看不懂，😓那就随便输输abd试试

引用 7 楼 老英捉小奇的回复:题上整那个scanf干啥的？变量不是都有值吗 不知道哇，让输入abd？

题上整那个scanf干啥的？变量不是都有值吗

运行不出来....第一题怎么写

这个题目是错的！ 什么32768之类是假定了整形16位，但是实际上标准中却不是这样定的，也许在某些情况下上机验证是对的，但是有时却是错的。

引用 3 楼 EricNTH的回复:对的，应该随便输入几个，然后分析为什么会输出那些东西 好的，我再看看，谢谢啦

对的，应该随便输入几个，然后分析为什么会输出那些东西

引用 1 楼 EricNTH的回复:输入一个short型整数，一个int型整数，一个float型浮点数就可以了 我也不知道它想让你分析啥 随便输入嘛？


Question: C语言

引用 1 楼 不闻窗外事的回复:你就查ascii码就行，‘A’如果是65，那么就是可以替换的，因为‘A’本身的ascii码就是65，那么‘A’跟65是一样的 👌好的，谢谢啊


Question: 求帮忙

是的啊，永远都只有一条

先做好一个函数 PrintList， 把这个L队列完整的在屏幕上输出， 看看能打印出几条记录 确保这个正确后，再去说文件存储的事儿  怀疑你的队列里面就保存了一条数据

可以输出姓名，电话，性别，住址，学号，专业

你的链表恐怕没有建立对  你不向文件输出， 你屏幕输出，看看链表能输出几个数据先

引用 1 楼 寻开心的回复:fprintf(fp,"name\t num\t sex\t address\t studentID\t major\n");      printf("\n");      while(p2!=NULL)      {        printf("\n");        fprintf(fp,"%s\t",p2->name);        ......        p2=p2->next;      }      // 上面的代码能保证把链表都输入到磁盘文件当中，而且是一条一行           p2=head;        fscanf(fp,"\n name\t num\t sex\t address\t studentID\t major\n");     此时文件指针定位到文件的尾巴， fscanf在这里什么都读不出来， 这是出于什么目的在这儿         下面这段代码就奇怪了， 会让最后一个节点写不进文件      同时，为什么要写一个链表两次到文件里面去了呢      while(p2->next!=NULL)      {        fprintf(fp,"%s\t",p2->name);       。。。。        fprintf(fp,"%s\n",p2->major);        p2=p2->next;       }      fclose(fp);    你首先做一个屏幕上输出链表都程序， 看看屏幕上能输出几个链表当中的元素 怀疑你的链表没有设置正确 至少从这个代码当中，看得出使用链表都逻辑是混乱的（第二次输出链表到文件的代码上） 我从fsanf删到fclose前面，然后再调，还是不能输入第二个数据，一输入就把前一个给覆盖了


Question: 题目是：将链表合并改写成数组循环方式，预习单链表的操作

二路归并算法  自己看书了解这个算法先 La和Lb是已经排好序的，而且是小的在前大大在后  第一个while就是两个链表还都有数据的时候，边比较大小边填充到Lc里面去 后个while都意思是La和Lb其中一个已经全部在Lc里面了，那么剩下的那个就不许要比较，直接往Lc里面继续放就是了  先去了解二路归并 然后不用电脑程序， 自己手工处理，会如何处理。  想明白了如何做二路归并再来看代码的实现 不明白算法是怎么回事儿，  光看代码有个鬼用！


Question: C语言输出星号

引用 9 楼 chxchxkkk的回复:[quote=引用 3 楼 xiaobaicaiaihe 的回复:] [quote=引用 2 楼 chxchxkkk的回复:]来个c 版本的  #include <stdio.h>  int main() {     int i, j, s;     scanf("%d", &s);      for (i=0; i<s; i++)     {         for (j=0; j<=s-i; j++)             printf(" ");          for (j=0; j<i*2-1; j++)             printf("*");         printf("\n");     }     return 0; }   j等于零开始为什么[/quote]  第一个 j 的循环是打印出每行 * 号前面的空格，第二个 j 的循环是打印 * 号，个数是由 行号 * 2 -1，比如第一行 1*2-1=1，前面打印15个空格，然后打印一个*号。第二行 2*2-1=3， 前面打印14个空格，打印三个 * 号，依次类推[/quote] 为啥呢第一行就是15个空格，不是s-i+1个空格吗

引用 3 楼 xiaobaicaiaihe 的回复:[quote=引用 2 楼 chxchxkkk的回复:]来个c 版本的  #include <stdio.h>  int main() {     int i, j, s;     scanf("%d", &s);      for (i=0; i<s; i++)     {         for (j=0; j<=s-i; j++)             printf(" ");          for (j=0; j<i*2-1; j++)             printf("*");         printf("\n");     }     return 0; }   j等于零开始为什么[/quote]  第一个 j 的循环是打印出每行 * 号前面的空格，第二个 j 的循环是打印 * 号，个数是由 行号 * 2 -1，比如第一行 1*2-1=1，前面打印15个空格，然后打印一个*号。第二行 2*2-1=3， 前面打印14个空格，打印三个 * 号，依次类推

引用 2 楼 chxchxkkk的回复:来个c 版本的  #include <stdio.h>  int main() {     int i, j, s;     scanf("%d", &s);      for (i=0; i<s; i++)     {         for (j=0; j<=s-i; j++)             printf(" ");          for (j=0; j<i*2-1; j++)             printf("*");         printf("\n");     }     return 0; }   j等于零开始为什么

为什么不看下一楼的版本呢

引用 2 楼 chxchxkkk的回复:来个c 版本的  #include <stdio.h>  int main() {     int i, j, s;     scanf("%d", &s);      for (i=0; i<s; i++)     {         for (j=0; j<=s-i; j++)             printf(" ");          for (j=0; j<i*2-1; j++)             printf("*");         printf("\n");     }     return 0; }   怎样以第15列为对称轴输出

怎样以第15列为对称轴输出呢，这个代码只能输出星号

这个循环就能解决，建议先自己思考一下

https://blog.csdn.net/qq_39528210/article/details/104854577 可以看一下这篇文章

#include <iostream>  #define MAX 14  void print_char(char c, int n) {     while (n-- > 0) putchar(c); }  int main(void) {     int level = 0;     scanf("%d", &level);     if (level > MAX) {         printf("out of bound!\n");                                 exit(1);     }      for (int i = 1; i <= level; ++i) {          int asterisk_cnt = 2 * i - 1;         print_char(' ', (MAX * 2 - 1 - asterisk_cnt) / 2);         print_char('*', asterisk_cnt);         print_char('\n', 1);     }      return 0; }  拿好~


Question: 数据结构 单链表 删除指定位置数据 单个函数

改成  if ( prev->next == NULL ) return 0; 才对  前面的while （prev->next && ...） 检测的是prev->next，prev本身肯定不会是NULL的

引用 1 楼 user-2 的回复：LinkList是什么类型？指针吗？ 后面的Node*q = prev->next;如果是NULL，则崩溃。是指针 谢谢您 确实是这个问题 已经解决了


Question: 关于构造螺旋方阵题目的一点疑问

这是因为你的 if (direction ==1 ) { } else  if (direction==2) { } else  if (direction==3) { } else  if (direction==4)  缺少了这三个else语句， 平时么有问题， 但是当最后一个正确的字符比如25写完的时候， 会没直接去while哪里处理条件，而是直接去进行下一个if (direction==2)判断了， 显然这个判断是成立的，所以就写出了26，27， 直到if(direction==4)被执行完，才跑去while判断


Question: 一道c语言选择题求解在线等，急，麻烦说的详细点有步骤

答案是D，a=11。

引用 7 楼 沐雨又乘风. 的回复:[quote=引用 1 楼 自信男孩的回复:]C呢，33  i = 0; 执行i += 11；则i = 11; a += i; 则a = 11; i % 10 != 0;执行i--；此时i = 10; 执行i += 11;则i = 21; a+= i; 则a = 11 + 21 = 33 他什么时候跳出循环了呢兄弟能不能说的再详细点呢[/quote] i是11的时候跳出循环的呀，没看到while (i < 10)吗？ 好吧，你还是学学基础吧 给你结果没啥意思

引用 1 楼 自信男孩的回复:C呢，33  i = 0; 执行i += 11；则i = 11; a += i; 则a = 11; i % 10 != 0;执行i--；此时i = 10; 执行i += 11;则i = 21; a+= i; 则a = 11 + 21 = 33 他什么时候跳出循环了呢兄弟能不能说的再详细点呢

引用 2 楼 沐雨又乘风. 的回复:[quote=引用 1 楼 自信男孩的回复:]C呢，33  i = 0; 执行i += 11；则i = 11; a += i; 则a = 11; i % 10 != 0;执行i--；此时i = 10; 执行i += 11;则i = 21; a+= i; 则a = 11 + 21 = 33 答案是b，兄弟你再好好看看[/quote] 还用看吗？解释里不是算出来了吗？ 11+21我算错，你不会算错吧

1楼几乎对了，在最后一步算错了。

for循环很有意思，它唯一的出口是break，因为i--执行了一次，所以答案不是33是32。

引用 1 楼 自信男孩的回复:C呢，33  i = 0; 执行i += 11；则i = 11; a += i; 则a = 11; i % 10 != 0;执行i--；此时i = 10; 执行i += 11;则i = 21; a+= i; 则a = 11 + 21 = 33 11+21＝32吧。。。。。

引用 1 楼 自信男孩的回复:C呢，33  i = 0; 执行i += 11；则i = 11; a += i; 则a = 11; i % 10 != 0;执行i--；此时i = 10; 执行i += 11;则i = 21; a+= i; 则a = 11 + 21 = 33 答案是b，兄弟你再好好看看


Question: 求教long long类型的取值范围问题

类似的问题还有： 5/2=2  (错误) 5.0/2.0=2.5  (正确)  你的结贴给分数，是我们奋斗的动力。

n*(n+1)/2 计算方法都是一样的。只是n的类型不一样，那么结果是根据n类型决定范围的。因此long long类型的数据的计算得到的是正确的。 虽然返回值都是long long，那也是n * (n + 1) / 2的计算之后的结果转成long long，而不是以long long类型计算的。明白吗？

return ((long long ) n)*((long long ) n+1)/2;

返回值的类型必须和函数的返回类型一致，既然你函数的参数是long类型，那么不管你怎么计算，只要没有强制将计算的结果类型转换成long long类型，那么就还是long类型，与定义的函数返回值类型不一致，所以会报错，可以试下return (long long ) n*(n+1)/2;


Question: 这个用c#怎么打代码，求大佬

虽然我不会C#，但想象一下，应该和C语言差不多。


Question: 有没有大佬帮忙做一下这个的？

if语句： import java.util.Scanner;//导入扫描器的包  public class Salary {//主类  	public static void main(String[] args) {//主方法（main） System.out.println("请输入你的销售额(单位：元)："); Scanner scanner = new Scanner(System.in);//获取你在扫描器中输入的数据“销售额” if(scanner.hasNextDouble()) {//判断你输入的数据（销售额）是否为Double类型 	double s=scanner.nextDouble();//将数据（销售额）赋值给s 	//判断销售额区间 if(0<s&&s<200) { 	System.out.println("对不起，您没有提成"); }else if(200<=s&&s<400) { 	System.out.println("您的销售额为"+s+"元。有5%的提成共"+(0.05*s)+"元。"); }else if(400<=s&&s<1200) { 	System.out.println("您的销售额为"+s+"元。有8%的提成共"+(0.08*s)+"元。"); }else if(1200<=s&&s<2400) { 	System.out.println("您的销售额为"+s+"元。有10%的提成共"+(0.1*s)+"元。"); }else if(2400<=s&&s<4000) { 	System.out.println("您的销售额为"+s+"元。有15%的提成共"+(0.15*s)+"元。"); }else if(4000<=s) { 	System.out.println("您的销售额为"+s+"元。有18%的提成共"+(0.18*s)+"元。"); }else{//输入负数报错 	System.out.println("你输入有误，请重新输入！！！"); } }else {//输入的数据（销售额）类型不为Double 	System.out.println("你输入有误，请重新输入！！！"); } scanner.close();//关闭扫描器 	}  }   如果有疑问请私信，谢谢采纳！！！🌹🌹🌹

case 0 ... 199: 能这么用？

if..else  版：  #include <stdio.h>  int main() {     int i,s;     printf("请输入销售额:\n");     i = scanf("%d", &s);     if (i==0 || s < 0)     {         printf("非法输入！\n");         exit(1);     }      if (s < 200)         printf("销售额是%d,没有提成\n", s);     else if (s>=200 && s < 400)         printf("销售额是%d, 提成是%.2f\n",s, s*0.05);     else if (s>=400 && s<1200)         printf("销售额是%d, 提成是%.2f\n",s, s*0.08);     else if (s>=1200 && s<2400)         printf("销售额是%d, 提成是%.2f\n",s, s*0.1);     else if (s>=2400 && s<4000)         printf("销售额是%d, 提成是%.2f\n",s, s*0.15);     else if (s>=4000)         printf("销售额是%d, 提成是%.2f\n",s, s*0.18);      return 0; }   switch..case 版：  #include <stdio.h>  int main() {     int i,s;     printf("请输入销售额:\n");     i = scanf("%d", &s);     if (i==0 || s < 0)     {         printf("非法输入！\n");         exit(1);     }      switch(s)     {         case 0 ... 199:             printf("销售额是%d,没有提成\n", s);             break;         case 200 ... 399:             printf("销售额是%d, 提成是%.2f\n",s, s*0.05);             break;         case 400 ... 1199:             printf("销售额是%d, 提成是%.2f\n",s, s*0.08);             break;         case 1200 ... 2399:             printf("销售额是%d, 提成是%.2f\n",s, s*0.1);             break;         case 2400 ... 3999:             printf("销售额是%d, 提成是%.2f\n",s, s*0.15);             break;         default:             printf("销售额是%d, 提成是%.2f\n",s, s*0.18);             break;     }     return 0; }   记得结贴给分哦。


Question: 跪求

引用 12 楼 proorck2019的回复:Tamperauters temperature  你的结贴给分数，是个好习惯，也是我们奋斗下去的动力。 其实是第一次用

#include <stdio.h>  //Tamperatures(double A); //void Tamperatures(double A);  void Tamperauters(double A);  int main() {     double a;      printf("请输入华氏温度:");     //while(scanf("%f",&a)==1)     while(scanf("%lf", &a)==1)     {         //Tamperatures(a);         Tamperauters(a);         printf("请输入华氏温度:");     }     return  0; } //Tamperauters(double A) void Tamperauters(double A) {     const double b=1.8,c=32.0, d=273.16;     double celsius,kelvin;      celsius = b * A + c;     kelvin = celsius + 273.16;     //printf("\n%.2f转换为摄氏度为%f.\n绝对温度为%.2f.",A,celsius,kelvin);     printf("\n%.2lf转换为摄氏度为%lf.\n绝对温度为%.2lf.",A,celsius,kelvin); }  供参考～  单词拼写错误，如果容易出现错误，那么为啥要起那么长的函数名呢？  double，用%lf

引用 8 楼 ?Victor.??的回复:[quote=引用 7 楼 qq_46506658 的回复:] [quote=引用 5 楼 ?Victor.??的回复:]Tamperauters(double A)  这是什么东西，拼写不对  还有在函数前面加上类型  void  double  都行 必须加void吗？还有我这个变量创建是不是有问题啊[/quote]  把%f  改  %lf  函数要有类型  返回值是什么，函数类型就是什么，你的函数没有返回值，void就可以  变量没什么问题[/quote] 谢谢谢谢谢谢谢谢谢

引用 8 楼 ?Victor.??的回复:[quote=引用 7 楼 qq_46506658 的回复:] [quote=引用 5 楼 ?Victor.??的回复:]Tamperauters(double A)  这是什么东西，拼写不对  还有在函数前面加上类型  void  double  都行 必须加void吗？还有我这个变量创建是不是有问题啊[/quote]  把%f  改  %lf  函数要有类型  返回值是什么，函数类型就是什么，你的函数没有返回值，void就可以  变量没什么问题[/quote] 谢谢谢谢姨大佬，无以为报，一只刚刚学习c的小菜鸟

引用 7 楼 qq_46506658 的回复:[quote=引用 5 楼 ?Victor.??的回复:]Tamperauters(double A)  这是什么东西，拼写不对  还有在函数前面加上类型  void  double  都行 必须加void吗？还有我这个变量创建是不是有问题啊[/quote]  把%f  改  %lf  函数要有类型  返回值是什么，函数类型就是什么，你的函数没有返回值，void就可以  变量没什么问题

引用 5 楼 ?Victor.??的回复:Tamperauters(double A)  这是什么东西，拼写不对  还有在函数前面加上类型  void  double  都行 必须加void吗？还有我这个变量创建是不是有问题啊

1、函数声明格式不对， 要像楼上说的那样 Tamperauters(double A)  ==》 void Tamperauters(double A) 这样才是正确的格式。 2、double 类型的  scanf("%lf", &a).    L的小写  %lf.     %f，是float类型的输入格式。

引用 3 楼 ?Victor.??的回复:能贴一下代码吗  我看到你发的图片  是横着的   #include <stdio.h> Tamperatures(double A); int main() { 	double a;  	printf("请输入华氏温度:"); 	while(scanf("%f",&a)==1) 	{ 		Tamperatures(a); 		printf("请输入华氏温度:"); 	} 	return  0;  } Tamperauters(double A)  {  	const double b=1.8,c=32.0,d=273.16;  	double celsius,kelvin;   	celsius=b*A+c; 	kelvin=celsius+273.16; 	printf("\n%.2f转换为摄氏度为%f.\n绝对温度为%.2f.",A,celsius,kelvin);   }

能贴一下代码吗  我看到你发的图片  是横着的

引用 1 楼 ?Victor.??的回复:https://blog.csdn.net/qq_45861670/article/details/104015023  供参考 还不是这些问题，好像反应的是我使用的外部函数的问题，但是我看不出来，你能试试帮我看看吗？很简单的一段程序


Question: 关于二维数组，不懂之地，前来请教？

虽然输入12个，但是scanf_s只接收9个。其他三个应该是丢掉了。 输入一个回车，那么向内存刷过去了3个数据，循环其实还没结束，还在等待输入。

因为循环没有结束，没输够9个数，循环不会退出，下面的语句自然不会运行。

第一个控制台在第一行按回车后，为什么不会得出结果


Question: 求教:用什么开发点名软件？

VS2008破解版，想开发什么都行

编程简单，难的是现在很难找到靠谱的开发环境。 我下载那个TC2有BUG，照着书写的都能出错。

web最简单

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

用你最熟悉的语言去写，都可以实现的。

可能这不是最先考虑的吧，应该先想好软件要做什么，需要什么功能

图方便的话不需要自己做一个软件  简单的办法：做个PPT，每页一个名字，人工翻页  想搞点仪式感，可以用js搞个网页版的

管理员小哥哥或者小姐姐  干什么呀    我在很正经的回答问题呀  python  java  都行  实在不行用c++

Python呗，多时髦。

java


Question: 求大佬讲解

给你一点提示  个位  n%10  十位  (n%10)/10


Question: c语言逻辑运算符的使用

&&：x = 0,而在在括号里和x == 1这时不成立的为假，为假以后，后面的y = 2这个语句就不执行了，因为&&只要有一个语句为假，那这个表达式为假，就不会去判断右边的语句了，所以 y还是为0

C中的逻辑运算是短路运算。所以y=2就没有执行。


Question: C语言二维数组一些问题 问题在注释里

现在学了指针才知道之前说错了，a=&a[0]，此时a和&a[0]，纯地址也相同，基类型也相同，都是指向行的，指向一维数组a[0]，a[0]=&a[0][0]，纯地址也相同，基类型也相同，都是指向第0行第1列数组的元素，而a和a[0]虽然纯地址相同，但是基类型不同，前者是int(*)[n]型，后者是int *型。而且一个纯地址不可以再取地址，纯地址不可以，所以不可以&&a[0][0]，此时&a[0][0]就是一个纯地址，当然不可以再取地址，如果指针p指向&a[0][0]，再取此指针p的地址就可以了。

c语言书上有，基础的

刚刚问了一个人，在二维数组里，a=&a[0]=&a[0][0]，但a不等于a[0]，地址不行，但指针可以，因为数组底层是指针实现的，所以a在二维数组里才等于a[0]。

用指针表达一下数组，就可以理解这个问题了

应该还是因为a[0]和a均不是变量的原因。 只有a[0][0]是变量。 int a[3][4]的含义不是定义了一个3*4的整数数组，而是3*4个整数的集合 也就说这个集合中的每个元素是int ，但是这个集合不是int  还有一个原因，在实际的实现里好像是既没有数组的概念，也没有变量的概念。 实际实现，都是用地址偏移实现的。  假设a是a[0]的首地址，那么a++，a+5... 就很好的操作 同样a[0]++,a[0]+5,就很好操作下一级的元素。  如果让a定义成就是本身的地址，或者最低维的地址，就不好操作。 定义为本身，++就偏移出数组了，定义为最低维，每次只能移动一个元素。  而且，个人认为，不能a=&a[0],这样理解，他们只是数值相等 a[0]本身就是地址，不能对地址取地址

回答了就结贴了

那好的，刚刚说到a=&a[0]，a[0]=&a[0][0]，那么如何推出a=a[0]呢？

int a; int b=&a; b=&&a; 这么写是错误，一个地址不再会有地址了。 int a; int b=&a; int c=&b; 实际上二级间址，取的是指针变量的地址。 int a; int * b=&a; int **c=&b; **c=5; printf("%d",a); 个人认为数组名不是变量，更像是数据类型。

嗯，例如二维数组a[3][4]，可以把a看作一个一维数组，它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组，例如a[0]包含a[0][0] a[0][1] a[0][2] a[0][3]，所以在定义上来看，a包含的一个数组有三个元素，a就是这三个元素的首地址，也就是a=&a[0]（一式）。 a[0]包含一个数组有四个元素(此时把a[0]看做包含四个元素的这个数组的名字)，所以a[0]=&a[0][0]。（二式）。所以由一式和二式推出a=&a[0]=&&a[0][0]. 但是我有一个疑问，为啥&&a[0][0]打印不出来？    #include<stdio.h>   int main() {     int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};     printf("%d",&(&a[0][0]));     return 0; }

好难，我是这么理解的，不知道对不对。 二维数组其实是这么定义的， 定义了一个数组[3]，这个数组的每个元素是一个数组[4] 所以a是数组[3]的首地址 也就是说a的定义含义是a[0]的地址，而只是在数值上相等于a[0][0]的地址，其含义并不是。 同时，a并不是一个变量，a是数组。a就是a的地址。 也就是说，没有一个地方保存着a的地址，更没有一个变量a a就是数组的地址  那么  a+1，是a[3]这个数组的元素，偏移1，也就是偏移一个[4] &a，导致a的含义发生改变，a不再是a[3]这个数组元素的首地址，而是整个类型的地址（这里假设把数组看成数据类型） &a+1，是整个a+1，也就是偏移了sizeof a  a[0]是a[3]这个数组的首个元素（你可能这里混淆了），其是[4]数组的首个地址，也就是a[0][0]的地址。 所以a[0]+1，是a[0][1]的地址 a[1]是a[3]这个数组的第二个元素，其同样是一个[4]数组的首地址，也就是a[1][0]的地址。 a[1]+1是a[1][1]的地址  a是a[3]这个数组的首个元素的地址，也就是a[0]的地址，每个元素是一个[4]数组 也就是说*a,是一个[4]数组的首地址。 所以*a+1，是a[0]1]的地址。  我已经晕了，这指针也太绕了。

https://blog.csdn.net/qq_39589390/article/details/88048973  好的 刚刚找到一篇文章不错

建议楼主考虑类型，比如a和a[0]，已经&a[0][0]的地址都是一样的，但是类型不一定一样哦。

a+1, 是a[3][4]数组中的 a[1][4]这一行的首地址。二维数组首地址是行地址 a (也就是a+0)是第一行， a+1是第二行， a+2是第三行，每一行有4个元素，这样可以理解吧

#include<stdio.h>   int main() {     int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};     printf("%d\n",a);//a是整个二维数组的首地址，a=&a[0]=&&a[0][0]，      printf("%d\n",a+1);//a+1就是整个二维数组首地址偏移一个数组，那么a+1不应该是a的地址加上整个二维数组元素个数12吗？为什么结果不是？      printf("\n");          printf("%d\n",&a);//&a是指向二维数组的指针存放的地址，结果为什么和&a一样？是巧合吗？      printf("%d\n",&a+1);//&a+1就是指向二维数组的指针向下偏移一个，那么a+1不应该是a的地址加上整个二维数组元素个数12吗？为什么结果不是？     printf("\n");          printf("%d\n",a[0]);//a[0]是二维数组第一行的首地址     printf("%d\n",a[0]+1);//a[0]+1是二维数组第一行的首地址向下偏移一行的地址，也就是二维数组第二行的首地址，结果相差一行4个数字，正确！      printf("%d\n",a[1]);//a[1]是二维数组第二行的首地址，为什么结果和a[0]+1不同？      printf("%d\n",a[1]+1);//a[1]+1和a[1]结果相差4，正确！      printf("\n");          printf("%d\n",*a);//二维数组的第一行地址      printf("%d\n",*a+1);//*a+1是二维数组的第一行地址向下平移一样的地址，正确！      printf("\n");     return 0;      }


Question: 求助，请问大佬们这道题怎么做

引用 3 楼 ULiar_ 的回复:[quote=引用 1 楼 翻斗大街之王的回复:]const double PI = 3.1415; class CCircle { public: 	CCircle(double x = 0, double y = 0, double rr = 1) :cx(x), cy(y), r(rr) {} 	CCircle(const CCircle& Ctemp) 	{ 		cx = Ctemp.cx; 		cy = Ctemp.cy; 		r = Ctemp.r; 	} 	~CCircle() {} 	void SetX(double x) { cx = x; } 	void SetY(double y) { cy =y; } 	void SetR(double rr) { r = rr; } 	double GetX() { return cx; } 	double GetY() { return cy; } 	double GetR() { return r; } 	double getArea() { return r * r * PI; } 	double getPerimetre() { return 2 *PI * r ; } private: 	double cx; 	double cy; 	double r; };  大佬，这个用java怎么做[/quote] 我才学c++，，，，java不会

引用 1 楼 翻斗大街之王的回复:const double PI = 3.1415; class CCircle { public: 	CCircle(double x = 0, double y = 0, double rr = 1) :cx(x), cy(y), r(rr) {} 	CCircle(const CCircle& Ctemp) 	{ 		cx = Ctemp.cx; 		cy = Ctemp.cy; 		r = Ctemp.r; 	} 	~CCircle() {} 	void SetX(double x) { cx = x; } 	void SetY(double y) { cy =y; } 	void SetR(double rr) { r = rr; } 	double GetX() { return cx; } 	double GetY() { return cy; } 	double GetR() { return r; } 	double getArea() { return r * r * PI; } 	double getPerimetre() { return 2 *PI * r ; } private: 	double cx; 	double cy; 	double r; };  大佬，这个用java怎么做

谢谢你，大佬，真的老师不讲，说很简单，明明都不会啊，谢谢你


Question: 初始化单链表并插入元素运行出错

怎么这种错总是老有人犯，函数内部改变参数指针的指向不影响函数外部的实参的指向 initlist(LinkList *L) 也就是在这里 L=malloc 申请的内存，跟main 的L1， L2一点毛关系都没有 要么就用引用 initlist(LinkList* &L)，main的L1，L2改成指针 LinkList *L1, *L2; intilist(L); 其它不变 要么就用双指针 initlist(LinkList& **L) main的L1，L2也要改成指针，initlist里要用 *L=malloc

报错是在Display函数里面printf后面。读取访问权限冲突


Question: 用顺序表实现病历信息的管理与查询功能

楼主想要做什么？怎么没看到main函数。

对啊，怎么没看到main函数


Question: c语言指针相关问题

引用 1 楼 user-1的回复:那你想一想 p+1是不是等于&a[1]， (p+1)-p=? 是不是等于1？ p=a[0] p++等于p=p+1，那么p-a[0]是多少？是不是就是1  指针类型计算系统已经自动转换字节大小了，所以你不用考虑，否则每种指针类型不一样，还要自己去记住每种类型的大小，然后移动字节大小，那不是太麻烦了吗？所以这部分编译器就帮你做了，指针+1就是指针移动一个单元，这个单元占几个字节，编译器帮你算。 哦~原来是编译系统自动做好的，懂了，谢谢大佬哈哈


Question: 大小写转换+后移一位

void crypt_char(char *str) {     int i = 0;      while (str[i]) {         if (isupper(str[i]))             str[i] = (str[i] + 1 - 'A') % 26 + 'a';         else if (islower(str[i]))             str[i] = (str[i] + 1 - 'a') % 26 + 'A';         i++;     } }  供参考～

void crypt_char(char *str) {     int i = 0;      while (str[i]) {         if (isupper(str[i]))             str[i] = (str[i] + 1 - 'A') % 26 + 32 + 'A';         if (islower(str[i]))             str[i] = (str[i] + 1 - 'a') % 26 - 32 + 'a';         i++;     } }  供参考～

引用 6 楼 lirg8405的回复:或者用gets_s(chArray, 500);代替 谢大佬

或者用gets_s(chArray, 500);代替

引用 4 楼 user-3 的回复:[quote=引用 3 楼 lirg8405的回复:]是的，修改一下  char chArray[500] = {0}; 	printf("请输入一串数据："); 	int nlen = scanf_s("%s", chArray, 500);  	for(int i=0; chArray[i] != '\0'; i++) 	{ 		if (chArray[i]  >= 'a' && chArray[i] < 'z') 		{ 			chArray[i] = 'A' + chArray[i] - 'a' + 1; 		} 		else if (chArray[i]  >= 'A' && chArray[i] < 'Z') 		{ 			chArray[i] = 'a' + chArray[i] - 'A' + 1; 		} 		else if (chArray[i] == 'z') 		{ 			chArray[i] = 'A'; 		} 		else if (chArray[i] == 'Z') 		{ 			chArray[i] = 'a'; 		} 	}  	printf("\n%s\n", chArray);  大佬，我刚学c＋＋还不会c，请问如果用c＋＋ 在for循环里判断是否为空格那个地方怎么写呀， 就是charray[i]！=‘0’这一句[/quote]  改这个：scanf_s("%[^\n]", chArray, 500);

引用 3 楼 lirg8405的回复:是的，修改一下  char chArray[500] = {0}; 	printf("请输入一串数据："); 	int nlen = scanf_s("%s", chArray, 500);  	for(int i=0; chArray[i] != '\0'; i++) 	{ 		if (chArray[i]  >= 'a' && chArray[i] < 'z') 		{ 			chArray[i] = 'A' + chArray[i] - 'a' + 1; 		} 		else if (chArray[i]  >= 'A' && chArray[i] < 'Z') 		{ 			chArray[i] = 'a' + chArray[i] - 'A' + 1; 		} 		else if (chArray[i] == 'z') 		{ 			chArray[i] = 'A'; 		} 		else if (chArray[i] == 'Z') 		{ 			chArray[i] = 'a'; 		} 	}  	printf("\n%s\n", chArray);  大佬，我刚学c＋＋还不会c，请问如果用c＋＋ 在for循环里判断是否为空格那个地方怎么写呀， 就是charray[i]！=‘0’这一句

引用 1 楼 lirg8405的回复:     char chArray[500] = {0}; 	printf("请输入一串数据："); 	int nlen = scanf_s("%s", chArray, 500);  	for(int i=0; chArray[i] != '\0'; i++) 	{ 		if (chArray[i]  >= 'a' && chArray[i] <= 'z') 		{ 			chArray[i] = 'A' + chArray[i] - 'a' + 1; 		} 		else if (chArray[i]  >= 'A' && chArray[i] <= 'Z') 		{ 			chArray[i] = 'a' + chArray[i] - 'A' + 1; 		} 	}  	printf("\n%s\n", chArray);  这个题还有两种特殊情况 输入z或者Z，不能套用if，此时要输出为A和a


Question: 关于函数调用，主函数值不变——普通变量做函数的参数，当函数调用时，从实参单向的值传递到形参，函数体内完成形参的转换，并不改变实参的值。

引用 1 楼 自信男孩 的回复:楼主，你传过去的是数组，数组名是数组的首地址，可以理解为指针常量。因此，指针不算是普通变量，所有的参数传递都是值传递，但是传数组名传的是地址值。  因为传递过去的是地址值，实际上是实参的地址值，因此自定义函数里对数组的操作，实际上修改的是实参。 ”数组名是数组的首地址，可以理解为指针常量。“ 等于说和用指针传递的方法是一样的对吧。明白啦，谢谢！


Question: C语言

我也不知道，为什么%c也要指明宽度。 SDL好像是原先允许的一些内容，新版本的vs认为是不安全的了，即使关掉也可能会以警告出现。  在你真正开始编程的时候，会有大量的你第一次见到的函数，这不但需要你看文档，还得猜都是干什么的。 现在看都不知道哪儿对哪儿，坚持下去就会清晰起来。

引用 4 楼 獐弓子 的回复:[quote=引用 2 楼 m0_46108109的回复:]scanf_s%c也要指明大小 scanf需要加#define _CRT_SECURE_NO_WARNINGS 或者在工程属性里把sdl检查关了 望细讲，不懂[/quote] 指点就是人家说了你理一下思路 scanf_s这个函数原型为什么安全，就是他指定了要读取的长度，你没有给这个参数。还要怎么细讲。

引用 2 楼 m0_46108109的回复:scanf_s%c也要指明大小 scanf需要加#define _CRT_SECURE_NO_WARNINGS 或者在工程属性里把sdl检查关了 望细讲，不懂😂😂

引用 1 楼 user-3的回复:参数不够，查一下需要什么参数 望细讲🌝，不懂😂

参数不够，查一下需要什么参数


Question: 代码分析

引用 3 楼 黑化肥会发挥的回复:这应该是一个递归 分支方法解决问题的算法，不过你这给的代码藏头藏尾也不知道要用递归解决什么 哈哈没事，解决了

引用 1 楼 user-2的回复:在哪里得到的代码？ 网上搜的……

在哪里得到的代码？


Question: C语言基础性题目

scanf ( "％d  ％d" , a, b); a，b两个变量没有加&符号

应该为scanf （" ％d  ％d" , &a, &b）;

相对标准的代码 include <stdio.h>   int  main() {       int  a, b;       int  sum;       scanf ( "％d  ％d" , a, b);       sum ＝ a ＋ b;       printf (" sum  is  ％d"  , sum);       return  0; }

第五行，scanf("%d%d",a,b); ab前面少加了&， &a,&b

scanf   &a &b


Question: 复数相加结果好像溢出了

原来的输入方法 scanf("%d%d",&x.re,&x.im);// 遇到1+2i的输入时候，x被正确输入了，但是缓冲区里面还留下了字母i scanf("%d%d",&y.re,&y.im);//  这里因为第一个字母是i，所以这个y两个参数都没有正确获得 所以，后面的add的时候，y的值是未初始化的随机数， 结果就是你截图的那个德行了

引用 4 楼 寻开心的回复:scanf("%d%di",&x.re,&x.im); scanf("%d%di",&y.re,&y.im); 这样更好，输入 1-2i   10+8i 都可以了 可以了哇 谢谢你啊

你要想输入1+2i这种形式，就要 struct complex x,y,s; scanf("%d+%di",&x.re,&x.im); scanf("%d+%di",&y.re,&y.im);

是你输入错了， 要输入： 1 2 1 2 结果就是2 + 4i了

#include<stdio.h> struct complex { 	int re; 	int im; }; void add(struct complex a,struct complex b,struct complex *c) { 	c->re=a.re+b.re; 	c->im=a.im+b.im; } int main() { 	struct complex x,y,s; 	scanf("%d%d",&x.re,&x.im); 	scanf("%d%d",&y.re,&y.im); 	add(x,y,&s); 	printf("sum=%5d+%5di",s.re,s.im); } 程序是这个 上面有点打错了


Question: 这个代码信息要怎么输入啊！！

引用 1 楼 寻开心的回复:scanf("%d",&students[i].name); 这句改成   scanf("%s", students[i].name);   因为name是字符数组， 不是整数 嗯嗯，知道了


Question: 位运算这样用为什么出问题了

可以 if ((a[i] ^ a[i + 1]) & 1) {...}

引用 2 楼 寻开心 的回复：因为==的优先级要高于&位运算符，所以先执行的是==判断  仔细看看书上都运算符优先级  自己写代码不确定的时候多加几个括号谢谢

换成%2==0就对了


Question: 我找不到这个段错误了

编译时加上-g，在gdb里run下，出现段错误看一下trace就知道在哪了。另外c99是支持使用变量定义数组的

我知道了，其中i,j,有混淆的

#include <stdio.h> #include <stdlib.h>  int main() {     int chang1;     scanf("%d",&chang1);     //int a[chang1];     int *a = (int *)malloc(sizeof(int) *chang1);     for(int i=0;i<chang1;i++)     {         scanf("%d",&a[i]);     }     printf("dgdfsg");     int n;     scanf("%d",&n);     //int b[n];     int *b = (int *)malloc(sizeof(int)* n);     if (!b)         exit(0);      for(int i=0;i<n;i++){         scanf("%d",&b[i]);     }     int c[20];     int count =0;     int i,j;      for( i=0;i<chang1;i++)     {         int flag=1;         for( j=0;i<n;j++)         {             if(a[i]==b[j])flag=0;         }         if(flag)c[count++]=a[i];     }      for( i=0;i<n;i++)     {   int flag=1;         //for( j=0;i<chang1;j++)   //怎么变成i呢         for( j=0;j<chang1;j++)         {             if(b[i]==a[j])flag=0;         }         if(flag)c[count++]=b[i];     }     printf("%d",c[0]);      for(int i=1;i<count;i++)     {int flag=1;         for(int j=0;j<i;j++)         {             if(c[i]==c[j])flag=0;         }          if(flag)printf(" %d",c[i]);      }  } 供参考～  试一下这个程序～  变长数组C语言不支持，只支持固定长度的数组。因此要用动态申请空间，另外，建议加上free

这个动态数组能这样用吗？int a[chang1]; int b[n];

其中第10行是我测试用的


Question: 请问C语言可以做什么电路

引用 1 楼 proorck2019的回复:C语言不适合作电路。 我也觉得ಠ︵ಠ

引用 2 楼 寻开心的回复:verilog， vhdl什么的写控制程序吧 c可以用来做接口程序，但是电路里面的控制程序是自己的语言 好的，谢谢啦

引用 5 楼 m0_46108109的回复:好像电路用的汇编吧，会给你一个开发手册，里面有如何如何编写控制的说明。 看过一点plc的视频，好像连语言都不是，就是拖动模块，组成电路，然后烧录就行了。 C应该是用于写驱动的。 没听说过电路用汇编写呢，没有头绪

C语言不适合作电路。


Question: 题目

第二个题是可以这样的：      scanf("%d%c%d", &a, &op, &b);  你可以直接输入 1+2， 1-2， 1*2， 1/2 这样的内容的

①手机上不能结贴给分数 ②作业还是需要自己做的

scanf("%d %d", &a, &b); scanf("%c", &c); 取值，得到后判断就好了

引用 1 楼 @大愚@ 的回复：你可以用switch语句，进行选择我们要用C语言

你可以用switch语句，进行选择


Question: 萌新请教，关于c语言的问题。

引用 5 楼 qwe931482801的回复:[quote=引用 4 楼 proorck2019的回复:]复习一下布尔逻辑： a and b = not((not a) or (not b))  结贴给分数是个好习惯， 也是我们这群人奋斗下去的动力。 怎么结帖，大佬[/quote] 去电脑上，有结贴按钮。 手机上不能。

引用 4 楼 proorck2019的回复:复习一下布尔逻辑： a and b = not((not a) or (not b))  结贴给分数是个好习惯， 也是我们这群人奋斗下去的动力。 怎么结帖，大佬

strcmp（）返回值，当比较的两个字符串相同时返回0，不同时返回1/—1。 如果换成||将会无限循环，如果换成i==0||o==0效果和我写的一样都是不考虑账号对不对。 当i==0&&o==0将会无限循环。 谢谢你的回答，我还是换个算法吧，我理不通了。

数组越界了，字符数组初始化为"";那么这个数组长度是1.即'\0'。 所以账户和密码可以存放的字节数是1。  另外，注意下数组名就是地址，因此输入时去掉&

逻辑错误。 当密码和用户名同时不对，才显示错误，又因为&&比较前一项为假时，就不比较后一项了。所以当密码对了，就显示成功了。 将&&换成||，或修改成i==0&&0==0


Question: c语言问题求助

引用 1 楼 proorck2019的回复:enum可以看作一系列#define xxday 1，把标识符转换成数字处理，所以显示的是数字。  结贴给分数是个好习惯， 也是我们奋斗下去的动力。 噢噢噢听懂了！谢谢你！！♡


Question: 小白求教

估计是楼主直接打开的一个cpp文件，然后想直接编译这个cpp，没有把这个文件归属到任何工程里面呢 新建一个空的控制台应用 然后把它添加进去，或者是替换工程自动生成的cpp文件里面的内容吧

你打开工程文件，提示你转换的。

肯定不是源代码的问题，不用贴代码。

工程文件可能不一样了 你还不如在vc2010新建一个工程文件，然后把cpp文件拷贝到新的工程文件去试试


Question: 哪位大佬能告诉我这个哪里错了吗？

我去，我太蠢了，犯这种低级错误

j=0 改成 j==0， 比较用==，其余的1和2也是同样的问题

if（j=0) 改为 if(j==0)

大佬们，求助啊


Question: 萌新求问关于函数声明

函数声明，如果没有参数，建议用void，不写也是可以的，但是还是建议写void；  D选项很明显是函数定义而非声明。声明的函数是没有大括号，并且有分号。

引用 1 楼 qybao的回复:明显是D啊，D是函数实现，有函数体了({}的内容，即使是空的函数体，也是有函数体了)。 函数不一定有参数，所以它的原型的参数就是空或者void，所以A没毛病 好的谢谢谢谢！

原型是指声明，没有{} 有了{}就是定义了。

D无返回值,所以出错。


Question: 请问怎么输出一段字符串电脑运算最快，可以用源代码

void main(){ char a[100]; scanf("%s",a); printf("%s",a); }

应该是puts快，直接输出一个字符串，而printf要逐字符扫描一遍format串

引用 50 楼 liups的回复:楼上很多人的观点不对！ 1、比如说写显存，其实楼主的问题根本不是显示，只是输出，结合OJ来看，根本没有显示，只是一个输出重定向，所以没显存什么事，这个办法行不通！ 2、汇编，大家知道C语言通常称为中级语言，但不是标准的低级语言，所以这里不能用汇编，原因有2：一个是OJ什么硬件不清楚，所以汇编不可能，二是OJ本身就针对C语言，可能不让用，另外问题非常简单，考虑到编译器有优化，可能汇编在这真没有优势，真要快可能考虑一下编译器的优化更有效，但是OJ如何编译是服务器端的事，属于不控的，所以也不用考虑汇编了。  另，有人说puts比printf快，这二者哪个快我真心没研究，但是需要考虑真实的环境，希望精通此方面的高手出来分析一下 嗯嗯，我也一直没有碰到精通此方面的博主

为什么非要细究这种毫无意义的问题呢？和很多因素有关，其中最关键的是和操作系统的设计原理有关。

printf

汇编最快，，，。。。。。。

引用 43 楼 m0_46108109的回复: #include <stdio.h> int main() {     return puts("Hello World"); }  楼主，试试这样快吗？ 试了，不行，谢谢

引用 41 楼 liups的回复:看来基本清楚了，情况是这样的： OJ中一个最入门的题目：输出hello,word! 然后楼主看其同学（都是初学者）运行速度比他快，就想反超同学。  这就是一个初学者因为不懂（特别是不懂OJ）产生的想法，这种事情不值得做，因为是这种简单的问题，快的同学并不能代表其代码本身就快。而因为楼主描述不清楚，大家都浪费了很多表情。 嗯嗯，谢谢指导

printf最快

很好奇 你的代码是什么  和别人的差距是多大  为什么会觉得是printf的问题

引用 6 楼 SINGFORME 的回复:[quote=引用 3 楼 GKatHere的回复:]当然是c的printf最快 printf不够快，我试过了，别人的速度比printf更快，在oj上使用C语言[/quote] 这个要看你在那里用了，printf是不够快的，直接写内容到输出对应的内存是最快的。

引用 3 楼 GKatHere的回复:当然是c的printf最快 printf不够快，我试过了，别人的速度比printf更快，在oj上使用C语言

引用 2 楼 真相重于对错的回复:输出字符串最快的话，莫如直接写显存 请问有代码吗，使用C语言

在oj上使用C语言

谢谢各位，了解了

引用 35 楼 SINGFORME 的回复:[quote=引用 32 楼 lin5161678的回复:]也许别人是攻击了 oj  而不是代码真的比你快 以前还有 时间为负数的 成绩 别想太多了  就puts 完事 我在打擂台[/quote] 不会是你们几个同学自己想出来的打擂吧？！ 正如本人前面说的和36楼说的，OJ不适合这种速度的打擂，这没有意义，前面的人很可能只是运气好，放弃吧！

oj的代码运行时间影响的因素很多，同一代码提交几次的运行时间都未必一样。当年上学的时候玩poj也要争个第一，但是poj的rank是按代码量、运行时间、内存占用来排的，运行时间只占第二位


Question: 求大佬帮忙看看是什么情况

你发了一堆配置还是错误信息，看着好迷糊，遇到什么问题了吗

什么东西的错误


Question: 求答

#include<stdio.h> int main() { 	int a,b,c; 	int m,n; 	printf("输入三位数:\n"); 	scanf("%d",&m); 	a=m/100; 	b=(m-a*100)/10; 	c=m-100*a-10*b; 	n=c*100+b*10+a; 	printf("%d",n); 	return 0; } 这是最low版本，建议找一下高级一点的学习一下

引用 3 楼 weixin_46532909 的回复:[quote=引用 1 楼 與蘤舊縐的回复:]一看就是还热乎着的作业  这题总得自己试一下吧 我试了好多次都是错误的[/quote]  楼上给出了最简单的思路  你也可以用字符数组存取各位数字，反向输出，也可以递归

引用 1 楼 與蘤舊縐的回复:一看就是还热乎着的作业  这题总得自己试一下吧 我试了好多次都是错误的

最简单的办法就是取余数，除数，相加就可以了，自己实现。

一看就是还热乎着的作业  这题总得自己试一下吧


Question: 链表

typedef struct _stuList 	{ 		_stuList* pNext; 		int nNode; 	}stuList;  	int nArray = 0; 	while(nArray <= 0) 	{ 		printf("请输入将要输入的组数：\n"); 		scanf("%d", &nArray); 	}  	int *arrayM = (int*)malloc(sizeof(int)*nArray); 	int *arrayX = (int*)malloc(sizeof(int)*nArray); 	for(int i=0; i<nArray; i++) 	{ 		scanf("%d %d", &arrayM[i], &arrayX[i]); 	}  	stuList *pHead = (stuList*)malloc(sizeof(stuList)); 	pHead->pNext = NULL; 	pHead->nNode = -1;  	stuList *pData = NULL; 	stuList *pPoint = NULL;  	for (int i=0; i<nArray; i++) 	{ 		pData= (stuList*)malloc(sizeof(stuList)); 		pData->pNext = NULL; 		pData->nNode = arrayX[i];  		int nMi = arrayM[i]; 		pPoint = pHead; 		while(pPoint->pNext != NULL && nMi>0) 		{ 			--nMi; 			pPoint = pPoint->pNext; 		}  		pData->pNext = pPoint->pNext; 		pPoint->pNext = pData; 	}  	pData = pHead->pNext; 	while(pData != NULL) 	{ 		printf("%d ", pData->nNode); 		pData = pData->pNext; 	} 	printf("\n");   	while(pHead != NULL) 	{ 		pData = pHead; 		pHead = pHead->pNext; 		free(pData); 	} 	free(arrayM); 	free(arrayX);


Question: 单链表编程题求助

解决了 main函数里面没有给palist 分类空间。还有其他一些细节错误

#include<stdio.h> #include<stdlib.h>  struct Node; typedef struct Node *PNode; struct Node {     int info;     PNode link; };  typedef struct Node *LinkList;  typedef LinkList *PLinkList;  void createlink(PLinkList pclist, int n)  //建立单链表 并赋初值 {     PNode p, q;     int i;     p = (PNode)malloc(sizeof(struct Node));     if (!p)         exit(0);     *pclist = p;     p->info = 1;     q = (PNode)malloc(sizeof(struct Node));     if (!q)         exit(0);     q->info = 2;     p->link = q;     p = q;     for (i = 3; i <= n; i++)     {         q = (PNode)malloc(sizeof(struct Node));         p->link = q;         q->info = i;         p = q;     }     p->link = NULL;     return; }  void deletei_link(PLinkList pclist, int num) {     PNode p, pre = NULL;     p = *pclist;     int count = 1;     pre = *pclist;     while (count != num && p->link != NULL)     {         pre = p;         p = p->link;         count++;     }     if (count != num) {         printf("Can't find it !\n");         return;     }     if (p == *pclist) {         *pclist = (*pclist)->link;         free(p);         return;     }     pre->link =p->link;     free(p);      return; }  int main() {     int n; int num;     scanf_s("%d", &n);     //scanf("%d", &n);     LinkList pclist = NULL;     createlink(&pclist, n);     scanf_s("%d", &num);     //scanf("%d", &num);     deletei_link(&pclist, num);     PNode w;     w = pclist;     while (w != NULL)     {         printf("%d", w->info);         w = w->link;     } }  供参考～  楼主的代码没有考虑到删除第一个节点以及count != num时，即没有符合要删除的情况～


Question: 基础知识

你问的是python吗


Question: 求解

建议你重新发帖，图片都是歪的，难道我要歪着脖子看？

第一个语句的Bsearch是个函数，执行结果保存到m里了。 第二个语句是：当m比0大或者是等于0 的时候，执行if语句。


Question: 怎么理解++的后缀运算符的优先级高于前缀的优先级？

根据常见的编译器，VS和GCC的运算过程来看，显然前缀++和--优先级高于后缀++和--，，不过国内课本的附录上，普遍都写着后缀优先级高于前缀，，到底谁抄谁的，不清楚，，怀疑是以讹传讹，目前还在错误,国内和国外的课本都有这样的描述，，不过经过真理检验的经验是：（1）前缀++a（或--a）的优先级大于所有数值运算符（2）后缀a++（或a--）的优先级小于所有数值运算符

按照The C Programming Language第二版第二章末尾的图2-1,C语言的设计者似乎并未区分前缀和后缀的优先级;百度百科也没有区分,我们学校的教材也没有区分(把前缀放在二级,但是后缀巧妙地没有出现在优先级表格中); 但是维基百科则是仅仅给出C++的运算符优先级,而C Primer Plus第六版中的"B.2参考资料Ⅱ:C运算符"开头的优先级表格区分了前缀和后缀的优先级

顶一下，我也刚好在看这里，谈谈我自己的理解，希望对您有帮助！  一、参考资料： 1、《C陷阱与缺陷》，第 1.3 节，P8 ；第 2.2 节，P19 ； 2、《C Primer Plus （第6版）中文版》，附录 B.2 ，P667 ； 3、《C程序设计语言 （第2版）》，第 2.12 节，P42 ； 4、百度百科 - 运算符优先级 ：https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin  二、问题疑惑： 1、如楼主所问，在看参考资料 2 时，有一个疑问，为什么 ++ 的后缀运算符比前缀运算符优先级高？ 2、++（--）前缀运算符与后缀运算符的结合律一样吗？  三、基础理解： 1、++ 的后缀运算符：a++； 2、++ 的前缀运算符：++b； 3、-- 运算符也是类似；  由参考资料 1 的一个实际情况举例： 1、如下代码应该怎么理解？  a---b   2、由《C陷阱与缺陷》本节所讲的“贪心法”可得，编译器会从左到右一个字符一个字符读入，重复判断读入的这些字符能否组成一个有意义的符号； 引用引用书中解释：编译器将程序分解成符号的方法是，从左到右一个字符一个字符地读入，如果该字符可能组成一个符号，那么再读入下一个字符，判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分：如果可能，继续读入下一个字符，重复上述判断，直到读入的字符组成的字符串已不再可能组成一个有意义的符号。  3、那么我们就按照“贪心法”，来理解上述表达式，可以想到下边这个表达式与上边的表达式含义是一样的；  a-- - b   4、下边这种表达式，与上述两种表达式都不相同，注意看符号的连接与符号之间的空格！  a - --b   四、++（--）前缀运算符与后缀运算符的结合律 1、根据参考的资料来看，结合律应该是不一样的；  2、如果根据“贪心法”来理解结合律，感觉都应该是 从左往右 ；  3、根据百科资料中的运算符优先级结合性概念来理解，理解的不是很透彻；但是百科中也区分了前缀（前置）运算符、后缀（后置）运算符； 引用引用百科资料 - 结合性     当一个运算对象两侧的运算符优先级别相同时，则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的，这是C语言的特点之一。     它是仲裁者，在几个操作符具有相同的优先级时决定先执行哪一个。  4、总结一下，我认为关于结合性这块，应该要区分前缀运算符、后缀运算符；因为这两种运算符的结合律不同，且后缀运算符优先级要高于前缀运算符；

哦哦，明白了。

C语言 不用考虑 前缀后缀哪个优先级高 因为这两个运算符根本无法摆在同一个表达式上面

#include<stdio.h>  int main() {     int a[] = {10,20,30,40,50};     int* b = a;      int* d = a;     printf("%d\n", ++d++[2]);     printf("%d\n",(++b)++[2]);     printf("%p\n", d);     printf("%p\n",b);     return 0; } 可以这样试一下

你又不可能一行中对一个变量同时++--，或者前缀后缀++-- 一起用。所以可以不管.

int main(void) { 	int a[] = {10,20,30,40,50}; 	int* b = a; 	int* c = a; 	int* d = a; 	printf("%d\n", a[0]); 	printf("%p\n", b); 	printf("%d\n", b++[0]); 	printf("%p\n", b); 	printf("%p\n", c); 	printf("%d\n", ++c[0]); 	printf("%p\n", c); 	printf("\n"); 	printf("%p\n", d); 	printf("%d\n", ++d++[2]); 	printf("%p\n", d); 	return 0; }  这么理解可能对了。

引用 1 楼 ?Victor.?? 的回复:我们书上是这么写的  优先级 1 初等运算 [ ] ( ) -> .             2 自增自减 后置++  后置--             3 一元运算 前置++ 前置--  加号+ 减号-  &  *  ~  !   sizeof()             ……  int main(void) { 	int a[] = {10,20,30,40,50}; 	int* b = a; 	int* c = a; 	printf("%d\n", a[0]); 	printf("%p\n", b); 	printf("%d\n", b++[0]); 	printf("%p\n", b); 	printf("%p\n", c); 	printf("%d\n", ++c[0]); 	printf("%p\n", c); 	return 0; } 我这么理解对吗，这个前缀后缀，指的结合优先级


Question: 二分法

引用 8 楼 寻开心 的回复:int *p； 不要断章取义。 这里是p的类型定义， p是int *类型  先回去看书， 看明白指针再说算法的事儿。  看看数组， 里面必然会有数组和指针的部分 基础还没有搞明白， 看算法也白看  赞同。新学习是很多不明白的，但是先学会基本的东西，课本有的内容。

引用 5 楼 寻开心的回复:p就是要用二分法查找的数组的指针， 数组一共n个元素 *p就是指针所对应的元素的值， p是地址， *p就是地址里面的内容 *p=a[  ]？

*p=a[  ]？

引用 1 楼 lirg8405的回复:调用函数啊，然后根据返回值判断。 指针*p有什么作用

调用函数啊，然后根据返回值判断。


Question: winds存在多个messagbox信息框 获取刚刚弹出的信息框句柄要怎么操作！！！

自己搞定 用HOOK的方法


Question: 柔性数组 sizeof的问题

标准C 首先 柔性数组是 不完整数组类型  比如 double ele[ ]; 不是double ele[0]; 注意区别   然后 结构体中只有柔性数组成员这种情况是不允许的 看标准描述  As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.   总结 你说的情况只是编译器扩展  编译器怎么扩展的需要你翻阅你使用的编译器说明书了 标准C中 这样的做法是不行的

不是每种编译器都支持0长度数组的 如果不支持，估计是double ele[0] 数组名本身占一个指针大小的字节（类似于ele退化为指针），所以是4。你就不需要打印结构体的size，直接打印0长度数组的size看看就可以 比如 double ele[0]; printf("%d", sizeof(ele));


Question: 一个C语言问题

引用 1 楼 user-1 的回复:你看看你的编辑器long型和int型的取值范围，一般来说int和long型范围时一样的，你用下面的语句试试。      printf("%d\n",__INT_MAX__);     printf("%ld\n",__LONG_MAX__);     printf("%lld\n",__LONG_LONG_MAX__);  从你的输出来看明显时两种方法结果都超过了int的最大范围，改为long long应该就可以了。嗯，之后我看了一遍，是long的范围太小了，溢出，换成long long就好了


Question: 求解答，谢谢！

这个问题不难吧，建议自己动手写一写，几行代码的问题～


Question: 求解答，谢谢！

建议楼主自己动手写一写～


Question: 使用while ((c = getchar()!=EOF)) {putchar(c);}输出为什么乱码

赋值=的优先级低于!=，因此getchar() != EOF先执行，然后把1的结果赋值c，所以每次输出的putchar(1);即乱码了。

等号的优先级最低，所以是先计算右边的，在赋值给c

while ((c = getchar()!=EOF))  因为这句话 getchar() != EOF 在你没有Ctrl+Z之前输入的字符都不是EOF，所以判断结果始终是1 c = 1 putchar（1） 你看看1的ascii对应的是什么就知道了  改正 while ((c = getchar()) !=EOF )

#include<stdio.h> int main() { int c;	                                      ====》》 改成 char c; while ((c = getchar()!=EOF))         ====》》改成  while ((c=getchar()) != EOF)  {     putchar(c); } return 0; }


Question: 疑惑

引用 2 楼 user-1的回复:你的for后面用{}，否则for循环只有scanf语句有效  i=0; i<n; 和 i=1; i<=n 的区别就是循环次数一样，循环中的 i 的值不一样 我懂了(￣∀￣)谢谢兄dei

还有就是我写i=0 i小于n和i=1i小于等于n有啥区别