Question: 求大佬帮我瞅瞅这道c语言的题目，太难了，是在educoder上运行的，真心不会做

第一关：  #include  <stdio.h> #define ARR_SIZE 30 /************Begin***********/ //此处加上输入学生信息的函数声明 int PrintArr(float *score, long *num); /************End*************/   int main(void) {     int n;     float score[ARR_SIZE];     long num[ARR_SIZE];     printf("Please enter num and score until score<0:\n");      /************Begin***********/     //此处加上函数调用     n = PrintArr(score, num);      /************End*************/     printf("Total students:%d\n", n);      return 0; }  int PrintArr(float *score, long *num) {     int i = 0, n = 0;      while (1)     {          scanf("%ld%f", &num[i], &n);         if (n >= 0)         {             score[i] = n;             i++;             if (i>=ARR_SIZE)                 break;         }         else         {             break;         }     }      return i;  }   第二关：自己写吧，思路如下 1. 2 声明两个变量作为计数器， 比如m = 0; x = 0; 遍历数组，如果成绩小于60，计数器 m++;同时打印学号; 如果成绩大于等于60，计数器 x++,同时打印学号。数组遍历完成后打印 m, x。 3. 声明一个临时int temp[5], 然后就是遍历数组加判断了，  if (score[i] < 60)     temp[0]++; else if (score[i] >= 60 && score[i] < 70)     temp[1]++; else if (score[i] >= 70 && score[i] < 80)     temp[2]++; else if (score[i] >= 80 && score[i] < 90)     temp[3]++; else if (score[i] >= 90 && score[i] < 100)     temp[4]++;  然后各分数段百分比： temp[0] / 30 * 100  其它类推


Question: 我是萌新，求大佬帮忙

引用 2 楼 user-3的回复:#include <stdio.h>  int main() { 	int ch1=0, ch2=0, ch;  	int num;      	ch = ch1 =ch2 =0; 	while( (ch=getchar())!='\n') { 		ch2 = ch1;			//保存号码倒数第二数字  		ch1 = ch;			//保存租后一个数字  	} 	printf("%c,%c\n",ch1, ch2); 	num = ((ch2-'0')*10 + ch1-'0') % 3; 	printf("现在是第 %d 组\n", num==0 ? 3: num ); 	return 0; } 纯C语言的代码，请测试。 多谢大佬！！！

引用 3 楼 sometimegy 的回复:[quote=引用 2 楼 user-3的回复:]#include <stdio.h>  int main() { 	int ch1=0, ch2=0, ch;  	int num;      	ch = ch1 =ch2 =0; 	while( (ch=getchar())!='\n') { 		ch2 = ch1;			//保存号码倒数第二数字  		ch1 = ch;			//保存租后一个数字  	} 	printf("%c,%c\n",ch1, ch2); 	num = ((ch2-'0')*10 + ch1-'0') % 3; 	printf("现在是第 %d 组\n", num==0 ? 3: num ); 	return 0; } 纯C语言的代码，请测试。 多谢大佬！！！[/quote]  感觉有点缺失，参考这个 https://blog.csdn.net/yingzinanfei/article/details/54893394 一般涉及用户输入的最好考虑下各种失败情况，至少验证下是不是手机号。  实际使用的时候坑一定更多...

代码如下:  #include <iostream> using namespace std;  int main() { 	char name[50]; 	int i=0; 	int num;    cout << "请输入手机号:"; 	cin>>name; 	while(name[i])++i; 	num=name[i-1]-48; 	num+=(name[i-2]-48)*10; 	cout<<"现在是第"; 	switch(num%3) 	{ 		case 0:cout<<"三组"<<endl;break; 		case 1:cout<<"一组"<<endl;break; 		case 2:cout<<"二组"<<endl;break; 	}    return 0; }  思路是，输入一个字符串代表手机号，然后找到字符串的末尾，while之后，i就代表着'\0'所在的位置，那么后两位自然就是i-1和i-2了，将他们加到整型变量num上，之后就对num进行取余操作，用switch来分支输出就可以完成该题了


Question: inline函数是在什么时候被展开的

内联函数与宏定义区别   （1）内联函数在编译时展开，宏在预编译时展开；   （2）内联函数直接嵌入到目标代码中，宏是简单的做文本替换；   （3）内联函数有类型检测、语法判断等功能，而宏没有；   （4）inline函数是函数，宏不是；   （5）宏定义时要注意书写（参数要括起来）否则容易出现歧义，内联函数不会产生歧义；

编译的时候就展开了，跟宏一样展开，只是inline函数展开也会做参数检查什么的。


Question: 有大佬会写这个代码嘛，可太难了

struct kecheng {     char kc[20];     char name[10];     int number;     int xf; };  int main() {      struct kecheng array[4];      ... ....      return 0; }


Question: 请教C语言结构体的一个问题，太难了啊啊啊！！！

#include <stdio.h>  struct studentinfo {     int score;     struct studentinfo* next; }st1,st2,st3;  void Print_Score(struct studentinfo *st1) {     printf("st1.score = %d \n",st1->score);     printf("st2.score = %d \n",st1->next->score);     printf("st3.score = %d \n",st1->next->next->score); }  int main() {     st1.score =100;     st2.score = 98;     st3.score = 96;     st1.next = &st2;     st2.next = &st3;     st3.next = NULL;     Print_Score(&st1);     return 0; } 供参考～  Print_Score函数的形参类型在哪里声明的？

student 应该是studentinfo

就是个链表嘛。 printf("st3.score = %d \n",st1->next->score); ==》》printf("st3.score = %d \n",st2->next->score);


Question: 一个打印的问题

引用 2 楼 skzeng@ros 的回复:你将q定义为char类型，而打印时却要求打印unsigned int，那么要进行强制类型转换。 无符号存储是将有符号存储的负数部分的个数全部加到正数部分，比如int型范围是-1~1，那么unsigned范围就是2。 望采纳～～～ 你的描述是不是有问题呢。  char类型先转int类型，再转unsigned int，由于转Int是-1，最高位是符号位，转unsigned int后最高位为有效数据位。因此输出的是很大的值。

因为q是char类型，而输出的是%u是unsigned int类型，根据类型提升，逐步提升。0xFF提升到int是-1；-1转%u就是你得到的结果。

因为 char a=0xff，它就是char的-1；负数是用补码表示，一般的编译器下，char代表的是7位二进制数，最高位是符号位 最高位为1表示是一个负数，负数使用补码表示，负数的补码，每位取反，然后加一，那么-1 ，源码 应该是 1000，0001，每位取反（注意不包括最高位） 是 1111，1110 .然后加一，就是1111，1111=0XFF,所以0xff就是char 的-1，那么如果把一个char赋给int，是不是应该保持数值不变啊？你把（char)-1给了int 应该还是-1，对吧，int 的-1,如果按上述计算方法，应该是0xffffffff

引用 4 楼 自信男孩 的回复:[quote=引用 2 楼 skzeng@ros 的回复:] 你将q定义为char类型，而打印时却要求打印unsigned int，那么要进行强制类型转换。 无符号存储是将有符号存储的负数部分的个数全部加到正数部分，比如int型范围是-1~1，那么unsigned范围就是2。 望采纳～～～ 你的描述是不是有问题呢。  char类型先转int类型，再转unsigned int，由于转Int是-1，最高位是符号位，转unsigned int后最高位为有效数据位。因此输出的是很大的值。[/quote]   为啥0xFF提升到int是-1呢，请赐教

char向int转换，进行了符号位扩展，0xff扩展为0xffffffff，按无符号输出就是unsigned int最大值


Question: 如何用C++输出特殊字符呢？

红桃♥♠方块♦♣

设置命令行支持中文

图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder 6.0几个示例程序项目源代码下载：       C++ Builder第一个程序（模拟聊天室）v1.11 C++ Builder模拟数字双时钟示例（未完成）v0.2.1 C++ Builder纸牌游戏Demo v0.03 C++ Builder不规则图像透明贴图（位图的透明显示）三种方法及简单动画v1.3 C++ Builder写的《ZEC 四则运算练习程序》 海底海星情景v0.9.2 C++ Builder简单电话簿Demo例子v1.11

已解决，把小黑窗的字体改为点阵字体就好啦！

引用 1 楼 Simple-Soft 的回复:设置命令行支持中文您好，应该怎么操作呢？

支持加学习，谢谢楼上分享，红桃♥♠方块♦♣


Question: 求教

希望有大佬可以用c语言帮我一下


Question: 求教

这样问问题，真没有办法回答。最好是将代码贴出来，这样想帮你的人才好用IDE环境进行编译，才好判断错误所在。


Question: C语言getchar

循环一次，读一个字符，当然要在循环里。

这样用不行，判断不要放到while里面，因为你每输入一次都要按回车的


Question: 请大佬帮我看看这里循环出了什么问题

#include <stdio.h> #include <stdlib.h> #include <time.h>  int main(){ 	int arr[9][9]={0};	//	规范数独大小  	int i, j;	//	i:一维下标	j:二维下标   	int label_1, label_2, label_3; 	//	label_1：当前行是否满足填写条件		label_2：当前列		label_3：当前九宫格	 	srand(time(NULL));		//	随机数种子   	for (int num=1; num<=9; num++){	//	依次填入数字 1-9  		for(int count=1; count<=9; count++){		//	每个数字填入9次  			do{ 				i = rand()%9;	//	一维下标 				j = rand()%9;	//	二维下标  				label_1 = 0;	//	初始值 				label_2 = 0; 				label_3 = 0; 				if (arr[i][j]!=0)	continue; 					for (int k=0; k<9; k++) 						if (arr[i][k]!=num)	label_1++; 					for (int m=0; m<9; m++) 						if (arr[m][j]!=num)	label_2++; 					for (int p=i/3*3; p<i/3*3+3; p++) 						for (int q=j/3*3; q<j/3*3+3; q++) 							if (arr[p][q]!=num)	label_3++;												 			}while (label_1<9 || label_2<9 || label_3<9); 			 			arr[i][j] = num; 		}		 	}  	printf("\n\n\n"); 	for (int i=0; i<9; i++){ 		for (int j=0; j<9; j++){ 			printf("%d   ", arr[i][j]); 			if ((j+1)%3==0)	printf("   "); 		} 		printf("\n\n"); 		if ((i+1)%3==0)	printf("\n"); 	} 	return 0; }


Question: 烦请大家来帮忙看一下这两个小问题啊

有人能看到这个题目帮帮忙嘛

把输入的字符串转成日期进行比较


Question: c语言基础知识字符串

引用 2 楼 qiu_shaofeng的回复:%s 是打印字符串  printf("%c",*p);打印一个字符 好的↖(^ω^)↗，谢谢

引用 1 楼 user-2的回复:返回的是剩下字符串的首地址，所以剩下的全打印出来了 好的😄，谢谢你😊

%s 是打印字符串  printf("%c",*p);打印一个字符

返回的是剩下字符串的首地址，所以剩下的全打印出来了


Question: 各位大神救救孩子吧。呜呜呜，做了一个系统，改完代码显示没错误了，但是执行又出错了。

无代码无真相

alterpassword()函数只声明，没有定义？ VC++6.0是我的最爱，没有之一！


Question: 对fgets()函数使用取非运算符!fgets()是什么意思?

fgets读取失败就返回NULL，NULL相当于0相当于false，加上！（not）取反，就表示读取成功的意思。


Question: C语言初学着请求帮助

引用 5 楼 m0_46570923 的回复:[quote=引用 3 楼 user-3的回复:] 同样vs2019你编译时有这个错误吗 有！但是不会改，也看不明白是什么意思，只能自己瞎改，[/quote] 栈空间定义的太多了，把一些临时变量大小设的小一点

需要买什么呢？？

引用 7 楼 m0_46570923 的回复:[quote=引用 5 楼 m0_46570923的回复:][quote=引用 3 楼 user-3的回复:] 同样vs2019你编译时有这个错误吗 有！但是不会改，也看不明白是什么意思，只能自己瞎改，[/quote] 自学的，没人讲，[/quote]     现在这个年代最好买全套教材，包括：教程，习题，视频。光自学看书，进度太慢了呀！

引用 5 楼 m0_46570923的回复:[quote=引用 3 楼 user-3的回复:] 同样vs2019你编译时有这个错误吗 有！但是不会改，也看不明白是什么意思，只能自己瞎改，[/quote] 自学的，没人讲，

我想知道这个怎么改

引用 3 楼 user-3的回复: 同样vs2019你编译时有这个错误吗 有！但是不会改，也看不明白是什么意思，只能自己瞎改，

修改了一下，可以正常运行，供参考  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<string.h> #include<stdlib.h> #define M 100 typedef struct students { 	int number; 	int score; }list; typedef list datatype; typedef struct shunxubiao { 	datatype students[M]; 	int length; }info;  info kong();//置空一个顺序表 void Scanf(info *L);//向顺序表中输入想要输入的数据 void printflist(info *L);//此函数是为了进行函数的输出  int main() { 	info A = kong();//定义一个顺序表啊 	Scanf(&A);//向顺序表中输入想要输入的数据 	printflist(&A); 	return 0; }  info kong()//置空一个顺序表 { 	info L; 	L.length = 0; 	return L; }  void Scanf(info *L)//向顺序表中输入想要输入的数据 { 	 	if ( L->length == M ) 	{ 		printf("顺序表中已经满了，无法进行输入"); 		exit(1); 	} 	char ch = 0; 	while ( 1 ) 	{		 		printf("请输入学生成绩："); 		scanf("%d", &L->students[L->length].score); 		printf("请输入学生的学号："); 		scanf("%d", &L->students[L->length].number); 		L->length++; 		getchar(); 		printf("是否继续输入?（Y||N):");		 		scanf("%c", &ch); 		if ( ch == 'y' || ch == 'Y' ) 		{			 		} 		else 		{ 			break; 		} 	}	  }//这个函数是为了进行数据的输入而准备的  void printflist(info *L)//此函数是为了进行函数的输出 { 	int i; 	for ( i = 0; i < L->length; i++ ) 	{ 		printf("学生的学号: %d, 成绩: %d\n", L->students[i].number, L->students[i].score);			 	} }

同样vs2019你编译时有这个错误吗

子函数都是传值，主函数的的 顺序表A里有数据吗？


Question: 代码报错了，求找出问题

代码没发现什么问题～

已解决，谢谢

复制你的代码，把int min(int a,int b)改成 int Min(int a,int b)后运行正常，vs2019环境。应该是 min和库函数里重名了吧


Question: 小白求大佬帮忙看看错哪了

直接贴代码吧～

printf 不是scanf, 直接用 printf("%d", s[p].num)

贴代码比贴图更容易获得帮助，没人愿意看着图把代码敲一遍，复制粘贴就容易的多。 粗看了一下问题应该是 变量 i=1这里，改成 i=0试试看。数组下标是从0开始的。


Question: c语言difftime

贴代码吧，图看着费劲


Question: 求大佬解答一下这2个问题，最好有解题思路

第一题是三个实参，不要受括号和加号干扰，选A  第二题选C，那个函数是值传递，计算结果不影响主函数中a的值

谢谢各位😊😊😊

最好写一下解题思路


Question: 组合数，函数递归。

循环和递归都可以

引用 1 楼 Simple-Soft的回复:哪儿不懂？就是让你实现求组合数，数学里面的公式 我是不是可以直接把性质二里面的c（m，n）换成c（n-m，n）。然后用循环来找到满足c（1，n）=n？

哪儿不懂？就是让你实现求组合数，数学里面的公式

int C(int m, int n) { 	if (m == n) 		return 1; 	else if (m == 1) 		return n; 	 	else 		return C(m, n - 1) + C(m - 1, n-1);  }  int main() { 	 	cout<<C(4,8);     return 0; }

应该没有关系

他这个组合数中m、n的顺序怎么和我学的是相反的


Question: 一道循环结构的题目，应该是有点小错误，求大神帮看！

不知道是不是csdn排版的问题，你的花括号也太乱了吧，标志位k没有重置为1  #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { 	int i,j,m,n,sum=0,t=0,k=1;  	scanf("%d%d",&m,&n);  	if(1<=m&&m<=n&&n<=500) 	{ 		for(i=m;i<=n;i++) 		{ 			k = 1; 			if(i<2) 			{ 				k=0; 			}             else 			{ 				for(j=2;j<i;j++) 				{ 					if((i%j)==0) 					{ 						k=0; 						break; 					} 				} 			}	 			if(1 == k) 			{ 				t++; 				sum = sum+i; 			} 		} 		 		printf("%d %d",t,sum); 	} 	else 	{ 		printf("输入数据错误"); 	} 	return 0; }

#include <stdio.h> #include <stdlib.h> #include <math.h> int main() {int i,j,m,n,sum=0,t=0,k=1; scanf("%d %d",&m,&n); if(1<=m&&m<=n&&n<=500) {for(i=m;i<=n;i++)    {if(i<2) k=0;     else     for(j=2;j<i;j++)     if((i%j)==0) k=0;      if(k==1) {t++;sum=sum+i;}      k = 1;     }printf("%d %d",t,sum); } else printf("输入数据错误");     return 0; }  需要重置一下


Question: 操作系统 多线程并发题目

问题四的 flag 可能会是 71/66 还好理解，21/65 的情况还真摸不着头脑了 首选，fork出来的子进程，内存信息只是父进程的拷贝，和父进程是相互独立互不干涉的，所以父进程修改flag并不影响子进程的flag。 那么好了，fork的时候flag是多少？父进程执行到fork之前，执行了flag=flag+15，也就是flag==16，在这个基础上，子进程复制了父进程的内存信息，所以fork的时候子进程的flag是16。 在if(pid=fork())时点，子进程被创建，此时就有2个进程（父进程和子进程）一起执行if(pid=fokr())以后的代码。父进程fork的结果返回子进程的pid，不为0，所以会进入if(pid=fokr())分支；而子进程返回的pid为0，所以会进入else的分支。那么刚才知道父进程和子进程的flag是把互不干涉的，所以子进程进入else代码的flag=flag+50==66（fork的时候flag是16，所以这里的结果是66）是不变的，至于printf("3rd flag")的结果是什么，那就取决于printf("3rd flag")之前子进程时候发生了中断（父进程kill pid），①如果发生了中断（也就是父进程的kill发生在子进程的printf("3rd flag")之前），那么子进程就会调用func执行flag=flag+5，也就是会在flag==66的基础上多加5==71（不管这个加5发生在flag=flag+50计算之前还是之后，计算结果都不变），所以打印结果就是71；②如果没发生中断（也就是父进程的kill发生在子进程的printf("3rd flag")之后），那么因为子进程已经打印，之后调用func已经不影响打印结果，所以打印结果就是66。③至于打印结果为啥有21？这里推想是子进程在刚要执行flag=flag+50的是时候发生了中断（父进程把子进程kill了），所以会先调用func执行flag=flag+5==21，然后子进程默认的中断处理是结束程序，也就是后续的flag=flag+50和printf("3rd flag")都没来得及执行子进程就退出了，所以此时flag是21，但此时的21应该是没被打印出来的。至于65的结果，那就更捉摸不透了，因为flag是从16开始的（父进程内存拷贝的时候flag是16），怎么加50或加5，都想不出能算出65。


Question: 求大佬看下程序哪里出错了

排版感人。。。

报什么错啊？

排版太乱了，没人愿意看的，建议改进一下排版


Question: 单链表中每个结点中的mallco函数申请的内存空间是像数组一样连续的吗？

可能连续，也可能不连续。

不是，非连续的


Question: 有关scanf的输入问题

注意，i++,根据参数是从左向右压栈，所以出栈是从又向左，因此a->exp[i++]输入后，i的值会自增1，那么前面的coe就不是第i的元素了，而是i+1。因此i++不能放在scanf中，而是应该放到外面，并给while加上大括号～

也许你可以贴一下源码


Question: 求教

谢谢啊，刚开始自学，操作起来比较困难

for example  void Insert(List *L, Node e) { //这里为啥用二级指针？按理用List L就可以了，因为List本身就是指针类型了，是链表为空则新建链表吗？     if (*L==NULL) {         *L = (List)malloc(sizeof(Node));         strcpy(*L->ID, e.id);         *L->Score = e.Score;         *L->next = NULL;         return;     }     List p = *L;     while (p->next != NULL) {         p = p->next;     }     p->next = (List)malloc(sizeof(Node));     strcpy(p->next->ID, e.ID);     p->next->Score = e.Score;     p->next->next = NULL; }  void Swap(List *L, int i, int j) { //这里应该用List L就可以了，不需要二级指针     int cnt = 0;     List p=*List, pi1=p, pi2=NULL, pj1=p, pj2=NULL, tmp;     while (p!=NULL) {         if (cnt==i-1) pi1=p; //i的上一个节点         if (cnt==i) pi2=p;//i节点         if (cnt==j-1) pj1=p; //j的上一个节点         if (cnt==j) pj2=p; //j节点         cnt++;         p = p->next;     }     if (pi2!=NULL && pj2!=NULL && pi2 != pj2) { //如果找到两个节点，并且两个节点不同，则交换节点         pi1->next = pj2; //i的上一个节点的next指向j节点         pj1->next = pi2; //j的上一个节点的next指向i节点         tmp = pj2->next;         pj2->next = pj1->next; //j节点的next指向原来i节点的next         pi2->next = tmp; //i节点的next节点指向原来j节点的next     } }


Question: 关于数组的最小值输出问题

引用 2 楼 qybao 的回复：因为你只是比较相邻的两个元素，不相邻的没有比，所以结果自然不对 改为 min=a[0];//min取第一个元素的值 for (i=1; i<n; i++)     if (min>a[i]) //然后每个元素都跟min比         min=a[i]; printf(“%d”, min);从头开始，每相邻的两个数比较，把小的赋给后一个数，一直到数组的最后一个不就是最小的数吗

引用 6 楼 weixin_48192256 的回复:[quote=引用 4 楼 qybao 的回复：][quote=引用 3 楼 weixin_48192256 的回复：][quote=引用 2 楼 qybao 的回复：]因为你只是比较相邻的两个元素，不相邻的没有比，所以结果自然不对 改为 min=a[0];//min取第一个元素的值 for (i=1; i<n; i++)     if (min>a[i]) //然后每个元素都跟min比         min=a[i]; printf(“%d”, min);从头开始，每相邻的两个数比较，把小的赋给后一个数，一直到数组的最后一个不就是最小的数吗[/quote]也可以，像冒泡一样，那你应该打印a[i-1]而不是打印a[i]，想想for循环结束i是多少？是不是i==n？那数组长度是n，数组最后一个元素下标是多少？[/quote]for循环里面的判断条件不是i<n吗，所以最后出循环的时候i=n-1，好像没有越界吧[/quote]  i = n-1的时候不会出循环，再执行一次i++,这时候i == n了，才出循环

引用 4 楼 qybao 的回复：[quote=引用 3 楼 weixin_48192256 的回复：][quote=引用 2 楼 qybao 的回复：]因为你只是比较相邻的两个元素，不相邻的没有比，所以结果自然不对 改为 min=a[0];//min取第一个元素的值 for (i=1; i<n; i++)     if (min>a[i]) //然后每个元素都跟min比         min=a[i]; printf(“%d”, min);从头开始，每相邻的两个数比较，把小的赋给后一个数，一直到数组的最后一个不就是最小的数吗[/quote]也可以，像冒泡一样，那你应该打印a[i-1]而不是打印a[i]，想想for循环结束i是多少？是不是i==n？那数组长度是n，数组最后一个元素下标是多少？[/quote]for循环里面的判断条件不是i<n吗，所以最后出循环的时候i=n-1，好像没有越界吧

楼上说得对，a[n]数组越界了

引用 3 楼 weixin_48192256 的回复：[quote=引用 2 楼 qybao 的回复：]因为你只是比较相邻的两个元素，不相邻的没有比，所以结果自然不对 改为 min=a[0];//min取第一个元素的值 for (i=1; i<n; i++)     if (min>a[i]) //然后每个元素都跟min比         min=a[i]; printf(“%d”, min);从头开始，每相邻的两个数比较，把小的赋给后一个数，一直到数组的最后一个不就是最小的数吗[/quote]也可以，像冒泡一样，那你应该打印a[i-1]而不是打印a[i]，想想for循环结束i是多少？是不是i==n？那数组长度是n，数组最后一个元素下标是多少？

引用 7 楼 WhiteCCai的回复:[quote=引用 6 楼 weixin_48192256 的回复:] [quote=引用 4 楼 qybao 的回复：][quote=引用 3 楼 weixin_48192256 的回复：][quote=引用 2 楼 qybao 的回复：]因为你只是比较相邻的两个元素，不相邻的没有比，所以结果自然不对 改为 min=a[0];//min取第一个元素的值 for (i=1; i<n; i++)     if (min>a[i]) //然后每个元素都跟min比         min=a[i]; printf(“%d”, min);从头开始，每相邻的两个数比较，把小的赋给后一个数，一直到数组的最后一个不就是最小的数吗[/quote]也可以，像冒泡一样，那你应该打印a[i-1]而不是打印a[i]，想想for循环结束i是多少？是不是i==n？那数组长度是n，数组最后一个元素下标是多少？[/quote]for循环里面的判断条件不是i<n吗，所以最后出循环的时候i=n-1，好像没有越界吧[/quote]  i = n-1的时候不会出循环，再执行一次i++,这时候i == n了，才出循环[/quote] 哦哦哦，我懂了

你要排序吗？不拍序，不用交换，直接用一个变量保存最小值


Question: 分配内存后如果指针不在指向这块内存区域是，有没有必要释放

引用 4 楼 gouyanfen 的回复:[quote=引用 3 楼 hello陈胜 的回复:] [quote=引用 2 楼 gouyanfen 的回复:] 就你的代码来说，释不释放没什么区别。 不过你不可能一直只写这么简单的代码吧，养成一个良好的习惯很重要。所以有必要的。  谢谢回复，这段代码只是随手敲的，主要是想通过这个搞清楚单向链表里删除中间一个节点时，直接将前一个节点指向被删除节点的下一个节点时，这个节点的内存是否需要释放的问题，如果需要释放的话，需要怎么操作呢（原来指向这块内存的指针变量已经不在指向它）[/quote] 改变指向之前释放他。[/quote] 假如说你写的是一个链表类模板之类的，如果你不释放他带来的直接后果就是运行之后，程序占用内存会一直增大，直到消耗完电脑的资源。分配内存就是在系统管理的内存上面申请使用一段区域。系统会做以标记，你不主动释放系统会一直标记为被占用状态，小段代码影响不会很大，程序结果系统会自动回收，长期运行的程序，或频繁运行的部分会使内存消耗完。拖死系统。

引用 3 楼 hello陈胜 的回复:[quote=引用 2 楼 gouyanfen 的回复:] 就你的代码来说，释不释放没什么区别。 不过你不可能一直只写这么简单的代码吧，养成一个良好的习惯很重要。所以有必要的。  谢谢回复，这段代码只是随手敲的，主要是想通过这个搞清楚单向链表里删除中间一个节点时，直接将前一个节点指向被删除节点的下一个节点时，这个节点的内存是否需要释放的问题，如果需要释放的话，需要怎么操作呢（原来指向这块内存的指针变量已经不在指向它）[/quote] 改变指向之前释放他。

引用 2 楼 gouyanfen 的回复:就你的代码来说，释不释放没什么区别。 不过你不可能一直只写这么简单的代码吧，养成一个良好的习惯很重要。所以有必要的。  谢谢回复，这段代码只是随手敲的，主要是想通过这个搞清楚单向链表里删除中间一个节点时，直接将前一个节点指向被删除节点的下一个节点时，这个节点的内存是否需要释放的问题，如果需要释放的话，需要怎么操作呢（原来指向这块内存的指针变量已经不在指向它）

引用 8 楼 hello陈胜 的回复:所以要先定义另外一个指针p，它和前一个节点的->next一样指向待释放的空间，当前一个节点的->next已经不在指向待删除区域时，仍有p指向它，达到释放的目的，这样理解对吗？ 你说的是链表吧，链表就是把申请的空间的首地址赋值到上一个节点的next指针，这样开始申请空间的指针又可以去malloc接收新的地址空间。所以，只要还用，就不需要释放，用另一个指针保存就好了。

前提是这个指针不指向malloc申请的空间了，是否保存到了其他指针里面。如果没有，直接让指针指向别处，那么malloc申请的空间就会泄露，因为不释放就会一直占着，直到程序退出，系统回收。如果程序不退出，会一直不会被新的malloc申请到，这部分内存也找不到，所以会导致内存泄露。一般是写服务器程序时需要特别注意内存泄露问题～

free(p); p = NULL; 一般释放内存都是这两句

这个里面你分配的意义何在？一般情况下，分配了都要释放


Question: 无法重复读取字符串,什么原因?如何修改？

#include <stdio.h>   int ar(char *p,char n) {     int i, j;     i = j = 0;      while(p[i]){         if(p[i]==n){             j=1;             break;         }         /*    冗余代码         else             ;             */         i++;     }     return j==1?1:0; }  int main(void) {     //char *y;     //int r=1;     char b;     int c;//,i;     //i=0;     char a[100];     printf("输入字符串：");     fgets(a,sizeof(a),stdin);     while(1){         printf("输入字符：");         b=getchar();         getchar();    //for '\n'         c=ar(a,b);         printf("%d\n",c);         printf("输入字符串：");         fgets(a,sizeof(a),stdin);     }     return 0; } 供参考～  需要注意fgets是遇到换行符就直接返回，因此上次输入之后残留在输入缓存里的换行符需要去掉，因此用getchar();吃掉

应该是两个输入之间有多余的字符，所以后面的fgets()就直接过了，你在之间再加一个fgets()过滤掉多余的字符呗  while(1) 	{ 		printf("输入字符："); 		b=getchar(); 		c=ar(a,b); 		printf("%d\n",c);         fgets(a,sizeof(a),stdin); 		printf("输入字符串：");         fgets(a,sizeof(a),stdin);     }

打印结果的是8. 但我用a[0]=(char *)malloc(sizeof(char)*100);这个语句为a[0]在内存中分配了100个字节的存储空间。为什么没有打印100呢？

引用 5 楼 1东风1 的回复:为以下代码中的指针a[0]分配 100个字节的存储空间，但为什么显示只分配了8个字节？ 引用#include"stdio.h" int main(void){ 	char *a[50]; 	a[0]=(char *)malloc(sizeof(char)*100); 	printf("%d",sizeof(a[0])); 	return 0; }   奇怪的操作。。。 应该打印4吧，sizeof(a[0])计算的是char* 的大小，是固定的

运行结果如下图，从运行结果上看，问题出现在循环体里面的那行fgets(a,sizeof(a),stdin);语句。这行并没有读取字符串，不知是什么原因?

不能读，是退出来了吗？你调试一下就知道哪里有问题


Question: 打印long double类型值

对于printf()函数的用法，请参考《C++中printf()函数的用法10-4》 希望能够帮到您！

引用 1 楼 user-3 的回复:printf("%lf", num) 要用%llf输出long double，因为double是用%lf，然后加了一个long，所以是%llf，其实%Lf也是可以的（已经验证）；  long double是C99标准支持的，也要看你的编译器是否支持

printf("%lf", num)


Question: 结构体问题

代码没问题，在LINUX下用gcc/g++编译没问题～

非法的字节序列，如果能看到内存里到底存的什么就好了，按理说如果只是超出字符表示范围应该只是显示乱码而已。

之前遇到过。应该是编码问题，你试试别用中文能不能运行，如果可以就是编码问题了，试试gcc编译文件时，在命令参数加上:-finput-charset=GBK(或者GB2312)

VS2015 C++环境不报错


Question: keil4错误，TEXT1.C(23): error C216: subscript on non-array or too many dimensions

引用 1 楼 user-1 的回复：我觉得lz应先找本入门级的教材先好好学学 就题目的问题，应该是display函数的sgn变量，明明是个普通的long，却被当成数组使用P0=sgn[0] 另外，变量的作用范围不清，bb是display的局部变量，keyscan1看不见bb，又怎么能给bb清0？ 还有，变量没有初始化就使用，if(bb/100%10==0) 这里bb都没赋过值，计算结果能正确吗？ 除非bb是全局变量谢谢大佬，我是大一学生，要做课设，真的不太会，我应该怎么改一下呢


可以贴出跟多或者全部的代码，尤其是结构体声明的部分

其实还有其他错误，但是我就想着到这个错误是为什么绿波浪线全是错误。。。当然如果这两个也能讲一下的话就更好了，会加分，谢谢！


Question: MinGW64\bin 目录里的几个程序。。。。求见多识广的老哥！

1. ar 与 gcc-ar gcc-ar似乎是对ar的封装，以解决各种路径的问题。  $ar Usage: C:\msys64\mingw64\bin\ar.exe [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...        C:\msys64\mingw64\bin\ar.exe -M [<mri-script] $ gcc-ar.exe Usage: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ar.exe [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...        C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.1.0/../../../../x86_64-w64-mingw32/bin/ar.exe -M [<mri-script]  可以看见最后调用的还是ar, 但是路径变了。估计是为了适应编译期间的各种相对路径关系而做的封装。  2.关于ld与ld,.bfd 是链接时候支持库的格式不同：  转自 http://blog.sina.com.cn/s/blog_a9303fd90101d0hd.html Binutils supports 2 linkers, ld.gold and ld.bfd.   One of them is configured as the default linker, ld, which is used by GCC.   Sometimes, we want to use the alternate linker with GCC at run-time.   This command -fuse-ld=bfd and -fuse-ld=gold can help to to change between ld.bfd or ld.gold. Gold linker 的介绍： gold is a linker for ELF files. It became an official GNU package and was added tobinutils on March, 2008 and first released in binutils version 2.19. Gold was developed by Ian Lance Taylor and a small team at Google.The motivation for writing gold was to make a linker that is faster than theGNU linker, especially for largeapplications coded in C++.   bfd linker的介绍： The linker accesses object and archive files using the BFD libraries. These libraries allow the linker to use the same routines to operate on object files whatever the object file format.   3.gdb和gdb32 应该就是32位的意思。  4.dllwrap 就是从动态库创建lib文件的，是生成库给别人用的时候要提供的那个lib。  5.用MD5工具一看，gcc这两个文件是一模一样的。 那个长的名字给定了程序本身的架构（64位叫x86_64, 32位叫i686)、编译时运行本工具的架构。这个在跨平台编译的时候才有效。比如，在windows下编译ARM的程序，则要用到 arm-none-linux-gnueabi-gcc.exe。

哪位大佬能回答下

求解


Question: c语言函数

引用 1 楼 天翔龙闪 的回复:你把 scanf("%d,%d",&x,&y);改成 scanf("%d%d",&x,&y); 就是把中间的逗号去掉就可以了  或者你不改，输入时，输入6,9，也可以得出正确答案

我们一般都是用空格间隔的，，容易忘记输入

input two numbers:6,9 maxmum=9 我运行是正确的啊，这样的函数一般也不会出问题啊，你再运行也是这样嘛？


Question: c语言 往一个unsigned char类型写入大于255的值 实际会怎么做

引用 5 楼 弋阳yoga 的回复:引用 2 楼 自信男孩 的回复:高位阶段，保留低位一字节的内容～截取写入的话 是c语言规定如此的？ 还是和编译器实现有关？ 在内存里就是这么存的，比如一个4字节的int数据，高位存在高字节，低位存在低字节（小端系统），所以0x12c是2个字节的大小，所以0x2c放在低字节，即放在了你定义的变量里，0x01就放在高字节，但是你取变量时，是取不到0x01的，只能取到0x2c，因为它是unsigned char

是啊，理论上是会造成影响，所以除以256取余。保留低位

以截取0x2c的方式写入，不会对其他数据造成影响，多出来的会舍弃掉

高位阶段，保留低位一字节的内容～

截取0x2c 转换成二进制取后面，前面溢出舍弃


Question: 求助源代码

你这不算法都出来了吗？

引用 1 楼 user-1的回复:具体根据什么计算什么 已知子网内IP数的多少，求出主机位的位数，用32减去主机位数就等于网络位数，也就是子网掩码。举个例子就是，一个C类网络，包括256个主机位置，256是2 的8次方，所以主机位是8，那么网络位就是32-8=24，也就是说子网掩码是24位，用二进制表示就是11111111.11111111.11111111.00000000，换算成十进制就是255.255.255.0

引用 3 楼 user-1的回复:你这不算法都出来了吗？ 我不会编写代码 大哥可以帮帮忙吗

具体根据什么计算什么


Question: 如何查看函数指针具体调用的函数名称

引用 4 楼 自信男孩 的回复:在每个函数里都加一条打印，比如printf("%d: %s\n", __LINE__, __func__); 这样每次调用对应的函数，函数里执行这条打印就会显示函数名（还有行号） 这种方法比较麻烦，那就是每个函数里都要加一条这样的打印，但是会比较准确

函数指针调用时的指针地址应该可以打印，通过这个地址能知道是哪个函数吗？每个函数编译完是不是都有一个地址

debug应该是最快的，在函数调用的地方打个断点，然后单步跟踪进入函数 或者grep一下出现的地方，然后按处理逻辑顺序捋清哪个处理函数指针被赋了什么值

通过debug调试进入具体调用的函数就知道调用的函数。


Question: 求助贴！

引用 4 楼 毛毛596 的回复:[quote=引用 3 楼 5250的回复:]向这种XXXX系统，二话不说就用结构体数组，妥妥滴。 struct XX{   char name[20];   char tel[20]; } 把所有姓名循环列出来，输入名字后，查找结构体数组，把电话列出来不就行了？  你所谓的打字机的效果啥意思？一个接一个列出来而不是一次输出？用sleep函数暂停一会儿就好了。 是的 一个接一个列出[/quote] 那就输出字符间用sleep函数暂停一下，时间你自己把握

引用 3 楼 5250的回复:向这种XXXX系统，二话不说就用结构体数组，妥妥滴。 struct XX{   char name[20];   char tel[20]; } 把所有姓名循环列出来，输入名字后，查找结构体数组，把电话列出来不就行了？  你所谓的打字机的效果啥意思？一个接一个列出来而不是一次输出？用sleep函数暂停一会儿就好了。 是的 一个接一个列出

建立一个结构体，每个姓名对应一个手机号。当选中姓名时把手机号打出来就是了。没那么复杂

这样试试看：当选中姓名时，对应电话号码赋值给一个字符数组，然后循环输出每个字符

谢谢各位🙏 俺搞定了


Question: fsacnf（）读取不了文本文件内容，只输入最后赋值的信息

#include<stdio.h> #include<stdlib.h>  int main() {     char s[200]= "";     int i=0;     long l;     char name[20];     int money;     FILE *txt;     void srml(char s[200]);      srml(s);     if((txt=fopen(s,"w+"))==NULL)     {         printf("没有找到文件!\n");         exit(0);     }     else         printf("打开文件成功!\n");      printf("请输入你要写入的职工信息！\n");     for(i=0;i<3;i++)     {         scanf("%ld%s%d",&l,name,&money);         fprintf(txt,"职工号：%ld 姓名:%s 工资：%d\n",l,name,money);   //注意每个元素之间加空格         //fflush(txt);     }     rewind(txt);    //把文件指针重置到开头位置，否则读不到刚才写入的内容     for(i=0;i<3;i++)     {         fscanf(txt,"职工号：%ld 姓名:%s 工资：%d\n",&l,name,&money);    //注意每个元素之间加空格         printf("职工号：%ld姓名：%s工资：%d\n",l,name,money);     }     fclose(txt);      return 0; } void srml(char s[200]) {     int i;     char c;     printf("请输入文件地址!\n");     for(i=0;(c=getchar())!='\n';)     {          if(c!='\\')             s[i++]=c;         else         {             s[i++]='\\';             s[i++]='\\';         }     }     s[i] = 0; }

加了rewind(txt);它现在变成只读出第一个信息了，然后我在想是不是因为换行符，然后我把换行符去掉，能读出其他信息都是有些是乱码，而且是死循环那种。我刚学文件的操作，老师没有细讲，文件指针的位置是怎么看出来的？

#include<stdio.h> #include<stdlib.h>  int main() {     char s[200]= "";     int i=0;     long l;     char name[20];     int money;     FILE *txt;     void srml(char s[200]);      srml(s);     if((txt=fopen(s,"w+"))==NULL)     {         printf("没有找到文件!\n");         exit(0);     }     else         printf("打开文件成功!\n");      printf("请输入你要写入的职工信息！\n");     for(i=0;i<3;i++)     {         scanf("%ld%s%d",&l,name,&money);         fprintf(txt,"职工号：%ld姓名:%s工资：%d\n",l,name,money);     }     rewind(txt);    //把文件指针重置到开头位置，否则读不到刚才写入的内容     for(i=0;i<3;i++)     {         fscanf(txt,"职工号：%ld姓名:%s工资：%d\n",&l,name,&money);         printf("职工号：%ld姓名：%s工资：%d\n",l,name,money);     }     fclose(txt);      return 0; } void srml(char s[200]) {     int i;     char c;     printf("请输入文件地址!\n");     for(i=0;(c=getchar())!='\n';)     {          if(c!='\\')             s[i++]=c;         else         {             s[i++]='\\';             s[i++]='\\';         }     }     s[i] = 0; }  供参考～  注意文件指针的位置

fscanf读取不了信息

fscanf(txt,"职工号：%ld姓名:%s工资：%d\n",&l,name,&money);这条语句没有用，不知道为什么。

srml（）是用来输入目录的函数\自动加成\\。


Question: C语言模块化的问题

引用 29 楼 ba_wang_mao的回复:搞嵌入式开发必须用C语言，单片机上以及物联网小设备上全是用C语言开发的。      嵌入式下使用的操作系统全部是用C语言开发的，例如：小型的操作系统：FreeRTOS ,RT-THREAD,uCOSII,uCOSIII。                                                                              例如：中型的操作系统 VxWorks ，用于飞机控制、航空航天控制等等。 嗯嗯，一步步来嘛

看不懂，C语言忘完了。

哈哈，时间真是漫长啊，那我也是想尝试一下的，时间长就长吧，就算最后没有那么成功，但也不可能白学，值得的

由于没有一家公司用C语言开发【开放、通用】的驱动程序提供给程序员， 导致程序员在WINDOWS系统上用C++开发软件周期太长而且难度超高，在10多年前，没有一定实力的程序员根本无法在WINDOWS下编写一款成熟的软件，导致用C++语言在WINDOWS下开发必须要3年才能入门（因为C++语言就只给你提供了语言方面的知识，什么驱动呀、操作系统底层的东东都没有提供，需要全部依靠程序员自己的能力编写）。         自从SUN公司推出JAVA语言后，由于JAVA语言不光提供语言方面的知识，还提供了计算机系统绝大部分设备的驱动程序、甚至连数据结构方面的算法也提供，还善于WEB开发及后台开发，因此吸引了大批程序员转学JAVA语言。        总结：JAVA语言从自学到搞出一个简单的软件最多需要半年，而C++语言从自学到搞出一个简单的软件至少需要3年以上，JAVA语言从自学到搞出一个稍微复杂的软件最多需要二年，而C++语言从自学到搞出一个稍微复杂的软件有可能你10年也搞不出来。         老板是最讲究时效比的，培养一个C++程序员成本太高，而培养一个JAVA程序成本很底，随手一抓一大把，因此现在搞C++的程序员越来越少，目前基本上龟缩到开游戏发行业了。

大中型操作系统，例如：WINDOWS操作系统基本上也全部用C语言开发的，只是和硬件打交道的部分是用汇编语言编写的。

谢谢分享经验

引用 21 楼 千梦一生的回复:c语言yyds...  c语言一定要学好。很有帮助。因为全是基础。对学习计算机很多东西很有益。  特别是指针。操作底层内存那些东西的灵魂所在。 高级语言为什么难写一些嵌入式，原因之一就是放弃了指针【自由的指针】。  高级语言的一些思想也是很妙的。那可以说的太多，不说。 嗯嗯，我个人的做事风格就是喜欢刨根问底，不知道底层是啥难受，哈哈哈哈哈

学习的路过…………………………

是的，是的，是的，是的，是的，是的，是的。

而且golang也是最接近c语言的，

可以考虑用golang，即底层，又可以上层，

引用 19 楼 zhangmingself的回复:现在C语言不是热门了，java是热门 嗯，这我知道，但我还有时间，我想从底层网上爬

现在C语言不是热门了，java是热门

引用 6 楼 自信男孩的回复:你把typedef的STRUCT改一下名字，改成STU，我怀疑编译识别成了struct 另外，把头文件里的extern int total;从头文件里拿出来，放到每个源文件里（除了main所在的头文件）。 我认为之所以一直有错可能就是因为文件多，它们链接的时候造成的某种错误，反而我单独搞了一个拥有头文件的小程序就能运行

引用 6 楼 自信男孩的回复:你把typedef的STRUCT改一下名字，改成STU，我怀疑编译识别成了struct 另外，把头文件里的extern int total;从头文件里拿出来，放到每个源文件里（除了main所在的头文件）。 我以防万一说一下，我的头文件是每一个相应的文件的目录下都分别有一个同样的头文件，不过应该和这个无关吧

引用 13 楼 sgffgdsxh 的回复:[quote=引用 6 楼 自信男孩的回复:]你把typedef的STRUCT改一下名字，改成STU，我怀疑编译识别成了struct 另外，把头文件里的extern int total;从头文件里拿出来，放到每个源文件里（除了main所在的头文件）。 我认为之所以一直有错可能就是因为文件多，它们链接的时候造成的某种错误，反而我单独搞了一个拥有头文件的小程序就能运行[/quote] 恩，编译的时候应该一起编译，尤其是main函数里需要用到的函数，要一起编译。

引用 16 楼 sgffgdsxh 的回复:十分感谢你们的帮助，我找到问题了。我一开始就错了，我以为头文件要发挥作用，就必须在每个源程序文件目录下有一个头文件，这是对我一开始的一个误导，而我这么做实际也是可行的，但是，我由于对头文件做过了修改，而其他文件里的头文件没有改过，所以导致了这么多的错误，不好意思浪费了你们的时间 还得耐心的去找原因吧，如果提前放弃也学不到这个知识点。继续加油吧～

引用 1 楼 Simple-Soft 的回复:int write_list(STRUCT *head); int write_list(STRUCT student*head);  感谢参与


Question: C语言求助！

引用 2 楼 weixin_46824808 的回复:[quote=引用 1 楼 5250的回复:]就是新规一个函数，在goto语句的地方调用函数而已  比如： goto test; test:    pass:  改为 int test(){     pass }  test(); 那改后的choose函数包含下面的switch 语句嘛[/quote]  你原来的choose函数是啥功能，新规的函数就是啥功能。

#include <stdio.h> #include <stdlib.h>  #include <time.h>  #include <ctype.h>  #include <string.h>  //This is a program that will help elementary school pupils practice math.   int main() { 	char fid[10],ID[10],symbol[10],convert[3],answer[10][3]; 	int j=0,i,op,n,a[10],b[10],result[10],score=0,grade,timeduation; 	FILE *data; 	time_t tstart, tend; 	 	do{ 	 printf("Please input your four digit ID number such as AB1234: "); 	 scanf("%s",ID); 	 if(!(ID[6]=='\0'&&isalpha(ID[0])&&isalpha(ID[1])&&isdigit(ID[2])&&isdigit(ID[3])&&isdigit(ID[4])&&isdigit(ID[5])))  	 printf("Sorry, invalid ID. "); }while(!(ID[6]=='\0'&&isalpha(ID[0])&&isalpha(ID[1])&&isdigit(ID[2])&&isdigit(ID[3])&&isdigit(ID[4])&&isdigit(ID[5])));//To check the ID invalidation  	choose: 	printf("\nPlease type in the number to continue.\n(1) Start a test\n(2) Check scores\n(3) Exit\n");  	scanf("%d",&op);  switch(op)//let user to choose what function they want { 	case 1: 		 getchar(); 	 printf("\n");  		 srand((unsigned)time(NULL)); 	 time(&tstart); 	 for(i=0;i<10;i++)//to start the test 	 { 				 n=rand()%4; 	 	 do{ 	 	 	a[i]=rand()%100; 	 	 	b[i]=rand()%100; 	 	 	switch(n){ 				 	case 0:symbol[i] = '+'; 						 result[i] = a[i] + b[i]; 						 break; 					 case 1:symbol[i] = '-'; 						 result[i] = a[i] - b[i]; 						 break; 				 	case 2:symbol[i] = '*'; 						 result[i] = a[i] * b[i]; 				 		 break; 				 	case 3:symbol[i] = '/'; 						 result[i] = a[i] / b[i]; 	 	 	} 				 }while(result[i] > 99 || result[i] < 0 || n==3 && a[i] % b[i] != 0); 				 printf("%2d %c %2d = ", a[i], symbol[i], b[i]); 			 	 itoa(result[i], convert, 10); 				 gets(answer[i]);//gather the user's answers 				 if (!strcmp(convert, answer[i])) { 				 score += 10; } 	 } 			 time(&tend);//time ends 			 printf("\nYou have got %d score(s) in %ld seconds!\n",score,tend-tstart);  		 printf("Prob. | Correct Answ. | Ur Answ\n"); //print the test information 		 for(i=0;i<10;i++) 		 { 		 	printf("(%2d) %2d %c %2d = %3d %s\n",i+1,a[i],symbol[i],b[i],result[i],answer[i]); 		 }  		 data = fopen("record.txt", "a+");  		 fprintf(data,"%s %3d %3ld\n",ID,score,tend-tstart);  		 fclose(data); 		 goto choose; 		 break;  	 case 2: data=fopen("record.txt","r"); if(data==NULL) { 	printf("You have never done the test before."); 	goto choose; } fscanf(data,"%s %d %d",fid,&grade,&timeduation);//scan the user's information printf("Your previous records are:\n"); while(!feof(data)) { 	 if(strncmp(ID,fid,6)==0)//check the user's name { 	 printf("%s %d %d \n\n",fid,grade,timeduation); 	 j=1; } fscanf(data,"%s %d %d",fid,&grade,&timeduation); }  if(j==0)  { 			 printf("Sorry, there is no previous record.\n"); } fclose(data); 			 goto choose;  	 	 break; 	 	case 3: 		 printf("It's about to quit! \n");  			 break; //quit 	default: 		 printf("Wrong Number! "); 	 goto choose; } return 0; }

建议直接贴代码而不是贴图片～

引用 1 楼 5250的回复:就是新规一个函数，在goto语句的地方调用函数而已  比如： goto test; test:    pass:  改为 int test(){     pass }  test(); 那改后的choose函数包含下面的switch 语句嘛


Question: c#数据库连接问题

SQL语句错了 ，是中文的

问题已解决，十分感谢，我又发了另一个问题，如有时间恳请解答一下


Question: 修改了多日，终于用C语言的栈写出了四则混合运算(带括号，小数点，正负数功能)。

引用 2 楼 白浅星 的回复：优秀如你，加油发错了图片，这个图片的是错的

优秀如你，加油

真是太厉害了👍


Question: 请问各位大神，C语言入夏日怎么求

请问，这个是哪个省的高考题目？

如果这是真实的高考题目，那么程序设计的水平太低了。感觉这是一个非常不好的程序设计风格，使用 continue 语句完全没有必要，这是一个纯为考试而出的题目。

int fun(int a[], int n)   //a存放某月的每天气温值，n存放的此月天数  {	int i, c=0; 	for ( i=0; i<n; i++ ) { 		if ( a[i]>=22 )  			// (1) 		{	c++; 			if (c>=5)  return i-5;	//(2) 			else continue;			//(3) 		} 		c=0;	//(4) 	} 	return -1; } 看看这个如何。

for(i=0;i<n;i++){ 　if(a[i]>=22){ 　　c++; 　　if(c>=5){ 　　　return i-5; 　　} 　} 　else｛ c=0;｝ } return -1; 括号位置错了吧，这样才能运行，那个括号else对应if(c>=5)这样是没法做的，或者 for(i=0;i<n;i++){ 　if(a[i]>=22){ 　　c++; 　　if(c>=5) 　　　return i-5; 　　else　continue;     } c=0; } return -1; 这种是跟题目相近的，但是由于我不知道你return -1上面的｝是你自己画的还是本来就有，本来就有的话答案就是第二种，如果没有那就是题目错了

图片还是横着的，没法看

看起来费劲，还是不看了


Question: 求用c#设计 帮帮孩子做道题

循环,公式和递归


Question: 求用c#设计

建议转到C#专区，c#和C还是有很大区别的，先搞清楚方向～


Question: 二维数组删除指定元素

引用 12 楼 自信男孩的回复:删除其实就可以理解为覆盖，即将后面的元素直接以此覆盖前面的元素，这样可以打到删除的目的。注意要修改数组长度，不然，最后的元素还是上次元素的值。 还有其他的做法？

引用 13 楼 其实一开始我是拒绝的 的回复:[quote=引用 12 楼 自信男孩的回复:]删除其实就可以理解为覆盖，即将后面的元素直接以此覆盖前面的元素，这样可以打到删除的目的。注意要修改数组长度，不然，最后的元素还是上次元素的值。 还有其他的做法？[/quote] 总的来说都一样的，只是先删除再赋值和直接把后面的值赋给前面的区别，你要是想写，这是规定了不能加变量，如果没规定都可以新建一个一维数组得到二维数组所有的值，然后对一维数组操作，最后再依次赋给二维数组

引用 10 楼 user-3的回复:【1】 *a[count++]  改为 (*a)[count++]; //用(*a)取a[0]地址优先 或者改为 a[0][count++]; //直接用a[0]地址 谢谢，我懂了

*a[count++]是把二维数组改成一维数组，二维数组第一个元素地址&a[0][0]==(a[0]+0)==(*a+0)，即a[0][0]==(*a)[0]，第二个元素地址&a[0][1]==(a[0]+1)==(*a+1)即a[0][1]==(*a)[1]，第三个元素a[0][2]==(a[0]+2)==(*a+2)即a[0][2]==(*a)[2]，等等，可见第n个元素就是(*a)[n] 纠正一下 【1】 *a[count++] 改为 (*a)[count++]

引用 7 楼 user-3的回复:那是二维数组下标和一维数组下标的换算关系。也就是二维数组下标转成一维数组下标。 比如二维数组第一行第二个元素，i为0，j为1，i*5+j=1，所以转成一维数组就是第二个元素（一维数组下标为1对应的元素） 再比如第三行第四个元素，i为2，j为3，i*5+j=13，所以转成一维数组就是第十四个元素（一维数组下标为13对应的元素），你可以自己数数，二维数组第二行结束就有10个元素，再加上第三行的第四个元素，是不是就是第14个元素？ 所以 ，一维数组的下标=二维数组的行下标*每行的元素个数+二维数组的列下标 因为有删除，所以最终数组只有count个元素，所以换算成一维数组下标后不能超过count，超过count以后的元素属于被删除的垃圾元素（删除挪位后，count以后的元素属于多余的，不应该打印，所以用了个if判断） 那*a【count++】这不是将a【i】【j】赋给它，也就是有count行，这个*a【count++】是每一行第一个元素？

引用 5 楼 其实一开始我是拒绝的的回复:[quote=引用 4 楼 其实一开始我是拒绝的的回复:][quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复：][quote=引用 1 楼 user-3的回复:]【1】 *a[count++] = a[i][j];   【2】 for(j=0; j<5; j++)     if (i*5+j < count)         printf(“%3d”, a[i][j]); 题目还说每输出5个换行，这怎么搞？[/quote]题目给出的代码里不是自带换行了吗 for i 循环下不是有个 printf(“\n”); 吗，意思就是for i 循环5行，每行都打印一个换行 [/quote] 为什么二维数组可以用一维的表示？[/quote] *a【count++】这一步是这么搞的[/quote] i*5+j能不能解释一下？

引用 4 楼 其实一开始我是拒绝的的回复:[quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复：][quote=引用 1 楼 user-3的回复:]【1】 *a[count++] = a[i][j];   【2】 for(j=0; j<5; j++)     if (i*5+j < count)         printf(“%3d”, a[i][j]); 题目还说每输出5个换行，这怎么搞？[/quote]题目给出的代码里不是自带换行了吗 for i 循环下不是有个 printf(“\n”); 吗，意思就是for i 循环5行，每行都打印一个换行 [/quote] 为什么二维数组可以用一维的表示？[/quote] *a【count++】这一步是这么搞的

引用 3 楼 user-3的回复:[quote=引用 2 楼 其实一开始我是拒绝的 的回复：][quote=引用 1 楼 user-3的回复:]【1】 *a[count++] = a[i][j];   【2】 for(j=0; j<5; j++)     if (i*5+j < count)         printf(“%3d”, a[i][j]); 题目还说每输出5个换行，这怎么搞？[/quote]题目给出的代码里不是自带换行了吗 for i 循环下不是有个 printf(“\n”); 吗，意思就是for i 循环5行，每行都打印一个换行 [/quote] 为什么二维数组可以用一维的表示？

引用 2 楼 其实一开始我是拒绝的 的回复：[quote=引用 1 楼 user-3的回复:]【1】 *a[count++] = a[i][j];   【2】 for(j=0; j<5; j++)     if (i*5+j < count)         printf(“%3d”, a[i][j]); 题目还说每输出5个换行，这怎么搞？[/quote]题目给出的代码里不是自带换行了吗 for i 循环下不是有个 printf(“\n”); 吗，意思就是for i 循环5行，每行都打印一个换行

引用 1 楼 user-3的回复:【1】 *a[count++] = a[i][j];   【2】 for(j=0; j<5; j++)     if (i*5+j < count)         printf(“%3d”, a[i][j]); 题目还说每输出5个换行，这怎么搞？


Question: 求助，各位大神请看下，我的程序哪里错了？

p0输入了个寂寞

对于scanf()函数中各参数的含义，请参考《C++中printf()函数的用法10-1》希望能够帮到你！

scanf("%f,&p0"); 改成 scanf("%f",&p0);


Question: 一道C语言题，求助各位大神！

#include<stdio.h> #include<string.h>  int main() {     char a[100][100];     char b[100];     int m,i,k;      scanf("%d",&m);     getchar();    //for '\n'     i=0;     for(i=0;i<m;i++)     {         gets(a[i]);     }     for(i=0;i<m;i++)     {         //for(k=i;k<m+1;k++)    //越界了         for(k=i;k<m;k++)         {             if(strcmp(a[i],a[k])>0)             {                 strcpy(b,a[i]);                 strcpy(a[i],a[k]);                 strcpy(a[k],b);             }         }     }     for(i=0;i<m;i++)         puts(a[i]);     return 0; } 供参考～

一楼说的是的，getchar();就好了 for(k=1;k<m-i;k++)         {             if(strcmp(a[k-1],a[k])>0)             {                 strcpy(b,a[k-1]);                 strcpy(a[k-1],a[k]);                 strcpy(a[k],b);             }  下面排序有问题，这样改冒泡

scanf吃掉了你下次输入的字符，在scanf后加上char  ch;getchar(ch);   试下


Question: win32 里面怎么可以一边画图一边可以改变创建窗口的大小

新版C++ Builder即RAD Studio还可以写安卓、苹果app。

引用 2 楼 ooolinux 的回复:个人觉得SDK纯API方式编写Windows程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder 6.0几个示例程序项目源代码下载：       C++ Builder第一个程序（模拟聊天室）v1.11 C++ Builder模拟数字双时钟示例（未完成）v0.2.1 C++ Builder纸牌游戏Demo v0.03 C++ Builder不规则图像透明贴图（位图的透明显示）三种方法及简单动画v1.3 C++ Builder写的《ZEC 四则运算练习程序》 海底海星情景v0.9.2 C++ Builder简单电话簿Demo例子v1.11  我现在其实就是在做一个demo，先用windows api实现我的功能，后面画界面的话，我会引用第三方库duilib画

引用 1 楼 user-2 的回复:画图不应该放到线程里面，直接在onpaint就好了，画的内容要保存起来，刷新的时候都是从保存的数据里面读出来画的，任何时候都可以 但是我在WM_PAINT里面画的时候，会一直卡在WM_PAINT里面，因为我WM_PAINT里面会有while循环，会在里面一直画，直到结束才会break出去，以至于我放大窗口，或者我扯动窗口的边角的时候窗口没有响应我的消息


Question: 求大佬指点一下程序题(2)(3)小题和编程题的第五题吗？

2就是倒序输出，所以是 654321  3就是从二维数组找最小，输出最小值和位置 min=-5.77， m=2，n=1  第三行第二列，数组下标行列要减1  5 int main() {     int i, cnt=0;     double x[40], sum=0, avg=0;     for (i=0; i<40; i++) {         scanf(“%lf”, &x[i]); //输入分数         sum += x[i]; //求总和     }     avg = sum/40; //求平均值     for (i=0; i<40; i++) {         if(x[i]<avg) cnt++; //低于平均分则统计人数     }     printf(“低于平均分的人数：%d\n”, cnt); }


Question: 数据结构【C语言】算法设计

贴出代码看看


Question: 【问题描述】文本文件score.txt中保存有一组学生的成绩（为整数）

谢谢各位大佬

成绩个数未知；所以for循环里i<4不符合题意

#include <stdio.h> #include<stdlib.h>  int main() {     FILE *fp,*fg;     int a[4];     int i,s=0;     int m,n;     float c;     if((fp=fopen("c:\\score.txt","r"))==NULL)     {         printf("File open error!\n");         exit(0);     }     for(i=0;i<4;i++)     {         fscanf(fp,"%d",&a[i]);         s+=a[i];     }     c=s/4.0;     m=a[0];n=a[0];     //for(i=0;i<4;i++)     for(i=1;i<4;i++)     {         if(m<a[i])             m=a[i];         if(n>a[i])             n=a[i];     }     if((fg=fopen("c:\\result.txt","w"))==NULL)     {         printf("File open error!\n");         exit(0);     }     fprintf(fg,"%.2f %d %d\n",c,m,n);     printf("%.2f %d %d\n",c,m,n);     fclose(fp);     fclose(fg);     return 0; } 供参考～ 代码没发现什么问题

应该会输出三个值


Question: 一道C语言函数的题目

void Shift( char s[] ) {int i,j,x;char c;  x=strlen(s);  for(i=0;i<3;i++)     {c=s[0];     for(j=1;j<x;j++)         s[j-1]=s[j];     s[x]=c; //这里要改成s[x-1]=c;因为s[x]存的是字符串结束符     }  }

void Shift( char s[] ) {     int i,n=strlen(s);     char a[3];     a[0]=s[0];     a[1]=s[1];     a[2]=s[2];     for(i=3;i<n;i++) s[i-3]=s[i];     s[n-3]=a[0];     s[n-2]=a[1];     s[n-1]=a[2]; } 直接暴力

仔细想一想s[x]是哪个位置，想清楚了就知道为什么错了


Question: 定义若干个函数（是自定义函数哦），使用二维数组作为传入参数。计算二维数组中两条对角线元素的和与乘积。在主函数中输入4×4的二维数组，调用已定义的函数，把该矩阵传

供参考  #include <stdio.h>  void Array1(int arr[][4], int *a, int *b) {     int i, j;     for (i=0; i<4; i++)     {         for (j=0; j<4; j++)         {             if (i==j)             {                 *a += arr[i][j];                 *b *= arr[i][j];             }         }     } }  void Array2(int arr[][4], int *a, int *b) {     int i, j;     for (i=0; i<4; i++)     {         for (j=0; j<4; j++)         {             if (j == (3-i))             {                 *a += arr[i][j];                 *b *= arr[i][j];             }         }     } }  int main() {     int arr[4][4] = {0};     int i, j, sum1 = 0, prod1 = 1, sum2 = 0, prod2 = 1;      for (i=0; i<4; i++)     {         for (j=0;j<4;j++)             scanf("%d", &arr[i][j]);     }      Array1(arr, &sum1, &prod1);     Array2(arr, &sum2, &prod2);      printf("sum1 = %d, prod1 = %d\n", sum1, prod1);     printf("sum2 = %d, prod2 = %d\n", sum2, prod2);      return 0; }


Question: 怎么用fscaf函数提取文档中不同类型的数据 ？

%d 整型 %s 字符串 %c 字符 %f 浮点数

fscanf是读取格式化的数据，根据数据的格式来读取。比如整形用%d/%u

打的急了，少了个n，不好意思各位


Question: c语言  链表初级排序问题

那有可能就是排序错了

#include<stdio.h> #include<string.h> #include<stdlib.h>  #define LEN sizeof(struct stu)  struct stu          //存储单元 {     int stunum;     float score;     struct stu *next; };  int n=0;    //输入的数据数目  struct stu *creat();     //创建链表,要求输入的学号不按顺序，但是链表要按学号顺序排列。   返回head地址 void print(struct stu *);  //打印链表 void sortll(struct stu *,struct stu *,int );   //插入数据，输入 首地址，需要插入的数据，已经总的数据数量。  void insert_sort(struct stu **head, struct stu *pnew); void print_link(struct stu *head);  int main() {     struct stu *p;     p = creat();     //print(p);     print_link(p);     system("pause");     return 0; }  struct stu *creat() //创建链表 {     struct stu *head = NULL;    //首地址     struct stu *p0;      //p0为每次输入的数据地址     p0 = (struct stu *)malloc(LEN);     p0 ->next = NULL;     scanf("%d %f",&p0 ->stunum,&p0 ->score);     while(p0 ->stunum != 0)     //以学号为0作为输入结束的标志     {         n++;    //输入的数据个数         if(n == 1)    //如果是第一次输入数据         {             head = p0;             p0 = (struct stu *)malloc(LEN);             p0 ->next = NULL;         }         else             //如果不是第一次输入数据,则需要进行排序         {             //sortll(head,p0,n);      //传入 首地址，需要插入的数据，以及已经输入的数据数量n(包括需要排序的数据)             insert_sort(&head, p0);             p0 = (struct stu *)malloc(LEN);             p0 ->next = NULL;         }         scanf("%d %f",&p0 ->stunum,&p0 ->score);  //输入新的数据     }     free(p0);    //最后一个节点输入的都是0,那么是不会加入链表的，所以这儿释放掉     return head;        // 返回值为链表首地址 }    void print(struct stu *head)     //打印链表 {     struct stu *p1;     printf("有%d组数据 ：\n",n);     p1 = head;     printf("学号为%d的同学,成绩是%.1f\n",p1 ->stunum,p1 ->score);     while(--n)     {         p1 = p1 ->next;         printf("学号为%d的同学,成绩是%.1f\n",p1 ->stunum,p1 ->score);     } }   void insert_sort(struct stu **head, struct stu *pnew) {     struct stu *pcur = *head;      while (pcur) {         if (pcur->stunum > pnew->stunum)             break;         if (pcur->next == NULL)             break;         pcur = pcur->next;     }     if (pcur == *head) {         pnew->next = *head;         *head = pnew;     } else {         pnew->next = pcur->next;         pcur->next = pnew;     } }  void print_link(struct stu *head) {     struct stu *pcur = head;      while (pcur) {         printf("学号为%d的同学,成绩是%.1f\n",pcur ->stunum, pcur ->score);         pcur = pcur->next;     } }  void sortll(struct stu *head,struct stu *p0,int n) {     struct stu *p1 = head,*p2;     int num = n-2;     if(head ->stunum > p0 ->stunum)            //输入数据排第一的情况     {         head = p0;         head ->next = p1;         return ;     }     else if(n == 2)           //只有两个数据 然后输入数据排第二     {         head ->next = p0;         p0 ->next = NULL;         return ;     }     else                 //有多个数据  输入数据不排第一     {         p2 = head ->next;             //p2 :从第二个数据开始    p1一直是p2的前一数据         while(--num)     //与中间的数据比较（除首尾） 比较了 n-3次         {             if(p2 ->stunum > p0 ->stunum)             {                 p1 ->next = p0;                 p0 ->next = p2;                 return ;             }             else             {                 p1 = p2;                 p2 = p1 ->next;             }         }         if(p2 ->stunum > p0 ->stunum)   //在这里，p2已经是需要比较的最后一个数据         {             p1 ->next = p0;             p0 ->next = p2;             p2 ->next = NULL;         }         else         {             p2 ->next = p0;             p0 ->next = NULL;             return ;         }     } } 供参考～  排序没必要那么麻烦，插入排序，可以参考一下～


Question: 求助大大，手动计算和程序计算结果不同，程序那里有问题？

浮点数又误差，计算时要考虑误差的叠加

引用 1 楼 user-3 的回复:晕 那你就把中间计算结果都打印出来，然后看看是哪一步计算和你手算不一样的，再去检查相关的逻辑处理是否有问题  就是比如这个值算出来应该是15.24 但是程序给出的就是15.255

计算精度问题。 楼主笔算的时候 FR1 = 0.381 程序运行时， FR[0] = 0.3813811788774169 从而看出，程序的精度更高，计算结果比手算的更精确一些。 结果是 15.255247155096674


Question: 新人小白瑟瑟发抖，希望大佬求解

楼上是c++,翻译成c语言的  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h>  int mArray(int myArr[][4]) { 	int i = 0, j = 0, min = 0, sum = 0; 	for (i = 0; i < 4; i++) 	{ 		min = myArr[0][i]; 		for (j = 0; j < 3; j++) 		{ 			if (min > myArr[j][i]) 			{ 				min = myArr[j][i]; 			} 		} 		sum += min; 	} 	return sum; }  int main(void) { 	int arr[3][4] = { 0 }; 	int i = 0, j = 0, sum = 0;  	printf("输入数组元素：\n"); 	for (i = 0; i < 3; i ++) 	{ 		for (j = 0; j < 4; j++) 		{ 			scanf("%d", &arr[i][j]); 		} 	}  	sum = mArray(arr); 	printf("%d\n", sum);  	getchar();     return 0; }

解决代码:只是用了一个双层循环输入，一个双层循环比较和累加,具体如下  #include <iostream> using namespace std; int sum(int (*ar)[4]) { 	int all = 0; 	int var; 	int i, j; 	for (i = 0; i < 4; ++i) { 		var = ar[0][i]; 		for (j = 1; j < 3; ++j) 		{ 			if (var > ar[j][i]) 				var = ar[j][i]; 		} 		all += var; 	} 	return all; } int main() { 	int i, j; 	int ar[3][4]; 	for (i = 0; i < 3; ++i) 		for (j = 0; j < 4; ++j) 			cin >> ar[i][j]; 	cout << sum(ar); 	return 0; }

楼上就是对的， int mArray(int myArr[][4]) {     int i = 0, j = 0, min = 0, sum = 0;     for (i = 0; i < 4; i++)     {         min = myArr[0][i];         for (j = 0; j < 3; j++)         {             if (min > myArr[j][i])             {                 min = myArr[j][i];             }         }         sum += min;     }     return sum; }这一段就是你题目要求的 变量名可以自己定


Question: 在64位windows系统上   c/c++ 函数是不是把形数对齐到64位?

最终结果 win64位系统形参就是64位对齐 (系统api),跟什么编译器  声明完全没关系,微软就是这样设定的

这里其实就是字节对齐的事，如果你按照1字节对齐，那么肯定就是齐刷刷的内存排列，如果不设置字节对齐，则默认按照你系统位数进行对齐排列，数据类型只有指针和long会根据系统位数变化，其余的都不变

func Syscall18(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18 uintptr) (r1, r2 uintptr, err Errno) 这个是go语言调用win64  系统api 的原型,第一个参数是dll中的函数指针,第二个参数是 dll中函数需要的参数个数,   后面就是具体的18个参数,   所有的参数 都是 uintptr   64位的数据. 所有的返回值都是 3个uintptr. 所以才会有win64 应该强制把不足64位的形参和返回值都对齐到64位的猜想

还得看程序是多少位的。对齐字节是可以设定的。 #pragma pack(4)就是4字节对齐。  至于某种数据类型占多少个字节，需要编译器确定。也可以显式的在类型名称里面展现处理。 8位系统，可以是64位对齐，64位系统也可以8位对齐。

引用 9 楼 qybao 的回复:你想知道是不是字节对齐，打印一下参数的地址确认一下就好了 void func(int64 a, char b) {     char c;     printf(“%p, %p, %p\n”, &a, &b, &c); } 然后算一下每个地址之间相差多少字节 目前计算的结果都是差8个字节  不管是char int16 int32 所以感觉形参不够8个字节的 都是对齐到8个字节

很多api都是宏定义，你调试的时候跟进去看看，64位编译的肯定要转换的

引用 楼主 qq_29817615 的回复:c和c++ 函数原型 形参是  int32  int64    int32,  但是我在其他语言底层看见的调用是  int64 int64 int64    ,好像所有整数型 都是int64  不管c++里面是int8 还是int 32 还是int64. win64位系统是不是把不到64位的形参 默认对齐到64位? 红字是你的原话吧？那么请问，"什么叫底层调用是int64，“

引用 6 楼 真相重于对错 的回复:你理解错误了, int 在大部分64位下都是32位长度 只有long long 才能保证64位长度 至于你看到 b+8 ,那个只是为了数据对齐原因 直接在代码里 sizeof(b)  sizeof(a) 就能看到 它们的真实长度 看标题 我问阿就是对齐 不是编译器中的长度

void func(int64 a,char b);   b的指针+8  就是a的值,  并且我看go语言底层调用系统api全部参数都是64位,  我自己用64位参数调用socket  发送了几亿次数据包  没有一次出错

引用 2 楼 qq_29817615的回复:测试了不管声明的int8 还是int32  都是64位,就不知道准确不 怎么测试的？

测试了不管声明的int8 还是int32  都是64位,就不知道准确不

不是这样的吧 其它语言int64就是64位，c/c++的int8，int32不是64位的，应该会调用出错的，或者其他语言调用的时候用的是指针调用的吧？


Question: 这程序的错误怎么改？

引用 4 楼 weixin_46673152 的回复:现在好了，请问一下最后的if后面还有一个else，只要不满足条件则使Q2等于Q，重新计算，应该怎么设置循环啊 循环只是用Q2代替Q重算一遍，不需要重新输入的吧？那就 scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p,&hf,&l,&d,&v,&a,&b,&Q); while(1) { //在上面那条语句的后面加上while循环  然后在最后一个if if (H<b) {     printf("成功");     break; //在这里加break退出循环 } else { //这里加个else     Q = Q2; //把Q2赋给Q，因为上面用while循环，所以这里会重新回到while的地方再计算的     //如果不管怎么计算都会进入这个else就会死循环，你要考虑用个计数器记录循环次数，超过次数则退出循环 } } //这个是和while的{ 对应

引用 2 楼 自信男孩 的回复：#include <stdio.h> #include<math.h> #define PAI 3.1415926535 #define g 9.8  //void main() int main() {     double p,hf,l,d,v,a,b,Q,Re,e,y,Q1,Q2,y1,y2,R1,R2,e1,e2,H;//s为圆周率     printf("请依次输入密度p、沿程阻力损失hf、管程长度l、直径d、运动黏度v、粗糙度a、精度b、流量Q\n");     //scanf("%f%f%f%f%f%f%f%f",&p,&hf,&l,&d,&v,&a,&b,&Q);     scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p,&hf,&l,&d,&v,&a,&b,&Q);     //Re=(4*Q)/(s*v*d);    //s未初始化     Re=(4*Q)/(PAI*v*d);    //s未初始化     e=(2*a)/d;     if(Re<=2000)     { y=64/Re; }     else if(2000<Re<(59.7/(pow(e,8/7))))     { y=(0.3164/(pow(Re,0.25)));     }     else if((59.7/pow(e,8/7))<Re<((665-765*log10(e))/e))     { y=1/pow((-1.8)*log10((6.8/Re)+pow((a/d)/3.7,1.11)),2);     }     else if(R1>(665-765*log10(e))/e)     { y=1/pow(2*log10((3.7*d)/a),2);     }     //Q1=pow((g*pow(PAI,2.0)*pow(d,2.0)*hf)/(8.0*y*l.0),0.5);     Q1=pow((g*pow(PAI,2.0)*pow(d,2.0)*hf)/(8.0*y*l),0.5);     //Re1=(4*Q1)/(PAI*v*d);     R1 = (4*Q1)/(PAI*v*d);     e1 = (2*a)/d;     //if (Re1<=2000)     if (R1<=2000)     {         //y1=64/Re1;         y1=64/R1;     }     //else if(2000<Re1<(59.7/(pow(e1,8/7))))     else if(2000<R1 && R1 < (59.7/(pow(e1,8/7))))     {         //y1=(0.3164/(pow(Re1,0.25)));         y1=(0.3164/(pow(R1,0.25)));     }     //else if((59.7/pow(e1,8/7))<Re1<((665-765*log10(e1))/e1))     else if((59.7/pow(e1, 8/7)) < R1 && R1<((665-765*log10(e1))/e1))     {         //y=1/pow((-1.8)*log10((6.8/Re1)+pow((a/d)/3.7,1.11)),2);         y=1/pow((-1.8)*log10((6.8/R1)+pow((a/d)/3.7,1.11)),2);     }     //else if(Re1>(665-765*log10(e1))/e1)     else if(R1>(665-765*log10(e1))/e1)     { y1=1/pow(2*log10((3.7*d)/a),2);     }     //Q2=pow((g*pow(PAI,2.0)*pow(d,2.0)*hf)/(8.0*y1*l.0),0.5);     Q2=pow((g*pow(PAI,2.0)*pow(d,2.0)*hf)/(8.0*y1*l),0.5);     H=(Q1-Q2)/Q1;     if (H<b)     {         printf("成功");     } } 供参考～  一下子定义这么多变量，你还能知道那个是那个吗？如何设置循环

引用 1 楼 qybao 的回复：s没定义，Re1没定义 double p,hf,l,d,v,a,b,Q,Re,e,y,Q1,Q2,y1,y2,R1,R2,e1,e2,H, s=PAI, Re1; 然后查看你的括号是不是都匹配上了，错误提示你少了一个），肯定是在哪里括号没匹配上现在好了，请问一下最后的if后面还有一个else，只要不满足条件则使Q2等于Q，重新计算，应该怎么设置循环啊

现在好了，请问一下，最后那个if后面，还需要一个else，只要不满足，则用Q2代替Q重新计算，应该怎么做啊


Question: while (1)循环中使用scanf("0x%s", str); scanf一直返回0的问题

scanf返回的是匹配成功的格式控制符的个数 返回0说明str没赋值成功 scanf的双引号里怎么写，你就怎么输入 双引号里是 0x%s 那你就要写 0x字符串 不要缺少前面的0x scanf就是这样逐个匹配，遇到不匹配的就退出，前面的0x也是需要匹配的一部分  你这个的问题就在于0x没有匹配，是由于你输入缓冲区剩下的 \n 字符 \n 字符和 0 不匹配，于是退出 解决办法是，在是scanf后面加一个getchar( )，或者在%s后面加一个%*c 其原理是，%s不接收这个\n，于是用getchar或者%c接收这个\n，而*可以让%c仅接收而不赋值给变量 至于你仅用%s能成功的原因是，%s读取缓冲区的内容时，会先清空前面多余的空白字符（\n和空格等），没有了\n，但是也没有字符可读取了，于是scanf就停下来等待你输入

temp = scanf("0x%s", str);后面要清空缓冲区里的回车。


Question: 关于gcc的几个问题

你可以简单地理解为gcc搜索路径程序代码类似如下实现 if(getOpt(“I”)!=NULL) {//1 查找-I参数     //如果有-I参数，则搜索-I参数的路径 } if(getEnv(“xxx”) !=NULL) {//2 查找环境变量     //如果有设定相应的环境变量，则搜索环境变量指定的路径 } if(getRelativePath(argv[0])!=NULL) {//3 查找gcc安装路径的include相对路径     //如果找到相对路径，则搜索相对路径 } 这样你应该能理解gcc是怎么能找到include路径了吧？

写成 makefile,cmakelist之类的不就完了

同样的，链接库也在gcc安装路径的相对路径的lib里，如gcc安装在C:\\MinGW\bin，lib就是C:\\MinGW\lib，怎么通过相对路径找的，前面一贴有说名

不是不明白你问什么，而是你没理解我回答的内容 gcc会自动搜索include和lib路径，这是在gcc内部实现的，它会以上述说的123的顺序搜索路径。 1和2没有，为什么会搜索3？怎么搜索3，这不是很简单吗？gcc先取到自己安装的路径，比如安装在C:\\MinGW\bin，gcc找到这个路径后用相对路径的方式找include，即C:\\MinGW\include，从C:\\MinGW\bin到C:\\MinGW\include怎么用相对路径查找会吧？C:\\MinGW\bin\.. 就能找到C:\\MinGW（父文件夹），再父文件夹\include，即C:\\MinGW\bin\..\include就能找到include路径了。怎么找到gcc安装路径？一个程序找到自己的路径难吗？main函数有个argv[0]参数，bat的话可以通过%~dp0参数获取。 所以，你只要知道gcc安装在哪，你就知道它默认的搜索路径，那么这些头文件都在这个include路径下，gcc不就能找到了吗？这还有什么不明白的？

引用 6 楼 qybao 的回复: 唉，算了老哥，你一直没明白我在讲什么。我还是找找相关书籍吧

引用 5 楼 六道佩恩 的回复：[quote=引用 4 楼 qybao 的回复:] 你都没仔细看吧？不是告诉你搜索路径的顺序了吗，你不用makefile，就用环境变量好了呀 inlcude环境变量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH link环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时） 定义环境变量不会吗？不会的话自己谷歌百度搜索怎么定义环境变量 https://blog.csdn.net/Flood_Dragon/article/details/12363705  老哥。。。这。。。  我不是在问它的搜索路径有哪些，要看搜索路径我给gcc加个参数输出来不就行了吗？  你说的这些环境变量，包括你的这个链接，关键是，现在并没有这些环境变量，它也一样正常工作的，也依然能找到库的位置，这是我所疑惑的，我是想知道，这个记录该路径的的字符串在哪里？既然环境变量没有，那么它在哪里？我搜索过整个mingw里的文本内容，没有这些路径，所以我在怀疑它是不是写在gcc或ld程序里面的？  第二个，也是最重要的问题，gcc是根据什么找到对应的库的，比如我包含math.h，或调用数学函数，gcc怎么知道需要的库是哪一个？为什么有的库，文件夹里明明就有，它却又找不到，需要我们自己用参数来链接？  [/quote]你还是没仔细看，不在makefile，不在环境变量里，那就是上面说的第三种情况，在gcc的安装路径的相对路径里

引用 4 楼 qybao 的回复:你都没仔细看吧？不是告诉你搜索路径的顺序了吗，你不用makefile，就用环境变量好了呀 inlcude环境变量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH link环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时） 定义环境变量不会吗？不会的话自己谷歌百度搜索怎么定义环境变量 https://blog.csdn.net/Flood_Dragon/article/details/12363705  老哥。。。这。。。  我不是在问它的搜索路径有哪些，要看搜索路径我给gcc加个参数输出来不就行了吗？  你说的这些环境变量，包括你的这个链接，关键是，现在并没有这些环境变量，它也一样正常工作的，也依然能找到库的位置，这是我所疑惑的，我是想知道，这个记录该路径的的字符串在哪里？既然环境变量没有，那么它在哪里？我搜索过整个mingw里的文本内容，没有这些路径，所以我在怀疑它是不是写在gcc或ld程序里面的？  第二个，也是最重要的问题，gcc是根据什么找到对应的库的，比如我包含math.h，或调用数学函数，gcc怎么知道需要的库是哪一个？为什么有的库，文件夹里明明就有，它却又找不到，需要我们自己用参数来链接？

引用 楼主 六道佩恩的回复:1. 关于gcc搜索头文件和静态库的目录，虽然可以在编译时加参数修改，但是能永久修改吗？让以后不必再用参数指定目录那种。 2. gcc是根据什么找到头文件对应的静态库文件的？为什么即便在同一目录下，有的库gcc就能自动链接，有的则需要我们指定？ 使用makefile

引用 3 楼 六道佩恩 的回复:关键是这些路径是写在哪里的？总不可能是写在gcc里面的吧？而且我的环境是mingw，不是linux。  我编译的时候是指定gcc命令行编译，没有使用makefile，所以，对于那些能自动找到目标库的，比如标准库、win32库，它怎么知道哪个对应哪个？ 你都没仔细看吧？不是告诉你搜索路径的顺序了吗，你不用makefile，就用环境变量好了呀 inlcude环境变量C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH link环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时） 定义环境变量不会吗？不会的话自己谷歌百度搜索怎么定义环境变量 https://blog.csdn.net/Flood_Dragon/article/details/12363705

引用 1 楼 qybao 的回复:头文件搜索 头文件搜索顺序： 1.由参数-I指定的路径(指定路径有多个路径时，按指定路径的顺序搜索) 2.然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH 3.再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include  如果你没指定1，那就从2开始找，如果2也没指定，就从3开始找，其中/usr/include是相对于gcc的，因为一般gcc安装在/usr/bin/gcc，所以/usr/include就是默认搜索路径  链接库搜索路径 1.编译目标代码时指定的动态库搜索路径； 2.环境变量LIBRARY_PATH（编译时），LD_LIBRARY_PATH（运行时）指定的动态库搜索路径； 3.配置文件/etc/ld.so.conf中指定的动态库搜索路径； 4.默认的动态库搜索路径/lib； 5.默认的动态库搜索路径/usr/lib。 关键是这些路径是写在哪里的？总不可能是写在gcc里面的吧？而且我的环境是mingw，不是linux。  我编译的时候是指定gcc命令行编译，没有使用makefile，所以，对于那些能自动找到目标库的，比如标准库、win32库，它怎么知道哪个对应哪个？


Question: 请教各位，一行汇编代码是啥意思？

应该大致是代表了模块名，对象名，类名，函数名，函数参数等

Tianxia  equ  ?Tianxia@@YAPEAVObject@@PEAUCORINFO_CLASS_STRUCT_@@@Z

前者就是后者的别名

equ 应该是宏汇编的 只是定义一个符号，来代表内存中某个数据  真正的汇编下没有这个指令

dll 导出类符号


Question: C语言指针名就是指针指向的变量的地址这句话对么？

int a; 	int *pa = &a; 	printf("请输入一个数\n"); 	scanf("%d", pa); 	printf("指针名的地址：%p\n", pa); 	printf("指针名的值  ：%lx\n", *pa); 	printf("指针的地址：%p\n", pa); 	printf("指针的值  ：%d\n", *pa); 	printf("变量的地址：%p\n", &a); 	printf("变量的值  ：%d", a); 	return 0;

引用 1 楼 真相重于对错 的回复:&是取地址。*是取地址里的值。 pa 是 指针，所以&pa 就是二级指针，而不是 pa 。取值符和取址符我都明白，但是我把&pa改为pa输出的结果还是一样的。我就对这个有点迷惑到了。

#include<stdio.h> int main() {     int a;     int *pa=&a;     printf("请输入一个数\n");     scanf("%d",pa);      printf("指针名的地址：%p\n",&pa);     printf("指针名的值  ：%lx\n",pa);     printf("指针的地址：%p\n",&pa);     printf("指针的值  ：%d\n",pa);     printf("指针指向变量的值  ：%d\n",*pa);     printf("变量的地址：%p\n",&a);     printf("变量的值  ：%d",a);     return 0; }


Question: 【求助】C语言用函数实现求一维数组的最大值，要求在主程序调用

引用 5 楼 自信男孩的回复:int calculate(int x[], int len) {     int max = a[0];     for(int i=1;i<len;i++)     {         if(max < a[i])         {             max = a[i];         }     }     return max; } 供参考～ #include<stdio.h> int calculate(int x[],int len) {     int max = x[0];     for(int n=1;n<len;n++)     {         if(max < x[n])         {             max = x[n];         }     }     return max; } int main() {     float a[5],max; int i;     printf("请输入5个数:\n");     scanf("%d",&i);     max=calculate(a,i);     printf("%f",max);     return 0; }

能帮忙看看下面这个问题吗，我按你说的写了，就是输出结果不准确

引用 2 楼 WhiteCCai 的回复:只求最大值一个for循环就够了  int calculate(int x[5]) {     int max = 0;     for(int i=0;i<5;i++)     {         if(max < a[i])         {             max = a[i];         }     }     return max; }  这个代码有bug，是否考虑到了当该一维数组里的元素都是负数时，最大值岂不是0了？还符合程序要求吗？

引用 1 楼 user-3 的回复:int calc_max_val(int *_array , int _array_len) { 	int max = 0; 	if (_array == NULL || _array_len == 0) 		return 0; 	for (int i = 0 ; i < _array_len; i++) 	{ 		if (max <= _array[i]) 			max = _array[i]; 	}  	return max; }  int main(void) { //	int array[] = {1,2,0,5,6,77,88,99,-1}; 	int array[] = { -1,-2,0,-5,-6,-77,-88,-99,5894848 }; 	int max = calc_max_val(array,sizeof(array)/sizeof(array[0])); 	printf("array's max value %d\r\n", max); 	system("pause"); 	return 0; }  这个代码有bug，是否考虑到了当该一维数组里的元素都是负数时，最大值岂不是0了？还符合程序要求吗？

引用 3 楼 自信男孩 的回复:[quote=引用 1 楼 user-3 的回复:] int calc_max_val(int *_array , int _array_len) { 	int max = 0; 	if (_array == NULL || _array_len == 0) 		return 0; 	for (int i = 0 ; i < _array_len; i++) 	{ 		if (max <= _array[i]) 			max = _array[i]; 	}  	return max; }  int main(void) { //	int array[] = {1,2,0,5,6,77,88,99,-1}; 	int array[] = { -1,-2,0,-5,-6,-77,-88,-99,5894848 }; 	int max = calc_max_val(array,sizeof(array)/sizeof(array[0])); 	printf("array's max value %d\r\n", max); 	system("pause"); 	return 0; }  这个代码有bug，是否考虑到了当该一维数组里的元素都是负数时，最大值岂不是0了？还符合程序要求吗？[/quote]  是的，有bug，进来max的值取数组其中一个元素的值就好了


Question: 哪位大神能帮小弟看一下这个代码，就是求最小值。

引用 2 楼 xws245925587的回复:#include <stdio.h> int main(){     int i,n,a[10000],min;     scanf("%d",&n);     min = 0;     for(i=0;i<n;i++)     {   scanf("%d",&a[i]);      if(min>a[i])         min=a[i];   }     printf("%d\n",min);         //=========》重点在这     return 0; } 谢谢你的答案。

引用 3 楼 chxchxkkk的回复:printf("%d\n",a[i]);  ==>>printf("%d\n",min); 谢谢你的答案。

引用 1 楼 user-3的回复:int main() {     int i,n,a[10000],min;     scanf("%d",&n);     for(i=0;i<n;i++) scanf("%d",&a[i]);     min=a[0];     for(i=0;i<n;i++)     {         if(min>a[i]) min=a[i];     }     printf("%d\n",min);     return 0; }  你这个错误犯的。。。。 太谢谢了，这个醋我找了好长时间。


Question: 顺序栈的清空问题

清空栈，不同于销毁栈，清空意味着以后可能还要往里放数据

需要释放，如果程序清空栈后，直接退出了。那么系统会考虑释放你申请的动态空间～

所谓顺序表是指分配一整块内存，像数组那样平均分成若干个小的元素，它们将被用于存储数据 在使用期间，顺序表不存在释放一说，它所分配的内存是固定存在的 你只是根据一个下标标志位来确定当前前几个元素空间被使用 后面下标没标到的地方都只能闲置 顺序表的特点就是元素的规格是一致的，所以从内存排列来说是有序的， 所以你可以直接使用下标定位到某一个元素的内存 这样就便于你查找和修改某一个元素的内容 但是顺序表的缺点就在于，你哪些未使用的内存必然造成浪费 而且每次想要插入和删除也会非常麻烦，需要做元素的位移

书上只是示例作用，而且不同的场景，需要不同的考虑

引用 1 楼 user-4 的回复:肯定是要free的，这里只是把栈清空了，没有回收内存，会导致内存泄漏  数据结构的书上就是这样写的

肯定是要free的，这里只是把栈清空了，没有回收内存，会导致内存泄漏


Question: 【小白求解】单双精度浮点数的范围表示

引用 2 楼 六道佩恩的回复:e-38表示 10的-38次方 这是个小数 负数需要前面的3.4为负 谢谢大佬，我明白了。

e-38表示 10的-38次方 这是个小数 负数需要前面的3.4为负

百度浮点数再计算机里如何表示


Question: c语言编程，文件相关的，程序编译后如修改程序，会显示无法保存文件，怎么办？

应该是编译还没结束，这个文件正在读取，不能被修改（猜的）

重启一下就可以


Question: 求助！求助！

谢谢，问题解决了。

#include <stdio.h> #include<math.h> int  main() {     float  x;     char g;     scanf_s("%f", &x);     int y = x / 10;     switch (y)     {         case 0:         case 1:         case 2:         case 3:         case 4:         case 5:             g = 'E';             break;          case 6:             g = 'D';             break;          case 7:             g = 'C';             break;          case 8:             g = 'B';             break;          case 9:         case 10:             g = 'A';             break;          default:             printf("Not support!\n");             break;         /*         case'0':         case'1':         case'2':         case'3':         case'4':         case'5':g = 'E'; break;         case'6':g = 'D'; break;         case'7':g = 'C'; break;         case'8':g = 'B';  break;         case'9':         case'10':g = 'A';         */     }     printf("%c %d", g,y);     return 0; } 供参考～  楼主应该是是分不清楚'1'和1的区别。 x /10，当x是100以内的数据，x/10得到的是0~10之间的数据。而'1'是字符，对应的10进制是48

case  '10' 存在语法错误。单引号里面是一个字符，‘10’是2个字符。


Question: 求助，如何获取进程在内存中的起始地址

这个进程本身的执行代码还是系统加载这个进程的地址?


Question: C语言小白，请教大佬们

引用 1 楼 user-2的回复:int n重定义，i未初始化，在用i的for里用i当作临时变量，sushu的逻辑也有问题 下面是改好的 #include <stdio.h>  int sushu(int a) {     int b;     for (b = 2; b < a; b++)     {         if (a % b == 0)             return 0;     }     return a; } int main() {     int sum = 0, n, i, tmp;     printf("请输入一个数");     scanf_s("%d", &n);     for (i = 3; i <= n; i++)     {         tmp = sushu(i);         sum += tmp * tmp;     }     printf("3~%d素数的平方和为%d\n", n, sum); } 感谢大佬呀！

引用 2 楼 自信男孩的回复:#include <stdio.h>  int sushu(int a) {     int b;     for(b=2;b<a;b++)     {         if(a%b==0)             return 0;     }      return 1; } int main () {     int n,i,sum=0;     int ret;     //int n = i;     printf("请输入一个数");     scanf("%d",&n);     for(i=3;i<=n;i++)     {         //i = sushu(n);         ret = sushu(i);         if (ret)             sum+=i*i;     }     printf("3~%d素数的平方和为%d",n,sum); } 供参考～ 感谢大佬呀！


Question: 字符串拷贝/空间申请一个小问题

引用 1 楼 user-1 的回复:retS没有初始化，retS那一行换成 char* retS = (char*)calloc(len + 1, sizeof(char)); 另外你这个程序弄不到第一个单词 ...我竟然没注意开头没初始化


Question: 【小白求解】

引用 1 楼 真相重于对错 的回复:我用小米，发现路上还有人用小米，奇怪吗？一点都不奇怪 不明白群主为啥会问这种问题

引用 1 楼 真相重于对错的回复:我用小米，发现路上还有人用小米，奇怪吗？ 谢谢大佬，我太较真了。

引用 2 楼 棉猴的回复:	int i = 1; 	int j = 1; 下面就是i和j在内存中的值，都是0x00000001，地址不同，但是值是相同的  谢谢大佬，我明白了。

我用小米，发现路上还有人用小米，奇怪吗？


Question: 求助这道题怎么用c语言写出来？

里面的字母都可以用其余英文字母代替，lg表示对数，g表示重力加速度


Question: 这种报错一般是什么问题

你之前的程序还在运行，生成新程序会覆盖原程序的，它还在运行所以就无法覆盖了（没记错的话应该是这个）

引用 1 楼 ?Victor.??的回复:https://blog.csdn.net/qq_45861670/article/details/104015023  供参考~ 感谢感谢感谢


Question: #c语言

int s=1; 	while(n>0) 	{ 		s=s*n; 			n--; 	}


Question: 求大神

抽空定了段代码，供参考，有能力自已再优化一下  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100  typedef struct student { 	char name[20]; 	int age; 	int math; 	int physics; 	int chermistry; 	int total; 	float average; }STU;  //输入 void inputSTU(STU *arr, int n) { 	int i = 0; 	for ( i = 0; i < n; i++ ) 	{ 		printf("输入第%d个学生的姓名 年龄 数学 物理 化学成绩：\n", i + 1); 		scanf("%s%d%d%d%d", arr[i].name, &arr[i].age, &arr[i].math, &arr[i].physics, &arr[i].chermistry); 		arr[i].total = arr[i].math + arr[i].physics + arr[i].chermistry; 		arr[i].average = arr[i].total * 1.0 / 3; 		getchar(); 	} }   //最高分 void maxSTU(STU *arr, int n, const char *str) { 	int i = 0, j = 0, max = 0; 	 	if (strcmp(str, "总分") == 0) 	{ 		for (i = 0; i < n; i++) 		{ 			if ( max < arr[i].total ) 			{ 				max = arr[i].total; 				j = i; 			} 		} 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[j].name, arr[j].age, arr[j].math, 			   arr[j].physics, arr[j].chermistry, arr[j].total, arr[j].average);  	} 	else if ( strcmp(str, "数学") == 0 ) 	{ 		for ( i = 0; i < n; i++ ) 		{ 			if ( max < arr[i].math ) 			{ 				max = arr[i].math; 				j = i; 			}				 		} 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[j].name, arr[j].age, arr[j].math, 			   arr[j].physics, arr[j].chermistry, arr[j].total, arr[j].average); 	} 	else if ( strcmp(str, "物理") == 0 ) 	{ 		for ( i = 0; i < n; i++ ) 		{ 			if ( max < arr[i].physics ) 			{ 				max = arr[i].physics; 				j = i; 			} 		} 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[j].name, arr[j].age, arr[j].math, 			   arr[j].physics, arr[j].chermistry, arr[j].total, arr[j].average); 		 	} 	else if ( strcmp(str, "化学") == 0 ) 	{ 		for ( i = 0; i < n; i++ ) 		{ 			if ( max < arr[i].chermistry ) 			{ 				max = arr[i].chermistry; 				j = i; 			} 		} 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[j].name, arr[j].age, arr[j].math, 			   arr[j].physics, arr[j].chermistry, arr[j].total, arr[j].average);		 	} }  //挂科 void failSTU(STU *arr, int n) { 	int i = 0, count = 0; 	char course[10]; 	printf("\n输入要查询的挂科科目:\n\n"); 	scanf("%s", course);  	if (strcmp(course, "数学") == 0) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for (i = 0; i < n; i++) 		{ 			if (arr[i].math < 60) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 				count++; 			} 		} 		printf("%s挂科的人数：%d", course, count); 	} 	else if ( strcmp(course, "物理") == 0 ) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for ( i = 0; i < n; i++ ) 		{ 			if ( arr[i].physics < 60 ) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 				count++; 			} 		} 		printf("%s挂科的人数：%d", course, count); 	} 	else if ( strcmp(course, "数学") == 0 ) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for ( i = 0; i < n; i++ ) 		{ 			if ( arr[i].chermistry < 60 ) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 				count++; 			} 		} 		printf("%s挂科的人数：%d", course, count); 	} }  //平均分降序 void sortSTU(STU *arr, int n) { 	STU temp; 	int i = 0, j = 0; 	for (i = 0; i < n - 1; i++) 	{ 		for (j = 0; j < n - 1 - i; j++) 		{ 			if (arr[j].average < arr[j+1].average) 			{ 				temp = arr[j]; 				arr[j] = arr[j + 1]; 				arr[j + 1] = temp; 			} 		} 	}  	printf("\n\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 	for ( i = 0; i < n; i++ ) 	{ 		printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 			   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 	} }  //按分数段查询 void scoreSTU(STU *arr, int n) { 	int i = 0, score = 0; 	printf("\n\n输入要查询的分数段：\n\n"); 	scanf("%d", &score);  	if (score < 60) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for (i = 0; i < n; i++) 		{ 			if (arr[i].average < 60) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 			} 		} 	} 	else if ( score >= 60 && score < 70 ) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for ( i = 0; i < n; i++ ) 		{ 			if ( arr[i].average >= 60 && arr[i].average < 70 ) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 			} 		} 	} 	else if ( score >= 70 && score < 80 ) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for ( i = 0; i < n; i++ ) 		{ 			if ( arr[i].average >= 70 && arr[i].average < 80 ) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 			} 		} 	} 	else if ( score >= 80 && score < 90 ) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for ( i = 0; i < n; i++ ) 		{ 			if ( arr[i].average >= 80 && arr[i].average < 90 ) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 			} 		} 	} 	else if ( score >= 90 && score < 100 ) 	{ 		printf("\n姓名\t年龄\t数学\t物理\t化学\t总分\t平均分\n"); 		for ( i = 0; i < n; i++ ) 		{ 			if ( arr[i].average >= 90 && arr[i].average < 100 ) 			{ 				printf("%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n", arr[i].name, arr[i].age, arr[i].math, 					   arr[i].physics, arr[i].chermistry, arr[i].total, arr[i].average); 			} 		} 	} 	else 	{ 		printf("\n超出范围!\n"); 		return; 	} }  int main(void) { 	STU myArray[N]; 	int num = 0; 	char str[10];  	printf("输入学生人数：\n"); 	scanf("%d", &num);  	//输入 	inputSTU(myArray, num); 	 	//总分最高分 	maxSTU(myArray, num, "总分");  	//单科最高分 	printf("\n输入要查询最高分的单科：\n\n"); 	scanf("%s", str); 	maxSTU(myArray, num, str);  	//单科挂科 	failSTU(myArray, num);  	//平均分降序输出 	sortSTU(myArray, num);  	//按分数段查询 	scoreSTU(myArray, num); 	  	getchar();     return 0; }

引用 1 楼 user-1的回复:使用结构体数组？使用链表？ 结构体

使用结构体数组？使用链表？


Question: 为什么输入负数时结果不正确？

scanf("%d,%d,%d",&a,&b,&c); //输入负数时，逗号只能是英文逗号,用空格间隔没有问题

printf("average=%.1f\n",average);  改成这样，去掉%d，因为average和%d匹配了

我知道了，输入负数时电脑自动改成了中文“，”所以错了

还是不正确啊，输出的结果是-429496736.0。

printf("average=%.1f\n%d",average); 这里有两个格式控制符，为啥只有一个变量？ %d可以输入负数，但要注意几点 1. 是否超出int的范围了？ 2. 是否完全按照scanf里写的来输入的？ "%d,%d"表示你要输入： 数字 英文逗号 数字

printf("average=%.1f\n%d",average) 这里多了%d 运行时输入  -20，-10 两个数中间要有逗号。


Question: C语言编程题需要源程序和运行截图

文件读写不难，建议自己写


Question: C语言编程（数组）

不难，建议楼主自己先试试写写～


Question: 关于循环变量的值是多少

其实把for改成while你就明白了 for相当于下面的while循环 i=0;//for初始化部分 while(i<(*N)){//for循环条件     sum=arr[i]/100+sum; //for循环体处理     if(sum>=(*us)*1000) {         sum=sum-arr[i];         break;     }      i++;//for每次循环结束处理 }

你的跳出指break的话，i不会继续加1 你的跳出指正常循环结束的话，i会最终达到和*N相等

问题不明，何为加一？和哪个数相比？

不会，因为跳出循环就不会继续执行i++了。所以不会自增1.


Question: C语言编程题

按下ctrl z之后再按一下回车

引用 2 楼 自信男孩的回复:程序没发现什么问题，应该是程序没有收到ctrl+z。 Linux下是用ctrl+d（直接键盘输入就可以退出输入循环，无需回车，已测试），Windows下是输入ctrl+z 谢谢，解决了

解决了，谢谢

这样真的就可以了，谢谢你！


Question: 读取文件，怎么进行追加？

引用 8 楼 自信男孩的回复:[quote=引用 6 楼 风吟xqy 的回复:] [quote=引用 4 楼 自信男孩的回复:]打开方式就不能是a+了，因为这样你是读取不到数据的，因为此时文件指针是指向文件末尾的。  解决办法是可读可写的形式打开文件，比如"r+"，然后把所有数据读取到内存，此时文件指针正好指向文件末尾，然后把小写转大写直接往文件里写就是了。最后关闭文件。  有一点需要明白，读取文件，将数据都读取到内存后，文件指针此时正好指向文件末尾。 老哥，还是写不成。[/quote] 发你的代码出来，是不是你的逻辑问题或者读文件时就出错了。[/quote] 写对了，逻辑出问题了

打开方式改成"a+"就好了。

引用 6 楼 风吟xqy 的回复:[quote=引用 4 楼 自信男孩的回复:]打开方式就不能是a+了，因为这样你是读取不到数据的，因为此时文件指针是指向文件末尾的。  解决办法是可读可写的形式打开文件，比如"r+"，然后把所有数据读取到内存，此时文件指针正好指向文件末尾，然后把小写转大写直接往文件里写就是了。最后关闭文件。  有一点需要明白，读取文件，将数据都读取到内存后，文件指针此时正好指向文件末尾。 老哥，还是写不成。[/quote] 发你的代码出来，是不是你的逻辑问题或者读文件时就出错了。

#include <stdio.h> #include <stdlib.h> #include <string.h> int main () {     FILE *fp1,*fp2;     char ch;     int a=0;     if ((fp1=fopen("alpha.txt","r"))==NULL)     {         printf("File open error!\n");         exit(0);     }     if((fp2=fopen("alpha.txt","a"))==NULL) 	{	 		printf("打开文件dest.txt失败!\n"); 		exit(0); 	}     while (!feof(fp1))     {         ch=fgetc(fp1);       //从fp1所指的文件中读取一个字符         if (ch !=EOF)         {             if (ch>='a'&&ch<='z'&&ch!='\n')             {                 ch -=32;                 fputc(ch,fp2);             }         }              }     if (fclose(fp1))                                 //关闭文件     {         printf("Can not close the file!\n");         exit(0);     }     if (fclose(fp2))                                 //关闭文件     {         printf("Can not close the file!\n");         exit(0);     }     return 0; }

引用 11 楼 Tryagain2006 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> int main () {     FILE *fp1, *fp2;     int ch;     int a=0;     if ((fp1=fopen("d:alpha.txt", "r+"))==NULL)     {         printf("File1 open error!\n");         exit(0);     }     if ((fp2=fopen("d:temp.txt", "w"))==NULL)     {         printf("File2 open error!\n");         exit(0);     }     while ( !feof(fp1) )     {            if ( (ch= fgetc(fp1)) != EOF )	//从fp1所指的文件中读取一个字符         {             if ( ch>='a' && ch<='z' )             {	ch -= 'a'-'A';             }             if (ch=='\n')             {	a++;             }             fputc(ch, fp2);				//写入文件2          }     }     printf("\na=%d",a);      freopen("d:/chensy/2019c/alpha.txt", "a+", fp1);	//重新打开文件1  	freopen("d:/chensy/2019c/temp.txt", "r",fp2);		//重新打开文件2     while ( !feof(fp2) )     {         ch = fgetc(fp2);       	//从fp2所指的文件中读取一个字符         if ( ch != EOF )         {	fputc(ch, fp1);		//追加到文件1中          } 	}     if ( fclose(fp1) )                               //关闭文件1     {         printf("Can not close the file1!\n");         exit(0);     }     if ( fclose(fp2) )                                 //关闭文件2     {         printf("Can not close the file2!\n");         exit(0);     }     return 0; }  请看看这个程序如何。就是这个feel，谢谢

引用 1 楼 user-5的回复:那就先读取文件大小，然后一点一点读文件，找到小写字母，然后转成大写字母追加到文本的后面 大佬，写不成

引用 4 楼 自信男孩的回复:打开方式就不能是a+了，因为这样你是读取不到数据的，因为此时文件指针是指向文件末尾的。  解决办法是可读可写的形式打开文件，比如"r+"，然后把所有数据读取到内存，此时文件指针正好指向文件末尾，然后把小写转大写直接往文件里写就是了。最后关闭文件。  有一点需要明白，读取文件，将数据都读取到内存后，文件指针此时正好指向文件末尾。 老哥，还是写不成。

引用 2 楼 Simple-Soft的回复:你原文件内容是啥？你代码中好像也没有写文件啊 原文件就是adfghjjkl

引用 4 楼 自信男孩的回复:打开方式就不能是a+了，因为这样你是读取不到数据的，因为此时文件指针是指向文件末尾的。  解决办法是可读可写的形式打开文件，比如"r+"，然后把所有数据读取到内存，此时文件指针正好指向文件末尾，然后把小写转大写直接往文件里写就是了。最后关闭文件。  有一点需要明白，读取文件，将数据都读取到内存后，文件指针此时正好指向文件末尾。 好的，我试一试

你原文件内容是啥？你代码中好像也没有写文件啊


Question: 请教设计一个合格的xp上运行的程序监控软件最少需要掌握哪些技能？

不算太难吧。很简单。思路是远程控制。截屏得到程序界面。然后只要界面是固定的，然后手工截取对应数据rect.然后用图片识别文字ocr。 图片识别文字比较low.最好还是hack程序，代码获取程序界面edit框内容。也不算太难。

看你用什么程序写了，不会用汇编去写，C#  QT mfc等都可以


Question: 哪个大神的帮我写一下这一题，顺便告诉我一下为啥？

引用 4 楼 m0_46505358的回复:[quote=引用 1 楼 自信男孩的回复:]逗号运算符，返回最后一个逗号之后表达式的值，从左向右依次计算，将最后表达式的值返回，那就是a+5的值。即15+5= 20 大神我不知道怎么把这个分数给你，你能告诉我怎么办吗？ [/quote] 就是我怎么引用你的答案。

引用 1 楼 自信男孩的回复:逗号运算符，返回最后一个逗号之后表达式的值，从左向右依次计算，将最后表达式的值返回，那就是a+5的值。即15+5= 20 大神我不知道怎么把这个分数给你，你能告诉我怎么办吗？

引用 1 楼 自信男孩的回复:逗号运算符，返回最后一个逗号之后表达式的值，从左向右依次计算，将最后表达式的值返回，那就是a+5的值。即15+5= 20 谢谢你的答案。

应该是先算a=3*5，这时a=15， 然后printf（%d）,这个值取后边括号里最后一个表达式的值，即a+5=15+5=20，所以打印20

引用 4 楼 m0_46505358 的回复:[quote=引用 1 楼 自信男孩的回复:]逗号运算符，返回最后一个逗号之后表达式的值，从左向右依次计算，将最后表达式的值返回，那就是a+5的值。即15+5= 20 大神我不知道怎么把这个分数给你，你能告诉我怎么办吗？ [/quote] 分不重要，主要是问题要解决了～


Question: 疑似越界问题

引用 9 楼 自信男孩的回复:[quote=引用 8 楼 kasami_ 的回复:] [quote=引用 7 楼 自信男孩的回复:]free(*a); 这句改成  free(a); 还是触发了断点呢，调试时在一进入循环就报错了[/quote] 你要做什么功能？说一下你的需求[/quote] 把释放a和b都改为free（a）和free（b）就解决了。我想请问一下为什么不free（a[i]）和*a呢？

引用 8 楼 kasami_ 的回复:[quote=引用 7 楼 自信男孩的回复:]free(*a); 这句改成  free(a); 还是触发了断点呢，调试时在一进入循环就报错了[/quote] 你要做什么功能？说一下你的需求

引用 7 楼 自信男孩的回复:free(*a); 这句改成  free(a); 还是触发了断点呢，调试时在一进入循环就报错了

free(*a); 这句改成  free(a);

引用 5 楼 自信男孩 的回复:[quote=引用 4 楼 kasami_ 的回复:] [quote=引用 2 楼 user-2的回复:]异常: 0xC0000005:   指针异常 写入位置 0xCDCDCDCD   debug模式下某个指针空的未初始化就被调用了 是的。前面给b分配内存时分配错误了。在解决已知问题再运行后，在释放a时显示已触发一个断点，请问是怎么回事啊？要如何解决呢？[/quote] 处理和b一样，需要循环把a[i]释放，你直接在外面free(a[i]);那么i是几呢？是不是也越界了呢？ [/quote] 给您看看更改后释放a的部分： for (i = 0; i < 3; i++) 	   free(a[i]);//释放a 	free(*a); 我就只是在原来的基础上引入了一个循环，我觉得这没什么问题才对的。再次感谢您的回答。

引用 4 楼 kasami_ 的回复:[quote=引用 2 楼 user-2的回复:]异常: 0xC0000005:   指针异常 写入位置 0xCDCDCDCD   debug模式下某个指针空的未初始化就被调用了 是的。前面给b分配内存时分配错误了。在解决已知问题再运行后，在释放a时显示已触发一个断点，请问是怎么回事啊？要如何解决呢？[/quote] 处理和b一样，需要循环把a[i]释放，你直接在外面free(a[i]);那么i是几呢？是不是也越界了呢？

引用 2 楼 user-2的回复:异常: 0xC0000005:   指针异常 写入位置 0xCDCDCDCD   debug模式下某个指针空的未初始化就被调用了 是的。前面给b分配内存时分配错误了。在解决已知问题再运行后，在释放a时显示已触发一个断点，请问是怎么回事啊？要如何解决呢？

引用 1 楼 自信男孩的回复:        free(b[i]);//释放b         free(*b); 这是怎么回事？free(b[i])也不在循环里呢？你没加大括号呢？所以b[i]肯定是越界，free(b[i]);肯定会出错。 是的。这是这个代码的问题之一。我把它修正过来之后调试。在释放b的时候正常，在释放a时显示触发一个断点。请问是怎么一回事啊？


Question: c语言能否实现类似JavaScript里面的用变量作为属性

这个c做不到，除非自己写个变量成员字段管理库（或反射管理类库）以及一些映射存储如map之类的，否则o变量有没有属性叫age，底层是不知道的

引用 3 楼 真相重于对错 的回复:c 里面有结构体可以达到你的要求 typedef struct _M{    int age;    char name[20]; }M; M m1; m1.age=18; strcpy(m1.name,"hello world";谢谢您，但是我的问题可能您没看清，假设我定义了一个字符串型的变量，并且我并不知道这个变量的值是什么，假设这个值是我通过控制台输入的，假设我在控制台输入"age", 我如何得到18

有现成的json.对象，数组，都可以存放。

C语言本身没有这个功能，可以通过C++的一些特性或者stl的容器的一些功能可以做到类似的

键—>值：有哈希容器，C++标准库里有unordered_map，还有平衡树，也能实现，c++中有map


Question: c语言

也就2分钟的事情，给你写一个参考吧  #include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, const char * argv[]) {     int num, i, tmp;     char gaming = 'y';     srand((unsigned)time(NULL));     while (gaming!='n' && gaming != 'N') {         printf("游戏开始！！！\n");         num = rand()%100 + 1;         for (i=0; i<10; i++) {             printf("请输入第%d次猜测的数：", i+1);             scanf("%d", &tmp);             if (tmp==num) break;             else if (tmp > num) {                 printf("大了，再往小方向猜！\n");             } else {                 printf("小了，再往大方向猜！\n");             }         }         if (i==10) {             printf("本次游戏你输了！");         } else {             printf("恭喜你，本次游戏你赢了！");         }         printf("（正确答案：%d）\n", num);         printf("是否继续游戏？（输入 n 或 N 退出游戏）\n");         getchar();         scanf("%c", &gaming);     }     printf("游戏结束，欢迎下次继续挑战！\n");     return 0; }

思路： 1.随机产生一个数 2.输入一个数 3.判断 输入的数和随机数是否相等，如不相等，用一个变量作计数器，大于10则结束

求大佬们帮我看看，怎么编


Question: C语言

我好了！！！！！

引用 2 楼 自信男孩的回复:scanf缺少&，year, month, day都是int类型。 另外，weeday函数实参和形参不一致。 怎么改？第一次发这个，不知道怎么发源码

贴源码吧，不建议发图片。


Question: 从文件中读取数字到数组中。

建议直接发源码和文件信息（要读取的）

没有被正确读取具体指的什么？


Question: vc6.0打开文件闪退，FileTool.exe也下载了卡在其中一步操作不了

引用 8 楼 m0_51291095的回复:[quote=引用 5 楼 weixin_48337303的回复:]用vc6.0是想简洁一点，新手练习，操作方便，版本经典，现在打开文件闪退的问题已经解决了，重装了一遍vc++6.0，把之前的FileTool.dll文件放在vc6.0的安装目录D:\SoftWare\VC++6.0\VC++6.0\Microsoft Visual Studio\Common\MSDev98\AddIns里边，点击vc6.0界面工具--定制--附加项和宏文件--浏览--找到刚才目录下点击FileTool.dll--打开即可    如果有弹框提示此DLL无法加载，那就手动加载，方法如下： 在电脑下方导航栏搜索栏输入cmd，自动检索到命令提示符应用，右键点击--选择以管理员身份运行（这一点很重要，如果直接运行cmd则没有权限注册dll文件，会提示找不到有效的dll文件）   打开程序框后输入regsvr32 "D:\SoftWare\VC++6.0\VC++6.0\Microsoft Visual Studio\Common\MSDev98\AddIns\FileTool.dll" 引号里是刚才FileTool.dll文件的路径，注意regsvr32后边有一个空格（很重要），输入完然后按回车键，即可注册成功   然后打开vc6.0界面，工具--定制--附加项和宏文件--勾选新出现的add-in的选项如图   然后即可看到一个有两个小蓝色按钮的小工具框   A是添加文件到工程按钮，O是打开文件按钮，把工具框固定到工具栏上就行了   以后打开文件就点新小工具栏里的O就行了，如果想设置快捷键，具体请参考这个网址 https://jingyan.baidu.com/article/215817f7ca44841edb142346.html?qq-pf-to=pcqq.c2c  总之，我说的重点就是如何把FileTool.dll文件加载上，希望能帮助以后遇到这个问题的人 感谢！！之前看另一个博主的帖子，在命令提示符输入那一步怎么都不行，幸好看到您的回复一路跟过来，才发现是regavr32后面没加空格[/quote] 谢啦，我看了你的回复才知道问题所在

引用 1 楼 weixin_48337303的回复: 注册dll也不行，直接说识别不了这个dll文件，我可能组建完生成的是个假的FileTool.dll文件，系统根本识别不了 我也是这种情况

引用 5 楼 weixin_48337303的回复:用vc6.0是想简洁一点，新手练习，操作方便，版本经典，现在打开文件闪退的问题已经解决了，重装了一遍vc++6.0，把之前的FileTool.dll文件放在vc6.0的安装目录D:\SoftWare\VC++6.0\VC++6.0\Microsoft Visual Studio\Common\MSDev98\AddIns里边，点击vc6.0界面工具--定制--附加项和宏文件--浏览--找到刚才目录下点击FileTool.dll--打开即可    如果有弹框提示此DLL无法加载，那就手动加载，方法如下： 在电脑下方导航栏搜索栏输入cmd，自动检索到命令提示符应用，右键点击--选择以管理员身份运行（这一点很重要，如果直接运行cmd则没有权限注册dll文件，会提示找不到有效的dll文件）   打开程序框后输入regsvr32 "D:\SoftWare\VC++6.0\VC++6.0\Microsoft Visual Studio\Common\MSDev98\AddIns\FileTool.dll" 引号里是刚才FileTool.dll文件的路径，注意regsvr32后边有一个空格（很重要），输入完然后按回车键，即可注册成功   然后打开vc6.0界面，工具--定制--附加项和宏文件--勾选新出现的add-in的选项如图   然后即可看到一个有两个小蓝色按钮的小工具框   A是添加文件到工程按钮，O是打开文件按钮，把工具框固定到工具栏上就行了   以后打开文件就点新小工具栏里的O就行了，如果想设置快捷键，具体请参考这个网址 https://jingyan.baidu.com/article/215817f7ca44841edb142346.html?qq-pf-to=pcqq.c2c  总之，我说的重点就是如何把FileTool.dll文件加载上，希望能帮助以后遇到这个问题的人 感谢！！之前看另一个博主的帖子，在命令提示符输入那一步怎么都不行，幸好看到您的回复一路跟过来，才发现是regavr32后面没加空格

可是再打开软件那个蓝色按钮又没了啊

换个别的吧，vc6太老了

已经把TileTool.dll移动到VC++6.0所在文件夹里的D:\SoftWare\VC++6.0\VC6_DownZa.Cn\Common\MSDev98\AddIns了，还是注册不了

有把FileTool.dll移动到你电脑里VC++6.0所在文件夹里的Common/MSDev98/Addlns吗？

研究了一整天自己研究明白了


Question: 为什么找不到这个.c文件，它明明就在项目里

#include "graphics.h" ---> #include "include/graphics.h"

路径不对吧，头文件在include里？而源文件和头文件不在同一路径下吧～

main 与  graphics.h 是否在同一个目录下，如果不在要带上路径。一般像楼上那么书写。


Question: C#

图像的坐标有没有随时间改变？

没有实现你预期的效果，就是代码错了

好的，我晓得了。谢谢(*°∀°)=3

只要不是按照自己期望的结果，那就是错了

我猜你的代码有问题


Question: 有大佬知道这个是什么问题吗

引用 8 楼 chxchxkkk 的回复:你这个malloc只给了一个结点分配了内存空间。添加结点要在循环语句里使用malloc分配 谢谢大佬指点，我现在给啦他循环。 #include<stdio.h> #include<stdlib.h> #include<string.h> #pragma warning(disable:4996) typedef struct stu { 	int num; 	int score; 	struct stu* next; }student; int main() { 	int m, n; 	scanf("%d %d", &m, &n); 	int x = m; 	int y = n; 	student* p1; 	student* p2; 	student* head1 = (student*)malloc(sizeof(student));         	student* list1 = (student*)malloc(sizeof(student)); 	student* head2 = (student*)malloc(sizeof(student)); 	student* list2 = (student*)malloc(sizeof(student)); 	p1 = head1; 	p2 = head2; 	for (int i = 0;i < m;i++) { 		scanf("%d %d", &list1->num, &list1->score); 		list1 = (student*)malloc(sizeof(student)); 		p1->next = list1; 		p1 = list1; 	} 	list1->next = NULL;           //第一个链表尾结点的next是NULL 	p1 = head1;                //p1重新指向头结点 	for (int i = 0;i < n;i++) { 		scanf("%d %d", &list2->num, &list2->score); 		list2 = (student*)malloc(sizeof(student)); 		p2->next = list2; 		p2 = list2; 	} 	list2->next = NULL;             //第二个链表尾结点的next是NULL 	p2 = head2->next;                     //p2指向头结点的next，即第一个元素 	list1->next = p2;   //第一个链表的尾结点的next是第二个链表的第一个元素，这时候合起来的链表应该是只有一个头结点，其他是x+y个元素，最后一个结点的next是NULL 	printf("\n\n\n"); 	int sum = x+y; 	while(sum--) 	{ 		p1 = p1->next; 		printf("%d %d\n", p1->num, p1->score);         //p1从头结点开始循环，输出各个元素的成员的值 	} 	return 0; } 之前的问题都解决啦，我把我刚才的做啦修改，但是最后输出的时候，它输出少啦2个链表的第一个元素，然后多了2个链表尾结点的next，就是空的元素。

#include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) typedef struct stu {     int num;     int score;     struct stu* next; }student;   void create_link(student **pphead, int num) {     student *pcur, *pnext;     int i = 0;      while (i < num) {         pcur = (student *)malloc(sizeof(student));         if (!pcur)             exit(0);         scanf("%d %d", &pcur->num, &pcur->score);         if (!*pphead) {             *pphead = pcur;             pnext = *pphead;             i++;             continue;         }         pnext->next = pcur;         pnext = pcur;         i++;     }     pnext->next = NULL; }  void print_link(student *phead) {     student *pcur = phead;      while (pcur) {         printf("%d %d\n", pcur->num, pcur->score);         pcur = pcur->next;     } }  int main() {     int m, n, y;      student *head1, *head2, *pcur;      head1 = head2 = NULL;      scanf("%d %d", &m, &n);     create_link(&head1, m);     //print_link(head1);     create_link(&head2, n);     //print_link(head2);      y = m + n;      pcur = head1;     while (pcur && pcur->next)         pcur = pcur->next;      pcur->next = head2;       print_link(head1);   #if 0     student* head1, * list1, * head2, * list2, * p1, * p2;     head1 = list1 = head2 = list2 = (student*)malloc(sizeof(student));     if (!head1)         exit(0);     p1 = head1;     p2 = head2;     p1->next = NULL;     while(m--) {         scanf("%d %d", &list1->num, &list1->score);         list1->next = NULL;         p1->next = list1;         p1 = list1;         list1 = (student*)malloc(sizeof(student));         if (!list1)             exit(0);     }     free(list1);    //最后一个list1没有执行scanf      p2 = head1;     list2 = (student*)malloc(sizeof(student));     if (!list2)         exit(0);     while (n--) {         scanf("%d %d", &list2->num, &list2->score);         list2->next = p2->next;         p2->next = list2;         p2 = list2;         list2 = (student*)malloc(sizeof(student));         if (!list2)             exit(0);     }     free(list2);    //最后一个list1没有执行scanf     /*     p2 = head2->next;     list1->next = p2;     */     p1 = head1;     int y = m + n;     while(y--)     {         printf("%d %d", p1->num, p1->score);         p1 = p1->next;     } #endif     return 0; } 供参考～   楼主的代码看不出逻辑所在，不申请空间怎么赋值？

我把它们4个都分开操作啦，最后没有出现说我p1是NULL啦，但是它输出第一个和第二个链表的最后一个元素后，第三个就输出不了，错误位置还是在那个地方

你那个四连指向同一内存位置的操作,可能是原因吧,总感觉怪怪的

那张图发错啦，看代码吧

#include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) typedef struct stu { 	int num; 	int score; 	struct stu* next; }student; int main() { 	int m, n; 	scanf("%d %d", &m, &n); 	student* head1, * list1, * head2, * list2, * p1, * p2; 	head1 = list1 = head2 = list2 = (student*)malloc(sizeof(student)); 	p1 = head1; 	p2 = head2; 	while(m--) { 		scanf("%d %d", &list1->num, &list1->score); 		p1->next = list1; 		list1->next = NULL; 		p1 = list1; 	} 	p1 = head1; 	while (n--) { 		scanf("%d %d", &list2->num, &list2->score); 		p2->next = list2; 		list2->next = NULL; 		p2 = list2; 	} 	p2 = head2->next; 	list1->next = p2; 	int y = m + n; 	while(y--) 	{ 		p1 = p1->next; 		printf("%d %d", p1->num, p1->score); 	} 	return 0; } 这是源代码

while在做什么？一直再给同一个节点赋值呀

直接发源码吧，不建议发图片

改进后的输出是这样子的，感觉是把2个链表后移一步然后合并在一起，但是我看不出代码哪里出问题啦

引用 10 楼 chxchxkkk 的回复:while(sum--) { p1 = p1->next; printf("%d %d\n", p1->num, p1->score);         //p1从头结点开始循环，输出各个元素的成员的值 } 一般输出链表这样： while(p1->next != NULL) {     printf("%d %d\n", p1->num, p1->score);         //p1从头结点开始循环，输出各个元素的成员的值     p1 = p1->next; } 谢谢提醒，但是最后输出还是有问题，不是这个的原因


Question: pat火星数字 测试点1和4已经对0和13的倍数处理里还是通不过

找到我的原因了 有个for里的数组个数是13，还有就是我不知道strcmp第一个参数的指针可以选位置

#include<stdio.h> #include<stdlib.h> #include<string.h> #include <ctype.h>    int find_index(const char **str, int len, const char *src) {     int i;      for (i = 0; i  < len; i++)         if (str[i][0] != '\0' && strstr(src, str[i]))                 break;     if (i >= len)         return -1;      return i; }  int main() {     const char *ones[13] = {         "tret", "jan", "feb", "mar", "apr",         "may", "jun", "jly", "aug", "sep",         "oct", "nov", "dec"     };     const char *tens[13] = {         "", "tam", "hel", "maa", "huh",         "tou", "kes", "hei", "elo", "syy",         "lok","mer","jou"     };     char str[32], *pstr;     int n, i = 0, num, quot, ret;       scanf("%d",&n);     getchar();    //for '\n'      while (i < n) {         fgets(str, 32, stdin);          if (isdigit(str[0])) {             num = atoi(str);             //printf("num = %d\n", num);             if (num >= 169 || num < 0) {                 fprintf(stderr, "Input error!\n");                 continue;             }             if ((quot = num / 13))                 printf("%s ", tens[quot]);             printf("%s\n", ones[num % 13]);             continue;         }         //puts(str);         num = 0;         pstr = str;         ret = find_index(tens, 13, pstr);         if (ret > 0) {             num = ret * 13;             pstr = strstr(str, " ");         }         if (pstr != NULL) {             ret = find_index(ones, 13, pstr);             num += ret;         }         printf("%d\n", num);         i++;     }      return 0; } 用这个代码吧，上面的代码还有点bug。

#include<stdio.h> #include<stdlib.h> #include<string.h> #include <ctype.h>    int find_index(const char **str, int len, const char *src) {     int i;      for (i = 0; i  < len; i++)         if (str[i][0] != '\0' && strstr(src, str[i]))                 break;     if (i >= len)         return -1;      return i; }  int main() {     const char *c[13] = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};     const char *d[13] = {"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };     char str[32], *pstr;     int n, i = 0, num, remainder, quot, ret;       scanf("%d",&n);     getchar();    //for '\n'      while (i < n) {         fgets(str, 32, stdin);          if (isdigit(str[0])) {             num = atoi(str);             printf("num = %d\n", num);             if (num >= 169 || num < 0) {                 fprintf(stderr, "Input error!\n");                 continue;             }             if ((quot = num / 13))                 printf("%s ", d[quot]);             printf("%s\n", c[num % 13]);             continue;         }         //puts(str);         num = 0;         pstr = str;         ret = find_index(d, 13, pstr);         if (ret > 0)             num = ret * 13;         //printf("ret1 = %d\n", ret);         pstr = strstr(str, " ");         if (pstr != NULL) {             ret = find_index(c, 13, pstr+1);             //printf("ret2 = %d\n", ret);             num += ret;         }         printf("%d\n", num);         i++;     }  #if 0     int n,t1,t2,len, k1, k2;     const char *c[13] = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};     const char *d[13] = {"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };      int k = 0,kk=0,sum = 0;;     char a[32],tmp[32];     scanf("%d",&n);     getchar();     for (int i = 0; i < n; i++)     {         fgets(a,10,stdin);         len = strlen(a);          if (len == 2 && a[0] == '0') printf("tret\n");         else if (a[0] > '0' &&a[0] <= '9')         {             int t = atoi(a);             if (t <= 12)printf("%s\n",c[t]);             else if (t % 13 == 0) printf("%s\n",d[t/13]);             else printf("%s %s\n",d[t/13], c[t % 13]);         }         else         {             if (len == 4 || len == 9) printf("0");             else if (len < 4)             {                 a[3] = '\0';                 for (int i = 0; i < 13; i++)                 {                     if (strcmp(a, c[i]) == 0)                         printf("%d\n",i);                 }                 for (int i = 0; i < 13; i++)                 {                     if (strcmp(a, d[i]) == 0)                         printf("%d\n", i*13);                 }             }             else             {                 for (k1 = 0; k1 < 13; k1++)                 //计算高三位                 {                     if (strncmp(a, d[k1], 3) == 0)                     {                         sum = k1 * 13;                     }                 }                 tmp[3] = '\0';                 for ( k2 = 0; k2 < 12; k2++)                     //计算低三位                 {                     strncpy(tmp, a + 4, 3);                     if (strcmp(c[k2], tmp) == 0&&c[k2]!="tret")                     {                         sum = sum + k2;                     }                 }                 printf("%d\n", sum);                 sum = 0;             }         }     } while (1); #endif     return 0; } 供参考～


Question: code::blocks  调试问题

CB 可以同时保存多个视图，编辑，调试 可以自动切换

引用 1 楼 user-2 的回复:单步执行一下试试  为什么设置断点，然后调试。调试工具栏 就会莫名其妙的消失了？？ 等到调试完毕后，按 shift+F8 结束调试，工具栏又回来了！ 如此循环下去，郁闷！

单步执行一下试试


Question: i = i++

引用 11 楼 Q446512799 的回复:都打起来了 都这么写打谁  唉，有人掉进了这个坑  搞得我也想一探究竟

谁这么写打谁

都打起来了 都这么写打谁

引用 5 楼 棉猴 的回复:跟编译器有关系，VS2015的到的值是2 00E11F45  mov         eax,dword ptr [i]   00E11F48  mov         dword ptr [i],eax   00E11F4B  mov         ecx,dword ptr [i]   00E11F4E  add         ecx,1   00E11F51  mov         dword ptr [i],ecx   这是 i = i++; 对应的汇编语言，你可以看到，先将i的值保存到ecx中，然后对ecx保存的值加1，然后将加ecx的值保存到i中。 引用 6 楼 千梦一生 的回复:我的理解： 首先i = i++；如果要等于2，思考后得到的方案可能是： 先i++ 然后再i = i【自增之前的i】 详细如下：--------------------------------------------------- i = i++ 首先， = 和++运算，后者优先级高 step1： i++//这里毫无疑问返回1。并且产生了副作用 i变成了2【这个副作用的成立时间很关键】 step2： i = (i++的返回值)，即i = 1； --------------------------------------------------------------- 好了以上我们能确定的计算顺序有： step1：先计算i++的值，返回1。 step2：再计算i = （i++的返回值），【它本身返回i的值，但这里没有实际意义】 ---------------------------------------------------------------- 但问题出现了就是副作用的成立时间，C里面规定的是顺序点之前任何时候计算出来即可 所以：可能且满足标准的定义可以有： step1：先计算i++的值，返回1。 副作用，i 自增 = 2； step2：再计算i = （i++的返回值），【它本身返回i的值，但这里没有实际意义】，此时结果i = 1，因为（i++的返回值为1） 或者： step1：先计算i++的值，返回1。 step2：再计算i = （i++的返回值），【它本身返回i的值，但这里没有实际意义】 副作用，i 自增 = 2；，此时结果i = 2，因为自增 引用 7 楼 真相重于对错 的回复:这是标准未定义行为 未定义行为 1) 若对一个标量对象的副效应与另一个对同一标量对象的副效应相对无顺序，则行为未定义。 i = ++i + i++; // 未定义行为 i = i++ + 1; // 未定义行为 f(++i, ++i); // 未定义行为 f(i = -1, i = -1); // 未定义行为 引用 8 楼 qybao 的回复:[quote=引用 3 楼 ?Victor.?? 的回复:]   百度上也没有太正规的解释  有人这么说  i++表达式的值是1，i的值是2  ++i与之相反 i++的表达式的值是i，这个是毫无疑问的，要不然和++i有啥区别？否则一直以来的a[i++] =b; 这样的赋值，必然少一项a[i]，显然很多代码已经证明这是不可能的，a[i++] =b就是等价于a[i] =b，i=i+1，所以可见i++的表达式就是i，要不然a[i] 就变成a[i+1]了  i=i++ c++15以前是未定义行为，也就是没有规定等号左右两边的表达式的执行顺序（也就是有可能先把等号右边的表达式的值1赋给左边的i，再继续执行等号右边的i自增，这样的结果就是2） c++15以后规定赋值语句等号右边的表达式优先执行，所以c++15以后就像我上述分析的一样，先执行完等号右边，再把等号右边的表达式的值赋给等号左边的i    [/quote]  引用 9 楼 自信男孩 的回复:这样的问题不建议深究，有歧义，有异议那为什么还要写呢？给自己和别人找麻烦，让别人也疑惑。 所以，不建议写这样的代码～  嗯，谢谢各位大佬

引用 3 楼 ?Victor.?? 的回复:百度上也没有太正规的解释  有人这么说  i++表达式的值是1，i的值是2  ++i与之相反 i++的表达式的值是i，这个是毫无疑问的，要不然和++i有啥区别？否则一直以来的a[i++] =b; 这样的赋值，必然少一项a[i]，显然很多代码已经证明这是不可能的，a[i++] =b就是等价于a[i] =b，i=i+1，所以可见i++的表达式就是i，要不然a[i] 就变成a[i+1]了  i=i++ c++15以前是未定义行为，也就是没有规定等号左右两边的表达式的执行顺序（也就是有可能先把等号右边的表达式的值1赋给左边的i，再继续执行等号右边的i自增，这样的结果就是2） c++15以后规定赋值语句等号右边的表达式优先执行，所以c++15以后就像我上述分析的一样，先执行完等号右边，再把等号右边的表达式的值赋给等号左边的i

引用 2 楼 六道佩恩 的回复:在同一个式子里对同一个变量操作两次，结果是不确定的，这要看编译器怎么编译了 我用新版gcc测试结果为1 老版gcc为2 vc++6.0为2 turbo C为2  哦，原来这样

引用 1 楼 qybao 的回复:等式右边，先取i=1作为表达式的值，然后i自增变成2，然后再把表达式的值1赋给等号左边的i，所以i又变回1了 如果不理解我说的，先自己谷歌百度一下什么是表达式的值  百度上也没有太正规的解释  有人这么说  i++表达式的值是1，i的值是2  ++i与之相反


Question: Dev下建立的工程文件显示无法找到某个头文件，但它们已经在同一个目录下

我找到原因了，因为头文件不仅要和main.c处于同一个存储目录下，还得出现在相同的工程目录下


Question: 大一作业，帮看一下

用mfc吧。

electronic 也可以做客户端开发，试一下。

用QML吧，脚本语言很快。

用QT吧。你需要的东西都可以用QT实现，用MFC不好实现动画


Question: 用C语言编写程序，模拟实现操作系统创建新的进程：查看运行进程；换出某个进程：杀死运行进程等功能。

可以考虑一下用system


Question: C语言求助

#include<stdio.h>  void keep(char neicun[][8],int*max)  {   int i,j;      char ch;  	FILE *fPtr=fopen("dict.dic","r"); 	for(i=0;!feof(fPtr);i++) 	{   	    ch=fgetc(fPtr);  	      for(j=0;j<8&&ch!='/n';j++) 		{ 		   neicun[i][j]=ch; 		   ch=fgetc(fPtr);  		} 	} 	*max=i;  	fclose(fPtr);  }

代码呢？ 用fscanf


Question: 递归返回的限制

#include <stdio.h>//交换a[1]~a[7] a[2]~a[6]... //#include <unistd.h>  //void move(int a,int b) void move(int *a,int *b) {     int l;     l  = *a;     *a = *b;     *b = l; }  int dg(int a[10],int g,int t) {     printf("g = %d, t = %d\n", g, t);     move(a+g, a+t);     //sleep(1);     if(t==4||g==4)         return 1;     //else     //return dg(a[10],g++,t--);     //return dg(a, g++,t--);     return dg(a, ++g, --t); }  int main(int argc, char *argv[]) {     int i,b[10]={0,1,2,3,4,5,6,7,0,0};     //dg(b[10],1,7);     dg(b,1,7);     for(i=0;i<10;i++)         printf("%d",b[i]);     return 0; }   供参考～  建议楼主注意下b[10]作为参数和int b[10]的区别。其他的问题，建议楼主好好思考和学习一下。


Question: C语言字符串修改

while((chs=getchar())!='\n'&&k<MAXSIZE)建议改成  while((chs=getchar())!='\n'&&k<MAXSIZE-1) 因为至少要给'\0'留一个字符空间  if(S->ch[0]=='\0') printf("空串"); 这个判断是多余的吧，因为当k是0时，能从while (s->len > 2)的循环中跳出来？

参考getline(char s[],int MAXLINE)写，教科书上有。


Question: 约瑟夫问题（一维数组）

网上有很多例子和代码，建议自己先动手搜一搜，测一测


Question: C语言 循环结构中scanf的问题

scanf下面加一句getchar()试试

调试下，scanf是否读入错误，导致while死循环。

可以调试一下看看，到底是怎么回事


Question: C语言打开文件

1、使用绝对路径，你用的IDE 不能确定你的文本文件和你的项目运行的文件是在同一个目录，所以不一定能找到。在使用绝对路径的时候，有的编译器在window下，要注意\转义字符的使用，有的在区分目录结构的时候要使用两个斜杠\\。 2、使用error.h中的perror（）函数可以搜集错误代码，不知道错误代码的含义，可以用strerror（）来解释错误代码。 3、是否将文件存在管理员区，就是没有读的权限，这个可能性很少。

注意文件名是否一致，另外，楼主这样的打开文件，那么需要被打开的文件和可执行程序在同一路径下。要么就写绝对路径～

如果不确定fopen的文件的相对路径，最好就用绝对路径 比如fopen("C:\\xxx\f12-1.txt", "r")

引用 4 楼 其实一开始我是拒绝的 的回复:[quote=引用 3 楼 user-5的回复:][quote=引用 2 楼 其实一开始我是拒绝的的回复:][quote=引用 1 楼 user-5的回复:]看一下返回值是什么，通常是找不到文件 返回空指针，找不到文件，但是我有建立这个文件了[/quote] 调试一下看看什么错误原因 应该是文件不在当前运行目录下面，你用绝对路径试一下[/quote] 怎样放到同一目录？[/quote] .exe文件所在的那个目录,放在那里就行了

引用 3 楼 user-5的回复:[quote=引用 2 楼 其实一开始我是拒绝的的回复:][quote=引用 1 楼 user-5的回复:]看一下返回值是什么，通常是找不到文件 返回空指针，找不到文件，但是我有建立这个文件了[/quote] 调试一下看看什么错误原因 应该是文件不在当前运行目录下面，你用绝对路径试一下[/quote] 怎样放到同一目录？

引用 2 楼 其实一开始我是拒绝的的回复:[quote=引用 1 楼 user-5的回复:]看一下返回值是什么，通常是找不到文件 返回空指针，找不到文件，但是我有建立这个文件了[/quote] 调试一下看看什么错误原因 应该是文件不在当前运行目录下面，你用绝对路径试一下

引用 1 楼 user-5的回复:看一下返回值是什么，通常是找不到文件 返回空指针，找不到文件，但是我有建立这个文件了

看一下返回值是什么，通常是找不到文件


Question: 一道c语言的函数题目

您这个思路我看懂了，您能不能帮忙看看我的思路，我把最后那个return（s）去掉了，还是不正确，想问一下您如果按照我这个思路应该怎么改？

void Shift( char *s ) {         int i,j,x;char c[3];         x=strlen(s);         for(i=0;i<3;i++)         {                 c[i]=s[i];         }         for(j=0;j<x-3;j++)         {                 s[j]=s[j+3];         }         for(i=0;i<3;i++)         {                 s[j+i]=c[i];         } }

首先void类型函数没有返回值，你还return


Question: 脑袋都想破了，这也太难了....

引用 4 楼 暁暁暁 的回复：你写成 return 0会出错是因为你的函数是void可是main函数也是void类型的，它却可以return 0，为什么？

引用 5 楼 自信男孩 的回复：#include <stdio.h> #include <stdlib.h>  struct Node {     int value;     struct Node *next; };  void insertNode(struct Node **head, int value) {     struct Node *previous;     struct Node *current;     //struct Node *new;     struct Node *new_node;      current = *head;     previous = NULL;      while (current != NULL && current->value < value)     {         previous = current;         current = current->next;      }      new_node = (struct Node *)malloc(sizeof(struct Node));     if (new_node == NULL)     {         printf("内存分配失败！\n");         exit(1);     }      new_node->value = value;     new_node->next = current;      if (previous == NULL)     {         *head = new_node;     }     else     {         previous->next = new_node;     } }  void printNode(struct Node *head) {     struct Node *current;      current = head;     while (current != NULL)     {         printf("%d ", current->value);         current = current->next;     }      putchar('\n'); }  void deleteNode(struct Node **head, int value) {     struct Node *previous;     struct Node *current;      current = *head;     previous = NULL;      while (current != NULL && current->value != value)     {         previous = current;         current = current->next;     }      if (current == NULL)     {         printf("找不到匹配的节点！\n");         return ;    //为什么这里写成return 0会出错，写成return不会出错？这里的return有什么用？     }     else     {         if (previous == NULL)         {             *head = current->next;         }         else         {             previous->next = current->next;         }          free(current);     } } int main() {     struct Node *head = NULL;     int input;      printf("开始测试插入整数...\n");     while (1)     {         printf("请输入一个整数（输入-1表示结束）：");         scanf("%d", &input);         if (input == -1)         {             break;         }         insertNode(&head, input);         printNode(head);     }      printf("开始测试删除整数...\n");     while (1)     {         printf("请输入一个整数（输入-1表示结束）：");         scanf("%d", &input);         if (input == -1)         {             break;         }         deleteNode(&head, input);         printNode(head);     }      return 0; } 供参考～  函数返回值是值函数定义的数据类型，如果没有返回值，即定义的是void也是可以使用return的，只是return什么也不返回，直接跟分号。 return是退出函数并返回对应类型的数据。那为什么void类型的main函数可以用return返回零？零不是int类型的吗？

你写成 return 0会出错是因为你的函数是void

引用 2 楼 weixin_45906870 的回复:引用 1 楼 user-3 的回复：因为这个函数没有返回值那这个return是结束这个函数的意思吗 对的，return就是结束本函数的意思，同时返回一个值。

因为这个函数没有返回值


Question: 约瑟夫环问题，提交了总是程序运行超时，请各位大佬帮忙看看

修改 memset(p,1,n*sizeof(int)); 按照提示模拟的算法，复杂度O（m*n）。m*n<1e7不会超时

首先你的memset用法有两个错误： memset(p,1,sizeof(p));   1，第三个参数写法上应为n*sizeof(int)； 即使更正错误1之后，仍然有错误： 2，memset不能这样用整数1填充数组。


Question: C语言难题！！求大神帮忙看看！！拜托了！

void EncryptEvenNumberWord(void) {     char cArraySrc[]    = "This is a string test: encrypt Even number word.";     char *pcSrc         = cArraySrc;     char *pcDst         = cArraySrc;     char cTemp          = 0;     bool bResetStart    = true;     int iIndexChar      = 0;     int iIndexWordStart = 0;     int iIndexWordStop  = 0;     int iIndexWord      = 0;     int iWordLen        = 0;     printf("src[%s]", cArraySrc);      while(0 != *pcSrc)     {         //单词处理         if(!((('a' <= *pcSrc) && ('z' >= *pcSrc)) || (('A' <= *pcSrc) && ('Z' >= *pcSrc))))         {             bResetStart = true;             iWordLen = iIndexWordStop - iIndexWordStart;              //单词字母个数不是偶数，不处理             if(0 != iWordLen % 2)             {                 pcSrc ++;                 iIndexChar ++;                 iIndexWordStop ++;                 continue;             }              //单次加密             //a-r o-z  ；o-r之间的需如何处理?             //a-r 左移一位             if(((pcDst[iIndexWordStart] >= 'a') && (pcDst[iIndexWordStart] <= 'r'))                || ((pcDst[iIndexWordStart] >= 'A') && (pcDst[iIndexWordStart] <= 'R')))             {                 cTemp = pcDst[iIndexWordStart];                  for(iIndexWord = iIndexWordStart; iIndexWord < iIndexWordStop; iIndexWord++)                 {                     pcDst[iIndexWord] = pcDst[iIndexWord + 1];                 }                  pcDst[iIndexWordStop - 1] = cTemp;             }             //s-z 右移一位             else if(((pcDst[iIndexWordStart] >= 's') && (pcDst[iIndexWordStart] <= 'z'))                     || ((pcDst[iIndexWordStart] >= 'S') && (pcDst[iIndexWordStart] <= 'Z')))             {                 cTemp = pcDst[iIndexWordStop - 1];                  for(iIndexWord = iIndexWordStop - 1; iIndexWord > iIndexWordStart; iIndexWord--)                 {                     pcDst[iIndexWord] = pcDst[iIndexWord - 1];                 }                  pcDst[iIndexWordStart] = cTemp;             }         }         else if((true == bResetStart) && ((('a' <= *pcSrc) && ('z' >= *pcSrc)) || (('A' <= *pcSrc) && ('Z' >= *pcSrc))))         {             bResetStart = false;             iIndexWordStart = iIndexChar;         }          pcSrc ++;         iIndexChar ++;         iIndexWordStop ++;     }      printf("dst[%s]", cArraySrc); }


Question: 递归求斐波那契数放回值

不是你理解的，返回时发生了复制，原封不动的把值复制给了调用者

函数返回是先把值给获取者，再释放

函数返回值和函数参数不是一个概念哦

你这个result意义不大，只是相当于一个临时变量，也就是和以下代码等价的 else     return fib(n-2)+fib(n-1); 所以result纯属可有可无，也就是说你这个result只是临时保存了一下返回值，然后就返回了。 函数结束后局部变量的内存空间却是是被回收，也就是局部变量消失了，但作为返回值返回的结果被保留在调用函数的地方（否则就没法获取函数返回值了），所以返回值可以被打印出来

那个result没有累加，所以有问题


Question: 没有匹配if的非法else

else if ((score > 80 || score == 80) && score < 90);//这里分号不能有 ((score > 90 || score == 90) && score < 100);//这个分号建议也删了，不然结果可能不是你希望的

分号多加了，去掉就不会有这样的编译error了。

score > 60 || score == 60  和score >= 60 有区别吗

这一行末尾多了个分号。 else if ((score > 80 || score == 80) && score < 90);

#include<stdio.h> void main() { int score; scanf_s("%d", &score); if (score < 60) { printf("the score is E\n"); } else if ((score > 60 || score == 60) && score < 70) { printf("the score is D\n"); } else if ((score > 80 || score == 80) && score < 90);  // 这个if后面不能有; { printf("the score is C\n"); } else if ((score > 90 || score == 90) && score < 100);  // 这里有;，没问题，但下面{}里面的就没有控制了 { printf("the score is B\n"); } }