Question: 求四舍五入函数

引用 18 楼 finalfantasy_xu 的回复:网上不是到处都是？我搜过了，没有，不一样的，这个比较难

网上不是到处都是？

#include <stdio.h> #include <math.h> double Round(double x, int d) {     double dRetval;     double dMod = 0.0000001;     if (x<0.0) dMod=-0.0000001;     dRetval=x;     dRetval+=(5.0/pow(10.0,d+1.0));     dRetval*=pow(10.0,d);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,d);     return dRetval; } int main(void) {     int n;     double x;     scanf("%lf%d",&x,&n);     printf("%g\n",Round(x,n));      return 0; } //输入123.456 2 //输出123.46

引用 14 楼 是疗伤烧肉粽~ 的回复:[quote=引用 12 楼 赵4老师 的回复:]//Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } 编译错误[/quote] 自己将sprintf改为sprintf_s,scanf改为scanf_s

引用 11 楼 NorZ 的回复:[quote=引用 6 楼 是疗伤烧肉粽~ 的回复:][quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }这个不太行，在PTA有两个测试点没过，就过了一个[/quote]  因为他最后返回的时候强转了 int ...你给改成 double 应该就行[/quote]改了之后一个测试点都过不了

引用 12 楼 赵4老师 的回复://Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } 编译错误

引用 9 楼 NorZ 的回复:[quote=引用 8 楼 NorZ 的回复:][quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }  像这种输入的 double 数值，直接和 0 比较来判断正负就行，你这样写的话，都引入 math 库了，也就可以直接用 math 库的 round 函数来四舍五入 x*m ，那也没有判断正负的必要了[/quote]   # include <math.h> double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     return (double)(round(x*m)/(1.0*m)); } [/quote]谢了，但还有一个测试点运行超时

你的需求可能需要写asm 代码，幂计算需要协处理器可能比较慢。难点在于二进制小数位的判断，需要使用数表（事先计算好二进制对应的进位项位数，阈值，进位后的值）。否则就需要使用bcd码像处理字符那样逐位操作。

引用 6 楼 是疗伤烧肉粽~ 的回复:[quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }这个不太行，在PTA有两个测试点没过，就过了一个[/quote]  因为他最后返回的时候强转了 int ...你给改成 double 应该就行

就你题目上的例子: 123.4562 123.46  让123.4562 * 100    也就是  12345.62  这时候也就可以用哪个方法，四舍五入就是12346 然后12346   / 100    也就是 123.46了  也就是 123.4562 * 10^n  四舍五入 然后 / 10^n（n为保留的位数）

引用 8 楼 NorZ 的回复:[quote=引用 5 楼 qzjhjxj 的回复:]供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }  像这种输入的 double 数值，直接和 0 比较来判断正负就行，你这样写的话，都引入 math 库了，也就可以直接用 math 库的 round 函数来四舍五入 x*m ，那也没有判断正负的必要了[/quote]   # include <math.h> double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     return (double)(round(x*m)/(1.0*m)); }

引用 5 楼 qzjhjxj 的回复:供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }  像这种输入的 double 数值，直接和 0 比较来判断正负就行，你这样写的话，都引入 math 库了，也就可以直接用 math 库的 round 函数来四舍五入 x*m ，那也没有判断正负的必要了

引用 2 楼 突触 的回复:浮点型转整型时，是去掉小数部分(也可以称为向零求正) 如:    (int)1.6 -> 1 (int)1.3 -> 1 当浮点型为正数时加上0.5    (int)(1.6+0.5)  = (int)2.1 -> 2 (int)(1.3+0.5)  = (int)1.8 -> 1 不做理论证明直接说结论   当浮点型为正数时，浮点型+0.5 在转为整型就相当于四舍五入  当浮点型为负数的时候就需要    -0.5  具体代码  #include <STDIO.H>  int Fun_To(float n) { 	float a=0.5f; 	int sign= *(int*)&n & 0x80000000;  //取正号或负号 									   // 0x3F000000  是浮点型的0.5 这里直接用16进制表示了 	int h= 0x3F000000 | sign;		   // 根据符号转为  -0.5或 +0.5 	return n + *(float*)&h;            // 浮点型加 +/- 0.5 }  int main(int argc, char* argv[]) { 	 	printf("%d\n",Fun_To(-3.6));  	return 0; }  你这个只能一个小数点才能，多个小数就不行了

引用 5 楼 qzjhjxj 的回复:供参考：# include <math.h> #define DoubleCompare(a,b)((fabs(a-b)< 1E-10) ? 0 : 1)  double Round(double x, int n) {     int   m=1;     while (n--)m*=10;     if ( DoubleCompare(x,1E-10) > 0 )         return (int)((x*m)+0.5)/(1.0*m);     else         return (int)((x*m)-0.5)/(1.0*m);//负数 }这个不太行，在PTA有两个测试点没过，就过了一个

等级  勋章Blank	 抱歉 没有仔细看题目   如果你愿意的话 ， 还是可以用上面的方法 用浮点型 乘以 10^n， 四舍五入后 在除以10^n

这个对吗 我咋运行不了 下面给我来个这 id returned 1 exit status 请问这该怎么办


Question: 求助malloc创建字符串并赋值！

引用 1 楼 user-4 的回复: printf("%s\n", a);   没有以'\0'结束呢，这不算是一个字符串呢；

而且缺少结束符

c 语言字符串要以 '\0' 结束。 以下代码供参考  #include <stdio.h> #include <stdlib.h> #define N 5 int main() {     char *a = (char*)malloc((N+1) * sizeof(char));    int i;     for( i=0; i<N;i++)     {         *(a+i) = '1';     }    *(a+i) = '\0';     printf("%s\n", a);    return 0 ; }

printf("%s\n", a);


Question: C语言指针问题

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

指针当参数只能修改它指向的内存地址里面的东西，而不能修改指针的指向。

main函数的s和fun函数里的s是两个独立的变量。所以main里的s在经过fun函数之后是没有变化的，还是指向a的。  因为实参s把a的地址传给fun函数的形参s，然后形参没有对a做任何操作；只是形参s又指向了calloc申请的空间，并且把a，b数据内容相加给了s（形参），那么这个s和main函数里的s什么关系呢？calloc申请的空间需要手动释放～  如果fun第三参数传递的是double **s，实参是&s，那么main里的s指向的calloc申请的空间，*s是相加之和

在fun()函数体内，*s 所指向的是 s = (double *)calloc(1,sizeof(double))所生成的空间，并没按我们所想的那样，指向a[]数组的空间。


Question: vscode 中文乱码怎办？编写c

现在的电脑硬件都牛，直接用visual stdio吧，省事不少。 再说，真正做项目，估计很少人用vscode吧。。

右下角选择编码格式

贴代码。。。。

乱码这种东西，就像天上的浮云一样。 乱着乱着自己就散了。 你要是一时半会儿搞不定源文件编码，那就只用它来写新代码好了。 新写的又不乱。

这种问题还是自己百度吧。。。

看一下字符串是不是没有'\0'结束，还要看一下是不是越界了


Question: 求助 怎末简化这个程序

谢谢老师，

#include <stdio.h> #include <stdlib.h> #include <string.h> #define  MAX_people  30 char names     [MAX_people][50]; int  sex       [MAX_people]; int  time      [MAX_people]; int  num       [MAX_people]; int  temp_num  [MAX_people]; char temp_names[MAX_people][50]; int  temp_time [MAX_people]; int  temp_sex  [MAX_people]; int  sort      [MAX_people]; int i, j; void people_scanf(int n) {     for (i = 0; i<n; ++i) {         printf("\n请输入第%d个顾客的信息:\n", i + 1);         printf("\n身份证号:"); scanf("%d", &num[i]);         printf("\n姓名:");     scanf("%s", names[i]);         printf("\n性别:");     scanf("%d", &sex[i]);         printf("\n入住时间:"); scanf("%d", &time[i]);     } } void people_printf(int n) {     printf("\n身份证号\t姓名\t入住时间\t性别\n");     printf("-------------------------------------------------------\n");     for (i = 0; i<n; ++i) {         printf("%d\t%s\t%d\t%d\n", num[i], names[i], sex[i], time[i]);     }     printf("-------------------------------------------------------\n"); } int people_find_num(int n) {     int nums;     int result;      printf("请输入待查找的顾客身份证号:");     scanf("%d",&nums);     result= -1;     for (i = 0; i<n; ++i) {         if (nums == num[i]) {             result = i;             break;         }     }     if (result == -1) {         printf("没有该顾客信息!\n");         return 0;     } else {         printf("\n身份证号\t姓名\t入住时间\t性别\n");         printf("%d\t%s\t%d\t%d\t", num[result], names[result], time[result], sex[result]);         printf("打印出查找结果!\n");     }     return 1; } int people_find_name(int n) {     char name[200];     int result;      printf("请输入待查找的顾客姓名:");     scanf("%s", name);     result = -1;     for (i = 0; i<n; ++i) {         if (strcmp(name, names[i]) == 0) {             result = i;             break;         }     }     if (result == -1) {         printf("没有该顾客信息!\n");         return 0;     } else {         printf("\n身份证号\t姓名\t入住时间\t性别\n");         printf("%d\t%s\t%d\t%d\t", num[result], names[result], time[result], sex[result]);         printf("已完成查找!\n");     }     return 1; } int people_alter_name(int n) {     char name[50];     int result;      printf("请输入待修改的顾客姓名:");     scanf("%s",name);     result= -1;     for (i = 0; i<n; ++i) {         if (strcmp(name,names[i])==0) {             result = i;             break;         }     }     if (result == -1) {         printf("没有该顾客信息!\n");         return 0;     } else {         printf("请重新输入该顾客信息：\n");         printf("身份证号："); scanf("%d",&num[result]);         printf("姓名：");     scanf("%s",names[result]);         printf("入住时间："); scanf("%d",&time[result]);         printf("性别：");     scanf("%d",&sex[result]);     }     return 1; } int people_delete_name(int n) {     char name[50];     int result;      printf("请输入待删除的顾客姓名:");     scanf("%s",name);     result= -1;     for (i = 0; i<n; ++i) {         if (strcmp(name,names[i])==0) {             result = i;             break;         }     }     if (result == -1) {         printf("没有该顾客信息!\n");         return 0;     } else {         for(i=result; i<n-1; ++i) {             num[i] = num[i+1];             strcpy(names[i],names[i+1]);             time[i] = time[i+1];             sex[i] = sex[i+1];         }     }     return 1; } int main() {     int choice,n;     while (1) {         printf("*************************************\n"                "欢迎使用酒店信息管理系统\n"                "[1] 输入所有顾客信息\n"                "[2] 按姓名查找某个顾客信息\n"                "[3] 按姓名修改某个顾客信息\n"                "[4] 按姓名删除某个顾客信息\n"                "[0] 退出程序\n"                "请输入您的选择（0 - 4）:");         rewind(stdin);         scanf("%d",&choice);         printf("**************************************)\n");         if (0==choice) {             printf("程序结束，谢谢使用!\n");             break;         }         switch (choice) {         case 1:             printf("请输入录入的顾客信息数： ");             scanf("%d",&n);             people_scanf(n);             break;         case 2:             people_find_name(n);             break;         case 3:             people_alter_name(n);             break;         case 4:             people_delete_name(n);             n--;             break;         default:             printf("您输入的菜单有误。请重新输入！\n");         }     }     return 0; }


Question: 怎样实现从网上下载的NTRU源代码？

引用 1 楼 赵4老师的回复:带Makefile，  Linux： make Windows： nmake git clone https://github.com/jschanck/ntru.git cd ref-ntruhrss701 && make cd ../avx2-ntruhrss701 && make，老师，我在执行这些步骤时，第二步第三步，出现了make错误126，127。为什么啊

带Makefile，  Linux： make Windows： nmake


Question: 求助：C语言strcat函数疑惑

char s1[20]=... char s2[20]=... char s3[20]=... 即可。 必要时再扩大。

因为你没有给它们分配足够的空间。 都挤在一起的时候，s2的脚趾头不小心碰到s1的鼻孔也可以理解的。


Question: 数组解决问题，求大佬帮忙，急急急！

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

引用 7 楼 m0_56240570 的回复:[quote=引用 5 楼 自信男孩的回复:]贴源码吧，数组其实就是一段连续的内存；用malloc/calloc等申请的空间一样可以作为数组使用。 刚学，不太懂怎么写，可以具体一点吗？[/quote] 先自己试着写写，这样的例子我想书本上也是有的。给你写好，调好，那么你能学到什么？稍微修改一下需求，一样还是不会，自己要试着练练～

重新排版下，数组数量设为题目要求的10个：//产品销售记录包括 产品代码 名称 单价 数量 金额 等信息 //1）编写input函数 输入10个产品销售记录的如上信息 //2）编写sum函数 计算金额 = 单价 * 数量 //3）编写sort函数 按金额从大到小排序  #include<stdio.h> #define PRODUCTS 10 //按题目要求10个产品  void  input(); float sum(float a,int n); void  sort();   typedef struct{ //自定义结构体类型 	int   code; 	char  name[21]; 	float price; 	int   quantity; }PRODUCT;  PRODUCT products[PRODUCTS];//定义10个产品记录的数组  void main() {       input(); //输入       sort();  //排序,从大到小       for(int i = 0; i < PRODUCTS; i++){ //打印输出        printf("code = %d | quantity = %d | price = %.2f | name = %s | sum = %.2f\n",              products[i].code,products[i].quantity,products[i].price,products[i].name,              sum(products[i].price,products[i].quantity));       }        }  void input(){      printf("Enter example:code,quantity,price,name(30)\n");      for(int i = 0; i < PRODUCTS; i++){         scanf("%d %d %f %s", &products[i].code,&products[i].quantity,                                    &products[i].price,products[i].name); 	} }  float sum(float a,int n) {      return a * n; }  void sort(){       PRODUCT temp;       for (int i = 0; i <PRODUCTS -1 ;i++){          for (int k = 0; k < PRODUCTS - 1 -i ;k++){            if((products[k].price * products[k].quantity)<                                   (products[k+1].price * products[k+1].quantity))            {                  temp          = products[k];                  products[k]   = products[k+1];                  products[k+1] = temp;            }          }       } }   //Enter example:code,quantity,price,name(30) //11 20 2.00 aa //22 30 1.00 bb //33 10 3.00 cc //code = 11 | quantity = 20 | price = 2.00 | name = aa | sum = 40.00 //code = 22 | quantity = 30 | price = 1.00 | name = bb | sum = 30.00 //code = 33 | quantity = 10 | price = 3.00 | name = cc | sum = 30.00 //请按任意键继续. . .

改好，供参考：//产品销售记录包括 产品代码 名称 单价 数量 金额 等信息 //1）编写input函数 输入10个产品销售记录的如上信息 //2）编写sum函数 计算金额 = 单价 * 数量 //3）编写sort函数 按金额从大到小排序  #include<stdio.h> #define PRODUCTS 3  void input(); float sum(float a,int n); void sort();   typedef struct{ //自定义结构体类型 	int code; 	char name[21]; 	float price; 	int quantity; }PRODUCT;  PRODUCT products[PRODUCTS];  void main() { 	input(); //输入 	sort();  //排序,从大到小         for(int i = 0; i < PRODUCTS; i++){ //打印输出            printf("code = %d | quantity = %d | price = %.2f | name = %s | sum = %.2f\n",products[i].code,            products[i].quantity,products[i].price,products[i].name,sum(products[i].price,products[i].quantity)); 	}         system("pause"); }  void input(){         printf("Enter example:code,quantity,price,name(30)\n"); 	for(int i = 0; i < PRODUCTS; i++){ 		scanf("%d %d %f %s", &products[i].code,&products[i].quantity,                                          &products[i].price,products[i].name); 	} }  float sum(float a,int n) { 	return a * n; }  void sort(){ 	PRODUCT temp; 	for (int i = 0; i <PRODUCTS -1 ;i++){             for (int k = 0; k < PRODUCTS - 1 -i ;k++){                  if( (products[k].price * products[k].quantity) < products[k+1].price * products[k+1].quantity){ 				temp          = products[k]; 				products[k]   = products[k+1]; 				products[k+1] = temp; 			} 		} 	} }   //Enter example:code,quantity,price,name(30) //11 20 2.00 aa //22 30 1.00 bb //33 10 3.00 cc //code = 11 | quantity = 20 | price = 2.00 | name = aa | sum = 40.00 //code = 22 | quantity = 30 | price = 1.00 | name = bb | sum = 30.00 //code = 33 | quantity = 10 | price = 3.00 | name = cc | sum = 30.00 //请按任意键继续. . .：

引用 5 楼 自信男孩的回复:贴源码吧，数组其实就是一段连续的内存；用malloc/calloc等申请的空间一样可以作为数组使用。 刚学，不太懂怎么写，可以具体一点吗？

引用 3 楼 user-3的回复:是数组呀，结构体数组products[PRODUCTS]：#define PRODUCTS 3//数组的大小，这里预设为3  //函数原型 void input(); float sum(); void sort(); 	 //自定义结构体类型 typedef struct{ 	int code;    //产品代码 	char name[21];//产品名称 	float price;   //产品价格 	int quantity; //产品数量 }PRODUCT;  PRODUCT products[PRODUCTS],*p_product = products;//这里定义了一个结构体数组products[3],一个指向数组的指针p_product   后边是指针，需要用数组写

引用 3 楼 user-3的回复:是数组呀，结构体数组products[PRODUCTS]：#define PRODUCTS 3//数组的大小，这里预设为3  //函数原型 void input(); float sum(); void sort(); 	 //自定义结构体类型 typedef struct{ 	int code;    //产品代码 	char name[21];//产品名称 	float price;   //产品价格 	int quantity; //产品数量 }PRODUCT;  PRODUCT products[PRODUCTS],*p_product = products;//这里定义了一个结构体数组products[3],一个指向数组的指针p_product   下面是指针啊，后边怎么写啊


Question: C语言malloc与结构体调用

引用 8 楼 真相重于对错的回复:printf("\n%d\n", ZA1->data);//这里还没有给data赋值，就要打印它，会出错 ZA1->data = ZA; 谢谢回复，已解决

引用 7 楼 赵4老师的回复:#include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct MyString {     unsigned char* data;     int size; } MyString;  char* ConvertStringAsHex(MyString*);  //将字符串转换为16进制数串 char* ConvertStringAsHex(MyString* s) {     char* result = (char*)malloc(sizeof(char) * (s->size * 2 + 1));     for (int i = 0; i < s->size; i++) {         sprintf(&result[i * 2], "%02X", s->data[i]);     }     result[s->size * 2] = '\0';     return result; }  int main() {     char *ID = "aaabbb";     char *ENTLA = "123";     unsigned char *ZA = (unsigned char*)malloc(sizeof(unsigned char)*strlen(ENTLA) + strlen(ID) + 1);     memcpy(ZA, ENTLA,strlen(ENTLA));     memcpy(ZA+strlen(ENTLA), ID, strlen(ID));     ZA[strlen(ENTLA) + strlen(ID)] = '\0';     printf("ZA:[%s]\n",ZA);     MyString *ZA1 = (MyString*)malloc(sizeof(MyString));     ZA1->size = strlen((char *)ZA);     printf("strlen(ENTLA) + strlen(ID):%d\n", strlen(ENTLA) + strlen(ID));     ZA1->data = ZA;     printf("ZA1->data:[%s]\n",ZA1->data);     char *ZAstring = ConvertStringAsHex(ZA1);     printf("ZAstring:[%s]\n", ZAstring);     free(ZAstring);     free(ZA1);     free(ZA);     printf("End\n");     return 0; } //ZA:[123aaabbb] //strlen(ENTLA) + strlen(ID):9 //ZA1->data:[123aaabbb] //ZAstring:[313233616161626262] //End //  谢谢您，可算是懂了

引用 3 楼 真相重于对错的回复:贴代码，不要贴图 代码贴评论区了，拜托指点

这是源代码 #ifndef MYSTRING_H #define MYSTRING_H  typedef struct MyString { 	unsigned char* data; 	int size; }MyString;  char* ConvertStringAsHex(MyString*);  #endif  #include<stdio.h> #include<stdlib.h> #include "MyString.h"  //将字符串转换为16进制数串 char* ConvertStringAsHex(MyString* s) { 	char* result = (char*)malloc(sizeof(char) * (s->size * 2 + 1)); 	for (int i = 0; i < s->size; i++) { 		sprintf_s(&result[i * 2], "%02X", s->data[i]); 	} 	result[s->size * 2] = '\0'; 	return result; }   void main() { char *ID = "aaabbb"; char *ENTLA = "123"; unsigned char *ZA = (unsigned char*)malloc(sizeof(unsigned char)*strlen(ENTLA) + strlen(ID) + 1); memcpy(ZA, ENTLA,strlen(ENTLA)); memcpy(ZA+strlen(ENTLA), ID, strlen(ID)); ZA[strlen(ENTLA) + strlen(ID)] = '\0'; printf("\n%s",ZA); Mystring *ZA1 = (Mystring*)malloc(sizeof(Mystring)); ZA1-> = strlen(ZA); printf("\n%d\n", strlen(ENTLA) + strlen(ID)); printf("\n%d\n", ZA1->data); ZA1->data = ZA; printf("%s\n",ZA1->data); char *ZAstring = ConvertStringAsHex(ZA1); printf("%s\n", ZAstring); free(ZA1->data); free(ZA1); free(ZA); }

引用 1 楼 赵4老师的回复:没有printf输出语句，当然没有输出结果。 在 free(ZA1->data); 前加一句 printf("%s\n",ZAstring); 抱歉，截图误导了，添加过printf，运行不出来

贴代码，不要贴图

引用 楼主 weixin_45710571的回复:求助， 调用结构体后为什么无法输出ZAstring字符串结果？编译通过的     抱歉，截图误导了，添加过printf，运行不出来


Question: C语言求助

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

查阅函数原型，是为了对照它强制转换一下实参类型，以消除你问题里的警告。

引用 2 楼 forever74的回复:FindWindow是个Win32 API，声明为  WINUSERAPI HWND WINAPI FindWindowA(     _In_opt_ LPCSTR lpClassName,     _In_opt_ LPCSTR lpWindowName); WINUSERAPI HWND WINAPI FindWindowW(     _In_opt_ LPCWSTR lpClassName,     _In_opt_ LPCWSTR lpWindowName);  FindWindow不是个函数吗

引用 2 楼 forever74的回复:FindWindow是个Win32 API，声明为  WINUSERAPI HWND WINAPI FindWindowA(     _In_opt_ LPCSTR lpClassName,     _In_opt_ LPCSTR lpWindowName); WINUSERAPI HWND WINAPI FindWindowW(     _In_opt_ LPCWSTR lpClassName,     _In_opt_ LPCWSTR lpWindowName);  意思是，这个还需要提前声明吗？

FindWindow代码呢？  贴图片比较方便，但是也需要把相关的代码都拍下来的，要么直接发源码，如果不保密的


Question: 拜托帮忙看一下代码的问题！谢谢！（急！

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

#include<stdio.h> #include<stdlib.h>  typedef int ElemType; typedef struct LNode {     ElemType data;     //struct Lnode *next;     struct LNode *next; }LNode,*LinkList;  //void CreateList_L(LinkList L) void CreateList_L(LinkList *L) {     *L=(LinkList)malloc(sizeof(LNode));     (*L)->next=NULL;     int i;     LinkList p,q;     p = *L;     char c;     //for(;;i++)     for(;;)     {         while(p->next)             p = p->next;         q=(LinkList)malloc(sizeof(LNode));         scanf("%d",&q->data);         printf("%d\n", q->data);         p->next=q;         q->next=NULL;         //if(c=getchar()=='\n')break;         if((c=getchar())=='\n') //少一个括号             break;     } } int main() {     LinkList LA,LB,LC;     CreateList_L(&LA);     CreateList_L(&LB);     LC=(LinkList)malloc(sizeof(LNode));     LC->next=NULL;      LinkList p=LA,q=LB,l1,l2;     //for(p=LA;p->next!=NULL;p=p->next)     for(p=LA->next;p !=NULL;p=p->next)     {         //for(q=LB;q->next!=NULL;q=q->next)         for(q=LB->next;q!=NULL;q=q->next)         {             if((q->data)==(p->data))             {                 l2=LC;                 while(l2->next)                     l2=l2->next;                 l1=(LinkList)malloc(sizeof(LNode));                 //l1=l2;                 l1->data=q->data;                 l2->next=l1;                 l1->next=NULL;                 l2 = l1;             }         }     }      p=LA;     LinkList u=LA;     while(p->next)     {         u=p;         p=p->next;         free(u);     }     q=LB;     u=LB;     while(q->next)     {         u=q;         q=q->next;         free(u);     }      l2=LC->next;     //while(l2->next)     while(l2)     {         /*         if(l2->next==NULL)printf("%d\n",l2->data);         else printf("%d ",l2->data);         */         printf("%d ",l2->data);         l2=l2->next;     }     putchar(10);     return 0; }  供参考～

一个参数指针，函数里只能通过修改他指向的内容，而不能修改他的指向。


Question: 大佬求解

引用 1 楼 user-2 的回复：供参考：#include<stdio.h> #include<math.h> int isPrime(int n); int main() {     int n,m,sum=0;     scanf("%d",&n);     while (n--){           scanf("%d",&m);           if (isPrime(m)) sum += m;     }     printf("%d",sum);          return 0; }  int isPrime(int n) {     if (n <= 3) {         return n > 1;     }     int sqr = (int)sqrt(n);     for (int i = 2; i <= sqr; i++) {         if(n % i == 0) {             return 0;         }     }     return 1; }感谢大佬[face]monkey2:003.png[/face]


Question: 这样为啥不对啊

贴源码吧，方便调试～

楼主的代码只是把p的地址赋值给了q，这样q还是一个孤零零的节点。并没有插入到链表中  如果楼主要插入到链表中，需要定义另外一个节点pre，即要插入节点的前一个节点，q->next = p; pre->next = q;

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

引用 4 楼 user-5 的回复:插入函数，供参考：struct ListNode *insert(pp head,int x){      pp p,pr,q;      q=(pp)malloc(sizeof(qq));      q->data = x;      pr=head;      p=head->next;      while(p){            if(p->data >= x) {               if(p->data == x) break;               else{                    q->next = pr->next;//找到了p，插在p的前面一个节点。                    pr->next = q;                    break;               }            }            pr = p;            p  = p->next;      }      return head; } 如果插入的点在head之前呢，这个没有考虑 另外，head一定是有效的吗？可能是NULL不？所以需要多加一些判断～   q->next = pr->next;//找到了p，插在p的前面一个节点。     //上面这句可以改一下，改成如下：    //q->next = p; //这样会比较好理解了～否则后面的注释容易对你的q->next = pr->next产生误解～                    pr->next = q;                    break;

嗯，作弊的方式是把新节点q放在p的后面，然后悄悄交换它俩的data

这里不对吧，q=(pp)malloc(sizeof(pp));


Question: 有没有大佬教教我AVX512指令集

set和shuffle能一样吗？


Question: 位运算符／二进制／十六进制

你的编译器的技术路线是发现你使用有符号的整数进行右移的时候，就决定维持符号位不变。 符号位原来是1，所以左边移位进来的就全是1了。


Question: 乌班图20.04系统下，安装成功matlab2015，但是启动时总是报错：段错误（核心已转储））

楼主解决了 ，我也有同样的问题

引用 3 楼 niuiic 的回复:如果是matlab2020，那就是少了一个库。2015也有可能是这个问题。具体哪个我忘了，博客也删了，到matlab论坛看一下吧，当初的回复还在。我安装的是matlab2015

引用 1 楼 user-4 的回复:不确切，猜测：安装过程结束之前有没有让你执行某个脚本进行初始化的？或者让你自行修改点什么？这个没有，安装完成之后，进行激活，激活成功之后，执行matlab就会报错，

继续猜：sudo  ?


Question: 请问各位大佬，不定长数据域协议帧解析问题

引用 7 楼 forever74 的回复:就是各种转换指针类型嘛， frame是指针，管1个字节，frame+4也是。 把它强制转换为uint8_t *[4]类型也就是指针变量data的类型，就是为了让它变成管4个字节的指针类型，用来给data指针赋值。  下面那个类似，多了一个解引用也就是取目标，但是没有特意考虑字节序，如果字节序不对，就不能这样写。  非常感谢您花费时间讲解 我再去消化研究一下

引用 5 楼 user-2 的回复:2字节的数据帧长度要注意高低字节序，一般要用socket函数互相转换： htons()、ntohs()  虽然这个问题里不涉及区分大端小端 还是非常感谢您让我知道了这两个函数 挺实用的 谢谢！

本来等着你说处理全帧的不如边接收边处理来得效率高呢。

引用 3 楼 forever74 的回复:uint8_t * frame=...; //带头的全帧首地址 uint8_t (*data)[4]=(uint8_t *[4])(frame+4); short int len=(*(short int *)(frame+2)-4)/4; //假设帧长度包括头不包括尾校验 int i; for(i=0;i<len;i++) {     do_someting_on data[i]; }  您好，本人接触编程时间不长，请问这串代码怎么理解呢 谢谢 (uint8_t *[4])(frame+4);  就是(uint8_t *[4])这样的表达方式没有见过  以及(*(short int *)(frame+2)-4)

谢谢您的思路

|start | Command | Data                      | CRC  |  |0xAA  | 0xDD       |   需要解析的部分    |         |  ---------------------------------------------------- 意思是 怎么把frame_datafield[]这个数组里的元素 按4个一组 4个一组 分别提取出来

你那儿有数据帧长度啊，所以你问的实际上是什么？


Question: openresty TCP代理，动态分配监听的端口供客户端连接

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


Question: 不知道为什么运行不出结果？

#include <stdio.h> #include<stdlib.h>  #define Maxize 20  typedef int datatype; typedef struct list {     datatype data[Maxize];     int length;  }squenlist;  void crealist(squenlist *b1,int a[],int n) {     int i,j=0;     for(i=0;i<n;i++)     {         b1->data[i]=a[j];         j++;     }     //b1->length=j+1;     b1->length=j;   //最后一次的j已经加1了，所以不用再加1了，否则就超出有效数据的大小了 } void displaylist(squenlist *b1) {     int i=0;     for(i=0;i<b1->length;i++)     {         printf("%d ",b1->data[i]);     }     printf("\n"); } int main() {     int a[5]={10,20,30,40,50},n;     n=5;     //squenlist *b1;     squenlist b1;     crealist(&b1,a,n);     displaylist(&b1);     return 0; } 供参考～ *b1是野指针 使用野指针了，所以没有输出。

供参考：#include <stdio.h> #include<stdlib.h> #define Maxize 20 typedef int datatype; typedef struct list {     datatype data[Maxize];     int length;  }squenlist;  void crealist(squenlist *b1,int a[],int n) {     int i,j=0;     for(i=0;i<n;i++)     {        b1->data[i] = a[j];        j++;     }     b1->length=j;//b1->length=j+1; }  void displaylist(squenlist *b1) {     int i=0;     for(i=0;i<b1->length;i++)     {       printf("%d ",b1->data[i]);     }     printf("\n"); }  int main() {     int a[5]={10,20,30,40,50},n;     n=5;     squenlist *b1 = (squenlist *)malloc(sizeof(squenlist));//b1必须给它申请一片天呢     crealist(b1,a,n);     displaylist(b1);          return 0; }


Question: 请问一下这句代码什么意思 感激不尽

bit7..bit0   hexbyte 01100000 0x60 00011111 0x1F  如果LunarCalendarTable[year-1901]中的值对应二进制位bit6,bit5对应值为1 给Spring_NY赋值为LunarCalendarTable[year-1901]中的值对应二进制位bit4～bit0对应值-1 ……


Question: 华科。视频播放。课设 老代码无法运行 求大佬帮助

见你的另一帖

easyx ？

引用 4 楼 赵4老师 的回复:在DosBox下使用 你说的对， 其实我只是找借口不想多干活。 咦，我这样坦白真的好么？

在DosBox下使用

没有环境没法测试。但可以肯定的是这个代码原本就没有好用过。  TC的图形库得用TC编译，关键注意几个： TC是16位环境，int=short是16位的，long才是32位的。文件里读入4字节写入int变量一定会越界出错的，而DOS对越界是纵容的。 搞清楚你准备用的图形文件的格式是否和代码描述的一致，会不会文件格式太新或者颜色深度太大什么的。 TC图形库的initgraph的第三个参数是个文件名字符串，这个文件是TC自带的图形驱动，原始名字似乎不是这个来着，确定一下文件在不在你说的位置，内容对不对，名字为啥改了。  想想穿越秦汉隋唐自建工业体系的难度，耐心吧。

引用 1 楼 赵4老师的回复:easyx ？ 不可以 dos 环境不支持


DosBox中测试楼主的代码是可以的，需要注意的是，显示的bmp需要16色，大小不超过64KB

在DosBox中使用TC ？

easyx ？

引用 1 楼 user-4的回复:Turbo C，这么老的IDE，谁想帮你都难。 最好用大众化的IDE，好交流，有问题也容易搜索解决。。 学校逼迫，不然谁会用这种东西


这个显示不了256色图，16色的可以

引用 4 楼 赵4老师的回复:easyx ? 没有用easyx

在DosBox中使用TC ？

easyx ?

引用 1 楼 user-4的回复:16位编程环境最基本的意思是int是16位的。 你的iw  ih 都只有2字节空间，你读进来4字节是要越界的。 图像长宽都错了的情况下，其他不正常现象恐怕就正常了  所以，我承认只看了几行，下面没看。 您这个我没听懂，我换了long也不行

ih和iw不是int类型吗


Question: 差个成绩排序和成绩统计功能，有大佬懂的嘛？弄了一下午实在是不会用链表排序。

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

引用 5 楼 自信男孩 的回复:[quote=引用 4 楼 weixin_51970786 的回复:][quote=引用 3 楼 weixin_51970786 的回复:][quote=引用 2 楼 自信男孩 的回复:][quote=引用 1 楼 自信男孩 的回复:]static int score_cmp(int s1, int s2) {     if (s1 > s2)         return 1;     else if (s1 == s2)         return 0;     else         return -1; }  void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt) {     struct _Student stu;     Node *p, *q;     int flag = 0;     if (!phead)         return;      p = q = phead;      for (;p;p = p->pNext)         for (;q;q = q->pNext) {             flag = 0;             switch (opt) {                 case 1:                 if (pcmp(p->stu.math, q->stu.math) > 0)                     flag = 1;                 break;                  case 2:                 if (pcmp(p->stu.english, q->stu.english) > 0)                     flag = 1;                 break;                  case 3:                 if (pcmp(p->stu.c, q->stu.c) > 0)                     flag = 1;                 break;                  case 4:                 if (pcmp(p->stu.pe, q->stu.pe) > 0)                     flag = 1;                 break;                  case 5:                 if (pcmp(p->stu.total, q->stu.total) > 0)                     flag = 1;                 break;             }              if (flag) {                 stu = p->stu;                 p->stu = q->stu;                 q->stu = stu;             }         } }  void Order()//成绩排序函数 {     struct _Student stu[N];     int b,i,j;     system("cls");     printf("请选择你想要排序的科目:1.数学  2.英语  3.C语言  4.体育  5.总成绩\n");     scanf("%d",&b);      bubble_sort(g_pHead, score_cmp, b);     } 排序逻辑，供参考～  没测试，建议用这个代码试一下，之前写过类似的，测试过没问题。先试试吧，这个有问题可以继续提问～[/quote]         请问如果排序完要按顺序输入该怎么写[/quote]打错了，是输出该怎么写[/quote]  那就是链表遍历的操作，如果不会网上搜搜。其实很简单  Node *p = g_head;  while(p) {     printf("%s %dxxxxx", p->stu.name,xxxx);     p = p->pNext; }  自己完善一下，封装成函数就好了 [/quote] #include<stdio.h> #include<conio.h> #include<stdlib.h> #define M 100  #define N 1000 //定义一个学生的信息 typedef struct _Student { 	char name[20];  //姓名 	int studid;//学号 	int math;       //数学成绩 	int english;    //英语成绩 	int c;          //C语言成绩 	int pe;         //体育成绩 	int total;      //总成绩 }Student; //定义一个节点 typedef struct _Node {    Student stu;//学生     struct _Node* pNext; }Node; Node*g_pHead=NULL;             //头结点  char password[20]="4396";            //管理员密码 void Menu();//声明菜单界面函数  void Input();//声明成绩录入函数  void Print();//声明成绩显示函数  void Save();//声明成绩保存函数 void Order();//声明成绩排序函数  void Modify();//声明成绩修改函数 void Sta();//声明成绩统计函数  void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt); int main(){ 	int a;  	while(1){  //while循环使程序持续运行  	Menu(); 	scanf("%d",&a); 	switch(a)//**用户进行选择**// { case 1: 	Input(); //成绩录入  	break; case 2: 	Print();//成绩显示  	break; case 3: 	Save();//成绩保存  	break; case 4: 	Order();//成绩排序  	break; case 5: 	Modify();//成绩修改  	break; case 6: 	printf("成绩统计\n"); 	break; case 7: 	printf("您已成功退出系统，欢迎下次使用！\n"); 	return 0; default: 	printf("无效选择，请重新输入\n"); 	break;  } }	 	return 0; }  void Menu()//菜单界面函数  {	         printf("\t\t\t欢迎使用学生班级成绩管理系统！\n");         printf("\t\t=============================================\n");         printf("\t\t==\t          主菜单                   ==\n");         printf("\t\t=============================================\n");         printf("\t\t==\t\t1.成绩录入                 ==\n");         printf("\t\t==\t\t2.成绩显示                 ==\n");         printf("\t\t==\t\t3.成绩保存                 ==\n");         printf("\t\t==\t\t4.成绩排序                 ==\n");         printf("\t\t==\t\t5.成绩修改                 ==\n");         printf("\t\t==\t\t6.成绩统计                 ==\n");         printf("\t\t==\t\t7.系统退出                 ==\n");         printf("\t\t=============================================\n");         printf("\t\t===========请选择相应的功能列表==============\n");      } void Input()//成绩录入函数 { 	Node* pNewNode =(Node*)malloc(sizeof(Node));//创建一个新节点  	pNewNode->pNext=NULL; 	if(g_pHead==NULL) 	{ 		g_pHead=pNewNode; 	} 	else 	{ 		pNewNode->pNext=g_pHead; 		g_pHead=pNewNode; 	} 	printf("请输入学生的姓名：\n"); 	scanf("%s",pNewNode->stu.name); 	printf("请输入学生的学号：\n"); 	scanf("%d",&pNewNode->stu.studid); 	printf("请输入学生的数学成绩：\n"); 	scanf("%d",&pNewNode->stu.math); 	printf("请输入学生的英语成绩：\n"); 	scanf("%d",&pNewNode->stu.english); 	printf("请输入学生的C语言成绩：\n"); 	scanf("%d",&pNewNode->stu.c); 	printf("请输入学生的体育成绩：\n"); 	scanf("%d",&pNewNode->stu.pe); pNewNode->stu.total=pNewNode->stu.math+pNewNode->stu.english+pNewNode->stu.c+pNewNode->stu.pe; //总成绩  	printf("学生成绩录入成功！\n"); 	system("pause");      //暂停执行 	system("cls");        //清屏 	 	 	 	 	 }  void Print()//成绩显示函数  { 	system("cls"); 	printf("                     学生成绩表                         \n"); 	printf("========================================================\n"); 	printf("姓名\t学号\t数学\t英语\tC语言\t  体育\t  总成绩\n"); 	//遍历链表，一次打印出学生的成绩 	Node* p=g_pHead; 	while(p!=NULL) 	{ 		 		printf("%s      %d    %d    %d    %d     %d    %d\n", 		p->stu.name,p->stu.studid,p->stu.math,p->stu.english,p->stu.c,p->stu.pe,p->stu.total); 		p=p->pNext;//指向下一个，少了这个会无限循环  	 }  	system("pause"); } void Save()//成绩保存函数 {   //打开文件  	FILE* fp=fopen("StuInformation.data","w"); 	if(fp==NULL) 	{ 		printf("文件打开失败.\n"); 		return; 	} 	//再次遍历链表，保存学生的成绩 	Node* p=g_pHead; 	while(p!=NULL) 	{ 	  fwrite(&p->stu,1,sizeof(Student),fp); 	  p=p->pNext; 	}  	//关闭文件 	fclose(fp); 	printf("\n学生成绩保存成功！");      system("cls"); 	system("fause");//'fause' 不是内部或外部命令，也不是可运行的程序或批处理文件??	  }  static int score_cmp(int s1, int s2) {     if (s1 > s2)         return 1;     else if (s1 == s2)         return 0;     else         return -1; }   void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt) {     struct _Student stu;     Node *p, *q;     int flag = 0;     if (!phead)         return;       p = q = phead;       for (;p;p = p->pNext)         for (;q;q = q->pNext) {             flag = 0;             switch (opt) {                 case 1:                 if (pcmp(p->stu.math, q->stu.math) > 0)                     flag = 1;                 break;                   case 2:                 if (pcmp(p->stu.english, q->stu.english) > 0)                     flag = 1;                 break;                   case 3:                 if (pcmp(p->stu.c, q->stu.c) > 0)                     flag = 1;                 break;                   case 4:                 if (pcmp(p->stu.pe, q->stu.pe) > 0)                     flag = 1;                 break;                   case 5:                 if (pcmp(p->stu.total, q->stu.total) > 0)                     flag = 1;                 break;             }               if (flag) {                 stu = p->stu;                 p->stu = q->stu;                 q->stu = stu;             }         } }   void Order()//成绩排序函数 {     struct _Student stu[N];     int b,i,j;     system("cls");     printf("请选择你想要排序的科目:1.数学  2.英语  3.C语言  4.体育  5.总成绩\n");     scanf("%d",&b);       bubble_sort(g_pHead, score_cmp, b);	     Node *p =g_pHead;  while(p) {     printf("%d\n", p->stu.total);     p = p->pNext; } }    void Modify()//成绩修改函数   {   	int studid,c;   	char d[20];   	printf("请输入管理员密码：");   	scanf("%s",d);   	if(strcmp(password,d)==0)   	{   		printf("管理员登陆成功.\n");   		printf("请输入学生的学号:\n");    	scanf("%d",&studid);   	Node* p=g_pHead;   	while(p!=NULL)   	{   		if(p->stu.studid==studid)   		{   			printf("请输入要修改成绩的科目：1.数学  2.英语  3.C语言  4.体育\n");   			scanf("%d",&c);   			printf("请输入你要改的分数：\n");   			switch(c) 			  { 			  	case 1: 				scanf("%d",&p->stu.math); 				break; 				case 2: 				scanf("%d",&p->stu.english); 				break;			 				case 3: 				scanf("%d",&p->stu.c); 				break;								 				case 4: 				scanf("%d",&p->stu.math); 				break;			 			  } 			  system("cls"); 			  printf("成绩修改成功\n"); 			  system("pause");  			  break;      			   			 		  } 		  p=p->pNext;   		 	  } 	  if(p==NULL) 	  { 	  	printf("没有找到该学生的信息.\n"); 	  	system("pause"); 		system("cls"); 	  }   	 	  } 	while(strcmp(password,d)!=0) 	  { 	  	system("cls"); 	    printf("密码错误,返回主菜单\n"); 	    system("pause"); 	    break;  	 }   	    } 这是我已经改了的，为什么运行后打印出来的总分数还是乱序的？

引用 4 楼 weixin_51970786 的回复:[quote=引用 3 楼 weixin_51970786 的回复:][quote=引用 2 楼 自信男孩 的回复:][quote=引用 1 楼 自信男孩 的回复:]static int score_cmp(int s1, int s2) {     if (s1 > s2)         return 1;     else if (s1 == s2)         return 0;     else         return -1; }  void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt) {     struct _Student stu;     Node *p, *q;     int flag = 0;     if (!phead)         return;      p = q = phead;      for (;p;p = p->pNext)         for (;q;q = q->pNext) {             flag = 0;             switch (opt) {                 case 1:                 if (pcmp(p->stu.math, q->stu.math) > 0)                     flag = 1;                 break;                  case 2:                 if (pcmp(p->stu.english, q->stu.english) > 0)                     flag = 1;                 break;                  case 3:                 if (pcmp(p->stu.c, q->stu.c) > 0)                     flag = 1;                 break;                  case 4:                 if (pcmp(p->stu.pe, q->stu.pe) > 0)                     flag = 1;                 break;                  case 5:                 if (pcmp(p->stu.total, q->stu.total) > 0)                     flag = 1;                 break;             }              if (flag) {                 stu = p->stu;                 p->stu = q->stu;                 q->stu = stu;             }         } }  void Order()//成绩排序函数 {     struct _Student stu[N];     int b,i,j;     system("cls");     printf("请选择你想要排序的科目:1.数学  2.英语  3.C语言  4.体育  5.总成绩\n");     scanf("%d",&b);      bubble_sort(g_pHead, score_cmp, b);     /*     switch(b)     {         case 1:for(i=0;i<=M;i++)//数学成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].math>stu[i].math)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                         }                      }                }                for(;j<=M;j--)                {                    printf("%d",stu[j].math);                }                break;         case 2:for(i=0;i<=M;i++)//英语成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].english>stu[i].english)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 3:for(i=0;i<=M;i++)//C语言成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].c>stu[i].c)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 4:for(i=0;i<=M;i++)//体育成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].pe>stu[i].pe)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                }                break;         case 5:for(i=0;i<=M;i++)//总成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].total>stu[i].total)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                  }                break;         default: printf("无效操作，请重新输入.");     } */ } 排序逻辑，供参考～  没测试，建议用这个代码试一下，之前写过类似的，测试过没问题。先试试吧，这个有问题可以继续提问～[/quote]         请问如果排序完要按顺序输入该怎么写[/quote]打错了，是输出该怎么写[/quote]  那就是链表遍历的操作，如果不会网上搜搜。其实很简单  Node *p = g_head;  while(p) {     printf("%s %dxxxxx", p->stu.name,xxxx);     p = p->pNext; }  自己完善一下，封装成函数就好了

引用 3 楼 weixin_51970786 的回复:[quote=引用 2 楼 自信男孩 的回复:][quote=引用 1 楼 自信男孩 的回复:]static int score_cmp(int s1, int s2) {     if (s1 > s2)         return 1;     else if (s1 == s2)         return 0;     else         return -1; }  void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt) {     struct _Student stu;     Node *p, *q;     int flag = 0;     if (!phead)         return;      p = q = phead;      for (;p;p = p->pNext)         for (;q;q = q->pNext) {             flag = 0;             switch (opt) {                 case 1:                 if (pcmp(p->stu.math, q->stu.math) > 0)                     flag = 1;                 break;                  case 2:                 if (pcmp(p->stu.english, q->stu.english) > 0)                     flag = 1;                 break;                  case 3:                 if (pcmp(p->stu.c, q->stu.c) > 0)                     flag = 1;                 break;                  case 4:                 if (pcmp(p->stu.pe, q->stu.pe) > 0)                     flag = 1;                 break;                  case 5:                 if (pcmp(p->stu.total, q->stu.total) > 0)                     flag = 1;                 break;             }              if (flag) {                 stu = p->stu;                 p->stu = q->stu;                 q->stu = stu;             }         } }  void Order()//成绩排序函数 {     struct _Student stu[N];     int b,i,j;     system("cls");     printf("请选择你想要排序的科目:1.数学  2.英语  3.C语言  4.体育  5.总成绩\n");     scanf("%d",&b);      bubble_sort(g_pHead, score_cmp, b);     /*     switch(b)     {         case 1:for(i=0;i<=M;i++)//数学成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].math>stu[i].math)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                         }                      }                }                for(;j<=M;j--)                {                    printf("%d",stu[j].math);                }                break;         case 2:for(i=0;i<=M;i++)//英语成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].english>stu[i].english)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 3:for(i=0;i<=M;i++)//C语言成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].c>stu[i].c)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 4:for(i=0;i<=M;i++)//体育成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].pe>stu[i].pe)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                }                break;         case 5:for(i=0;i<=M;i++)//总成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].total>stu[i].total)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                  }                break;         default: printf("无效操作，请重新输入.");     } */ } 排序逻辑，供参考～  没测试，建议用这个代码试一下，之前写过类似的，测试过没问题。先试试吧，这个有问题可以继续提问～[/quote]         请问如果排序完要按顺序输入该怎么写[/quote]打错了，是输出该怎么写

引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 自信男孩 的回复:]static int score_cmp(int s1, int s2) {     if (s1 > s2)         return 1;     else if (s1 == s2)         return 0;     else         return -1; }  void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt) {     struct _Student stu;     Node *p, *q;     int flag = 0;     if (!phead)         return;      p = q = phead;      for (;p;p = p->pNext)         for (;q;q = q->pNext) {             flag = 0;             switch (opt) {                 case 1:                 if (pcmp(p->stu.math, q->stu.math) > 0)                     flag = 1;                 break;                  case 2:                 if (pcmp(p->stu.english, q->stu.english) > 0)                     flag = 1;                 break;                  case 3:                 if (pcmp(p->stu.c, q->stu.c) > 0)                     flag = 1;                 break;                  case 4:                 if (pcmp(p->stu.pe, q->stu.pe) > 0)                     flag = 1;                 break;                  case 5:                 if (pcmp(p->stu.total, q->stu.total) > 0)                     flag = 1;                 break;             }              if (flag) {                 stu = p->stu;                 p->stu = q->stu;                 q->stu = stu;             }         } }  void Order()//成绩排序函数 {     struct _Student stu[N];     int b,i,j;     system("cls");     printf("请选择你想要排序的科目:1.数学  2.英语  3.C语言  4.体育  5.总成绩\n");     scanf("%d",&b);      bubble_sort(g_pHead, score_cmp, b);     /*     switch(b)     {         case 1:for(i=0;i<=M;i++)//数学成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].math>stu[i].math)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                         }                      }                }                for(;j<=M;j--)                {                    printf("%d",stu[j].math);                }                break;         case 2:for(i=0;i<=M;i++)//英语成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].english>stu[i].english)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 3:for(i=0;i<=M;i++)//C语言成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].c>stu[i].c)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 4:for(i=0;i<=M;i++)//体育成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].pe>stu[i].pe)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                }                break;         case 5:for(i=0;i<=M;i++)//总成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].total>stu[i].total)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                  }                break;         default: printf("无效操作，请重新输入.");     } */ } 排序逻辑，供参考～  没测试，建议用这个代码试一下，之前写过类似的，测试过没问题。先试试吧，这个有问题可以继续提问～[/quote]         请问如果排序完要按顺序输入该怎么写

引用 1 楼 自信男孩 的回复:static int score_cmp(int s1, int s2) {     if (s1 > s2)         return 1;     else if (s1 == s2)         return 0;     else         return -1; }  void bubble_sort(Node *phead, int (*pcmp)(int, int), int opt) {     struct _Student stu;     Node *p, *q;     int flag = 0;     if (!phead)         return;      p = q = phead;      for (;p;p = p->pNext)         for (;q;q = q->pNext) {             flag = 0;             switch (opt) {                 case 1:                 if (pcmp(p->stu.math, q->stu.math) > 0)                     flag = 1;                 break;                  case 2:                 if (pcmp(p->stu.english, q->stu.english) > 0)                     flag = 1;                 break;                  case 3:                 if (pcmp(p->stu.c, q->stu.c) > 0)                     flag = 1;                 break;                  case 4:                 if (pcmp(p->stu.pe, q->stu.pe) > 0)                     flag = 1;                 break;                  case 5:                 if (pcmp(p->stu.total, q->stu.total) > 0)                     flag = 1;                 break;             }              if (flag) {                 stu = p->stu;                 p->stu = q->stu;                 q->stu = stu;             }         } }  void Order()//成绩排序函数 {     struct _Student stu[N];     int b,i,j;     system("cls");     printf("请选择你想要排序的科目:1.数学  2.英语  3.C语言  4.体育  5.总成绩\n");     scanf("%d",&b);      bubble_sort(g_pHead, score_cmp, b);     /*     switch(b)     {         case 1:for(i=0;i<=M;i++)//数学成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].math>stu[i].math)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                         }                      }                }                for(;j<=M;j--)                {                    printf("%d",stu[j].math);                }                break;         case 2:for(i=0;i<=M;i++)//英语成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].english>stu[i].english)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 3:for(i=0;i<=M;i++)//C语言成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].c>stu[i].c)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                    }                 }                break;         case 4:for(i=0;i<=M;i++)//体育成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].pe>stu[i].pe)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                }                break;         case 5:for(i=0;i<=M;i++)//总成绩排序                {                    for(j=i+1;j<=M;j++)                    {                        if(stu[j].total>stu[i].total)                        {                            x=stu[j];                            stu[j]=stu[i];                            stu[i]=x;                        }                     }                  }                break;         default: printf("无效操作，请重新输入.");     } */ } 排序逻辑，供参考～  没测试，建议用这个代码试一下，之前写过类似的，测试过没问题。先试试吧，这个有问题可以继续提问～


Question: C语言排序

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

for循环的第二个是j = 9;这个写的比较固定的，这个应该和n有关系的一个数。 另外，当j=9时，j+1不就是10了，Temp[10]是不是越界了？下表最大是不是应该为9，没看到你的数组长度，所以只能猜测

看着眼睛疼。直接上代码多好。。谁有空给你慢慢敲。。。


Question: MIPS问题

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


Question: clock()函数一直都是最大值

//printf("%d",duration ); printf("%lf\n",duration );  duration定义成double类型，然后%lf输出。 楼主的结果是0，因为不了解double和int类型数据在内存的存放是不一样的。建议楼主了解一下～

clock函数我看了，但是我直接main函数里就直接调用了clock，然后一执行，显示对应的clock_t的参数就是0xffffff，下面是对应的程序； int main(void) { clock_t start,end; start=clock(); sleep(500); end=clcok();  duration = (double)(end- start) / CLOCKS_PER_SEC; printf("%d",duration ); } 结果显示的是0 ；然后分步执行，查看对应的参数，start和end都是最大值0xffffff，

clock Calculates the processor time used by the calling process.  clock_t clock( void );  Routine Required Header Compatibility  clock <time.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  clock returns the number of clock ticks of elapsed processor time. The returned value is the product of the amount of time that has elapsed since the start of a process and the value of the CLOCKS_PER_SEC constant. If the amount of elapsed time is unavailable, the function returns –1, cast as a clock_t.  Remarks  The clock function tells how much processor time the calling process has used. The time in seconds is approximated by dividing the clock return value by the value of the CLOCKS_PER_SEC constant. In other words, clock returns the number of processor timer ticks that have elapsed. A timer tick is approximately equal to 1/CLOCKS_PER_SEC second. In versions of Microsoft C before 6.0, the CLOCKS_PER_SEC constant was called CLK_TCK.  Example   /* CLOCK.C: This example prompts for how long  * the program is to run and then continuously  * displays the elapsed time for that period.  */  #include <stdio.h> #include <stdlib.h> #include <time.h>  void sleep( clock_t wait );  void main( void ) {    long    i = 600000L;    clock_t start, finish;    double  duration;     /* Delay for a specified time. */    printf( "Delay for three seconds\n" );    sleep( (clock_t)3 * CLOCKS_PER_SEC );    printf( "Done!\n" );     /* Measure the duration of an event. */    printf( "Time to do %ld empty loops is ", i );    start = clock();    while( i-- )        ;    finish = clock();    duration = (double)(finish - start) / CLOCKS_PER_SEC;    printf( "%2.1f seconds\n", duration ); }  /* Pauses for a specified number of milliseconds. */ void sleep( clock_t wait ) {    clock_t goal;    goal = wait + clock();    while( goal > clock() )       ; }   Output  Delay for three seconds Done! Time to do 600000 empty loops is 0.1 seconds     Time Management Routines  See Also   difftime, time


Question: 球球各位大神看看吧！为什么while(p21)里面的循环执行不了

解决了！谢谢

修正5#楼的错误，change()函数还是实现修改功能的，我忘了修改后是没保存的，见代码：#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char   name[10];//用户     char   use[50];//用途     double income;//收入     double spend;//支出     char   time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head;     FILE *fp1;     struct message *p1,*p2;      if((fp1=fopen("money.in","r"))==NULL){         printf("cannot open file\n");         return 0;     }     if (head1 == NULL){         head1=(struct message* )malloc(sizeof(struct message));//生成头节点         head = head1;         head1->next=NULL;     }else{         for(head=head1;head->next!=NULL;head=head->next);//找到节点尾部     }     p2 = head;     while(1){         p1=(struct message* )malloc(sizeof(struct message));         if(fscanf(fp1,"%s %s %lf %lf %s %lf\n",p1->name,p1->use,&p1->income,                                              &p1->spend,p1->time,&p1->sum)!=6)break;         p1->next=NULL;                        //从文件里读入信息的各参数顺序和结构体里定义的顺序一样         if(head==NULL) head->next=p1;         //文件保存时也必须是按此顺序排列。         else p2->next=p1;         p2=p1;     }     fclose(fp1);     return head1; }  void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } }  void Change(struct message *head2)  //修改 {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,                      p21->income,p21->spend,p21->sum,p21->use,p21->time);         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)         {             if(strcmp(p22->name,name)==0)             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：");         scanf("%d",&choice);         //while(choice) //这里的while造成死循环,这里是想实现多项目多次的修改吗 ？         //{         switch(choice)             {             case 1:                 {                     printf("请输入更正后的姓名：");                     scanf("%s",p23->name);                     printf("修改成功\n");                     break;                 }             case 2:                 {                     printf("请输入更正后的收入金额：");                     scanf("%lf",&p23->income);                     printf("修改成功\n");                     break;                 }             case 3:                 {                     printf("请输入更正后的支出金额：");                     scanf("%lf",&p23->spend);                     printf("修改成功\n");                     break;                 }             case 4:                 {                     printf("请输入更正后的用途：");                     scanf("%s",p23->use);                     printf("修改成功\n");                     break;                 }             case 5:                 {                     printf("请输入更正后的使用时间：");                     scanf("%s",p23->time);                     printf("修改成功\n");                     break;                 }             case 0:break;             default:                    printf("请输入正确的序号：");                    break;             }         if(choice==2||choice==3)         {            if(p24==p23)            {               p24->sum=p23->income-p23->spend;            }            else              {                while(p24->next!=p23)                 {                   p24=p24->next;                 }                Correct(p24);              }          }         //}     }     else     {         printf("查无此人！");     } }  int main() {    struct message *head=NULL,*p;    head = Findfile(head);     for(p = head->next;p!= NULL; p=p->next)    //这里加两句，输出看看文件读入的情况，调试好可以删除        printf("%s %s %f %f %s %f\n",p->name,p->use,p->income,p->spend,p->time,p->sum);            int power=1;    if(power)    {        Change(head);    }     for(p = head->next;p!= NULL; p=p->next)            printf("%s %s %f %f %s %f\n",p->name,p->use,p->income,p->spend,p->time,p->sum);     system("pause");    return 0; }    //1111 gz 300.000000 100.000000 20210316 200.000000 //1122 gz 300.000000 100.000000 20210316 200.000000 //1133 gz 300.000000 100.000000 20210316 200.000000 //1144 gz 300.000000 100.000000 20210316 200.000000 //请输入要修改的人的名字：1111 //[1] 1111 300.00 100.00 200.00 gz 20210316 //选择要修改的账户信息的序号：1 //选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：1 //请输入更正后的姓名：5555 //修改成功 //5555 gz 300.000000 100.000000 20210316 200.000000 //1122 gz 300.000000 100.000000 20210316 200.000000 //1133 gz 300.000000 100.000000 20210316 200.000000 //1144 gz 300.000000 100.000000 20210316 200.000000 //请按任意键继续. . .

调通代码，但修改函数Change（）的功能没实现目标呢，似乎楼主考虑得太复杂了，其他问题见代码，供参考：#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char   name[10];//用户     char   use[50];//用途     double income;//收入     double spend;//支出     char   time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head;     FILE *fp1;     struct message *p1,*p2;      if((fp1=fopen("money.in","r"))==NULL){         printf("cannot open file\n");         return 0;     }     if (head1 == NULL){         head1=(struct message* )malloc(sizeof(struct message));//生成头节点         head = head1;         head1->next=NULL;     }else{         for(head=head1;head->next!=NULL;head=head->next);//找到节点尾部     }     p2 = head;     while(1){         p1=(struct message* )malloc(sizeof(struct message));         if(fscanf(fp1,"%s %s %lf %lf %s %lf\n",p1->name,p1->use,&p1->income,                                              &p1->spend,p1->time,&p1->sum)!=6)break;         p1->next=NULL;                        //从文件里读入信息的各参数顺序和结构体里定义的顺序一样         if(head==NULL) head->next=p1;         //文件保存时也必须是按此顺序排列。         else p2->next=p1;         p2=p1;     }     fclose(fp1);     return head1; }  void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } }  void Change(struct message *head2)  //修改 {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,                      p21->income,p21->spend,p21->sum,p21->use,p21->time);         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)                       //这段的算法没成功，就是不能实现下面的对信息的修改定位         {             if(strcmp(p22->name,name)==0)             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：");         scanf("%d",&choice);         //while(choice) //这里的while多余了，造成死循环         //{         switch(choice)             {             case 1:                 {                     printf("请输入更正后的姓名：");                     scanf("%s",p23->name);                     printf("修改成功");                     break;                 }             case 2:                 {                     printf("请输入更正后的收入金额：");                     scanf("%lf",&p23->income);                     printf("修改成功");                     break;                 }             case 3:                 {                     printf("请输入更正后的支出金额：");                     scanf("%lf",&p23->spend);                     printf("修改成功");                     break;                 }             case 4:                 {                     printf("请输入更正后的用途：");                     scanf("%s",p23->use);                     printf("修改成功");                     break;                 }             case 5:                 {                     printf("请输入更正后的使用时间：");                     scanf("%s",p23->time);                     printf("修改成功");                     break;                 }             case 0:break;             default:                    printf("请输入正确的序号：");                    break;             }         if(choice==2||choice==3)         //这段的算法和上面同样问题         {            if(p24==p23)            {               p24->sum=p23->income-p23->spend;            }            else              {                while(p24->next!=p23)                 {                   p24=p24->next;                 }                Correct(p24);              }          }         //}     }     else     {         printf("查无此人！");     } }  int main() {    struct message *head=NULL,*p;    head = Findfile(head);     for(p = head->next;p!= NULL; p=p->next)    //这里加两句，输出看看文件读入的情况，调试好可以删除        printf("%s %s %f %f %s %f\n",p->name,p->use,p->income,p->spend,p->time,p->sum);            int power=1;    if(power)    {        Change(head);    }    system("pause");    return 0; }  //下面是试运行的结果：  //1111 gz 300.000000 100.000000 20210316 200.000000 //1122 gz 300.000000 100.000000 20210316 200.000000 //1133 gz 300.000000 100.000000 20210316 200.000000 //1144 gz 300.000000 100.000000 20210316 200.000000 //请输入要修改的人的名字：1111 //[1] 1111 300.00 100.00 200.00 gz 20210316 //选择要修改的账户信息的序号：1 //选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：1 //请输入更正后的姓名：2211 //修改成功请按任意键继续. . .  这里运行时虽然显示修改成功，但再次读入时没有变化

#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char name[10];//用户     char use[50];//用途     double income;//收入     double spend;//支出     char time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head=NULL;     FILE *fp1;     //char c;     int c;     struct message *p1,*p2;     char name[10];//用户     char use[50];//用途     double income;//收入     double spend;//支出     char time[10];//使用时间     double sum;//余额      if((fp1=fopen("money.in","r"))==NULL)     {         printf("cannot open file\n");         return 0;     }     //while((c=fgetc(fp1))!=EOF)     while((c=fgetc(fp1))!=EOF)  //c表示不了EOF,因此要用int定义c     {         fseek(fp1,-1,SEEK_CUR);    //这儿的操作似乎没有意义～         p1=(struct message* )malloc(sizeof(struct message));         fscanf(fp1,"%s%lf%lf%lf%s%s\n",name,&income,&spend,&sum,use,time);         strcpy(p1->name,name);         strcpy(p1->use,use);         p1->income=income;         p1->spend=spend;         strcpy(p1->time,time);         p1->sum=sum;         p1->next=NULL;         if(head==NULL)             head=p1;         else             p2->next=p1;         p2=p1;     }      fclose(fp1);     return head1; } void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } } void Change(struct message *head2) {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,p21->income,p21->spend,p21->sum,p21->use,p21->time);             break;//这儿是不是应该跳出         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)         {             //if(strcmp(p22->name,name)==0) //比较有什么意义？if和else执行了基本上相同的逻辑除了k--             if(strcmp(p22->name,name)==0) //比较有什么意义？if和else执行了基本上相同的逻辑除了k--             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号：");         scanf("%d",&choice);         while(choice)         {             switch(choice)             {                 case 1:                     {                         printf("请输入更正后的姓名：");                         scanf("%s",p23->name);    //此时的p23是否为你要找的节点，我看不一定，可能是NULL                         printf("修改成功");                         break;                     }                 case 2:                     {                         printf("请输入更正后的收入金额：");                         scanf("%lf",&p23->income);                         printf("修改成功");                         break;                     }                 case 3:                     {                         printf("请输入更正后的支出金额：");                         scanf("%lf",&p23->spend);                         printf("修改成功");                         break;                     }                 case 4:                     {                         printf("请输入更正后的用途：");                         scanf("%s",p23->use);                         printf("修改成功");                         break;                     }                 case 5:                     {                         printf("请输入更正后的使用时间：");                         scanf("%s",p23->time);                         printf("修改成功");                         break;                     }                 case 0:break;                 default:                        printf("请输入正确的序号：");                        break;              }             if(choice==2||choice==3)             {                 if(p24==p23)                 {                     p24->sum=p23->income-p23->spend;                 }                 else                 {                     while(p24->next!=p23)                     {                         p24=p24->next;                     }                     Correct(p24);                 }              }         }     }     else     {         printf("查无此人！");     } } int main() {     struct message *head=NULL;     head=Findfile(head);     int power=1;     if(power)     {         Change(head);     }     return 0;  }  问题比较多，楼主的问题只是其中一个。建议楼主在Findfile函数执行完把创建的链表打印出来，确保进入Change函数里的链表是正常的。

修正#2楼的，第43，44行之间插入一行：fclose(fp1);（得把打开的文件关闭了）

供参考：#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char name[10];//用户     char use[50];//用途     double income;//收入     double spend;//支出     char time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head;     FILE *fp1;     struct message *p1,*p2;      if((fp1=fopen("money.in","r"))==NULL)     {         printf("cannot open file\n");         return 0;     }     if (head1 == NULL){         head1=(struct message* )malloc(sizeof(struct message));//生成头节点         head = head1;         head1->next=NULL;     }else{         for(head=head1;head->next!=NULL;head=head->next);//找到节点尾部     }     p2 = head;     while(1){         p1=(struct message* )malloc(sizeof(struct message));         if(fscanf(fp1,"%s%lf%lf%lf%s%s\n",p1->name,&p1->income,                      &p1->spend,&p1->sum,p1->use,p1->time)!=6)break;         p1->next=NULL;         if(head==NULL) head->next=p1;         else p2->next=p1;         p2=p1;     }     return head1; }  void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } }  void Change(struct message *head2) {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,                      p21->income,p21->spend,p21->sum,p21->use,p21->time);         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)         {             if(strcmp(p22->name,name)==0)             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号：");         scanf("%d",&choice);         while(choice)         {             switch(choice)             {             case 1:                 {                     printf("请输入更正后的姓名：");                     scanf("%s",p23->name);                     printf("修改成功");                     break;                 }             case 2:                 {                     printf("请输入更正后的收入金额：");                     scanf("%lf",&p23->income);                     printf("修改成功");                     break;                 }             case 3:                 {                     printf("请输入更正后的支出金额：");                     scanf("%lf",&p23->spend);                     printf("修改成功");                     break;                 }             case 4:                 {                     printf("请输入更正后的用途：");                     scanf("%s",p23->use);                     printf("修改成功");                     break;                 }             case 5:                 {                     printf("请输入更正后的使用时间：");                     scanf("%s",p23->time);                     printf("修改成功");                     break;                 }             case 0:break;             default:             printf("请输入正确的序号：");             break;              }             if(choice==2||choice==3)             {                 if(p24==p23)                 {                     p24->sum=p23->income-p23->spend;                 }                 else                 {                     while(p24->next!=p23)                     {                         p24=p24->next;                     }                     Correct(p24);                 }              }         }     }     else     {         printf("查无此人！");     } }  int main() {    struct message *head=NULL;    head = Findfile(head);    int power=1;    if(power)    {        Change(head);    }    return 0; }

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


Question: 用C语言数组最大值最小值碰到的问题

min 和 max的初始值都需要指定一个。

目标是消灭数组，直接求值   max    min  函数直接求值

min = max = a[0];是比较简单的初始话方法

最好的办法是将第一个数据赋值给max和min，这样最保险。否则当你输入的值都是负值的时候，你如果将max=min=0，结果也会有问题吧

哈哈，比较，总要有个初始值嘛。

引用 15 楼 智者知已应修善业的回复:学习编程能让人变得静思与反复推敲。 好的谢谢 懂了懂了

min的值是0，已经是非负数的最小值了。  int min = 100;

学习编程能让人变得静思与反复推敲。

就提问来说,数据类型是int应当知道有最大和最小的直接可以赋值INT_MIN,INT_MAX  引用 12 楼 Adorika 的回复:[quote=引用 5 楼 智者知已应修善业的回复:]通常最大值初始化为最小，最小值初始化为最大即可。 那应该怎么写呢[/quote]

引用 11 楼 Adorika 的回复:[quote=引用 3 楼 真相重于对错的回复:]因为你所有的数字都大于0，所以无法比较出来 做最大值最小值咋可能不大于零呢[/quote] 举个例子你就清楚了 比如你输入 1，2，3，4，5 所有值都比0大，那么这些值和0比较都大， 因此 if(min>a[i]) {  。。。。。 }//这个判断语句块永远不会执行。 循环结束后，min还是0

引用 5 楼 智者知已应修善业的回复:通常最大值初始化为最小，最小值初始化为最大即可。 那应该怎么写呢

引用 3 楼 真相重于对错的回复:因为你所有的数字都大于0，所以无法比较出来 做最大值最小值咋可能不大于零呢

引用 1 楼 赵4老师的回复:#include <stdio.h> #define N 30 int main() {     int a[N], min, max,  i, sum , avg;     printf("请输入%d名学生的成绩\n",N);     for (i=0; i < N; i++) {         while (1) {             printf("第%d名学生的成绩：",i+1);             fflush(stdout);             rewind(sstdin);             if (1==scanf_s("%d", &a[i]) {                 if (0<=a[i] && a[i]<=100) break;             }             printf("输入格式错误！请重新输入\n",N);         }     }     sum=0;     min=max=a[0];     for (i = 1; i < N; i++) {         sum += a[i];         if (a[i]<min) min = a[i];         if (a[i]>max) max = a[i];     }     avg = sum / N;     printf("最大值=%d\n", max);     printf("最小值=%d\n", min);     printf("平均值=%d\n", avg);     return 0; }  大佬 但是我们现在不用写这么 详细 感谢分享 十分有用

min = max = a[0]; 这句加上，初始化最大值和最小值。 要么就是按照楼上所说，把最大值定义成int能表示的最大正整数，min定义成int的最小值； 但是int在不同编译器里会有所不同，比如16位编译器和32位，64编译器里标识的位数不同；所以，还得考虑这个。 因此，min = max = a[0];是比较简单的初始话方法

我这样说才能令有所领悟，授之以渔。

引用 5 楼 智者知已应修善业 的回复:通常最大值初始化为最小，最小值初始化为最大即可。 此法不保险，且麻烦（对不同数值类型而言）。 个人意见，至少有一个数据的话，还是把最大值和最小值都初始化为第0个数据比较保险。

楼主可以这样运行下代码，看看max min avg输出什么，找找感觉：#define N 30 int main() {    int a[N], min, max, i, sum = 0, avg = 0;    /*printf("请输入30名学生的成绩：");    for (i=0; i < N; i++)    {      scanf_s("%d", &a[i]);    }    for (i = 0; i < N; i++)   {      sum += a[i];      if (min > a[i])      {        min = a[i];      }      if (max < a[i])      {       max = a[i];      }    }    avg = sum / N; */    printf("最大值=%d\n", max);    printf("最小值=%d\n", min);    printf("平均值=%d\n", avg);    system("pause");    return 0; } 最大值最小值比较大小，都是有限范围内的，值的大小也是相对的，是某一个范围内的大小，大小值肯定在特定区域内的一个，然后去比较。比如说去比较一个幼儿园小朋友的身高，如果设置初值：max=成人的身高，最后这个max还能找得到吗？

通常最大值初始化为最小，最小值初始化为最大即可。


Question: c语言malloc与sprintf函数调用

引用 4 楼 自信男孩的回复:x存放的是字符串，'0'对应0x30, '1'对应0x31依次向后0x39对应'9' 嗯嗯，懂了耶

引用 2 楼 user-2的回复:y[0]里面保存的是数值0 但是被sprintf写入x[0]里面的就是字符0了 下面再用%x格式输出字符0 当然看到的就是它的十六进制表现形式30了 谢谢呐，懂了懂了

不管是sprintf还是printf，不管内部是什么类型的东西，输出后的形式都是字符序列。 瞧，我连字符串都不说，因为字符串也是内部说法，不适用于输出以后的形式。  有个神似但是形不够似的比方， 不管你银行账号里的金额有多精彩，你要是用取款机来输出它，你得到的只能是一系列的百元钞票。


Question: 在单链表的特定位置插入一个值，如何完成，之前有人给过代码，不过没看懂，希望有大佬发详细注解的代码

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

1.创建一个节点，指向插入位置前的节点 2.把插入位置后面的节点指向刚才创建的节点

建议自己先写写，如果不明白原理，建议从书上获取～自己啃啃书，实践一下吧～

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


Question: 判断输入的整数是否为素数！！请问哪里有错a,求教！！！

int nu(int a) {     int i;     if (a < 2)         return 0;     for(i=2;i<sqrt(a)+1;i++)         if(a%i==0)              return 0;     return 1;    } 提高效率～

引用 2 楼 qzjhjxj 的回复:int nu(int a) {     int i;     for(i=2;i<a;i++)         if(a%i==0)              return 0;     return 1;  } 根据这个逻辑，1的返回值是1；0的返回值是1，即是素数  int nu(int a) {     int i;     if (a < 2)         return 0;     for(i=2;i<a;i++)         if(a%i==0)              return 0;     return 1;   }

i自2起方为正道。


Question: c语言如何判断是引用还是取地址？

引用 16 楼 赵4老师的回复:仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]  感谢，学到了

也不知你是不是故意的混淆概念， 首先引用是C++概念，不是C语言。 其次如果你提到的这些函数的形式全部都是函数原型或者函数实现的话，那么参数列表里全部都是形参的declaration，只会出现引用符号。 而相对应的，函数调用的括号里面全部都是实参,实参求值是个动作，如果出现&就应该是取地址。

简单点来讲     引用是一种变量类型，所以是变量声明的时候在变量前面加&，取地址符可以当成运算符号所以是跟着已经声明的变量。  变量声明可以简单认为是 变量类型+变量名称； int var； 你举的例子  函数里面参数  就可以看作是声明。

在声明时前缀&A表示A的引用，在运算时前缀&A表示取A的地址 在声明时前缀*A表示指向A的指针，在运算时*A表示取指向A的内容

也就相当于void max（int &a）？ 也就是后面说的三中情况全是取地址，而非引用？

引用 8 楼 突触的回复:嗯            是引用 是否也等同于 void max（int &a）？ 也就是这种形式是地址传递，而不是引用

引用 8 楼 突触的回复:嗯            是引用 如果外界定义过a[]， 那这个函数void max（int a[]）算地址传递？ 也就相当于void max（int *a）？

套用四老师的风格 不分析词性就没入门儿，不善用各种修辞格的代码是没有灵魂的。 在远方还有诗等着你呢。

嗯            是引用

一个declaration里面除了identifier以外都可以视作形容词，identifier本身是名词。 同理，赋值也好，函数调用也好，都是广义动词。

引用 3 楼 突触的回复:判断 &+变量 是引用还是取地址    当声明变量的时候使用&   这里的&是引用    例子： int b=0; int &a = b;   当已经声明的变量前面加&  这里的&是取地址 例子： int b=0; int *a = &b; 应该算引用对吗？

引用 3 楼 突触的回复:判断 &+变量 是引用还是取地址    当声明变量的时候使用&   这里的&是引用    例子： int b=0; int &a = b;   当已经声明的变量前面加&  这里的&是取地址 例子： int b=0; int *a = &b; 这样的话算引用还是取地址？

引用 3 楼 突触的回复:判断 &+变量 是引用还是取地址    当声明变量的时候使用&   这里的&是引用    例子： int b=0; int &a = b;   当已经声明的变量前面加&  这里的&是取地址 例子： int b=0; int *a = &b; 比如我一个函数void max（int &a，int &b）

引用 1 楼 forever74的回复:引用是个形容词，而取地址是个动词，及物的。 我不是问英语啊，就是&这个符号什么情况是取地址，什么时候是引用（也就是取别名）

引用是个形容词，而取地址是个动词，及物的。


Question: 函数pi是否满足pi/2=1+1/3+1/3*2/5+1/3*2/5*3/7+....  求教！！！

是的，还需要点补充，严谨一点

不满足；1/3 * 2/5这个乘法没有体现出来呢～另外，t的值需要做一个限定，不能是1,2这样的值。  网上搜一下吧，看看别人的逻辑，自己参考一下～

肯定不行吧，你把 n = 2，带进去看不就行了么 n = 2 的情况下，算式要求是 1/3 * 2/5 你这个循环里边只在 sum 上加了一个 2/5 而已，以此类推，后面的每一项都不符合了

我觉得，按程序的本意，t应该是pi的计算精度吧。作为double传入，不宜作为循环条件的判定吧。


Question: 请判断下列函数pi是否满足pi/2=1+1/3+1/3*2/5+1/3*2/5*3/7+...  求教！！！

供参考：//π/2=1+1/3+（1*2）/（3*5）+（1*2*3）/（3*5*7）+.......+（1*2...*n）/（3*5....*（2n+1））  #include "stdio.h" double pi(double t) {     double sum=1,m=1,s=1;     int n;     for(n=1;m>=t;n++)//for(n=1;n<=t;n++)这里n不会小于t,只会越走越大，n是项数      {               //m的值越来越小了，          m=m*n/(2*n+1);//n=1,m=1/3  //n=2,m=(1/3)*(2/5) ........          //s=s*m          sum=sum+m;  //n=1,sum = 1+ (1/3) //n=2,sum = 1+(1/3)+(1/3)*(2/5).......      }     return (sum*2); }


Question: 是一个刚上c语言编程设计的小白

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html


Question: 请问一下各种合法外挂的学习方向

引用 6 楼 早打大打打核战争 的回复:[quote=引用 5 楼 赵4老师 的回复:][quote=引用 4 楼 早打大打打核战争 的回复:]老赵以前一直吹AutoHotkey来着~ 我现在也可以继续吹AutoHotkey[/quote]  再给楼主科普一次~  [/quote] https://www.autohotkey.com/

引用 5 楼 赵4老师 的回复:[quote=引用 4 楼 早打大打打核战争 的回复:]老赵以前一直吹AutoHotkey来着~ 我现在也可以继续吹AutoHotkey[/quote]  再给楼主科普一次~

引用 4 楼 早打大打打核战争 的回复:老赵以前一直吹AutoHotkey来着~ 我现在也可以继续吹AutoHotkey

老赵以前一直吹AutoHotkey来着~

Windows Automation是一款基于Windows平台的桌面自动化软件， 用于自动执行所有重复性任务。 能自动启动和使用应用程序， 如自动填写数据、自动操作各种软件。

windows API

windows下都有鼠标键盘函数可以实现移动点击等效果


Question: 为啥返回最大子列啊


Question: 数据结构遇到的相关问题求解答，在此拜谢

建议贴全代码，但从照片看不明白你想要的，主要是代码部分还被遮住～  逻辑上应该是每次遇到一个和e相等的，就用后面的覆盖当前的。


Question: 数据结构相关问题请各路大神速来解答

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

代码信息不全呢，怀疑是给elem申请的动态空间，这样是可以按照数组的形式去赋值的。 所以，查一下初始化的函数里是不是有对elem申请了空间。  如果没申请还可以这样赋值，那么即使可行那也是随机的，因为野指针的使用是未定义行为～

A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价


Question: 为啥出现了负数？

躲过了初一，没躲过十五 使用16位环境要格外小心

#include "stdio.h" int main(){     int i;     unsigned long long arr[40];     arr[0]=1;     arr[1]=1;     for(i=2;i<40;i++){          arr[i] = arr[i-1] + arr[i-2];         //printf("%d\t",arr[i]);         printf("%llu\t", arr[i]);     }     putchar(10);      getchar();      return 0; } 负数，应该是溢出的缘故，因为long int最高位是符号位，计算得到的值超出了long int表示的正整数范围；  另外，long int输出应该是%ld不是%d

我这显示正常：#include "stdio.h" #include <conio.h>//getch()函数头文件 int main(){      int i;      int arr[40];      arr[0]=1;      arr[1]=1;      for(i=2;i<40;i++){          arr[i]=arr[i-1]+arr[i-2];         printf("%d  ",arr[i]);     }       getch();      return 0;  }  //2  3  5  8  13  21  34  55  89  144  233  377  610  987  1597  2584  4181  6765  10946  17711 //28657  46368  75025  121393  196418  317811  514229  832040  1346269  2178309  3524578  5702887 //9227465  14930352  24157817  39088169  63245986  102334155

#include "stdio.h" int main(){     int i;     long int arr[40];     arr[0]=1;     arr[1]=1;     for(i=2;i<40;i++){          arr[i]=arr[i-1]+arr[i-2];         printf("%ld\t",arr[i]);     }     getchar();     return 0; }

可以 调试一下看看，就可以发现问题，看什么时候变成负数了，看代码本身，好像没有问题


Question: 想要更强 又毫无方向

组长，反观现在，你很强了！！加油！！！

年轻就是资本啊小老弟，别想太多，跟着自己的节奏走就行

首先，也是最难的，正确评估自己 然后确定一个靠谱的远期目标 接着就是向目标前进了 不要奔跑，慢慢走起，不停下就行 前进途中身边触手可及的全部都是基础 不要怕基础太杂 大部分不需要系统深入地学习 但要了解。

谢谢您了 会注重基础的 ，但是 基础？ 啥叫基础？ 烦躁是很烦躁的 ，真的还是谢谢你

鸡汤多了也无感了，不如自己多尝试。即使前期很耗时间去解决几个甚至是一个问题，那也是进步。楼主心里应该还是很急躁的～，不如先静下心来，点滴积累，点滴升华。

扎根基础，一步一个脚印，不要浮躁，基础牢固了，学习新的东西会更快些～


Question: 链表中使用冒泡排序首行无法参与的解决办法。（交换节点）

只交换数据部分应该比较好处理。 链表节点交换，比较难处理。

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

这就是为什么有些数据结构教材喜欢头结点而不是头指针。


Question: 猴子选大王·C语言

#include<bits/stdc++.h> using namespace std;  const int N = 1000000 + 10; queue<int> q; int x[N]; int n, m;  int main(){ 	cin >> n; 	 	for (int i = 1; i <= n; ++i) { 		q.push(i); 		scanf("%d", &x[i]); 	} 	 	while (q.size() - 1){	 		int b = x[q.front()]; 		for (int i = 1; i <= b - 1; ++i) { 			q.push(q.front()); 			q.pop(); 		} 	//	cout << q.front() << " "; 		q.pop(); 	} 	 	cout << q.front() << endl; 	return 0; }  自己在一本通上面做的

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

n大于2吗？

...你这个退出之后从哪一只猴子开始数 1 ？

仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }


Question: C语言：如何将16进制形式的字符串，转化为相同的16进制的整型。

long int strtol(const char *nptr, char **endptr, int base);         long long int strtoll(const char *nptr, char **endptr, int base); 了解一下这两个函数～

问题已解决，可以满足需求

引用 1 楼 user-2 的回复:仅供参考： #include <stdio.h>  int main(void) { 	char *str = "0x123"; 	int data; 	sscanf(str, "%x", &data); 	printf("%#x\n", data); 	 	return 0; }


Question: 求大神carry！！！

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

#include <stdio.h> #include <stdlib.h>   void bubble_sort(int *arr, int len); int main() {      int n, *arr, i;      scanf("%d", &n);      arr = (int *)malloc(sizeof(int) * (n));     if (!arr)         return -1;      for (i = 0; i < n; i++)         scanf("%d", &arr[i]);      bubble_sort(arr, n);      for (i = 0; i < n; i += 1)         printf("%d ", arr[i]);     putchar(10);      /*        for (i = 1; i < n+1; i += 2)        printf("%d ", arr[i]);        putchar(10);        for (i = 2; i < n+1; i += 2)        printf("%d ", arr[i]);        putchar(10);        */      return 0; }  void bubble_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len; i++) {         for (j = 0; j < len-1; j++) {             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             }         }     } } 供参考～

方案一，使用变长数组，需要编译器支持C99  #include "stdio.h" #include "stdlib.h" #include "time.h" int main( void ) { 	int num=0,i=0; 	printf("输入数组长度："); 	scanf( "%d", &num  ); 	int arr[num]; 	srand( time(0) ); 	for( i=0 ; i<num ; i++ ) 	{ 		arr[i] = rand()%100; 		printf("%d ", arr[i] ); 	}  	return 0; }   方案二，申请内存，C90亦可  #include "stdio.h" #include "stdlib.h" #include "time.h" int main( void ) { 	int num=0,i=0; 	printf("输入数组长度："); 	scanf( "%d", &num  ); 	int* arr = calloc( num, sizeof(int) );; 	srand( time(0) ); 	for( i=0 ; i<num ; i++ ) 	{ 		arr[i] = rand()%100; 		printf("%d ", arr[i] ); 	}  	return 0; }


Question: 关于链接动态库的一个问题

引用 6 楼 Intel0011 的回复:[quote=引用 4 楼 六道佩恩 的回复:][quote=引用 1 楼 user-2 的回复:]https://www.cnblogs.com/johngu/p/7877939.html  这个“隐式链接”不是链接静态库吗？[/quote] lib有两种 一种是静态库，里面包含功能函数 另一种是导入库，里面包含DLL中函数的信息，供链接器去寻找调用的函数 这两种库的后缀都是lib，但功能和内容不一样  [/quote]  抱歉哈，上次有事就把这茬给忘了，非常感谢老哥，我把分都加上

引用 4 楼 六道佩恩 的回复:[quote=引用 1 楼 user-2 的回复:]https://www.cnblogs.com/johngu/p/7877939.html  这个“隐式链接”不是链接静态库吗？[/quote] lib有两种 一种是静态库，里面包含功能函数 另一种是导入库，里面包含DLL中函数的信息，供链接器去寻找调用的函数 这两种库的后缀都是lib，但功能和内容不一样 ---------------------------------------------- Windows中，动态库包括xx.dll和xx.lib两部分。静态库包含yy.lib。  此处有两种lib，一种称为动态库的导入库xx.lib。一种称为静态库yy.lib，如何来进行区分呢。 第一看大小，导入库一般都很小，大的也只有几K，而静态库则很大，小则几M，大则几十M。 第二就要能过命令的方式来查看了。命令行使用方式如下： -------------------------------------------------------- 1、用dumpbin /exports xxx.lib查看导出的函数接口，如果有导出的话就是动态库的lib文件，如果看不到导出函数就是静态库。 -------------------------------------------------------- 2、使用lib.exe来查看 如果该Demo.lib是静态库，输出如下： lib /list Demo.lib  Microsoft (R) Library Manager Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved.  .\Debug\Demo.obj .\Debug\Person.obj .\Debug\stdafx.obj .\Debug\Demo.res  如果该Demo.lib是导入库，输出如下： lib /list Demo.lib  Microsoft (R) Library Manager Version 8.00.50727.42 Copyright (C) Microsoft Corporation.  All rights reserved.  Demo.dll Demo.dll Demo.dll Demo.dll Demo.dll

如果lib是静态库 就是静态链接（不需要DLL），如果是动态库，系统就在装载时会加载对应的DLL

引用 1 楼 user-2 的回复:https://www.cnblogs.com/johngu/p/7877939.html  这个“隐式链接”不是链接静态库吗？

引用 2 楼 Intel0011 的回复:VC也可以使用链接选项指定 或在源码中指定，这属于隐式调用 #pragma comment(lib, "XXX.lib") 代码中手写LoadLibrary是属于显式调用 这不是静态库吗？


Question: 急求大佬帮忙，c语言做了个简单的网吧管理系统，现在出问题不知道怎么改了

供参考：//#include"Mylist.h" //run this program using the console pauser or add your own getch, system("pause") or input loop    #include<stdio.h> #include<stdlib.h>   struct VIP {     char name[20]; //会员姓名     int  idN,VIPN,PN,integral,time,CN; //身份证号码，会员号，电话号码，会员积分，上机时间，机子编号 };  struct Node {     //int data;     struct VIP data;     struct Node* next; };  //创建表 struct Node* createList() {     struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));     headNode->next = NULL;     return headNode; }   //创建结点 struct Node* createNode()//(struct VIP data) {     struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));     //newNode->data = data;     newNode->next = NULL;     return newNode; }  //插入结点 void insertNodeByHead(struct Node* headNode,struct VIP data) {     struct Node* newNode = createNode();//(data);     newNode->data  = data;  //表头法     newNode->next  = headNode->next;     headNode->next = newNode; }  struct Node* list = createList();  //查找功能 struct Node* searchInfoByData(struct Node* headNode,int VIPN) {     struct Node* pMove = headNode->next;     if(pMove == NULL)          return NULL;     for (;pMove != NULL;pMove = pMove->next)         if (pMove->data.VIPN == VIPN)             return pMove;     return NULL; }  //指定位置删除 void deleteAppoinNode(struct Node* headNode,int VIPN) {     struct Node* posNode ,* posFrontNode ;          for(posNode = headNode,posFrontNode = NULL;         posNode != NULL && posNode->data.VIPN != VIPN;         posFrontNode = posNode,posNode = posNode->next);      if(posNode == NULL)     //未找到       {         printf("未找到指定位置信息，无法删除！\n");         return;       }     if(posFrontNode == NULL)//第一个节点       {         headNode = headNode->next;       }     else       {         posFrontNode->next = posNode->next;       }     free(posNode); }  //文件读操作 void readInfoFromFile(struct Node* headNode, char *fileName) {           FILE *fp;      struct VIP data;      fp = fopen(fileName, "r+");//1.打开      if (fp == NULL)       {          printf("\n*********新的网吧管理系统*************\n");          return;       }                                 //2.读文件      while(fscanf(fp,"%s %d %d %d %d %d %d\n",data.name,&data.idN,&data.VIPN,&data.PN,                                                    &data.integral,&data.time,&data.CN)==7)       {         insertNodeByHead(headNode, data);       }      fclose(fp) ; //3.关闭文件 } //文件写操作 void writeInfoToFile(struct Node* headNode,char *FileName) {     FILE *fp;     fp = fopen(FileName,"w+");     if (fp == NULL)       {          printf("不能打开文件！\n");          return;       }     struct Node* pMove = headNode->next;     while(pMove)      {         fprintf(fp,"%s %d %d %d %d %d %d\n",pMove->data.name,pMove->data.idN,pMove->data.VIPN,                              pMove->data.PN,pMove->data.integral,pMove->data.time,pMove->data.CN);         pMove = pMove->next;      }     fclose(fp); }   //打印链表  void printflist(struct Node* headNode) {     struct Node*pMove = headNode->next;     printf("会员姓名\t\t身份证号码\t\t会员号\t\t电话号码\t\t会员积分\t\t上机时间\t\t机子编号\n");     while (pMove)      {         printf("%-20s\t%-18d\t%-18d\t%-18d\t%-12d\t%-12d\t%-12d\n",pMove->data.name,pMove->data.idN,                pMove->data.VIPN,pMove->data.PN,pMove->data.integral,pMove->data.time,pMove->data.CN);         pMove = pMove->next;      }     printf("\n"); }  void menu() {     printf("----------网吧管理系统---------\n");     printf("\t1.添加会员信息\t\n");     printf("\t2.浏览会员信息\t\n");     printf("\t3.删除会员信息\t\n");     printf("\t4.添加上网信息\t\n");     printf("\t5.删除上网信息\t\n");     printf("\t6.查找会员信息\t\n");     printf("\t0.退出管理系统\t\n");     printf("-------------------------------\n"); }  void keyDown() {     int choice = 0;     struct VIP data;     struct Node * searchID ;     printf("请输入你的选择：");     fflush(stdout);     rewind(stdin);     scanf("%d",&choice);     switch(choice)                  {                  case 1:                         printf("--------添加会员信息---------\n");                         printf("请输入会员姓名,身份证号码，会员号，电话号码，会员积分:");                         fflush(stdout);           //清空缓冲区                         rewind(stdin);                         scanf("%s%d%d%d%d",data.name,&data.idN,&data.VIPN,&data.PN,&data.integral);                         data.time =0; data.CN =0;                         insertNodeByHead(list,data);                         break;                  case 2:                         printf("--------浏览会员信息---------\n");                         printflist(list);                         break;                  case 3:                         printf("--------删除会员信息---------\n");                         printf("请输入删除的会员号;");                         fflush(stdout);                         rewind(stdin);                         scanf("%d",&data.VIPN) ;                         deleteAppoinNode(list,data.VIPN);                         break;                  case 4:                         printf("--------添加上网信息---------\n");                         printf("请输入会员号:");                         fflush(stdout);                         rewind(stdin);                         scanf("%d",&data.VIPN);                         searchID = searchInfoByData(list, data.VIPN);                         if(searchID != NULL){                             printf("请输入上机时间，机子编号:");                             fflush(stdout);                             rewind(stdin);                             scanf("%d%d",&data.time,&data.CN);                             searchID->data.time = data.time;                             searchID->data.CN   = data.CN;                         }else                             printf("未找到相关信息！\n");                         break;                  case 5:                         printf("--------删除上网信息---------\n");                         printf("请输入会员号:");                         fflush(stdout);                         rewind(stdin);                         scanf("%d",&data.VIPN);                         searchID = searchInfoByData(list, data.VIPN);                         if(searchID != NULL){                             searchID->data.time = 0;                             searchID->data.CN   = 0;                             printf("%d号会员上网信息删除成功！",data.VIPN);                         }else                             printf("未找到会员号为：%d的相关信息！\n",data.VIPN);                         break;                  case 6:                         printf("--------查找会员信息---------\n");                         printf("请输入要查找的会员号:");                         fflush(stdout);                         rewind(stdin);                         scanf("%d", &data.VIPN);                         searchID =  searchInfoByData(list, data.VIPN);                         if (searchID == NULL)                                                   {                               printf("未找到相关信息！\n");                            }                         else                            {                               printf("会员姓名\t\t身份证号码\t\t会员号\t\t电话号码\t\t"                                                       "会员积分\t\t上机时间\t\t机子编号\n");                               printf("%-20s\t%-18d\t%-18d\t%-18d\t%-12d\t%-12d\t%-12d\n",                                      searchID->data.name,searchID->data.idN,searchID->data.VIPN,                                      searchID->data.PN,searchID->data.integral,searchID->data.time,                                      searchID->data.CN);                            }                         break;                  case 0:                         printf("正常退出！\n");                         writeInfoToFile(list,"1.txt");                         exit(0);                         break;                  default :                         printf("选择错误，重新输入\n");                         break;     }     //writeInfoToFile(list, "1.txt"); }   int main(int argc, char *argv[]) {     system("title 网吧管理系统");//设置cmd窗口标题     system("mode con cols=200 lines=50");//窗口宽度高度      readInfoFromFile(list, "1.txt");     while(1)      {         menu();         keyDown();         system("pause");         system("cls");      }     return 0; }

引用 3 楼 往事如烟0819 的回复:代码实现了什么功能，发生了什么问题，也不说。 这么多代码，哪有那么多时间看呀。 咋看呀 我的问题，现在已经解决了 ，谢谢大家

快来人啊！！！！

引用 3 楼 往事如烟0819 的回复:代码实现了什么功能，发生了什么问题，也不说。 这么多代码，哪有那么多时间看呀。 咋看呀 正解。。


Question: 英文本文件的处理（小白求助）

需用C语言程序写我不会呀

K&R C，修改一下即可。

文本文件处理  https://blog.csdn.net/zhanghaiyang9999/article/details/107032563


Question: 为什么我的冒泡排序不起作用。

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

void sort(int x[], int n) {   int i,j,t;   for(i=0; x && i<n-1; i++)   {     for(j=i+1; j<n; j++)     {       if(x[i] > x[j])       {         t=x[i]; x[i]=x[j]; x[j]=t;       }     }   } }

路过围观，学习

https://blog.csdn.net/zhanghaiyang9999/article/details/107102728  C语言基础排序算法-冒泡排序

引用 2 楼 qq_53643374 的回复:[quote=引用 1 楼 自信男孩的回复:]select_sort函数里操作的是局部变量a数组，不是用的x，因此排序的是局部数据a排序了，没有对x开始的内存排序，x指向即main函数里的a数组。  另外，冒泡bubble_sort建议改一下函数名；  select_sort是选择排序。 改了提高代码的可读性～ 那要怎么改那[/quote]  把select_sort函数里的a用x替换；  另外，去掉a[20]的定义吧。用到的数组。

引用 1 楼 自信男孩的回复:select_sort函数里操作的是局部变量a数组，不是用的x，因此排序的是局部数据a排序了，没有对x开始的内存排序，x指向即main函数里的a数组。  另外，冒泡bubble_sort建议改一下函数名；  select_sort是选择排序。 改了提高代码的可读性～ 那要怎么改那


Question: C中将字符串转uint8

比如说 char *a ＝"0xff" 怎么转成uint8_t类型？

请上代码来说明问题。

引用 10 楼 prprrrr 的回复:[quote=引用 9 楼 自信男孩的回复:][quote=引用 2 楼 prprrrr 的回复:]比如说 char *a ＝"0xff" 怎么转成uint8_t类型？ 当然char *a  = "0xff";和uint8_t *b = "0xff";是一样的。  同理char a[] = "0xff"和uint8_t b[] = "0xff";内存是一样的（即数组a和数组b中的内容是一样的）[/quote] 相当于写了一个uint8的指针指向了"0xff"吗[/quote] 对

所以说不上代码的话，楼主你的原始说法容易造成误解哦。

引用 7 楼 prprrrr的回复:[quote=引用 4 楼 真相重于对错的回复:]uint8_t n;     const  char* str = "0xff";     sscanf(str, "%hhx", &n); 我这就去试试[/quote] 太好了可以，谢谢

引用 9 楼 自信男孩的回复:[quote=引用 2 楼 prprrrr 的回复:]比如说 char *a ＝"0xff" 怎么转成uint8_t类型？ 当然char *a  = "0xff";和uint8_t *b = "0xff";是一样的。  同理char a[] = "0xff"和uint8_t b[] = "0xff";内存是一样的（即数组a和数组b中的内容是一样的）[/quote] 相当于写了一个uint8的指针指向了"0xff"吗

引用 2 楼 prprrrr 的回复:比如说 char *a ＝"0xff" 怎么转成uint8_t类型？ 当然char *a  = "0xff";和uint8_t *b = "0xff";是一样的。  同理char a[] = "0xff"和uint8_t b[] = "0xff";内存是一样的（即数组a和数组b中的内容是一样的）

引用 2 楼 prprrrr 的回复:比如说 char *a ＝"0xff" 怎么转成uint8_t类型？  这不一样呢，a是指向的字符串，0xff和"0xff"是不一样的。  我说的一样是这样的:char a = 0xff; uint8_t b = a;或者uint8_t b = 0xff;此时的a和b是一样的在内存里。

引用 4 楼 真相重于对错的回复:uint8_t n;     const  char* str = "0xff";     sscanf(str, "%hhx", &n); 我这就去试试

引用 3 楼 自信男孩的回复:不用转，因为char和uint8都是1个字节的长度。如果说要转的话，可能是类型强制转换了，但是这样不会改变内存里的内容。 噢，那就直接强转就可以了吧

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。


Question: ～a|a为什么是-1

引用 7 楼 it_xiangqiang的回复:C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html 哇塞，谢谢大佬

引用 5 楼 突触的回复:a=1  0000 0000 0000 0001  ~a  1111 1111 1111 1110  a | ~a  1111 1111 1111 1111 明白了，谢谢

引用 楼主 weixin_51397022的回复:～a|a为什么是-1 a=1，～a是-2，二进制应该是最高位和第二低位是1吧，1是最低位是1，那两个按位与运算，应该是-3吧

因为二者的位模式都是二进制全1 好巧啊。


Question: 终端的输出怎么保存到日志文件

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

写一个日志类，直接写文件写进去不就得了

不是串口，是ssh连上去的。

引用 10 楼 user-5 的回复:./MRAPP 2>&1 | tee -i -a ./log.txt 这样？好像问题不在这个2>&1   我看很多打印都没能正常打印出来   printf的都没打出来，像这种： (sensor/imx307.c 688): stEVAttr.s32EV=0 stEVAttr.u32Grad=1 (sensor/imx307.c 424): isp_antiflicker = 1 (sensor/imx307.c 719): gainlimit = 3 (sen  打印到这就卡在缓冲区了？ 显然下面应该还有打印才对啊

引用 11 楼 forever74 的回复:也就是跳出系统来记录。 在系统内记录的总有一部分缓冲区上的内容在死机时尚未写盘，这个很正常吧。用tee 的话，正常运行，有很多都是卡在了缓存区的，都没能记录下来

引用 9 楼 forever74 的回复:如果是pts系的终端，你让连接用的那个软件直接记录就好了。 我用SecureCRT，随便记。机器装好的，转高温箱测试，接不了串口线哦

./MRAPP 2>&1 | tee -i -a ./log.txt 这样？

参考本网页下面CSDN自动生成的链接。

引用 5 楼 赵4老师 的回复:加出错打印： >>~/mylog1.txt 2>>~/mylog1.txt 驱动打印是啥东东？程序崩的时候打印的些东西吧，比如下面的打印： / #  / # (uvccom/st_uvc.c 1032):  ----- Isoc UVC_EVENT_STREAMOFF -----       -->1         @RxDET 3        -->2         @Ux 3              -->3 [APP WRN][dev:/dev/video0]: _UVC_QBuf[281]: Unable to queue buffer: No such device (19).    -->4 [APP WRN][dev:/dev/video0]: _UVC_QBuf[281]: Unable to queue buffer: No such device (19).    -->5 [APP WRN][dev:/dev/video0]: _UVC_QBuf[281]: Unable to queue buffer: No such device (19).    -->6 [APP WRN][dev:/dev/video0]: _UVC_QBuf[281]: Unable to queue buffer: No such device (19).    -->7 UVC: 3 buffers free.                                            -->8 UVC: Stop video stream Successfully.                -->9 (sigmastar/tsk_uvc.c 744):  UVC_StopCapture   -->10  1、8、9、10是我自己应用程序加的打印，2、3应该是驱动加的打印，4、5、6、7应该是原厂SDK加的打印，我想要的是，有没有什么操作或者指令，把这些打印全部保存到文件里面，以便机器跑死的时候我知道它的log？ 另外，我测试了下tee，./MRAPP | tee -i -a ./log.txt 好像还行，但是日志保存不完全，最后都会丢一段，不知道怎么回事

你说的驱动进程是谁启动的？只要是在终端启动的都可以将输出重定向到文件里啊

引用 1 楼 xian0-666 的回复:写一个日志类，直接写文件写进去不就得了可否具体点啊

引用 2 楼 赵4老师 的回复:./可执行文件 >>~/mylog1.txt 或 ./脚本文件.sh >>~/mylog1.txt 你这个追加只是追加的该文件/脚本执行打印的东西，我要的是我机器全部的终端输出，包括驱动打印，以及出错打印