Question: 关于指针的超新手问题

引用 16 楼 5250 的回复:[quote=引用 15 楼 No_Found707 的回复:][quote=引用 14 楼 5250 的回复:][quote=引用 13 楼 No_Found707 的回复:][quote=引用 12 楼 5250 的回复:]printf_one(i);  这个函数哪儿来的？  是从文库抄的答案，我没太看懂……查了一下大概意思是根据i打印节点，是这个该删掉吗T T[/quote]  首先 这不是诸如printf ,scanf的库函数，其次也没看到你自定义这个函数，所以你编译的话应该会报错。[/quote]  我去查了一下原文这个函数的定义作用都没有提及，干脆把他直接删除再试试编译结果报错还是一样的OTZ看起来大概是没什么作用可有可无的一句话吗  是这个样子，前辈有没有什么解决经验教教我，谢谢！[/quote]  去找找报错的函数 和我刚才指出的问题一样 没有任何的函数定义，你可以删除 也可以自定义[/quote]   谢谢！！完美解决了！！！！！太感谢了！

引用 15 楼 No_Found707 的回复:[quote=引用 14 楼 5250 的回复:][quote=引用 13 楼 No_Found707 的回复:][quote=引用 12 楼 5250 的回复:]printf_one(i);  这个函数哪儿来的？  是从文库抄的答案，我没太看懂……查了一下大概意思是根据i打印节点，是这个该删掉吗T T[/quote]  首先 这不是诸如printf ,scanf的库函数，其次也没看到你自定义这个函数，所以你编译的话应该会报错。[/quote]  我去查了一下原文这个函数的定义作用都没有提及，干脆把他直接删除再试试编译结果报错还是一样的OTZ看起来大概是没什么作用可有可无的一句话吗  是这个样子，前辈有没有什么解决经验教教我，谢谢！[/quote]  去找找报错的函数 和我刚才指出的问题一样 没有任何的函数定义，你可以删除 也可以自定义

引用 14 楼 5250 的回复:[quote=引用 13 楼 No_Found707 的回复:][quote=引用 12 楼 5250 的回复:]printf_one(i);  这个函数哪儿来的？  是从文库抄的答案，我没太看懂……查了一下大概意思是根据i打印节点，是这个该删掉吗T T[/quote]  首先 这不是诸如printf ,scanf的库函数，其次也没看到你自定义这个函数，所以你编译的话应该会报错。[/quote]  我去查了一下原文这个函数的定义作用都没有提及，干脆把他直接删除再试试编译结果报错还是一样的OTZ看起来大概是没什么作用可有可无的一句话吗  是这个样子，前辈有没有什么解决经验教教我，谢谢！

引用 13 楼 No_Found707 的回复:[quote=引用 12 楼 5250 的回复:]printf_one(i);  这个函数哪儿来的？  是从文库抄的答案，我没太看懂……查了一下大概意思是根据i打印节点，是这个该删掉吗T T[/quote]  首先 这不是诸如printf ,scanf的库函数，其次也没看到你自定义这个函数，所以你编译的话应该会报错。

引用 12 楼 5250 的回复:printf_one(i);  这个函数哪儿来的？  是从文库抄的答案，我没太看懂……查了一下大概意思是根据i打印节点，是这个该删掉吗T T

printf_one(i);  这个函数哪儿来的？

……诶，在我努力思考的时候突然热闹起来了吗，总而言之辛苦了

谢谢前辈们帮忙T T真的非常轻松解决问题了，但是报错从只有那个N变成了一大堆。  C:\Users\asus\AppData\Local\Temp\ccOoAIiO.o	杂志订阅系统.c:(.text+0x5d8): undefined reference to `printf_n' ↑大概是这个样子，有非常多。我去查了一下大概是链接静态库之类的出问题了吗？我没有太看懂，也没有找到解决方案……  还有一条  [Error] ld returned 1 exit status  的红色报错  非常困惑……明明已经只剩下N没有解决，突然多出来一屏幕的错感觉非常的困惑。使用的软件是DEV C++，我有看到其他软件的解决方案，看起来大概不通用。请求前辈们进行二度援助，拜托了OTZ   #include<stdio.h>   #include <stdlib.h>  #define N 100   struct magazine {  	char name[20]; 	char sex[6]; 	char addr[20]; 	char phone_number[20]; 	float unit_price; 	int amount; 	char time_limit[20]; }mag[N];   void input(int i){  	printf("请输入：姓名 性别 地址 电话号码 单价 数量 日期期限"); 	scanf("%s %s %s %s %f %d %s", mag[i].name,mag[i].sex,mag[i].addr,mag[i].phone_number,&mag[i].unit_price,&mag[i].amount,mag[i].time_limit); }  void save(int n){ 	FILE *fp; 	int i; 	if((fp=fopen("record.txt","w"))==0){ 		printf("无法找到信息"); 		exit(0);  	} 	for(i=0;i<n;i++){ 			fprintf(fp,"%5s %5d %10s %11s %3f %d %10s",mag[i].name,mag[i].sex,mag[i].phone_number,mag[i].unit_price,mag[i].time_limit); 	} 	fcolse(fp); }  void search_dele(){ FILE *fp; struct mag; char date[20]; int t,i,sum=0,j=0; t=load_record(); system("cls"); printf("请输入日期[ ]\n"); scanf("%s",date); printf("\n"); if((fp=fopen("record.txt","w"))==0){ 	printf("无法打开\n"); 	exit(0); } system("cls"); printf("\n"); for(i=0;i<t;i++){ 	if(strcmp(mag[i].time_limit,date)>0){ 		sum++; 		printf("\n"); 		printf_one(i);  		fprintf(fp,"%s %s %s %s %d %f %s\n",mag[j].name,mag[j].sex,mag[j].phone_number,mag[j].unit_price,mag[j].time_limit); 		j++; 	} } fclose(fp); if (sum==0){ 	printf("很遗憾无法找到您搜索的信息。\n"); } printf("任意键返回\n"); getch(); menu(); }    void add(){ 	int t,i,m; 	system("cls"); 	t=load_record(); 	printf("您需要添加多少用户的信息？\n"); 	getch(); 	printf("输入号码：[]\n"); 	scanf("%d",&m); 	for(i=0;i<m;i++) 	{ 		printf("\n添加%d位用户信息\n",i+1); 		input(t+1); 	} 	save(t+m); 	system("cls"); 	menu(); }        void statistc(){ 	int i,t,allamount=0; 	float sum=0.0,allmoney=0.0; 	t=load_record(); 	system("cls"); 	printf("订阅者的数量%d\n",t); 	getch(); 	system("cls"); 	puts("本期订户信息表\n"); 	printf_n(t); 	for(i=0;i<t;i++){ 		allamount+=mag[i].amount; 		allmoney+=mag[i].amount*mag[i].unit_price; 	}  	printf("合计：\n"); 	printf("总数量=%d \n总金额=%f\n,allamount,allmoney"); 	getch(); 	printf("任意键返回\n"); 	menu();  }    int load_record(){ 	FILE *fp; 	int i; 	if((fp=fopen("record.txt","r"))==NULL){ 		printf("无法找到信息\n"); 		getch(); 		exit(0); 	} 	for(i=0;!feof(fp);i++){ 		fscanf(fp,"%5s %5d %10s %11s %3f %d %10s",mag[i].name,mag[i].sex,mag[i].phone_number,mag[i].unit_price,mag[i].time_limit); 	} 	fclose(fp); 	return(i); }   void MENU(){ 	int w,n; 	do{ 		puts("\n"); 		puts("欢迎来到杂志订阅系统\n"); 		puts("MENU\n"); 		puts("1:add_new_subscriber\n"); 		puts("2:search_dele\n"); 		puts("3:statistic\n"); 		puts("4:exit\n"); 		puts("——————\n"); 		printf("请选择数字()1-4:[]\n"); 		scanf("%d",&n); 		if(n<1||n>4) 		{ 			w=1; 			gather(); 		} 		else w=0; 	}	while(w==1); 		switch(n){ 			case 1:add();break; 			case 2:search_dele();break; 			case 3:statistic();break; 			case 4:exit(0); 		} }     main(){ 	MENU(); }     这里是完整代码！谢谢！

#define  N 1000  //给N定义一个值

引用 6 楼 Army_Adviser_ 的回复:[quote=引用 5 楼 自信男孩 的回复：][quote=引用 4 楼 Army_Adviser_ 的回复:][quote=引用 3 楼 自信男孩 的回复：][quote=引用 2 楼 Army_Adviser_ 的回复:]struct magazine{ char name[20]; char sex[6]; char addr[20]; char phone_number[20]; float unit_price; int amount; char time_limit[20]; }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag  你要使用这个结构体可以使用以下2个方式定义变量： struct magazine *str1=NULL;  或者  mag[N] *str1=NULL; 这是变量不是别名好不好，如果是别名，怎么看到typedef?[/quote]这样写也可以呀……不信你用最后面的名字定一下结构体[/quote] 试了，提示错误：   }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag       ^ abb1.cpp:14:1: error: ‘mag’ does not name a type  mag[N] *str1=NULL;  ^~~ <内置>: recipe for target 'abb1' failed make: *** [abb1] Error 1   代码如下：  #include <stdio.h>  struct magazine{     char name[20];     char sex[6];     char addr[20];     char phone_number[20];     float unit_price;     int amount;     char time_limit[20]; }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag //你要使用这个结构体可以使用以下2个方式定义变量： struct magazine *str1=NULL;  //或者 mag[N] *str1=NULL;  int main(void) {     return 0; }  建议了解一下typedef[/quote]emmmm.你试过吗？[/quote]  看完我上面的回复再问这个“你试过了吗？”问题～

引用 4 楼 Army_Adviser_ 的回复:[quote=引用 3 楼 自信男孩 的回复：][quote=引用 2 楼 Army_Adviser_ 的回复:]struct magazine{ char name[20]; char sex[6]; char addr[20]; char phone_number[20]; float unit_price; int amount; char time_limit[20]; }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag  你要使用这个结构体可以使用以下2个方式定义变量： struct magazine *str1=NULL;  或者  mag[N] *str1=NULL; 这是变量不是别名好不好，如果是别名，怎么看到typedef?[/quote]这样写也可以呀……不信你用最后面的名字定一下结构体[/quote] 试了，提示错误：   }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag       ^ abb1.cpp:14:1: error: ‘mag’ does not name a type  mag[N] *str1=NULL;  ^~~ <内置>: recipe for target 'abb1' failed make: *** [abb1] Error 1   代码如下：  #include <stdio.h>  struct magazine{     char name[20];     char sex[6];     char addr[20];     char phone_number[20];     float unit_price;     int amount;     char time_limit[20]; }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag //你要使用这个结构体可以使用以下2个方式定义变量： struct magazine *str1=NULL;  //或者 mag[N] *str1=NULL;  int main(void) {     return 0; }  建议了解一下typedef

引用 2 楼 Army_Adviser_ 的回复:struct magazine{ char name[20]; char sex[6]; char addr[20]; char phone_number[20]; float unit_price; int amount; char time_limit[20]; }mag[N];//问题在这里！WARNING！    <====这个是别名呀 不是变量  建议改成 mag  你要使用这个结构体可以使用以下2个方式定义变量： struct magazine *str1=NULL;  或者  mag[N] *str1=NULL; 这是变量不是别名好不好，如果是别名，怎么看到typedef?

这是数组长度，需要确定长度，如果要做成动态申请，那么这个N直接改成0，或者直接定义成*mag;.如果要做成静态的，那么就给予一个固定值。  静态的和动态的各有优缺点。


Question: 无法运行

引用 7 楼 自信男孩的回复:[quote=引用 4 楼 佛系咸鱼en 的回复:][quote=引用 3 楼 自信男孩的回复:]#include<stdio.h> int main() {     int a, b, c;     int s[100], p[100], q[100];      scanf_s("%d %d %d", &a, &b, &c);     if (a > 100)         a = 100;      for (int i = 0; i < a; i++)     {         scanf_s("%d", &s[i]);     }     int max1;     for (int i = 0; i < a; i++)     {         max1 = i;         //for (int t = i; t < a - i&&i+1<a; t++)         for (int t = i; t < a; t++)         {             if (s[max1] <= s[t])                 max1 = t;          }         if (max1 != i) {             int tmp = s[i];             s[i] = s[max1];             s[max1] = tmp;         }     }     for (int i = 0; i < a; i++)     {         printf("%d", s[i]);     }     return 0; } 供参考～ 其实我想解决的并不是代码的问题，我自己的这个就写了出来也没运行，肯定会有问题，我想解决的是编译器报错的问题，当然也非常感谢你的解答。[/quote] 用我的版本还会报错吗？[/quote] 还是一样的报错，感觉是我的编译器出了问题，我卸了重安一下

引用 7 楼 自信男孩的回复:[quote=引用 4 楼 佛系咸鱼en 的回复:][quote=引用 3 楼 自信男孩的回复:]#include<stdio.h> int main() {     int a, b, c;     int s[100], p[100], q[100];      scanf_s("%d %d %d", &a, &b, &c);     if (a > 100)         a = 100;      for (int i = 0; i < a; i++)     {         scanf_s("%d", &s[i]);     }     int max1;     for (int i = 0; i < a; i++)     {         max1 = i;         //for (int t = i; t < a - i&&i+1<a; t++)         for (int t = i; t < a; t++)         {             if (s[max1] <= s[t])                 max1 = t;          }         if (max1 != i) {             int tmp = s[i];             s[i] = s[max1];             s[max1] = tmp;         }     }     for (int i = 0; i < a; i++)     {         printf("%d", s[i]);     }     return 0; } 供参考～ 其实我想解决的并不是代码的问题，我自己的这个就写了出来也没运行，肯定会有问题，我想解决的是编译器报错的问题，当然也非常感谢你的解答。[/quote] 用我的版本还会报错吗？[/quote] 我还没运行，待会我试一下

引用 5 楼 Army_Adviser_的回复:目测是你代码错误导致的   if (s[i] <= s[i + 1])                 max1= s[i + 1];             s[i + 1] = s[i];             s[i] = max1; 这段少了括号把？  这样不会进入死循环吗？ if (s[i] <= s[i + 1]){                 max1= s[i + 1];             s[i + 1] = s[i];             s[i] = max1; }应该这样吧。。。  可以试一下 确实，我再改一下

引用 4 楼 佛系咸鱼en 的回复:[quote=引用 3 楼 自信男孩的回复:]#include<stdio.h> int main() {     int a, b, c;     int s[100], p[100], q[100];      scanf_s("%d %d %d", &a, &b, &c);     if (a > 100)         a = 100;      for (int i = 0; i < a; i++)     {         scanf_s("%d", &s[i]);     }     int max1;     for (int i = 0; i < a; i++)     {         max1 = i;         //for (int t = i; t < a - i&&i+1<a; t++)         for (int t = i; t < a; t++)         {             if (s[max1] <= s[t])                 max1 = t;          }         if (max1 != i) {             int tmp = s[i];             s[i] = s[max1];             s[max1] = tmp;         }     }     for (int i = 0; i < a; i++)     {         printf("%d", s[i]);     }     return 0; } 供参考～ 其实我想解决的并不是代码的问题，我自己的这个就写了出来也没运行，肯定会有问题，我想解决的是编译器报错的问题，当然也非常感谢你的解答。[/quote] 用我的版本还会报错吗？

不建议在中文目录,这是用的默认项目目录?

引用 3 楼 自信男孩的回复:#include<stdio.h> int main() {     int a, b, c;     int s[100], p[100], q[100];      scanf_s("%d %d %d", &a, &b, &c);     if (a > 100)         a = 100;      for (int i = 0; i < a; i++)     {         scanf_s("%d", &s[i]);     }     int max1;     for (int i = 0; i < a; i++)     {         max1 = i;         //for (int t = i; t < a - i&&i+1<a; t++)         for (int t = i; t < a; t++)         {             if (s[max1] <= s[t])                 max1 = t;          }         if (max1 != i) {             int tmp = s[i];             s[i] = s[max1];             s[max1] = tmp;         }     }     for (int i = 0; i < a; i++)     {         printf("%d", s[i]);     }     return 0; } 供参考～ 其实我想解决的并不是代码的问题，我自己的这个就写了出来也没运行，肯定会有问题，我想解决的是编译器报错的问题，当然也非常感谢你的解答。

引用 1 楼 自信男孩的回复:楼主要实现什么？并且楼主的i在两个循环里，并且第二层循环还在第一层循环里。  #include<stdio.h> int main() {     int a, b, c;     int s[100], p[100], q[100];      scanf_s("%d %d %d", &a, &b, &c);     if (a > 100)         a = 100;      for (int i = 0; i < a; i++)     {         scanf_s("%d", &s[i]);     }     int max1 = s[0];     for (int i = 0; i < a; i++)     {         for (int t = 0; t < a - i&&i+1<a; t++)         {             if (s[i] <= s[i + 1])                 max1= s[i + 1];             s[i + 1] = s[i];             s[i] = max1;         }     }     for (int i = 0; i < a; i++)     {         printf("%d", s[i]);     }     return 0; } 供参考～ 目的是实现由大到小排序


Question: 无法运行

引用 4 楼 张子又的回复:去cmd，找到对应位置，然后输入windeployqt UDPMutiCommTool.exe（处理exe文件包的丢失），双击就可以运行了 应该是杀毒软件的问题，关掉杀毒软件后可以正常运行（结果对错另说）

引用 1 楼 自信男孩的回复:你的代码呢？谁知道你运行的是什么？ 我再把帖子改改

你的代码呢？谁知道你运行的是什么？


Question: 链队列分配内存时出现错误

q的问题。。。

已经解决了，谢谢

贴代码吧，把代码贴全了吧


Question: for循环中i的作用范围

引用 3 楼 Fighting_Boom 的回复:1、for 循环中的 printf 打印中的“i + 1”是输出到“%d”中去的，“i + 1”只是对 i 的读操作，使用完毕之后，不会改变 i 本身的值；但是在循环体中的是“i++”，此时就是先使用 i 的值，然后使 i = i + 1；这个时候才有对 i 的写操作，也就是会改变 i 的值。 2、要判断作用域的话，需要看变量是在哪里声明的。如果是在函数内部，则对整个函数内部有效；如果是在代码块内部（以大括号区分），则只对此代码块有效，出了此范围后就不能使用了。举个例子，如果 for 循环的循环体是这样写的，for(int i = 0; i < num; i++)，此时 i 的作用域只在此 for 循环内的代码块有效，在出了此范围后，就无效（可以自己编译一下试试看）。 3、希望对你有帮助！ 就是这个意思，我忘记printf的i+1不改变i的值了，非常感谢

i的作用域是从定义的位置开始，如果i定义在代码块里，那么作用域就是代码块里。比如在for循环定义一个temp变量；那么循环体外是不能使用temp的。  从楼主的代码来看，i的作用域是整个main函数。

for循环体中并没有声明i，main中只有一个i变量。

为什么要增加2?有没有那个地方要让他增加2


Question: 局部变量定义问题

局部变量分为定义在函数内，定义在程序块内，函数的形式参数。

2楼说的很对，不过我开发过程中会避免重名问题，因为这个会增加人为失误的概率

第二个程序两个都是局部变量呢。没有全局变量，只是if外的x作用域比内部的x更大。但是内部的x会屏蔽外部的x. 所有楼主的问题是作用域大小的问题，不是全局变量和局部变量的问题。两个都是局部变量～  注意内部的x会屏蔽外部的x。

作用域不一样，两个x是不同


Question: 关于LeetCode第一题两数之和的问题

返回的是指针，指向一个一维数组，则需要指明数组的大小。

引用 2 楼 weixin_45906870 的回复:可是returnSize除了被赋值也没有其他操作了啊， 对，那也只是在==target的时候被赋值了。这样可以通过returnSize来确定是否找到==target的。  对于return res;的返回值不能直接使用，因为res在没有找到==target的时候，里面存的是随机值。

可是returnSize除了被赋值也没有其他操作了啊，

上面已经返回res是因为==target了。如果没有等于target就不返回了吗?可以把后面的return作为异常情况。 另外，returnSize的值也可以作为是否找到了==target的两个判断依据。  为什么这么写要看写的人的思路了。


Question: 通过结构体的方式查找文件中的一组数据，并且比较出good.xiaoshou值最大的五组数据

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 yuan_tian_yu 的回复:]目前这个程序无法实现文件的查找功能和统计功能，想问一下如何修改之后可以实现 文件查找最终还是要将文件内容读取到内存，然后执行查找。  [/quote]哦哦……劳烦您能说的更详细一些吗。我这学期刚刚开始学习c语言，对于文件操作这块掌握的不是很扎实。希望您能够说的更具体一些

引用 2 楼 yuan_tian_yu 的回复:目前这个程序无法实现文件的查找功能和统计功能，想问一下如何修改之后可以实现 文件查找最终还是要将文件内容读取到内存，然后执行查找。

目前这个程序无法实现文件的查找功能和统计功能，想问一下如何修改之后可以实现

问题是什么呢？编译不过去？还是结果错误？

引用 4 楼 yuan_tian_yu 的回复:[quote=引用 3 楼 自信男孩 的回复:][quote=引用 2 楼 yuan_tian_yu 的回复:]目前这个程序无法实现文件的查找功能和统计功能，想问一下如何修改之后可以实现 文件查找最终还是要将文件内容读取到内存，然后执行查找。  [/quote]哦哦……劳烦您能说的更详细一些吗。我这学期刚刚开始学习c语言，对于文件操作这块掌握的不是很扎实。希望您能够说的更具体一些[/quote] 读一个记录比较一下，如此循环读和比较


Question: 求助，掷骰子游戏

自己建立一个头文件

引用 1 楼 qq_38674319的回复:你在头文件这里右键转到文档就会发现vs2019中并没有diceroll.h这个头文件 我知道啊，我只想知道怎么办

引用 2 楼 weixin_49233519 的回复:[quote=引用 1 楼 qq_38674319的回复:]你在头文件这里右键转到文档就会发现vs2019中并没有diceroll.h这个头文件 我知道啊，我只想知道怎么办[/quote] 你肯定没看过C的基础知识的。。


Question: 新手求助 关于格式化字符串

".....%X .....  %hX"


Question: c语言设计计算器

你这是要开发新型的计算器嘛？计算器上哪有取余运算。如果你不要百分比非要换成取余那就自己约定呗。输入全部用浮点，然后如果是％号就先把浮点转换成整数再算，不就同时兼并了

scanf("%d%c%d",&a,&d,&b); switch(d) { }	 printf("%d%c%d=%.2f\n",a,d,b,c); 我用switch控制运算符，但是这样写的只能运算输入整型的，我改成输入浮点型的又不能运算%。怎么能同时兼并这两个

你输入/ 和%之前已经输入数字了？如何限制？只能根据/和%自动转换float未整形，否则只能在使用前选择整形和浮点按键。

这个我知道，但是如果写float就不能运算%，我想知道怎么又能输入整型又能输入浮点型，例如第一次是4+1，第二次也可以4.5+1。

float scanf("%f 或者 double scanf("%lf


Question: F5问题求助

引用 1 楼 user-1的回复:有什么问题，内存地址是变化的，每次运行都可能不一样 谢谢大佬，我蠢透了。

有什么问题，内存地址是变化的，每次运行都可能不一样


Question: 进程已退出，返回值为0

调试状态执行一下，崩溃的时候就可以发现问题，如果还不行，可以参考如何在调试状态下发现问题 https://edu.51cto.com/course/23263.html

...还把前面盖掉


Question: 链表合并，不知道为什么通过不了，

引用 19 楼 自信男孩的回复:建议楼主的学号直接用long类型，用char *反而比较复杂～  [quote=引用 18 楼 你的小小栗子 的回复:][quote=引用 14 楼 自信男孩的回复:][quote=引用 12 楼 你的小小栗子 的回复:][quote=引用 9 楼 自信男孩的回复:]#include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct Node {     char cNum[30];     int score;     struct Node *pNext; }node;  //创建链表 node*  Createlist(node *Head,int n) {     node *pNew,*pTemp;     int cnt=0;     Head=NULL;     pNew=pTemp=(node *)malloc(sizeof(node));     if (!pNew)         exit(0);      while(cnt < n)     {         if(cnt==0)         {             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             //pTemp=pNew;             Head=pTemp;             cnt++;         }         else         {             pNew=(node *)malloc(sizeof(node));             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             pTemp->pNext=pNew;             pTemp=pNew;             cnt++;         }     }      return Head; } //合并链表 node* Combinelist(node* Head1,node* Head2) {      node* Head=Head1;     while(Head1->pNext != NULL)     {         Head1=Head1->pNext;     }     Head1->pNext=Head2;      return Head;      /*     node* Head=Head1;     node* pTemp=(node *)malloc(sizeof(node));     while(Head1!=NULL)     {         pTemp=Head1;         Head1=Head1->pNext;     }     pTemp->pNext=Head2;     free(Head1);     return Head;     */ } //排序链表 node* sort(node* Head,int n,int m) {      int i,j;     int cnt=n+m;     node* pTemp;     char Tempnum[30];     int Tempscore;     node * Newhead=Head;     pTemp=(node *)malloc(sizeof(node));     for(i=0;i<cnt-1;i++)     {         for(j=0;j<cnt-1-i;j++)         {             pTemp=Head;             Head=Head->pNext;             if(strcmp(pTemp->cNum,Head->cNum)>0)             {                 strcpy(Tempnum,Head->cNum);                 Tempscore=Head->score;                  strcpy(Head->cNum,pTemp->cNum);                 Head->score=pTemp->score;                  strcpy(pTemp->cNum,Tempnum);                 pTemp->score=Tempscore;              }          }         Head=Newhead;     }      return Newhead;  } //输出链表 node* Printlist(node* Head) {      node * Newhead=Head;     while(Head!=NULL)     {         printf("%s %d\n",Head->cNum,Head->score);         Head=Head->pNext;     }     return Newhead; } int main() {     node *Head1=NULL;     node *Head2=NULL;     node *Head=NULL;     int N,M;     scanf("%d %d",&N,&M);     //getchar();     Head1=Createlist(Head1,N);     Printlist(Head1);     Head2=Createlist(Head2,M);     Printlist(Head2);     Head=Combinelist(Head1,Head2);     Head=sort(Head,N,M);     Printlist(Head);     return 0; } 供参考～  楼主的合并有问题～ 合并没有问题，之前我也是像你那样写的，但是输了0 0会出现指针异常，就是没有考虑到空链表的情况，可能是创建链表写的不够好，所以修改成我现在写的那样，防止了空链表异常的情况，找到测试不通过的问题了，是学号不能数组[/quote]  没问题吗？那你的pTemp申请的空间哪去了？还能找到吗？ 你的循环里pTemp = Head1；这句已经把申请的空间地址覆盖了，还能找到吗？后面free(Head1);那么Head1是刚才申请的空间吗？不要以为测试没问题，就没问题。从逻辑上分析一下，看看会不会有问题。 另外，你的合并就是链表1的尾部接上链表2的头嘛，找到尾部，接上头部就好了。  [/quote] 但是输入0 0后，调试打断点到合并链表的while判断会显示指针异常，请问下这样应该怎么改呢？[/quote] 合并函数里，不会对输入的数值判断呀，我说的是合并函数，修改的也是合并函数即：Combinelist[/quote] 好的，谢谢兄弟，这个问题我想了很久。

建议楼主的学号直接用long类型，用char *反而比较复杂～  引用 18 楼 你的小小栗子 的回复:[quote=引用 14 楼 自信男孩的回复:][quote=引用 12 楼 你的小小栗子 的回复:][quote=引用 9 楼 自信男孩的回复:]#include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct Node {     char cNum[30];     int score;     struct Node *pNext; }node;  //创建链表 node*  Createlist(node *Head,int n) {     node *pNew,*pTemp;     int cnt=0;     Head=NULL;     pNew=pTemp=(node *)malloc(sizeof(node));     if (!pNew)         exit(0);      while(cnt < n)     {         if(cnt==0)         {             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             //pTemp=pNew;             Head=pTemp;             cnt++;         }         else         {             pNew=(node *)malloc(sizeof(node));             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             pTemp->pNext=pNew;             pTemp=pNew;             cnt++;         }     }      return Head; } //合并链表 node* Combinelist(node* Head1,node* Head2) {      node* Head=Head1;     while(Head1->pNext != NULL)     {         Head1=Head1->pNext;     }     Head1->pNext=Head2;      return Head;      /*     node* Head=Head1;     node* pTemp=(node *)malloc(sizeof(node));     while(Head1!=NULL)     {         pTemp=Head1;         Head1=Head1->pNext;     }     pTemp->pNext=Head2;     free(Head1);     return Head;     */ } //排序链表 node* sort(node* Head,int n,int m) {      int i,j;     int cnt=n+m;     node* pTemp;     char Tempnum[30];     int Tempscore;     node * Newhead=Head;     pTemp=(node *)malloc(sizeof(node));     for(i=0;i<cnt-1;i++)     {         for(j=0;j<cnt-1-i;j++)         {             pTemp=Head;             Head=Head->pNext;             if(strcmp(pTemp->cNum,Head->cNum)>0)             {                 strcpy(Tempnum,Head->cNum);                 Tempscore=Head->score;                  strcpy(Head->cNum,pTemp->cNum);                 Head->score=pTemp->score;                  strcpy(pTemp->cNum,Tempnum);                 pTemp->score=Tempscore;              }          }         Head=Newhead;     }      return Newhead;  } //输出链表 node* Printlist(node* Head) {      node * Newhead=Head;     while(Head!=NULL)     {         printf("%s %d\n",Head->cNum,Head->score);         Head=Head->pNext;     }     return Newhead; } int main() {     node *Head1=NULL;     node *Head2=NULL;     node *Head=NULL;     int N,M;     scanf("%d %d",&N,&M);     //getchar();     Head1=Createlist(Head1,N);     Printlist(Head1);     Head2=Createlist(Head2,M);     Printlist(Head2);     Head=Combinelist(Head1,Head2);     Head=sort(Head,N,M);     Printlist(Head);     return 0; } 供参考～  楼主的合并有问题～ 合并没有问题，之前我也是像你那样写的，但是输了0 0会出现指针异常，就是没有考虑到空链表的情况，可能是创建链表写的不够好，所以修改成我现在写的那样，防止了空链表异常的情况，找到测试不通过的问题了，是学号不能数组[/quote]  没问题吗？那你的pTemp申请的空间哪去了？还能找到吗？ 你的循环里pTemp = Head1；这句已经把申请的空间地址覆盖了，还能找到吗？后面free(Head1);那么Head1是刚才申请的空间吗？不要以为测试没问题，就没问题。从逻辑上分析一下，看看会不会有问题。 另外，你的合并就是链表1的尾部接上链表2的头嘛，找到尾部，接上头部就好了。  [/quote] 但是输入0 0后，调试打断点到合并链表的while判断会显示指针异常，请问下这样应该怎么改呢？[/quote] 合并函数里，不会对输入的数值判断呀，我说的是合并函数，修改的也是合并函数即：Combinelist

引用 14 楼 自信男孩的回复:[quote=引用 12 楼 你的小小栗子 的回复:][quote=引用 9 楼 自信男孩的回复:]#include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct Node {     char cNum[30];     int score;     struct Node *pNext; }node;  //创建链表 node*  Createlist(node *Head,int n) {     node *pNew,*pTemp;     int cnt=0;     Head=NULL;     pNew=pTemp=(node *)malloc(sizeof(node));     if (!pNew)         exit(0);      while(cnt < n)     {         if(cnt==0)         {             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             //pTemp=pNew;             Head=pTemp;             cnt++;         }         else         {             pNew=(node *)malloc(sizeof(node));             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             pTemp->pNext=pNew;             pTemp=pNew;             cnt++;         }     }      return Head; } //合并链表 node* Combinelist(node* Head1,node* Head2) {      node* Head=Head1;     while(Head1->pNext != NULL)     {         Head1=Head1->pNext;     }     Head1->pNext=Head2;      return Head;      /*     node* Head=Head1;     node* pTemp=(node *)malloc(sizeof(node));     while(Head1!=NULL)     {         pTemp=Head1;         Head1=Head1->pNext;     }     pTemp->pNext=Head2;     free(Head1);     return Head;     */ } //排序链表 node* sort(node* Head,int n,int m) {      int i,j;     int cnt=n+m;     node* pTemp;     char Tempnum[30];     int Tempscore;     node * Newhead=Head;     pTemp=(node *)malloc(sizeof(node));     for(i=0;i<cnt-1;i++)     {         for(j=0;j<cnt-1-i;j++)         {             pTemp=Head;             Head=Head->pNext;             if(strcmp(pTemp->cNum,Head->cNum)>0)             {                 strcpy(Tempnum,Head->cNum);                 Tempscore=Head->score;                  strcpy(Head->cNum,pTemp->cNum);                 Head->score=pTemp->score;                  strcpy(pTemp->cNum,Tempnum);                 pTemp->score=Tempscore;              }          }         Head=Newhead;     }      return Newhead;  } //输出链表 node* Printlist(node* Head) {      node * Newhead=Head;     while(Head!=NULL)     {         printf("%s %d\n",Head->cNum,Head->score);         Head=Head->pNext;     }     return Newhead; } int main() {     node *Head1=NULL;     node *Head2=NULL;     node *Head=NULL;     int N,M;     scanf("%d %d",&N,&M);     //getchar();     Head1=Createlist(Head1,N);     Printlist(Head1);     Head2=Createlist(Head2,M);     Printlist(Head2);     Head=Combinelist(Head1,Head2);     Head=sort(Head,N,M);     Printlist(Head);     return 0; } 供参考～  楼主的合并有问题～ 合并没有问题，之前我也是像你那样写的，但是输了0 0会出现指针异常，就是没有考虑到空链表的情况，可能是创建链表写的不够好，所以修改成我现在写的那样，防止了空链表异常的情况，找到测试不通过的问题了，是学号不能数组[/quote]  没问题吗？那你的pTemp申请的空间哪去了？还能找到吗？ 你的循环里pTemp = Head1；这句已经把申请的空间地址覆盖了，还能找到吗？后面free(Head1);那么Head1是刚才申请的空间吗？不要以为测试没问题，就没问题。从逻辑上分析一下，看看会不会有问题。 另外，你的合并就是链表1的尾部接上链表2的头嘛，找到尾部，接上头部就好了。  [/quote] 但是输入0 0后，调试打断点到合并链表的while判断会显示指针异常，请问下这样应该怎么改呢？

引用 15 楼 自信男孩 的回复:[quote=引用 6 楼 qiu_shaofeng 的回复:]if(strcmp(pTemp->cNum,Head->cNum)>0) 比较不出学号大小 楼主的学号用的字符串，字符串大小的比较不就是用strcmp吗？ 另外'1'  < '2'这不是正确的吗？[/quote] 对于两位数的确实是"10" < "2"

引用 6 楼 qiu_shaofeng 的回复:if(strcmp(pTemp->cNum,Head->cNum)>0) 比较不出学号大小 楼主的学号用的字符串，字符串大小的比较不就是用strcmp吗？ 另外'1'  < '2'这不是正确的吗？

引用 12 楼 你的小小栗子 的回复:[quote=引用 9 楼 自信男孩的回复:]#include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct Node {     char cNum[30];     int score;     struct Node *pNext; }node;  //创建链表 node*  Createlist(node *Head,int n) {     node *pNew,*pTemp;     int cnt=0;     Head=NULL;     pNew=pTemp=(node *)malloc(sizeof(node));     if (!pNew)         exit(0);      while(cnt < n)     {         if(cnt==0)         {             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             //pTemp=pNew;             Head=pTemp;             cnt++;         }         else         {             pNew=(node *)malloc(sizeof(node));             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             pTemp->pNext=pNew;             pTemp=pNew;             cnt++;         }     }      return Head; } //合并链表 node* Combinelist(node* Head1,node* Head2) {      node* Head=Head1;     while(Head1->pNext != NULL)     {         Head1=Head1->pNext;     }     Head1->pNext=Head2;      return Head;      /*     node* Head=Head1;     node* pTemp=(node *)malloc(sizeof(node));     while(Head1!=NULL)     {         pTemp=Head1;         Head1=Head1->pNext;     }     pTemp->pNext=Head2;     free(Head1);     return Head;     */ } //排序链表 node* sort(node* Head,int n,int m) {      int i,j;     int cnt=n+m;     node* pTemp;     char Tempnum[30];     int Tempscore;     node * Newhead=Head;     pTemp=(node *)malloc(sizeof(node));     for(i=0;i<cnt-1;i++)     {         for(j=0;j<cnt-1-i;j++)         {             pTemp=Head;             Head=Head->pNext;             if(strcmp(pTemp->cNum,Head->cNum)>0)             {                 strcpy(Tempnum,Head->cNum);                 Tempscore=Head->score;                  strcpy(Head->cNum,pTemp->cNum);                 Head->score=pTemp->score;                  strcpy(pTemp->cNum,Tempnum);                 pTemp->score=Tempscore;              }          }         Head=Newhead;     }      return Newhead;  } //输出链表 node* Printlist(node* Head) {      node * Newhead=Head;     while(Head!=NULL)     {         printf("%s %d\n",Head->cNum,Head->score);         Head=Head->pNext;     }     return Newhead; } int main() {     node *Head1=NULL;     node *Head2=NULL;     node *Head=NULL;     int N,M;     scanf("%d %d",&N,&M);     //getchar();     Head1=Createlist(Head1,N);     Printlist(Head1);     Head2=Createlist(Head2,M);     Printlist(Head2);     Head=Combinelist(Head1,Head2);     Head=sort(Head,N,M);     Printlist(Head);     return 0; } 供参考～  楼主的合并有问题～ 合并没有问题，之前我也是像你那样写的，但是输了0 0会出现指针异常，就是没有考虑到空链表的情况，可能是创建链表写的不够好，所以修改成我现在写的那样，防止了空链表异常的情况，找到测试不通过的问题了，是学号不能数组[/quote]  没问题吗？那你的pTemp申请的空间哪去了？还能找到吗？ 你的循环里pTemp = Head1；这句已经把申请的空间地址覆盖了，还能找到吗？后面free(Head1);那么Head1是刚才申请的空间吗？不要以为测试没问题，就没问题。从逻辑上分析一下，看看会不会有问题。 另外，你的合并就是链表1的尾部接上链表2的头嘛，找到尾部，接上头部就好了。

感谢各位，发现是学号问题，刚刚看了测试是这个原因

引用 9 楼 自信男孩的回复:#include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct Node {     char cNum[30];     int score;     struct Node *pNext; }node;  //创建链表 node*  Createlist(node *Head,int n) {     node *pNew,*pTemp;     int cnt=0;     Head=NULL;     pNew=pTemp=(node *)malloc(sizeof(node));     if (!pNew)         exit(0);      while(cnt < n)     {         if(cnt==0)         {             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             //pTemp=pNew;             Head=pTemp;             cnt++;         }         else         {             pNew=(node *)malloc(sizeof(node));             scanf("%s %d",pNew->cNum,&pNew->score);             pNew->pNext=NULL;             pTemp->pNext=pNew;             pTemp=pNew;             cnt++;         }     }      return Head; } //合并链表 node* Combinelist(node* Head1,node* Head2) {      node* Head=Head1;     while(Head1->pNext != NULL)     {         Head1=Head1->pNext;     }     Head1->pNext=Head2;      return Head;      /*     node* Head=Head1;     node* pTemp=(node *)malloc(sizeof(node));     while(Head1!=NULL)     {         pTemp=Head1;         Head1=Head1->pNext;     }     pTemp->pNext=Head2;     free(Head1);     return Head;     */ } //排序链表 node* sort(node* Head,int n,int m) {      int i,j;     int cnt=n+m;     node* pTemp;     char Tempnum[30];     int Tempscore;     node * Newhead=Head;     pTemp=(node *)malloc(sizeof(node));     for(i=0;i<cnt-1;i++)     {         for(j=0;j<cnt-1-i;j++)         {             pTemp=Head;             Head=Head->pNext;             if(strcmp(pTemp->cNum,Head->cNum)>0)             {                 strcpy(Tempnum,Head->cNum);                 Tempscore=Head->score;                  strcpy(Head->cNum,pTemp->cNum);                 Head->score=pTemp->score;                  strcpy(pTemp->cNum,Tempnum);                 pTemp->score=Tempscore;              }          }         Head=Newhead;     }      return Newhead;  } //输出链表 node* Printlist(node* Head) {      node * Newhead=Head;     while(Head!=NULL)     {         printf("%s %d\n",Head->cNum,Head->score);         Head=Head->pNext;     }     return Newhead; } int main() {     node *Head1=NULL;     node *Head2=NULL;     node *Head=NULL;     int N,M;     scanf("%d %d",&N,&M);     //getchar();     Head1=Createlist(Head1,N);     Printlist(Head1);     Head2=Createlist(Head2,M);     Printlist(Head2);     Head=Combinelist(Head1,Head2);     Head=sort(Head,N,M);     Printlist(Head);     return 0; } 供参考～  楼主的合并有问题～ 合并没有问题，之前我也是像你那样写的，但是输了0 0会出现指针异常，就是没有考虑到空链表的情况，可能是创建链表写的不够好，所以修改成我现在写的那样，防止了空链表异常的情况，找到测试不通过的问题了，是学号不能数组

引用 10 楼 遇见女神的回复:[quote=引用 8 楼 你的小小栗子 的回复：][quote=引用 3 楼 遇见女神的回复:]学号用整数类型保存而不是char数组 用字符数组也可以吧，我感觉和这个没啥关系[/quote]就是跟这个有关系。比如“2”分别和“1”、“10”比较，结果如何你自己运行看看。[/quote] 收到，我试一下

引用 8 楼 你的小小栗子 的回复：[quote=引用 3 楼 遇见女神的回复:]学号用整数类型保存而不是char数组 用字符数组也可以吧，我感觉和这个没啥关系[/quote]就是跟这个有关系。比如“2”分别和“1”、“10”比较，结果如何你自己运行看看。

引用 3 楼 遇见女神的回复:学号用整数类型保存而不是char数组 用字符数组也可以吧，我感觉和这个没啥关系

引用 5 楼 自信男孩的回复:楼主没按照学号升序合并呢 有的，样例可以通过

楼主没按照学号升序合并呢

题目出的有问题，你的也太复杂

学号用整数类型保存而不是char数组

样例可以通过，空链表也没问题，但是在oj上通过不了，真没办法了，上来问问大家


Question: CENTOS下   C语言程序  编译时，提示找不到include中的.h文件，请帮忙看一下，如何编译

#include "../include/inc.h"  或者直接添加包含路径

在main.c同级目录下执行 gcc main.c -I../tbjson -I../include -I../eleclib  推荐做好写一个makefile。


Question: pat有关的东西，救救我

有反映了，要乱打个字母才有输出唉，怎么回事

引用 1 楼 自信男孩 的回复:for(i=0;i<n;i++)     {         for(j=1;j<=m;j++)         {             scanf("(%d %[^)]) ",&t,tempc);             if(t!=ques[j].right) {                 ques[j].wrong++;             } else {                 if(strcmp(ques[j].answer,tempc)!=0)                     ques[j].wrong++;                 else                     ren[i]+=ques[j].good;             }         }             if(max<ques[j].wrong)                 max=ques[j].wrong;     } 需要加上大括号，用于区分else和那个if匹配。  另外，scanf是不是应该放在第二层循环外，第一层循环里呢？ if else不是一条语句吗不用加括号吧，scanf是输入一个人的一道题的答案应该是第二层循环， if(max<ques[j].wrong)    max=ques[j].wrong;这个也在第二层循环内吧，不然j>m了；


Question: 求助，写一个C语言程序

输入支持多条的话，可以在一个循环里面输入 如果记录条数有限制的话，那就用数组保存就可以了，如果不受限制，可以用链表 查找，排序都比较简单一一点，就是在数组或者链表中查找，排序可以参考 https://blog.csdn.net/zhanghaiyang9999/article/details/107102728 最后将结果保存到文件中，启动的时候读取进来。文件读写可以参考 https://blog.csdn.net/zhanghaiyang9999/article/details/107032563

你是找人代写工具吗？


Question: C语言问题

真是谢谢！指针学的蒙了，懂了懂了，谢谢！

引用 2 楼 coo135 的回复:冒泡法排序有误，指针的使用有误，请自行比对，改正后如下：  #include <stdio.h> #include <string.h>  void change(const char **p1, int n);  int main() { 	const char *arry[6] = {"赵XX", "赵XX", "钱XX", "孙XX", "李XX", "周XX"}; 	const char **p1; 	int i;  	printf("排序前的数组: \n");  	for(i=0; i < 6; i++) { 		p1 = &arry[i];  		printf("%s\n", *p1); 	}  	change(arry, i); } void change(const char **p1, int n) { 	const char *temp; 	int i,j;  	for(i=0; i < n; i++) { 		for(j=0; j<n-i-1; j++) 			if(strcmp(*(p1+ j), *(p1 + j + 1))>0) { 				temp = *(p1 + j); 				*(p1 + j) = *(p1 + j + 1); 				*(p1 + j + 1) = temp; 			} 	}  	printf("排序后的数组: \n");  	for(i=0; i < n; i++) { 		printf("%s\n", *(p1 + i)); 	} }   确实我才看出来，谢谢。

引用 1 楼 user-2 的回复:把错误截图。   其他的错误搞清楚了，但就是这个搞不清楚，我想知道它能不能以这种方式赋值，如果是我的语句导致了失败，就当我没说吧。   麻烦您了！

把错误截图。


Question: 关于结构体

函数内的结构体声明错误

1.struct 你写成stuct了， 另外，struct student是否在上面有定义。 2. 你定义了一个指针数组 stu，可是你函数体用的是s，s并没有定义。

哈哈，这样的错误大家或多少都出现过

单词拼写错误，编译器已经给指出来，怎么还看不出来呢，英语也需要学好呀

引用 1 楼 棉猴的回复:看一下append()函数的声明，是不是返回值不是void？ 谢谢 已经找到错因啦

引用 2 楼 5250的回复:struct写错了 谢谢 重新写了struct就好了

struct写错了

看一下append()函数的声明，是不是返回值不是void？

stuct ;mian;inculde


Question: 多线程的数据安全问题

引用 23 楼 薛定谔之死猫 的回复:按照楼主的描述，如果代码块没做同步，是不可能得到理想状态的0的，在汇编层级上，a++比++a还多一条指令。百思不得其解的时候可能是犯了低级错误了，主线程是不是没有join子线程？这样的话主线程带了runtime提供的退出进程代码，不管其它线程什么状态都一律通杀，代码执行是不可能完整的 我前面都贴了汇编码了，都是一条指令，a++和++a包括a+=1都被生成了同一条指令。 我有同步啊，不然哪来的结果 不过我又不是在探究同步、探究如何实现正确运算，我是在探究单条指令仍会出错的原因，因为我之前猜测的是线程切换，应该不会出现单条命令的运行错误，现在知道了，是多个处理器在同时运行，即两条线程在真正同时运行，不是切换造成的。

引用 19 楼 早打大打打核战争 的回复:凡是涉及内存访问的指令都不是原子操作（并非单指令就是原子操作），但是实现多线程条件下原子操作并非必须用lock前缀，使用lock前缀是轻量级、高性能，但是硬件依赖的方法。也可以用Semaphore、Multex、Critical Section之类的来实现一段代码串行化。 “凡是涉及内存访问的指令都不是原子操作”这句话是指所有情况，还是排除了lock等方案的情况？

lock 是比 CS PV 更基本的同步原语,  最基本的内核态的 SPINLOCK 也就关闭本核心任务调度,  循环 CAS 设置个标志位,  如果 lock 不是原子的, 根本就无法实现 自旋锁..

凡是涉及内存访问的指令都不是原子操作，所以为了原子化需要加lock前缀 使用Semaphore、Multex、Critical Section之类的来实现一段代码串行化，在串行化代码中访问共享变量相当于单线程操作，没有其他线程竞争，所以访问共享变量的指令不需要加lock前缀

.file   "test.c"         .text         .globl  main         .type   main, @function main: .LFB0:         .cfi_startproc         pushq   %rbp         .cfi_def_cfa_offset 16         .cfi_offset 6, -16         movq    %rsp, %rbp         .cfi_def_cfa_register 6         movl    $0, -4(%rbp)         addl    $1, -4(%rbp)         subl    $1, -4(%rbp)         nop         popq    %rbp         .cfi_def_cfa 7, 8         ret         .cfi_endproc .LFE0:         .size   main, .-main         .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)"         .section        .note.GNU-stack,"",@progbits  如果是整数数据，GCC就算不优化，也是单条汇编指令，VS就不行了，搞了3条。。。。

单行a++的话,如果a是整数，应该是原子操作吧？按说编译器应该能优化吧？不就是inc指令吗？

引用 15 楼 mLee79 的回复:不管生成多少条指令,  各个核心操作的数据是自己的高速缓存,  如果不使用高速缓存一致性协议,  对同一个变量, 不同核心读到的同一个变量值本来就很可能不一致.  在 x86 上, 加 lock 前缀则使用高速缓存一致性协议通知其他核心刷新缓存状态, 在 ARM 上用 ldrex/strex, RISCV 上 lr/sc ..  大部分的U上,  只有写的时候需要通知其他核心缓存失效,  读的时候就随意啦 ... 如果没有lock是否就意为着不是原子操作？我看原子操作库函数生成的汇编码也没有lock，只有a++这类自增自减运算才有

引用 8 楼 月凉西厢 的回复:a++、a--不是原子操作，不加锁肯定有问题啊。就算只有一条指令，当两个线程同时执行，也一样会有竞争问题 操作原子变量是否都应该使用原子操作库？如果汇编码中没有lock指令是否就意味着没有实现原子操作？

引用 2 楼 自信男孩 的回复:没做好同步吧，线程执行线程体执行的先后以及次数是随机的。因此要么做好同步，要么确定好执行的先后 我是在探究问题出现的原因，而不是如何避免这类问题

引用 11 楼 早打大打打核战争 的回复:如果多线程写同一个变量，肯定需要使用原子操作，如果多读一写，通常情况下不需要，除非该变量的位置跨越cache line 我之前说的就是原子类型，a++生成的汇编码有lock，但是a=1却没有，而且前者生成的汇编码很多，后者很少。关键是我试了C11的原子操作库来给变量赋值，生成的汇编码竟然也没有lock，这是不是说明实际上并没有达到原子的效果？

引用 9 楼 真相重于对错 的回复: 对变量a不使用a++而是使用a=a+1，我看汇编码里没有lock了，这时它还有原子操作的功能吗？是不是对于原子变量的操作都应该使用原子操作库？

a++和a--都只有一条汇编码 ---> 这样理解是错误的，从汇编角度上是三条汇编码 实际上的例子 MOV EAX, [g_x]              ; Thread 1: Move 0 into a register.  INC EAX                            ; Thread 1: Increment the register to 1.  MOV [g_x], EAX              ; Thread 1: Store 1 back in g_x.    MOV EAX, [g_x]              ; Thread 2: Move 1 into a register.  INC EAX                            ; Thread 2: Increment the register to 2.  MOV [g_x], EAX              ; Thread 2: Store 2 back in g_x.  After both threads are done incrementing g_x, the value in g_x is 2. This is great and is exactly what we expect: take zero (0), increment it by 1 twice, and the answer is 2. Beautiful. But wait— Windows is a preemptive, multithreaded environment.  So a thread can be switched away from at any time and another thread might continue executing at any time. So the preceding code might not execute exactly as I've written it. Instead, it might execute as follows:    MOV EAX, [g_x]              ; Thread 1: Move 0 into a register.  INC EAX                            ; Thread 1: Increment the register to 1.    MOV EAX, [g_x]              ; Thread 2: Move 0 into a register.  INC EAX                            ; Thread 2: Increment the register to 1.  MOV [g_x], EAX              ; Thread 2: Store 1 back in g_x.    MOV [g_x], EAX         ; Thread 1: Store 1 back in g_x.  If the code executes this way, the final value in g_x is 1—not 2 as you expect! ---------- 这个是反汇编的结果 a++ mov     ecx, [ebp+var_4] add     ecx, 1 mov     [ebp+var_4], ecx

#include <iostream> #include <atomic> #include <thread> using namespace std; atomic_llong a{ 0 }; void func1() { 	for (int i = 0; i < 100000; i++) { 		++a; 	} } void func2() { 	for (int i = 0; i < 100000; i++) 	{ 		--a; 	} } int main() { 	thread t1(func1); 	thread t2(func2); 	t1.join(); 	t2.join(); 	cout << a << endl; }

线程的话我记得好像是同时执行的，不加锁的情况拿到的就是原来的变量值而不是先改变后再拿到改变后的值


Question: c语言显示时换行

根据你的这个表达式，有没有括号没区别。

单个变量没区别，如果是ｉ的式子有区别，可能这样写是把ｉ当式子用的

i如果是一个宏可能需要考虑括号，单个变量没有意义，反而 （i % 4）括号比（i）要有意义一些。

没啥区别，括号有无都可以

没区别吧，括号纯属多余

没区别，括号只是优先运算


Question: 网络编程的时候客户端和服务器怎么知道已经read完该读的内容，需要写了

加个变量保存状态就是了。while（1）｛if（状态）｛read；！状态｝else｛write；！状态｝｝

引用 楼主 walkany 的回复:网络编程的时候客户端和服务器怎么知道已经read完该读的内容，需要写了？   通常是  read()->write()->read()->write()这样的，怎么知道已经读完了这次，该发送数据了呢？ 通过接收返回状态。ｒｅａｄ读到缓存区没有内容为止，这时候没有了应该有一个状态，判断一下就行了应该


Question: C语言，学生管理系统求助

排序可以声明一个临时的student变量，然后冒泡排序时交换结构体

连续输入，用循环就可以了。 排序也很简单，冒泡排序就行了。 冒泡排序可以参考  https://blog.csdn.net/zhanghaiyang9999/article/details/107102728

引用 1 楼 user-2的回复:什么功能无法实现 划线的那几个

什么功能无法实现


Question: C单链表数据输入，打印

#include<stdio.h> #include<stdlib.h>  typedef struct lnode{     int data;     struct lnode *next; }lnode,*linklist;   int main(void) {     linklist l, last;     l=NULL;     int number;     for(int i=0;i<5;i++)     {         //scanf("input a number:%d",&number);         printf("input a number:");         scanf("%d",&number);         linklist s=(lnode*)malloc(sizeof(lnode));         s->data=number;         s->next=NULL;          if (!l)             l = s;         else             last->next = s;         last = s;         /*         linklist last=l;         if(last)         {             while(last->next)             {                 last=last->next;             }             last->next=s;         }         else l=s;         */     }     linklist p=l;     //while(p->next!=NULL)     while(p) {         printf("%d\n",p->data);         p = p->next;     }      return 0; } 供参考～

把你的输入和输出改了一下

#include<stdio.h> #include<stdlib.h> typedef struct lnode{     int data;     struct lnode *next; }lnode , *linklist; int main(void) {     linklist l;     l = NULL;     int number;     for(int i = 0 ; i < 5 ; i ++)     {         printf("input a number:");         scanf("%d",&number);         linklist s = (lnode*)malloc(sizeof(lnode));         s -> data = number;         s -> next = NULL;         linklist last = l;         if(last)         {             while(last -> next) last = last -> next;             last -> next = s;         }         else l = s;     }     linklist p = l;     while(p)     {         printf("%d\n",p -> data);         p = p -> next;     }     return 0; }


Question: 急求帮忙，KMP模式匹配算法，编译无错误，运行出问题

KMP算法是数据结构的内容，在C语言这里提问，估计没有人愿意回答。

你的next数组的计数错误的 因为你这么写是从0开始计数，但实际上你应该从1开始计数


Question: 大佬们，能不能帮忙看一下我这个代码接下来该怎么写

while (Bh<1 || Bh>6)         {             printf("请输入正确的功能编号（1-6）：");             scanf("%d", &Bh);         }         switch (Bh)         {         case 1:             cjyl();                        getchar();             break; 这个可以优化，写这种代码多的能合在一起就合在一起，就不用占用别的资源了，这里用while判断不如直接在switc里default，这个就是除了上面ｃｓａｅ之外的其他情况。 if(fp==NULL)     {         printf("打开文件失败,请重试！\n");         fclose(fp);  //关闭文件          exit(0) ;     }      printf("学号\t姓名\t班级\t高数\t外语\t物理\t程序\t思修\t中传\n");      while(!feof(fp))// 这里你是要重试嘛？重试应该是函数退出返回到上一界面，你这里直接把程序退出是没有重试了的，ｉｆ判断了不存在ｒｅｔｕｒｎ回去下面写存在是可以的，但是规范一点应该把存在用ｅｌｓｅ｛括起来 while(!feof(fp))             fscanf(fp,"%s %s %s %d %d %d %d %d %d",stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);             printf("学号：%d\t", stu[i].ID);             printf("姓名：%s\t", stu[i].Name);             printf("班级：%s\t", stu[i].banji);             printf("高数：%d\t", stu[i].gs);             printf("外语：%d\t", stu[i].wy);             printf("物理：%d\t", stu[i].wl);             printf("程序：%d\t", stu[i].cx);             printf("思修：%d\t", stu[i].sx);             printf("中传：%d\t\n", stu[i].zz);             getchar();         读文件这里你是判断存不存在然后去读这一个信息吧？那只要读那一次就可以了，还有你这里都用了getchar，这个在文件操作中用不到吧，按照格式写再按照格式读就好了，除非你写的时候写完了又写了一个符号进去。写的时候看你一个个传还要制表，有这个必要嘛？如果文件不会单独打开的话尽量直接传结构体，一个结构体传进去，一个结构体读出来，这样不会出错，读和写是要求保持一致的 你的删除本来想讲的，但是看到你的ｎｕｍ觉得也行，但是往上翻了一下，你的添加成绩ｎｕｍ没有做改变啊。细节一定要注意，不然你这个怎么运行都不行那岂不是难受？

谢谢大家的回答

先按照自己的想法写写，不明白的再问吧

有什么问题吗？是编译不通过吗？


Question: 求助

把fscanf中的\n去掉

引用 2 楼 user-2的回复:p=(struct room *)malloc(sizeof(struct room));     head=(struct room *)malloc(sizeof(struct room));  while(!feof(fp))     {         count++;         p=(struct room *)malloc(sizeof(struct room));  p两次分配内存是不是多余了 这个无伤大雅，我复制时出了问题，改完后 一样的问题 只能读一行，同时菜单6功能结束后随便再调用其他函数功能，程序直接非正常结束了

读写文件参考一下这个 https://blog.csdn.net/zhanghaiyang9999/article/details/107032563


Question: 急求一个可视化随机数生成程序

这个之前用cocos2dx-lua做过。要做出很好的效果是不容的。需要作三段帧动画，一个是启滚的动画，然后是快速滚动的动画，最后是慢滚定位数字的动画。三段动画要无缝切换，而且定位到具体数字的算法还要动点脑筋

楼主是把自己当哪位大人了

up视频抽奖吧


Question: 树的遍历遇到一个小问题，跪求大佬解答！

代码太多没看，建议了解一下树的非递归中序遍历算法。


Question: 第三次求助这个问题了

引用 7 楼 chxchxkkk的回复: 把菜单里case0里的write(head)删除。关闭后再运行没出现你说的情况，除了调用write(head)函数换了个地方，其他都是你的代码没有变 大佬 能直接发下源代码吗，万分感谢

就是你的代码修改了一下  #include<stdio.h> #include<stdlib.h> #include<string.h>  struct room {     char state[100];     int price;     int number;     char level[100];     struct room* next; };  struct room *head; struct room *tail; struct room *createlist(); struct room *search(struct room *head); struct room *change(struct room *head,int a); struct room *del(struct room *head,int a); void print(struct room *head);   struct room* createlist()//录入 {     struct room *p;      char state[40];     int price;     int number;     char level[15];      int size=sizeof(struct room);     printf("输入房间编号，等级，价格，状态 注：房间编号为0结束:\n");     scanf("%d",&number);     while(number!=0)     {         scanf("%s%d%s", level, &price, state);         p=(struct room*)malloc(sizeof(struct room));         p->number=number;         strcpy(p->level,level);         p->price=price;         strcpy(p->state,state);         p->next=NULL;         if(head==NULL)             head=p;         else             tail->next=p;         tail=p;         scanf("%d",&number);     }     write(head);     return head;    // system("pause"); }   void print(struct room * head)//显示 {     struct room *ptr;     if(head==NULL)     {         printf("\n no records \n");         return;     }     printf("\n 房间信息为:\n");     printf(" 房间编号\t");     printf(" 房间等级\t");     printf(" 房间价格\t");     printf(" 房间状态\n");     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         printf("    %d\t          %s\t            %d\t     %s\n",ptr->number,ptr->level,ptr->price,ptr->state);     }     system("pause"); }  struct room *change(struct room *head,int a)//修改 {     struct room *ptr;     char state[40];     int price;     int number;     char level[15];      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {if(ptr->number==a)         {printf("输入房间编号，等级，价格，状态:\n");             scanf("%d%s%d%s",&number, level,&price,state);             ptr->number=number;             strcpy(ptr->level,level);             ptr->price=price;             strcpy(ptr->state,state);}     }     system("pause");     return head; }    struct room *del(struct room *head,int a)//删除 {     struct room *ptr;     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         if(ptr->number==a)         {             strcpy(ptr->level,"初始化,请使用修改功能重新录入");             ptr->price=0;             strcpy(ptr->state,"初始化,请使用修改功能重新录入");         }         printf("初始化完成");     }system("pause");     return head; }  struct room *search(struct room *head)//查询 {     int a=0;     struct room *ptr;     printf("\n 空闲房间信息为:\n");     printf(" 房间编号\t");     printf(" 房间等级\t");     printf(" 房间价格\t");     printf(" 房间状态\n");     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {if (strcmp(ptr->state,"空闲")==0)         {a++;             printf("    %d\t          %s\t            %d\t     %s\n",ptr->number,ptr->level,ptr->price,ptr->state);         }}     if(a==0)         printf("当前无空闲房间");     system("pause");     return head; } //读入 struct room * read() {     FILE * fp;     int count=0;     struct room  *head,*p,*q;       q=(struct room *)malloc(sizeof(struct room));     head=(struct room *)malloc(sizeof(struct room));      printf("读取中.....\n");      if((fp = fopen("room.txt", "r")) == NULL )     {         printf("载入失败……未找到存档数据!\n\n");         free(p);         free(head);         return NULL;     }     while(!feof(fp))     {         count++;         p=(struct room *)malloc(sizeof(struct room));         fscanf(fp,"%d %s %d %s\n", &p->number, p->level, &p->price, p->state);          printf("%d %s %d %s \n",p->number,p->level,p->price,p->state);         q->next=p;         q=p;         if(count==1)             head=p;     }      fclose(fp);     return head;  }   void write(struct room * head) {     FILE * fp;     struct room * ptr;     fp = fopen("room.txt", "a+");      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         fprintf(fp,"%d %s %d %s\n",ptr->number,ptr->level,ptr->price,ptr->state);     }      fclose(fp); }    //菜单 void menu() {      int choice=0;     int a=0;     int b=0;      printf("********************************************************************\n");     printf("*      0. 退出系统                                                 *\n");     printf("*      1. 录入信息；*\n");     printf("*      2. 浏览信息；*\n");     printf("*      3. 修改信息;                                                *\n");     printf("*      4. 删除(初始化)信息;                                        *\n");     printf("*      5. 查询信息；*\n");     printf("*      6. 读取信息；*\n");     printf("********************************************************************\n");     printf("\n");       while(1)     { scanf("%d", &choice);         switch (choice) {             case 0:                 //write(head);                 printf("退出成功\n");                 system("pause");                 exit(0);                 break;             case 1:                 head=createlist();                 printf("-------录入完成\n");                 break;             case 2:                 printf("-------浏览信息\n");                 print(head);                 break;             case 3:                 printf("------修改信息\n");                  printf("请输入原来的房间编号:");                 scanf("%d", &a);                 change(head, a);                 break;             case 4:                 printf("------删除信息\n");                 printf("请输入删除的房间编号:");                 scanf("%d", &b);                 del(head, b);                 break;             case 5:                 printf("------查询空闲房间\n");                 search(head);                 break;             case 6:                 head=read();                 printf("读取成功");                 break;             default:                 printf("输入错误，重新输入\n");                 system("pause");                 break;         }}     system("cls");  }  int main() {       while (1) {          menu();     }     return 0; }

引用 5 楼 chxchxkkk 的回复:并没有出现你的情况。  但是你的菜单里只有选择退出才会写入文件，这里就会出现不退出发直接选择6读取文件，但这个文件并不存在， 把write(head)放到录入函数中         write(head);     return head; 结果是这样的：  是我表达能力的问题，大佬，我的意思是，关闭界面，再一次打开界面，读取就出问题了，这是第一次， 跟大佬一样，没什么问题，但关闭界面后，第二次打开，再读取后功能2，显示就出现了屯屯屯乱码，  #include<stdio.h> #include<stdlib.h> #include<string.h>  struct room {     char state[100];     int price;     int number;     char level[100];     struct room* next; }; struct room *head; struct room *tail; struct room *createlist(); struct room *search(struct room *head); struct room *change(struct room *head,int a); struct room *del(struct room *head,int a); void print(struct room *head); //写入 void write(struct room * head) {     FILE * fp;     struct room * ptr;     fp = fopen("room.txt", "a+");      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         fprintf(fp,"%d %s %d %s\n",ptr->number,ptr->level,ptr->price,ptr->state);     }      fclose(fp); }     struct room* createlist()//录入 {     struct room *p;      char state[40];     int price;     int number;     char level[15];      int size=sizeof(struct room);     printf("输入房间编号，等级，价格，状态 注：房间编号0结束:\n");     scanf("%d",&number);     while(number!=0)     {         scanf("%s%d%s", level, &price, state);         p=(struct room*)malloc(size);         p->number=number;         strcpy(p->level,level);         p->price=price;         strcpy(p->state,state);         p->next=NULL;         if(head==NULL)             head=p;         else             tail->next=p;         tail=p;         scanf("%d",&number);     } 	write(head);     return head;     system("pause"); }   void print(struct room * head)//显示 {     struct room *ptr;     if(head==NULL)     {         printf("\n no records \n");         return;     } 	printf("\n房间信息:\n");     printf(" 房间编号\t");     printf(" 房间等级\t");     printf(" 房间价格\t");     printf(" 房间状态\t");      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         printf("    %d\t          %s\t            %d\t     %s\n",ptr->number,ptr->level,ptr->price,ptr->state);     }     system("pause"); }  struct room *change(struct room *head,int a)//修改 {     struct room *ptr;     char state[40];     int price;     int number;     char level[15];      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {if(ptr->number==a)         {printf("输入房间编号，等级，价格，状态:\n");             scanf("%d%s%d%s",&number, level,&price,state);             ptr->number=number;             strcpy(ptr->level,level);             ptr->price=price;             strcpy(ptr->state,state);}     }     system("pause");     return head; }       struct room *del(struct room *head,int a)//删除 {     struct room *ptr;     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         if(ptr->number==a)         {             strcpy(ptr->level,"初始化，请使用修改功能重新输入");             ptr->price=0;             strcpy(ptr->state,"初始化，请使用修改功能重新输入");         }         printf("初始化完成");     }system("pause");     return head; }  struct room *search(struct room *head)//查询 {     int a=0;     struct room *ptr;    printf("\n空闲房间信息:\n");     printf(" 房间编号\t");     printf(" 房间等级\t");     printf(" 房间价格\t");     printf(" 房间状态\t");     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {if (strcmp(ptr->state,"空闲")==0)         {a++;             printf("    %d\t          %s\t            %d\t     %s\n",ptr->number,ptr->level,ptr->price,ptr->state);         }}     if(a==0)         printf("无空闲房间");     system("pause");     return head; }  //读入 struct room *read() { 	FILE *fp; 	struct room *head, *p, *q;  	if ((fp = fopen("room.txt", "r")) == NULL) { 		printf("载入失败，未找到存档数据!\n\n"); 		return NULL; 	}  	q = head = (struct room *)malloc(sizeof(struct room)); 	head->next = NULL; 	printf("读取中.....\n");  	while (!feof(fp)) { 		p = (struct room *)malloc(sizeof(struct room)); 		fscanf(fp, "%d %s %d %s\n", &p->number, p->level, &p->price, p->state); 		p->next = NULL; 		printf("%d %s %d %s \n", p->number, p->level, p->price, p->state);  		q->next = p; 		q = p; 	} 	fclose(fp); 	return head; }     //菜单 void menu() {      int choice=0;     int a=0;     int b=0;      printf("********************************************************************\n");     printf("*      0. 退出系统                                                 *\n");     printf("*      1. 录入信息;*\n");     printf("*      2. 浏览信息;*\n");     printf("*      3. 修改信息;                                                *\n");     printf("*      4. 删除信息(初始化);                                        *\n");     printf("*      5. 查询信息;*\n");     printf("*      6. 读取信息;*\n");     printf("********************************************************************\n");     printf("\n");       while(1)     { scanf("%d", &choice);         switch (choice) {             case 0:                  printf("退出成功\n");                 system("pause");                 exit(0);                 break;             case 1:                 head=createlist();                 printf("-------录入完成\n");                 break;             case 2:                 printf("-------浏览信息\n");                 print(head);                 break;             case 3:                 printf("------修改信息\n");                  printf("请输入房间编号:");                 scanf("%d", &a);                 change(head, a);                 break;             case 4:                 printf("------删除信息\n");                 printf("请输入房间编号:");                 scanf("%d", &b);                 del(head, b);                 break;             case 5:                 printf("------查询空闲房间\n");                 search(head);                 break;             case 6:                 head=read();                 printf("读取成功");                 break;             default:                 printf("输入错误，请重新输入\n");                 system("pause");                 break;         }}     system("cls");  }  int main() {       while (1) {          menu();     }     return 0; }

引用 3 楼 dalaobangmang的回复:[quote=引用 1 楼 user-2 的回复:] [code=c] //读入 struct room *read() { 	FILE *fp; 	struct room *head, *p, *q;  	if ((fp = fopen("room.txt", "r")) == NULL) { 		printf("载入失败……未找到存档数据!\n\n"); 		return NULL; 	}  	q = head = (struct room *)malloc(sizeof(struct room)); 	head->next = NULL; 	printf("读取中.....\n");  	while (!feof(fp)) { 		p = (struct room *)malloc(sizeof(struct room)); 		fscanf(fp, "%d %s %d %s\n", &p->number, p->level, &p->price, p->state); 		p->next = NULL; 		printf("%d %s %d %s \n", p->number, p->level, p->price, p->state);  		q->next = p; 		q = p; 	} 	fclose(fp); 	return head; }    读取还出错了，如图 第二张是保存退出后的文件变化

引用 1 楼 user-2的回复: //读入 struct room *read() { 	FILE *fp; 	struct room *head, *p, *q;  	if ((fp = fopen("room.txt", "r")) == NULL) { 		printf("载入失败……未找到存档数据!\n\n"); 		return NULL; 	}  	q = head = (struct room *)malloc(sizeof(struct room)); 	head->next = NULL; 	printf("读取中.....\n");  	while (!feof(fp)) { 		p = (struct room *)malloc(sizeof(struct room)); 		fscanf(fp, "%d %s %d %s\n", &p->number, p->level, &p->price, p->state); 		p->next = NULL; 		printf("%d %s %d %s \n", p->number, p->level, p->price, p->state);  		q->next = p; 		q = p; 	} 	fclose(fp); 	return head; }   运行结果没有变化(>﹏<)


Question: while循环里面包含switch语句，陷入死循环

引用 2 楼 user-1的回复:且 n 的值最好在每次都赋值一个默认值(default) , 这样,同样的记录也不会再增加一次. 我解决了，因为性别那我定义的是char，但是输的是汉字，所以出错，改完就没问题了。可以不用加那个函数。

输入语句后增加一句:  	fflush(stdin); 清空缓冲区!~~


Question: 各位大佬帮忙看一下代码哪里出现了问题

//5预览成绩信息 void yl(int n) { 	struct score stu[200]; 	int i; 	printf("成绩信息如下：\n"); 	FILE *fp; 	fp=fopen("111.txt","r"); 	if(fp==NULL) 	{              printf("打开文件失败,请重试！\n\n");              fclose(fp);              exit(0); 	} 	printf("学号\t\t   姓名\t\t    班级\t高数\t外语\t物理\t程序\t思修\t中传\n"); 	int c = 0; 	while(!feof(fp)) 	{             fscanf(fp,"%s %s %s %d %d %d %d %d %d\n",                 stu[c].ID,stu[c].Name,stu[c].banji,&stu[c].gs,&stu[c].wy,&stu[c].wl,&stu[c].cx,&stu[c].sx,&stu[c].zz);             c++; 	} 	if(n!=0){//人数不为0 		for(i=0;i<c;i++) 		{                      printf("%-18s%-18s%-10s\t%d\t%d\t%d\t%d\t%d\t%d\n",                        stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz); 		} 	} 	fclose(fp);         fp =NULL; 	printf("显示完毕 ,请按任意键返回\n\n"); 	return; }

修改如下，供参考：#include <stdio.h> #include <string.h> #include <stdlib.h> //成绩结构体 struct score { 	char ID[11]; 	char Name[25]; 	char banji[10]; 	int gs; 	int wy; 	int wl; 	int cx; 	int sx; 	int zz;  };  //函数声明 	void welcome();//主菜单 	void yl(int); //成绩预览 	void cx(int); //成绩查询 	void zj(int); //增加成绩 	int  sc(int); //删除成绩 	int  xg(int);//修改成绩 	void bccj(void);//保存成绩并退出 	void showcxmenu(void);//二级菜单，查询菜单 	void xmcx(int n);//姓名查询 	void xhcx(int);//学号查询  //main函数 int main(int argc, char* argv[]) { 	int flag,n=0,count=0;   //flag标志位,count计数,当前总人数 	//-------------判断文件里面有多少条记录--------------------// 	FILE *fp; 	fp=fopen("111.txt","a+"); 	if(fp==NULL) 	{             printf("打开文件失败,请重试！\n");             fclose(fp);             exit(0); 	}  	while(!feof(fp)) 	{              char cc = fgetc(fp);              if(cc == '\n') count++;//一行一条记录 	} 	fclose(fp);         fp = NULL;          	//---------------------------------// 	do 	{ 		welcome(); 		scanf("%d",&flag);//录入 		switch(flag) 		{ 			case 1: printf("请输入您要录入的人数：");                                 getchar();                                 scanf("%d",&n);                                 zj(n);                                 count += n;                                 break; 			case 2: count=sc(count);                                 break; 			case 3: xg(count);                                 break; 			case 4: cx(count);                                 break; 		        case 5: yl(count);                                 break; 		        case 0: bccj();                                 break; 		       default: printf("输入错误，请重试！\n\n"); 		} 	}while(flag!=0); 	getchar();//getch();  	return 0; }  //0显示菜单 void welcome() { //	system("cls"); 	printf("*************欢迎使用学生成绩管理系统*****************\n"); 	printf("*----------------------------------------------------*\n"); 	printf("*                  1.录入成绩                        *\n"); 	printf("*                  2.删除成绩                        *\n"); 	printf("*                  3.修改成绩                        *\n"); 	printf("*                  4.成绩查询                        *\n"); 	printf("*                  5.显示成绩信息                    *\n"); 	printf("*                  0.保存信息并退出系统              *\n"); 	printf("**********************欢迎使用************************\n"); 	printf("选择操作<0-6>                                         \n"); 	return; }  //1增加成绩 void zj(int n)  {  	struct score stu[100];  	FILE *fp;  	fp=fopen("111.txt","a+");  	if(fp==NULL)  	{             printf("打开文件失败,请重试！\n");             fclose(fp);             exit(0); 	}  	printf("请输入全部学生的学号，姓名，班级，高数成绩，外语成绩，物理成绩，程序成绩，思修成绩，中传成绩；\n");  	int i;  	for(i=0;i<n;i++)  	{             printf("\n----第%d个学生----\n", i+1);             printf("学号:");             getchar();             scanf("%s",&stu[i].ID);              printf("姓名：");             getchar();             scanf("%s,",&stu[i].Name);              printf("班级：");             getchar();             scanf("%s",&stu[i].banji);              printf("高数成绩：");             getchar();             scanf("%d",&stu[i].gs);              printf("外语成绩：");             getchar();             scanf("%d",&stu[i].wy);              printf("物理成绩：");             getchar();             scanf("%d",&stu[i].wl);              printf("程序成绩：");             getchar();             scanf("%d",&stu[i].cx);              printf("思修成绩：");             getchar();             scanf("%d",&stu[i].sx);              printf("中传成绩：");             getchar();             scanf("%d",&stu[i].zz);              fprintf(fp,"%s %s %s %d %d %d %d %d %d\n",  //写入数据                 stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);         }         fclose(fp);         fp = NULL;         printf("添加学生成功,请按任意键返回\n\n");  }  //2删除成绩 int sc(int n) {          if(n==0)           {             printf("已经没有学生成绩信息了,请按任意键返回\n\n");             return n; 	  }          struct score stu[100]; 	char ID[10];//学号  	printf("请输入你要删除的学生学号:");         getchar(); 	scanf("%s", &ID);          int c=0,find=0,index=0; //用于记录目标序号  	FILE *fp; 	fp=fopen("111.txt","r"); 	if(fp==NULL) 	{             printf("打开文件失败,请联系管理员\n\n");             return -1; 	} 	while(!feof(fp))//不为空 	{ 		fscanf(fp,"%s %s %s %d %d %d %d %d %d\n",                 stu[c].ID,stu[c].Name,stu[c].banji,&stu[c].gs,&stu[c].wy,&stu[c].wl,&stu[c].cx,&stu[c].sx,&stu[c].zz);                 //&stu[c].ID,&stu[c].Name,&stu[c].banji,&stu[c].gs,&stu[c].wy,&stu[c].wl,&stu[c].cx,&stu[c].sx,&stu[c].zz); 		if(strcmp(ID,stu[c].ID)==0) 		{  find = 1;//根据学号查找，找到赋值为1                    index = c;//记录编号 		} 		c++; 	} 	fclose(fp);         fp = NULL;  	if(find==0) 	{            printf("没有该学生成绩信息,请按任意键返回\n\n");            return n; 	} 	else 	{            int i;            for(i=index;i<n-1;i++){                stu[i] = stu[i+1];            }            fp=fopen("111.txt","w"); //写入数据            for(i=0;i<n-1;i++)               {                 fprintf(fp,"%s %s %s %d %d %d %d %d %d\n",                    stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);               }            fclose(fp);            fp = NULL;            printf("学号为%s的学生成绩删除成功,请按任意键返回\n\n",ID);            return n-1; 	} }  //3修改成绩 int xg(int n) { 	struct score stu[100];  	FILE *fp;  	char ID[10];  	int find=0;  	printf("请输入要修改的学生学号:");         getchar();  	scanf("%s",ID);   	fp=fopen("111.txt","r");  	if(fp==NULL)  	{            printf("文件打开失败,请联系管理员\n");            return -1;  	}  	int c=0;  	while(!feof(fp)) 	{ 	 	fscanf(fp,"%s %s %s %d %d %d %d %d %d\n",                   stu[c].ID,stu[c].Name,stu[c].banji,&stu[c].gs,&stu[c].wy,&stu[c].wl,&stu[c].cx,&stu[c].sx,&stu[c].zz); 	 	if(strcmp(ID,stu[c].ID)==0) 		 { 		 	find=1; 		 	//修改操作 		 	printf("找到你要修改成绩的同学,请输入他的成绩:\n"); 		 	printf("高数成绩: %d,新成绩为:",stu[c].gs);                         getchar(); 		 	scanf("%d",&stu[c].gs);  		 	printf("外语成绩: %d,新成绩为:",stu[c].wy);                         getchar(); 		 	scanf("%d",&stu[c].wy);  		 	printf("物理成绩: %d,新成绩为:",stu[c].wl);                         getchar(); 		 	scanf("%d",&stu[c].wl);  		 	printf("程序成绩: %d,新成绩为:",stu[c].cx);                         getchar(); 		 	scanf("%d",&stu[c].cx);  		 	printf("思修成绩: %d,新成绩为:",stu[c].sx);                         getchar(); 		 	scanf("%d",&stu[c].sx);  		 	printf("中传成绩: %d,新成绩为:",stu[c].zz);                         getchar(); 		 	scanf("%d",&stu[c].zz);  		}   		c++;  	} 	fclose(fp);         fp = NULL; 	if(find==0) 	{            printf("没有找到要修改的学生记录,请按任意键退出\n\n"); 	} 	else  	{            fp=fopen("111.txt","w");            int i;            for(i=0;i<n;i++)               {                 fprintf(fp,"%s %s %s %d %d %d %d %d %d\n", //更新数据                  stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);               }            fclose(fp);            fp = NULL;            printf("学号为%s同学的成绩已经修改成功,请按任意键返回\n\n",ID);  	}   	return 1; }  //4成绩查询 void cx(int n) //n全班人数 { 	int k; 	do 	{ 		showcxmenu(); 		scanf("%d",&k); 		switch(k) 		{ 			case 1:xhcx(n);break;//学号查询 			case 2:xmcx(n);break;//姓名查询 			case 0:break; 			default:printf("输入错误，请重新选择\n\n"); 		} 	}while(k!=0); 	return; }  //4.0查询菜单 void showcxmenu() { //	system("cls"); 	printf("*----------------------------------------------------*\n"); 	printf("*                 根据制定查询的内容                 *\n"); 	printf("*----------------------------------------------------*\n"); 	printf("*               1： 按学号查询                       *\n"); 	printf("*               2： 按姓名查询                       *\n"); 	printf("*               0： 退出查询系统，返回主系统         *\n"); 	printf("*----------------------------------------------------*\n"); 	printf("选择操作<0-3>                                         \n"); }  //4.1学号查询 void xhcx(int n) { 	struct score stu[100]; 	char ID[10]; 	printf("请输入你要查询学生的学号：");         getchar(); 	scanf("%s",&ID);  	FILE *fp; 	fp=fopen("111.txt ","r"); 	if(fp==NULL) 	{            printf("打开文件失败！\n");            exit(0); 	} 	int i = 0; 	while(!feof(fp)){ 		fscanf(fp,"%s %s %s %d %d %d %d %d %d\n",                    stu[i].ID,stu[i].Name,stu[i].banji,&stu[i].gs,&stu[i].wy,&stu[i].wl,&stu[i].cx,&stu[i].sx,&stu[i].zz); 		i++; 	} 	for(i=0;i<n;i++) 	{ 		if(strcmp(ID,stu[i].ID)==0) 		{                      printf("学号\t姓名\t 班级\t高数\t外语\t物理\t程序\t思修\t中传\n");                      printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",                           stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz);                      printf("按任意键返回\n\n");                      fclose(fp);                      return; 		} 	} 	printf("未找到要查询学生的成绩，请重试！\n\n"); 	fclose(fp);         fp = NULL; 	return; }  //4.2姓名查询 void xmcx(int n) {   	struct score stu[100]; 	char Name[25]; 	printf("请输入你要查询学生的姓名：");         getchar(); 	scanf("%s",&Name); 	FILE *fp; 	fp=fopen("111.txt ","r"); 	if(fp==NULL) 	{            printf("打开文件失败！\n");            exit(0); 	} 	int c = 0; 	while(!feof(fp)){ 		fscanf(fp,"%s %s %s %d %d %d %d %d %d\n",                     stu[c].ID,stu[c].Name,stu[c].banji,&stu[c].gs,&stu[c].wy,&stu[c].wl,&stu[c].cx,&stu[c].sx,&stu[c].zz); 		c++; 	} 	int i; 	for(i=0;i<n;i++) 	{ 		if(strcmp(Name,stu[i].Name)==0) 		{ 			printf("学号\t姓名\t 班级\t高数\t外语\t物理\t程序\t思修\t中传\n"); 			printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",                           stu[i].ID,stu[i].Name,stu[i].banji,stu[i].gs,stu[i].wy,stu[i].wl,stu[i].cx,stu[i].sx,stu[i].zz); 			printf("按任意键返回\n\n"); 			fclose(fp); 			return; 		} 	} 	printf("未找到要查询学生的成绩，请重试！\n\n"); 	fclose(fp);         fp = NULL;         return; }  //5预览成绩信息 void yl(int n) { 	struct score stu[200]; 	int i; 	printf("成绩信息如下：\n"); 	FILE *fp; 	fp=fopen("111.txt","r"); 	if(fp==NULL) 	{              printf("打开文件失败,请重试！\n\n");              fclose(fp);              exit(0); 	} 	printf("学号\t\t   姓名\t\t    班级\t高数\t外语\t物理\t程序\t思修\t中传\n"); 	int c = 0; 	while(!feof(fp)) 	{             f

用了getch（）函数，要加上头文件<conio.h>

主函数当前总人数为啥要除14啊   求大佬讲解

我用的是dev ，5.6.3版本的

除了一些小BUG，VS2012正常运行。

VC2008 所有功能正常呀..

引用 4 楼 user-6的回复:对， 参考一下这个 https://blog.csdn.net/zhanghaiyang9999/article/details/107032563 删除后还是不管用

引用 1 楼 user-6的回复:把scanf最后的\n都去掉 请问大佬说的是fscanf吗？

把scanf最后的\n都去掉


Question: 求助，read函数

引用 1 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include<string.h>  struct room {     char state[100];     int price;     int number;     char level[100];     struct room* next; }; struct room *head; struct room *tail; struct room *createlist(); struct room *search(struct room *head); struct room *change(struct room *head,int a); struct room *del(struct room *head,int a); void print(struct room *head);    struct room* createlist()//录入 {     struct room *p;      char state[40];     int price;     int number;     char level[15];      int size=sizeof(struct room);     printf("输入房间编号，等级，价格，状态 注：房间编号为0结束:\n");     scanf("%d",&number);     while(number!=0)     {         //scanf("%s%d%s",&level,&price,&state);         scanf("%s%d%s", level, &price, state);         p=(struct room*)malloc(size);         p->number=number;         strcpy(p->level,level);         p->price=price;         strcpy(p->state,state);         p->next=NULL;         if(head==NULL)             head=p;         else             tail->next=p;         tail=p;         scanf("%d",&number);     }     return head;     system("pause"); }   void print(struct room * head)//显示 {     struct room *ptr;     if(head==NULL)     {         printf("\n no records \n");         return;     }     printf("\n 房间信息为:\n");     printf(" 房间编号\t");     printf(" 房间等级\t");     printf(" 房间价格\t");     printf(" 房间状态\n");     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         printf("    %d\t          %s\t            %d\t     %s\n",ptr->number,ptr->level,ptr->price,ptr->state);     }     system("pause"); }  struct room *change(struct room *head,int a)//修改 {     struct room *ptr;     char state[40];     int price;     int number;     char level[15];      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {if(ptr->number==a)         {printf("输入房间编号，等级，价格，状态:\n");             //scanf("%d%s%d%s",&number,&level,&price,&state);             scanf("%d%s%d%s",&number, level,&price,state);             ptr->number=number;             strcpy(ptr->level,level);             ptr->price=price;             strcpy(ptr->state,state);}     }     system("pause");     return head; }       struct room *del(struct room *head,int a)//删除 {     struct room *ptr;     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         //if(ptr->number==a);    //多一个分号         if(ptr->number==a)         {             strcpy(ptr->level,"初始化,请使用修改功能重新录入");             ptr->price=0;             strcpy(ptr->state,"初始化,请使用修改功能重新录入");         }         printf("初始化完成");     }system("pause");     return head; }  struct room *search(struct room *head)//查询 {     int a=0;     struct room *ptr;     printf("\n 空闲房间信息为:\n");     printf(" 房间编号\t");     printf(" 房间等级\t");     printf(" 房间价格\t");     printf(" 房间状态\n");     for(ptr=head;ptr!=NULL;ptr=ptr->next)     {if (strcmp(ptr->state,"空闲")==0)         {a++;             printf("    %d\t          %s\t            %d\t     %s\n",ptr->number,ptr->level,ptr->price,ptr->state);         }}     if(a==0)         printf("当前无空闲房间");     system("pause");     return head; } //读入 struct room * read() {     FILE * fp;     int count=0;     struct room  *head,*p,*q;     head=p=q=NULL;      p=(struct room *)malloc(sizeof(struct room));     head=(struct room *)malloc(sizeof(struct room));      printf("读取中.....\n");      if((fp = fopen("room.txt", "r")) == NULL )     {         printf("载入失败……未找到存档数据!\n\n");         free(p);         free(head);    //不用了就应该释放         return NULL;     }     while(!feof(fp))     {         count++;         p=(struct room *)malloc(sizeof(struct room));         fscanf(fp,"%d %s %d %s\n", &p->number, p->level, &p->price, p->state);         //fread(p,sizeof(struct room),1,fp);          printf("%d %s %d %s \n",p->number,p->level,p->price,p->state);         q->next=p;         q=p;         if(count==1)//标记，第一次循环结束将首地址赋给head；             head=p;     }     fclose(fp);     return head;  }   void write(struct room * head) {     FILE * fp;     struct room * ptr;     fp = fopen("room.txt", "a+");      for(ptr=head;ptr!=NULL;ptr=ptr->next)     {         fprintf(fp,"%d %s %d %s\n",ptr->number,ptr->level,ptr->price,ptr->state);     }      fclose(fp); }    //菜单 void menu() {      int choice=0;     int a=0;     int b=0;      printf("********************************************************************\n");     printf("*      0. 退出系统                                                 *\n");     printf("*      1. 录入信息；*\n");     printf("*      2. 浏览信息；*\n");     printf("*      3. 修改信息;                                                *\n");     printf("*      4. 删除(初始化)信息;                                        *\n");     printf("*      5. 查询信息；*\n");     printf("*      6. 读取信息；*\n");     printf("********************************************************************\n");     printf("\n");       while(1)     { scanf("%d", &choice);         switch (choice) {             case 0:                 write(head);                 printf("退出成功\n");                 system("pause");                 exit(0);                 break;             case 1:                 head=createlist();                 printf("-------录入完成\n");                 break;             case 2:                 printf("-------浏览信息\n");                 print(head);                 break;             case 3:                 printf("------修改信息\n");                  printf("请输入原来的房间编号:");                 scanf("%d", &a);                 change(head, a);                 break;             case 4:                 printf("------删除信息\n");                 printf("请输入删除的房间编号:");                 scanf("%d", &b);                 del(head, b);                 break;             case 5:                 printf("------查询空闲房间\n");                 search(head);                 break;             case 6:                 head=read();                 printf("读取成功");                 break;             default:                 printf("输入错误，重新输入\n");                 system("pause");                 break;         }}     system("cls");  }  int main() {       while (1) {          menu();     }     return 0; } 供参考～  读写不匹配。fscanf/fprintf   fread/fwrite分别是读写对  另外，read函数返回的head和你添加上去的都指向head就会导致数据丢失 其他问题详见代码，建议对比找出自己的问题～ 谢谢大佬，解决了一部分问题，可改完后，只能读取一行数据了，之后的都读取不了了，而且我其实最想问的是，不管改前改后，一调用read，程序就非正常结束了，菜单无法正常使用了

推荐读一下 https://blog.csdn.net/zhanghaiyang9999/article/details/107032563


Question: 小白  求大佬解题啦

先自己写写吧，出题比解题的还高兴吗？


Question: 帮我看看这个时间复杂度和空间复杂度，我不是很会看....

引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 5250 的回复:][quote=引用 2 楼 自信男孩 的回复:][quote=引用 1 楼 5250 的回复:]时间复杂度是O(n*m) 空间复杂度O(n) 那么输入不算了吗？输入也是一个循环呢。 所以O（n*m + n)呢。 （m+1) * n[/quote]  当m和n变得更大时候（m+1) * n 趋向于m*n  1可以忽略不计。你可以去看看复杂度的定义[/quote] 对，当m和n趋于无穷大的时候1可以忽略不计，但是你看到的1是乘于n的，你也说了n也变得很大呀，那么这个很大乘于1就变成很小了？[/quote]  当趋向变大的时候  n和n*m不在一个数量级了

引用 3 楼 5250 的回复:[quote=引用 2 楼 自信男孩 的回复:][quote=引用 1 楼 5250 的回复:]时间复杂度是O(n*m) 空间复杂度O(n) 那么输入不算了吗？输入也是一个循环呢。 所以O（n*m + n)呢。 （m+1) * n[/quote]  当m和n变得更大时候（m+1) * n 趋向于m*n  1可以忽略不计。你可以去看看复杂度的定义[/quote] 对，当m和n趋于无穷大的时候1可以忽略不计，但是你看到的1是乘于n的，你也说了n也变得很大呀，那么这个很大乘于1就变成很小了？

引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 5250 的回复:]时间复杂度是O(n*m) 空间复杂度O(n) 那么输入不算了吗？输入也是一个循环呢。 所以O（n*m + n)呢。 （m+1) * n[/quote]  当m和n变得更大时候（m+1) * n 趋向于m*n  1可以忽略不计。你可以去看看复杂度的定义

引用 1 楼 5250 的回复:时间复杂度是O(n*m) 空间复杂度O(n) 那么输入不算了吗？输入也是一个循环呢。 所以O（n*m + n)呢。 （m+1) * n

时间复杂度是O(n*m) 空间复杂度O(n)

引用 5 楼 5250 的回复:[quote=引用 4 楼 自信男孩 的回复:][quote=引用 3 楼 5250 的回复:][quote=引用 2 楼 自信男孩 的回复:][quote=引用 1 楼 5250 的回复:]时间复杂度是O(n*m) 空间复杂度O(n) 那么输入不算了吗？输入也是一个循环呢。 所以O（n*m + n)呢。 （m+1) * n[/quote]  当m和n变得更大时候（m+1) * n 趋向于m*n  1可以忽略不计。你可以去看看复杂度的定义[/quote] 对，当m和n趋于无穷大的时候1可以忽略不计，但是你看到的1是乘于n的，你也说了n也变得很大呀，那么这个很大乘于1就变成很小了？[/quote]  当趋向变大的时候  n和n*m不在一个数量级了[/quote] 恩，有道理  在各种不同算法中，若算法中语句执行次数为一个常数，则时间复杂度为O(1),另外，在时间频度不相同时，时间复杂度有可能相同，如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同，但时间复杂度相同，都为O(n2)。


你看一下这个头文件在什么地方

哭哭，有大神帮帮嘛

明确属性包含的头文件路径下是否包含这些头文件


Question: C语言scanf函数相关，求大佬指教

据我所知，你的scanf应该放在while程序的外面呀

所以这不是一个输入嘛？没输完为什么要回车？

仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

while ((res1 != b || res2 != aa[a]) && res1 != 999) 这条语句前面的语句呢？ 没有前面的语句怎么知道这个res1和res2是什么呀？初始值是多少？还有aa[a]是多少？怎么知道？


Question: 为什么C语言网络编程接收read()函数读取的数据不全？

小弟来反馈了，目前问题已经解决。 在接收数据的时候，的确应该判定read()的返回值。但是上面的代码给定的HEADLEN和bufferlen足以存储接收的数据字段，并不影响数据的接收。 出问题的原因是因为strcat()的问题，其次查看数据使用printf()也会造成数据的缺失。 根本原因就是字符串数组中的"\0"元素，首先是printf()无法打印所有char 数组中的元素，遇到\0就自动停止打印。 其次是"\0"的存在，导致了strcat()函数的 不可靠。  char *strcat(char *dest, const char *src); 1. src所指字符串会添加到dest结尾处，会覆盖dest结尾处的'\0'。 2. strcat 执行后会自动在dest后面添加'\0'。  如果dest和src中都存在"\0"字符，且不是最后一个字符，那么： src不会添加到dest的末尾，而是添加到dest的\0后，同时src添加的字符串仅到\0停止。 例：dest   "1"   "2"  "\0"  "3"   "\0"        src     "4"    "\0"    "5"    "\0" strcat(dest,src) 后，  dest为：   "1"  "2"   "4"   "\0"      为了应对这一问题，改使用memcpy()函数，以解决问题。

read和write都一样，要判断返回值，如果没有发送或者接收完所需字节数，要循环read或write

请仔细阅读recv函数官方说明

转发部分代码：      char buffer[BUFSIZ];          fd_set SocketSet;     FD_ZERO(&FdSet);  //初始化        FD_SET( ClientSocket, &SocketSet);     FD_SET( ServerSocket, &SocketSet);      if (ClientSocket > OracleSocket)         maxfd = ClientSocket;     else maxfd = OracleSocket;      while (1)     {         int ret = select(maxfd + 1, &SocketSet, NULL, NULL, NULL);         if (ret < 0)             break;         if (FD_ISSET(ServerSocket, &SocketSet)) {             GetBuffer(ServerSocket,buffer);             SendBuffer(ClientSocket, buffer);             memset(buffer, 0 , sizeof(buffer));         }         if (FD_ISSET(ClientSocket, &SocketSet)) {             GetBuffer(ClientSocket,buffer);             SendBuffer(OracleSocket, buffer);             memset(buffer, 0 , sizeof(buffer));         }         FD_ZERO(&SocketSet);         FD_SET(ClientSocket, &SocketSet);         FD_SET(ServerSocket, &SocketSet);     }    然后获取socket read()读取数据包的代码是：  int GetBuffer(int socket, char Out[]) {     int ReadCount;     char header[HEADLEN];  // 数据包包头 占 8 byte      read(socket, header, HEADLEN);     int bufferLen;  //数据包包长度（包头前两位）      if (strlen( header) >= 2)         bufferLen =( header[0] )* 256 + (header[1]) - HEADLEN; //16进制 -->10 进制转换     else         bufferLen = 0;      if ( bufferLen > 0 )     {         char buff[bufferLen];         read(socket, buff, bufferLen);         strcat(header, buff);     }     strcat(Out,header);      return 1; }    大佬们抽空指正指正 谢谢

没有代码，没有真相

别print，因为收到的都是二进制数据 你在内存里面看一下具体的值，还有返回的长度

这个是Debug中收到的数据。


Question: 麻烦各位前辈帮我瞅瞅这是啥问题呀，这个老编译器我不会用

贴源码吧，图片不清晰也不够完整～

为啥你这个分号，像是中文的...    ；;；;

说->和.的左边有毛病，所以得看左边是怎么创建的，你贴的这代码不够说明问题

不知道可不可行(代码给全点) 1. 改后缀名为.c 2. 这里是不是少了free

贴代码吧，就这几张图片还不全

p1在哪里定义的 源代码文件后缀是.c还是.cpp


Question: C语言VC下的文件

fp=fopen("D:\\cj.txt","w"); 要用二进制读，这里得用二进制写 fp=fopen("D:\\cj.txt","wb");

引用 1 楼 user-3 的回复:这个不是乱码，你是按照二进制方式写的文件，如果按照文本文件方式读写文件，可以参考  https://blog.csdn.net/zhanghaiyang9999/article/details/107032563 具体怎么改可以稍微写一下吗，不是特别懂，谢谢

引用 1 楼 user-3 的回复:这个不是乱码，你是按照二进制方式写的文件，如果按照文本文件方式读写文件，可以参考  https://blog.csdn.net/zhanghaiyang9999/article/details/107032563 具体要怎么改呢，不是特别懂

如果不想“乱码”，建议用fscanf/fprintf读写文件。  注释掉的部分s未定义，n输入若为0，那这个是有问题的。


Question: fork( )创建两个子进程，父进程显示字符A，子进程分别显示字符 B和字符C。为什么A和C之间被隔开了？

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

引用 2 楼 风继续吹Z 的回复:解决了 问题原因：虚拟机是单核 增加核数量之后就正常了如何增加核数量

怎么增加核数量

解决了 问题原因：虚拟机是单核 增加核数量之后就正常了

因为A和C不是一起输出，他们两个输出在不同的进程里，相互是独立的。 A， B， C先输出那个也是随机的～


Question: 救命!!!

https://blog.csdn.net/zhanghaiyang9999/article/details/107032563  详细介绍了怎么读文件，希望对你有帮助

引用 2 楼 自信男孩的回复:    for (i = 0; i < Diaoyon; i++)         printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);          这样的问题在另一个帖子里已经给你修复了，这个帖子你还是这样发出来，这没法救～  命是自己的，救与不救还是靠自己。 辜负您了!我确实瞎(Ｔ▽Ｔ)


Question: scanf输入字符，打印出来的却是空格

#include "game.h" #include "menu.h"  int startgame() {     int i=0,j;     int link[15][15];     char c,ch;     int a,b,e;     printf("  A B C D E F G H I J K L M N O \n");     for (i=0;i<15;i++)     {         printf("%2d",i);         for (j=0;j<15;j++)         {             link[i][j]=0;             printf("十");         }         printf("\n");     }     while(i<300)     {         if(i%2==0)         {             printf("black:\n");             printf("please enter column:");             scanf("%c",&ch);             printf("please enter line:");             scanf("%d",&a);             getchar();    //for '\n'         }         else         {             printf("white:\n");             printf("please enter column:");             scanf("%c",&ch);             //getchar();             printf("column %c",ch);              printf("\nplease enter line:");             scanf("%d",&a);             getchar();    //for '\n'             printf("%d",a);         }         printf("%c %d\n",ch,a);         while(ch<'A'||ch>'O'||a>15||a<0)         {             printf("enter error! please reenter!");             //scanf("%c%d",ch,&a);             scanf("%c%d", &ch,&a);   //少个&             getchar();    //for '\n'         }          if(ch>='A'&&ch<='I')         {             c=ch-17;             b=atoi(c);         }         else         {             c=ch-25;             b=atoi(c)+10;         }          if(i%2==0)             link[b][a]=1;         else             link[b][a]=2;         system("CLS");         drawlink(link);         e=gameover(link);         if(e==1||e==2)             break;         i++;     }     printf("start game\n");     return e; } 供参考～  试一下这个版本～

#include "game.h" #include "menu.h"  int startgame() { 	int i=0,j; 	int link[15][15]; 	char c,ch; 	int a,b,e; 	printf("  A B C D E F G H I J K L M N O \n"); 	for (i=0;i<15;i++) 	{ 		printf("%2d",i); 		for (j=0;j<15;j++) 		{ 		    link[i][j]=0; 		    printf("十"); 	    } 	    printf("\n"); 	} 	while(i<300) 	{ 		if(i%2==0) 		{ 			printf("black:\n"); 			printf("please enter column:"); 			scanf("%c",&ch); 			printf("please enter line:"); 			scanf("%d",&a); 		} 		else 		{ 			printf("white:\n"); 			printf("please enter column:"); 			scanf("%c",&ch); 			getchar();             printf("column %c",ch); 			 			printf("\nplease enter line:"); 			scanf("%d",&a); 			printf("%d",a); 		} 		printf("%c %d\n",ch,a); 		while(ch<'A'||ch>'O'||a>15||a<0) 	    { 		    printf("enter error! please reenter!"); 		    scanf("%c%d",ch,&a); 	    } 	     	    if(ch>='A'&&ch<='I')      	{ 		    c=ch-17; 		    b=atoi(c);      	} 	    else  	    { 		    c=ch-25; 		    b=atoi(c)+10; 	    } 	     	    if(i%2==0) 		link[b][a]=1; 		else 		link[b][a]=2; 		system("CLS"); 		drawlink(link); 		e=gameover(link); 		if(e==1||e==2) 		break; 		i++; 	} 	printf("start game\n"); 	return e; } 就是31到41行这点

建议楼主把所有代码贴出来吧。对于scanf的%c输入，需要看上下文的。

因为%c只接收一个字符，A前面有个空格，所以ch接收到的是空格


Question: 求问前辈

引用 2 楼 bug10086 的回复:只能找个文件存储上次使用产生的数据，再取读使用 嗯嗯，谢谢

引用 1 楼 user-2 的回复:关闭程序前保存到文件，打开程序先读取文件，如果文件为空然后再输入 好的，感谢

只能找个文件存储上次使用产生的数据，再取读使用

关闭程序前保存到文件，打开程序先读取文件，如果文件为空然后再输入


Question: 明天考试，望大神解答一下。

引用 4 楼 北斗斗姗 的回复:还有就是删除函数里面的 q=p; p=q->next;  不太能理解。 这个说起来不容易说清楚，自己画个图就能明白了

引用 4 楼 北斗斗姗 的回复:还有就是删除函数里面的 q=p; p=q->next;  不太能理解。 你这是删除的else就是当当前节点不是你要删除的数据时，借用个ｑ等于ｐ节点，然后ｐ再指向ｑ的下一个节点，这里两个的作用是等同于p=p->next，但是这样是有问题的，就借用ｑ来转一下

还有就是删除函数里面的 q=p; p=q->next;  不太能理解。

好的，有点理解了。很感谢。

p->next=NULL; q->next=p; q=p;   这几句的意思是把新的结点p接到链表q的尾部，因为单链表的尾必须指向空，所以新加入的结点的next必须指向NULL。

这三行就是添加到链表里面


Question: 前置后置表达式的输出结果

引用 楼主 檀车 侠影的回复: #include<stdio.h> int main() {     int i=0;     printf("%d %d %d %d",i,i++,i,++i);     // 2 1 2 2     printf("%d %d %d %d",i,i++,i,++i);     // 2 2 2 0     return 0; }  能帮忙解释一下 这个前置后置输出结果为什么会这样吗？  下面的注释是输出结果 而且这里还有警告  warming: operation on 'i' may be undefined [-W sequence-point] 你是遇到假的编译器了吗？第二次的printf输出那样?

不要在一行代码对同一个变量‘写操作’数次。  不符合规范不说。 另外也很重要的一点也不方便阅读。 而且最最重要的一点是。程序员不能预测答案。【换个意思就是，如果卷子上写这样的题，那么这道题是没有正确答案的】


Question: 找出最小值

#include <stdio.h> int main() {     int n, i, k, min;     scanf("%d", &n);     for(i = 0; i < n; i++)     {         scanf("%d", &k);         if (i == 0) {             min = k;             continue;         }         if( k < min )             min = k;     }     printf("min = %d", min);      return 0; } 供参考～  漏洞就是min没有初始化呀～

给min赋值一下，当i==0的时候，min赋值为k


Question: 将电脑时间写入字符型或整形。

time_t t; 	time(&t); 	struct tm tm = *localtime(&t); 	char* strtm = asctime(&tm);

可以把需求尝试着说更清楚和明白些～


Question: C语言

2.printf("%d%d\n",e1=0,e2=0); 赋值放打印中不合适。 建议把C语言基础打牢一点再看这些。

1.scanf("%d %d %d %d%d\n",&a1,&a2,&a3,&s1) 参数和可变数量不匹配

#include<stdio.h>  //void main() int main() {     int a1,a2,a3,s1,s,x;     int e1,e2;     //scanf("%d %d %d %d%d\n",&a1,&a2,&a3,&s1);     //scanf("%d %d\n",&s,&x);     //remove \n     scanf("%d %d %d %d",&a1,&a2,&a3,&s1);     scanf("%d %d",&s,&x);     if(s>s1)         printf("%d%d\n",e1=0,e2=0);     else if(x>-a1&&x<a1)         e1=0,e2=0;     else if(x<a1)         e1=0,e2=0;     else if(x==a1)         e1=0,e2=1;     else if(x<=a2)         e1=1,e2=0;     else if(x>0&&x>a2)         e1=0,e2=0;     else if(x<a3)         e1=0,e2=0;     else if(x>a3)         e1=1,e2=0;     printf("%d%d\n",e1,e2); }  供参考～  去掉'\n'即可～


Question: 请大神们看看，这段代码运行时为何会出现hard fault？

可能是因为涉及到浮点运算，然后你的32板子跑不过来。

引用 5 楼 自信男孩 的回复:#include <stdio.h>  typedef struct {     float a;     float b;     float c; } test_t;  int fun_test(void *pdata) {     test_t *temp = (test_t *)pdata;     printf("a = %f, b = %f, c = %f\n", temp->a, temp->b, temp->c);     if(!((temp->a < temp->b) && (temp->b < temp->c))) {         return -1;     }     return 0; }  int main(void) {     unsigned char buf[20] = { 0 };     if(fun_test(buf + 2) < 0) {         printf("Failed.\n");     }     return 0; } 代码没什么问题，输出failed。 其实要看楼主的编译器是32位还是64位，如果是64位，那么 test_t *temp = (test_t *)pdata; 这句是越界了。因为8  x 3 = 24 > 18  谢谢！ 编译器是32位的

引用 4 楼 zgl7903 的回复:猜测： 这个大概率是越界问题，看 sizeof(test_t) 是多少 如果按 结构体字节对齐是8，至少24字节 谢谢！ 是32位的，现在看不是越界的问题，因为单个成员访问的时候没有出现问题

Buf 也是 char 型的.

调试了一下,    if(!((temp->a < temp->b) && (temp->b < temp->c))) {         return -1;  buf[2], buf[3],buf[4],  =0 a,b,c, 全为 0,   当然返回 -1 .

引用 2 楼 user-5 的回复:复制你的代码运行只出现 Failed.  我使用keil编译，运行在cortex m3上，如果我在fun_test（）函数里面定义变量，将buf里的内容拷贝过来，也不会出现故障，比如这样： int func(void *pdata) {     float temp1 = ((test_t *)pdata)->a;     float temp2 = ((test_t *)pdata)->b;     float temp3 = ((test_t *)pdata)->c;      if(!((temp1 < temp2) && (temp2 < temp3))) {         return -1;         }      return 0; }

复制你的代码运行只出现 Failed.

出现故障语句为if(!((temp->a < temp->b) && (temp->b < temp->c)))，如果单独使用if(temp->a < 0)则不会出现问题。


Question: C语言二维数组，字符数组

引用 9 楼 qq_1457346882 的回复:[quote=引用 4 楼 Excel_lent 的回复:] [quote=引用 1 楼 user-3 的回复:] 以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 为啥它们不是字符串呀[/quote] 不是说不是字符串，只是很多函数是要依靠“\０”判断结束的，没有这个会导致功能异常。这就是为什么我上面说还是有点小问题。最好自己重写ｓｔｒｃｐｙ这类函数[/quote] 我把b数组列改为n+1，好像就对了哈

引用 4 楼 Excel_lent 的回复:[quote=引用 1 楼 user-3 的回复:] 以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 为啥它们不是字符串呀[/quote] 不是说不是字符串，只是很多函数是要依靠“\０”判断结束的，没有这个会导致功能异常。这就是为什么我上面说还是有点小问题。最好自己重写ｓｔｒｃｐｙ这类函数

引用 1 楼 user-3 的回复:以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 应该是开辟的空间不够吧改为b[1000][n+1]  引用 7 楼 自信男孩 的回复:[quote=引用 5 楼 Excel_lent 的回复:] [quote=引用 3 楼 自信男孩 的回复:] #include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。 谢谢大佬，初学者有点难看懂哈[/quote]  首先可以试一下，先看对不对。 另外，楼主还没学习malloc、二重指针这些吗？[/quote] 去年学了一学期的c，关于malloc，指针，二重指针，老师都讲的很模糊也很简单只是稍微了解了一下，搞得后面数据结构也学的很吃力。 上面那个问题，我把b数组列改为n+1，好像就对了哈

引用 5 楼 Excel_lent 的回复:[quote=引用 3 楼 自信男孩 的回复:] #include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。 谢谢大佬，初学者有点难看懂哈[/quote]  首先可以试一下，先看对不对。 另外，楼主还没学习malloc、二重指针这些吗？

引用 2 楼 qq_1457346882 的回复:char b[1000][n+1]; ... strcpy(b[g],c); strcpyt(&(b[g][n]),'\0'); 好像都有点小问题，自己实现一下这些函数，也不难 我把b[1000][n]的n改为n+1后。好像就对了哈

引用 3 楼 自信男孩 的回复:#include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。 谢谢大佬，初学者有点难看懂哈

引用 1 楼 user-3 的回复:以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 为啥它们不是字符串呀