Question: 求大神看

CSDN论坛新手指南

引用 楼主 weixin_45792725的回复:You play your favourite game yet another time. You chose the character you didn’t play before. It has str points of strength and int points of intelligence. Also, at start, the character has exp free experience points you can invest either in strength or in intelligence (by investing one point you can either raise strength by 1 or raise intelligence by 1  ).  Since you’d like to make some fun you want to create a jock character, so it has more strength than intelligence points (resulting strength is strictly greater than the resulting intelligence).  Calculate the number of different character builds you can create (for the purpose of replayability) if you must invest all free points. Two character builds are different if their strength and/or intellect are different.  Input  The first line contains the single integer T (1≤T≤100) — the number of queries. Next T  lines contain descriptions of queries — one per line.  This line contains three integers str , int and exp (1≤str,int≤108, 0≤exp≤108  ) — the initial strength and intelligence of the character and the number of free points, respectively.  Output  Print T  integers — one per query. For each query print the number of different character builds you can create.  Example  Input  4 5 3 4 2 1 0 3 5 5 4 10 6  Output  3 1 2 0  Note  In the first query there are only three appropriate character builds: (str=7,int=5) , (8,4) and (9,3)  . All other builds are either too smart or don’t use all free points.  In the second query there is only one possible build: (2,1)  .  In the third query there are two appropriate builds: (7,6) , (8,5)  .  In the fourth query all builds have too much brains.  我的代码为什么 wrong answer test 3 #include<stdio.h>  int main(void) {     long str,inte,exp;     int T,i;     scanf("%d",&T);     for(i=0;i<T;i++)     {       scanf("%ld%ld%ld",&str,&inte,&exp);      long j=0,a;      a=str+exp;      for(;a>inte;a--,inte++)         j++;      printf("%d\n",j);     } } 自顶自顶，不要沉啊。


Question: C语言

0开头八进制我居然忘了。。。  坏习惯要扼杀在摇篮。CSDN论坛新手指南

int main() {  	int k = 011; 	printf(" %d\n",k++); 	return 0; } 你代码里有错误 改一下 然后输出结果为9 因为011代表八进制的11


Question: 新手求教

这两句话是两个函数的声明 int judgment1(int year); 声明一个返回值为Int的函数，名为judgment1，传入参数为Int类型 int judgment2(int mouth,int m,int day); 声明一个返回值为Int的函数，名为judgment2，传入参数为三个Int类型的值  在程序的其他地方应该有相应的函数定义

这个函数到底可以干什么呢


Question: 一道结合生活的用于新手刷题的题目

题目没什么难度，每次编译累加下sum就好了


Question: 怎么输入三行再出结果

1.把输入存入数组，全部输入后统一处理 2.把输出存入数组，输入结束后统一输出 3.把输出转化为字符串并拼串，输入结束后输出字符串 ……

可以考虑把结果存到数组里，最后再依次输出


Question: 初学者请大佬解决

思路：输入的钱数全部换算成角数，输出的时候，按照角数的百、十、个位数（取模）输出就是对应的结果了。 基本没啥复杂的运算，基本的算术运算自己试着实现以下。


Question: 地址错误

引用 4 楼 user-2的回复:你这是越界了吧。数组的大小为N，那么它的下标应该是0~N-1，可是你的for循环下标是1~N  CSDN论坛新手指南 好的，我回去再试试，之前改过，粘贴错了

引用 2 楼 qq_45768871的回复:[quote=引用 1 楼 自信男孩的回复:]#include <stdio.h> #define N 3 #define PR printf #define SF scanf /*输入十个学生的三门科目的成绩，输出三门课的平均成绩，   以及最高分的学生数据（学号，姓名，三门课的成绩和平均成绩）   */ struct Student {     char num[6];     char name[8];     double score[3];     double avr; }stu[N];  int main() {     int i,j,maxi;     double max;     double sum;     double averange;     //输入数据     for(i=1;i<=N;i++)     {         PR("input %d student ID is:\n ",i);         PR("NO:");         //SF("%s",&stu[i].num);         SF("%s", stu[i].num);         PR("name:");         //SF("%S",&stu[i].name);         SF("%s", stu[i].name);         for(j = 1;j <= 3;j++)         {             PR("score %d:",j);             SF("%lf", &stu[i].score[j]);         }     }     //计算     averange = 0;     max = 0;     for(i = 0;i < N; i++)     {         sum = 0;         for(j = 0;j < 3;j++)             sum+=stu[i].score[j];         stu[i].avr = sum / 3.0;         averange += stu[i].avr;         if(sum > max)         {             max=sum;             maxi=i;         }     }     averange /=N*1.0;      //输出     PR("NO. name score1 score2 score3 averange\n ");     for(i = 0; i < N; i++)     {         PR("%5s%10s",stu[i].num,stu[i].name);         for(j = 0; j < 3; j++)             PR("%9.2lf" , stu[i].score[j]);         PR("%8.2lf\n" , stu[i].avr);     }     PR("averange=%5.2lf\n",averange);     PR("The highest score is:student %s,%s", stu[maxi].num,stu[maxi].name);     //PR("his score are %6.2lf %6.2lf %6.2lf %6.2lf  averange is :%5.2lf",stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);     PR("his score are %6.2lf %6.2lf %6.2lf  averange is :%5.2lf",stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);       return 0; }  供参考～ 为什么呢，这样呢，scanf里面的[/quote] 用VS2019还是有问题，地址错误，为什么呢

引用 1 楼 自信男孩的回复:#include <stdio.h> #define N 3 #define PR printf #define SF scanf /*输入十个学生的三门科目的成绩，输出三门课的平均成绩，   以及最高分的学生数据（学号，姓名，三门课的成绩和平均成绩）   */ struct Student {     char num[6];     char name[8];     double score[3];     double avr; }stu[N];  int main() {     int i,j,maxi;     double max;     double sum;     double averange;     //输入数据     for(i=1;i<=N;i++)     {         PR("input %d student ID is:\n ",i);         PR("NO:");         //SF("%s",&stu[i].num);         SF("%s", stu[i].num);         PR("name:");         //SF("%S",&stu[i].name);         SF("%s", stu[i].name);         for(j = 1;j <= 3;j++)         {             PR("score %d:",j);             SF("%lf", &stu[i].score[j]);         }     }     //计算     averange = 0;     max = 0;     for(i = 0;i < N; i++)     {         sum = 0;         for(j = 0;j < 3;j++)             sum+=stu[i].score[j];         stu[i].avr = sum / 3.0;         averange += stu[i].avr;         if(sum > max)         {             max=sum;             maxi=i;         }     }     averange /=N*1.0;      //输出     PR("NO. name score1 score2 score3 averange\n ");     for(i = 0; i < N; i++)     {         PR("%5s%10s",stu[i].num,stu[i].name);         for(j = 0; j < 3; j++)             PR("%9.2lf" , stu[i].score[j]);         PR("%8.2lf\n" , stu[i].avr);     }     PR("averange=%5.2lf\n",averange);     PR("The highest score is:student %s,%s", stu[maxi].num,stu[maxi].name);     //PR("his score are %6.2lf %6.2lf %6.2lf %6.2lf  averange is :%5.2lf",stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);     PR("his score are %6.2lf %6.2lf %6.2lf  averange is :%5.2lf",stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);       return 0; }  供参考～ 为什么呢，这样呢，scanf里面的


Question: 请问 这个哪里错了啊，新手作业题

function(*x,*y); printf("%d%d",*x,*y); 改成  function(&x, &y); printf("%d%d", x, y); 取地址&，在main中打印直接输出

所以，代码应该修改为 #include<stdio.h> void function(int *x, int *y) { 	printf("原始值："); 	printf("x=%d, y=%d\n", *x, *y); 	*x = 8; *y = 9; }  int main(int argc, char **argv) { 	int x = 5, y = 6; 	function(&x, &y);//--------将*x和*y改为&x和&y------------- 	printf("修改以后的值："); 	printf("x= %d, y= %d", x, y);//-----------将&x和&y改为x和y----- 	return 0; }  以下是VS2015运行的结果

調用function的時候，參數應該是&x,&y，也就是取x和y的地址，隨後的printf不要加*符號。


Question: 距离向量算法更新路由表，想请问一下大佬c语言用fread读文件，为什么会这样？怎么解决呀？

引用 8 楼 user-1的回复:[quote=引用 7 楼 user-1 的回复:] [quote=引用 6 楼 ycp125 的回复:] [quote=引用 5 楼 user-1的回复:]我先调调代码格式。估计要个十分钟。 好的好的，非常非常非常感谢您[/quote]怎么就没点领悟能力呢。我上面那个图片白发了。。。[/quote]ennn，我改了一下，发现我也不太会。。。不好意思。尴尬。[/quote] 没事没事，还是谢谢您❤

引用 7 楼 user-1 的回复:[quote=引用 6 楼 ycp125 的回复:] [quote=引用 5 楼 user-1的回复:]我先调调代码格式。估计要个十分钟。 好的好的，非常非常非常感谢您[/quote]怎么就没点领悟能力呢。我上面那个图片白发了。。。[/quote]ennn，我改了一下，发现我也不太会。。。不好意思。尴尬。

引用 6 楼 ycp125 的回复:[quote=引用 5 楼 user-1的回复:]我先调调代码格式。估计要个十分钟。 好的好的，非常非常非常感谢您[/quote]怎么就没点领悟能力呢。我上面那个图片白发了。。。

引用 5 楼 user-1的回复:我先调调代码格式。估计要个十分钟。 好的好的，非常非常非常感谢您

我先调调代码格式。估计要个十分钟。

#define_CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #define SIZE 20 struct routing_information      //定义路由表信息的结构体 {	 char routing_name[5]; 	char net_name[100]; 	int distance;	 char next_routing[10];	 int length;}stud[SIZE], newStud[SIZE]; void save(){                                   //将路由表信息存储为文件的函数	 FILE *fp;	 int i;	 if((fp = fopen("E:\\routing.txt","wb")) == NULL)	{		printf("cannot open file\n");	 	return;	 }	 for(i=0;i<3;i++)	 	if(fwrite(&stud[i],sizeof(struct routing_information),1,fp)!=1)			 printf("file write error\n");	 fclose(fp); } void load()                         //从文件中读出路由表信息的函数 { 	FILE *fp;	 int i;	 if((fp=fopen("E:\\routing.txt","rb"))==NULL)	{		printf("cannot open the file\n");		return;	}	fread(&stud[0], sizeof(struct routing_information), 1, fp);     printf("%s  %d  %s\r\n",stud[0].net_name,stud[0].distance,stud[0].next_routing);	 for(i=1;i<stud[0].length;i++)	{		fread(&stud[i],sizeof(struct routing_information),1,fp);		 if(i==0)		 printf("路由器%s的路由表信息如下:\n",stud[0].routing_name);		 printf(" %s  %d  %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);	} 	fclose(fp);} int charEquals(char a[],char b[])             //判断字符串是否相同的子函数 {    	int m=0; 	while(a[m]!='\0')	{		 if(a[m]==b[m])		{			 m++;		 }		 else break;	 }	 if((m==strlen(a))&&(m==strlen(b)))		 return(1);	 else		return(0); } void update(char s[]){	 int i,j,c=3;	 int flag[SIZE];	 for(i=0;i<newStud[0].length;i++)	{		strcpy(newStud[i].next_routing,s);		 flag[i]=0;	}	 for(i=0;i<stud[0].length;i++)	{		for(j=0;j<newStud[0].length;j++)		{			if(charEquals(stud[i].net_name,newStud[j].net_name)==1)		 	{				flag[j]=1;				if(charEquals(stud[i].next_routing,newStud[j].next_routing)==1)					stud[i].distance=newStud[j].distance;		 		else					if(stud[i].distance>newStud[j].distance)					{						strcpy(stud[i].next_routing,newStud[j].next_routing);						stud[i].distance=newStud[j].distance;					}			}		}	}	for(i=0;i<newStud[0].length;i++) 	{		 if(flag[i]==0)	 	{			strcpy(stud[stud[0].length].routing_name,newStud[i].routing_name);			strcpy(stud[stud[0].length].net_name,newStud[i].net_name);			stud[stud[0].length].distance = newStud[i].distance;			strcpy(stud[stud[0].length].next_routing,newStud[i].next_routing);			stud[0].length++;		}	}} void main(){ 	int i;	 char routingName[5];           //用于存储路由器名字	load();	 printf("请输入发来rip报文的路由器名字和共有几条记录\n");	 scanf("%s %d", &routingName,&newStud[0].length);	printf("请按照“目的网络   距离  下一跳路由器”的格式输入%s路由器发来的更新信息 \n",routingName); 	for(i=0;i<3;i++)	{		strcpy(newStud[i].routing_name,routingName);		scanf("%s %d %s",&newStud[i].net_name,&newStud[i].distance,&newStud[i].next_routing);	 }	 update(routingName); 	printf("路由器%s的路由表信息如下: \n",stud[0].routing_name);	for(i=0;i<stud[0].length;i++)	{		if(stud[i].distance<15)			 printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);		 else			 printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing); 	} 	save();	 system("pause"); }

引用 1 楼 user-1的回复:不介意的话，提供一下完整代码。或者能测试的代码。 大佬能帮忙看一下下吗  #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#define SIZE 20struct routing_information      //定义路由表信息的结构体{	char routing_name[5];	char net_name[100];	int distance;	char next_routing[10];	int length;}stud[SIZE], newStud[SIZE];void save(){                                   //将路由表信息存储为文件的函数	FILE *fp;	int i;	if((fp = fopen("E:\\routing.txt","wb")) == NULL)	{		printf("cannot open file\n");		return;	}	for(i=0;i<3;i++)		if(fwrite(&stud[i],sizeof(struct routing_information),1,fp)!=1)			printf("file write error\n");	fclose(fp);}void load()                         //从文件中读出路由表信息的函数{	FILE *fp;	int i;	if((fp=fopen("E:\\routing.txt","rb"))==NULL)	{		printf("cannot open the file\n");		return;	}	fread(&stud[0], sizeof(struct routing_information), 1, fp);    printf("%s  %d  %s\r\n",stud[0].net_name,stud[0].distance,stud[0].next_routing);	for(i=1;i<stud[0].length;i++)	{		fread(&stud[i],sizeof(struct routing_information),1,fp);		if(i==0)		printf("路由器%s的路由表信息如下:\n",stud[0].routing_name);		printf(" %s  %d  %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);	}	fclose(fp);}int charEquals(char a[],char b[])             //判断字符串是否相同的子函数{	int m=0;	while(a[m]!='\0')	{		if(a[m]==b[m])		{			m++;		}		else break;	}	if((m==strlen(a))&&(m==strlen(b)))		return(1);	else		return(0);}void update(char s[]){	int i,j,c=3;	int flag[SIZE];	for(i=0;i<newStud[0].length;i++)	{		strcpy(newStud[i].next_routing,s);		flag[i]=0;	}	for(i=0;i<stud[0].length;i++)	{		for(j=0;j<newStud[0].length;j++)		{			if(charEquals(stud[i].net_name,newStud[j].net_name)==1)			{				flag[j]=1;				if(charEquals(stud[i].next_routing,newStud[j].next_routing)==1)					stud[i].distance=newStud[j].distance;				else					if(stud[i].distance>newStud[j].distance)					{						strcpy(stud[i].next_routing,newStud[j].next_routing);						stud[i].distance=newStud[j].distance;					}			}		}	}	for(i=0;i<newStud[0].length;i++)	{		if(flag[i]==0)		{			strcpy(stud[stud[0].length].routing_name,newStud[i].routing_name);			strcpy(stud[stud[0].length].net_name,newStud[i].net_name);			stud[stud[0].length].distance = newStud[i].distance;			strcpy(stud[stud[0].length].next_routing,newStud[i].next_routing);			stud[0].length++;		}	}}void main(){	int i;	char routingName[5];           //用于存储路由器名字	load();	printf("请输入发来rip报文的路由器名字和共有几条记录\n");	scanf("%s %d", &routingName,&newStud[0].length);	printf("请按照“目的网络   距离  下一跳路由器”的格式输入%s路由器发来的更新信息 \n",routingName);	for(i=0;i<3;i++)	{		strcpy(newStud[i].routing_name,routingName);		scanf("%s %d %s",&newStud[i].net_name,&newStud[i].distance,&newStud[i].next_routing);	}	update(routingName);	printf("路由器%s的路由表信息如下: \n",stud[0].routing_name);	for(i=0;i<stud[0].length;i++)	{		if(stud[i].distance<15)			printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);		else			printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);	}	save();	system("pause");}

不介意的话，提供一下完整代码。或者能测试的代码。


Question: 数据结构  求大佬帮我看看这道题  想了好久  新手

有两个链表指针p和s 定义变量j 如果i<0就不需要输出 i=0删除第一个结点 否则j<i时p用来指向前驱结点 知道j>i或者s中数据全部查完 如果没查找到删除的结点 将不能删除 否则p. next=s. next 释放要删除的s结点

引用 21 楼 user-2的回复:[quote=引用 17 楼 user-2 的回复:] i>1的时候就不用删除第0个结点。写错了，应该是i>0。  标题下面右边有个结贴。结贴会返还%50积分。  不能，除非你在发一个帖子。即使是10积分也行。[/quote] 我发了你看看  我还是找不到那个

引用 17 楼 user-2 的回复:i>1的时候就不用删除第0个结点。写错了，应该是i>0。  标题下面右边有个结贴。结贴会返还%50积分。  不能，除非你在发一个帖子。即使是10积分也行。

引用 17 楼 user-2的回复:i>1的时候就不用删除第0个结点。 我能再问你一道逆置算法的题么

引用 17 楼 user-2的回复:i>1的时候就不用删除第0个结点。 怎么 把 积分给你啊

引用 17 楼 user-2的回复:i>1的时候就不用删除第0个结点。 好的  懂了  谢谢你啊

i>1的时候就不用删除第0个结点。

引用 14 楼 user-2的回复:delete(LinkList* q, int i) {  //在无头结点的单链表中删除第i个结点 	LinkList* p, * s; 	int  j; 	if (i < 0)// 小于就不合法了。 		printf("Can't delete"); 	else if (i = = 0) {// 等于0说明要删除第0个结点 		s = q;// q就是要删除的结点，用s指向它 		q = q->next;// 既然q要删除，但是后面还有结点不能丢，所有q向后移一位，记录它，否则链表就丢失了 		free(s);// 释放要删除的结点 	} else { 		j = 0;// 计数         s = q;// 指向当前结点，经过下面的循环后就会指向要删除的结点 		while ((j < i) && (s!= NULL)) {// 找到第i个结点 			p = s;// p指向要删除的结点的前面一个结点 			s = s->next;// s后移一个结点 			j++;// 个数加1，知道退出循环说明找到了 		}         s指向的就是第i个结点，即要删除的结点 		if (s = = NULL)// 不合法 			printf("Cant't  delete"); 		else {// 合法，那么就要删除他 			p->next = s->next;// 将s前面的结点和后面的结点连接起来 			free(s);// 释放要删除的节点 		} 	} } 我还有一点不明白  为什么要删除0结点啊？

引用 13 楼 weixin_44787439 的回复:[quote=引用 11 楼 user-2的回复:][quote=引用 9 楼 weixin_44787439 的回复:] [quote=引用 8 楼 user-2的回复:]无头结点就是说，链表的第一个结点也保存数据 那为什么要删除第一个结点[/quote]我什么时候说要删除第一个结点了。我感觉你是抄的代码[/quote] 不是抄的  老师给的  [/quote]抱歉说错话了。

引用 11 楼 user-2的回复:[quote=引用 9 楼 weixin_44787439 的回复:] [quote=引用 8 楼 user-2的回复:]无头结点就是说，链表的第一个结点也保存数据 那为什么要删除第一个结点[/quote]我什么时候说要删除第一个结点了。我感觉你是抄的代码[/quote] 不是抄的  老师给的

你还是用IDE调试吧。清晰明了。  另外：请将以前的帖子结了。

引用 9 楼 weixin_44787439 的回复:[quote=引用 8 楼 user-2的回复:]无头结点就是说，链表的第一个结点也保存数据 那为什么要删除第一个结点[/quote]我什么时候说要删除第一个结点了。我感觉你是抄的代码

引用 7 楼 weixin_44787439 的回复:else j=0;s=q这里不太明白j=0，就是计数用的，不然你怎么知道你找了多少个了。 s是用来记录你找到的第i个结点，也就是要删除的结点。

引用 8 楼 user-2的回复:无头结点就是说，链表的第一个结点也保存数据 那为什么要删除第一个结点

无头结点就是说，链表的第一个结点也保存数据

引用 5 楼 user-2的回复:感觉我说了和没说一样，自我感觉。主要是我不知道说啥。都能看出来。干脆你直接说那一行吧 else j=0;s=q这里不太明白

引用 4 楼 user-2的回复:delete(LinkList* q, int i) {  //在无头结点的单链表中删除第i个结点 	LinkList* p, * s; 	int  j; 	if (i < 0) 		printf("Can't delete"); 	else if (i = = 0) { 		s = q;// 指向要删除的结点 		q = q->next;// 头指针指向下一个结点，即新的头 		free(s);// 释放结点 	} else { 		j = 0; s = q; 		while ((j < i) && (s!= NULL)) {// 找到第i个结点 			p = s; 			s = s->next; 			j++; 		} 		if (s = = NULL) 			printf("Cant't  delete"); 		else { 			p->next = s->next;// 跳过s，因为它要删除 			free(s); 		} 	} } 无头结点就是要删除第一个结点么？


Question: 冒泡思想使带头节点单链表有序

void sort(linklist &L){ Lnode *p=L->next,*pre; Lnode *r=p->next; p->next=NULL; p=r; while(p!=NULL){ r=p->next; pre=L; while(pre->next!=NULL&&pre->next->data<p->data) pre=pre->next; p->next=pre->next; pre->next=p; p=r; } }

指路我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《单链表排序(冒泡排序&快速排序)》, 一起来围观吧 https://blog.csdn.net/weixin_40995778/article/details/82822624?utm_source=app


Question: 求助算法题

int main() {     int num,low,i,j = 0,n = 0;     int stdno,score;     int temp; 	int stdnohigh[200] = {0};      scanf("%d %d",&num,&low);        // get qualified data     for(i = 0;i < 2*num; i+=2){         scanf("%d %d",&stdno,&score);         if(score >= low){             stdnohigh[j++] = stdno;             stdnohigh[j++] = score;         }     }      // sort     for(i = 0;i < j/2 - 1; i++){ 		for(n = 0; n < j - 2 -i; n+=2){ 			if(stdnohigh[n+1] <= stdnohigh[n+3]){ 				if(stdnohigh[n+1] == stdnohigh[n+3]){ 					if(stdnohigh[n] > stdnohigh[n+2]){ 						temp = stdnohigh[n+2]; 						stdnohigh[n+2] = stdnohigh[n]; 						stdnohigh[n] = temp; 					} 				}else{ 					// exchange score 					temp = stdnohigh[n+3]; 					stdnohigh[n+3] = stdnohigh[n+1]; 					stdnohigh[n+1] = temp;  					// exchange stdno 					temp = stdnohigh[n+2]; 					stdnohigh[n+2] = stdnohigh[n]; 					stdnohigh[n] = temp; 				} 			} 		}        }  	for(i = 0; i < j; i+=2){ 		printf("%d %d\n",stdnohigh[i],stdnohigh[i+1]); 	}  	return 0; } 试一下，但是排序还可以更高级，这里用的是冒泡排序

了解一下sort的自定义排序

可以用stdlib.h的qsort

谢谢大佬


Question: 用二重循环编程

非常谢谢你，解决了我的问题！

改成这样就行了：

浮点数不是精确的，本来应该是0.8，但是计算机存储的时候精度丢失。所以变小了。因此最后0.5的时候已经小于0.5了，因此最后一次无法加到sum里面。


Question: 打印出所有的“水仙花数”。为啥我的代码不能输出？

引用 3 楼 weixin_40290083的回复:[quote=引用 2 楼 ljn20010724 的回复:] [quote=引用 1 楼 user-2的回复:]再想想s=i/10;能否计算出十位 噢噢噢 我改成了s=i/10-10 可是只输出了一个153[/quote]   s = i/10 % 10[/quote] 非常谢谢你，终于对了

引用 2 楼 ljn20010724 的回复:[quote=引用 1 楼 user-2的回复:]再想想s=i/10;能否计算出十位 噢噢噢 我改成了s=i/10-10 可是只输出了一个153[/quote]   s = i/10 % 10

引用 1 楼 user-2的回复:再想想s=i/10;能否计算出十位 噢噢噢 我改成了s=i/10-10 可是只输出了一个153

再想想s=i/10;能否计算出十位


Question: 算法题求助

👌大佬，过会我试一下

#include <stack> #include <iostream> using namespace std;  void convert(int number, int div){  	stack<int> s_num; 	while(number){ 		s_num.push(number%div); 		number /= div; 	} 	while(!s_num.empty()){ 		cout << s_num.top(); 		s_num.pop(); 	} }   int main(int argc, char **argv){ 	 	int number, div; 	cin >> number; 	cin >> div; 	cout << "number == " << number << " == "; 	convert(number, div); 	return 0; }   利用数据结构中栈来实现的C++代码，拿走不谢

博主学过数据结构吗，学过数据结构后，这类进制转化的问题可以直接用栈的方法解决

引用 27 楼 Donald_Shallwing 的回复:博主学过数据结构吗，学过数据结构后，这类进制转化的问题可以直接用栈的方法解决目前正在学，学过书上的例子，但没有真正用来解过题，

引用 24 楼 悲伤的小霉的回复:[quote=引用 22 楼 bsnow的回复:][quote=引用 19 楼 悲伤的小霉 的回复：]可以，就是模拟进位运算，和十进制一样。我看了一下这道题虽然不难，但是也很有意思。后来发现一篇文章https://leetcode.com/articles/add-binary/  我采用得是第一个算法的思想，第二个更精妙[/quote] #include<stdio.h> #include<string.h> const int N=1010; char a[N],b[N]; int aa[N],bb[N],ans[N]; int main() {     while(~scanf("%s%s",a,b))     {         int lena=strlen(a);         int lenb=strlen(b);         int len=lena>lenb?lena:lenb;         for(int i=lena-1;i>=0;i--)aa[len--]=a[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         for(int i=lenb-1;i>=0;i--) bb[len--]=b[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         int pre=0;         for(int j=len;j>=0;j--)       //开始相加         {             ans[j]=(aa[j]+bb[j]+pre)%2;             pre=(aa[j]+bb[j]+pre)/2;         }         int pos=-1;         for(int i=0;i<=len;i++)    //找到第一个非0         {             if(ans[i])             {                 pos=i;                 break;             }         }         if(pos==-1) printf("0\n");//遍历完数组，没有发现非0数，那么输出0         else         {             for(int i=pos;i<=len;i++)//从第一个非0处输出                 printf("%d",ans[i]);             printf("\n");         }     }     re这个是c++的[/quote] #include<stdio.h> #include<string.h> const int N=1010; char a[N],b[N]; int aa[N],bb[N],ans[N]; int main() {     while(~scanf("%s%s",a,b))     {         int lena=strlen(a);         int lenb=strlen(b);         int len=lena>lenb?lena:lenb;         for(int i=lena-1;i>=0;i--)aa[len--]=a[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         for(int i=lenb-1;i>=0;i--) bb[len--]=b[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         int pre=0;         for(int j=len;j>=0;j--)       //开始相加         {             ans[j]=(aa[j]+bb[j]+pre)%2;             pre=(aa[j]+bb[j]+pre)/2;         }         int pos=-1;         for(int i=0;i<=len;i++)    //找到第一个非0         {             if(ans[i])             {                 pos=i;                 break;             }         }         if(pos==-1) printf("0\n");//遍历完数组，没有发现非0数，那么输出0         else         {             for(int i=pos;i<=len;i++)//从第一个非0处输出                 printf("%d",ans[i]);             printf("\n");         }     }     return 0; }

引用 22 楼 bsnow的回复:[quote=引用 19 楼 悲伤的小霉 的回复：]可以，就是模拟进位运算，和十进制一样。我看了一下这道题虽然不难，但是也很有意思。后来发现一篇文章https://leetcode.com/articles/add-binary/  我采用得是第一个算法的思想，第二个更精妙[/quote] #include<stdio.h> #include<string.h> const int N=1010; char a[N],b[N]; int aa[N],bb[N],ans[N]; int main() {     while(~scanf("%s%s",a,b))     {         int lena=strlen(a);         int lenb=strlen(b);         int len=lena>lenb?lena:lenb;         for(int i=lena-1;i>=0;i--)aa[len--]=a[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         for(int i=lenb-1;i>=0;i--) bb[len--]=b[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         int pre=0;         for(int j=len;j>=0;j--)       //开始相加         {             ans[j]=(aa[j]+bb[j]+pre)%2;             pre=(aa[j]+bb[j]+pre)/2;         }         int pos=-1;         for(int i=0;i<=len;i++)    //找到第一个非0         {             if(ans[i])             {                 pos=i;                 break;             }         }         if(pos==-1) printf("0\n");//遍历完数组，没有发现非0数，那么输出0         else         {             for(int i=pos;i<=len;i++)//从第一个非0处输出                 printf("%d",ans[i]);             printf("\n");         }     }     re这个是c++的

引用 4 楼 悲伤的小霉 的回复：可以了,谢谢大佬可是提交答案还是不能通过，提示  Runtime Error！！超时了，算法精简下

引用 19 楼 悲伤的小霉 的回复：可以，就是模拟进位运算，和十进制一样。我看了一下这道题虽然不难，但是也很有意思。后来发现一篇文章https://leetcode.com/articles/add-binary/  我采用得是第一个算法的思想，第二个更精妙

可以用字符串，这样写更简单

可以，就是模拟进位运算，和十进制一样。

弱弱的问一句，用二进制直接进行加法操作不可以吗？

看看看不错的

直接二进制运算也可以，但是需要unsigned int [32]或者unsgined long long [16]数组，要自己处理移位和进位

感谢大佬！！！！！

#include <stdio.h> #include <string.h> #include <stdlib.h>  #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #define MAX(X, Y) (((X) < (Y)) ? (Y) : (X))  int binCharAdd(char a, char b, char *sum, int c) {     int cin;     cin = (a & 0x01) + (b & 0x01) + (c >> 1);     *sum = (cin & 0x01) + 0x30;     return (cin & 0x02); }  char * addBinary(char * a, char * b) {     int aLen = strlen(a);     int bLen = strlen(b);     int maxLen = MAX(aLen, bLen);     int minLen = MIN(aLen, bLen); //    char *sum = (char *)malloc(sizeof(char) * (maxLen + 1));     char sum[1001];     char *pt = sum;     for(int i = 0; i < maxLen + 1; i ++)     {         sum[i] = '0';     }     sum[maxLen + 1] = 0;     if (aLen > bLen)     {         memcpy(&sum[aLen - bLen + 1], b, bLen);     }     else     {         memcpy(&sum[bLen - aLen + 1], a ,aLen);     }     int cin = 0;     for(int i = maxLen; i > 0; i --)     {          cin = binCharAdd(sum[i], aLen > bLen ? a[i - 1] : b[i - 1], &sum[i], cin);     }     if (cin == 2)     {         sum[0] = '1';     }     while(*pt == '0' && pt != &sum[maxLen])     {         pt ++;     }     return pt; }  int main() {     char a[1000];     char b[1000];     char *c;     while(scanf("%s%s", a, b) == 2)     {         c = addBinary(a, b);         printf("%s\r\n",c);     }     return 0; }    试试这个？ 代码有点点乱，不好意思。

引用 12 楼 悲伤的小霉 的回复：[quote=引用 11 楼 bsnow的回复:]我终于读懂这个题了 二进制长度最大 1000位，所以INT肯定存不下。  字符串就可以没问题了。 嗯嗯，有什么好办法吗？我用c写不出来[/quote]我试试，最近都在做硬件 这些题好久没碰了

#include <stdio.h> #include <string.h> #include <stdlib.h>  #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #define MAX(X, Y) (((X) < (Y)) ? (Y) : (X))  int binCharAdd(char a, char b, char *sum, int c) {     int cin;     cin = (a & 0x01) + (b & 0x01) + (c >> 1);     *sum = (cin & 0x01) + 0x30;     return (cin & 0x02); }  char * addBinary(char * a, char * b) {     int aLen = strlen(a);     int bLen = strlen(b);     int maxLen = MAX(aLen, bLen);     int minLen = MIN(aLen, bLen);     char *sum = (char *)malloc(sizeof(char) * (maxLen + 2));     char *pt;     for(int i = 0; i < maxLen + 1; i ++)     {         sum[i] = '0';     }     sum[maxLen + 1] = 0;     if (aLen > bLen)     {         memcpy(&sum[aLen - bLen + 1], b, bLen);     }     else     {         memcpy(&sum[bLen - aLen + 1], a ,aLen);     }     int cin = 0;     for(int i = maxLen; i > 0; i --)     {          cin = binCharAdd(sum[i], aLen > bLen ? a[i - 1] : b[i - 1], &sum[i], cin);     }     if (cin == 2)     {         sum[0] = '1';     }     pt = sum;     while(*pt == '0' && pt != &sum[maxLen])     {         pt ++;     }     return pt; }  int main() {     char a[1001];     char b[1001];     char *c;     while(scanf("%s%s", a, b) == 2)     {         c = addBinary(a, b);         printf("%s\n",c);     }     return 0; }    这个程序是通过了的。

那个还是不行，我自己在电脑上运行第25行报了个错，https://nuoyanli.com/contest/24/problem/D这个是原题的网站，你看看。

引用 11 楼 bsnow的回复:我终于读懂这个题了 二进制长度最大 1000位，所以INT肯定存不下。  字符串就可以没问题了。 嗯嗯，有什么好办法吗？我用c写不出来


Question: 关于return

getchar函数是等待用户输入的，与上面S函数没有关系，在这里你需要的是输出printf。

int a; a=s(1. 2) printf

看你对空白的定义了，编译器返回了值，只是你自己不记录，不处理而已.

屏幕上会显示东西是因为你让计算机显示了 但你的程序只是让计算机计算，没有让它显示，所以它就没有显示 printf("%d", S(1 , 2) );

你凭什么说结果是空白，调用函数S后，它的返回值并没有赋给任何变量，也没有使用输出语句输出。 如果将它赋给一个变量，如int a = S(1,2),即使你不输出a,你在调试模式时，也可以跟踪跟踪到a的值，或者你可以直接输出printf("S(1,2)"),在屏幕上可以看到返回的值。

你是凭什么认为调用函数返回的结果是“空白”？

S的返回值楼主没有处理。如果要看结果可以 printf("%d\n", S(1, 2));

你得 printf


Question: C语言变量定义问题

int a,b; 这样定义了a和b，只是没有初始化。 之后执行a = b = 6；对a和b进行赋值  int a = b = 6；编译的理解是将 b 赋值为6，再定义a，将 b 的值赋值给 a 对 a 进行初始化。但是， b 在之前是没有定义的，所以 b = 6 这里会发生错误

int a=b=6 意思是定义一个变量a，让它的值赋值为变量b的值 但此时变量b没有定义，因此错误 如果变量b已定义，这句就没问题 定义的变量之间用逗号分开，你a和b之间是使用的=，那么编译器为啥不认为你是在运算而要认为你是在定义a、b两个变量？

b没有定义，因此int a = b = 10;是不可以的。

我以为这个是写编译器的人规定的。其他的我就不知道了。


Question: 我这个为什么运行不了啊是数组越界了吗？有什么解决办法啊

scanf("%lld",&m); if (m > size)     m = size;

scanf("%lld",&extent[i]);


Question: 编辑器

DEV的调试，可能是软件本身的问题，首先要调整一点设置，这点你可以百度 其次，调试是对可执行程序调试，你得先编译 然后，你得加断点

这个跟运行环境有关系，其实还是在linux平台的vim、gcc、gdb方便，不过是命令行的，一开始可能会不太习惯

引用 3 楼 pengbolan的回复:DEVC++不错的，简单，小巧，功能强大 我用的这个，但是一调试他就直接退出来

编辑器可以用VIM，但是要调试可以考虑用gdb

DEVC++不错的，简单，小巧，功能强大

VS无敌。哈哈哈

你是要编辑器，还是编译器，还是集成IDE呢


Question: c语言函数调用

晚上有很多这样的说明和代码，建议先自己找一找，自己写一写～


Question: 为什么我输入一组数据后回车，程序过一会直接结束

int i=0,j,num[20],N,mid;     char name[20][32];     scanf("%d",&N);     if (N > 20)         N = 20;     while(i<=N){         scanf("%s %d",name[i],num[i]);         i++;      }

for(i=1;1<=N;i++){ //把1<=N改为i<=N

1、char name[20][30]; 2、第5行的i等于1


引用 楼主 qq_45740576的回复:求C语言1+2+3+4+...100 #include<stdio.h>  int main() {     int i,sum=0;     for(i=1;i<=100;i++)     {         sum=sum+i;     }     printf("sum=%d",sum);     return 0; }

#include<stdio.h>  int main() {     int i,sum=0;     for(i=1;i<=100;i++)     {         sum+=i;     }     printf("sum=%d",sum);     return 0; }

#include<stdio.h> int main() {    int i,sum=0;     for(i=1;i<=100;i++) {        sum+=i; } printf("%d",sum); return 0; }


Question: 求教

翻译一下吧～是看不懂英文还是自己不会写？～


Question: 新手求助

#include <stdio.h>  int main() {   for (int n, i = (scanf("%d", &n), 0), j; scanf("%d", &j), i < n; i++)     putchar(j); puts("");    return 0; }

CSDN论坛新手指南

#include <stdio.h> int main(void) { 	int n,a; 	scanf_s("%d", &n); 	for (int i = 0;i < n;i++) { 		scanf_s("%d", &a); 		printf("%c", a); 	}     return 0; } 谢谢采纳！


Question: C语言练习题求助，急今晚要交作业了

baidu  N多现成代码，还要来这里要。

已经过了今晚了，不知道你作业交没。  #include <stdio.h> #include <math.h>  int narcissistic(int number) {     int n[6] = {0};     int i = 0;     int bak = number;     while(number != 0)     {         n[i ++] = (number % 10);         number /= 10;     }     for(int j = 0; j < i; j++)     {         bak -= pow(n[j], i);     }     int re = bak == 0 ? 1 : 0;     return re; }  void PrintN(int m, int n) {     for(int i = m + 1; i < n; i ++)     {         if(narcissistic(i))         {             printf("%d\r\n", i);         }     } }

谢邀，作业好好做，本人不提供代码，谢谢！


Question: 伪代码快速排序

引用 1 楼 六道佩恩 的回复：小于，这样循环结束的时候就是它们相等，然后它们就表示的同一个位置了 如果<= 那么循环结束的时候，它们已经相互错过了然后我就懵了

引用 1 楼 六道佩恩 的回复：小于，这样循环结束的时候就是它们相等，然后它们就表示的同一个位置了 如果<= 那么循环结束的时候，它们已经相互错过了但我们老师说不是这样的，他说只有小于号出来的也是错过的


Question: 伪代码快速排序

各位大佬，孩子求救


Question: 输出水仙花数

引用 2 楼 喜欢做我自己的回复:你把c都数字进行改变了，还是原先的数据吗，最后你还和sum比什么？在退出for循环之时c都变成0了，怎么匹配得到 虽然我菜 但是这语气也太冲了吧

有用的话麻烦把贴结了，谢谢

#include<stdio.h> int main() { int x,y,z,i; //scanf("%d",&i); for(i = 100 ;i < 1000; i++) {  x=i%10; y=i/10%10; z=i/100; if(i<100||i>999) printf("Invalid Value!\n"); if(i>=100 && i<=999 && i==x*x*x+y*y*y+z*z*z) printf("Yes  %d\n",i); //if(i>=100 && i<=999 && i!=x*x*x+y*y*y+z*z*z) //	printf("No\n");  } return 0; }

#include <stdio.h> #include <math.h>  int main() {   int i, n, s, x, y, z[10] = {0, 1};    scanf("%d", &n);   if (n > 2 && n < 8)   {     for (i = 2; i < 10; i++) z[i] = pow((double)i, n);     x = pow(10.0, n - 1);     for (i = x; i < x * 10; i++)     {       for(y = i, s = 0; y; y /= 10) s += z[y % 10];       if (s == i) printf("%d ", i);     }   }    return 0; }

引用 12 楼 喜欢做我自己的回复:关于我回问题的事情，我可能回复语气不对，在这里抱歉了。 有一点要提醒你的是，你已经有四个贴没结了，不是一个哦，麻烦给其他人一个鼓励，回帖与结贴 只是一个交流，但你问题解决了，起码给他人一个感谢吧。 知道了 我一开始用的就是手机版 没有结帖的功能 我一会回去用电脑操作一下

引用 10 楼 自信男孩的回复:#include<stdio.h> #include <math.h>  int main() {     int i, tmp, sum;;      for(i = 100 ;i < 1000; i++)     {         tmp = i;         sum = 0;          while (tmp) {             sum += pow(tmp % 10, 3);             tmp /= 10;         }         if (sum == i)             printf("%d\t", sum);     }     putchar(10);      return 0; }  供参考～ 咦 我看了一下这个程序好像也是只针对三位数的 。。四位五位好像就不太行了

仔细看了一下 这个程序只是针对于三位数的水仙花数 四位数五位数的就不符合了

结贴率0%，真不错[/quote] 手机版没法结 一会去pc给您结 我也道个歉

引用 6 楼 喜欢做我自己的回复:结贴率0%，真不错 我第一次用帖子问问题 不知道怎么结 你这样嘲讽真的有意义吗

结贴率0%，真不错

最近心情不好，我道歉


Question: 求大神们帮个忙看一下这读取访问权限问题是为啥，谢谢

引用 2 楼 真相重于对错的回复:p1指向了一个不存在的地址。 具体为什么，请自己调试。 👌谢谢，我去自己调试一下

引用 3 楼 自信男孩的回复:p1->data前要加&，这个&是加给data的。  p1是野指针，所以需要处理一下，否则楼主的代码可能会出现段错误～ 非常感谢大佬回答我再去试一下

引用 1 楼 user-3的回复:加一个取地址符   &p1->data 好的谢谢你啦我去试一下

p1指向了一个不存在的地址。 具体为什么，请自己调试。

引用 7 楼 真相重于对错的回复:你的代码逻辑有问题。先序遍历，一般实访问本节点，如果右子树不为空，把右子树压入栈中，然后把本节点指向它的左子树，如果本节点为空则从栈中弹出栈顶付给本节点。 好的谢谢大佬的耐心解答，我换个算法试试

加一个取地址符   &p1->data


Question: c

max = a > b ? (a > c ? a: c) : (b > c ? b: c);


Question: 求解c语言如何跳过多组数据输入后的缓冲区

把问题描述的再详细一些～问题比较歧义

引用 1 楼 自信男孩的回复:把问题描述的再详细一些～问题比较歧义 输入三个字符后，按各字符的ASCII码从小到大的顺序输出这三个字符。

引用 2 楼 user-2的回复:把题目发出来，看一看题才好判断 输入三个字符后，按各字符的ASCII码从小到大的顺序输出这三个字符。

把题目发出来，看一看题才好判断


Question: BITMAP中的三基色顺序？

引用 1 楼 user-1 的回复:GetPixel得到的数据是RGB排列的 GetBitmapBits得到的数据是BGR排列的  The GetBitmapBits function copies the bitmap bits of a specified device-dependent bitmap into a buffer. Note  This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the GetDIBits function. 话说GetDIBits和SetDIBits中hdc是不是鸡肋？我设置与hbitmap无关的hdc也照样获取位图数据


Question: 输出判断2000年到2050年是否为闰年

引用 4 楼 qq_45674693的回复:[quote=引用 3 楼 自信男孩的回复:] int is_leap_year(int year) {      if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)          return 1;      return 0; }  供参考～  判断是否为闰年～ 这个是判断一个年份的，[/quote] 我后面也试试这个程序，谢谢

引用 3 楼 自信男孩的回复: int is_leap_year(int year) {      if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)          return 1;      return 0; }  供参考～  判断是否为闰年～ 这个是判断一个年份的，

引用 1 楼 與蘤舊縐的回复:year=year+i 2000+1=2001 2001+2=2003  噢噢噢，谢谢谢谢，真的感谢

year=year+i 2000+1=2001 2001+2=2003


Question: 为什么我这个老师负号呀我寻思算法没啥问题啊！

sum没有初始化～

图片歪了。。。。。

让sum=0，应该就能解决了。

应该是sum没有赋初值，系统随机分配值给sum了

变量赋初值，加单步调试


Question: （C语言）设计程序判断日期的有效性。用户输入日期数据（月／日／年），输出相应判断结果。求大神帮忙

int year = 2012, month = 2, date = 30; 	int mark = 1; 	if (year < 1000) { 		printf("年错误\n"); 		printf("将不再判断月份和日期"); 		mark = mark && 0; 	} 	else { 		mark = mark && 1; 	    if (month < 1 || month > 12) { 		    printf("月错误\n"); 		    printf("月错误将不判断日期\n"); 			mark = mark && 0; 		} 		else { 			mark = mark && 1; 			bool runNian = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); 			switch (month) { 			    case 1: 			    case 3: 			    case 5: 			    case 7: 			    case 8: 			    case 10: 			    case 12: { 					if (date < 1 || date >31) { 						printf("日期错误"); 						mark = mark && 0; 					} 					else { 						mark = mark && 1; 					} 					break; 			    } 				case 2:{ 					if (runNian) { 						if (date < 1 || date > 29) { 							printf("日期错误"); 							mark = mark && 0; 						} 						else { 							mark = mark && 1; 						} 					} 					else { 						if (date < 1 || date > 28) { 							printf("日期错误"); 							mark = mark && 0; 						} 						else { 							mark = mark && 1; 						} 					} 					break; 				} 				case 4: 				case 6: 				case 9: 				case 11: { 					if (date < 1 || date > 30) { 						printf("日期错误"); 						mark = mark && 0; 					} 					else { 						mark = mark && 1; 					} 					break; 				}  			} 		} 	}  	if (mark) { 		printf("年月日正确"); 	}

闰年判断，每月的天数可以用数组保存。

if-else的运用吗？这算是。可以贴一下你写的代码。


Question: 帮忙看一下哦

误改为勿。。。

1、把以前的帖子结一下 2、图片麻烦摆正 3、描述一下你的问题，而不是看一下。 （而且我已经看了，你是不是该结贴呢？这是一句调侃，误当真。）


Question: 关于释放内存的疑问

分配和释放跟类型毫无关系，就是位置（首地址）和大小

引用 1 楼 早打大打打核战争 的回复:malloc返回的指针指向的内存块之前还有一部分多分配的内存是记录分配块信息的 恩，网上找点资料，看了一些原理 。 看到这一点了，是有一块管理信息记录了大小、可用。还有必须指向地址首部时释放

malloc返回的指针指向的内存块之前还有一部分多分配的内存是记录分配块信息的


Question: 求解这个程序的意思！

50以内的素数

可以写一下每一句的注释。注释写的差不多的话，原理也就该懂了。


Question: 求助，我从各个串口获取到的数据怎么通过指定的数据格式输出，如图所示

求回复啊啊啊啊啊


Question: 求方程实根

引用 1 楼 qq_45718176 的回复:刚刚发错了，是格式错误，对不起各位请无满意结帖。

刚刚发错了，是格式错误，对不起各位


Question: printf傻瓜式输出心形

我很无聊的。。。。  #include<string.h> #include<stdio.h>  void show_char(char* str) {     printf("  *       *\n");     printf(" ****   ****\n");     printf("*************\n");     printf("  ****%s****\n",str);     printf("    *****\n");     printf("      *\n\n"); } int main(void) {     show_char("我");     show_char("爱");     show_char("你");      return 0; }

三个图形除了中间的字不一样，其他的都一样，可以考虑写个函数， void output(char* word) {     // 输出心形 }


Question: 程序写出来不对(第四题)

能看出来哪里错了吗？

直接贴代码和需求吧

谢谢大家，我知道怎么错了。 然后我用break语句改了一遍做出来了。

你的代码是每检查一个数是不是num或tra的约数，如果不是，就打印一对数，那问题就来了：当num=7的时候，进入for循环，div1=2，第一个if语句判断为假（7%2！=2），进入else语句，这时tra为9，div2=2，再进入if语句，判断依旧是假，然后你就打印了。。 应该是检查完所有小于num的平方根的数是不是约数才能判断它是不是素数，tra也是相同道理

你这逻辑上有错误，你是在num不能被某个div1整除的情况下再去找一个不能被div2整除的tra,显然均未满足素数要求不能被除本身和1以外的所有数整除。这里提供一个方法，写一个函数，判断是否是素数，然后再进行遍历搜索相差为2的素数


Question: 一元多项式计算

解方程还是列式子带入计算

如果这样的话你就模拟一下手算的过程 给你点思路，比如 用数组存储各次幂的系数，具体怎么存随意，比如用三个数组存储式1、式2及结果 设置判断要算什么，加减乘除等，每一个分别用一个函数实现 函数里面写什么是关键，简单还是复杂与之前的存储方式也有关系，加减乘很好解决，就除法可能困难点 你先试试

随便一个一元多项式的加法减法运算


Question: 代码有问题

引用 3 楼 林多 的回复：   string->s = (char*)malloc(sizeof(char)*m);         if(NULL != string->s) {              string->max = m;             string->n = 0;             return NULL;   // 这个地方应该是不小心写错了，不该返回空         }    - 正确    string->s = (char*)malloc(sizeof(char)*m);         if(NULL != string->s) {              string->max = m;             string->n = 0;             return string;  // 返回string         }   嗯谢谢我回去试试

不对，我写好啦，不过我复制到这就变形啦

先把代码格式和风格做好吧。自己看自己写的代码不感觉别扭吗？！


Question: 小白提问Visual  studio 莫名其妙报错

scanf_s("%d,&arr[i],10"); 改成： scanf_s("%d", &arr[i]);

scanf不是这样用的


Question: 求大神解题

去掉scanf中的'\n'

输入和处理各加循环，输入的数据存入数组，输入结束后再统一处理

要求是输入若干个半径，再逐行输出结果 你就只能处理一个 外面加个循环，再设定一下退出循环条件


Question: 求大佬指教圈出来的部分是什么意思？（c51单片机流水灯程序）

引用 1 楼 user-2的回复:sbit只是一个自定义类型吧，^只是异或而已，第二个圈第一行应该是写错了吧？编译能过吗？ 是错了，不小心输了个9

引用 2 楼 gouyanfen的回复:sbit 是位变量，单片机的扩展类型 第一个圈定义，对应变量控制的端口 第二个圈 对应的端口控制变量初始值 你好，还想问一下，为什么要定义这五个p1的端口，但是之后的程序中好像并没有用到这五个端口？还有，下边p0=~shift，但是前边的程序并没有定义p0端口，怎么确定led灯接受的就是p0端口的信号呢？


Question: 一元二次方程共轭复数i如何定义

fabs(a)<1e-10  什么意思  新手不太懂  网上说可能是a<1*10的负十次幂  但是跟这个编程有什么关联呢

引用 1 楼 user-2的回复:不用定义，输出时显示字符'i'就是了 想输出例如3+4i，但输出了别的，能帮忙怎么改吗？

不用定义，输出时显示字符'i'就是了


Question: 链栈的出栈函数执行两次，出来的返回值（被删除的栈顶元素）却一样，请问这是怎么一回事？

引用 1 楼 user-1 的回复：入栈代码也发一下吧，这个出栈函数有点问题但看不出关键错误你好，完整代码我已经发在下面啦，谢谢！

#include<stdio.h> #include<stdlib.h>  typedef struct SNode//定义运算符OPTR数据类型 {     char data;     struct SNode * next; }OpStack,*LinkStack;  typedef struct SNode1 //定义运算数OVS数据类型 {     float data1;     struct SNode1 * next; }OvStack,*LinkStack1;  void push(OpStack *s,char n)//在运算符栈的顶部插入n {     OpStack *temp;     temp=(OpStack *)malloc(sizeof(OpStack));     temp->data=n;     temp->next=s->next;     s->next=temp; }  void push1(OvStack *s,float n)//在运算数栈的顶部插入n {     OvStack *temp;     temp=(OvStack*)malloc(sizeof(OvStack));     temp->data1=n;     temp->next=s->next;     s->next=temp; }  int pop(OpStack *top,char *x) //将运算符栈顶元素p弹出，放到x所指的存储空间中 {     OpStack *p;     p=top->next;//定义p为第一个元素     if(top==NULL) return 0;     *x=p->data;     top->next=p->next;     free(p);//释放p     return 1; }  int pop1(OvStack *top,float *y) //将运算数栈顶元素p弹出，放到y所指的存储空间中 {      OvStack *p;     p=top->next;//定义p为第一个元素     if(top==NULL) return 0;     *y=p->data1;     top->next=p->next;     free(p);//释放p     return 1; }  char GetTop(OpStack *s) //取运算符栈顶元素 {     char n;     n=s->next->data;     return n; }  float GetTop1(OvStack *s) //取运算数栈顶元素 {     float n;     n=s->next->data1;     return n; }  char Compare(char a,char b) //比较运算符的优先级 { 	if(a=='(')     { 		switch (b) 		{ 	    case '#': return ' ';break; 		case '+': return '<';break; 		case '-': return '<';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '(': return '<';break; 		case ')': return '='; break; 		}      }  	if(a==')')     { 		switch (b) 		{ 	    case '#': return '>';break; 		case '+': return '<';break; 		case '-': return '<';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '(': return '<';break; 		case ')': return ' '; break; 		}      } 	if(a=='#')     {        switch (b) 		{ 	    case '#': return '=';break; 		case '+': return '<';break; 		case '-': return '<';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '(': return '<';break; 		case ')': return ' '; break; 		}     }  	if(a=='+') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	if (a=='-') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	if (a=='*') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '>';break; 		case '/': return '>';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	if (a=='/') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '>';break; 		case '/': return '>';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	return 0; }  float GetNumber(char *ch) //将输入的char类型值，若不是字符，转换为数值 { 	char temp[50];float m; 	int j=0;int i=0; 	while(ch[i]!='+'&&ch[i]!='-'&&ch[i]!='*'&&ch[i]!='/'&&ch[i]!='#'&&ch[i]!='\0'&&ch[i]!='('&&ch[i]!=')') 	{ 		temp[j]=ch[i];i++;j++; 	} 	m=atof(temp); //string转化为float型 	return m; }  int In(char ch)  //判断输入字符是否为字符,n==1时代表输入字符为字符，n==0时代表输入字符为数字 { 	if(ch=='+') return 1; 	else if(ch=='-') return 1; 	else if(ch=='*') return 1; 	else if(ch=='/') return 1; 	else if(ch=='#') return 1; 	else if(ch=='(') return 1; 	else if(ch==')') return 1; 	else return 0; }  float Excute(float a,char op,float b)  //对a,b执行基本运算 {     switch(op)     {         case '+':return (a+b); break;         case '-':return (a-b); break;         case '*':return (a*b); break;         case '/':return (a/b); break;         default:return 0;     } }  float ExpEvalution(OpStack *OPTR,OvStack *OVS,char *ch)  //表达式求值 {     float x,a,b,v;     char op,n;     int i=0;      push(OPTR,'#');      while(ch[i]!='#'||GetTop(OPTR)!='#')     {         if(In(ch[i])==0) //ch为数字         {             x=GetNumber(ch);             push1(OVS,x);             //while(ch[i]!='+'&&ch[i]!='-'&&ch[i]!='*'&&ch[i]!='/'&&ch[i]!='#'&&ch[i]!='\0'&&ch[i]!='('&&ch[i]!=')')             i++;         }         else          if(ch[i]=='(')          {              push(OPTR,ch[i]);              i++;              continue;          }          else          {                 switch(Compare(ch[i],GetTop(OPTR)))                 {                     case'=':                         pop(OPTR,&n);                         i++;                         break;                     case'>':                         push(OPTR,ch[i]);                         i++;                         break;                     case'<':                         pop1(OVS,&a);                         pop1(OVS,&b);                         pop(OPTR,&op);                         v=Excute(a,op,b);                         push1(OVS,v);                         break;                     case' ':                         break;                  }          }     }     return (GetTop1(OVS)); }  int main() {      OvStack *ovs1,*ovs2,*ovs3; 	OpStack *oprt1,*oprt2,*oprt3; 	float Value1,Value2,Value3;     char ch1[100],ch2[100],ch3[100];  	oprt1=(OpStack*)malloc(sizeof(OpStack)); 	oprt2=(OpStack*)malloc(sizeof(OpStack)); 	oprt3=(OpStack*)malloc(sizeof(OpStack));  	ovs1=(OvStack*)malloc(sizeof(OvStack));     ovs2=(OvStack*)malloc(sizeof(OvStack));     ovs3=(OvStack*)malloc(sizeof(OvStack));      fgets(ch1,100,stdin); 	fgets(ch2,100,stdin); 	fgets(ch3,100,stdin);  	Value1=ExpEvalution(oprt1,ovs1,ch1); 	Value2=ExpEvalution(oprt2,ovs2,ch2); 	Value3=ExpEvalution(oprt3,ovs3,ch3);      int a=(int)Value1;//强制类型转换     int b=(int)Value2;     int c=(int)Value3;  	printf("%d\n",a); 	printf("%d\n",b); 	printf("%d\n",c);  	return 0; }

这个问题已经解决，是GetNumber函数的问题

入栈代码也发一下吧，这个出栈函数有点问题但看不出关键错误


Question: 顺序表求解

引用 2 楼 喜欢做我自己的回复:没有代码，你让人看什么？？？？？？？？？？？ 我自己解决了

引用 2 楼 喜欢做我自己的回复:没有代码，你让人看什么？？？？？？？？？？？ 等等，我这几天有点忙，暂时传不了，不好意思

没有代码，你让人看什么？？？？？？？？？？？

代码呢？？？？


Question: 新手萌新求大佬帮忙

#include<stdio.h> int main(){ 	int a[5]; 	int sum=0; 	for(int i=0;i<=4;i++){ 	scanf("%d",&a[i]);	 	} 	for(int i=0;i<=4;i++){ 		if(a[i]%2==0){ 			sum+=a[i]*2; 		} 		else{ 			sum+=a[i]; 		} 	} 	printf("%d",sum); 	return 0; } 是这样吗。。。。 我不知道对不对。。。

求和。偶数计算和时计算两次。   什么意思？ 求和：求什么的和，五个一起？ 偶数计算和时计算两次。  什么意思计算什么两次？


Question: 有没有大佬帮忙看看这代码的问题

引用 9 楼 user-1的回复:改进一下，把代码发出来就OK啦 我想不明白的是为什么没有结果，这个代码，感觉逻辑好像没什么问题

改进一下，把代码发出来就OK啦

引用 7 楼 user-1 的回复:有时间限制吗？直接除以7，然后取余数另算就可以了  3 10  -------------------------------- Process exited after 8.077 seconds with return value 3221225477 请按任意键继续. . . 输出这种东西了。。我想不通为什么连一个结果都没有。。。就算超时也要有个结果吧。。。

有时间限制吗？直接除以7，然后取余数另算就可以了

引用 4 楼 user-1的回复:代码是大于7以后变成1，从1到7 还是超时。。。。 是不是还有什么问题， 能再帮我看一下吗，大佬

！！！！！！！！我傻了。。。 谢谢大佬

代码是大于7以后变成1，从1到7

引用 1 楼 user-1的回复:数组是从0开始到6的！ 还是不懂。。。。。。

是啊，x超过6不是会重新赋回1吗

数组是从0开始到6的！


Question: 能不能修改此C代码使控制台两次都输出1？

好吧，谢谢大家。

引用 6 楼 csdn31314840 的回复:需要用到一个函数，函数的功能一致，想面向对象语言的类那样，调用成员方法。如class1.fun();class2.fun(); fun()的实现完全一致，但不是指向同一个东西。 虽然你这是发在C版的，但是从代码看，完全就是面向对象的啊！虽然你是使用的struct而不是class

引用 3 楼 csdn31314840 的回复:是不改变fun()函数的前提下，让控制台两次都输出1 你还是说一下你想干什么吧

a传参数0，就是个文字游戏吧？

是不改变fun()函数的前提下，让控制台两次都输出1

static 改成int

不要用static不就可以了吗？


Question: C语言之冒泡法

引用 3 楼 user-1 的回复：恭喜你啦，通过考核了

恭喜你啦，通过考核了

没什么问题，运行可以

有什么问题吗？运行结果如何？


Question: C语言判断三角形类型

你用的是VS 啊 我这个是devc++ 看来是软件的问题 我了个去

你自己的代码


Question: 使CreateCompatibleBitmap空位图变白色的最简办法？

引用 1 楼 user-1 的回复:选入DC后 FillRect填充  FillRect(hdc, &rect, (HBRUSH)GetStockObject (WHITE_BRUSH)); 你这个还需要获取RECT啊，已经好几行代码了 刚刚发现最简方法也许是ExtFloodFill 就是不知道有没有更简的方法了


Question: 关于c语言的数据。

字面量：5、3.14、1.2e3、'A'、"ABC" 常量：字面量、const、&a、arr（数组名）等 变量：int、double等 字面量也是有类型的，比如3.14，它是double型，由于不可修改，于是也有了常量属性 在运算的时候（判断也是运算），不同类型的变量会转成同一种类型去运算（对于变量本身没影响，可以理解为转换的是变量的拷贝）

尤其是对于常量的表现形式区分的意义是什么呢？数据类型是因为判断变量这个盒子放不放的下这个数据，那常量的表现形式的区分意义呢？


Question: 二叉树

不行。。。。。


Question: 求助

引用 3 楼 user-1的回复:malloc，用法你的代码里面都有了 谢大佬谢大佬谢大佬

malloc，用法你的代码里面都有了

引用 楼主 sillyss的回复:#include<stdio.h> #include<stdlib.h> #include<math.h>  #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10  typedef char ElemType; typedef struct { 	ElemType *top; 	ElemType *base; 	int stackSize; }sqStack;  void initStack(sqStack *s) { 	s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); 	if(!s->base) 	{ 		exit(0); 	} 	s->top=s->base; 	s->stackSize=STACK_INIT_SIZE; }  void Push(sqStack *s,ElemType e) { 	if(s->top-s->base>=s->stackSize) 	{ 		s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType)); 		if(!s->base) 		{ 			exit(0); 		} 	} 	*(s->top)=e; 	s->top++; }  void Pop(sqStack *s,ElemType *e) { 	if(s->base==s->top) 	{ 		return; 	} 	*e=*--(s->top); }  int StackLen(sqStack s) { 	return(s.top-s.base); }  int main() { 	ElemType c; 	int sum=0,len,i; 	sqStack s;  	initStack(&s); 	printf("Please input number,ending by \'#\':\n"); 	scanf("%c",&c); 	while(c!='#') 	{ 		Push(&s,c); 		scanf("%c",&c); 	}  	getchar();  	len=StackLen(s); 	printf("The length of the stack is %d:\n",len); 	for(i=0;i<len;i++) 	{ 		Pop(&s,&c); 		sum=sum+(c-48)*pow(2.0,i); 	} 	printf("The answer is %d",sum);  	return 0; }  main函数中的sqStack s   改成  sqStack *s并同时把后面的&s改成s,s改成*s,机器报错 说错了，是无法运行，没有报错

改成指针要给他分配空间啊


Question: c语言题目

已解决 谢谢了

什么问题啊，能不能把错误信息给出来，结果和输入数据给出来，不然看什么？


Question: C语言数据结构链表实现线性表

引用 2 楼 user-1的回复:另外建议看看课本的结构体，取个别名，你这么长写的挺累的。 嗯嗯，我会试着改变习惯的

引用 1 楼 user-1的回复:第10行括号里面是int_linkedlist_node*的类型的，但是结构里面定义的是int_linkedlist*型的 是指哪个结构呢？我不太懂

另外建议看看课本的结构体，取个别名，你这么长写的挺累的。


Question: 数组难题

全局变量只能做初始化，常量运算，不能做变量运算

引用 楼主 weixin_45777389 的回复:求大神帮忙，数组中不能进行或运算么？，但是我把这个程序放在主函数中就不报错，能运行 这个要看你的duan的定义,如果duan是二维数组，这样是不可以的


Question: 输出故障，求解答

学会提问：https://segmentfault.com/faq?utm_source=sf-footer

麻烦将以前的帖子结贴。

先所图调正了


Question: 递归。。。

#include <stdio.h> #include <math.h>  double digui(double i); int main() {     printf("%lf\n",digui(3.0));   return 0; }  double digui(double i) { 	if(i <= 1.0) 	{ 		return 1.0/3.0; 	} 	else 	{		 		return (i/(2.0*i+1.0)) + digui(i-1.0); 	}  }    好用的话记得结贴


Question: 数组前一个位置的指针和数组后一个位置的指针都是合法的吗？

建议都理解为非法就可以了。

不能简单用合法、非法来界定这个问题。 #include <stdio.h>  int main(void) {     int a[3] = { 1,2,3 };     printf("%d\n%d", a[-1], a[3]);      return 0; } 这个程序是可以编译运行的，但是输出结果是两个垃圾值，因为a[-1]、a[3]都越界了。数组a根据指定的数组长度（元素个数）及元素的数据类型分配一段连续的内存空间，理论上，这段内存空间之前/后都会有内存空间，可能是已被分配的内存空间，也可能是未分配的，总之无法确定越界后的内存空间到底是一种什么状态，即便是已分配的内存空间，也无法确定其中存储的是什么，这种越界的访问方式是将那段越界的内存空间当前状态以数组元素数据类型“解析”出来，那其值是什么就更难说了。 因为编译时并不校验是否越界，所以，数组越界是每个程序员都要小心的问题。

引用 7 楼 636f6c696e 的回复:数组本质是偏移，a[-100]都可以写，只是这不是你分配的地址，所以是非法使用 [quote=引用 5 楼 棉猴 的回复:] VC++6.0里面是可以的，定义数组 int a[2] = {1, 2}; 可以得到a[2]和a[-1]的地址  VS2015里面也是可以的[/quote] 那个是监视，相当于读取一个内存位置上的数据，除非是系统保护下的。当然可以， 比如代码改为 a[-1]=10;运行试试？

数组本质是偏移，a[-100]都可以写，只是这不是你分配的地址，所以是非法使用 引用 5 楼 棉猴 的回复:VC++6.0里面是可以的，定义数组 int a[2] = {1, 2}; 可以得到a[2]和a[-1]的地址  VS2015里面也是可以的

就好比电影院的作为，卖个你的票是4排3号，如果4排4号没人你也可以坐，但是不合法。 vc6等老式的编译器因为缺乏检查，所以不一定出错。新式的编译器基本会报错。

都是非法，a[3]只能用0~2，其他都是非法

数组最后一个元素之后的一个元素的指针 是合法的 前一个位置的指针是越界

为什么看不到

可以这样用，但得看这里的空间有没有经过申请。 比如你数组和变量一起申请，经查看地址，发现变量确实位于数组的前后，那么这么做就没问题，访问的就是数组前后的变量 再比如说二维数组，你对中间的一个数组这样做是可以的，访问到的是前一个数组和后一个数组的数据

不论读写都是问题，越界读也是非法 引用 8 楼 真相重于对错 的回复:[quote=引用 7 楼 636f6c696e 的回复:] 数组本质是偏移，a[-100]都可以写，只是这不是你分配的地址，所以是非法使用 [quote=引用 5 楼 棉猴 的回复:] VC++6.0里面是可以的，定义数组 int a[2] = {1, 2}; 可以得到a[2]和a[-1]的地址  VS2015里面也是可以的[/quote] 那个是监视，相当于读取一个内存位置上的数据，除非是系统保护下的。当然可以， 比如代码改为 a[-1]=10;运行试试？[/quote]

有人知道吗？


Question: 求助鸡兔同笼。。

引用 7 楼 wowpH的回复:[quote=引用 6 楼 與蘤舊縐 的回复:] a头，b腿，x兔，y鸡 x=b/2-a； y=a-x;还是你这个清楚，楼主写的把我绕晕了。。。。。[/quote] 还真是输入错了   感谢各位大佬

引用 6 楼 與蘤舊縐 的回复:a头，b腿，x兔，y鸡 x=b/2-a； y=a-x;还是你这个清楚，楼主写的把我绕晕了。。。。。

a头，b腿，x兔，y鸡 x=b/2-a； y=a-x;

式子没错的。可能输入错了。  a头 b脚 x兔 y鸡

输入，检验输入值，运算，输出，这几个都要检查一下

int  main return 0 你的scanf中间用的,输入时需要用逗号隔开

x是兔，y是鸡，是不是对调了？


Question: 这个问题出现在哪里

你的输出是a[10],而不是a[i],a[10]对于数组来讲显然是越界了，但是C不检查越界问题，而a[10]正好就是变量i的地址，你的循环中不断的改变I的值，那么a[10]就是i就跟着改变了。

引用 4 楼 weixin_45761167 的回复:不是很明白，能解释清楚一点吗  你了解下变量内存分配的问题，就知道了。

专门找了VC++6.0调试，  从上图可以看到，a[10]的地址与i的地址相同，都是0x0019ff3c，所以， printf(" %d", a[10]); 实际上a[10]就是i。主要原因是，a[9]的地址是0x0019ff38，而a[10]的地址可以看成是a[9]的地址加上4（int的大小），正好是0x0019ff3c。在VC++6.0中，数组a与变量i的地址是紧挨着的，如下图所示。  在VS2015中调试，你的程序输出的就是十个不确定的值了，因为在VS2015中，数组a与变量i的地址是分开的，a[10]的地址与i的地址不相同。 说来说去，还是因为数组中有10个元素，但是不存在a[10]。

这个程序的运行结果一般应该不是楼主图片所示，应该是输出10个垃圾值，原因如1楼所述。如果楼主重编译运行后的运行结果仍是这样，最大可能是恰巧变量i的内存空间在数组a的后面，但我感觉就这个程序来讲，这种概率很低。 数组的下标是从0开始的，所有程序中数组a的下标只是0到9。

不是很明白，能解释清楚一点吗

引用 1 楼 user-6 的回复:因为a[10]越界了，刚好就是占用了i的位置，请楼主好好写程序！

引用 1 楼 user-6 的回复：因为a[10]越界了，刚好就是占用了i的位置，请楼主好好写程序！

因为a[10]越界了，刚好就是占用了i的位置，请楼主好好写程序！


Question: c语言菜鸟求教

x+1相当于从第一个元素开始的数组，所以里面有i1-1。一般是一定要这么写，直接传x进去就好了，然后i1也不要-1

首先，这玩意为什么要规定i1>1，x[0]完全废掉，但是之前却给x[0]赋了值，令人费解 x作为数组的名字，其实是指向数组第一个元素的指针，x+1就是指把指针后移一格，也就是你的函数中接收到的x数组，其实是原先x数组去掉第一个元素的剩余部分，你可以看到这个for循环中i1-1，就是为了对应元素的位置 无法理解这种操作，多此一举还浪费空间


Question: 求大神指教---字母翻转---萌新不会

~~一个二维数组存储字符串 一个用于暂存字符的数组 一个用于存储结果的二维数组 逻辑很简单，没有骚操作 以二维数组的一行为例，把第一个字符放入暂存数组，判断第二个字符是否与第一个字符连续，若为连续字母，把第二个字符放入暂存数组，再判断后面的，直到不连续，把暂存数组中的字符以倒序的形式放进结果数组中，清空暂存数组，若字符串仍未结束，则继续把下一个字符放入暂存数组，重复上述操作 思路很简单，可以优化的地方有很多，但你还是先解决问题再优化吧

怎么指点？把代码写好了给你吗？等一下看看，可能会有人来的


Question: 成绩百分制转五分制

一定要用switch，只能呵呵了，套十层，第一层除以十亿，第二层除以一亿……一直到最里面判断六七八九十。这么写不是傻逼吗？谁出的傻逼题目？

引用 7 楼 user-2的回复:[quote=引用 6 楼 user-2 的回复:] [quote=引用 4 楼 user-2 的回复:] case 10:  那行改成 default:if (score==100) printf("A\n") else printf("error\n"); 另外10永远不可能取得 少了一个分号，晕[/quote] 还是不对，还得在前面加上判断输入是否合法的代码[/quote] 要用switch解决

😁😁😁要用switch解决哈

引用 6 楼 user-2 的回复:[quote=引用 4 楼 user-2 的回复:] case 10:  那行改成 default:if (score==100) printf("A\n") else printf("error\n"); 另外10永远不可能取得 少了一个分号，晕[/quote] 还是不对，还得在前面加上判断输入是否合法的代码

引用 4 楼 user-2 的回复:case 10:  那行改成 default:if (score==100) printf("A\n") else printf("error\n"); 另外10永远不可能取得 少了一个分号，晕

这个得用switch解决，help

引用 2 楼 SuperDay的回复:不就是个if的事情吗？ 还请大神说详细些，刚学不懂哈，谢谢😜

不就是个if的事情吗？

输入-99不出结果


Question: printf傻瓜式输出心形

好玩

的确挺傻的，连\n可以放到一行里输出都不知道

发了两次。。我也是这么的无聊  #include<stdio.h>  void show_char(char* str) {     printf("  *       *\n");     printf(" ****   ****\n");     printf("*************\n");     printf("  ****%s****\n",str);     printf("    *****\n");     printf("      *\n\n"); } int main(void) {     show_char("我");     show_char("爱");     show_char("你");      return 0; }


引用 2 楼 user-1 的回复:这个怕是搞过的人不多吧 大佬不会吗？

这个怕是搞过的人不多吧

需要将F端口改为输出端口，让它绑定LED灯和蜂鸣器，  #define LED_GREEN     PORTA.0 = 1 #define LED_RED       PORTA.1 = 1 //#define LED_YELLOW    { PORTA.1 = 0; PORTA.2 = 0; } #define LED_OFF       { PORTA.0 = 1; PORTA.1 = 1; }  #define BEE_ON        PORTA.2 = 1 #define BEE_OFF       PORTA.2 = 0


Question: 数学符号用C语音如何表示

趋近于0可以试试取浮点型的最小值，比如1e-300

楼主应该云看看公式编辑器什么的

引用 8 楼 Excellent? 的回复:[quote=引用 7 楼 wowpH的回复:][quote=引用 6 楼 Excellent? 的回复:] [quote=引用 1 楼 user-5的回复:]π可以 define PI 3.14159 那limx趋近于零或者无穷大呢？[/quote]趋于0，那不就是0吗？无穷大应该无法表示。但是每种数据类型都有极限值。[/quote] 1/x，安零计算的话就不成立了[/quote]那我就不知道了，我觉得不可能。

引用 7 楼 wowpH的回复:[quote=引用 6 楼 Excellent? 的回复:] [quote=引用 1 楼 user-5的回复:]π可以 define PI 3.14159 那limx趋近于零或者无穷大呢？[/quote]趋于0，那不就是0吗？无穷大应该无法表示。但是每种数据类型都有极限值。[/quote] 1/x，安零计算的话就不成立了

引用 6 楼 Excellent? 的回复:[quote=引用 1 楼 user-5的回复:]π可以 define PI 3.14159 那limx趋近于零或者无穷大呢？[/quote]趋于0，那不就是0吗？无穷大应该无法表示。但是每种数据类型都有极限值。

引用 1 楼 user-5的回复:π可以 define PI 3.14159 那limx趋近于零或者无穷大呢？

居然说我灌水，真是没脑。楼主，你这个问题是想通过C来展现极限公式吗？

π可以 define PI 3.14159


Question: 新人发帖须知！！！（发帖前请看）

https://bbs.csdn.net/topics/394816569  这个链接问的无法回答。~~!

回了N个帖子，问题解决了没人结贴。不结贴这个是需求问题，就像淘宝一样，到时间自动收货，这个得CSDN的产品经理自己好好反省反省。 别个问问题的目的是解决问题，而不是结贴，你买东西拿到手是目的，主动收货不是你逛淘宝的目的。

引用 1 楼 user-5 的回复:[quote=引用 楼主 fireyou 的回复:] 1. 遇到问题，先百度 2. 尽量不要贴图片 3.代码要排版 4. 自己要动手尝试编写，才能知道错在那里，问问题也能更有针对性 5.问题解决了要及时结贴！！！  其它请楼下补充！就算发图片也不要使用照相的方式，可以抓图，照相的完全没法看，有的还需要脖子转动90或180度[/quote]  能治好你的颈椎病

没啥人，没啥意思，下午五点结贴

我来回一个： 1、发图不要发那种90度旋转的，看着脖子疼，没有想看的欲望； 2、发帖问题解决了一定要结贴，上百个回帖，结贴的就几个，问题老早就解决了，楼主人没回信了，回帖的价值都低了，不想去回的 3、问问题，如果是程序的问题，麻烦提供下源代码和错误提示 4、关于代码，不要贴图片，你只贴张图很轻松，别人想运行看下要打半天，没有想看的欲望的 5、关于代码格式，能不能好好的按程序的格式来粘贴，我记得我看一个帖子，代码全挤一起，赋值出来，光格式就得调几分钟 6、关于问题，最好详细点，抛个图片，或者一句话，其它什么都没有，别人知道你想干嘛吗？   楼下的给我顶上去

最近回了几十个帖子，只有一个结贴的。。。

贴图片又模糊，又是旋转的，自己发了没看一眼吗，还有90%的人都不结贴，没辙。

举双手赞同 90度我忍了 180是要我倒立看吗

这个帖子需要版主来个置顶。。。

引用 楼主 fireyou 的回复:1. 遇到问题，先百度 2. 尽量不要贴图片 3.代码要排版 4. 自己要动手尝试编写，才能知道错在那里，问问题也能更有针对性 5.问题解决了要及时结贴！！！  其它请楼下补充！就算发图片也不要使用照相的方式，可以抓图，照相的完全没法看，有的还需要脖子转动90或180度


引用 2 楼 OYJJO 的回复:[quote=引用 1 楼 N_n_n_n_n_N的回复:]数组元素从0开始 i=1改成i=0 <=11改成<11试试 好像可以了，为啥啊？不能直接改a[12]然后下面i<=12吗[/quote] 想逐个输出你可以用scanf输入更方便一些 getchar会接受空格和回车

引用 2 楼 OYJJO 的回复:[quote=引用 1 楼 N_n_n_n_n_N的回复:]数组元素从0开始 i=1改成i=0 <=11改成<11试试 好像可以了，为啥啊？不能直接改a[12]然后下面i<=12吗[/quote] 数组元素从0开始到元素个数-1结束 你a[12]的数组相当于元素存在a[0]~a[11]中 不是你说想改就可以改的 具体的可以看书查百度看看数组相关的内容

引用 2 楼 OYJJO 的回复:[quote=引用 1 楼 N_n_n_n_n_N的回复:]数组元素从0开始 i=1改成i=0 <=11改成<11试试 好像可以了，为啥啊？不能直接改a[12]然后下面i<=12吗[/quote] 数组越界了

a[i]=getchar(); printf("%c",a[i]); 最大问题是这两句，推断本意是输入一个字符就输出一个，实际上却实现不了这个功能！需要按回车

引用 1 楼 N_n_n_n_n_N的回复:数组元素从0开始 i=1改成i=0 <=11改成<11试试 好像可以了，为啥啊？不能直接改a[12]然后下面i<=12吗

数组元素从0开始 i=1改成i=0 <=11改成<11试试


Question: Ennn我也来问一下PAT乙级 1002题，测试点5（附加：送分）

引用 6 楼 SuperDay 的回复:你可以搞定的啊！我的天，我真是沙雕了。5楼第一张图片是因为它是八进制的12转成10进制就是10。。。。

引用 6 楼 SuperDay 的回复:你可以搞定的啊！没有，虽然发现了奇怪的地方，但是这个不太可能出现。。。还是无法解决我的疑惑。

你可以搞定的啊！

引用 3 楼 SuperDay 的回复:最后需要换行吗？还有，如果前面出现0怎么处理呢？ 不会换行，下面AC的代码也没换行。代码我没动。  惊呆我了。前面有0的话，值居然会改变。  一个0的话没事。  但是按照我的写法，前面根本不可能出现0啊。

最后需要换行吗？还有，如果前面出现0怎么处理呢？

补充：这是我的提交结果。

一个循环就搞定了吧


Question: 求助c语言大佬

想到一个更好的点子——全屏展示  #include "windows.h" #include "stdio.h" #define PIC "E:\\中指.bmp"		//在此修改路径，必须是bmp图片  int main( void )  {  	HDC hdc = GetDC( NULL ); 	HDC mdc= CreateCompatibleDC( hdc ); 	HBITMAP hbitmap = LoadImage( NULL , PIC , 0,0,0,LR_LOADFROMFILE  ); 	SelectObject( mdc , hbitmap );  	BITMAP bitmap; 	GetObject( hbitmap , sizeof(BITMAP), &bitmap ); 	int cx = bitmap.bmWidth; 	int cy = bitmap.bmHeight; 	int w = GetSystemMetrics(0); 	int h = GetSystemMetrics(1); 	StretchBlt(hdc , 0,0,w,h,mdc,0,0,cx,cy,SRCCOPY); 	DeleteDC( mdc ); 	ReleaseDC( NULL, hdc ); 	getchar(); }   实测可行，效果就不截图了，就是放大到全屏，如果希望效果一直持续，可以将StretchBlt那一行延时循环，不过这样做有点缺德

引用 4 楼 六道佩恩 的回复: #include "windows.h" #include "stdio.h" #define PIC "E:\\中指.bmp"		//在此修改路径，必须是bmp图片  int main( void )  {  	HWND h = GetConsoleWindow(); 	SetWindowText( h , "中指" ); 	//设置标题  	HDC hdc = GetDC( h ); 	HDC mdc= CreateCompatibleDC( hdc ); 	HBITMAP hbitmap = LoadImage( NULL , PIC , 0,0,0,LR_LOADFROMFILE  ); 	SelectObject( mdc , hbitmap );  	BITMAP bitmap; 	GetObject( hbitmap , sizeof(BITMAP), &bitmap ); 	int cx = bitmap.bmWidth; 	int cy = bitmap.bmHeight; 	BitBlt( hdc,0,0,cx,cy,mdc,0,0,SRCCOPY ); 	DeleteDC( mdc ); 	ReleaseDC( h , hdc ); 	getchar(); }   需要链接libgdi32.a或者gdi32.lib 这也许是最简的C绘图代码了，你修改第三行的图片路径即可，图片转bmp可以用windows自带的画图工具 如果需要隐藏光标另说 效果如下

你百度一张图片。 百度C语言如何显示图片，应该都有现成的代码。

引用 1 楼 user-3的回复:显示一张竖中指的图片，哈哈 就是那种竖中指的模样 可有源代码

显示一张竖中指的图片，哈哈


Question: 大佬来看看，萌新求解

输入什么，得到什么，输出什么，这三个环节都一一核对过去，就完事了啊

大佬还是没有答案呀，不知道什么状况

大佬还是没用，输入后没答案

大佬还是没有用，输入以后不出答案

引用 4 楼 高尚老薛头 的回复:[quote=引用 3 楼 user-2的回复:]90 93 97是整型数别加单引号 谢谢大佬，大佬再看看有什么问题[/quote]  你用测试例子跑一下就知道了 有问题再提出来就好

引用 3 楼 user-2的回复:90 93 97是整型数别加单引号 谢谢大佬，大佬再看看有什么问题

90 93 97是整型数别加单引号

引用 1 楼 SuperDay的回复:可以嵌套，但是'90'是什么鬼啊？九十吗？不要加引号 对对对！谢谢大佬，你再看看有什么问题吗？

可以嵌套，但是'90'是什么鬼啊？九十吗？不要加引号


Question: 求大家帮忙看一下为什么run不了，我人都裂开了

代码重新整理一下吧

#include <stdio.h> #include <stdlib.h>  /* struct polynomial {  int sign;  int num;  int index;  struct next *next; }next,head,*p;  */  struct stu{   char sign;   double num;   int index;  } a[100], b[100]; void manner( struct stu a[], int q )  { 	struct stu t; 	int o, m;  	for ( o = 0; o < q; o++ )   { 		for ( m = o + 1; m < q; m++ )      { 			if ( a[o].index < a[m].index )          { 				t = a[m]; 				a[m] = a[o]; 				a[o] = t; 			} 		} 	}  	return ; } void write( struct stu a[], int p )  { 	int i; 	printf( "%d ", p );  	for ( i = 0; i < p; i++ )      { 		printf( "%c%lfX^%d", a[i].sign, a[i].num, a[i].index ); 	}  	return ; } void plus( struct stu a[], struct stu b[] )  { 	int i = 0; 	int j = 0; 	int num1, num2;  	for ( num1 = 0; a[num1].sign == "+" || a[num1].sign == "-"; num1++ );  	for ( num2 = 0; a[num2].sign == "+" || a[num2].sign == "-"; num2++ );  	for ( i = 0; i < num1; i++ ) { 		for ( j = 0; j < num2; )        { 			if ( a[i].index == b[j].index )                { 				if ( a[i].sign == b[j].sign )                   { 					if ( a[i].sign == "+" ) { 						a[i].num += b[j].num;  					}                       else { 						a[i].sign = "-"; 						a[i].num += b[j].num; 					}  				}                   else if ( a[i].num < b[j].num ) { 					a[i].sign = b[j].sign; 					a[i].num = b[j].num - a[i].num; 				}  				b[j].sign = "$"; 				j++; 			} 		} 	}  	for ( j = 0, i = num1; j < num2; j++ )        { 		if ( b[j].sign == "+" || b[j].sign == "-" ) { 			a[i].sign = b[j].sign; 			a[i].num = b[j].num; 			a[i].index = b[j].index; 			i++; 		} 	}  	manner( a, num1 ); 	write( a, num1 ); 	return 0; } void min( struct stu a[], struct stu b[] )  { 	int i = 0; 	int j = 0; 	int num1, num2;  	for ( num1 = 0; a[num1].sign == "+" || a[num1].sign == "-"; num1++ );  	for ( num2 = 0; a[num2].sign == "+" || a[num2].sign == "-"; num2++ );  	for ( j = 0; j < num2; j++ )       { 		if ( b[j].sign == "+" ) b[j].sign = "-";  		if ( b[j].sign == "-" ) b[j].sign = "+"; 	}  	for ( i = 0; i < num1; i++ ) { 		for ( j = 0; j < num2; )        { 			if ( a[i].index == b[j].index )                { 				if ( a[i].sign == b[j].sign )                   { 					if ( a[i].sign == "+" ) { 						a[i].num += b[j].num;  					}                       else { 						a[i].sign = "-"; 						a[i].num += b[j].num; 					}  				}                   else if ( a[i].num < b[j].num ) { 					a[i].sign = b[j].sign; 					a[i].num = b[j].num - a[i].num; 				}  				b[j].sign = "$"; 				j++; 			} 		} 	}  	for ( j = 0, i = num1; j < num2; j++ )        { 		if ( b[j].sign == "+" || b[j].sign == "-" ) { 			a[i].sign = b[j].sign; 			a[i].num = b[j].num; 			a[i].index = b[j].index; 			i++; 		} 	}  	manner( a, num1 ); 	write( a, num1 ); 	return ; } int main() { 	printf( "tips:you can read it in this program for example 4X^2-3X+8 -> + 4 2 - 3 1 + 8 0\n" ); 	int mod; 	int i, j; 	int q; 	int p;  	while ( 1 )        { 		printf( " plus work plz say 1 \n min work plz say 2.\n:" ); 		scanf( "%d", &mod );  		if ( mod == 1 || mod == 2 ) break; 	}  	printf( "第一个多项式项数：" ); 	scanf( "%d", &q ); 	printf( "第二个多项式项数：" ); 	scanf( "%d", &p ); 	printf( "\nthe first polynomial's number of terms:" );  	for ( i = 0; i < q; i++ )    { 		scanf( "%c %lf %d ", &a[i].sign, &a[i].num, &a[i].index ); 	}  	printf( "the second polynomial's number of terms:" );  	for ( j = 0; j < p; j++ )    { 		scanf( "%c %lf %d ", &b[j].sign, &b[j].num, &b[j].index ); 	}  	if ( mod == 1 ) plus( a, b );  	if ( mod == 2 ) min( a, b );  	return 0; }  你这代码还能用工具拯救一下

oh, 这个代码看起来太费劲了

我傻了都ヾ(❀╹◡╹)ﾉﾞ❀~

就不能好好排版一下吗？


Question: 求帮助

引用 13 楼 user-1 的回复:mega64a.h里面有完整定义 谢谢啊，可以了

引用 11 楼 user-1 的回复:那你看一下PORTA那些是怎么定义的，打开那个h文件找找 #define BEE_ON        PORTA.2 = 1 #define BEE_OFF       PORTA.2 = 0 这样定义的，这是我没改之前的

那你看一下PORTA那些是怎么定义的，打开那个h文件找找

引用 7 楼 user-1 的回复:[quote=引用 6 楼 小生i的回复:][quote=引用 5 楼 user-1 的回复:] 你这个点号是误敲进去的吗？ 这是绑定芯片上的PF0脚 [/quote] 这样语法不对的，需要调整一下写法[/quote] 我是用CVAVR的

引用 7 楼 user-1 的回复:[quote=引用 6 楼 小生i的回复:][quote=引用 5 楼 user-1 的回复:] 你这个点号是误敲进去的吗？ 这是绑定芯片上的PF0脚 [/quote] 这样语法不对的，需要调整一下写法[/quote] 问题是我改成ABCDE的端口都可以，唯独F不行

引用 6 楼 小生i的回复:[quote=引用 5 楼 user-1 的回复:] 你这个点号是误敲进去的吗？ 这是绑定芯片上的PF0脚 [/quote] 这样语法不对的，需要调整一下写法

引用 5 楼 user-1 的回复:你这个点号是误敲进去的吗？ 这是绑定芯片上的PF0脚

你这个点号是误敲进去的吗？

引用 1 楼 user-1 的回复:楼主不给出代码怎么解决呢？ 代码给出来了

#include <mega64a.h>  #define LED_GREEN     {PORTF.0 = 1;PORTF.1 = 0;} #define LED_RED       {PORTF.0 = 0;PORTF.1 = 1;} #define LED_OFF       { PORTF.0 = 0; PORTF.1 = 0; }  #define BEE_ON        PORTF.2 = 1 #define BEE_OFF       PORTF.2 = 0   // Input/Output Ports initialization   // Port A initialization   // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out   DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (1<<DDA1) | (1<<DDA0);   // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=1 Bit1=1 Bit0=1   PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (1<<PORTA1) | (1<<PORTA0);   // Port F initialization   // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In   DDRF=(0<<DDF7) | (0<<DDF6) | (0<<DDF5) | (0<<DDF4) | (0<<DDF3) | (1<<DDF2) | (1<<DDF1) | (1<<DDF0);   // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T   PORTF=(0<<PORTF7) | (0<<PORTF6) | (0<<PORTF5) | (0<<PORTF4) | (0<<PORTF3) | (0<<PORTF2) | (0<<PORTF1) | (0<<PORTF0);

楼主不给出代码怎么解决呢？


Question: 求助！

学习编程不是写作业，而是编程，现在的老师真的太不尽责了，天天出些奇葩题目，以难倒学生为乐事

多敲多练～学习编程还是不难的，网络上大把资料

大学学习的时候好好学学，如果要吃这碗饭，就要用心，用精力，用时间～


Question: c语言简单实现人人对战井字棋

引用 1 楼 自信男孩的回复:建议把代码工整的贴出来，这样才方便看和查找问题~ aha已经没问题啦，新人就想着存一下hhh

建议把代码工整的贴出来，这样才方便看和查找问题~


Question: 急求一个小程序，排序问题的

CSDN论坛新手指南

自定义排序函数compare 排序使用库函数qsort

可参考：https://blog.csdn.net/pfdvnah/article/details/90239385

最好就说清楚点吧


Question: 求一个算法

这个就是组合数学的抽屉问题，相当于n个相同物品（0）放到m个抽屉（数字间的位置），总共方案就是C(n+m-1, n)种 先求n的位数，然后对基本型4 13 22 31 112 121 211 1111分别求需要补0的数量，然后对每个基本型求方案，比如n是5位数，对基本型4，有C(4+1-1, 4)=1种方案，对于13型补3个0则有C(3+2-1, 3)=4种方案，依此类推

引用 15 楼 fireyou 的回复:按楼上的，写个正则表达式，把每个数字中的0去掉，与正则表达式比较。 这样是不是快点。 应该快不了！因为14楼和我的方法，需要处理的数据比从4到n-1少太多了

基本型只有4 13 22 31 112 121 211 1111这几种，其他都是在数字间插入若干0获得的

验证是很快的，就看输出 光验证，一秒应该就能验证10亿个数字吧。

引用 10 楼 qq_45675114 的回复:[quote=引用 9 楼 fireyou的回复:]是啊，所以让楼主参考，自己修改一下，不难，自己动手。。不能要人写完整代码吧。 [quote=引用 8 楼 liups 的回复:] [quote=引用 6 楼 fireyou 的回复:] 参考这个，自己改一下 https://blog.csdn.net/weixin_42726779/article/details/81096394 可以把检查各位数之和是否为4写成一个函数，而且不能照搬这里，只要当前和大于4就可以返回了[/quote][/quote] 可是这样时间也太长了啊，几十亿个数字每个都进行验证那得多久[/quote] 那就用2楼思路。再给你细化一下： 1、n为1位，只有4一种，且后面0为0个。 2、n为2位，有4，3、1，2、2，注意4后面有1个0，其他0个0。 3、n为3位，有4，3、1，2、2，2、1、1几种，后面0自己搞。 4、n为4位，有4，3、1，2、2，2、1、1，1、1、1、1几种，后面0自己想。 然后排列组合时有些要注意的：比如0不能在首位，如何不重复，如何保证从小到在（这个可以和不重复结合起来）

引用 9 楼 fireyou的回复:是啊，所以让楼主参考，自己修改一下，不难，自己动手。。不能要人写完整代码吧。 [quote=引用 8 楼 liups 的回复:] [quote=引用 6 楼 fireyou 的回复:] 参考这个，自己改一下 https://blog.csdn.net/weixin_42726779/article/details/81096394 可以把检查各位数之和是否为4写成一个函数，而且不能照搬这里，只要当前和大于4就可以返回了[/quote][/quote] 可是这样时间也太长了啊，几十亿个数字每个都进行验证那得多久

是啊，所以让楼主参考，自己修改一下，不难，自己动手。。不能要人写完整代码吧。 引用 8 楼 liups 的回复:[quote=引用 6 楼 fireyou 的回复:] 参考这个，自己改一下 https://blog.csdn.net/weixin_42726779/article/details/81096394 可以把检查各位数之和是否为4写成一个函数，而且不能照搬这里，只要当前和大于4就可以返回了[/quote]

引用 6 楼 fireyou 的回复:参考这个，自己改一下 https://blog.csdn.net/weixin_42726779/article/details/81096394 可以把检查各位数之和是否为4写成一个函数，而且不能照搬这里，只要当前和大于4就可以返回了

引用 4 楼 user-4的回复:[quote=引用 3 楼 qq_45675114的回复:][quote=引用 1 楼 liups的回复:]简单，循环一下，从4到n-1，对于每一个检查各位数之和是否为4就OK了 n会非常大，几十亿甚至更高[/quote] 那么多的数字如何输出呢？数量巨大[/quote] 需要输出的数不多，因为还有第二次筛选，

引用 3 楼 qq_45675114 的回复:[quote=引用 1 楼 liups的回复:]简单，循环一下，从4到n-1，对于每一个检查各位数之和是否为4就OK了 n会非常大，几十亿甚至更高[/quote] long够吗？不够就long long!

引用 3 楼 qq_45675114的回复:[quote=引用 1 楼 liups的回复:]简单，循环一下，从4到n-1，对于每一个检查各位数之和是否为4就OK了 n会非常大，几十亿甚至更高[/quote] 那么多的数字如何输出呢？数量巨大

引用 1 楼 liups的回复:简单，循环一下，从4到n-1，对于每一个检查各位数之和是否为4就OK了 n会非常大，几十亿甚至更高

另一个方法（可能要难一点），先算n是几位数，然后考虑4能分解成哪几种自然数及0的和，然后排列组合一下（进阶方案需要考虑排序及重复的情况，所以难度大些）

简单，循环一下，从4到n-1，对于每一个检查各位数之和是否为4就OK了


Question: 求大神教教我

i=j/k，不管j是7还是9，都等于1

引用 7 楼 user-1的回复:那就没办法了，这些写书的，这些教书的，邪恶控制世界。 我认为，只要有一种大家都能看得懂的编程方式就足够了。玩花样不算本事，那些大师们也不玩花样 哈哈哈哈，有道理，该学的还是要跟着学

还有这种事，我刚开始上C语言，目前上了3大节大课和3大节机房课，现在进度学基础知识到了循环结构程序设计(还在努力理解学习中)，目前书上的例子啥的都是这种合适（我也觉得有点绕）

举这样的例子真的很无语啊，C语言有一些弊端，当初设计者一开始比较随意，所以这个语言是有缺陷的。然后很多人喜欢捧臭脚，拿着这些缺陷折腾学生。就你这个表达式而言，存在操作顺序影响最后结果的问题，这样的例子真不科学。学编程的人，需要搞清楚那么多的情况吗？只要懂得如何好好的写程序就够了，这些东西就是糟粕

这是书上的一个例题（逗号表达式应用事例），结果我看别的地方有点没看懂

引用 2 楼 qq_45773996 的回复:[quote=引用 1 楼 user-1的回复:]i=j/k，不管j是7还是9，都等于1 谢谢你，我懂了，之前书上没看仔细。[/quote]、  没事，又是作业题吗？ 说实话，i=(j=j+2,j/k) ; 到底是先j=j+2，还是先j/k，这个真让人琢磨不透啊，总是出这种题目真让人无语，明明就是两句话，非要并成一句话来说，真有必要吗？ i = j / k; j += 2; 这样写清晰简单明白，写程序不是做题目，学编程不是为了考试

引用 1 楼 user-1的回复:i=j/k，不管j是7还是9，都等于1 谢谢你，我懂了，之前书上没看仔细。


Question: 萌新，         求大佬赐教！

分数？C语言没有分数类型，你可以分别输入分子和分明母，然后折算成整数比较


Question: 简单的四舍五入实现求解

引用 4 楼 ！.！ 的回复:[quote=引用 3 楼 user-1的回复:]输入x=0.005 ×100后等于0.500000 ＋0.5后等于1.000000 转成int后等于1 因此m=1 ÷100.0后等于0.01000 于是就进位了。 小于的话第三行就不会进1，结果就是0.000000 嗯，理解了[/quote]理解了，就麻烦结贴，谢谢。

引用 3 楼 user-1的回复:输入x=0.005 ×100后等于0.500000 ＋0.5后等于1.000000 转成int后等于1 因此m=1 ÷100.0后等于0.01000 于是就进位了。 小于的话第三行就不会进1，结果就是0.000000 嗯，理解了

原谅我抢了沙发

就是，为什么        m = x * 100+0.5;        x = m / 100.0; 这两行可以实现所述的功能，是怎么实现的？


Question: 情书哟~

你应该写：for (; ;) puts("...");

MyLife没定义，printf没换行


Question: 一个好玩的代码

引用 6 楼 txrainyun 的回复:[quote=引用 4 楼 liups的回复:][quote=引用 3 楼 liups 的回复:] 还行！ 补充一下：getch()在我这里过不了，得加一句： #include<conio.h>[/quote] 我还是小白，看不懂。[/quote] 你查手册或百度就知道getch()这个函数是在conio.h中定义的，也许在某些编译器中不include它也行，但是我这用的必须加

引用 4 楼 liups的回复:[quote=引用 3 楼 liups 的回复:] 还行！ 补充一下：getch()在我这里过不了，得加一句： #include<conio.h>[/quote] 我还是小白，看不懂。

这个可以。。。

引用 3 楼 liups 的回复:还行！ 补充一下：getch()在我这里过不了，得加一句： #include<conio.h>

还行！

#include<stdio.h>  #include<math.h>  #include<windows.h>  #include<time.h>  #include<stdlib.h>  void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)  {  	HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);  	SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));  }  int main()  {    	float x,y;  	int s=0,n,i,j;  	for(i = 1; i <= 50; i++)  	{  		SetColor(0,14);  		printf(" ");  		printf("%d%%",2*i);  		Sleep(101-1*i);  		printf("\b\b\b");  	}  	SetColor(15,0);  	printf("\b\n加载完成！即将进入:");  	Sleep(2000);  	system("cls");  	do  	{  		system("color 0E");  		for(i=0; i<=56; i++)  		{  			if(i>=20) { 				printf("*"); 				Sleep(10); 			}  			else printf(" ");  		} 		printf("\n");  		for(i=0; i<=56; i++)  		{  			if(i>=20) { 				printf("*"); 				Sleep(10); 			}  			else printf(" ");  		}  		printf("\n\t\t\t你想要怎样的心形:\n");  		printf("\n\t\t\t1:由love组成的心形！\n");  		printf("\n\t\t\t2:由随机字符组成的心形！\n");  		printf("\n\t\t\t3:由随机数字组成的心形！\n");  		printf("\n\t\t\t4:由随机颜色组成的心形！\n");  		printf("\n\t\t\t5:退出！\n");  		for(i=0; i<=56; i++)  		{  			if(i>=20) { 				printf("*"); 				Sleep(10); 			}  			else printf(" ");  		} 		printf("\n");  		for(i=0; i<=56; i++)  		{  			if(i>=20) { 				printf("*"); 				Sleep(10); 			}  			else printf(" ");  		}  		printf("\n\t\t\t");  		srand(time(NULL));  		scanf("%d",&n);  		system("cls");  		switch(n)  		{  			case 1:  				for(x=1.3; x>=-1.1; x-=0.1)  				{ 					for(y=-2; y<=1.4; y+=0.053)  					{  						if(pow(x*x+y*y-1,3)-x*x*x*y*y<=0)  						{  							s++;  							if(s%4==1)printf("l");  							if(s%4==2)printf("o");  							if(s%4==3)printf("v");  							if(s%4==0)printf("e");  							Sleep(2);  						}  						else  							printf(" ");  					}  					printf("\n");  				}  				printf("绘制完成,按任意键返回主页面！"); 				break;  			case 2: 				for(x=1.3; x>=-1.1; x-=0.1)  				{ 					for(y=-2; y<=1.4; y+=0.053)  					{  						if(pow(x*x+y*y-1,3)-x*x*x*y*y<=0)  						{  							printf("%c",rand()%10+rand()%10+97);  							Sleep(2);  						}  						else  							printf(" ");  					}  					printf("\n");  				}  				printf("绘制完成,按任意键返回主页面！"); 				break;  			case 3: 				for(x=1.3; x>=-1.1; x-=0.1)  				{ 					for(y=-2; y<=1.4; y+=0.053)  					{  						if(pow(x*x+y*y-1,3)-x*x*x*y*y<=0)  						{  							printf("%d",rand()%10);  							Sleep(2);  						}  						else  							printf(" ");  					}  					printf("\n");  				}  				printf("绘制完成,按任意键返回主页面！"); 				break;  			case 4: 				for(x=1.3; x>=-1.1; x-=0.1)  				{ 					for(y=-2; y<=1.4; y+=0.053)  					{  						if(pow(x*x+y*y-1,3)-x*x*x*y*y<=0)  						{  							SetColor(0,rand()%6+10);  							printf(" ");  							Sleep(2);  						}  						else  						{ 							SetColor(0,0);  							printf(" "); 						}  					}  					printf("\n");  				}  				SetColor(15,0);  				printf("绘制完成,按任意键返回主页面！"); 				break;  			default: 				break;  		}  		getchar(); 		getchar(); 		system("cls");  	} while(n!=5);  }

在绘制完成之后直接返回了


Question: 题目   编写算法，实现带头结点单链表的逆置算法    链表创建成功，但是不能遍历  大神帮帮忙看下什么问题

你的代码变量太乱了，我稍微修改了下  你可以看看和你的代码有哪儿不同  就知道你错哪儿了。  #include<stdio.h> #include<malloc.h> #include<stdlib.h>  typedef int ElementType;  typedef struct Node { ElementType data; struct Node *next; }Node,*Stu;  Stu CreateList(Stu List) { int len; int val; List->next = NULL;  printf("请输入节点个数:"); scanf("%d",&len); int i; for( i=0;i<len;i++) { Stu New=(Stu)malloc(sizeof(Node)); if(New==NULL) { printf("分配新节点失败\n"); exit(-1); } printf("请输入第%d个节点的数据:",i+1); scanf("%d",&val);     New->data = val;     New->next = List->next;     List->next = New; } printf("创建链表成功\n"); return List; }  Stu Fuu(Stu a); void stamp(Stu r);  int main() {  Stu List=CreateList(List); List = Fuu(List); stamp(List); return 0; }  Stu Fuu(Stu head) {     Stu p1,p2;     p1 = head->next;     while(p1->next){  //从head之后第二个点开始，如果只有一个点，没有必要反转  head点没有数据         p2 = p1->next;         p1->next = p2->next;         p2->next = head->next;         head->next = p2;     } printf("链表逆序完毕\n"); return head; }  void stamp(Stu List) { Stu s=List->next; printf("链表的数据是："); while(s!=NULL) { printf("%d",s->data); s=s->next; } }


Question: c指针问题

数组名就是首地址，通俗的说就是指针常量

把实参数组的首地址传递给函数inv


Question: 这个是怎么回事？

引用 12 楼 自信男孩 的回复：ch建议定义为int类型，而不是char 类型，因为EOF是int类型～好的，一会儿试试

ch建议定义为int类型，而不是char 类型，因为EOF是int类型～

引用 3 楼 user-2 的回复：这个是一边写一边读可能会有影响写和读不是共用一个位置指针吗

引用 9 楼 wowpH 的回复：引用 8 楼 马振宇 的回复:引用 5 楼 wowpH 的回复：你的第20行在第二个参数减1？那不是①读一个字符，②指针向前移动一位，③写入一个字符，④有把刚才写的字符读出来。。。。循环。这永远结束不了吧。只是在没有第22行时才进入死循环，可是第22行是地位到当前位置啊，并没有改变指针的指向，起了什么作用有点道理，可不可以贴一下代码，我也试试。按照图片敲一下吧，没有多少字

是读取一个字符，指针向前移动一位，以后-1，指针又回到原来的位置，执行putc()将原来的字符替换为大写。我的理解是执行putc()之后，指针又向后移动一位，所以下次getc()读取的应该是下一个字符

是读取一个字符，指针向前移动一位，以后-1，是回到之前的位置，将原来的字符替换为大写。我的理解是执行putc()之后，指针应该又移动一位，所以下次getc()读取时应该是读取下一个字符

有人知道吗？

这个是一边写一边读可能会有影响

引用 1 楼 user-2 的回复：跟踪一下位置看看有什么差别有和没有前后位置一样

跟踪一下位置看看有什么差别


Question: 代码大佬帮忙写一下，我不太懂

引用 2 楼 youhehu的回复:[quote=引用 1 楼 user-1的回复:]就是个分支结构，，，，搞不懂哪儿难了  不会这个用if-else也可以啊。    #include <stdio.h>  int main(void) { 	double a, b, ans = 0; 	char op; 	while (scanf_s("%lf%c%lf", &a, &op, 1, &b) != EOF) { 		switch (op) { 		case '+': 			ans = a + b; 			break; 		case '-': 			ans = a - b; 			break; 		case '*': 			ans = a * b; 			break; 		case '/': 			ans = a / b; 			break; 		default: 			; 		} 		printf("%.8lf\n", ans); 	} 	return 0; }   运行不了，while那儿有问题[/quote] 我用的Visual Studio 2019。  改为scanf("%lf%c%lf",&a,&op,&b);就可以了。

引用 1 楼 user-1的回复:就是个分支结构，，，，搞不懂哪儿难了  不会这个用if-else也可以啊。    #include <stdio.h>  int main(void) { 	double a, b, ans = 0; 	char op; 	while (scanf_s("%lf%c%lf", &a, &op, 1, &b) != EOF) { 		switch (op) { 		case '+': 			ans = a + b; 			break; 		case '-': 			ans = a - b; 			break; 		case '*': 			ans = a * b; 			break; 		case '/': 			ans = a / b; 			break; 		default: 			; 		} 		printf("%.8lf\n", ans); 	} 	return 0; }   运行不了，while那儿有问题


Question: 发生访问冲突怎么解决，求大佬指教

引用 5 楼 weixin_45760275 的回复:引用 4 楼 user-2 的回复：VC++6.0里面用的是scanf谢谢，我大概知道原因了那就结贴，谢谢。

引用 1 楼 wowpH 的回复：scanf_s("%lf%c%lf", &a, &b, 1, &c);  字符，字符串类型的要加上读取的大小问题解决了，谢谢，能多问一句吗？是编译器不同的原因吗？我看的视频教程他是用的VC++6.0。他的代码没有加入读取的大小呢


Question: 转换进制出错，不能输出

我找到错误了，是大小写的问题

x/8 改成 int(x/8)

引用 2 楼 qqdreamypp 的回复:我用两个编译器都有问题 不能输出 你的代码我一点都没有动，在VS2015中没问题

我用两个编译器都有问题 不能输出

VS2015+Windows10运行  似乎没问题


Question: 求助：约瑟夫环问题

又一个用C+语言的。

补充题目：从键盘输入人数N（N<50）及N个人的编号，正向建立带头节点的循环链表； 输出循环链表各结点的值； 输入开始报数的人的编号S、间隔的个数M和剩余人数X； 在循环链表中查找到编号为S的结点； 从1开始向后报数，将报M的人（结点）从循环链表中删除，并输出该人的编号； 从刚才被删除人的下一个人开始重复步骤5，直至最后只剩下 X 个人为止； 输出最后剩余的人的编号。


Question: 涂色问题

引用 6 楼 youhehu 的回复:[quote=引用 5 楼 user-1的回复:]你为什么不把输入示例也截图，是有秘密吗？ 这个到没有，我已经解决了[/quote]赞

引用 5 楼 user-1的回复:你为什么不把输入示例也截图，是有秘密吗？ 这个到没有，我已经解决了

你为什么不把输入示例也截图，是有秘密吗？

引用 2 楼 youhehu 的回复:[quote=引用 1 楼 user-1的回复:]这不很简单吗。看看区间格子的奇数个数和r是否相等，偶数个数是否和g相等。 能具体写出来吗求代码[/quote]可以搜搜题解啊，一般都有的。

哎，你自己用几个数手算试一试就知道了。。。

引用 1 楼 user-1的回复:这不很简单吗。看看区间格子的奇数个数和r是否相等，偶数个数是否和g相等。 能具体写出来吗求代码

这不很简单吗。看看区间格子的奇数个数和r是否相等，偶数个数是否和g相等。


Question: 问个题

不就是最小公倍数嘛，搞这么么个花样新名词


Question: C语言的循环链表

多找找，总有一款适合你。


Question: c语言编程

还要别人下载你这张图片吗？

。。。。就不能旋转一下再发吗？


Question: 求大佬看一下问题在哪，万分感谢

现在就好比：你叫我拿个篮子去果园，但是不告诉我摘什么水果，也不告诉我摘多少。那我只能随便摘了（等价于你的代码没问题。）

你要这么说的话，那我只能说，你这代码没问题。 引用 3 楼 qq_45763902 的回复:[quote=引用 1 楼 wowpH的回复:]你的问题是什么？ 就是这个代码的结果是有问题的，但我没有发现问题在哪，所以求助[/quote]

引用 1 楼 wowpH的回复:你的问题是什么？ 就是这个代码的结果是有问题的，但我没有发现问题在哪，所以求助

printf("请输入身高h,体重w:");     getchar();    -------------------------这个没必要     scanf("%f%f",&h,&w);   ------------%f加空格

你的问题是什么？


Question: 求助大佬救救我vc++和clion都出问题了

CLion出了乱码不太出别的幺蛾子

可执行文件未指定 看看gcc加路径了没


Question: 计算每一对数组组成的点距离(1，1)的总和

引用 4 楼 與蘤舊縐的回复: 你这个程序应该不是书上写的吧 哦，pow用错了，被打死...

引用 5 楼 wowpH 的回复:[quote=引用 3 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] [quote=引用 2 楼 與蘤舊縐的回复:]not a number？？ 不是数字，是这个:nan[/quote]不知道不会搜一下？[/quote]帮你搜好了。https://baike.baidu.com/item/nan/7455322?fr=aladdin

神奇，从未见过这玩意

引用 3 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:[quote=引用 2 楼 與蘤舊縐的回复:]not a number？？ 不是数字，是这个:nan[/quote]不知道不会搜一下？

你这个程序应该不是书上写的吧

引用 2 楼 與蘤舊縐的回复:not a number？？ 不是数字，是这个:nan

not a number？？

填写部分有错误吗？运行结果显示nan是什么鬼？ 真是太难了，搞不懂


Question: 数组长度和大小一样吗

有的，size是占用内存字节数，length是字符串长度

str.size()有这个用法吧

length指的是什么呢？数组元素个数吗？size指的是sizeof吗？sizeof=元素个数*单位字节数


Question: C语言编程

while(输入) {     if(都为小写)     {         输出大写         跳出循环     } } 填空可以吧...

引用 1 楼 @宁兰的回复:判断大小写的依据是 判断输入的字母是否在ASCII码中大（小）写字母所对应的的数字范围 用while条件中实现判断，如果不是就一直输入给字符型变量赋新值 提示一下，直接给代码就不好玩了嘛 你说这的个我都知道，我只是想知道怎么个循环法


Question: 新手求助，if的简单使用

错误❌： printf(" TRUE\n");

可以吧，我看行


Question: 删除数组中n个数使得最大公约数增加，这个题太难了，求大佬帮帮我。

不对吧，你这个例子至少要删除2个数才行啊。 删除7之前gcd=1，删除后也是1，至少要删除2个数。 引用 11 楼 o^┢┦aｐΡy ^0^ 的回复:我感觉要先考虑素数然后在考虑其他的数，我先设计了一个排序，先遍历数组把数组中的素数提取出来，并且让素数变0，然后素数排序，在把素数数组放到原来的数组这样原来的数组排序就是先是素数从小到排列然后是其他的数从小到大排列，并且去除了1应为有1最大公约数只可能是1，但是这样是错误的，比方说我输入 5 3 5 7 15 21 排序后是 3 5 7 15 21 最小的删除 删除3最大公约数不能扩大，然后删除5，也不行然后在删除7扩大了 这样从小到大依次删除3个数最大公约数才会扩大 但是其实这个例子的答案只删除一个7就能使最大公约数扩大

有没先排序一下？ 可以这样考虑一下，比方先从最小的数开始，如果它跟其它数两两gcd，存在不超过所有数gcd，是不是可以先排除？然后再试其它的。好好想想

主要是试过之后才来求助的，实在是没办法了，要是我能自己做出来肯定就自己做了，没试过我肯定是不会问的

在pta上提交后运行超时

这个我已经试过了，超时

有时候程序先写出来，然后就会想出办法来优化，如果只是坐在那里发呆，然后什么都没做出来。好方法有时候是基于笨办法的基础上的，笨办法总比没办法要好一些

先试试看，说不定不需要一秒钟呢

有1秒的时间限制，而且遍历不太可能，比方说第一次减少一个数，数组中每个数都去掉一次求最大公约数，发现只去掉一个不能，然后去掉两个数，但是去掉两个数的情况就太多了，要是两个不行去掉三个，数就更大了。数字的个数可能是个5位数，所以说遍历基本不可能实现。

笨办法，遍历过去，找到能使gcd变大的数

我这还有个例子 输入 5 3 5 7 15 21 输出 1 只需要删除7就能使得最大公约数扩大。

pta中的题目，实在是做不出来了，求助大佬


Question: C语言数组

数组越界访问是未定义行为，所谓未定义即不知道能否正确，是随机的～

引用 3 楼 没痛的伤害 的回复:[quote=引用 1 楼 user-2的回复:]&a[7]的数组名a是数组起始地址，而a[7]相当于(a+7)，其实就是后面第7个地址，这个逻辑并没有错。编译是可以通过的。但是会警告。 那个没有明显数组元素个数的话系统编译时默认的数组元素个数是5吧，那么在给这个数组分配空间时，只分配了5个元素的空间，且分配的空间数据类型是int型的，再往后的空间应该不再属于数组的空间了吧，为何a[7]都超出定义的空间范围内了，还能这样表示，而且没有分配的空间还是可以用整型的数组数据类型通过取地址来表示已经定义好的数组空间的后面空间的地址，这样理解是哪儿有问题呢？[/quote]举个例子吧：我有100个盘子，前面5个盘子每个里面放了几个苹果，现在我要拿第7个盘子，你说我能不能拿到。这不很明显吗，我数数到第7个，把盘子拿走，这为什么不行呢？ 还是那句话，数组名也是个地址。

引用 2 楼 user-2的回复:至于为什么是7，因为指针是int型的，所以和数组下标一样，结果肯定也是7。  数组名其实就是首地址。本质还是个地址。 这儿的7我是知道得，谢谢

引用 1 楼 user-2的回复:&a[7]的数组名a是数组起始地址，而a[7]相当于(a+7)，其实就是后面第7个地址，这个逻辑并没有错。编译是可以通过的。但是会警告。 那个没有明显数组元素个数的话系统编译时默认的数组元素个数是5吧，那么在给这个数组分配空间时，只分配了5个元素的空间，且分配的空间数据类型是int型的，再往后的空间应该不再属于数组的空间了吧，为何a[7]都超出定义的空间范围内了，还能这样表示，而且没有分配的空间还是可以用整型的数组数据类型通过取地址来表示已经定义好的数组空间的后面空间的地址，这样理解是哪儿有问题呢？

哦哦，懂了，还是对这个a是地址没有彻底理解，谢谢


Question: 细节问题

printf("a=%%%d, b=%%%d", a, b);

引用 4 楼 OYJJO的回复:[quote=引用 3 楼 636f6c696e的回复:]%表示转义符，%%表示输出%，所以%%d输出的结果是%d [quote=引用 2 楼 OYJJO 的回复:] [quote=引用 1 楼 user-4的回复:]printf("a=%d,b=%d",a,b); printf（“a=%%d,b=%%d”）;就是这个式子[/quote][/quote] 我以为是会输出a=%2,b=%4[/quote] 那你需要用%%%d格式的

引用 3 楼 636f6c696e的回复:%表示转义符，%%表示输出%，所以%%d输出的结果是%d [quote=引用 2 楼 OYJJO 的回复:] [quote=引用 1 楼 user-4的回复:]printf("a=%d,b=%d",a,b); printf（“a=%%d,b=%%d”）;就是这个式子[/quote][/quote] 我以为是会输出a=%2,b=%4

%表示转义符，%%表示输出%，所以%%d输出的结果是%d 引用 2 楼 OYJJO 的回复:[quote=引用 1 楼 user-4的回复:]printf("a=%d,b=%d",a,b); printf（“a=%%d,b=%%d”）;就是这个式子[/quote]

引用 1 楼 user-4的回复:printf("a=%d,b=%d",a,b); printf（“a=%%d,b=%%d”）;就是这个式子

printf("a=%d,b=%d",a,b);


Question: 单链表的插入和删除，求教！

引用 1 楼 user-1的回复:所以你是来秀你的字体的吗？ 不是呀，字体是手机自带的

所以你是来秀你的字体的吗？


Question: 大神求解

正如楼上朋友所说的，把if(year=0) break;改为 if(year==0) break; 为什么if(year=0) break;中始终无法break呢？  从上图可以看到year=0的赋值语句，把year的值赋值为0，而且该赋值表达式的值返回的是year的值，即0. 所以，if语句的判断条件始终是0，无法break

好像还是不能return 0

及时结贴，谢谢。  不要做伸手党。

if(year=0) break; 改为 if(year==0) break; 试试

引用 1 楼 user-2的回复:贴一下代码。 #include "stdio.h" int main() { 	int year,month; 	for(;;)  { 	printf("请输入一个年份："); 	scanf("%d",&year); 	printf("请输入一个月份："); 	scanf("%d",&month); 	if(year=0) break; 	switch(month) 	{ 		case 1: 		case 3: 		case 5: 		case 7: 		case 8: 		case 10: 		case 12:printf("该月为31天\n");break; 		case 4: 		case 6: 		case 9: 		case 11:printf("该月为30天\n");break; 		case 2:if((year%4==0)&&(year%100!=0)||(year%400==0)) 		        printf("该月为29天\n"); 		       else 		        printf("该月为28天\n");break; 	}  } 	return 0; }

贴一下代码。


Question: 大神们啊，求解求解，咋写啊

啥意思啊，这是？看不懂。字符就是字符类型呗，怎么判断类型啊？ 还是要使用正则表达式？？？？

引用 17 楼 OYJJO 的回复:[quote=引用 16 楼 wowpH的回复:]ch未初始化。  为啥我能用dev运行成[/quote]Dev能运行，但是这种写法不是个好习惯。

引用 17 楼 OYJJO 的回复:为啥我能用dev运行成 		printf("请通过键盘输入一个字符："); 		ch = getchar(); 		getchar();// 多余的换行符 		if ((ch >= 'a') && (ch <= 'z'))

赶紧结帖吧，好好感谢楼上那位大神

引用 16 楼 wowpH的回复:ch未初始化。  为啥我能用dev运行成

ch未初始化。

真的无语，早给出代码不就完了，浪费口水

引用 12 楼 OYJJO 的回复:[quote=引用 5 楼 SuperDay的回复:][quote=引用 3 楼 OYJJO 的回复:] 没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？[/quote] #include <stdio.h> int main() { 	char ch; 	for(;ch!='#';) 	{ 	printf("请通过键盘输入一个字符："); 	scanf("%c",&ch); 	if((ch>='a')&&(ch<='z')) 	printf("该字符为一个小写字母\n"); 	else if((ch>='A')&&(ch<='Z')) 	printf("该字符为一个大写字母\n"); 	else if((ch>='0')&&(ch<='9')) 	printf("该字符为数字\n"); 	else if(ch!='#') 	printf("该字符为其他字符\n"); 	}			 	return 0; 	} 不管对不对，完不完美[/quote] 你用的函数没用对，ch=getch();

ch没初始化，应该无法比较。

引用 5 楼 SuperDay的回复:[quote=引用 3 楼 OYJJO 的回复:] 没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？[/quote] #include <stdio.h> int main() { 	char ch; 	for(;ch!='#';) 	{ 	printf("请通过键盘输入一个字符："); 	scanf("%c",&ch); 	if((ch>='a')&&(ch<='z')) 	printf("该字符为一个小写字母\n"); 	else if((ch>='A')&&(ch<='Z')) 	printf("该字符为一个大写字母\n"); 	else if((ch>='0')&&(ch<='9')) 	printf("该字符为数字\n"); 	else if(ch!='#') 	printf("该字符为其他字符\n"); 	}			 	return 0; 	} 不管对不对，完不完美

行了，想不想解决问题，嘴皮子厉害，行动看看

引用 5 楼 SuperDay的回复:[quote=引用 3 楼 OYJJO 的回复:] 没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？[/quote] 还能不能清楚地描述一个问题，于人于己都是好的，服你，这原题目我改都没改

有哪几种类型

引用 5 楼 SuperDay的回复:[quote=引用 3 楼 OYJJO 的回复:] 没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？[/quote] 你这最后一句话，我看了真的火，我就发个问题，有必要吗

引用 5 楼 SuperDay的回复:[quote=引用 3 楼 OYJJO 的回复:] 没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？[/quote] 我有抱怨吗？兄弟，你能力是有多出众啊，这么瞧不起这个问题，如果你是泰斗，那你素质有问题，如果你只是一个普通学者，那你真是骄傲自满

引用 5 楼 SuperDay的回复:[quote=引用 3 楼 OYJJO 的回复:] 没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？[/quote] 呵呵，是你汉语不行吧，前一次说我判断字符不会就几个if的事，你看了后面那句话了吗，直到输入#结束，要不然我直接省略了判断字符类型那你能懂吗？再说，我有说过不是判断字符类型吗，还说我汉语，你连基本理解句子的能力都不行，这是一个原题目！

引用 3 楼 OYJJO 的回复:没错是低级问题，我就不相信你初学时没碰到过问题，同学也不会，大学老师又不是你想找到就找到的，你以为我是一看题就来问你们吗，我也是写了好多遍的，作为一个刚入门不懂的想学的人来说难道不能问吗 引用 4 楼 OYJJO 的回复:你以为我就是来问怎么判断字符类型的吗，这个我早就自己学会了，要不然我写个循环输入直到输入#结束干嘛，虽然对你们来说根本不算事，但也不能这么看一个新手，你们就这么高攀不起吗  好好看看自己发的东西，判断字符类型，然后又说不是判断字符类型，学好汉语很重要！能不能清楚地描述一个问题，于人于己都是好的。不要老是抱怨，你伸手就是对的吗?如果你写过了，通过不了，也可以发出来让大家看看，才是学习的态度。问题，你到底写了 没有？

原来大神们就是帮你解决这种低级问题的？不就是几个if的事情，好奇怪一到写程序就这副德行，数字不就是0到9，26个字母大小写，标点符号什么的


Question: 数组元素赋值问题：请问给con.filesavepath[j]赋值的这一步为什么直接跳过了呢

重新编译试试

在单步调试时候这一行语句被跳过了


Question: 循环这个题怎么写

求解求解求解！！！！


Question: 回调函数 打印任意数组

引用 4 楼 qq_33437675的回复:[quote=引用 3 楼 qq_33437675的回复:][quote=引用 2 楼 gouyanfen的回复:][quote=引用 1 楼 user-2 的回复:] 在线抓伸手党。 发贴10个，结贴0%,没兴趣回贴了。[/quote] 什么是结帖。玩的少，还请多多指教。[/quote] 特意去查了一下，这就去结帖[/quote] 要电脑结帖的，明天再结。

引用 3 楼 qq_33437675的回复:[quote=引用 2 楼 gouyanfen的回复:][quote=引用 1 楼 user-2 的回复:] 在线抓伸手党。 发贴10个，结贴0%,没兴趣回贴了。[/quote] 什么是结帖。玩的少，还请多多指教。[/quote] 特意去查了一下，这就去结帖

引用 2 楼 gouyanfen的回复:[quote=引用 1 楼 user-2 的回复:] 在线抓伸手党。 发贴10个，结贴0%,没兴趣回贴了。[/quote] 什么是结帖。玩的少，还请多多指教。

引用 1 楼 user-2 的回复:在线抓伸手党。 发贴10个，结贴0%,没兴趣回贴了。

在线抓伸手党。


Question: 问题出在哪呢？

你能想办法把那个if写短点吗，一个if不要写的太长，不方便理解。  你的错误就出在这儿

n代表要输入的那个值，1到n中若数位出现2 0 1 9这四个数就加

引用 3 楼 weixin_45311188 的回复:[quote=引用 1 楼 user-1的回复:]你想要的结果是多少？ 题目：小明对数位中含有 2、0、1、9 的数字很感兴趣（不包括前导 0），在 1 到 40 中这样的 数包括 1、2、9、10 至 32、39 和 40，共 28 个，他们的和是 574。[/quote]那你为什么要输入n，而且题目的问题呢？

引用 1 楼 user-1的回复:你想要的结果是多少？ 题目：小明对数位中含有 2、0、1、9 的数字很感兴趣（不包括前导 0），在 1 到 40 中这样的 数包括 1、2、9、10 至 32、39 和 40，共 28 个，他们的和是 574。

引用 1 楼 user-1的回复:你想要的结果是多少？ 我可能小学除法有问题，我把3/10等于了3好笨喔

你想要的结果是多少？


Question: 求助

引用 2 楼 qq_45766511的回复:搜不到啊。。。。。。。 前几天就有人问。我就搜到过。。。。

搜不到啊。。。。。。。

不贴代码的话，还不如直接搜答案来的快。


Question: c语言编程求助。。（捂脸）

引用 2 楼 user-1的回复:不断右移，相与，右移，直到为0。 引用 1 楼 user-1 的回复:最后一位与1，如果结果是1说明这个位数的卡片有这个数。 呃呃，能编写代码吗？ 这样太抽象了（其实是我看不懂）

呃呃，能编写代码吗？ 这样太抽象了（其实我看不懂）

最后一位与1，如果结果是1说明这个位数的卡片有这个数。


Question: 新手求教

引用 1 楼 user-1的回复:都行的。。。。。 我现在有点烦，有的书讲的深，有的…书讲的浅，有的书讲的跟本不一样，有的书连内容完全不是一致的，一个讲这个，一个讲那个，一个侧重点在这儿，一个侧重点在那儿，到底哪些才是该注意的？写书的人就不能写的标准，说的全面吗

都行的。。。。。


Question: 【求助】linux/c  调用chdir函数后，malloc行为异常。

调试时候并不是根据分配长度来显示的，你+1是因为0也是要复制过去的，不然目标字符串没有结束标志，分配的长度也要+1

引用 1 楼 user-1 的回复:楼主啊，这个malloc分配出来的空间，并没有长度标志，调试时候显示的内容是依据0出现的位置，也就是说一直显示到0出现为止，如果没有0出现，就会显示很长的内容。  按照你的方法修改，问题解决。问题原理还是有点不明白（结账等解决完这个疑问再结）。 你的意思是说调试器显示的malloc长度不是实际分配长度。这个和strnpy参数要n+1有什么关联（刚刚查阅过资料，复制长度大于字符串长度，会将多余位置null）？是字符串结束符‘\0'的原因么？那malloc动态分配的字节长度的n也要加1吧。

所以，你strncpy里面，参数要用n+1

引用 6 楼 chasing_freedom的回复:[quote=引用 5 楼 user-1 的回复:] 字符串长度n实际上占用n+1字节的空间，所以malloc的时候也要n+1。并且你这样一直调用malloc也是不对的，空间都没释放 懂了，十分感谢。空间释放由del_arg函数负责。[/quote] 不对，你赋值之前的那个地址没释放，就被覆盖丢失了

引用 5 楼 user-1 的回复:字符串长度n实际上占用n+1字节的空间，所以malloc的时候也要n+1。并且你这样一直调用malloc也是不对的，空间都没释放 懂了，十分感谢。空间释放由del_arg函数负责。


Question: 求解 C语言程序设计

if else 的使用。


Question: C语言非新手题，望解答

第一个输出的hello是怎么回事？百度后还是不会。

百度一下你就知道

setbuffer是干嘛的啊，我还没见过。


Question: 斐波那契

引用 3 楼 A1314942199的回复:[quote=引用 2 楼 user-1的回复:]https://blog.csdn.net/weixin_44895666/article/details/102662257 可以看一下这个 写的不错，互相关注，加个关注哈，兄弟[/quote] 共同进步（好好学习天天向上. jpg）

引用 2 楼 user-1的回复:https://blog.csdn.net/weixin_44895666/article/details/102662257 可以看一下这个 写的不错，互相关注，加个关注哈，兄弟


Question: 求助C语言练习题

引用 1 楼 SuperDay 的回复：循环会写吗？把年份遍历过去，一个个判断是否闰年。知道什么是闰年吗？把闰年的定义复习一下统计个数具体该怎么操作呢

设置一个变量i=0，每循环一次就是找到一个闰年，就i++


Question: 报错莫名其妙怎么办

程序不能放在有中文的文件夹中(mingw也是)

引用 1 楼 user-1的回复:程序不能放在有中文的文件夹中(mingw也是) 额，之前一直都在中文文件夹里，并没有什么问题，今天突然抽风了


Question: 水仙花题目（PTA）

第一次发帖，适合和我一样的小萌新

如果输入大于1000，你后续会多打印yes或no  #include<stdio.h> int main() { int x,y,z,i; scanf("%d",&i); x=i%10; y=i/10%10; z=i/100; if(i<100||i>999) printf("Invalid Value!\n");  else if(i==x*x*x+y*y*y+z*z*z) printf("Yes\n");  else printf("No\n"); return 0;  }

可以判断啊  如果想要求出该范围的所有水仙花数  #include<stdio.h> int main() { 	int x,y,z,i; 	//scanf("%d",&i); 	for(i = 100 ;i < 1000; i++) 	{ 	 		x=i%10; 		y=i/10%10; 		z=i/100; 		if(i<100||i>999) 			printf("Invalid Value!\n"); 		if(i>=100 && i<=999 && i==x*x*x+y*y*y+z*z*z) 			printf("Yes  %d\n",i); 		//if(i>=100 && i<=999 && i!=x*x*x+y*y*y+z*z*z) 		//	printf("No\n"); 			 	} 	return 0; }


Question: 求助，考研党，C/C++ 图和哈希表题目

百度吧，很基本的算法，大把博客有写


Question: C语言问题

引用 1 楼 45045399 的回复：getchar()-'0'将getchar()获得的字符数转换为整型数谢谢你，能再问您一个问题吗，您有时间才看， 一个数组 inode[i]=-1 怎解

谢谢了，谢谢你

有用的话记得把贴结了

getchar（）获得一个字符，将它转换成ASCII码和'0'的ASCII码相减，得到的值去进行case判断


Question: 哪个大神帮忙看看建立单链表，不识别->，是不是指针运用错误？

#include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define L sizeof(lnode)  typedef struct node {     int data;     struct node *next; }node,*lnode;  void creastlist(lnode *head) {     //lnode *a,*b;     lnode a, b;     int i=1,n;     //*head = (lnode*)malloc(L);     *head = (lnode)malloc(L);     (*head)->next = NULL;     //a = *head;     b = *head;      printf("请输入链表的长度：");     scanf("%d",&n);     for(;i<=n;i++)     {         //a=(lnode*)malloc(L);         a=(lnode)malloc(L);         printf("输入数据%d：",i);         scanf("%d", &a->data);         a->next = NULL;         b->next = a;         b = a;     } }  //void invert(lnode *head) void invert(lnode head) {     lnode pcur, prev;      prev = pcur = head->next;     head->next = NULL;      while (pcur) {         prev = pcur->next;         pcur->next = head->next;         head->next = pcur;         pcur = prev;     }  #if 0     lnode *a,*b;     //*a=head->next;     a = head->next;     head->next=NULL;      while(a!=NULL)     {         a=b;         a=a->next;         b->next=head->next;         head->next=b;      } #endif }  //void print(lnode *head) void print(lnode head) {     //lnode *a;     lnode a;     //printf("输出链表：")     printf("输出链表：");     //*a=head->next;     a = head->next;     while(a!=NULL)     {         printf("%d", a->data);         a = a->next;     } }  int main() {     int n;     //lnode *head;     lnode head;     creastlist(&head);     print(head);     invert(head);     print(head);     return 0; } 供参考～ 注意lnode类型，lnode本身就是struct node *类型。

引用 8 楼 sinat_38804017的回复:[quote=引用 6 楼 weixin_45766269 的回复:] [quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] 这样更改以后还是不识别箭头[/quote]  引用 7 楼 weixin_45766269 的回复:[quote=引用 4 楼 sinat_38804017的回复:]typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符 那结构体应该怎么改？好难啊！[/quote] #include <stdio.h> #include <stdlib.h> #include <iostream> #include <malloc.h>  typedef struct node {     int data;     struct node *next; } node, *lnode; void creastlist(lnode &head) {     lnode a, b;     int i = 1, n;     head = (lnode)malloc(sizeof(node));     head->next = NULL;     a = head;     printf("pls input the length of linklist：");     scanf("%d", &n);     for (; i <= n; i++)     {         a = (lnode)malloc(sizeof(node));         printf("input data %d：", i);         scanf("%d", &a->data);         a->next = NULL;         b->next = a;         b = a;     } } void invert(lnode head) {     lnode a, b;     a = head->next;     head->next = NULL;     while (a != NULL)     {         a = b;         a = a->next;         b->next = head->next;         head->next = b;     } } void print(lnode head) {     lnode a;     printf("output linklist：");     a = head->next;     while (a != NULL)     {         printf("%d", a->data);         a = a->next;     } } int main() {     int n;     lnode head;     creastlist(head);     print(head);     invert(head);     print(head);     system("pause");     return 0; } 改成一级指针，然后指针采用引用，不然就会出现楼上说的那种，函数内部分配内存，导致外部指针还是野指针的情况，我也是刚学这部分，可以相互交流阿[/quote] 结构体指针作形参要这样定义void invert(lnode head)还是void invert(lnode &head)？？ 我们上学期C需要指针结构体没讲完就结课，指针什么的都自学的，这学期学数据结构，快难死了！

引用 6 楼 weixin_45766269 的回复:[quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] 这样更改以后还是不识别箭头[/quote]  引用 7 楼 weixin_45766269 的回复:[quote=引用 4 楼 sinat_38804017的回复:]typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符 那结构体应该怎么改？好难啊！[/quote] #include <stdio.h> #include <stdlib.h> #include <iostream> #include <malloc.h>  typedef struct node {     int data;     struct node *next; } node, *lnode; void creastlist(lnode &head) {     lnode a, b;     int i = 1, n;     head = (lnode)malloc(sizeof(node));     head->next = NULL;     a = head;     printf("pls input the length of linklist：");     scanf("%d", &n);     for (; i <= n; i++)     {         a = (lnode)malloc(sizeof(node));         printf("input data %d：", i);         scanf("%d", &a->data);         a->next = NULL;         b->next = a;         b = a;     } } void invert(lnode head) {     lnode a, b;     a = head->next;     head->next = NULL;     while (a != NULL)     {         a = b;         a = a->next;         b->next = head->next;         head->next = b;     } } void print(lnode head) {     lnode a;     printf("output linklist：");     a = head->next;     while (a != NULL)     {         printf("%d", a->data);         a = a->next;     } } int main() {     int n;     lnode head;     creastlist(head);     print(head);     invert(head);     print(head);     system("pause");     return 0; } 改成一级指针，然后指针采用引用，不然就会出现楼上说的那种，函数内部分配内存，导致外部指针还是野指针的情况，我也是刚学这部分，可以相互交流阿

引用 4 楼 sinat_38804017的回复:typedef struct node { int data; struct node *next; }node,*lnode; 这样定义的意思是lnode = *node; 你这样写的话，就全部是定义的二级指针了，然后有个地方应该是->，你用的.操作符 那结构体应该怎么改？好难啊！

引用 3 楼 user-3的回复:[quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] 这样更改以后还是不识别箭头

引用 3 楼 user-3的回复:[quote=引用 2 楼 user-3 的回复:] void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了[/quote] #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define L sizeof(node) typedef struct node { int data; struct node *next; }node,*lnode; void creastlist(lnode *head) { lnode *a,*b; int i=1,n; head=(lnode*)malloc(L); head->next=NULL;  a=head; printf("请输入链表的长度："); scanf("%d",&n); for(;i<=n;i++) { a=(lnode*)malloc(L); printf("输入数据%d：",i); scanf("%d",&a->data); a->next=NULL; b->next=a; b=a; } } void invert(lnode *head) { lnode *a,*b; *a=head->next; head->next=NULL; while(a!=NULL) {a=b; a=a->next; b->next=head->next; head->next=b;  }} void print(lnode *head) { lnode *a; printf("输出链表：") *a=head->next; while(a!=NULL) { printf("%d",a.data); a=a->next; } } int main() { int n; lnode *head; head=(lnode*)malloc(L); creastlist(head); print(head); invert(head); print(head); return 0; }

引用 2 楼 user-3 的回复:void creastlist(lnode *head)函数内存对head进行了内存分配，并不影响函数外部也就是main函数的head的指向，也就是main函数的head还是个野指针 L的宏定义也不对，应该是结构体的大小而不是指针的大小，除非你想要的结果是head是指针的指针 你把L的宏定义改成 sizeof(node)，否则head是指针的指针，不是结构体的指针，自然你的->就不会有next成员，所以就无效了

有没有大神能救救孩子啊