Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言如何生成n个随机数使得他们合为1

回复:
user: user-1
content: while(1) {         t = rand()%(2*s+1) - s;//生成[-s,s]随机数         if(s-t<=100) break;     } 要保证s-t 结果小于等于100 从前面的 随机数范围都手脚比较方便 还能把循环去掉

user: user-2
content: for example  先以总和为基数取随机数，每生成一个随机数，再以总和减去该随机数为基数生成下一个随机数，一直取满n-1个，最后一个用剩余的总和即可。 for example int n; scanf(“%d”, &n); double *d = (double*)malloc(sizeof(double)*n); srand(time(NULL)); int s = 100, t=0;  for (int i=0; i<n-1; i++) {     while(1) {         t = rand()%(2*s+1) - s;//生成[-s,s]随机数         if(s-t<=100) break;     }     d[i] = t/100.0; //生成[-1,1]随机数     s -= t; //每次生成随机数后修改总和 } double[n-1]=s/100.0; //最后一个

user: user-3
content: 直接生成不太好弄，可以先生成n-1个相加为0的随机数，然后最后一个数固定为1。

user: user-0
content: 随机数保留2位小数
user-0 提问: c语言初学者有哪些练手项目？

回复:
user: user-1
content: https://www.bilibili.com/video/BV1r741117xq大家看一下这个消灭病毒的小游戏适合小白学习吗

user: user-2
content: 很多啊，类似的图书馆管理系统，ftp文件传输系统，五子棋，推箱子

user: user-3
content: 网络编程，数据通信；数据库访问等等都可以试着写写。宾馆管理系统其实都可以包括前面的内容，就看你想写功能强大的还是写功能简单的管理系统

user: user-4
content: 贪吃蛇、俄罗斯方块这些的
user-0 提问: 带头节点的单链表的一个问题

回复:
user: user-1
content: 创建链表la，然后申请一个Lb链表头，让链表Lb也指向la->next;这样lb也可以访问链表a中的数据了。

user: user-2
content: enn……题目中“不要访问链表的任何细节”与“顺序读取la”好像矛盾吧

user: user-2
content: 引用 3 楼 gets_s 的回复：#include<iostream> using namespace std; #define N 5 typedef struct Lnode { 	int data; 	struct Lnode *next; }Lnode,*Linklist; //构造单链表La Linklist Createndlist1(int a[N]) { 	Linklist L; 	L = (Lnode*)malloc(sizeof(Lnode)); 	if (L == NULL) 	{ 		cout << "error"; 		exit(0); 	} 	else L->next = NULL; 	Linklist tail, p; 	tail = L; 	int j; 	for (j = 0; j < N; j++) 	{ 		p = (Lnode*)malloc(sizeof(Lnode)); 		if (p == NULL) 		{ 			cout << "error"; 			exit(0); 		} 		else p->next = NULL; 		p->data = a[j]; 		tail->next = p; 		tail = p; 	} 	tail->next = NULL; 	return L; } //构造单链表Lb Linklist CreatLinklist2(Linklist La) { 	Linklist Lb; 	Lb = (Lnode*)malloc(sizeof(Lnode)); 	if (Lb == NULL) 	{ 		cout << "error"; 		exit(0); 	} 	else Lb->next = NULL; 	Linklist p, q, t; 	p = La; 	q = p->next; 	t = Lb; 	while (q) 	{ 		p->next = q->next; 		q->next = NULL; 		t->next = q; 		t = q; 		q = p->next; 	} 	return Lb; } //输出链表 void putlist(Linklist L) { 	int i; 	Linklist p; 	p = L->next; 	while (p != NULL) 	{ 		cout << p->data << " "; 		p = p->next; 	} 	cout << endl; } int main() { 	int i ,a[N]; 	printf("请输入%d个链表元素的值:", N); 	for (i = 0; i < N; i++) 	{ 		cin >> a[i]; 	} 	Linklist La,Lb; 	La = Createndlist1(a); 	cout << "链表La为："; 	putlist(La); 	Lb = CreatLinklist2(La); 	cout << "链表Lb为："; 	putlist(Lb); 	return 0; }匆忙写出的代码，可能有bug😅😅

user: user-2
content: #include<iostream> using namespace std; #define N 5 typedef struct Lnode { 	int data; 	struct Lnode *next; }Lnode,*Linklist; //构造单链表La Linklist Createndlist1(int a[N]) { 	Linklist L; 	L = (Lnode*)malloc(sizeof(Lnode)); 	if (L == NULL) 	{ 		cout << "error"; 		exit(0); 	} 	else L->next = NULL; 	Linklist tail, p; 	tail = L; 	int j; 	for (j = 0; j < N; j++) 	{ 		p = (Lnode*)malloc(sizeof(Lnode)); 		if (p == NULL) 		{ 			cout << "error"; 			exit(0); 		} 		else p->next = NULL; 		p->data = a[j]; 		tail->next = p; 		tail = p; 	} 	tail->next = NULL; 	return L; } //构造单链表Lb Linklist CreatLinklist2(Linklist La) { 	Linklist Lb; 	Lb = (Lnode*)malloc(sizeof(Lnode)); 	if (Lb == NULL) 	{ 		cout << "error"; 		exit(0); 	} 	else Lb->next = NULL; 	Linklist p, q, t; 	p = La; 	q = p->next; 	t = Lb; 	while (q) 	{ 		p->next = q->next; 		q->next = NULL; 		t->next = q; 		t = q; 		q = p->next; 	} 	return Lb; } //输出链表 void putlist(Linklist L) { 	int i; 	Linklist p; 	p = L->next; 	while (p != NULL) 	{ 		cout << p->data << " "; 		p = p->next; 	} 	cout << endl; } int main() { 	int i ,a[N]; 	printf("请输入%d个链表元素的值:", N); 	for (i = 0; i < N; i++) 	{ 		cin >> a[i]; 	} 	Linklist La,Lb; 	La = Createndlist1(a); 	cout << "链表La为："; 	putlist(La); 	Lb = CreatLinklist2(La); 	cout << "链表Lb为："; 	putlist(Lb); 	return 0; }

user: user-0
content: 引用 1 楼 gets_s 的回复：为La申请工作指针p、q，为Lb申请工作指针t，用p、q遍历La时链到Lb上求大佬写一下下代码

user: user-2
content: 为La申请工作指针p、q，为Lb申请工作指针t，用p、q遍历La时链到Lb上
user-0 提问: arr只给了p三个整数，为啥能输出全部

回复:
user: user-1
content: 强制转换没问题，老式的编译器不会报错。

user: user-2
content: p = arr;类型不匹配。p指向的是列数3的二维数组。而arr是一维数组。

user: user-3
content: int *p[3]意思是三个整型的指针变量，而int (*p) [3] 相当于一个二维数组，下面那个输出是二维数组的输出方法。

user: user-1
content: 我说的有点儿问题，应该是每次输出3个，两次就够了

user: user-1
content: 2乘3得6啊 也就是说按一次输出两个，3次不就够了?
user-0 提问: 求大佬帮我解释这个C Primer Plus里的例子

回复:
user: user-1
content: 在命令行启动程序，如dir /p，这个/p就是命令行参数。 argc,argv是处理“命令行参数”的机制。

user: user-2
content: 你多用用控制台，就能明白命令行参数是什么了。 例如编译一个源文件，实际上要带很多命令行参数的

user: user-3
content: 如果你要问，命令行参数有什么意义。 你可以去搜索一下： ie命令行 参数启动 这些的话百度都能搜索到的。 你了解了这个ie命令行启动的例子后，就知道是什么用了

user: user-3
content: 你的代码是不是一个程序，一个过程（比较复杂的执行过程）。 一个过程是不是应当有输入和输出（输入（一种）状态执行后变为（另一种）输出状态）。  所以程序这个过程、这个广义的函数、方法。也可以给他提供一些输入参数的。  那么普通函数哪里来的参数呢？调用者给的参数。  那么程序哪里来的参数呢？操作系统给的参数。  最直观的是，通过命令行启动某个程序 即可给其main函数传递参数。
user-0 提问: c语言二维数组输入后输出为什么数值变了，输出地址是相同的地址，有大神看一下吗?

回复:
user: user-0
content: 我竟然没有看出地址相同的，所以我了解下二维数组内存占用就好了，谢谢

user: user-1
content: 二维数组本质是一段连续空间，未初始化尺寸的数组或者越界访问数组方式都是危险行为

user: user-1
content: q[0][1]和q[1][0]地址相同，对q[1][0]再次赋值就已经更改了q[0][1]空间的数值了

user: user-0
content: 引用 1 楼 user-1 的回复:数组大小要给确定值   除开数组没有定义的条件下 为什么计算机相同地址有数值后，没有其他操作的情况下数值会变化呢？

user: user-1
content: 数组大小要给确定值
user-0 提问: 单链表的建立与合并A与B链表，求大神找出问题所在

回复:
user: user-1
content: //这是我写的不过只能实现递增的合并 #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Lnode{ 	ElemType data; 	struct Lnode *next; }Lnode; typedef Lnode *LinkList; //初始化 int InisList(LinkList &L) { 	L = (LinkList)malloc(sizeof(Lnode)); 	if(!L) 	{ 		printf("初始化失败\n"); 		return 0; 	} 	L -> next = NULL; 	return 1; } //插入 int InsertList(LinkList &L,int i,ElemType e) { 	LinkList s,p; 	int j = 0; 	p = L; 	if(i < 1) 	{ 		printf("范围不合法\n"); 		return 0; 	} 	while(p && j < i - 1) 	{ 		p = p -> next; 		j ++; 	} 	if(!p) 	{ 		printf("插入失败\n"); 		return 0; 	} 	s = (LinkList)malloc(sizeof(Lnode)); 	if(!s) 	{ 		printf("插入失败\n"); 		return 0; 	} 	s -> data = e; 	s -> next = p -> next; 	p -> next = s; 	return 1;  }   //删除  int DeleteList(LinkList &L,int i,ElemType e)  {  	LinkList q,p;  	int j = 0;  	p = L;  	if(i < 1)  	{  		printf("系统查无成绩\n");  		return 0; 	} 	while(p && j < i - 1) 	{ 		p = p -> next; 		j ++; 	} 	if(!p || !(p -> next)) 	{ 		return 0; 	} 	q = p -> next; 	p -> next = q -> next; 	e = q -> data; 	free(q); 	return 1;    }    //查询   int GetElem(LinkList L,int i,ElemType &e)   {   	LinkList p;   	int j = 0;   	p = L;   	if(i < 1)   	{   		printf("查询失败，系统无资料\n");   		return 0;     }     while(p && j < i)     {     	p = p -> next;     	j ++; 	} 	if(!p) 	{ 		printf("查询失败，系统无资料\n");   		return 0; 	} 	e = p -> data; 	return 1;    }    //求链表的长度    int ListLength(LinkList L)    {    	int i = 0;    	LinkList p;    	p = L -> next;    	while(p)    	{    		i ++;    		p = p -> next;     }     return i; 	} 	//链表的合并  int MergeList(LinkList &L1,LinkList &L2,LinkList &L3)  {  	LinkList p1,p2,p3;  	p1 = L1 -> next;  	p2 = L2 -> next;  	p3 = L3 = L1;  	while(p1 && p2)  	{  		if(p1 -> data <= p2 -> data)  		{  			p3 -> next = p1;  			p3 = p1;  			p1 = p1 -> next; 		 } 		 else 		 { 		 	p3 -> next = p2; 		 	p3 = p2; 		 	p2 = p2 -> next; 		 } 	 } 	 p3 -> next = p1 ? p1 : p2; 	 free(L2); 	 return 1;  } int main() { 	LinkList L1,L2,L3; 	int num; 	int i; 	int temp; 	ElemType e; 	if(InisList(L1) && InisList(L2) && InisList(L3)) 	{ 		printf("初始化成功\n"); 		printf("请输入要为L1录入学生的人数:"); 		scanf("%d",&num); 		printf("请输入学生成绩(增序)\n"); 		for(i = 1;i <= num;i ++) 		{ 			scanf("%d",&e); 			if(InsertList(L1,i,e)) 			{ 				printf("插入成功\n"); 			} 		} 		printf("当前表长:%d\n",ListLength(L1)); 		printf("请输入要为L2录入学生的人数:"); 		scanf("%d",&num); 		printf("请输入学生成绩(增序)\n"); 		for(i = 1;i <= num;i ++) 		{ 			scanf("%d",&e); 			if(InsertList(L2,i,e)) 			{ 				printf("插入成功\n"); 			} 		} 		printf("当前表长:%d\n",ListLength(L2)); 		printf("两个增序链表合并\n"); 		if(MergeList(L1,L2,L3)) 		{ 			printf("合并成功\n"); 			for(i = 1;i <= ListLength(L3);i ++) 			{ 				if(GetElem(L3,i,e)) 		        { 			     printf("查询成功\n"); 			     printf("结果:"); 			     printf("%d\n",e); 		        }  			} 		} 		/*printf("请输要查询的位置:"); 		scanf("%d",&temp); 		if(GetElem(L,temp,e)) 		{ 			printf("查询成功\n"); 			printf("结果:"); 			printf("%d\n",e); 		 } */ 	 		 	} 	 }

user: user-1
content: 你好像没有初始化这个链表吧，链表没有空间，咋来放数据域和指针域
user-0 提问: 新手求助

回复:
user: user-0
content: 嗯嗯嗯，是有多个文件有main函数,已经不报错了

user: user-1
content: 是不是在一个项目里多个文件都是main函数？  还有scanf(里面\n去掉)

user: user-0
content: 引用 1 楼 ?Victor.??的回复:https://blog.csdn.net/qq_45861670/article/details/104015023  也许对你有帮助  没帮助的话建议贴一下代码 就这个，我看着也没错啊

user: user-0
content: 引用 1 楼 ?Victor.??的回复:https://blog.csdn.net/qq_45861670/article/details/104015023  也许对你有帮助  没帮助的话建议贴一下代码 #include <stdio.h> void PrintN(int N); int main() { int N; scanf("%d\n",&N) ; PrintN(N); return 0; } void PrintN(int N) {int i; for(i=1;i<=N;i++) {printf("%d\n",i); } return; }

user: user-1
content: https://blog.csdn.net/qq_45861670/article/details/104015023  也许对你有帮助  没帮助的话建议贴一下代码

user: user-2
content: 按你的代码我试了一下，我编译没问题但是跑不出结果不知道为啥
user-0 提问: 大佬解决一问题呗

回复:
user: user-0
content: 引用 1 楼 lin5161678的回复:洗牌  4个一组 完事 大佬，能教教吗

user: user-1
content: 题目规则没有写，不知道是否有这个需求，只能说出题太随意了

user: user-2
content: 引用 2 楼 ggglivw 的回复:男性和女性能分配到一个房子吗？感觉出题的人不严谨哦 的确是个问题 得男女分开 要么从输入限制男女人数都是 4的倍数 要么不是平均4人

user: user-1
content: 男性和女性能分配到一个房子吗？感觉出题的人不严谨

user: user-2
content: 洗牌  4个一组 完事

user: user-3
content: 哦 的确是个问题 得男女分开 要么从输入限制男女人数都是 4的倍数 要么不是平均4人

user: user-1
content: 引用 6 楼 千梦一生 的回复:其实吧，这玩意儿，可能就是出题人的意思。啥意思呢？就是让你自己去判断一些情况，就比如男女自然地在寻常的普遍的观念中住一个宿舍是要不得的。不是一个班的同学，如果可以的情况下，自然也是能分开就分开的，是吧。 明显是一个开放性的问题。 想的越全面，自然越好，分数都应该给你打高一点  话不能这么说，那么策划存在的意义是啥，是不是说我要一个魔兽世界，剩下的就全是程序员的问题了？

user: user-4
content: 其实吧，这玩意儿，可能就是出题人的意思。啥意思呢？就是让你自己去判断一些情况，就比如男女自然地在寻常的普遍的观念中住一个宿舍是要不得的。不是一个班的同学，如果可以的情况下，自然也是能分开就分开的，是吧。 明显是一个开放性的问题。 想的越全面，自然越好，分数都应该给你打高一点

user: user-4
content: 引用 2 楼 ggglivw 的回复:男性和女性能分配到一个房子吗？感觉出题的人不严谨 这个我喜欢
user-0 提问: c++  "%.3f%c%.3f=%.3f" 提示表达式必须含类类型 怎么解决

回复:
user: user-0
content: 引用 1 楼 user-1 的回复：最后一行print的参数错误， print(“%.3f%c%.3f=%.3f, data1, op, data2, r);//注意格式字符串之后是逗号，不是点号好了 谢谢🙏

user: user-0
content: 现在有提示这个

user: user-1
content: 最后一行print的参数错误， print(“%.3f%c%.3f=%.3f, data1, op, data2, r);//注意格式字符串之后是逗号，不是点号
user-0 提问: 能不能帮我解释一下什么意思啊

回复:
user: user-1
content: 引用 5 楼 weixin_46294972的回复:[quote=引用 4 楼 老英捉小奇的回复:][quote=引用 2 楼 weixin_46294972的回复:][quote=引用 1 楼 老英捉小奇的回复:]就是3位的意思，比如你输了12345,xyz那么输出a就是123，c就是4 那xyz是什么意思啊[/quote] 没啥意思啊，就是输入的时候，a是整型的，并且要求截取3位，那么123就赋值给了a，c是字符，接下来不管输入多少，就只是把4当做字符赋值给了c[/quote] 那c前面的3是什么意思啊[/quote] 没啥实质性的意义，不用管他，打个次方，如果scanf输入的是%c，那么随便输入一个按回车就会输出，如果scanf输入用的是%3c那么你随便输入一个再按回车是不会出结果的，这时候你按的回车相当于一个字符，还要再按回车才会有结果，你拿电脑试试就知道了

user: user-0
content: 引用 4 楼 老英捉小奇的回复:[quote=引用 2 楼 weixin_46294972的回复:][quote=引用 1 楼 老英捉小奇的回复:]就是3位的意思，比如你输了12345,xyz那么输出a就是123，c就是4 那xyz是什么意思啊[/quote] 没啥意思啊，就是输入的时候，a是整型的，并且要求截取3位，那么123就赋值给了a，c是字符，接下来不管输入多少，就只是把4当做字符赋值给了c[/quote] 那c前面的3是什么意思啊

user: user-1
content: 引用 2 楼 weixin_46294972的回复:[quote=引用 1 楼 老英捉小奇的回复:]就是3位的意思，比如你输了12345,xyz那么输出a就是123，c就是4 那xyz是什么意思啊[/quote] 没啥意思啊，就是输入的时候，a是整型的，并且要求截取3位，那么123就赋值给了a，c是字符，接下来不管输入多少，就只是把4当做字符赋值给了c

user: user-0
content: 引用 1 楼 老英捉小奇的回复:就是3位的意思，比如你输了12345,xyz那么输出a就是123，c就是4 那xyz是什么意思啊

user: user-1
content: 就是3位的意思，比如你输了12345,xyz那么输出a就是123，c就是4
user-0 提问: c语言

回复:
user: user-1
content: 引用 5 楼 北极光~ 的回复:[quote=引用 4 楼 5250 的回复:] [quote=引用 2 楼 qq_45916742 的回复:] [quote=引用 1 楼 user-3的回复:]建议你用gcc， windows的话，装个MINGW，迷你型的虚拟机 很轻便 Codeblocks咋样？？[/quote]  挺好 我们刚开始学的时候 都用那个[/quote]初学还是老手，应该是新手，老手不会问这种无聊的问题。 初学用Dev-c++挺好的，地带MinGW，不需要配置太多，直接选择中文版，没有任何问题，还推荐VScode，只不过配置比较麻烦，配置好了比IDE还要好！[/quote]自带，不是地带

user: user-1
content: 引用 4 楼 5250 的回复:[quote=引用 2 楼 qq_45916742 的回复:] [quote=引用 1 楼 user-3的回复:]建议你用gcc， windows的话，装个MINGW，迷你型的虚拟机 很轻便 Codeblocks咋样？？[/quote]  挺好 我们刚开始学的时候 都用那个[/quote]初学还是老手，应该是新手，老手不会问这种无聊的问题。 初学用Dev-c++挺好的，地带MinGW，不需要配置太多，直接选择中文版，没有任何问题，还推荐VScode，只不过配置比较麻烦，配置好了比IDE还要好！

user: user-2
content: 引用 2 楼 qq_45916742 的回复:[quote=引用 1 楼 user-3的回复:]建议你用gcc， windows的话，装个MINGW，迷你型的虚拟机 很轻便 Codeblocks咋样？？[/quote]  挺好 我们刚开始学的时候 都用那个

user: user-3
content: 引用 2 楼 qq_45916742 的回复：[quote=引用 1 楼 user-3的回复:]建议你用gcc， windows的话，装个MINGW，迷你型的虚拟机 很轻便 Codeblocks咋样？？[/quote]没用过哦，这是一个集成开发环境，他实际上也是用第三方编译器，比如gcc和vc

user: user-0
content: 引用 1 楼 user-3的回复:建议你用gcc， windows的话，装个MINGW，迷你型的虚拟机 很轻便 Codeblocks咋样？？

user: user-3
content: 建议你用gcc， windows的话，装个MINGW，迷你型的虚拟机 很轻便
user-0 提问: 小白的疑问－为什么ShowListData函数中需要head=head－＞next，哪一步说明head==NULL？

回复:
user: user-0
content: 引用 3 楼 一晴方觉夏已深的回复:[quote=引用 2 楼 山师19计算机小毛孩 的回复:] [quote=引用 1 楼 一晴方觉夏已深的回复:]你肯定得移动指针，才能遍历整个链表中的每个节点啊 当指针移动到了最后一个元素，打印以后指针再往后移动，最后一个节点的后继是NULL 我想问循环外那句[/quote]  因为这个链表是有头结点的，头结点是不储存数据的，所以得把指针移动到第一个节点再打印[/quote] 好的谢谢您嘞

user: user-0
content: 引用 3 楼 一晴方觉夏已深的回复:[quote=引用 2 楼 山师19计算机小毛孩 的回复:] [quote=引用 1 楼 一晴方觉夏已深的回复:]你肯定得移动指针，才能遍历整个链表中的每个节点啊 当指针移动到了最后一个元素，打印以后指针再往后移动，最后一个节点的后继是NULL 我想问循环外那句[/quote]  因为这个链表是有头结点的，头结点是不储存数据的，所以得把指针移动到第一个节点再打印[/quote] 好的谢谢您嘞

user: user-1
content: 引用 2 楼 山师19计算机小毛孩 的回复:[quote=引用 1 楼 一晴方觉夏已深的回复:]你肯定得移动指针，才能遍历整个链表中的每个节点啊 当指针移动到了最后一个元素，打印以后指针再往后移动，最后一个节点的后继是NULL 我想问循环外那句[/quote]  因为这个链表是有头结点的，头结点是不储存数据的，所以得把指针移动到第一个节点再打印

user: user-0
content: 引用 1 楼 一晴方觉夏已深的回复:你肯定得移动指针，才能遍历整个链表中的每个节点啊 当指针移动到了最后一个元素，打印以后指针再往后移动，最后一个节点的后继是NULL 我想问循环外那句

user: user-1
content: 你肯定得移动指针，才能遍历整个链表中的每个节点啊 当指针移动到了最后一个元素，打印以后指针再往后移动，最后一个节点的后继是NULL
user-0 提问: 可以把一个实数赋给整型变量吗

回复:
user: user-1
content: 浮点数赋值给整型数据，可以认为是取整运算。

user: user-2
content: 引用 3 楼 Mawkish_ 的回复:会自动四舍五入吗 不会  这种问题自己试试就知道了

user: user-0
content: 会自动四舍五入吗

user: user-3
content: 整形变量只会接收到实数的整数部分，你要全部赋值的话就赋给个float或者double

user: user-4
content: 可以，变量的值为实数的整数部分
user-0 提问: 求助 PAT 乙级1045 测试点35过不了

回复:
user: user-1
content: 引用 4 楼 939493 的回复:引用 3 楼 user-1 的回复：楼主你弄明白了没啊，我测试点3和5也通过不了，不知道哪里错了。。。通过了。 你想想看有没有那种可能就是它中间某个数刚好跟排序后的数相等  但是这个数并不是主元好的，我去试试，谢谢楼主~

user: user-0
content: 引用 3 楼 user-1 的回复：楼主你弄明白了没啊，我测试点3和5也通过不了，不知道哪里错了。。。通过了。 你想想看有没有那种可能就是它中间某个数刚好跟排序后的数相等  但是这个数并不是主元

user: user-1
content: 楼主你弄明白了没啊，我测试点3和5也通过不了，不知道哪里错了。。。

user: user-0
content: 想了好久没想明白

user: user-0
content: 题目要求如下 著名的快速排序算法里有一个经典的划分过程：我们通常采用某种方法取一个元素作为主元，通过交换，把比主元小的元素放到它的左边，比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列，请问有多少个元素可能是划分前选取的主元？  例如给定 $N = 5$, 排列是1、3、2、4、5。则：  1 的左边没有元素，右边的元素都比它大，所以它可能是主元； 尽管 3 的左边元素都比它小，但其右边的 2 比它小，所以它不能是主元； 尽管 2 的右边元素都比它大，但其左边的 3 比它大，所以它不能是主元； 类似原因，4 和 5 都可能是主元。 因此，有 3 个元素可能是主元。  输入格式： 输入在第 1 行中给出一个正整数 N（≤10 ​5 ​​ ）； 第 2 行是空格分隔的 N 个不同的正整数，每个数不超过 10 ​9 ​​ 。  输出格式： 在第 1 行中输出有可能是主元的元素个数；在第 2 行中按递增顺序输出这些元素，其间以 1 个空格分隔，行首尾不得有多余空格。  输入样例： 5 1 3 2 4 5              输出样例： 3 1 4 5
user-0 提问: 交换函数问题

回复:
user: user-1
content: 引用 4 楼 zedd3337502212 的回复:引用 3 楼 千梦一生 的回复:[quote=引用 2 楼 zedd3337502212 的回复:] [quote=引用 1 楼 早打大打打核战争 的回复:] D，A的p是野指针可是括号里不是对*p进行赋值了吗？还是说赋值的只是野指针的地址的值？ *p = *x意思是将指针x所指向的位置的int值，赋值给，指针p所指向的位置中。那么此时p所指向的位置是哪里呢？[/quote] 那么也就是说p指向的位置还是那个野指针的地址，只不过是那个地址所指向的int值被改变了[/quote]  p的值就是一个地址。p其实就是一个特殊的int（准确的说法说是int也不太好，准确的说法是4B的空间、或者8B），专门用来存储地址的int。   那么此时p所指向的位置是哪里呢？<=>这个p的值是哪儿的地址呢？不知道，可能是任何地方。 随便说一个，比如说 是0x12345678这里。那执行*p = 3；就是向0x12345678这里开始的int（指针的类型）长度（即：4B,也可能是8B）中把值写为3。

user: user-0
content: 引用 3 楼 千梦一生 的回复:引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 早打大打打核战争 的回复:] D，A的p是野指针可是括号里不是对*p进行赋值了吗？还是说赋值的只是野指针的地址的值？ *p = *x意思是将指针x所指向的位置的int值，赋值给，指针p所指向的位置中。那么此时p所指向的位置是哪里呢？[/quote] 那么也就是说p指向的位置还是那个野指针的地址，只不过是那个地址所指向的int值被改变了

user: user-1
content: 引用 2 楼 zedd3337502212 的回复:引用 1 楼 早打大打打核战争 的回复:D，A的p是野指针可是括号里不是对*p进行赋值了吗？还是说赋值的只是野指针的地址的值？ *p = *x意思是将指针x所指向的位置的int值，赋值给，指针p所指向的位置中。那么此时p所指向的位置是哪里呢？

user: user-0
content: 引用 1 楼 早打大打打核战争 的回复:D，A的p是野指针可是括号里不是对*p进行赋值了吗？还是说赋值的只是野指针的地址的值？

user: user-2
content: D，A的p是野指针
user-0 提问: 从1加到100的结果总不对

回复:
user: user-0
content: 引用 3 楼 潇湘游子的回复:这错误就犯的低级了！你输出的数据都不指定，这是个位置的数据 是啊，好低级的错误

user: user-0
content: 引用 2 楼 chxchxkkk的回复:printf("sum的值等于：%d\n", sum); 谢谢指正，我还是太粗心了

user: user-0
content: 引用 1 楼 user-4的回复:输出代码错了，双引号把sum括起来了。 这种小错误实在是不应该

user: user-1
content: 你的双引号把sum业扩进去了。所以输出的是一个随机值吧。注意检查一下你的printf

user: user-2
content: 这错误就犯的低级了！你输出的数据都不指定，这是个位置的数据

user: user-3
content: printf("sum的值等于：%d\n", sum);

user: user-4
content: 输出代码错了，双引号把sum括起来了。
user-0 提问: 求助大佬，测试点6一直过不了，恳求看一下代码

回复:
user: user-0
content: 希望审核快点通过啊啊啊啊

user: user-0
content: 好了，我知道了，是头文件的问题，给跪了

user: user-1
content: #include<stdio.h>改成#include <cstdio>
user-0 提问: C语言编译出错

回复:
user: user-1
content: 感觉这种字体好奇怪

user: user-0
content: 引用 1 楼 真相重于对错的回复:注意拼写错误。。。。。 OK 谢谢😜

user: user-2
content: 注意拼写错误。。。。。
user-0 提问: 求救急

回复:
user: user-1
content: 引用 2 楼 GKatHere的回复:还用递归吗？ 解方程：v0 *t = 1/2 *g*t*t，就行了 用C语言编程，就是不知道怎么写

user: user-2
content: 还用递归吗？ 解方程：v0 *t = 1/2 *g*t*t，就行了

user: user-3
content: 能量守恒和加速度定律就可以算出来了？难道你还要推导过程？
user-0 提问: 将文件中的信息读入到单链表person中

回复:
user: user-1
content: #include <stdio.h>  void scanfCareer(struct career **person) { 	struct career tmp, *p, *pnew;  	FILE *fp; 	if ((fp=fopen("car.text","r"))==NULL) { 		printf("打开文件失败了……6666!\n"); 		exit(1); 	} 	pnew = (struct career *)malloc(sizeof(struct career)); 	if (!pnew) 		exit(1); 	while((fscanf(fp, "%s%s%s", pnew->c_num,pnew->c_nam,pnew->c_car))==3) { 		if (*person == NULL) { 			*person = pnew; 			pre = pnew; 		} else { 			pre->next = pnew; 			pre = pnew; 		} 		pnew = (struct career *)malloc(sizeof(struct career)); 		if (!pnew) 			exit(1); 	} 	free(pnew); 	pre->next = NULL; #if 0  	struct career *p ; 	struct career *mp; 	struct career *temp;  	FILE *fp; 	if ((fp=fopen("car.text","r"))==NULL) 	{ 		printf("打开文件失败了……6666!\n"); 		exit(1); 	}  	while((fscanf(fp,"%s%s%s",p->c_num,p->c_nam,p->c_car))==3) 	{ 		if(pool !=NULL) { 			mp=pool; 			pool=pool->next; 			count--; 		} 		//内存池为空时 		else 		{ 			mp=(struct career *)malloc(sizeof(struct career)); 			if (mp==NULL) 			{ 				printf("Failure 内存分配失败\n"); 				exit(1); 			} 		} 		mp=p;  		if (*person!=NULL) 		{  			temp=*person; 			*person=mp; 			mp->next =temp;  		} 		else 		{ 			*person =p; 			p->next =NULL; 		}    	} #endif 	fclose(fp);  }  int main {  	struct career *person=NULL; 	scanfCareer(&person); } 供参考～  你的p是野指针，怎么可以直接使用呢？
user-0 提问: 为什么字符指针地址传入printf函数后指针自动初始化为0？以至进入不了for循环。

回复:
user: user-1
content: 引用 5 楼 egtre678 的回复:[quote=引用 4 楼 user-3 的回复:] s1没赋初始值，属于野指针，也就是垃圾内存信息，所以它的值是不确定的，可能是0，也可能能不是0，这取决于main函数栈当时的内存信息 而且指针和0不能这么比较，要用NULL来比较 for(; s1!=NULL;)  那为什么，另外NULL不是等于0吗？[/quote]  说实话我没明白你的意思，什么是“打印printf("%d",s1);指针不会被初始化为0” 另外，s1!=0和s1!=NULL是等价的。用for (;s1;)也没问题。

user: user-2
content: 是不是因为不应该取地址啊？久了没用过了，我猜的 printf("%x",&s1); 改成 printf("%x",s1); 这个？

user: user-3
content: 不同类型的指针不能用来比较，除非强行转换。 有些编译器可能s1!=0还不能编译通过。 NULL虽然值为0，但类型和意义不一样，NULL是空指针，也就是适用于各种指针类型，因为不管哪种指针类型都有空指针。 所以你这样比较属于未定义行为，你无法知晓编译器会运行出什么结果。 参考以下链接未定义行为第7条 https://m.jb51.net/article/105305.htm

user: user-0
content: 引用 4 楼 user-3 的回复:s1没赋初始值，属于野指针，也就是垃圾内存信息，所以它的值是不确定的，可能是0，也可能能不是0，这取决于main函数栈当时的内存信息 而且指针和0不能这么比较，要用NULL来比较 for(; s1!=NULL;)  那为什么打印printf("%d",s1);指针不会被初始化为0，另外NULL不是等于0吗？

user: user-3
content: s1没赋初始值，属于野指针，也就是垃圾内存信息，所以它的值是不确定的，可能是0，也可能能不是0，这取决于main函数栈当时的内存信息 而且指针和0不能这么比较，要用NULL来比较 for(; s1!=NULL;)

user: user-0
content: 引用 1 楼 均陵鼠侠 的回复:for(;s1!=0;)   你怎么知道 第一次进入for时，s1的值非0  因为调试过，所以打印&s1时进入for的值是0。

user: user-1
content: for(;s1!=0;)   你怎么知道 第一次进入for时，s1的值非0
user-0 提问: 怎么才算死循环呢？

回复:
user: user-1
content: 整形数据的大小也是有范围的，超出了范围就结束了

user: user-2
content: k 是int类型 这个循环最后会导致 k 溢出 有符号类型溢出是未定义行为  结果没意义 具体在这里 可能死循环可能不会 出题人水平太低胡乱扯的 不用管 如果k是无符号类型这题目就没什么问题

user: user-3
content: for(k = 1; k--; k++)printf("%d ", k); 这样应该能死掉

user: user-4
content: 注意k是有范围的：-2,147,483,648~2,147,483,647。因此k++总会变成0.

user: user-5
content: 0x00000001 0x00000002 ... ... 0xFFFFFFFF 0x00000000  GAME OVER !!

user: user-6
content: 死循环就是程序一直周期性的运行某段指令，永远不会停止，图中所给语句不算是死循环，因为判断条件k是int类型，k不会一直增大，当k超过了它的最大表示边界，会从另一个负边界开始增长，然后当增长到0的时候，结束循环
user-0 提问: 排序

回复:
user: user-1
content: 老铁，今天好不容易休息所以没看帖子。 我刚才试了一下：把M-1改成n-1,然后穿n的时候传5（数组元素个数），然后结果是对的。 解释：for循环一边之后，最小的已经在前面了，所以你a+1，但是你下次再进入pxfunc2中的循环再用M-1作为下标就越界了（因为这时候你的数组元素个数相当于减少了1，因为你a+1了嘛。you know?）

user: user-0
content: 引用 1 楼 脏不张的回复:[quote=引用 楼主 qq_45883336的回复:]升序。 为啥不能达到预期效果？俺小白。 #include <stdio.h> #define M 5 int pxfunc2 (int a[],int n) { 	if(n==0) 		return 0;  	int j,m; 	for(j=M-1;j>0;j--) 		if(a[j]<a[j-1])  		{ 			m=a[j]	; 			a[j]=a[j-1]; 			a[j-1]=m; 		} 	pxfunc2(a+1,n-1);//每运行一次把最小的值放在数组的最前面  } int main() { 	int a[M]={3,1,2,9,8}; 	pxfunc2(a,3); 	for(int q=0;q<M;q++) 		printf("%2d",*(a+q)); } n是数组元素数量吗，pxfunc2中M换成n试下。还有main中n为啥传了个3[/quote] 3到0是四次，五个数只需要递归四次就行。俺是这样想的

user: user-2
content: n应该是数组的长度吧，传个3是想把数组第一个元素的值传进去？

user: user-1
content: 引用 楼主 qq_45883336的回复:升序。 为啥不能达到预期效果？俺小白。 #include <stdio.h> #define M 5 int pxfunc2 (int a[],int n) { 	if(n==0) 		return 0;  	int j,m; 	for(j=M-1;j>0;j--) 		if(a[j]<a[j-1])  		{ 			m=a[j]	; 			a[j]=a[j-1]; 			a[j-1]=m; 		} 	pxfunc2(a+1,n-1);//每运行一次把最小的值放在数组的最前面  } int main() { 	int a[M]={3,1,2,9,8}; 	pxfunc2(a,3); 	for(int q=0;q<M;q++) 		printf("%2d",*(a+q)); } n是数组元素数量吗，pxfunc2中M换成n试下。还有main中n为啥传了个3
user-0 提问: 内存释放问题

回复:
user: user-1
content: 引用 4 楼 tiyager 的回复:[quote=引用 2 楼 ggglivw 的回复:] new 的需要delete, malloc的需要free，其他的看你逻辑实现，你别混用，你这个接口设计的不好，提供了分配就要给别个提供destroy。别个不管你内部实现，这个是你的事情 你的意思是函数如果malloc了就应该在函数内部free掉，对吧。不应该作为返回值，让别人释放是吧[/quote] 1L说得对。动态分配的内存才需要用free()函数手动释放，动态内存即使用 malloc calloc 函数等方式 申请的内存，自动分配的不需要，程序会自动释放。 2L的意思应该是，一个接口内会包括多个函数，只要在这个接口内部释放掉就行了，并不是说一个函数内malloc开辟出来的空间就一定要在该函数内释放。事实上一般会设计一个函数专门malloc，一个函数专门用来free。像这种在main函数内malloc开辟的空间，不一定要手动free，因为main函数结束后，系统会自动回收掉这些空间。但是在大型的程序里面，程序一运行可能会花很长时间，甚至不会停下来。所以这时候就要及时释放掉这些空间，避免发生内存溢出。 因此如果是这种测试用的小程序，free不free都没什么关系，但是养成习惯最好还是释放掉。

user: user-2
content: 引用 4 楼 tiyager 的回复:[quote=引用 2 楼 ggglivw 的回复:] new 的需要delete, malloc的需要free，其他的看你逻辑实现，你别混用，你这个接口设计的不好，提供了分配就要给别个提供destroy。别个不管你内部实现，这个是你的事情 你的意思是函数如果malloc了就应该在函数内部free掉，对吧。不应该作为返回值，让别人释放是吧[/quote]  不是，你可以自己内部malloc，然后将内存交出去给外部用，但是外部如果不用了要调用你自己的destroy将内存还给你，你拿到以后free，当然你要做验证，比如重复归还，还的东西不是你交出去的，等等

user: user-0
content: 引用 2 楼 ggglivw 的回复:new 的需要delete, malloc的需要free，其他的看你逻辑实现，你别混用，你这个接口设计的不好，提供了分配就要给别个提供destroy。别个不管你内部实现，这个是你的事情 你的意思是函数如果malloc了就应该在函数内部free掉，对吧。不应该作为返回值，让别人释放是吧

user: user-3
content: 记得如果new [] 就要用delete []

user: user-2
content: new 的需要delete, malloc的需要free，其他的看你逻辑实现，你别混用，你这个接口设计的不好，提供了分配就要给别个提供destroy。别个不管你内部实现，这个是你的事情

user: user-4
content: 引用 楼主 tiyager 的回复: #include <stdio.h> #include <string.h> #include <stdlib.h>  char* proc_usr_name(const char* uid){     uid_t my_uid;     my_uid = atoi(uid);     struct passwd *my_info;     if(my_uid)         my_info = getpwuid( my_uid );     if(my_info)         return my_info->pw_name ;  //my_info需要这样释放吗？ 为什么？     return "N/A"; } int main(){ 	char* str = proc_usr_name("1"); 	printf("str:%s\n",str); 	free(str)//需要这样释放吗 ？ 为什么？ 	return 0; }   有的时候调用的函数返回char*那这个内存需不需要释放，不是很明白。   动态分配的内存才需要用free()函数手动释放，动态内存即使用 malloc calloc 函数等方式 申请的内存，自动分配的不需要，程序会自动释放。
user-0 提问: c语言

回复:
user: user-1
content: char id[m]; char name[m]; 这两个字符数组能存储 n 个学生的学号和姓名吗？ 建议用结构体数组来存储学生信息

user: user-2
content: char id[m]; char name[m]; 这里错了，两个id，如果id不是一个数的话，应该是二维数组id[2][m];name[2][m]； 这里错了导致你输出的时候 printf("%s %s %.1f %.1f %.1f\n",id[k],name[k],a[k],b[k],c[k]);这里也错了 应该是printf("%s %s %.1f %.1f %.1f\n",&id[k][0],&name[k][0],a[k],b[k],c[k]);  for(i=0;i<n;i++) { sum1=a[i]+b[i]+c[i]; if(sum1>sum2) { sum2=sum1; k=i; } } 这里错了，两次都是用的sum1算的总分。    两个id 应该是个二维数组
user-0 提问: 解决一个问题呗，就是C语言中字符串常量，'

回复:
user: user-1
content: 两个\得到一个\， 所以，"\\\"先得到"\\"，再得到"\"； \"得到一个双引号，但这个双引号不被认为是用于结束字面串，所以这个串缺少一个配对的 "

user: user-0
content: 我要成为你的铁粉，

user: user-2
content: \是转义符，就是把\后面的字符转义，比如\t是tab符，\n是换行符。所以单独一个\的字符串（”\”）会出错，因为它把\后面的”转义了。 想得到一个\字符串，就要”\\” “\\\”前两个\\得到一个\，后一个\把”转义了，所以“\\\”是错的。
user-0 提问: 输出大于X的n个素数，不知道为什么没有输出结果，想问问怎么改

回复:
user: user-0
content: 啊！谢谢改对了   那为什么不可以是==呢

user: user-1
content: while(count==n) 改为while(count<n) 这样while循环的内部才能运行

user: user-2
content: 引用 2 楼 Vennus? 的回复:啊！谢谢改对了   那为什么不可以是==呢   你输入的n非0的话 n!=count(0)，while循环永远进不去  所以没有输出
user-0 提问: C中嵌入汇编，有没有有经验的老师提示我一下，谢谢啦

回复:
user: user-0
content: https://docs.microsoft.com/en-us/cpp/assembler/inline/using-and-preserving-registers-in-inline-assembly?view=vs-2019 这里对我的问题进行了解释，

user: user-1
content: 解决这个问题，首先要把汇编学好。。。。。。

user: user-1
content: 引用 9 楼 千梦一生 的回复:哈哈，我个人的观点是多知道些知识总是好的。不能在思想上就将自己拘泥与任何地方。 就像老师说的，我觉得一个java、.net程序员真的能问出这个问题的时候就至少已经说明在思考，就算不考虑到内存泄漏，也会在实际应用中面临资源调度的问题，内存其实就是资源啊。干好本职的工作、且专精，那毋庸置疑值得称赞。只是我也同样觉得保持有发现问题、且尝试解决问题的精神也是应该做的。就像不学好基础的人，真的很难说能搞透彻上层的问题。 最后，还是要谢谢两位老师的回复与提出的一些建议。 俗话说学而不思则罔，你的问题不是在于你去思考，思考当然对，关键在于思考的方向，有个成语叫南辕北辙，可以百度一下， 汇编如过做好的话，对于计算机几乎无所不能。所以你说用汇编如何避免寄存器错误，除了把计算机基础结构和汇编学好，几乎没有办法。就好比一个小孩子，给他一把枪，却去告诉问别人如何避免伤到他自己一个样子。。。。。。。。

user: user-0
content: 哈哈，我个人的观点是多知道些知识总是好的。不能在思想上就将自己拘泥与任何地方。 就像老师说的，我觉得一个java、.net程序员真的能问出这个问题的时候就至少已经说明在思考，就算不考虑到内存泄漏，也会在实际应用中面临资源调度的问题，内存其实就是资源啊。干好本职的工作、且专精，那毋庸置疑值得称赞。只是我也同样觉得保持有发现问题、且尝试解决问题的精神也是应该做的。就像不学好基础的人，真的很难说能搞透彻上层的问题。 最后，还是要谢谢两位老师的回复与提出的一些建议。

user: user-1
content: 看到这个问题，我想到一个习惯java，.net的程序员，来问c++如何保证内存不泄露。

user: user-2
content: 写判断呗 je jnz  可能我说的也不对 但是我平时判断寄存器的值都是写判断

user: user-0
content: 引用 5 楼 千梦一生 的回复:[quote=引用 4 楼  的回复:] DWORD a = 0; __asm{ mov eax,1 mov a,eax } a = 1了 用变量来存放          其实我想的问题是  function（） { ... __asm { mov eax,1//您这里使用了通用寄存器eax。可是用的时候，该eax内的值是否有意义。如果有意义，却在这里直接用1进行了覆盖，那不得凉凉吗? mov a,eax } ... }[/quote]  因为这里是在程序可能任意位置嵌入的汇编。并非从头到尾写完的汇编。不知道此时的处在一个怎样的上下文环境中，无法肯定某寄存器的值是否有效。所以我就想问一问大佬们是怎么处理这种问题的。刚刚找到了前辈们的解释，说在嵌入的__asm块中，一般而言不用担心这种情况发生，因为编译器会尽量避开你使用的寄存器。或者不行的话，它会帮助程序员在首位去push/和pop的

user: user-0
content: 引用 4 楼  的回复:DWORD a = 0; __asm{ mov eax,1 mov a,eax } a = 1了 用变量来存放          其实我想的问题是  function（） { ... __asm { mov eax,1//您这里使用了通用寄存器eax。可是用的时候，该eax内的值是否有意义。如果有意义，却在这里直接用1进行了覆盖，那不得凉凉吗? mov a,eax } ... }

user: user-0
content: 一般而言，嵌入汇编块的话，不是特殊情况下，这种问题编译器会考虑如何解决的。 即，就是否保护寄存器、如何保护寄存器，将由编译器去做。 push 、pop确实属于常见方式之一

user: user-2
content: DWORD a = 0; __asm{ mov eax,1 mov a,eax } a = 1了 用变量来存放
user-0 提问: C语言循环的题目，不知道哪里有问题

回复:
user: user-0
content: 我知道哪里错了，不是在针对x输出后面的三个数，要找出的是三个素数

user: user-0
content: 4 4的话也应该输出4个素数，不是两个

user: user-1
content: 很忌讳在for的时候修改终止迭代条件的值. 有可能造成死循环

user: user-0
content: 就是我要是输入 6 3 结果只有7，不能返回正确的结果

user: user-2
content: 不知你出的是啥问题，是没有输出？还是结果不符合要求？用你的代码跑了一下，能正常输出。  #include <stdio.h>  int main(void) { 	int x,n,i,j; 	scanf("%d%d",&x, &n); 	for (i=1; i<=n; i++) 	{ 		++x; 		for (j=2; j<=x; j++) 		{ 			if (x % j == 0) 			   break;		     		} 		if (x==j) 		    printf("%d ", x); 	} 	return 0; }
user-0 提问: 大佬们，我在VS2017上面弄opencv时出现的问题，该怎么解决啊，谢谢啦

回复:
user: user-0
content: 你创建的项目类型是Xaml::Application 不要修改系统自动给你生成的函数   引至大佬：每个人都有一个梦才不会孤单的说话就有天堂 问题已解决
user-0 提问: 推箱子如何进入下一关，出现点问题，为什么我的两次判断箱子数的代码不行求各位大佬指点

回复:
user: user-0
content: 引用 1 楼 user-1的回复:没有项目背景，没有数据，例子 强撸不完整的代码，真的浪费时间，一般人不会干 谢谢，受教了

user: user-1
content: 没有项目背景，没有数据，例子 强撸不完整的代码，真的浪费时间，一般人不会干
user-0 提问: 求助

回复:
user: user-0
content: 引用 1 楼 user-1的回复:题外话 1，首先你传进来的这个head，没法把链表返回出去 2.，就一个简单的链表操作而言，你的代码写得太复杂了，千回百转，各种绕，虽然最后看起来是链起来了        但是让人看得头疼，相信你自己再过一遍也是头疼 3.   描述问题的时候也没说清楚，循环怎么个无法停止，       是输入停不了，还是输出 言归正传  应该是输入吧，从你的scanf("%s", new->id);来推断，这个id应该是个字符数组 然后下面的循环 while(new->id != '#') 这里new->id是什么，数组的名字，是一个指针变量对不对， new->id就是id这个字符数组的首地址， 这个条件判断就是判断一个指针值会不会等于'#'这个字符，， 明显怎么样都不会相等，所以这个语句永远为真。  这种语句编译器应该是会给你告警的，你重新编译下应该能看到  你把他改成while(new->id[0] != '#')应该就OK了 好的我试试，非常感谢你

user: user-1
content: 题外话 1，首先你传进来的这个head，没法把链表返回出去 2.，就一个简单的链表操作而言，你的代码写得太复杂了，千回百转，各种绕，虽然最后看起来是链起来了        但是让人看得头疼，相信你自己再过一遍也是头疼 3.   描述问题的时候也没说清楚，循环怎么个无法停止，       是输入停不了，还是输出 言归正传  应该是输入吧，从你的scanf("%s", new->id);来推断，这个id应该是个字符数组 然后下面的循环 while(new->id != '#') 这里new->id是什么，数组的名字，是一个指针变量对不对， new->id就是id这个字符数组的首地址， 这个条件判断就是判断一个指针值会不会等于'#'这个字符，， 明显怎么样都不会相等，所以这个语句永远为真。  这种语句编译器应该是会给你告警的，你重新编译下应该能看到  你把他改成while(new->id[0] != '#')应该就OK了
user-0 提问: 请问我这个C程序要怎么改？

回复:
user: user-0
content: 谢谢你的用心，对于一个初学者来说帮助很大！

user: user-1
content: 你混淆了两个数组，关于学生的结构数组，和每个学生自己的分数数组， 你的代码试图把这2个交叉的数组组成一个二维数组，思维上混乱了    暂且抛去设计上的逻辑问题，你定义的函数int aver(int scores[5][4]) 这个函数实际只有一个参数，就是二维数组（指针），你调用的时候却传4个参数进去，这本身也是一个问题  言归正传，先做需求分析，你对需求的理解应该是错误的 平均分，一般来说是针对一门课程的群体的平均分，而不是针对一个人来计算，（你代码里计算的是个人的4门平均分） 比如英语，数学，大学里数学假设是百分制，英语是150分制， 你计算个人的平均分没什么意义 一般统计的是一个班级的某科的平均分， 或者更一般的，所有人总分的平均分  为了使问题简单化，就不做太多复杂的东西了，供参考，可以对照下 #include <stdio.h> #include <stdlib.h>  /* 为了不使问题复杂化，沿用你的思路 scores[0],[1] [2] [3]分别代表  线代 微积分 程序设计 英语  ----  但是从设计思想来看，这是不好的，  隐含信息，这种对应关系只有你知道  没法用程序去约束他，建立对应关系  对于初学语言特性的你来说，先这样吧 */ struct student_st {     int num;     char name[16];     char sex;     int age;     int scores[4]; }; typedef struct student_st student;  /*根据student集合，计算每门功课平均分 存储到avg_score中, 这里其实有一些设计细节，比如要使用本 函数，传入的数组要能装得下student的课程数 更由甚者，这里默认用严格的一一对应关系， 留给你去思考吧，这些思考能帮助你设计出 更好的软件 */ int aver(student *s, double *avg_score) //与aver(student s[], int avg_score[])是一样的 {     int sum = 0;     for (int i = 0; i < 4; i++) //4门课程，按课程平均     {         sum = 0; //每次都要初始化，不然就会累加到上次的结果了         for (int j = 0; j < 5; j++)         {             /*嵌套关系，数组里包含数组，逐层解开访问它就好了             要访问第j个学生的数据怎么办，先s[j],             第j个学生的分数呢, s[j].score*/             /*             这里恶搞一下，指针真有你想的那么优雅高级？              */             sum += *((s + j)->scores + i); //使用s[j].scores[i];搞定, 经常来说用下标访问数组使你生活更容易些         }         *(avg_score + i) = (double)sum / 5; //avg_score[i] = sum / 4.0;         //printf("第%d门课程的平均成绩: %f\n", i + 1, *(avg_score + i));     } } int main() {     int ret;     /*分行对齐，好看些，护眼护脑     很快就发现问题，名字里有空格     帮你把数据改了一下，体现出你程序的价值，     能计算平均分，不然分数都一样，不用算都知道平均分了     最后愿你成为最后那个学霸，送你了female，女的！*/     student stu[5] = {{1, "小周", 'm', 19, 81, 40, 70, 84},                       {136, "小黄", 'm', 19, 40, 50, 88, 30},                       {137, "小郑", 'm', 19, 60, 20, 89, 0},                       {13822, "小小", 'm', 19, 80, 70, 66, 77},                       {139, "小朱", 'f', 20, 97, 100, 99, 99}};     student *p;     printf("\n-------------------------------学生信息总览-------------------------------\n\n");     /*一种简单的输出对齐方法*/     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "学号", "姓名", "性别", "年龄", "线代", "微积分", "程序设计", "英语");     /*直接用数字就好了，但是从练习熟悉指针来说，没毛病*/     for (p = stu; p < stu + 5; p++)     {         /*单个字符 用%c, 字符串用%s         character,  string,,,中文字符printf输出对齐是噩梦, 不齐的时候自己加\t对齐*/         printf("%d\t%s\t%c\t%d\t%d\t%d\t%d\t\t%d\n", p->num, p->name, p->sex, p->age,                p->scores[0], p->scores[1], p->scores[2], p->scores[3]);     }     /*平均分     沿用前面的隐含约定，     [0],[1] [2] [3]分别代表     线代 微积分 程序设计 英语     ----知道这样做的麻烦了吧，每一次涉及科目成绩的处理（编程），都得回头看看     确认一次，到底代表什么     */     double avg_score[4];      ret = aver(stu, avg_score);      printf("\n\n-----------------各科平均成绩-----------------\n\n");     printf("%s\t%s\t%s\t%s\n", "线代", "微积分", "程序设计", "英语");     printf("%.2f\t%.2f\t%.2f\t\t%.2f\n\n", avg_score[0], avg_score[1],            avg_score[2], avg_score[3]);     system("PAUSE");     return 0; }

user: user-2
content: 我和你运行的不是同一个程序，我直接编译不过。aver定义的数字，调用传递的4个值
user-0 提问: 用递归写了一个3x3的小迷宫，想知道为什么return不能直接跳出递归，如过想强制跳出递归，该怎么做，附上原码加运行结果。

回复:
user: user-1
content: 把向上走 if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走 		{ 			AI(a, i - 1, j); 		} 放在else里面试试 	if (i == 2 && j == 2)  //找到出口 	{ 		printf("you are win !\n"); 		return; 	} 	else 	{ 		// 右，下，左，上 		if (j + 1 <= 2 && a[i][j + 1] < 2)//向右走 		{ 			AI(a, i, j + 1); 		} 		if (i + 1 <= 2 && a[i + 1][j] < 2)//向下走 		{ 			AI(a, i + 1, j); 		} 		if (j - 1 >= 0 && a[i][j - 1] < 2)//向左走 		{ 			AI(a, i, j - 1); 		} 		if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走 		{ 			AI(a, i - 1, j); 		} 	}

user: user-2
content: 递归有堆栈， return了当前堆栈，但是以前的东西得继续，你可以把这个想象成编号，0->1->2这样， N执行完毕了就执行N-1执行位置剩下，直到最上层完毕.

user: user-3
content: 改成指针后仔细看了一下才发现，其实没必要改成指针，因为递归完本来就结束了 所以你的问题是调用递归的分支没用else if，所以递归结束后又进入了下一个if继续递归了 所以改成else if 就可以了 void AI(int a[3][3], int i, int j)  //递归走出迷宫 { a[i][j] = 3; //走过的路 show(a);  //显示当前位置 if (i == 2 && j == 2)  //找到出口 { printf("you are win !\n"); return; } else { // 右，下，左，上 if (j + 1 <= 2 && a[i][j + 1] < 2)//向右走 { AI(a, i, j + 1);     j += 1; } else if (i + 1 <= 2 && a[i + 1][j] < 2)//向下走 { AI(a, i + 1, j); } else if (j - 1 >= 0 && a[i][j - 1] < 2)//向左走 { AI(a, i, j - 1); } else if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走 { AI(a, i - 1, j); } } }

user: user-3
content: void AI(int a[3][3], int *i, int *j)  //改成指针形式 { a[*i][*j] = 3; //走过的路 show(a);  //显示当前位置 if (*i == 2 && *j == 2)  //找到出口 { printf("you are win !\n"); return; } else { // 右，下，左，上 if (*j + 1 <= 2 && a[*i][*j + 1] < 2)//向右走 { //AI(a, i, j + 1);     *j += 1; } if (*i + 1 <= 2 && a[*i + 1][*j] < 2)//向下走 { //AI(a, i + 1, j);     *i += 1; } if (*j - 1 >= 0 && a[*i][*j - 1] < 2)//向左走 { //AI(a, i, j - 1);     *j -= 1; } if (*i - 1 >= 0 && a[*i - 1][*j] < 2)//向上走 { //AI(a, i - 1, j);     *i -= 1; }     AI(a, i, j); //递归调用     if (*i==2 && *j==2) return; //递归结束返回到这里，然后判断 i，j 退出递归 } }

user: user-3
content: 递归return只是结束当前递归层处理，然后返回上一层的调用递归的地方。如果你希望继续结束上一层递归，就要在上一层调用递归的下一条语句做判断，然后退出递归。 在你这个程序，可以把递归的i，j参数用指针的方式传入传出，然后在调用递归的下一条语句判断i，j结束递归。
user-0 提问: 向老师们请教一个问题：为什么俺的预处理指令，它不认呢？

回复:
user: user-0
content: 各位老师们见笑了。见识还是太少了些。 谢谢大家的帮助与回复。

user: user-1
content: https://www.cnblogs.com/zhangshenghui/p/5669208.html

user: user-2
content: C# 虽然带一个C， 但是和C/C++确实一毛钱关系都没有啊

user: user-3
content: C#用 #if A #elif B #endif

user: user-3
content: 引用 楼主 千梦一生 的回复: 这是wpf的代码，#if它认为是预处理指令。 可这 #ifdef、#ifndef、#if define...好些个都被视为无效的预处理指令了。  向老师们请教一下这个问题。谢谢啦 wpf？？？？你这是c/c++吗？？

user: user-0
content: 好了，问题得到解决了，C#的预处理指令和一般C/C++有些地方是不大一样的。

user: user-2
content: #ifdef A ... #elsif defined(b) ... #endif

user: user-2
content: #if defined(A) .... #elsif defined(B)  #endif
user-0 提问: 求大佬解答 

回复:
user: user-1
content: 程序通过了吗？我用了malloc和二分查找，程序还是超时了。

user: user-2
content: i<n&&c==0 换成i<n 就行，c一旦为1，就直接break掉了。

user: user-2
content: 开始定义一个 int w=0；  最后一个for 开始，换成如下。 for(j=0;j<m;j++){         c=0;         for(i=w;i<n&&c==0;i++){             if(b[j]==a[i]){                 c=1;                  w=i;break;}             if(b[j]<a[i])                 break;        }         if(c==1)         printf("Yes\n");         else         printf("No\n");         }     return 0;}

user: user-3
content: scanf("%d",&n); int a[n];  这样做是对的吗？ 我记得好像不可以呀

user: user-4
content: 引用 2 楼 寻开心 的回复:[quote=引用 1 楼 ?Victor.?? 的回复:] scanf("%d",&n); int a[n];  这样做是对的吗？ 我记得好像不可以呀  这个在某些编译器上是允许的   超时的问题是算法的问题 不能直接数组保存，硬查询，那效率太低太低  1 数据是有重复的， 一个人可以提交多次，每一次提交保存一个记录太浪费，也影响查询的速度  2 查询数量大，就要改查询方法， 可以对记录先排序，有序后折半查找，可提速  看题目要求， 学生编号Ai的范围，也就是最多有1，000，000个学生， 以此来建立一个数组， 全局变量unsigned char students[1000010]; 读入n行， 读入的数据如果是v，那么设置students[v] = 1; 这样，students就是记录了每个学生是否交作业的状态了 查询从这里进行， 直接获取是否交作业输出 这个查询就是下标索引，不用循环查找 所以，整个算法是O（1）  代码自己写吧[/quote]我是直接用数组写的，没有TLE，主要是这个题目的数字太大，导致不能像普通的那样申请内存空间，不过可以试试malloc来申请。

user: user-5
content: 引用 1 楼 ?Victor.?? 的回复:scanf("%d",&n); int a[n];  这样做是对的吗？ 我记得好像不可以呀  这个在某些编译器上是允许的   超时的问题是算法的问题 不能直接数组保存，硬查询，那效率太低太低  1 数据是有重复的， 一个人可以提交多次，每一次提交保存一个记录太浪费，也影响查询的速度  2 查询数量大，就要改查询方法， 可以对记录先排序，有序后折半查找，可提速  看题目要求， 学生编号Ai的范围，也就是最多有1，000，000个学生， 以此来建立一个数组， 全局变量unsigned char students[1000010]; 读入n行， 读入的数据如果是v，那么设置students[v] = 1; 这样，students就是记录了每个学生是否交作业的状态了 查询从这里进行， 直接获取是否交作业输出 这个查询就是下标索引，不用循环查找 所以，整个算法是O（1）  代码自己写吧
user-0 提问: 请教指针数组的问题

回复:
user: user-1
content: 有一说一这个用数组搞确实麻烦。不是一点点麻烦。代码多且效率低。 1.数组a【10|12|13|15|11】 2.插入一个，说明长度增加了所以需要一个b【||||||】6个空间的数组。为什么不直接加在a的后面呢？因为那样做的话是越界操作。不安全的 3--------好了，我们暂时有a【5个int单位长度】的原数组，以及一个刚刚搞到手的全新的b【6个int单位长度】的没有数据干净的数组 4.执行一个插入操作，比如我们插入数字999到第n个后面 5.这个操作就意味着：前n个不变，后面5-n个全部后移，给999让座儿。（这个话都讲到这儿了，稍微想想应该有能力解决的了）

user: user-2
content: 如果一定要插入到原数组中再输出的话，要么直接把原数组创建成a[6],a[2]=50,其余不变。然后用指针int *b =a,输出*b++或b[0]~b[6]; 要么先 int* a= (int *)malloc(sizeof(int)*5)，再a = (int *)realloc(sizeof(int)*6),然后把a[2]~a[4]往后移到a[3]~a[5]后，再赋值a[2]=50; 然后输出a[0]~a[5]; 不知道你说的用指针怎么写出来是什么意思。 对于一维数组来说，其实没有必要用指向数组的指针，用指向数组首元素的指针int *p = a，然后用p[0],p[1]或*(p+1),*(p+2)来表示数组元素,或者直接a[0],a[1]; 如果一定要用指向数组的指针来表示，那就 int (*p)[5] = &a; 然后用(*p)[0],(*p)[1]来表示。

user: user-3
content: 写的不一定好，但基本能实现要求。供参考  #include <stdio.h>  int main(void) { 	int a[5] = {0}; 	int *p; 	int i, n, d, tmp; 	p = (int *)malloc(sizeof(int)*6); 	 	for (i=0; i<5; i++) 	{ 		scanf("%d", &a[i]); 	} 	printf ("请输入要插入的数字和要插入到第几个数后面：\n"); 	scanf("%d%d", &n, &d); 	 	for (i=0; i<6; i++) 	{ 	 	if (i < d)		 		    p[i] = a[i]; 		else if (i==d) 			p[i] = n; 		else 		    p[i] = a[i-1]; 	    	 	 	} 	for (i=0; i<6; i++) 	{ 		printf("%d ", p[i]); 	} 	 	free(p);	 	return 0; 	 }
user-0 提问: 为什么包含了头文件还是不能在主函数中调用已经在头文件中申明过的函数

回复:
user: user-1
content: 我也出现这个问题了 请问怎么解决的？

user: user-2
content: 看看是不是在diceroll.c文件里面忘了包含diceroll.h。如果不是的话，看看是不是函数名打错了。 编译报错，显示未定义roll_n 函数。 这里的roll_n函数和上面的roll_n_dice是同一个吗？ 是你简写了，还是报错就是这样报的？

user: user-0
content: 这是diceroll.c的头部 #include "diceroll.h" #include<stdio.h> #include<stdlib.h> 在这个源文件里面也定义了roll_n_dice函数 int roll_n_dice(int dice,int sides) 下面是保存为diceroll.h的头文件 extern int roll_count; int roll_n_dice(int dice,int sides); 然后在主函数源文件中包含了头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #include "diceroll.h" 编译报错，显示未定义roll_n_dice 函数。

user: user-3
content: extern 這裡檢查下？這個說明在別的地方定義了 如果沒有 可能造成問題
user-0 提问: 现在还有没有靠谱的C语言开发工具？

回复:
user: user-1
content: vs 2019吧，毕竟dev啥的都太老了好多新新的标准都不支持，而且相对来说vs对代码的审查更加严格，有警告啥的第一时间就能看出来，也可以帮助自己养成良好的编程习惯。也可以直接使用gcc或是mingw，可以更加熟悉程序的编译过程，过分的依赖编译器也是不好的习惯。

user: user-2
content: 不懂啊，没学过

user: user-3
content: 引用 30 楼 青蛙工作室 的回复:楼主是来钓鱼的？ 起人耸人听闻的标题让人以为是大佬，实则青铜。 同感！   引用 31 楼 Chen_jiajie1234 的回复:搭建系统是系统工程师的事。我这学编程的可操不起那心。 搭建的非系统，是开发环境！

user: user-0
content: 搭建系统是系统工程师的事。我这学编程的可操不起那心。

user: user-4
content: 楼主是来钓鱼的？ 起人耸人听闻的标题让人以为是大佬，实则青铜。

user: user-5
content: 学习语言基本知识的话，不必搞清楚太多不想关的事情。下载个集成开发环境。专注于学习，写代码即可。

user: user-0
content: 我手上有Java、JSP、C的书，Java和JSP的环境我配置不出来。最后，找到了MS的TurboC，就只能用C编程了。

user: user-6
content: 楼主 ，现在是2020年 ，你不要活在90年代，turbo C 那是多古老的编译器了， 问题一大堆

user: user-0
content: VC、Java之类的的文件一大堆，又是WEB又是DB的，看着头痛，更别说把他们收集齐并协同工作了。 只想写些小程序练练手，开发环境自然是越小越好。

user: user-7
content: 这个锅没办法甩给编译器 指针传进去也是值传递的方式， 函数内部的交换了，但参数没有任何改变。

user: user-3
content: 给楼主一个在线的编译器吧，你可以试一下你的程序能否在此正常工作！ https://gcc.godbolt.org/

user: user-8
content: 建议改为void f1(&x,&y)

user: user-8
content: vs系列，支持c++的都支持c

user: user-8
content: vs系列，支持c++的都支持c

user: user-9
content: 难道都没有人用过Windows下的MinGW_W64吗，。。。

user: user-10
content: Visual Studio 2019

user: user-0
content: MSVC太大了，也找不到。 没有MSVC，MSTC也行。MSTC看起来跟TurboC差不多，问题是我现在用的MSTC跟我当时课本上的标准不一致。

user: user-3
content: 引用 19 楼 Chen_jiajie1234 的回复:#18,f1的定义原本是void f1(int x,int y)的，要做的事情是把x,y的数据互换。可是，在main里调用它之后没有实现数据交换。后来查了书才知道可能用地址交换才能实现，所以f1就改成void f1(int *x,int *y)。结果还是不行。所以，我才确定我用的这个MSTC(微软TurboC）不是正版的。 turbo pascal、C、C++都是borland公司早年的产品，现在公司都不在了（改名了）。所以，不可能再买到正版的软件了。但是，楼主是学艺不精，程序写错了，不要瞎怪编译器或IDE。  推测：MSTC(微软TurboC）推测是某人开发的在windows下面仿真dos从而能运行turbo c的东东，所以这个玩意应该是没有问题的，可以正常运行古老的C程序。但是，现在还这么干的人，纯属是脑壳有包！

user: user-3
content: 1、首先是楼主的程序写错了，和编译器无关； 2、windows下面的编程工具太多了，基本上不会导致系统重装的，如果说哪个好，首先是全部能用（包括上面推荐的），要说够用且适合初学者的，那就是MS的VC2010（VS2010）了。

user: user-11
content: 26M的VC6   不是也很爽吗？
user-0 提问: 求助

回复:
user: user-1
content: %d只能输出4个字节的内存内容（32位系统下）。而long long是8字节的内存，因此要输出8字节的内容需要用%lld

user: user-2
content: 输出long long类型的数最好用%lld替换%d

user: user-3
content: 数据类型不同,编译器也有关系

user: user-4
content: 引用 25 楼 ggglivw 的回复:文章虽好，还是要以编译器为准，楼主和我都是2017，同样代码他出问题我不出。所以得看编译器设置和实现。一切以代码执行为准引用N个输入对应N个地址 纠正你这个错误

user: user-4
content: 引用 25 楼 ggglivw 的回复:文章虽好，还是要以编译器为准，楼主和我都是2017，同样代码他出问题我不出。所以得看编译器设置和实现。一切以代码执行为准编译器为准就是 题主在出错了 而你认为不会出错 我介绍一下为什么会出错 明白了么

user: user-5
content: 文章虽好，还是要以编译器为准，楼主和我都是2017，同样代码他出问题我不出。所以得看编译器设置和实现。一切以代码执行为准

user: user-4
content: 引用 22 楼 ggglivw 的回复:我这边只能看到stdio.h里面的接口实现，看不到内部实现. __crt_va_start和__stdio_common_vfprintf都无法单步跟踪进去。 va_list原理及用法

user: user-5
content: {         int _Result;         va_list _ArgList;         __crt_va_start(_ArgList, _Format);         _Result = _vfprintf_l(stdout, _Format, NULL, _ArgList);         __crt_va_end(_ArgList);         return _Result;     } 我只能看到这些纯接口，内部实现无法跟踪进入

user: user-5
content: 我这边只能看到stdio.h里面的接口实现，看不到内部实现. __crt_va_start和__stdio_common_vfprintf都无法单步跟踪进去。

user: user-4
content: 引用 18 楼 ggglivw的回复:下一个%d，从第二个的地址开始取，再下一个从第三个地址开始取. 所以说 你是没看stdarg.h文件 还是看不懂？ 读了4个字节 第二个%d当然是从第5个字节开始读数据 就是你写的0x00000000FFFFFFFF的高4位

user: user-0
content: 我发现输出这样的结果好像是在输出读取时，是按照连续内存读取的，这应该和编译器有关。

user: user-5
content: 输入类型是动态的，肯定是不会是按照一个类型做吧，而是N个输入对应N个地址，每个地址的取值转换范围由类型决定.

user: user-5
content: 下一个%d，从第二个的地址开始取，再下一个从第三个地址开始取.

user: user-6
content: 数据类型不同

user: user-4
content: 引用 16 楼 ggglivw 的回复:0x00000000ffffffff. 读取的是后面的4字节，只要不超过32的最大值，为啥会出错？下一个 %d 呢?

user: user-5
content: 0x00000000ffffffff. 读取的是后面的4字节，只要不超过32的最大值，为啥会出错？

user: user-4
content: 引用 14 楼 ggglivw 的回复:对啊，我8字节，你解析4字节，不应该出错才对没睡醒? 先去洗脸

user: user-5
content: 对啊，我8字节，你解析4字节，不应该出错才对

user: user-4
content: 引用 12 楼 ggglivw 的回复:过程中确实是用的地址，只是按道理，我大转小不应该出错才对，又不是小转大，放了了不应该访问的地方。不定参数类型 根本不知道你传入参数是多少字节  按照格式确定类型  按照类型确定解析多少个字节 printf看到 %d 就解析4字节  不管你入栈多少字节  没有大转小 没有小转大

user: user-5
content: 过程中确实是用的地址，只是按道理，我大转小不应该出错才对，又不是小转大，放了了不应该访问的地方。
user-0 提问: C语言解释

回复:
user: user-0
content: 引用 3 楼 m0_44977681 的回复：就是运算符优先级的问题 第一行 x，y都非零那么!x  !y都是0，相乘还是0 !!!x相当于!x还是0 第二行 x或i结果为真值1，j-3也不为0，结果还是真值1 x＜y为假，结果为假值0 第三行 c是k的ASC码107，5且c是真值1，j被赋值为8不为0，两者且还是真值1，由于i是1即i＝＝1为真，所以最后结果为真值1 x＋y不为0，最后结果为真值1 输出结果为 0    0 1    0 1    1 不明白优先级和结合性就多查查谢谢

user: user-1
content: 就是运算符优先级的问题 第一行 x，y都非零那么!x  !y都是0，相乘还是0 !!!x相当于!x还是0 第二行 x或i结果为真值1，j-3也不为0，结果还是真值1 x＜y为假，结果为假值0 第三行 c是k的ASC码107，5且c是真值1，j被赋值为8不为0，两者且还是真值1，由于i是1即i＝＝1为真，所以最后结果为真值1 x＋y不为0，最后结果为真值1 输出结果为 0    0 1    0 1    1 不明白优先级和结合性就多查查

user: user-2
content: 引用 1 楼 老英捉小奇的回复:电脑运行一下就知道了 一个一个试着来 就懂了

user: user-2
content: 电脑运行一下就知道了
user-0 提问: C语言金字塔求助！！！

回复:
user: user-0
content: 引用 1 楼 老英捉小奇 的回复：#include<stdio.h> int main() {  	int m,n,i,j,k; 	scanf("%d",&n);				//输入行数 	m=2*n-1;					//列数 	for(i=1;i<=n;i++)			//循环次数 	{ 		for(j=i;j<=m/2;j++)		//每行输出的空格 			printf(" "); 		for(k=1;k<=2*i-1;k++)	//每行输出的*号 			printf("*"); 		putchar('\n'); 	} 	return 0; }就是*不太会处理啊 感觉是这里出的问题

user: user-1
content: 引用 1 楼 老英捉小奇的回复:#include<stdio.h> int main() {  	int m,n,i,j,k; 	scanf("%d",&n);				//输入行数 	m=2*n-1;					//列数 	for(i=1;i<=n;i++)			//循环次数 	{ 		for(j=i;j<=m/2;j++)		//每行输出的空格 			printf(" "); 		for(k=1;k<=2*i-1;k++)	//每行输出的*号 			printf("*"); 		putchar('\n'); 	} 	return 0; } 有些花括号不用加的话就别加了，看得眼花缭乱的

user: user-1
content: #include<stdio.h> int main() {  	int m,n,i,j,k; 	scanf("%d",&n);				//输入行数 	m=2*n-1;					//列数 	for(i=1;i<=n;i++)			//循环次数 	{ 		for(j=i;j<=m/2;j++)		//每行输出的空格 			printf(" "); 		for(k=1;k<=2*i-1;k++)	//每行输出的*号 			printf("*"); 		putchar('\n'); 	} 	return 0; }
user-0 提问: 哪位大佬帮看看这个C代码哪里错了，谢谢各位大佬捧场，卑微程序小白跪求

回复:
user: user-1
content: 函数grade的形参名与函数内使用不一致，形参名改为array。  另外，程序内有个不好的习惯：       1.函数grade的实参变量m，没有限制其最小、最大值，这样可能会导致指针访问出问题，得不到正确的值，m < 0，指针访问到数组a之前的内存，m>=数组a的行数，则指针访问到数组a之后的内容       2.for循环中 i 值没有初始值（变量i定义时未赋初值），这样可能导致for循环条件不满足而无法循环（ i 初值>=4）；i初值<0，则会导致上面m<0时类似的问题，指针访问异常

user: user-2
content: double *grade(double (*array)[4], int n)//---arrry改为array

user: user-3
content: 变量名不对 参数变量名是 arrry 处理代码的变量名是 array 修改一致即可
user-0 提问: 谢谢各位大佬倾力相助，编程小白弟感激不尽，

回复:
user: user-1
content: 22行  就是int mian()  {  对应的大括号

user: user-0
content: 引用 1 楼 ?Victor.??的回复:从错误上说是少了一个大括号  在最后加上即可  程序可以简化一下  考虑一下把闰年判断条件集中一下 在哪个位置少了大括号？能不能帮我写一下，谢谢谢谢，我刚学没有多久，有点懵谢谢大佬

user: user-0
content: 在哪个位置少了大括号？嘿嘿😁有点懵，能不能帮我加一下，刚学没多久

user: user-1
content: if((a%4 == 0 && a%100!=0) || a%400 == 0)  这一个判断就可以了

user: user-1
content: 从错误上说是少了一个大括号  在最后加上即可  程序可以简化一下  考虑一下把闰年判断条件集中一下
user-0 提问: 3的倍数

回复:
user: user-1
content: 这里的主要问题应该不是编译器不支持变长数组，而是int范围的数组无法储存最大值为10的1000次方，所以要建立数组的话就要建立int a[t][1001]这样的数组，或者说用malloc开辟二维数组。 然后用数组来储存最大值为10的1000次方这样的大数，通过判断每一位数字的和是否能被3整除来判断该大数是否能被3整除。

user: user-2
content: 想使用可变长度数组，五楼正解，但记得用完后free

user: user-3
content: （1）数组元素的维度必须是常量  （2）超出了int的范围

user: user-4
content: 题目让你注意取值范围你注意了没有 最大值 10的1000次方 写起来就是1后面1000个0 int怎么可能存得下

user: user-5
content: 你说报错了，报的啥错怎么不贴出来？

user: user-6
content: 有的编译器不支持用变量定义数组长度 改成动态申请内存

user: user-7
content: 楼上正解建议申请内存

user: user-8
content: 数组长度需要是固定的，而不能是可变长的。建议用int *a = (int *)malloc(sizeof(int) * t);代替int a[t];
user-0 提问: 答案是不是这样啊

回复:
user: user-0
content: 引用 4 楼 user-1的回复:最后一个你是15.6000吧，不是 156.000吧 可能写的时候没注意

user: user-1
content: 最后一个你是15.6000吧，不是 156.000吧

user: user-1
content: 引用 2 楼 weixin_46294972 的回复:那其他的都正确吗 其它没问题

user: user-0
content: 引用 1 楼 user-1的回复:第四题应该是 2.0 那其他的都正确吗

user: user-1
content: 第四题应该是 2.0
user-0 提问: 求大神告知哪里错了

回复:
user: user-1
content: 大括号前面没有小括号 while for 后面不需要加分号 而且这个函数第一个参数不是整数呀 FillRectangle thiz：自身指针变量，类似this指针的变量；属于DirectFB的招牌写法。

user: user-2
content: 两个for后面和while后面都多了分号; 注意分号代表一条一条语句，即while的循环体是；即什么都不执行，是死循环，并且很占CPU，导致你的电脑变卡～

user: user-3
content: 为啥while 和for 后面都有分号

user: user-4
content: 后面的括号呢？
user-0 提问: C语言链表查找功能总是失败，请各位帮忙看看到底哪里有问题。

回复:
user: user-0
content: 感谢您，我看到我哪里有问题了。 指针那块也没学好。等会在复习一下。

user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef struct list {     int data;     //struct lista* next;     struct list* next; }lista;   lista* newlist(int n) {     int i = 0;     lista* listaone; //普通结点     lista* listahead;//头结点     lista* listend; //尾结点     listahead = (lista*)malloc(sizeof(lista));     if (!listahead)         exit(0);     listend = listahead;       for (i = 0; i < n; i++)     {         listaone = (lista*)malloc(sizeof(lista));         scanf("%d", &listaone->data);         listend->next = listaone;         listend = listaone;     }     listend->next = NULL;      return listahead; }  //int foundlist(lista *x) int foundlist(lista *phead) {     lista *x = phead->next;     int j = 0;     int n = 0;     printf("请输入需要查找到数\n");     scanf("%d", &n);     do     {         /*         if (x->data != n) //执行判断不等于         {             x = x->next; // 指向下一个结点         }         else if (x->data == n)         {             j++;//记录次数         }         */         if (x->data == n)             j++;         x = x->next;     } while (x!= NULL);//判断是否为空了，空就退出      return j;//返回e的个数 }  //void main() int main(void) {      lista* f, * y;     int x = 0;     int k = 0;     printf("新建链表，输入需要个数结束\n");     scanf("%d", &k);     f = newlist(k);     y = f;      printf("输入的数为\n");     while (f->next != NULL)     {         f = f->next;         printf("%d", f->data);     }      printf("\n");     x = foundlist(y);     printf("找到该数，出现%d次", x); } 供参考～  参数应该输入y而不是f，因为f已经变化了。 另外，查找函数也有问题，
user-0 提问: C语言runtime error的SIGSEGV问题

回复:
user: user-0
content: 有一个单词 W，输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1)。W 只由英文字母组成，S 除英文字母和汉字之外在任何位置（包括头和尾）另有一个或多个连续的空格。  查找单词时，不区分大小写，但要求完全匹配，即单词 W 必须与 S 中的某一独立单词在不区分大小写的情况下完全匹配。W 仅是 S 中某一单词的一部分就不算匹配。 输入格式  第 1 行：一个整数 T (1≤T≤10) 为问题数。  接下来共 2T 行，对应每个问题有 2 行，表示 W 和 S (1≤W长度≤10;1≤S长度≤1000000)。 输出格式  对于每个问题，输出一行问题的编号（0 开始编号，格式：case #0: 等）。  然后对应每个问题在一行中输出 IDX。 S 中没有找到 W 时输出 None。 样例 Input  3 IN Find a word within a string in English and in Chinese. to     Find a word within a string in English and in Chinese. In     Find a word within a string in English and in Chinese.  Output  case #0: 29 case #1: None case #2: 33
user-0 提问: C语言小作业

回复:
user: user-1
content: 改一下：用scanf接收3个数据， %d, %d, %d，&year, &month， &day 题目要求往后一个星期，就是加7天呗，你先day+7，并判断month最大是多少天（2月的话还要往前判断year是不是闰年），超过了30天或者31天的month加1，否则day加7就完了。

user: user-1
content: 简单，用scanf接收3个数据，&year, &month， &day， %d, %d, %d，题目要求往后一个星期，就是加7天呗，你先day+7，并判断month最大是多少天（2月的话还要往前判断year是不是闰年），超过了30天或者31天的month加1，否则day加7就完了。