Question: 谁能帮我看看这是哪里出了问题（哭辽(´;︵;`)）

引用 3 楼 qinjiankai的回复:第二张图的b指向的是常量区内存（“you are ****……”这个是常量），那个地方的内存你能动吗。。第一张图上的b是在栈上，你动得了它 对对对，刚刚知道了这个问题(҂⌣̀_⌣́)对这种内存啥的不是很明白，谢谢回答(*°∀°)=3

引用 9 楼 棉猴的回复:正如楼上朋友说的，两个代码中，b所处的内存空间是不同的  如下代码中 char *a = "i am teacher."; 	char b[] = "you are a student."; 	char* p = b; 	char *c = "you are a student."; 可以观察下a,b,c和p的值，因为a和c是在堆的常量区中，所以这两个指针的内容靠得很近；而b和p是在栈中，所以离a和c就很远  嗯嗯<(｀^´)>知道了，谢谢！

引用 5 楼 qinjiankai 的回复:[quote=引用 4 楼 xxxiaodi 的回复：][quote=引用 3 楼 qinjiankai的回复:]第二张图的b指向的是常量区内存（“you are ****……”这个是常量），那个地方的内存你能动吗。。第一张图上的b是在栈上，你动得了它 对对对，刚刚知道了这个问题(҂⌣̀_⌣́)对这种内存啥的不是很明白，谢谢回答(*°∀°)=3[/quote]没事没事，给分吧哈哈哈[/quote] 我想问一下，她的char *b="you .......",写全了是const char *b="..." 吗？是可以改变指针的地址，但是不能对指针赋值吗？

直接贴代码吧，图片不清晰也不好调试～

引用 5 楼 qinjiankai的回复:[quote=引用 4 楼 xxxiaodi 的回复：][quote=引用 3 楼 qinjiankai的回复:]第二张图的b指向的是常量区内存（“you are ****……”这个是常量），那个地方的内存你能动吗。。第一张图上的b是在栈上，你动得了它 对对对，刚刚知道了这个问题(҂⌣̀_⌣́)对这种内存啥的不是很明白，谢谢回答(*°∀°)=3[/quote]没事没事，给分吧哈哈哈[/quote] 怎么给分呐，我刚用这个(*｀へ´*)（尴尬）

引用 4 楼 xxxiaodi 的回复：[quote=引用 3 楼 qinjiankai的回复:]第二张图的b指向的是常量区内存（“you are ****……”这个是常量），那个地方的内存你能动吗。。第一张图上的b是在栈上，你动得了它 对对对，刚刚知道了这个问题(҂⌣̀_⌣́)对这种内存啥的不是很明白，谢谢回答(*°∀°)=3[/quote]没事没事，给分吧哈哈哈

你好，我也是一个新手，我看了看，觉得代码是没有问题的，可能是不是编译器出了问题？

救一下孩子吧……………


Question: 关于vs2019随机函数的问题

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


Question: c语言，大神帮忙解释一下

“ABCD”。实际存储的是 {'A',   'B',     'C',    'D',   '\0'.   }                                         p    p+1     p+2  p+3.  p+4

0 字符串是以数字0结尾的 p+4指向的就是这个尾巴


Question: 求大佬的帮助!!!

课设？谁没事帮你写这一大堆东西啊哥们。你可以自己写，不懂的地方再来问的


Question: 求助大佬，想知道图一思考题怎么写，图二怎么写


Question: vs编写的贪食蛇项目中Dubug文件夹中的.exe文件复制出来的文件直接就能用，绿色版的？

可以的吧，太久没用了，记得之前写过表白的窗口是直接用的，但是哪个文件夹里的就不知道了。.exe是编译运行生成的可执行文件，只要环境是常规环境即就可以用

我都不用正式生成一个.exe，就从debug文件夹里复制出来就行了？

有可能需要一些dll

还签名？ 你想多了 这个不是ios或者android开发 windows的应用是有比较复杂的，但是呢你自己的那个简单的很， 估计外部dll，什么系统组件之类的都没有，一个exe文件就可以满天飞了


Question: 为什么vs会提示字节错误？

引用 2 楼 寻开心的回复:vs2019 默认的应该是c++17的标准吧。 对于一些可能存在问题的代码都提出警告。 这些警告不是必须要解决的。 okk，原来是这样，好的谢谢大佬！

代码没有问题 可能是工程设置的问题，或者vs抽风 这些警告也不算错误，可以不搭理它。


Question: c语言，大神帮忙解释一下

逻辑表达式的结果只有0，1两种，BD直接排除的  3<2 不成立， 不影响|| 后面的判断 -1不是0，就等同于true，所以不影响&&后面的判断 4>3-!0  !0 就是1， 3-1=2 ， 4>2 成立  所以答案是a


Question: 数据结构c语言版题，哪位大佬能给解释一下

看书，看定义， 最最基础的 真的没有什么可说的  时间复杂度是怎么算的？ 存储密度是怎么定义的？ 你只要看了书， 这个都有答案， 而且是最最基础的  所以，不打算回答这个问题了。  逼你自己看书。

引用 1 楼 寻开心的回复:O（n） 80% 时间复杂度怎么算，还有下面那个存储密度怎么算

引用 1 楼 寻开心的回复:O（n） 80% 怎么算的，能教教我嘛

O（n） 80%


Question: 数据结构c语言版题，哪位大佬能给解释一下


Question: C语言输入两位小数和三位小数，如何原封不动输出它们

引用 6 楼 寻开心的回复:printf("%g %g", 1.3, 1.25 ); 好的好的，谢谢了

printf("%g %g", 1.3, 1.25 );

%g 指定是可以的

引用 3 楼 寻开心的回复:你要只求一样，当字符串输入输出好啦。 好吧，，其实我这个代码前面是比较输入的小数大小，然后输出它们，没有其他办法了吗

你要只求一样，当字符串输入输出好啦。

引用 1 楼 寻开心的回复:printf的时候指定 %.2f 和 %.3f就好了 如果输入的顺序和元素的个数不是固定的呢

printf的时候指定 %.2f 和 %.3f就好了


Question: 输入一个数字 从右往左打印对应的生成的二进制数 大神帮忙看看错在哪里

恩  还没有学到do...while   循环  不过谢谢您  已经看懂了

我自己会这么写 int num; scanf("%d", &num); 之后  do {     printf("%d", num%2);     num >>=1; } while ( num>0 ); printf("\n");

#include<stdio.h> int main() { 	unsigned int num=0; 	printf("请输入一个0-127之间的整数："); 	scanf("%d",&num); 	char ch=0x01; 	int tmp=1,num1=8; 	for(num;num>0;num>>=1) 	{ 		//int tmp=1,num1=8; 		for(tmp=1;tmp<=num1;tmp++) 		{ 			printf(" "); 		} 		num1--; 		if(num1==4) 		{ 			num1--; 		} 		printf("%d\r",(num&ch)!=0); 	} 	printf("0"); 	printf("\n"); 	return 0; } 这个貌似也可以实现， 就要在最左边补个0才可以  不知道这样操作会不会有bug

#include<stdio.h> int main() { 	int num=0; 	int num1=8; 	int tmp=0,tmp1=1; 	unsigned char ch=0x01; 	printf("请输入一个0-127之间的整数："); 	scanf("%d",&num); 	for(tmp=0;tmp<=7;tmp++) 	{ 		for(tmp1=1;tmp1<=num1;tmp1++) 		{ 			printf(" "); 		} 		num1--; 		if(num1==4) 		{ 			num1--;	 		} 		printf("%d\r",(num&ch)!=0);         	num>>=1; 	} 	printf("\n"); 	return 0; }   谢谢 我用这个代码实现了  我再试试你的代码

#include<stdio.h> int main() { unsigned int num=0; printf("请输入一个0-127之间的整数："); scanf("%d",&num); char ch=0x01; for(num;num>=0;num>>=1) // num>=0 这个条件永远成立。 应该改为 num>0 { printf("%d",(num&ch)!=0); } printf("\n"); return 0; }  此外，你还应该增加一个 输入的数就是0的判断，如果是0，直接输出结果并返回就好了，不是0再进行后面的那循环处理


Question: 文件读入如何解决

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

scanf 和 printf 是从键盘读， 屏幕写 fscanf 和 fprintf 是磁盘文件读写 没有多大的差异  随便百度一下，有很多实例 http://c.biancheng.net/view/2073.html


Question: typedef给结构体取别名可以和结构体名字一样吗？

引用 1 楼 寻开心 的回复:    谢谢！

可以啊  也没有冲突 这样   Books book1； struct Books book2； 都可以同时使用


Question: 新手求教如何用VS编程C语言

引用 1 楼 寻开心的回复:你这个是vscode， 不是visual studio vscode只是一个编辑器，没有vs这种编译功能， 要配置  下visual studio，或者安装dev c++什么的编译器才行 好的  谢谢大佬     感谢


懂了懂了谢谢谢谢，，，

引用 2 楼 qq_45912242 的回复:[quote=引用 1 楼 @矛盾综合体的回复:]数字常量，默认int型 double类型怎么是int类型[/quote] 我是说3,2这两个常量，如果你是x=，y=，然后y=x/y肯定不一样

引用 1 楼 @矛盾综合体的回复:数字常量，默认int型 double类型怎么是int类型

数字常量，默认int型


Question: 链表

LIST_HEAD1( b, 3, 1.2f);就等价于 struct student b = { 3， 1.2f， &b， &b}；

图上显示了啊 那是两种不同的定义方法 第一种，也就是第一张图，很清晰的定义了 第二种，用宏定义来实现的 他们是两种东西不想干  用宏定义也可以做出第一种的类型 #define LIST_HEAD1( varname, n, f ) struct student varname = LIST_HEAD_INIT1(varname, n, f) #define LIST_HEAD_INIT1(varname, n,f)  {n, f, &varname, &varname }  LIST_HEAD1( b, 1, 1.2f);就等价于 struct student b = { 3， 1.2f， &b， &b}；

引用 1 楼 寻开心的回复:按照上面的定义，如果输入： LIST_HEAD(a); 就等价于 struct list_head a = {&a, &a}; 这样就形成了， 图上的那个效果， a.prev = a.next = &a;  只是用宏定义完成了一个变量的定义和初始化的过程 第一张图里那两个指针是指的哪里哇？创建链表按最后一张图就可以了吗？


Question: 结果为什么是how

谢谢你们的帮助，我懂了哈哈哈

字符数组sting2[]，第4个元素是'\0'，你是以数组名的方式输出字符串，字符串输出时，遇到'\0'自动结束，不再输出后续元素。

%s指定的是输出字符串，而字符串是遇到'\0'就是结束  数组后面再多也没有用


Question: 知道的回复一下拜托了

#include<stdio.h> int main() { 	int ix,iy; 	scanf("%d",&ix); 	if(ix>=0) 	{ 		if(ix>5) 		{ 			iy=ix+3; 		} 		else 		{ 			iy=0; 		} 	} 	else 	{ 		iy=2*ix+30; 	} 	printf("%d\n",iy); 	return 0; }


Question: 给结构体typedef ，为什么c语言官方不简化这种操作？

语法定义是什么就是什么， 标准如此，抱怨也没用 也不是坏事，时刻提醒你，那是结构体

这个是慢慢加的，所有没有简化，防止混乱，也是为了兼容性，所有在c++上面就简化了这个


Question: 要想用一个结构体，必须在每个.c文件中都声明一次吗？

是的。 必须要重写或者#include 头文件

[quote=引用 2 楼 寻开心 的回复:] /quote] 谢谢！  在不同的文件中分别定义，a.c中 定义    struct people people1 ；                                             b.c中 定义   struct people people2 ；                                          c.c中 定义    struct people people3；  a.c中本来已经写明了结构体的形式了：  struct people {      int age; }  等于我在b.c中想定义people2 时，还是要重新写一遍（无论是直接写结构体的形式，还是头文件中写了再include），我都需要在b.c中包含 struct people {      int age; } 吗？

你的例子当中 a，b，c里面的各自的变量，都是在.c范围内有效的， 并不能跨越文件生效 结构体的定义是放到头文件里面都， 各自的变量还是在.c文件里面定义的  如果你要a里面定义的变量，在c里面能用，比如： a.c当中定义了的people1，想要在b.c当中使用， 就要在b.c里面加上 extern struct people people1； 这样的一个声明

放入头文件，然后#include它是正解， 头文件存在的目的也就是这个 这样只需要在头文件当中定义一次， 修改也只修改这一个地方， 这比多文件当中重复定义有利多了  头文件里面的是定义，也可以叫做声明， 它都不是实现体  结构体你给的这个形式也都是声明， 你并没有给他定义其类型的变量出来，就不算是实现体。 结构体类型的变量，和其他类型的变量也没有特殊的地方      在某个c/cpp文件当中，定义这个变量      然后在头文件里面用extern struct S a； 来声明，告诉其他的文件有这个变量存在，并可以使用


Question: 我感觉论坛人多点，于是...把我的救急搬了过来

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

啊啊啊啊啊我蠢了我太蠢了 我的问题=-= 我刚刚又仔仔细细看了看我周围的代码 发现果然是小白错误 花括号数量不对！！！！！我还记得我上次的错误是for函数后面打了个分号，这次是花括号.... 啊~我死了~~~

我的结构体： struct Mumber { 	char name[10]; 	long tel; 	int points; }; 我在main函数里定义了一个： struct Mumber m[N];

引用 2 楼 贝壳nia 的回复:[quote=引用 1 楼 不闻窗外事的回复:]你至少应该把你报错的那几行代码发出来吧，看起来是你少写了一个分号，可能是定义结构体的时候没有在最后加分号，或者其他的语句没有加分号，你发的这个代码和你的报错行一点都不一样啊 我发的代码就是报错的地方，它报错的是那两个调用函数[/quote] 那应该是你的函数参数，那个结构体的问题，你看看你的结构体定义是不是没有加分号

引用 1 楼 不闻窗外事的回复:你至少应该把你报错的那几行代码发出来吧，看起来是你少写了一个分号，可能是定义结构体的时候没有在最后加分号，或者其他的语句没有加分号，你发的这个代码和你的报错行一点都不一样啊 我发的代码就是报错的地方，它报错的是那两个调用函数

写代码的习惯，要注意缩进格式啊， 做好对齐关系，这种问题就都一目了然 现在的编译器IDE基本都有自动缩进/代码格式化 的功能吧


Question: 我感觉论坛人多点，于是...把我的救急搬了过来

贴代码吧！你那个明显是语法错误了


Question: viual studio 调试结果一直为0

printf的第二个参数呢， printf（“%lf”， s）这样的啊


Question: C语言大佬请进来，新手在

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

编译分若干步， 预处理， 展开头文件/宏替换/去掉注释/条件编译                      （test.i main .i） 编译，    检查语法，生成汇编                                                      （ test.s  main .s） 汇编，   汇编代码转换机器码                                                         (test.o main.o) 链接     链接到一起生成可执行程序                                              a.out  可以了解一下～  https://blog.csdn.net/weixin_41143631/article/details/81221777

引用 1 楼 寻开心的回复:对的啊  一般来说，头文件是属于一些结构，类型，甚至包括常量等的声明和定义， 编译的时候都要用到的。  何况文件扩展名也不是必须是h和c的， h文件里面我放main函数， 不用c文件也照样可以编译运行 文件扩展名随便起什么操作系统认的就可以，加入到工程文件里面照样编译。 谢谢！！了解


Question: c语言，麻烦大神看一下

讨论这些没有意义的，逗号表达式入参顺序决定了最后的结果，就这个来说相当于 (x--,y--,x+y) 逗号表达式是按顺序计算，返回最后一个表达式的结果 表达式取结果 x+y =11 z++入参时是8那不就等于19了

z++， 先先返回了8，然后z自增为9，这个参数实际传入的是8 x--，y--，x+y 这个逗号表达式x是5，y是6，x+y是11， 传入的是11 结果就是19咯  你在func函数里面，输出一下参数a和b就能看到，a是11， b是8


Question: C语言猜数游戏

种感觉有毛病，不如把guess放进循环吧


Question: 求个大神指点一下Python

引用 1 楼 @矛盾综合体的回复:额，如果是c++或者数据库可能还好，毕竟和c有点关系，尽管说是一通则万法，不过个人还是建议你去Python的论坛发一个帖子，这边了解的应该比较少 找到了  不好意思呀

引用 1 楼 @矛盾综合体的回复:额，如果是c++或者数据库可能还好，毕竟和c有点关系，尽管说是一通则万法，不过个人还是建议你去Python的论坛发一个帖子，这边了解的应该比较少 我找不到Python的论坛……


Question: c语言，麻烦大神看一下这个题选什么

没有对的， "hello" 和 "world" 都是 6个字符长  D 最接近正确， 但是 chara[2][6] 才行。 定义二维数组， 第二个[]里面必须有明确的值；所以AC都是错的 B错误在 char *p[5] = a;上， 左边依然是数组，右边不是，右边是指针了，这不能完成初始化。


Question: C语言杨辉三角求改错

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

k = k * (b - c ) / c;

#include <stdio.h> #include <stdlib.h> int main() {     int k, a, b, c;     scanf("%d", &a);       printf("1\n");              for (b = 2; b <= a;  b++)    {         k = 1；         printf("1 ");                          // 第一个 1         for (c = 1; c <= b - 2; c++)  // 列位置 j 绕过第一个直接开始循环             printf("%d ", (k = (b - c) * k / c));         printf("1\n");               // 最后一个 1，换行     }     getchar();        return 0; }


Question: C语言– 求一批整数中出现最多的个位数字

#include<stdio.h> int main() { 	int n,i,num;int a[10]={0}; 	int max=0; 	scanf("%d",&n); 	for(i=0;i<n;i++) 	{ 		scanf("%d",&num);         if(num==0)             a[0]++; 		while(num>0) 		{ 			a[num%10]++; 			num=num/10; 		} 	} 	for(i=0;i<10;i++) 	{ 		if(max<a[i]) 			max=a[i]; 	} 	printf("%d:",max); 	for(i=0;i<10;i++) 		if(max==a[i]) 			printf(" %d",i);	 } 小错误，这样可以了。

你的测试结果已经告诉你了， 如果输入的数据是0，你的答案就不对了  输入数据后，要先判断n是不是0， 如果是把0的计数加一； 然后再while（n>0）的循环

#include<stdio.h>  int main(void) {     int n, x, i;     int a[10] = { 0 }, max = -1;      scanf("%d", &x);     for (i = 0;i < x;i++) {         scanf("%d", &n);         if (n == 0) {             a[n]++;             continue;         }         while (n > 0) {             a[n % 10]++;             n /= 10;         }     }      //int max = 0;     for (i = 0;i < 10;i++) {         if (a[i] > max) {             max = a[i];         }     }     printf("%d:", max);     for (i = 0;i < 10;i++) {         if (a[i] == max) {             printf(" %d", i);         }     }     return 0; } 供参考～  如果输入3，并且输入3个0呢？结果就不对了。


Question: 这个代码为啥达不到我的预期，咋修改

引用 2 楼 自信男孩 的回复：写这么长的程序还都写完了在调试，这不是跟自己找麻烦吗？为什么不写完一个功能，调试一下没问题了继续写下一个功能呢？ out为什么要多次调用呢？每次调用之后都申请了一个链表，那么append产生的链表怎么不释放呢? 在搜索的功能里，没必要写这么多函数，一个函数搞定，那么多冗余的代码，没必要。还有，搜索里为什么调用那么多次in函数，没必要，反而应该在delete函数里调用in函数吧，这样更新链表，同时也更新文件。  一个文件里代码写多了，错误也就多了，建议先设计好架构，减少代码冗余，好好设计一下；注意不要重复创建链表~这个地方不要判断内存是否申请成功吗？还有为啥要加\n？麻烦大佬把有的地方解释一下，在下刚学C

引用 2 楼 自信男孩 的回复：写这么长的程序还都写完了在调试，这不是跟自己找麻烦吗？为什么不写完一个功能，调试一下没问题了继续写下一个功能呢？ out为什么要多次调用呢？每次调用之后都申请了一个链表，那么append产生的链表怎么不释放呢? 在搜索的功能里，没必要写这么多函数，一个函数搞定，那么多冗余的代码，没必要。还有，搜索里为什么调用那么多次in函数，没必要，反而应该在delete函数里调用in函数吧，这样更新链表，同时也更新文件。  一个文件里代码写多了，错误也就多了，建议先设计好架构，减少代码冗余，好好设计一下；注意不要重复创建链表~谢谢提醒，以后注意

#include<stdio.h> #include<stdlib.h> #include<string.h>  #define N 100 //#define NULL 0  typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em;  em *head;  em *in(em *head)//将数据写进文件 {     FILE *fp;     em *p;     /*        head=(em *)malloc(sizeof(em));        if(head==NULL)        {        printf("分配失败，程序结束\n");        exit(-1);        }        p = head;        p->next=NULL;        */     if((fp=fopen("E:\\职工信息.txt","a"))==NULL)     {         printf("无法打开文件\n");         exit(-1);     }     p = head;     //if (head!=NULL)     while(p!=NULL)     {         //fprintf(fp,"%s %s %s %s %s %s %s %s",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         fprintf(fp,"%s %s %s %s %s %s %s %s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     }     fclose(fp);      return head; } em *out(void)//从文件读取数据 {     FILE*fp;     em *p,/**p1,*/ *p2;     head = (em *)malloc(sizeof(em));     if (!head)         exit(0);     //p1=p2=head;     p2=head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     p=(em *)malloc(sizeof(em));     p->next=NULL;     head->next=NULL;     //while(fscanf(fp, "%s %s %s %s %s %s %s %s",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone)!=EOF)     while(fscanf(fp, "%s %s %s %s %s %s %s %s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone)!=EOF)     {         //p1=p2;         p2->next=p;         p2=p;         p=(em *)malloc(sizeof(em));         p->next=NULL;     }     free(p);     fclose(fp);     return head; }  em *append()//录入员工数据 {     int n,i;      em*p,*end;      if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)             exit(0);         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         //scanf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         scanf("%s%s%s%s%s%s%s%s",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         end->next = p;         end = p;     }     end->next=NULL;     head = in(head);      return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;      em*p = head->next;     //p = p->next;     while(p!=NULL)     {         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     } } void search_num()//工号查询 {     char num[N];     em *p;      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */     printf("请输入要查找的工号\n");     scanf("%s",num);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(num,p->num)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */     printf("请输入要查找的姓名\n");     scanf("%s",name);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->name,name)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char age[N];        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */      printf("请输入要查找的年龄\n");     scanf("%s",age);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->age,age)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char xueli[N];        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */      printf("请输入要查找的学历\n");     scanf("%s",xueli);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->xueli,xueli)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char gongzi[N];        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */     printf("请输入要查找的工资\n");     scanf("%s",gongzi);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(gongzi,p->gongzi)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char adress[N];        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */     printf("请输入要查找的地址\n");     scanf("%s",adress);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->adress,adress)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         else if(p->next==NULL)             printf("无此人信息\n");         head=in(head);     }     if (!p)         printf("无此人信息\n"); } void search_phone()//电话查询 {     em *p;     char phone[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char phone[N];        if(head->next==NULL)        {        printf("此系统为空\n");        return;        }        */     printf("请输入要查找的电话\n");     scanf("%s",phone);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->phone,phone)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search()//查询 {     int a;     printf("\n按职工号查询请按0\n按姓名查询请按1\n按年龄查询请按2\n按学历查询请按3\n按工资查询请按4\n按住址查询请按5\n按电话查询请按6\n返回主菜单请按7\n");     scanf("%d",&a);     switch(a)     {         case 0:printf("按职工号查询\n");search_num();break;         case 1:printf("按姓名查询\n");search_name();break;         case 2:printf("按职年龄查询\n");search_age();break;         case 3:printf("按职学历查询\n");search_xueli();break;         case 4:printf("按职工资查询\n");search_gongzi();break;         case 5:printf("按住址查询\n");search_adress();break;         case 6:printf("按电话资查询\n");search_phone();break;         case 7:printf("返回主菜单\n");break;     } } void Delete()//删除 {     //head=out();     char name[N];     em*p=head->next,*p1=head->next,*p2;     if(head->next==NULL)     {         printf("此通讯录为空\n");         return ;     }     printf("请输入要删除的姓名\n");     scanf("%s",name);     while((strcmp(p->name,name)!=0)&&p->next!=NULL)     {         p1=p;         p=p->next;     }     if(strcmp(name,p->name)==0)     {         if(p==head->next&&p->next!=NULL)             head->next=p->next;         else if(p==head->next&&p->next==NULL)         {             head->next=p->next;             printf("信息已删除，此通讯录为空\n");             return ;         }         else             p1->next=p->next;     }     else{         printf("此信息不存在\n");         return;     }     printf("此消息已删除\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     for(p2=head->next;p2!=NULL;p2=p2->next)         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);     head=in(head); } void change()//修改 {     //head=out();     char name[N];     em*p=head->next;     if(p==NULL)     {         printf("此系统为空\n");         return ;     }     printf("请输入要修改的姓名\n")


Question: 冒泡排序对链表排序，为什么只执行了一次？

代码没细看，但既然是链表，那就最好不要用for(x=0;x<N-1;++x)之类的来作为循环条件,这样的容易访问空指针，导致程序异常 正确的做法是 while(p) { ...... p = p->next; } 这样的代码，阅读性也好

引用 7 楼 柒贰伍玖的回复:这个写法容易出错，例如p和p的next在还没确定是不是空的情况下就去访问其属性，程序会出现无法预知错误 在执行这个函数之前有另一函数进行赋值了，不为空，排序也是交换地址，哪里容易出错呢

在执行这个函数之前有另一函数进行赋值了，不为空，排序也是交换地址，哪里容易出错呢？

引用 5 楼 自信男孩的回复:[quote=引用 4 楼 37504222 的回复:] [quote=引用 1 楼 自信男孩的回复:]直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～ void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }[/quote] 用交换数据部分试一下，这种方法比较简单～[/quote] 那我这个冒泡排序的写法错了吗？

引用 4 楼 37504222 的回复:[quote=引用 1 楼 自信男孩的回复:]直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～ void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }[/quote] 用交换数据部分试一下，这种方法比较简单～

引用 1 楼 自信男孩的回复:直接贴代码吧～  冒泡排序，建议直接交换链表的数据部分，这样处理更清晰，更容易，而交换节点，有一定难度～ void g(struct t *head) {   struct t *p,*q,*k;   int x,y;   for(x=0;x<N-1;++x)    { p=head;printf("%.2f %.2f %.2f\n",head->next->money,head->next->next->money,head->next->next->next->money);    for(y=0;y<N-x-1;++y)   {if(p->next->money<p->next->next->money)      {q=p->next;       k=p->next->next->next;       p->next=p->next->next;       p->next->next=q;       p->next->next->next=k;}       printf("%.2f %.2f %.2f\n",p->next->money,p->next->next->money,p->next->next->next->money);       p=p->next;    }    } }

运行结果只有一次交换


Question: 大佬们，我这里哪错了，就是每次输出完数据之后就中断了。数据能输出，但是输出完就结束了，本来是可以继续往下做别的数据的，不知道是哪里的问题，

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

引用 1 楼 寻开心的回复:这个出栈的代码：   p没有必要分配内存. p = (linstack) malloc(sizeof(stack)) 这句是多余的。      if (s->top == NULL ) return 0;     *x = s->top->data;     p= s->top;     s->top = s->top->top;    free(p);     return *x;  不过这个错误和你的问题没有关系， 退出不会是因为pop这个函数造成的 应该是你的代码控制逻辑上的问题，判断输入是a还是b，然后进行不同函数调用的部分 那我再看看怎么弄一下，谢谢了。


Question: 请教一个字符指针的问题

char * a = "11111"; 这种定义下  “11111” 是字符串常量， 不能被更改 char a[] = "1111" 这种是数组，  内容可以被更改  其次 a和b当中，如果把b 拷贝到 a里面去， a的长度要比b长， 否则就会越界溢出

字符数组可以赋值，但是字符串不能被赋值；就是说字符串是常量，不能修改


Question: 求各位大佬帮忙看看，这是哪里有错

if 语句后面  如果没有大括号 默认后面的一条语句  属于判断条件范围内的 其他的不属于条件范围内，不管条件满不满足都执行  如果紧跟着大括号 大括号内的语句都属于条件范围内，满足条件才执行  另外 函数再用之前要main之前声明 ，如果想不声明，就在main之前实现它的代码

注意加大括号，否则就没有判断的意义了～

引用 6 楼 棉猴的回复:[quote=引用 5 楼 user-4 的回复:] [quote=引用 4 楼 棉猴 的回复:]  void sort(int* a, int* b) { 	int t; 	if (*a < *b) 	{ 		t = *a; 		*a = *b; 		*b = t; 	} }  这样改会不会跟他的思路或是逻辑不一致？看他是sort排序的话，应该是分从小到大还是从大到小的[/quote] 抛砖引玉，抛砖引玉[/quote] 谢谢😜，我明白了，我是新手，嘿嘿，万分感谢

谢谢😜，明白了，万分感谢，我是新手，哈哈

谢谢，懂了，对了，函数声明到main里面是我们课本上写的呀?

引用 5 楼 user-4 的回复:[quote=引用 4 楼 棉猴 的回复:]  void sort(int* a, int* b) { 	int t; 	if (*a < *b) 	{ 		t = *a; 		*a = *b; 		*b = t; 	} }  这样改会不会跟他的思路或是逻辑不一致？看他是sort排序的话，应该是分从小到大还是从大到小的[/quote] 抛砖引玉，抛砖引玉

引用 4 楼 棉猴 的回复: void sort(int* a, int* b) { 	int t; 	if (*a < *b) 	{ 		t = *a; 		*a = *b; 		*b = t; 	} }  这样改会不会跟他的思路或是逻辑不一致？看他是sort排序的话，应该是分从小到大还是从大到小的

代码没问题啊，sort()函数中， if (*a > *b) 只有a指向的内容大于b指向内容时，才会交换。但是a[0]是4，a[1]是6， sort(&a[0], &a[1]); 此时不会触发if语句，所以输出仍然是4,6 如果想触发，要把sort()函数中的if条件改为 if (*a < *b) 此时，VS2015 C++环境调试结果

打错了，是课本

害，你们是现在刻本编的有问题？函数声明不要写main函数里，虽然不会错，代码规范，还有就是不论你的执行语句是一句还是几句，都要加大括号！！！你这个执行起来是if(*a>*b){t=*a} *a=*b; *b=t; 你后面两句就不在if语句里，所以你a[0]的值是a[1]的，a【1】的值是t的


Question: 求助！！！防御导弹问题

错在算法上。算法错了，代码就重写吧。  这个问题是要从敌人发射的导弹的高度的序列当中，找到一个最长的递减的序列 在序列里面的都可以拦截，其他的就等着挨揍就行了

第一发炮弹是最高的，后面再有比第一发高的炮弹是无法拦截的。


Question: c语言题。。。

引用 2 楼 weixin_46055651 的回复：引用 1 楼 寻开心 的回复：你不给题目要求，谁知道你要做什么啊 噢噢噢，不好意思那我重发一个

你不给题目要求，谁知道你要做什么啊

if  ( a[I] >= 'A' && a[o]<='Z' ) {       a[I]  = 'Z' - ( a[I] - 'A');     // 距离’Z'的距离的距离，是变换前距离‘A'的距离： z-newA = oldA-a   -->  newA = z - (oldA-a) } else if ( a[I] >= 'a' && a[I] <= 'z' ) {      a[I] = 'z' - (a[I] - 'a' ); }


Question: 救急！！！麻烦大牛们看一下，这个代码问题出现在哪，咋改。问题是实现员工信息管理系统

引用 3 楼 寻开心 的回复：#define N 100 typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别，如果输入中文男女， 就要至少3个， 如果是英文f，m 2个就够了     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em; em *head=NULL; em *in(em *head)//将数据写进文件 {     if ( head == NULL) return NULL; // 空表无输出     FILE *fp;     em *p;     // 保存文件，不应该是append的方式，应该是覆盖的方式w     if((fp=fopen("E:\\职工信息.txt","w"))==NULL)     {         printf("无法保存文件\n");         return NULL; // 无法保存文件还不至于结束程序         // exit(-1);     }     p = head->next; // 不输出头节点，所以ph直接定位到第一个有效节点上     while(p!=NULL)     {         fprintf(fp,"%s %s %s %s %s %s %s %s\n", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         p = p->next;     }     fclose(fp);     return head; } em *out(void)//从文件读取数据 {     FILE*fp;     em *p, *pEnd;     /*       这里应该先判断head是否为空， 不为空，应该先释放原来链表占据的内存     */     head = (em *)malloc(sizeof(em)); head->next = NULL;     if (!head)         exit(0);     pEnd = head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     while (1) {         p=(em *)malloc(sizeof(em));         p->next=NULL;         // 读取数据，fscanf返回的是读入到指定的参数的个数， 8个字符串         if ( 8 == fscanf(fp, "%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone) ) { // 挂接到尾巴上             pEnd->next = p;             pEnd = p;         } else {             // 没有读取到8个有效字符串，包括读取到文件尾巴的情况             free(p);             pEnd->next = NULL;             break;         }     }     fclose(fp);     return head; }  em *append()//录入员工数据，可被多次调用 {     /*更完善的代码是应该检测，新录入的员工是否和以前的重复的*/     int n,i;     em*p, *end = NULL;     if ( !head) { // 如果是空指针，才新建头         head = (em *)malloc(sizeof(em));         end = head;     } else { // 否则head不变， end定位到最后一个节点上         end = head;         while(end->next !=NULL) end = end->next;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em)); p->next = NULL;         if (!p) exit(0);         printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         end->next = p;         end = p;     };     head = in(head);     return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;     em*p = head->next;     while(p!=NULL)     {         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     } } void search_num()//工号查询 {     char num[N];     em *p;      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工号\n");     scanf("%s",num);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(num,p->num)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的姓名\n");     scanf("%s",name);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->name,name)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的年龄\n");     scanf("%s",age);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->age,age)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的学历\n");     scanf("%s",xueli);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->xueli,xueli)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工资\n");     scanf("%s",gongzi);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(gongzi,p->gongzi)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的地址\n");     scanf("%s",adress);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->adress,adress)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         else if(p->next==NULL)             printf("无此人信息\n");         head=in(head);     }     if (!p)         printf("无此人信息\n"); } void search_phone()//电话查询 {     em *p;     char phone[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的电话\n");     scanf("%s",phone);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->phone,phone)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search()//查询 {     int a;     printf("\n按职工号查询请按0\n按姓名查询请按1\n按年龄查询请按2\n按学历查询请按3\n按工资查询请按4\n按住址查询请按5\n按电话查询请按6\n返回主菜单请按7\n");     scanf("%d",&a);     switch(a)     {case 0:printf("按职工号查询\n");search_num();break;         case 1:printf("按姓名查询\n");search_name();break;         case 2:printf("按职年龄查询\n");search_age();break;         case 3:printf("按职学历查询\n");search_xueli();break;         case 4:printf("按职工资查询\n");search_gongzi();break;         case 5:printf("按住址查询\n");search_adress();break;         case 6:printf("按电话资查询\n");search_phone();break;         case 7:printf("返回主菜单\n");break;     } } void Delete()//删除 {     if ( !head || !head->next ){         printf("此通讯录为空\n");         return ;     }     //head=out();     char name[N];     em *p=head->next, *p1=head,  *p2;      printf("请输入要删除的姓名\n");     scanf("%s",name);     while( p!=NULL && (strcmp(p->name,name)!=0) ){         p1=p;         p=p->next;     }     if ( p == NULL ) { // 是否找到         printf("此信息不存在\n");         return;     }      p2 = p;     p1->next = p->next;     printf("此消息已删除：\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p2->num,p2->name,p2->sex,p2->age,p2->xueli,p2->gongzi,p2->adress,p2->phone);     free(p2);     if ( head->next == NULL ) {         printf("此通讯录为空！");     }     head=in(head); } void menu()//菜单管理初始化 {     printf("**********员工信息管理系统**********\n");     printf("1,录入员工信息\n");     printf("2,浏览员工信息\n");     printf("3,查询员工信息\n");     printf("4,删除员工信息\n");     printf("5,修改员工信息\n");     printf("6,退出\n");     printf("请按此功能序号\n"); } int main() {     int n;     while(1)     {         menu();         scanf("%d",&n);         if(n==1)             append();         else if(n==2)             display(head);         else if(n==3)             search();         else if(n==4)             Delete(); //        else if(n==5) //            change(); 没看到这个函数         else if(n==6) break;         else printf("您输入有错误\n");     }     printf("谢谢您的使用\n");     exit(-1);     return 0; }现在这个代码删除后，不能修改

太长了。 具体哪儿出了问题，你描述问题所在啊  in和out函数肯定是有问题的， in把head存到了文件，out读的时候，又在前面挂了一个空的head头 in和out的行为要保持一致。 head是空头， in就不要存它了。 这样和out能匹配起来  out函数读数据的地方写的太啰嗦 while（1） {      p = malloc ....         if ( fscanf(......) !=EOF )  { // 把数据读到p里面， 确定数据有效         把p挂上      } else {     // 读到文件尾巴了        free(p); // 放弃最后的        设置上列表尾巴的NULL标记        break;     } }  你自己测试找到问题， in一次，out一次看看数据是否一致，借此判定是否正确

引用 3 楼 寻开心 的回复：#define N 100 typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别，如果输入中文男女， 就要至少3个， 如果是英文f，m 2个就够了     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em; em *head=NULL; em *in(em *head)//将数据写进文件 {     if ( head == NULL) return NULL; // 空表无输出     FILE *fp;     em *p;     // 保存文件，不应该是append的方式，应该是覆盖的方式w     if((fp=fopen("E:\\职工信息.txt","w"))==NULL)     {         printf("无法保存文件\n");         return NULL; // 无法保存文件还不至于结束程序         // exit(-1);     }     p = head->next; // 不输出头节点，所以ph直接定位到第一个有效节点上     while(p!=NULL)     {         fprintf(fp,"%s %s %s %s %s %s %s %s\n", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         p = p->next;     }     fclose(fp);     return head; } em *out(void)//从文件读取数据 {     FILE*fp;     em *p, *pEnd;     /*       这里应该先判断head是否为空， 不为空，应该先释放原来链表占据的内存     */     head = (em *)malloc(sizeof(em)); head->next = NULL;     if (!head)         exit(0);     pEnd = head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     while (1) {         p=(em *)malloc(sizeof(em));         p->next=NULL;         // 读取数据，fscanf返回的是读入到指定的参数的个数， 8个字符串         if ( 8 == fscanf(fp, "%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone) ) { // 挂接到尾巴上             pEnd->next = p;             pEnd = p;         } else {             // 没有读取到8个有效字符串，包括读取到文件尾巴的情况             free(p);             pEnd->next = NULL;             break;         }     }     fclose(fp);     return head; }  em *append()//录入员工数据，可被多次调用 {     /*更完善的代码是应该检测，新录入的员工是否和以前的重复的*/     int n,i;     em*p, *end = NULL;     if ( !head) { // 如果是空指针，才新建头         head = (em *)malloc(sizeof(em));         end = head;     } else { // 否则head不变， end定位到最后一个节点上         end = head;         while(end->next !=NULL) end = end->next;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em)); p->next = NULL;         if (!p) exit(0);         printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         end->next = p;         end = p;     };     head = in(head);     return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;     em*p = head->next;     while(p!=NULL)     {         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     } } void search_num()//工号查询 {     char num[N];     em *p;      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工号\n");     scanf("%s",num);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(num,p->num)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的姓名\n");     scanf("%s",name);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->name,name)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的年龄\n");     scanf("%s",age);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->age,age)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的学历\n");     scanf("%s",xueli);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->xueli,xueli)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工资\n");     scanf("%s",gongzi);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(gongzi,p->gongzi)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的地址\n");     scanf("%s",adress);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->adress,adress)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         else if(p->next==NULL)             printf("无此人信息\n");         head=in(head);     }     if (!p)         printf("无此人信息\n"); } void search_phone()//电话查询 {     em *p;     char phone[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的电话\n");     scanf("%s",phone);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->phone,phone)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search()//查询 {     int a;     printf("\n按职工号查询请按0\n按姓名查询请按1\n按年龄查询请按2\n按学历查询请按3\n按工资查询请按4\n按住址查询请按5\n按电话查询请按6\n返回主菜单请按7\n");     scanf("%d",&a);     switch(a)     {case 0:printf("按职工号查询\n");search_num();break;         case 1:printf("按姓名查询\n");search_name();break;         case 2:printf("按职年龄查询\n");search_age();break;         case 3:printf("按职学历查询\n");search_xueli();break;         case 4:printf("按职工资查询\n");search_gongzi();break;         case 5:printf("按住址查询\n");search_adress();break;         case 6:printf("按电话资查询\n");search_phone();break;         case 7:printf("返回主菜单\n");break;     } } void Delete()//删除 {     if ( !head || !head->next ){         printf("此通讯录为空\n");         return ;     }     //head=out();     char name[N];     em *p=head->next, *p1=head,  *p2;      printf("请输入要删除的姓名\n");     scanf("%s",name);     while( p!=NULL && (strcmp(p->name,name)!=0) ){         p1=p;         p=p->next;     }     if ( p == NULL ) { // 是否找到         printf("此信息不存在\n");         return;     }      p2 = p;     p1->next = p->next;     printf("此消息已删除：\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p2->num,p2->name,p2->sex,p2->age,p2->xueli,p2->gongzi,p2->adress,p2->phone);     free(p2);     if ( head->next == NULL ) {         printf("此通讯录为空！");     }     head=in(head); } void menu()//菜单管理初始化 {     printf("**********员工信息管理系统**********\n");     printf("1,录入员工信息\n");     printf("2,浏览员工信息\n");     printf("3,查询员工信息\n");     printf("4,删除员工信息\n");     printf("5,修改员工信息\n");     printf("6,退出\n");     printf("请按此功能序号\n"); } int main() {     int n;     while(1)     {         menu();         scanf("%d",&n);         if(n==1)             append();         else if(n==2)             display(head);         else if(n==3)             search();         else if(n==4)             Delete(); //        else if(n==5) //            change(); 没看到这个函数         else if(n==6) break;         else printf("您输入有错误\n");     }     printf("谢谢您的使用\n");     exit(-1);     return 0; }这个是void change()//修改 {     //head=out();     char name[N];     em*p=head->next;     if(p==NULL)     {         printf("此系统为空\n");         return ;     }     printf("请输入要修改的姓名\n");     scanf("%s",name); while(p!=NULL) {     if(strcmp(p->name,name)==0)     {         printf("请输入您要修改的信息\n");         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);break;     }     printf("修改成功\n");     head=in(head); }

就是运行第一次和第二次的结果不一样


Question: 结构体指针

问题解决了就要结贴哦

in函数？   把队列写入文件 前面/* 。。。*/ 注释掉了，没有意义的错误代码啊。  输出函数再弄个新的head指针没有任何意义。 这个函数就不应该有返回。  函数并没有改变链表的任何东西。  感觉这个函数本来是从磁盘文件读的数据到链表的，所以才会有返回值。然后在这个读入函数基础上改造成了输出。 读入函数需要返回链表的头。 写文件不需要。  而且，从写文件的角度， 头节点写到文件里面没有意义。本来就没有效数据。 没所谓，只要和你的读文件函数能对上就行。 这里写入，读的时候也从磁盘读入head节点才对。

引用 10 楼 自信男孩 的回复：[quote=引用 9 楼 Tony.Lei 的回复:] [quote=引用 7 楼 寻开心 的回复：]开始的 end=NULL只是初始化。没有意义。 em *append()//录入员工数据 {     int n,i;     em*p,*end = NULL; // 弄出个空的头节点     if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }     printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)    exit(0);         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s",p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone); // 这里都是字符串？ p的下面的那些属性都是字符串？          end->next = p; // 挂在end后面          end = p; // 更新end指针     }     end->next=NULL;  // 最后一个节点的next是NULL，表示到了队列尾巴了     head = in(head);   // 这是做啥呢？ 似乎没有意义啊。head一直就没有变过     return head; }  这串代码没有什么问题啊， 除了那个in（head）不知道要做什么。？ 你的疑问是什么东西。麻烦您看一下下面那个代码[/quote] 自己写的代码不知道in函数是做什么的吗？  in是写文件，append函数是追加，即给链表追加节点，调用in是将追加的信息更新到文件中。[/quote]好的，谢谢，能否回答一下我刚刚问您的那个帖子

引用 9 楼 Tony.Lei 的回复:[quote=引用 7 楼 寻开心 的回复：]开始的 end=NULL只是初始化。没有意义。 em *append()//录入员工数据 {     int n,i;     em*p,*end = NULL; // 弄出个空的头节点     if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }     printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)    exit(0);         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s",p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone); // 这里都是字符串？ p的下面的那些属性都是字符串？          end->next = p; // 挂在end后面          end = p; // 更新end指针     }     end->next=NULL;  // 最后一个节点的next是NULL，表示到了队列尾巴了     head = in(head);   // 这是做啥呢？ 似乎没有意义啊。head一直就没有变过     return head; }  这串代码没有什么问题啊， 除了那个in（head）不知道要做什么。？ 你的疑问是什么东西。麻烦您看一下下面那个代码[/quote] 自己写的代码不知道in函数是做什么的吗？  in是写文件，append函数是追加，即给链表追加节点，调用in是将追加的信息更新到文件中。

引用 7 楼 寻开心 的回复：开始的 end=NULL只是初始化。没有意义。 em *append()//录入员工数据 {     int n,i;     em*p,*end = NULL; // 弄出个空的头节点     if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }     printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)    exit(0);         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s",p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone); // 这里都是字符串？ p的下面的那些属性都是字符串？          end->next = p; // 挂在end后面          end = p; // 更新end指针     }     end->next=NULL;  // 最后一个节点的next是NULL，表示到了队列尾巴了     head = in(head);   // 这是做啥呢？ 似乎没有意义啊。head一直就没有变过     return head; }  这串代码没有什么问题啊， 除了那个in（head）不知道要做什么。？ 你的疑问是什么东西。麻烦您看一下下面那个代码

em *in(em *head)//将数据写进文件 {     FILE *fp;     em *p;     /*        head=(em *)malloc(sizeof(em));        if(head==NULL)        {        printf("分配失败，程序结束\n");        exit(-1);        }        p = head;        p->next=NULL;      */      if((fp=fopen("E:\\职工信息.txt","a"))==NULL)     {         printf("无法打开文件\n");         exit(-1);     }     p = head;     while(p!=NULL)     {         //fprintf(fp,"%s %s %s %s %s %s %s %s",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         fprintf(fp,"%s %s %s %s %s %s %s %s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     }     fclose(fp);     return head; }这个是in（）；这几个/*   */的地方有点懵，大佬能能否解释一下

引用 4 楼 自信男孩 的回复：[quote=引用 2 楼 Tony.Lei 的回复:]  em *append()//录入员工数据 {     int n,i;     em*p,*end = NULL;     if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }     printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)             exit(0);         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     scanf("%s%s%s%s%s%s%s%s",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         end->next = p;         end = p;     }     end->next=NULL;     head = in(head);     return head; } 这里的NULL有几个含义？ NULL是初始化结构体指针的指针域，这样用于遍历链表时有一个结束标识[/quote]开始end那个地方null是啥意思

引用 3 楼 寻开心 的回复：不是必须有的 有它更方便而已。  可以让head指针一直有效， 否则空链表要判断head是否为空，插入的时候也要判断头指针是否存在麻烦一些麻烦大佬看一下上面的代码解释一下，我有点懵

引用 2 楼 Tony.Lei 的回复:em *append()//录入员工数据 {     int n,i;     em*p,*end = NULL;     if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }     printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)             exit(0);         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     scanf("%s%s%s%s%s%s%s%s",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         end->next = p;         end = p;     }     end->next=NULL;     head = in(head);     return head; } 这里的NULL有几个含义？ NULL是初始化结构体指针的指针域，这样用于遍历链表时有一个结束标识

什么意思，指针域还是数据域，你说的是数据域吧，可以发下代码看看


Question: 两个问题

没发现会报错呢～都可以正常输出。  加上const后更能标识x是一个字符串常量

你所说的去掉const会报错，应该是 c++11标准的问题 “123” 本身就是一个 const char*类型， 把它赋值给 char *类型是类型不匹配， 你加一个强制转换就可以了 char * c = （char *） “123”；  这点在不同的编译器和编译设置上会有不同的表现， dev c++可能根本就不报错， VS高版本就会报错， XCode 就是一个警告

你要看printf函数的原型啊 printf的函数原型，第一个参数就是 char *， 本来需要的就是“”p printf的第一参数用const char * 会不会报错，是编译器的事儿，检查严格不严格了。  char * c = “123”；  这只是表示 c这个指针的值可以被改变； 你可以回头就让 c = &ch； 这样的再次赋值 const char * c  = “123”； 表示c不可以再更改了


Question: 帮忙看看这个怎么改啊

你单词打错了，错误报的是没定义students不是stduents


Question: 期末c语言实验报告求助

#include <iostream> int main() {     using namespace std;     //节省输入时间     freopen("unhappy_in.txt","r",stdin);     //0、1列分别存放学校和妈妈安排的时间     //2列存放不高兴的程度     int a[7][3];     //max存放当前最不高兴的那天的下标     int max=-1;            //周一到周日     for (int i=0;i<7;++i)       {         //输入         cin>>a[i][0]>>a[i][1];         //当天不高兴         if (a[i][0]+a[i][1]>8)           {             //当天不高兴程度             a[i][2]=a[i][0]+a[i][1]-8;             //修改最不高兴的下标             if (max==-1)               max=i;             else               //为什么是大于，因为程度相等只要输出               //前面那天，所以相等时不修改               if (a[i][2]>a[max][2])                 max=i;           }         else            a[i][2]=0;       }     cout<<max+1;     return 0; }  从以上代码可以看出，程序不需要其他修改。另外，虽然这里使用的是C++的方式，其实C语言的方式也是可以的

引用 3 楼 user-2 的回复:FILE *fp = fopen("result.txt","w");         if(fp==NULL){                 perror("fail to read");                 exit(1);         } int i=0;         while(i<10){               fread(&stu[i],sizeof(struct student),1,fp);               i++；         } fclose(fp); 试一下 不过这样写的话读就只能读这个格式写入的文件了 写错了，fread是读，fwrite是写

引用 1 楼 liups的回复:freopen("xxx.out","w",stdout) 了解一下 有没有完整代码参考一下，谢谢

freopen("xxx.out","w",stdout) 了解一下


Question: c程序设计题目，求助

引用 1 楼 自信男孩 的回复:代码不建议截图，另外，把你的问题描述清楚，而不是让别人给你找问题～ 同意。还想让别人自问自答，那是闲得蛋疼。

代码不建议截图，另外，把你的问题描述清楚，而不是让别人给你找问题～


Question: C语言实现C++多态之诸葛亮的锦囊妙计

第一次写帖子，还不知道格式


Question: 三维基本勾股数组

还真是不全， 这个公式确实有问题 那就穷举吧 假定三个数 a b c  且a < b < c  以b为主循环      第二重循环 a 从 1小于b           a*a +b*b 是否能构成一个平方数 c*c

引用 1 楼 寻开心 的回复:3 ，4 ， 5 5 ，12 ，13 7 ，24 ， 25 9 ，40 ，41 …… 规律是： 2n+1，2n²+2n ，2n²+2n+1  看一组数是否为勾股数，首先除去最大公约数，再看较大的两个数是否相差1，且较大的两数之和是最小数的平方。  例如： 6 8 10 是要先变成3 4 5的然后就满足了前面的规则 显然不全，8，15，17


Question: c++

公式直接出答案  写代码吧， 自己写，这个就是锻炼基础的能力的啊  错了贴出来 改就是了

int while_Func() { 	unsigned int i = 1; 	unsigned int sum1 = 0, sum2 = 0, sum3 = 0; 	while (i<98) 	{ 		sum1 += i; 		sum2 += i + 1; 		sum3 += i + 2; 		i += 3; 	} 	printf("1 + 4 + 7 + 10 + 13 + ……的和:%u\n", sum1); 	printf("2 + 5 + 8 + 11 + 14 + ……的和:%u\n", sum2); 	printf("3 + 6 + 9 + 12 + 15 + ……的和:%u\n", sum3); 	return 0; }  int for_Func() { 	unsigned int sum1 = 0, sum2 = 0, sum3 = 0; 	for (unsigned int i = 1; i < 98; i += 3) 	{ 		sum1 += i; 		sum2 += i+1; 		sum3 += i+2; 	} 	printf("1 + 4 + 7 + 10 + 13 + ……的和:%u\n", sum1); 	printf("2 + 5 + 8 + 11 + 14 + ……的和:%u\n", sum2); 	printf("3 + 6 + 9 + 12 + 15 + ……的和:%u\n", sum3); 	return 0; }


Question: 怎么把goto语句换掉？

引用 4 楼 自信男孩的回复:#include <stdio.h>   void f5() {     double r,s;     int a[100],i,j,k,q,w;      printf("\n\n一位、二位的平方数：");     for(i=0;i<=9;i++)     {         a[i]=i*i;printf("%4d",a[i]);     }     printf("\n\n金蝉平方数：");     for(i=sqrt(100);i<=sqrt(9876543210);i++)     {         r=s=i*i;         if(chongfu(s)!=1) continue;         w=log10(s)+1;         while(w>2)         {             r=fmod(r,pow(10,w-1));  //求余             r=(long)(r/10);             q=sqrt(r);             if(r!=q*q)                 break;//goto h;             w=w-2;         }         if (w > 2)             continue;         for(j=0;j<=9;j++)             if(r==a[j])                 printf("%6.0lf",s); //h:;     } } 供参考～  你的h:后要做什么？  如果什么都不做，上面这样改是可以的。 应该是什么都不做，谢谢了

非要改 考虑改成函数内部return  注意 传入参数 还需要注意函数调用完成之后 要有特定方法 用于跳过后面的循环

把流程图画清楚，就知道怎么改了。

goto 就挺简单的 改到是没什么必要改


Question: 求大佬解这道C语言的题

引用 1 楼 寻开心的回复:很有意思的一个题目 temp=a， a=b， b=temp；  这个没有什么问题， 交换了a和b这两个指针的值， 需要主要的是此时temp和b这两个指针相同的  后面就是有趣 地方了 *temp = *b; // b 和 temp是同一个指针， 这个操作，什么也没有改变啊  *b = *c;  // 因为指针交换， *b此时是主函数里面都a变量，被赋值为c变量。此时主函数的abc就是373了 *c = *temp // 注意temp和b是同一个指针，b指针就是原来的a变量， 此时a变量已经被上句改成了3. *c=3； 结果还是373  回想一下， 用指针交换数据的代码是什么 int t； t = *b； *b = *c; *c = t;  用了中间变量t 而func这个函数当中中间变量是什么？ *temp，  *temp就是b本身，所以操作就是 b=c  c=b 这样两句， 结果就是b和c是同一个数值了 懂了懂了，一语道破谢谢！


Question: 询问编写C语言程序

引用 4 楼 qq_46114714 的回复:[quote=引用 3 楼 user-3的回复:][quote=引用 2 楼 qq_46114714 的回复:] [quote=引用 1 楼 qq_1457346882的回复:]fopen打开文件，读十个数据到字符数组，然后一个字符串数组接收输入的城市，循环比较（strcmp）文件读出来的数组变量和你输入的 请问，能帮我设计出这个程序吗？谢谢！[/quote]可以 要钱[/quote] 那你要多少钱帮我设计这个程序[/quote]   #include <stdio.h> #include <string.h> int main() { 	char city[10][30],tmp[30]; 	FILE* fp; 	int i; 	//打开文件并读入至数组city  	fp=fopen("a.txt","r"); 	for( i=0; i<10; i++) 		fscanf(fp,"%s",city[i]); 		 	printf("请输入一个城市名称："); 	scanf("%s",tmp); 	//查找 	for(i=0; i<10; i++)  		if(strcmp(tmp,city[i])==0) 			break; //如找到就跳出循环  	if (i<10) 		printf("查到\n"); 	else 		printf("找不到\n"); 	fclose(fp); 	return 0;  }

引用 2 楼 qq_46114714 的回复:[quote=引用 1 楼 qq_1457346882的回复:]fopen打开文件，读十个数据到字符数组，然后一个字符串数组接收输入的城市，循环比较（strcmp）文件读出来的数组变量和你输入的 请问，能帮我设计出这个程序吗？谢谢！[/quote] #include<stdio.h> #include<stdlib.h> #include<string.h> int main(){         FILE *fp = fopen("test.txt","r");         if(fp==NULL){                 perror("fail to read");                 exit(1);         }         char str[10][40];         int i=0,j=0;         while(i<10){                 for(;;){                         fscanf(fp,"%c",&str[i][j]);                         if(str[i][j]=='\n'){                                 str[i][j]='\0';                                 j=0;                                 i++;                                 break;                         }                         j++;                 }         }         for(i=0;i<10;i++){                 printf("%s\n",str[i]);         }         char dest[40]={};         scanf("%s",dest);         int flog=0;         for(i=0;i<10;i++){                 if(strcmp(&str[i][0],dest)==0){                         printf("ok\n");                         flog=1;                         break;                 }         }         if(flog==0){                 printf("no\n");         }         return 0; } 这个文件是当前路径的，如果想换路径那打开的时候要有路径，这次就算了，下次你要先去试试怎么写再问，我们热于给你改代码指错，但是个人排斥直接给代码。你直接看不写，对成长没有帮助，所以我就不给你加注释了，你自己去查下fopen的用法和fscanf的用法吧。自己动手了才会记住

引用 3 楼 user-3的回复:[quote=引用 2 楼 qq_46114714 的回复:] [quote=引用 1 楼 qq_1457346882的回复:]fopen打开文件，读十个数据到字符数组，然后一个字符串数组接收输入的城市，循环比较（strcmp）文件读出来的数组变量和你输入的 请问，能帮我设计出这个程序吗？谢谢！[/quote]可以 要钱[/quote] 那你要多少钱帮我设计这个程序

引用 2 楼 qq_46114714 的回复:[quote=引用 1 楼 qq_1457346882的回复:]fopen打开文件，读十个数据到字符数组，然后一个字符串数组接收输入的城市，循环比较（strcmp）文件读出来的数组变量和你输入的 请问，能帮我设计出这个程序吗？谢谢！[/quote]可以 要钱

引用 1 楼 qq_1457346882的回复:fopen打开文件，读十个数据到字符数组，然后一个字符串数组接收输入的城市，循环比较（strcmp）文件读出来的数组变量和你输入的 请问，能帮我设计出这个程序吗？谢谢！


Question: 有没有带佬看看这是哪有问题啊

delay 200ms； 这样的语句改成 delay（200）；  自己对照错误提示，告诉你了在哪些行，对应的改就是了

引用 2 楼 寻开心的回复:第九行和第八行的变量名字重复了， 改变量名字，或者删除 其中的一行 谢谢大佬。。。。。。

#include<reg52.h> #define uchar unsigned char #define uint unsigned int #define Motordata                              sbit zheng = P3^0; sbit fan = P3^1; sbit stop = P3^2; uchar phaswcw[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};   //四相八拍正转编码  uchar phaswcw[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; uchar stepd[]={0x01,0x03,0x02,0x06,0x04,0xc0,0x08,0x09}; 	  //四相八拍反转编码 uchar num=0,fx=0;  uchar kaiguan,motorzhiliu,delay,jiance,ledred,ledgreen; uchar motorkapan; uchar motortuigan; uchar duoji; uchar ms; uchar jd=67;   //按数组的控制方式步距角为0.9度，所以60度约需要67步  sbit key1=P1^0;  sbit key2=P1^1;  sbit key3=P1^2;  a=1; void main() { if (kaiguan == 0) {  delay 200ms; motorzhiliu = motorkapan = motortuigan = duoji= 0;      ledred = ledgreen = 0;    } if (kaiguan == 1)  {   delay 100ms;   ledred = 1;   motorzhiliu = 1;   //执行舵机的子程序 delay 200ms;   motorkapan;  }  } //Motorkapan的子程序 {   if (a = 1);    delay 100ms; //motorkapan旋转60°；   delay 300ms;   { if (jiance = 1)                                            //检测是否有销钉；  {   ledred = 0;   ledgreen = 1;   motortuigan;     a = 0; if (a = 0); //执行舵机的子程序  } else(jiance = 0)   motorkapan;  } } void motortuigan(void) {   motorzhengfanzhuan;   ledred = 1;   ledgreen = 0;   delay 200ms; }  //舵机子程序 void delay(uint t) {   uint k;   while(t--)   {    for(k=0; k<122 k++)   } } void Delay_xms(unit x) { uint i,j;     { for(i=0; i<x; i++) for(j=0;j<122;j++)    } } //顺时针转动 void motor_work (uint t) { uchar i;j; switch(t) { case 0; while(1) { if(stop = 0)     break;   for(j=0;j<8;j++)    {      motordata = phaseccw[j];      delay(50);                          //转速调节 } } break; } }                                        //停止转动 void? motor_test(void)  {  if(zheng = 0) { delay_xms(10); Motor_work(0); } if(fan = 0) { delay_xms(10); motor_work(1); } } //步进电机正反转主程序 void motorzhengfanzhuan(void) { Delay_xms(10);//等待系统稳定 while(1) {     motor_test();  } }

第九行和第八行的变量名字重复了， 改变量名字，或者删除 其中的一行

第九行和第八行一模一样，变量重复定义了，删除第九行 后面错误在26行看不到，贴源码文本格式贴


Question: 判断回文链表，我用的快慢指针的逻辑，求帮找bug。

想用单链表处理  你得做链表逆置 然后用逆置链表生成链表2 逆置链表重新逆置 最后比较原链表和链表2 才能得出结论

引用 4 楼 遇见女神 的回复:while (fast != null && fast.next != null) {   fast = fast.next.next;   ListNode next = slow.next;   slow.next = prev;   prev = slow;   slow = next; }  if (fast != null) {   slow = slow.next; }  while (slow != null) {   if (slow.val != prev.val) {     return false;   }   slow = slow.next;   prev = prev.next; } 你的就是把我之前快走的move放到第一行了。然后把fast这步改为每次单独创建一个next，附上slow.next的值。这个和我直接创建一个fast，将其赋给slow，然后每次最后给fast赋值fast.next。有什么不一样吗？  之前单独写反转链表用我写的那个方法没出现问题。所以现在很困惑。

单向链表的话，用栈都比用这啥快慢指针来的好。这什么快慢指针根本不搭边

而且回文始终有个问题： 他是两边往中间（即一个向左一个向右）  或 中间往两边（即一个向右一个向左） 进行比较的  括号中说的很明白了，方向。既有向左的又有向右的，所以这里用双向链表相对于使用单向链表来解决是极其自然的。

12321是回文吧， 既然是快指针fast，那我以为步长最少是2没问题吧 假设fast初始指向第一个1。再往后的步进中，有没有机会指向值：2？ 假设fast初始指向第一个2，再以后的步进中，有没有机会指向值：1和3？  所以这种情境下，fast指针在步长为2的情况下，无论怎么跑都没有机会能指向所有数据。那此时fast指针能依靠来作为回文检定吗？ 我估计可能不行吧

引用 9 楼 遇见女神 的回复:噗哈哈哈。 你都没看清楚，计算也没记清楚。 举例说明，两个结点的链表，你的代码第一个while循环体执行一遍，问你： 1，循环体内第一行代码是不是把首结点的next赋值为null？ 2，多余的move是不是初始化指向首结点呢？ 3，move->next是不是null了？  明白了明白了，终于明白了。用自己理想的逻辑，瞎想了半天。修改两处后，运行结果是对的了。非常感谢，早点遇见女神啊！ bool isPalindrome(struct ListNode* head){      struct ListNode* pre = NULL, * slow = head, * fast = head, *move = head;    //这里*fast = head.next改为* fast = head；     while(move != NULL && move->next != NULL)     {         move = move->next->next;     //move和fast的移位，这两行移到最前面来，就是计划的值，而不会被修改。         fast = fast->next;         slow->next = pre;         pre = slow;         slow = fast;     }     if(move != NULL)     {         fast = fast->next;     }     while(fast && slow)     {         if(fast != slow)             return false;         slow = slow->next;         fast = fast->next;     }     return true; }

引用 5 楼 Stranger_Green 的回复：[quote=引用 4 楼 遇见女神 的回复:]  while (fast != null && fast.next != null) {   fast = fast.next.next;   ListNode next = slow.next;   slow.next = prev;   prev = slow;   slow = next; }  if (fast != null) {   slow = slow.next; }  while (slow != null) {   if (slow.val != prev.val) {     return false;   }   slow = slow.next;   prev = prev.next; } 你的就是把我之前快走的move放到第一行了。然后把fast这步改为每次单独创建一个next，附上slow.next的值。这个和我直接创建一个fast，将其赋给slow，然后每次最后给fast赋值fast.next。有什么不一样吗？  之前单独写反转链表用我写的那个方法没出现问题。所以现在很困惑。[/quote]“有什么不一样？” run my code right run your code wrong  就这个不一样而已。

引用 6 楼 lin5161678 的回复:快慢指针无法处理回文  看代码你似乎期望 prev 从头开始  slow 从中间开始 然后依次比较  问题是 这样比较true 应该是类似这种 123123 而不是 123321 我的逻辑就是把链表的前一半逆转，然后前后同时比较。 move每次移动两个位置，pre和slow和fast是用来做逆转用的，每次都只移动一个位置。 所以，move或者move.next为空时，slow差不多在一般的位置。奇偶不同，slow再next一下。 最后一个while里面，是将fast的值赋给slow了，这里slow还没反转，所以指向的是后半部分的链表。而pre已经是反转后的前半部分链表的第一个。 最后slow和pre同时next比较值。

判断回文用双链表啊，头→     ←尾 这样比较才好弄啊。你用单链表不借助辅助空间，极度复杂的，屁都弄出来了。然后你这算法是不对的。

引用 1 楼 自信男孩 的回复:/*     if(head == NULL|| head->next == NULL)     {         return true;     }     */     if (head == NULL)         return true;     if (head->next == NULL)         return true;  这个地方需要改一下。  楼主创建双向链表比较容易解决这个问题～  感觉这里应该没什么大问题。 比如输入的是1,2,3,4,3,2,1，原本这个应该是回文链表，但是我输出的是false; 或者输入1,2，不是回文链表，我的结果却是true。 我自己在纸上跟着代码走了下，每步，看着像没什么问题啊。但不知道为什么结果老不对。


Question: Git上有个项目要用autotool，在windows下怎么办？

找到了一个分支，别人编译好的dll，有gcc和vs编译的

引用liquid-dsp is a free and open-source digital signal processing (DSP) library designed specifically for software-defined radios on embedded platforms. The aim is to provide a lightweight DSP library that does not rely on a myriad of external dependencies or proprietary and otherwise cumbersome frameworks. All signal processing elements are designed to be flexible, scalable, and dynamic, including filters, filter design, oscillators, modems, synchronizers, complex mathematical operations, and much more. 就是说无法用于windows平台？？

引用 6 楼 akari10032 的回复:确定这个项目跨平台吗，作者没说能在win系统用啊 啊，这玩意还限制平台吗？他在什么平台开发就在什么上用啊

确定这个项目跨平台吗，作者没说能在win系统用啊

都没人看吗。。。

着我就不知道了，没有用过欸。

引用 2 楼 千梦一生 的回复:liquid-dsp only relies on libc and libm。下下来用呗 怎么编译呢，直接拷到项目中使用？不用编译成dll ?


Question: 这两个结果为什么会不一样

%f的输出，是带有进位的特性的。 3.3333325*3 = 9.9999975 = 10 而后面那个是9.99999905没有进位  %f输出，输出10不代表那个数就真的是10， 它依然是9.9999975，只是四舍五入显示成10了而已

引用 2 楼 寻开心的回复:精度问题,c那里你多放一个小数点后的3就对了 float a,b,c,d; a = 10.0 /3 ; printf("%.8f\n", a); d = 3.333333; printf("%.8f\n", d); printf("%8f    %.8f\n", a*3, d*3);  输出结果： 3.33333325    // 这个是10/3 3.33333302    // 这个是3.33333  10.000000    9.99999905 就是10/3.0*3输出为什么是10.000000而不是9.999999

引用 楼主 RogerRro的回复: 就是10/3.0*3输出为什么是10.000000而不是9.999999

要知道小数点后的数字的二进制表示法 小数点后的各个数位分别表示 0.5 0.25 0.125 0.0625 0.03125 0.015625 ...... 是拿这些小数求和得到具体到数值的， 显然这些数不能精确的表示3.33333333这样的，那么就是最接近这个数字的数了 浮点数独精度是6~7位， 说的就是近似能保证小数点后6或者7位的数值是准确的

float浮点数的有效位是6位，不是说总共只有6位小数。


Question: 之:宏定义#define

#define就是直接替换代码的 你无妨这样想象，  程序在执行真正的编译之前，先做了一遍预处理过程 遇到SQ（y）这样的代码，比如你的例子当中 SQ（a+1），它就自动的给你替换成（y）*（有），也就是等于你手工输入的代码 （a+1）*（a+1） 一样 完成这个替换后， 程序才继续编译

我自学，有点看不懂这个过程，能通俗店么？

需要注意的宏定义等价替换不是在程序执行时，而是预编译阶段。总得来说，宏定义替换是在形成可执行程序前就发生了。


Question: 输入字符串China,分析程序改动后显示结果变化的原因是什么？

其他人的讨论基本解答你的疑问了  我说点和你的疑问没关系的事情 你的数组才5个元素 %s输入China 加上字符串结尾的0 是6个字节  越界操作 很危险 注意改正

char 数组 一个元素占一个字节 int 数组一个元素占4个字节 所以 char[5]是：【0】  【1】   【2】  【3】 【4】        字节：   0       1          2          3        4 int[5]是：【0】        【1】        【2】           【3】              【4】      字节：  0 1 2 3      4 5 6 7     8 9  10  11   12 13 14 15    16 17 18 19  输入%s是字符串，每个字符占一个字节 China分别对应：0 C， 1 h， 2 i， 3  n， 4 a  所以会出现你说的现象

int在楼主这里应该是占4个字节， "China"，%s格式输入，前四个字节存"Chin"，第五个字节存'a' c[0]占四个字节，%c是输出一个字节，因此是'C'，c[2]是第二个4字节，也是输出一个字节，因此是'a'  个人见解，建议把c[0]的四个字节分别输出验证一下上面的推断。

原因就是整数是： int    是四个字节 char 是一个字节 scanf进去后， 第一个整数占据了4个字符，第二个占据了一个字符 输出的时候，指定是字符，传递的是整数，但是也只输出了最后第一个字符（对应整数的最低字节）  你可以做一个联合体 union T {     int n     char  ch[4]; } t; t.n = c[i]; 然后你看看 t.ch【0】 -- t.ch【3】 都是什么东西


Question: vs2019  c语言 char 与char *不兼容怎么解决呀

char b="wwe"; 这样定义是有问题的。应该char *b ...  另外if (ar2[i] == b) 这样比较也是有问题，建议用strcmp/strncmp，对比vs2019软件里对应的字符串比较函数。  所以，并不是不兼容的问题，而是你的用法没有按照合法的使用～

char b="wwe"; 应该是 char *b="wwe";   if (ar2[i] == b) 应该是 if (0 == strcmp(ar2[i],b))

字符串比较只能用strcmp不能用 ==，   ==判断的是两个指针是否相同， 并不是指针指向的内容是否相同

C的字符串比较用 strcmp函数，C++能直接用==号比较是因为重载了这个操作符


Question: 新手求助

引用 3 楼 南尘.的回复:我看到你报错的原因是：Id returned 1 exit status. 可能有如下原因： 1、库函数拼写错误。如：printf，scanf等。 2、定义的函数名在调用时，函数名拼写错误。 3、在执行函数时可能函数体本身的问题。 4、检查一下任务栏，一般都是上一次“运行”的小黑窗还没关，然后执行“编译”，由于该文件正在被使用，程序没法执行编译，所以就报了这样的错误。 解决方法：把刚才运行的cmd窗口关闭。 不好意思，最近期末考试，没看 这个我就开了一个窗口呀…

引用 1 楼 寻开心的回复:#include <mmsystem.h>  #pragma comment(lib, "winmm.lib")   这里是英文吗，看图片感觉是中文或者有空格在winmm.lib这个字符串里面了 没有…我这个就这样……


Question: c语言中，把二维数组复制到另一个二维数组，用指针表示法，如何复制？

内存空间是连续分配的 既然用指针处理，memcpy 即可，为什么还要写这么多循环，效率太低

引用 3 楼 自信男孩 的回复：#include <stdio.h>  #define three 3  void copy_arr2(int (*target)[5],int (*source)[5],int n); void copy_arr3(int (*target)[5],int (*source)[5],int (*end)[5]); void put(int (*target)[5],int n);  int main()  {      int source[three][5] =      {          {1, 2, 3, 4, 5},          {6, 7, 8, 9, 10},          {11, 12, 13, 14, 15}      };      int target2[three][5];      int target3[three][5];       copy_arr2(target2,source,three);      printf("\ntarget2= ");      put(target2,three);      copy_arr3(target3,source,source+three);      printf("\ntarget3= ");      put(target3,three);  /*      printf("\ntarget2= ");      put(target2,three);      printf("\ntarget3= ");      put(target3,three); */      return 0;  }  void copy_arr2(int (*target)[5],int (*source)[5],int n) {     int (*s)[5],*v, (*d)[5], *z;      for (s = source, d = target; s < source + n; s++, d++) {         for (v = *s, z = *d; v < *s + 5; v++, z++)             *z = *v;     }     /*     for (u=source; u<source+n; u++,target++)     {         for(v=*u; v<*u+5; v++,*target++)         {             **target = *v;         }     }     */ }  void copy_arr3(int (*target)[5],int (*source)[5],int (*end)[5]) {     int *v, *d;     while (source < end) {         for (v = *source, d = *target; v < *source+5; v++, d++)             *d = *v;          target++;         source++;     }     /*     for (; source<end; target++,source++)     {         for (; *source<*end; *target++,*source++)             **target   = **source;     }     */ }  void put(int (*target)[5],int n) {     int u,v;     for (u=0; u<n; u++)     {         for (v=0; v<5; v++)         {             printf("%2d  ",target[u][v]);         }         printf("\n");     } }  供参考～  还是要理解int (*target)[5];指针，target++是偏移了5* sizeof(int)个字节～谢谢大佬，我现在彻底理解了

引用 1 楼 寻开心 的回复：void copy_arr2(int (*target)[5],int (*source)[5],int n) { 	int * pS = source[0]; 	int * pT = target[0]; 	int i = 0; 	for ( i=0; i<5*n; i++)          	*pT++ = *pS++; };  你没有理解二维数组下的指针++的意思 你自己把u++ 结果输出看看什么吧非常感谢，您的回答对我太有帮助了

谢谢你们，我搞懂了

看你自己另外提问的那个帖子， 核心问题是 *taget++上 这个执行结果是target++ 然后取*地址 比不是你想象的（*target）++ 因为（*target）不是一个变量，++加不出东西来

引用 3 楼 自信男孩 的回复：#include <stdio.h>  #define three 3  void copy_arr2(int (*target)[5],int (*source)[5],int n); void copy_arr3(int (*target)[5],int (*source)[5],int (*end)[5]); void put(int (*target)[5],int n);  int main()  {      int source[three][5] =      {          {1, 2, 3, 4, 5},          {6, 7, 8, 9, 10},          {11, 12, 13, 14, 15}      };      int target2[three][5];      int target3[three][5];       copy_arr2(target2,source,three);      printf("\ntarget2= ");      put(target2,three);      copy_arr3(target3,source,source+three);      printf("\ntarget3= ");      put(target3,three);  /*      printf("\ntarget2= ");      put(target2,three);      printf("\ntarget3= ");      put(target3,three); */      return 0;  }  void copy_arr2(int (*target)[5],int (*source)[5],int n) {     int (*s)[5],*v, (*d)[5], *z;      for (s = source, d = target; s < source + n; s++, d++) {         for (v = *s, z = *d; v < *s + 5; v++, z++)             *z = *v;     }     /*     for (u=source; u<source+n; u++,target++)     {         for(v=*u; v<*u+5; v++,*target++)         {             **target = *v;         }     }     */ }  void copy_arr3(int (*target)[5],int (*source)[5],int (*end)[5]) {     int *v, *d;     while (source < end) {         for (v = *source, d = *target; v < *source+5; v++, d++)             *d = *v;          target++;         source++;     }     /*     for (; source<end; target++,source++)     {         for (; *source<*end; *target++,*source++)             **target   = **source;     }     */ }  void put(int (*target)[5],int n) {     int u,v;     for (u=0; u<n; u++)     {         for (v=0; v<5; v++)         {             printf("%2d  ",target[u][v]);         }         printf("\n");     } }  供参考～  还是要理解int (*target)[5];指针，target++是偏移了5* sizeof(int)个字节～您的回复很漂亮，您说的理解二级指针我确实懂了，但是可能我头脑没反应过来，我并没有发现我的原代码具体错在哪，您能解释得详细一点吗？十分感谢！

memcpy GG  重叠就 memmove 二维二什么维啊 降维打击


Question: 步进电机控制程序

引用 2 楼 柒贰伍玖的回复:没有原理图吗 没有，什么都没有，只有这个

没有原理图吗

怎么写呀，求大神帮忙


Question: 我想知道我这段c语言代码错在哪？

首先一个很大的问题，你的指针还是野指针，都没有赋初值，你的u跟*u地址也是一样的，target++中的这个变量也没有地址，你怎么执行加加操作？指针的用法不比其他，不严谨稍微一点偏差都有可能报错，让程序崩溃。有指针出错了可以加printf（“%p”）去看地址，看值，来找错调试，这里的输出语句我是中文，不能直接用，你自己填了补充

int main() {     int source[three][5] =     {         {1, 2, 3, 4, 5},         {6, 7, 8, 9, 10},         {11, 12, 13, 14, 15}     };   int t[three][5];  // 定义一个目标数组      int (*target)[5];     int (*u)[5],*v;     printf("target= ");      for (u=source,target=t; u<source+three; u++,target++)     {         int * t = *target;   // 定义一个中间变量， *target不能自增， 因为它不是一个变量         for(v=*u; v<*u+5; v++, t++)         {             *t = *v;             printf("%d  ",*t);         }     }      printf("\n");     int i, j;     for (i=0; I<three; i++ ) for (j=0; j<5; j++) printf("%d ", t[i][j]);      return 0; }

int (*s)[5],*v, (*d)[5], *z;  20            19     for (s = source, d = target; s < source + n; s++, d++) {  18         for (v = *s, z = *d; v < *s + 5; v++, z++)  17             *z = *v;  16     }

引用 2 楼 weixin_45906870 的回复:那应该怎么改呢？ 说实话不是很懂你要干嘛，指针的本质是地址，也就是说你操作了，定义了三四个指针，要做的是把当然地址的值赋给当前地址再输出？ 你后来赋初值的代码我一句一句看了，发现问题在于*target++这里，这里你加出来的地址不是二维数组的地址了,这里加加操作不能加到数组的列上的地址，除非你跟u和v一样，重新定义一个等于你target行的地址，再加加，要么就target【】++，但是你这里也用不了【】，因为你前面不是这么用的，【】里面没办法放值.这是你自己练习想的吧？

#include <stdio.h> #define three 3  int main()  {      int source[three][5] =      {          {1, 2, 3, 4, 5},          {6, 7, 8, 9, 10},          {11, 12, 13, 14, 15}      };      int (*target)[5];      int (*u)[5],*v;      printf("target= ");      for (u=source,target=source; u<source+three; u++,target++)      {          for(v=*u; v<*u+5;v++)//,*target++)          {              //**target = *v;              printf("%d  ",*v);          }          putchar(10);      }        return 0;  } 供参考～  target和u是一样，为什么要用**target = *v;呢？

引用 3 楼 自信男孩 的回复：[quote=引用 2 楼 weixin_45906870 的回复:] 那应该怎么改呢？ 直接贴代码，可以帮你调试一下～[/quote]已贴

#include <stdio.h> #define three 3  int main()  {      int source[three][5] =      {          {1, 2, 3, 4, 5},          {6, 7, 8, 9, 10},          {11, 12, 13, 14, 15}      };      int (*target)[5];      int (*u)[5],*v;      printf("target= ");      for (u=source,target=source; u<source+three; u++,target++)      {          for(v=*u; v<*u+5;v++,*target++)          {              **target = *v;              printf("%d  ",**target);          }      }        return 0;  } 这是我的代码

引用 2 楼 weixin_45906870 的回复:那应该怎么改呢？ 直接贴代码，可以帮你调试一下～

那应该怎么改呢？


Question: 图书管理系统的删除图书的问题

删除是根据覆盖，那么你只是讲要删除的用其后面的覆盖，那么用于覆盖的图书信息是不是要用它后面的图书信息覆盖。所以只覆盖一次是不行的。而是用要删除的后面的信息依次向前覆盖。另外注意让统计图书信息个数的变量自减1，即总数减少一个。

你的删除操作呢？还有如果书是你这个数组的最后一个呢？那么k+1取的值是什么，能不能取


Question: 问题有点繁琐，大神请进！马踏棋盘问题：为何我的思路总也跑不出结果？

刚才有位朋友指出我的代码有错误，我仔细查找了下问题，我的这个帖子是从其它网站编辑后粘过来的，原贴地址：https://fishc.com.cn/forum.php?mod=viewthread&tid=153097&page=1&extra=#pid4253248 我发现原贴显示有问题，实际我抄代码也没有错，但发出来后就是不显示，给我漏掉了，如果再有类似的问题欢迎指出，不过还是希望大家能从逻辑实现的角度多多指教，谢谢。

引用 1 楼 遇见女神 的回复:代码错误太多。先挑一段代码来说。           for(i = 0; i< count; i++)         {                 printf("第%d种行走方案：",i);                 for(j = 0;j< 64;j++)                 {                         printf("%d  ",result[i][j]);                 }                 printf("\n");         }  代码输出如下： result[0] result[1] ... result[63] result[0] result[1] ... result[63] ... result[0] result[1] ... result[63] 64个数字，重复count次打印？姑且假设找到2种以上的方案，这样的打印，把方案打印出来了吗？  代码写在虚拟机上的，抄写时漏了，你说的这不是根本问题所在

代码错误太多。先挑一段代码来说。           for(i = 0; i< count; i++)         {                 printf("第%d种行走方案：",i);                 for(j = 0;j< 64;j++)                 {                         printf("%d  ",result[j]);                 }                 printf("\n");         }  代码输出如下： result[0] result[1] ... result[63] result[0] result[1] ... result[63] ... result[0] result[1] ... result[63] 64个数字，重复count次打印？姑且假设找到2种以上的方案，这样的打印，把方案打印出来了吗？


Question: 最小生成树

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


Question: c语言水仙花数

#include<stdio.h> int main(){      int i,j, m,n, a, b;      int flag=0;      printf("输入第一个正整数：");      scanf("%d",&a);      printf("输入第二个正整数：");      scanf("%d",&b);      if((a>99&&b>99)&&(a<1000&&b<1000))      {      if(a<b){   for(n=a;n<=b;n++)   {          i=n/100;          j=n/10-i*10;          m=n%10;          if(n==i*i*i+j*j*j+m*m*m)       {          printf("这两个之间数的水仙花数为:%d\n",n);          flag=1;        }     } }  else     { for(n=b;n<=a;n--){          i=n/100;          j=n/10-i*10;          m=n%10;          if(n==i*i*i+j*j*j+m*m*m)       {          printf("这两个之间数的水仙花数为:%d\n",n);          flag=1;        } }         if(flag==0)        printf("两个数之间没有水仙花数");    } }      else  printf("你输入的两个数无效！\n");           return 0;  } 养成良好的代码规范，格式对对齐，{}不要省略，哪怕就一句执行语句。不然错了找都不好找

貌似丢了括号 比如for(n=b;n<=a;n--)这里


Question: 求助

引用 1 楼 寻开心的回复:它提示你了， 当空或者只有1个元素的时候，你的结果有问题  完整的把代码贴文字出来，不要图，否则无妨帮助调试 #include <stdio.h>  #include<stdlib.h> typedef struct number{ int a; struct number *next; }NUM; int main()  {  int n,i=0; scanf("%d",&n); NUM *head,*p,*q; head=(NUM*)malloc(sizeof(NUM)); head->next=NULL; while(i<n) { p=(NUM*)malloc(sizeof(NUM)); scanf("%d",&p->a); if(i==0) q=head=p; else q->next=p; p->next=NULL; q=p; i++; } i=1; p=head; while(i<=n) { if(i!=n) printf("%d ",p->a); else printf("%d",p->a); i++; p=p->next; } free(p); free(q); free(head); return 0; }

你的问题在 最后的free（p）  free（q）和 free（head）上 你可以把这三行删掉估计能过（不free，在某些测评系统上不算错）  free（NULL）不会执行任何操作不会产生错误 但是p，q，head这三个家伙要是有相等的，就会造成一个地址被free多次， 这是致命错误，你的问题很可能出在这里  算法上，你需要构造一个循环，从头开始摘下节点并释放，然后处理后续的节点，直到全部释放完


Question: C语题目

写出这个代码的人，有公司会收留么

我觉得是11吧。

自己可以写一个程序试一下，不就知道了。你也可以看看各个符号的优先级，就知道该怎么算了。括号是优先级在这里面是最高的，之后是+号，然后才是等号。

引用 2 楼 weixin_45846558的回复:[quote=引用 1 楼 fighting2022的回复:]我觉得是11吧。 真的有那么简单吗？。。。。。。。。[/quote] 是这么简单，先算括号里面的，将6赋值给c，然后c与5的和赋值给a。

引用 1 楼 fighting2022的回复:我觉得是11吧。 真的有那么简单吗？。。。。。。。。


Question: 函数中有scanf，在键盘上输入后却没有办法显示。希望大佬指正（程序是用链表反向输出的）

#include "stdio.h" #include "stdlib.h" struct node {     int number;     struct node *next; }; int main() {struct node *makelist();  void printlist (struct node *listhtead);  printf("输入正数，用输入负数结束。\n");  printf("输入正数序列：\n");  printlist(makelist());  return 0; } struct node *makelist() {struct node *ptr,*oldptr,*nalloc();  int newnum;  ptr=NULL;  scanf("%d",&newnum);  while(newnum>=0)  {oldptr=ptr;   ptr=nalloc();   ptr->number=newnum;   ptr->next=oldptr;   scanf("%d",&newnum);  }  return (ptr); } struct node *nalloc() {  return((struct node*)malloc(sizeof(struct node))); }  void printlist(struct node *listhead)      {//struct node *listhead;  while(listhead!=NULL)  {  printf("%d",listhead->number);  listhead=listhead->next;  }  }    我自己解决了，确实是函数参数的问题，谢谢你的回答了，上面的代码是可以正常运行的。

代码有问题呀，实参形参搞乱了。  #include "stdio.h" #include "stdlib.h" struct node //建立一个结构体 { 	int number; 	struct node *next; }; int main() { 	  node *makelist(); //声明数据指针型函数makelist 		void printlist(  node* listhead); //函数声明 		printf("输入正数，用输入负数结束。\n"); 	printf("输入正数序列：\n"); 	printlist(makelist()); 	return 0; }   node *makelist() { 	  node *ptr, *oldptr, *nalloc(); 	int newnum; 	ptr = NULL; 	scanf("%d", &newnum); 	while (newnum >= 0)   //直到输入负数时停止 	{  		oldptr = ptr; 		ptr = nalloc(); 		ptr->number = newnum; 		ptr->next = oldptr; 		scanf("%d", &newnum); 	} 	return (ptr); }   node *nalloc() { 	return((  node*)malloc(sizeof( node)));  //分配一个结构体大小的空间 } void printlist(  node* listhead) { 	//struct node *listhead; 	while (listhead != NULL) 	{ 		printf("%d", listhead->number); 		listhead = listhead->next;   //反向输出 	} }


Question: 怎么修改divide error的错误

具体思路是 举个例子：该节点数是34658，number是46 那我就想判断58==46？ 不行就判断65==46？ 46==46？ 是就下一个节点

head是链表的头指针，number是指定数字


Question: c基础问题

循环找到数字存入数组，fopen以写的权限打开文件，把数组的值写进文件，fclose关闭文件。不难，先自己尝试一下，不要直接要代码，对成长没帮助，写入文件可以用。文件操作的函数百度都有用法的


Question: 为什么这题用gets不行必须要用scanf？

gets是遇到换行符返回，没看出gets有什么问题。倒是scanf使用上，需要去掉a前面的&。

gets好像会读取最后的换行符，你检测一下去掉换行符试试


Question: 纠结

指针是地址，指针名是指向一个地址的变量名，数组的大小初始化就是固定的，不过有根据你后面初始化的值来形成大小的方式比如a[][3]={ {1,2,3},{1,2,3],{1,2,3}};这个数组就是a[3][3],如果里面再多一组{}就是a[4][3]

1、指针名不是地址，指针变量存放的内容就是地址 2、数组大小是固定的，一旦分配了空间就确定了，但可以通过重新分配空间来更改数组


Question: 关于指针的优点

引用 2 楼 ForgetTomorrow 的回复:老师要检查作业，通常情况下每个学生都得做一份。 指针的好处就是只用做一份，老师检查谁的就把这份做业（地址）改成谁的。很糟糕的例子

例如，函数传递参数时，会产生一个参数的拷贝，如果是一个复杂的结构体占用n个字节，拷贝它需要n的时间 指针占四个字节，指针的拷贝只需要4的时间 n越大这个时间优势越明显， 内存占用指针只需要多出4个字节，而不用指针则需要多出n个字节

引用 8 楼 千梦一生的回复:[quote=引用 7 楼 lin5161678 的回复:] [quote=引用 4 楼 千梦一生 的回复:] [quote=引用 3 楼 lin5161678 的回复:] [quote=引用 2 楼 ForgetTomorrow 的回复:] 老师要检查作业，通常情况下每个学生都得做一份。 指针的好处就是只用做一份，老师检查谁的就把这份做业（地址）改成谁的。很糟糕的例子 [/quote] 容易搞成内存泄漏  我也来个比喻。 老师给班上拿来一本英语辞海。然后每个同学都来抄一本走，这样大家都可以查找资料了。 指针的好处就是，放柜子里，然后告诉大家这里有本辞海，想翻阅的都来翻阅。 （这里主要是读，写的话就不建议了，毕竟词典这种东西，一般而言还是只读为好）[/quote]再说读写的问题 读是使用指针一个重要操作 写也是 没什么不安全 也没什么不建议  包括库函数在内 写操作是使用指针的原因的之一[/quote] 词典你让学生们随意写吗？[/quote] 指针又不是不能写 词典不能写所以不合适呗

引用 7 楼 lin5161678 的回复:[quote=引用 4 楼 千梦一生 的回复:] [quote=引用 3 楼 lin5161678 的回复:] [quote=引用 2 楼 ForgetTomorrow 的回复:] 老师要检查作业，通常情况下每个学生都得做一份。 指针的好处就是只用做一份，老师检查谁的就把这份做业（地址）改成谁的。很糟糕的例子 [/quote] 容易搞成内存泄漏  我也来个比喻。 老师给班上拿来一本英语辞海。然后每个同学都来抄一本走，这样大家都可以查找资料了。 指针的好处就是，放柜子里，然后告诉大家这里有本辞海，想翻阅的都来翻阅。 （这里主要是读，写的话就不建议了，毕竟词典这种东西，一般而言还是只读为好）[/quote]再说读写的问题 读是使用指针一个重要操作 写也是 没什么不安全 也没什么不建议  包括库函数在内 写操作是使用指针的原因的之一[/quote] 词典你让学生们随意写吗？

引用 4 楼 千梦一生 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 2 楼 ForgetTomorrow 的回复:] 老师要检查作业，通常情况下每个学生都得做一份。 指针的好处就是只用做一份，老师检查谁的就把这份做业（地址）改成谁的。很糟糕的例子 [/quote] 容易搞成内存泄漏  我也来个比喻。 老师给班上拿来一本英语辞海。然后每个同学都来抄一本走，这样大家都可以查找资料了。 指针的好处就是，放柜子里，然后告诉大家这里有本辞海，想翻阅的都来翻阅。 （这里主要是读，写的话就不建议了，毕竟词典这种东西，一般而言还是只读为好）[/quote]再说读写的问题 读是使用指针一个重要操作 写也是 没什么不安全 也没什么不建议  包括库函数在内 写操作是使用指针的原因的之一

引用 4 楼 千梦一生 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 2 楼 ForgetTomorrow 的回复:] 老师要检查作业，通常情况下每个学生都得做一份。 指针的好处就是只用做一份，老师检查谁的就把这份做业（地址）改成谁的。很糟糕的例子 [/quote] 容易搞成内存泄漏  我也来个比喻。 老师给班上拿来一本英语辞海。然后每个同学都来抄一本走，这样大家都可以查找资料了。 指针的好处就是，放柜子里，然后告诉大家这里有本辞海，想翻阅的都来翻阅。 （这里主要是读，写的话就不建议了，毕竟词典这种东西，一般而言还是只读为好）[/quote]都是糟糕的例子  糟糕之处在于 这两个例子都只能做到 给懂指针的介绍指针 这种没意义的事情  没学会指针 看了这两个例子 该懵还是懵 学会指针 看不看这两个例子 没区别 也没提升 要介绍指针 要把指针的核心内容体现出来  类型知识 / 地址知识 / 指针算术 这些东西才有价值 半文不白的例子自嗨而已 用处不大

1楼对的，但是就是不知道楼主能否理解了. 4楼也行吧.

引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 ForgetTomorrow 的回复:] 老师要检查作业，通常情况下每个学生都得做一份。 指针的好处就是只用做一份，老师检查谁的就把这份做业（地址）改成谁的。很糟糕的例子 [/quote] 容易搞成内存泄漏  我也来个比喻。 老师给班上拿来一本英语辞海。然后每个同学都来抄一本走，这样大家都可以查找资料了。 指针的好处就是，放柜子里，然后告诉大家这里有本辞海，想翻阅的都来翻阅。 （这里主要是读，写的话就不建议了，毕竟词典这种东西，一般而言还是只读为好）


Question: vs2017没有头文件和源文件

引用 1 楼 不闻窗外事 的回复：项目建错了，选择创建项目：文件-》新建-》项目-》Visual C++ -》空项目谢谢

引用 2 楼 user-2 的回复：学c/c++得建个c++的工程 创建了一个c#的工程肯定不行哦 因为c#里面没有include 类的关键字 肯定编译不过谢谢

引用 1 楼 不闻窗外事 的回复：项目建错了，选择创建项目：文件-》新建-》项目-》Visual C++ -》空项目可是不是应该建控制台应用吗


Question: C语言，文件问题出现乱码

你用二进制的方式读取文件 但是文件本身并不是用二进制模式存储的， 而是文本格式， 不匹配，结果就是乱码啦。  不能用rb模式打开，它是 rt； 也不能用fread， 而是要用fscanf这样的函数读取  二进制模式下， 严格按照每个数据的大小读写内容，比如char name【10】它就会读入10字节， 并不会中间遇到空格或者回车符号而停止


Question: 弱鸡求助

引用 1 楼 user-2的回复:应该是D吧~~~ 我也觉得是D，谢谢老铁

这道题A、B、C、D都不对，不能一次赋值就能做到，置 0 需要 & 操作，置 1 需要 | 操作才能确保设置到且不改变其他位 GPIOF_MODE &= 0xF7;    //bit3  0 GPIOF_MODE |= 0x04;      //bit2 1

应该是D吧~~~


Question: 求大佬解一下这两道C语言的题

int (*p)[5]； 声明p作为指向由5个整数组成的数组的指针。 如果取消引用p会发生什么？ 你会得到5个整数组成的数组。 即相当于int arr[5]=p[0]。

首先第一个，这是一个数组指针，嗯，指向一个int [5]类型的数组，ps=s，等价于ps=&s[0]，也就是s的首地址，不过一个步长是int [5] ps+1=&s[0]+1=&s[1],是地址不是内容。 *(ps+3)=*(&s[0]+3)=*(&s[3])=s[3]=&s[3][0],是地址不是内容。 ps[0][2]，首先来看一下，ps=s，等价于ps=&s[0],ps[0]=&s[0][0],ps[0][2]=s[0][2] *(ps+1)+3=*(&s[0]+1)+3=*(&s[1])+3=s[1]+3=&s[1][0]+3=&s[1][3],是地址不是内容。 下面的一样


Question: 问个小问题：数组初始化问题

谢谢各位高手的解答~

定义初始化，a[2] = {1, 2};这样操作，一个问题是数组越界，因为数组a长度是2. 另一个问题，就是类型不匹配，后面是数组，即int *类型，前面是int类型。  只能a[0] = 1; a[1] = 2;这样初始化了（若先定义了）。  这是C的基础知识，建议了解并掌握了～

你是没有完全理解数组的概念。 定义数组int a[2]时，表示整型数组a有两个元素。 看了你第二张图写的赋值，我觉得你是认为a[2]代表整个数组,其实不然，你定义数组a后写的a[2]代表的是并不代表整个数组，而是整型数组a的第三个元素（显然这是错误的，因为数组a只有两个元素），你的这种赋值写法只适合初始化（即定义的时候同时赋值）。  如果你不想初始化，可以通过循环来赋值。 另外你写的是中文分号，这也会报错。（仔细看第二张图片第一个分号与第二个分号的区别）

注意，数组名的本质是地址，在你定义的时候初始化，此时的a[n]是从a0地址开始，到a0+类型*n地址位依次赋值后面的初始化的值。 但是你定义结束后的a【n】就是这一个地址而非定义时的连续地址，因此再一起赋值是不正确的，这个时候需要逐一赋值，例如你的数组，初始化之后的赋值应该是：a[0]=0;a[1]=1;定义时的n是只多少个数组空间，从1开始加，而赋值是通过地址，从0开始加，所以数组的第一位是a[0],最后一位是a[n-1];不要再用n，会越界

定义时赋值那叫初始化，定义和赋值分开那叫赋值，赋值只能一个一个元素的赋 可以用memset 把数组所有元素设定成某一个值，但是里面实现也是一个个赋的

数组越界和全角字符的错误

第二个报错的原因，是“；”号吧？

数组下标越界！超过数组最大值！

这和你先定义先初始化没有关系，是你自己把初始化写错了，定义时初始化可以那样写，但定义后，a[2]表示的是数组第3位，只能赋一个值，另外你定义的是a[2]，那么最多只有a[1]，a[2]无论怎样都是错误


Question: 简易移动爱心

引用 楼主 user-0的回复://chenwenlong 2019 12 27  #include <windows.h> #include <stdlib.h> #include <math.h> #include <stdio.h> #include <conio.h> void photo(int l,int u) { 	system("cls"); 	float f,x,y,m; 			while(u>=0) 		{ 			printf("\n"); 			u--; 		} 	for(y=1.6;y>=-1.6;y-=0.15) 	{ 		m=l; 		while(m>=0) 		{ 			printf(" "); 			m--; 		} 		for(x=-1.1;x<=1.1;x+=0.05) 		{ 			f=x*x+pow(y-pow(x*x,1.0/3),2)-1; 			putchar(f<=1e-5?'*':' '); 		} 		putchar('\n'); 	} } int main() { 	srand((NULL)); 	char ss[]="color f0"; 	char x; 	int u=0,l=0; 	printf("点击键盘可以移动");     while (1)     {     	x=rand()%16;     	ss[7]=x<10?(x+48):(x+87);         switch(getch() )         {         case 32:         	break;         case 0xE0:         	system(ss);             switch (getch())             {                 case 72://上                     u--;                     photo(l,u);                     break;                  case 80://下 				    u++;                     photo(l,u);                     break;                 case 75://左 。。。。。。。。。。。。。。


Question: 一道题急急急

x[3][4]才是你说的答案，因为strcpy越界了的。这题目出的不好，你跑一遍就知道了。

引用 1 楼 user-1的回复:第一个循环： x[0]="abc" x[1]="abc" x[2]="abc" //此处strcpy(x[2],ch) 越界了~~  第二个循环输出： 1、从x[0][0]处一直输出到末尾，即：abcabcabc 2、从x[1][1]处一直输出到末尾，即：bcabc 3、从x[2][2]处一直输出到末尾，即：c  所以答案是：abcabcabcbcabcc 等等，我同学刚查了百度 答案是abcbcc

哇好厉害谢谢o(^o^)o


Question: 疑惑

引用 1 楼 不闻窗外事的回复:我试了下，不慢啊，你用的什么编译器 Dev c++          .....

我试了下，不慢啊，你用的什么编译器


Question: 文件比较

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

fgets函数，不过这个要一行固定大小，如果不想这么读，可以用两层循环，一层判断文件是否读完，一层逐一读取字符，读到换行把换行去掉跳出

引用 1 楼 user-2的回复:自己尝试写过嘛？给你个思路的，定义两个字符串分别获取两个文件，循环，每次读一行，读完strcmp比较一下，返回u值不是0就打印这两个字符串再退出循环。先自己尝试去写，直接拿看没有提升的，下次遇到还是不会 怎么才能只读取一行啊？


Question: 结构体声明时也是没有分配内存的？

你这是结构体类型的定义，不是结构体变量的定义，类型的定义你觉得会分配空间吗

是的，声明的时候是没有真正分配内存的，只有当你实例化一个变量的时候才会分配内存，如果你在声明的时候就实例化了结构体变量那也会分配内存 struct student{   // 结构体声明    char name[20]    char sex[20] } stu[2]；这样 还有结构体的；是不能少的 struct student{   // 结构体声明     char name[20]    char sex[20]  } ； 这样才是


Question: 跪求大佬指导怎么学C的编译过程和反汇编

引用 1 楼 user-1 的回复:静态IDA，动态调试器OD，WINDBG，自己先写代码，调试看汇编代码，写点简单的汇编，看的多了就会了   谢谢大佬


Question: 求助大佬

scanf("%d %s %c %c");, 都加空格


Question: C语言链表 编译没有问题运行错误，求指导

do循环体里面的 while(last->next) 这个判断有问题，因为第一次运行的时候你的head 是null，last = head后 last也变为null，它没有一个实体对象也就没有next这个属性，这时候去引用它的next属性会导致程序崩掉

20行：Node *last=head，而head此时是NULL，然后你就拿来用了，如：last->next，所以就出现了不可预知的行为。


Question: 快速排序遇到的问题

你的算法在大数据量的情况下，栈很可能会爆掉的。

你这快速排序算法没写对……

不知道是不是因为字符太多，导致递归层数太多，所以堆栈使用超过了使用界限呢？？猜的，你要不可以试试在性能和内存更优秀的服务器上运行下呢


Question: csv文件写入问题

这是C语言啊，%s是读到回车为止的，所以你这条 scanf("%s,%s,%d,%f,%f,%f",&a[i].major,&a[i].classroom,&a[i].num,&a[i].score[0],&a[i].score[1],&a[i].score[2]);，其实只读入了a[i].major，后面的都是空的，不信的话你逐个printf输出看看。可以改成比如：          printf("请输入专业：");         scanf("%s",&a[i].major);         printf("请输入班级：");         scanf("%s",&a[i].classroom);         printf("请分别输入学号及三科成绩（以空格分隔）：\n");         scanf("%d%f%f%f",&a[i].num,&a[i].score[0],&a[i].score[1],&a[i].score[2]);


Question: #有趣的逻辑#

你的这个：printf("列="); scanf("%d",&l); while(l>9||l<0) { printf("输入的列无效，请重新输入！\n"); printf("行="); scanf("%d",&h); printf("列="); scanf("%d",&l); } } printf("列="); scanf("%d",&l); 其实功能也实现了，虽然while的很别扭，你只是多打了一组printf("列=");scanf("%d",&l); 所以while出来以后还要再给你显示输入

数组a为：  123	34	46	34	6	7	5	67	34	6	 2	3	4	5	6	7	8	9	10	11	 1	2	3	4	5	0	0	0	0	0	 行=3 输入的行无效，请重新输入！ 行=1 列=99 输入的列无效，请重新输入！ 列=9 a[1,9]=11 这是显示结果

前面输出二维数组不变 printf("行="); scanf("%d",&h); while(h>2||h<0) { printf("输入的行无效，请重新输入！\n"); printf("行="); scanf("%d",&h);  printf("列="); scanf("%d",&l); while(l>9||l<0) { printf("输入的列无效，请重新输入！\n"); printf("行="); scanf("%d",&h); printf("列="); scanf("%d",&l); } } printf("列="); scanf("%d",&l); 改为： while(1){                 printf("行=");                 scanf("%d",&h);                 if(h>2||h<0){                         printf("输入的行无效，请重新输入！\n");                 }                 else{                         while(1){                                 printf("列=");                                 scanf("%d",&l);                                 if(l>9||l<0){                                         printf("输入的列无效，请重新输入！\n");                                 }                                 else{                                         break;                                 }                         }                         break;                 }         } 就可以了

像我们登录网站一样，密码输错账户名还留着，不至于账户名密码都得重新输入

while语句需要怎么改


Question: 为什么报错？

非常感谢

#include <stdio.h> void bx(int a, int b) { 	if (a>b) 	{ 		for (;a>1&&b>1;) 		{ 			a++; 			b--; 			printf("%d>%d\n", a, b); 		}  	} 	else if (a<b) 	{ 		for (;a>1&&b>1;) 		{ 			a++; 			b--; 			printf("%d>%d\n", a, b); 		} 	} 	else 	{ 		return; 	} }  int main() { 	int a; 	int b; 	printf("输入两个数:"); 	scanf("%d %d", &a, &b);  	printf("输出为bx(a,b)\n"); 	bx(a, b);  	return 0; }

for（单次表达式;条件表达式;末尾循环体） { 中间循环体； } 括号内部是两个；号，三个语句


Question: c语言

定义一个指针char *a，只定义了a的类型，并没有实例化，即a是一个随机的指针，因此不能用*a='\0'。

引用 2 楼 林涅槃 的回复:[quote=引用 1 楼 棉猴的回复:]编译器遇到‘\0’时才会认为字符串结束  定义一个char指针可以初始化char*a='\0';吗？[/quote] 可以啊，没问题

应该是*p2 = '\0'; 或者*p2 = 0;  p2是指针，用p = '\0';等价于p = NULL;当然用'\0'赋值给p也注意类型不匹配

引用 1 楼 棉猴的回复:编译器遇到‘\0’时才会认为字符串结束  定义一个char指针可以初始化char*a='\0';吗？

编译器遇到‘\0’时才会认为字符串结束


Question: 看过来

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

加入输入的数字是6，在for循环中，i取0、1、2都不会触发 if(b<a[i]) 当i取3时，a[i]的值是7，此时会触发 if(b<a[i]) 将b和a[i]的值互换，此时b的值变为7，而a[i]的值变为6，输出a[i]此时输入的是6。 继续for循环，当i的值是4，a[i]的值是9，此时会触发 if(b<a[i]) 将b和a[i]的值互换，此时b的值变为9，而a[i]的值变为7，输出a[i]此时输入的是7。 最后  printf("%3d",b); 输出9. VS2015 C++调试结果为

寻找比b大的数，然后交换，应该是从小到大排序，然后挤掉最后一个


Question: 请问怎样出结果（N皇后问题）


Question: 哪位大神能看一看我错在哪些地方？

可以去搜最基本的冒泡排序


Question: 一个32位的数据，其实占用29bit,怎么从高位取4个字节位的数据呢？

移位操作～然后&0x0f。

好的，看明白了，也就是说不管32bit里面的数据占有多少位，按照这个逻辑就可以了，对吗

b=((x&0x00FF0000)>>(32-16)) c=((x&0x0000FF00)>>(32-24)) d=(x&0x000000FF)  引用 3 楼 user-2 的回复:假定是个32bit的uint x a=((x&0xFF000000)>>(32-8))

1110_1111_0001_1110_1010_1100_1110_1 &1111  1111 0000  0000 0000  0000 0000 结果位移

简单的几位我还知道，数据多了，有些晕


Question: st[i]怎么像数组的用法？是怎么回事

没毛病 指针和数组往往都是结合使用的  数组名字很多时候是可以作为一个指针来使用的 反过来， 指针也可以当作数组来使用

函数写的要求就是传入一个student[100]的数组头地址，本来他就是个数组


Question: 新手向大佬求救！

咦，我已经找出错误来了


Question: java中有ArrayList这些官方写好了数据结构用，c语言没有吗？

常用的数据结构，比如类似java集合中的那些 ArrayList  map  set 这些，应该有第三方高效率的实现文件吧，每次使用前复制到自己的项目中吗？

C没有，C偏向于底层，底层的函数或数据结构需要自己定义

c++标准库里面有的， 也就是stl vector queue stack 等

内置的肯定没有，要么自己写要么用别人的

c++有stl.  array 可以用list或vector.

之所以java等语言简便就在于把很多东西都封装成了固定的模板，可以直接调用，c本来就是用来写底层比较多，没有那么多封装的，如果要用建议学下c++，相对而言封装了很多东西可以直接调用。而且c的形式在c++中也可以通用

C++就有模板


Question: 这题怎么弄


Question: 结构问题

对于文件这种操作，如果掌握的还不是很熟的时候建议先按部就班的来，打开一个文件写，写完关闭再打开读。后面的权限也要注意不能用错

因为你没有读取到东西，你rewind是把位置设到开头，但是在这里有问题，你文件是只写创建的，也没有关闭生成文件，读不出来 fp = fopen("fl.txt","w");   if(!fp)   {    printf("can not open this file\n");    exit(-1);   }    fwrite(&stu[0],sizeof(stu[0]),1,fp);    fclose(fp); fp = fopen("fl.txt","r");   if(!fp)   {    printf("can not open this file\n");    exit(-1);   }    fread(&stu[1],sizeof(stu[1]),1,fp); 这样就可以读出来了：


Question: 在vs2017中，为什么在两个.c文件中都定义同同一个变量，不会报错呢？

楼主描述的有问题呢，要看定义的变量在哪？是都在函数里定义的，还是一个在函数外定义，一个在函数内定义呢？  a.c  中 int n ; n =8; int n = 7; 这种情况，如果都在函数外或都在函数内定义都是有问题的，这叫重复定义。  如果int n = 7;定义在函数外，int n; n = 8;定义在函数内，这是没问题的。因为一个是全局变量，一个是局部变量。在内存中的位置是不一样的～

理论是是不能重复定义的，但是不同的编译器在编译阶段可能对规则检测的没有那么严格所以编译会通过。而且VS这方面是可以设置的。

不可重复定义，这是C/C++的规定。前面的能编译，说明VS2017 比较友好、宽松，你用gcc试试，一定全部报错的。


Question: char **solution = malloc(n*sizeof(char *));   error C2440: 'initializing' : can

char **solution = (char **)malloc(n*sizeof(char *));

能说一下这句代码是想做什么嘛？指针在有的64位系统是8字节

引用 1 楼 user-3的回复:你这是要申请多少字节？sizeof（）只看类型，没有放过这样的参数，你要是指针的字节直接换int就好了，sizeof指针都是四字节，不管指针是什么类型的  报错是error C2440: 'initializing' : cannot convert from 'void *' to 'char ** ' 那应该怎样改呢，


Question: 求解

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

int *a[10]; int (*a)[10]; int (*a)(int a); int (*a[10])(int a);


Question: C语言问题

请参考《C++中二维数组的使用》 《C++二维数组》 《C++中二维数组与指针》 希望能够帮到你！

用循环，一个控制行一个控制列（输入输出差不多） 初始化的话，例如int a[2][3]={{1,2,3},{2,3,4}};或者直接这样int a[2][3]={1,2,3,2,3,4};方法很多种，直接查一下应该有很多


Question: 一个c文件中同时声明和定义一个变量是可以的？

可以，如果是是这样的就可以 extern int n; main() {      n=5; }   int n;

可以的话那么你调用的是哪个呢？

可以，但你的描述不准确，详见 https://zh.cppreference.com/w/c/language/extern


Question: 计算机能解决的问题分类

引用 1 楼 user-1的回复:那楼主说一下车牌识别是哪一类的？ 没有属于哪一类，车牌识别本来不是一种应用吗？这些都用用到的。分而治之，把车牌识别中的问题归类能划分开。

那楼主说一下车牌识别是哪一类的？


Question: C语言随机抽数

rand（）产生的随机数都是由种子通过算法得出来的，要使每次程序运行得到的数真的“随机”，可以改变“种子”， srand（（unsigned）time（NULL））这句代码以时间为种子，一般都会加上这句。  [code=c]  #include <stdio.h> #include <time.h> int main() { 	int a[10]; 	srand((unsigned)time(NULL));	         //以时间做种 	for (int i = 0; i < 10; i++) 	{ 		a[i] = rand() % 10 + 1;		//产生1~10之间的随机数 	}  	for (int i = 0; i < 10; i++) 	{ 		printf("%d ", a[i]); 	} 	return 0; }

这个是按顺序使用之前写好的，你加上time.h头文件，然后srand(time(NULL));加到随机数使用前。这个的作用是根据系统的时间来选择里面的数，就伪随机了，然后rand（）%x就可以生成0-x的随机数，不懂可以私信

rand之前使用seed生成种子，这样就可以，而且应该没有绝对没有规律的随机数，因为随机数也都是通过某种方式计算出来的


Question:
请问遇到undefined reference to '_imp_mcisendstring
这种错误该怎么办？

请问怎么加动态库？我是新手只学了基础，不太懂

未定义对'_imp_mcisendstring '的引用，说明你虽然加了头文件但是没有找到函数的实现定义，看看是不是没加动态库啥的


Question: 求解，c语言大作业

参考博客： https://blog.csdn.net/user-1/article/details/99734501


Question: 为什么我写入数据文件没有用啊


Question: 用vs2010出现问题，求大神指教

在引用这几个函数的文件里没有这几个函数的声明导致的，原因要么引用相应的头文件，要么在文件开头用 "extern" 声明这几个函数

又是中文，又是拼音的。劝楼主放弃苦海吧

引用 1 楼 自信男孩 的回复：代码呢？看一堆错误内容看不出什么错误位置～//2.输出办理业务的顾客数组  void print1();                                    //输出数组，源代码参见：详细设计  //3.输出办理业务排队顾客队列  void print2();                                   //输出队列，源代码参见：详细设计  //4.顾客到达事件算法  void daoda(int x);                              //顾客到达处理事件，源代码参见：详细设计  //5.顾客离开事件算法  void likai(int x);                               //顾客离开处理事件，源代码参见：详细设计

引用 1 楼 自信男孩 的回复：代码呢？看一堆错误内容看不出什么错误位置～就是这几个出的错

引用 1 楼 自信男孩 的回复：代码呢？看一堆错误内容看不出什么错误位置～void print1（） void daoda(int x) void likai(int x)

代码呢？看一堆错误内容看不出什么错误位置～


Question: 头文件这么写O不OK?

引用 2 楼 lin5161678 的回复:不OK  需要加一个条件编译 处理重复包含的问题  我上面那个a.h头文件  如果被包含在另外几个.c文件中也不会出现变量和结构体重复定义啊，你可以试一下

引用 3 楼 wow334的回复:[quote=引用 2 楼 lin5161678 的回复:] 不OK  需要加一个条件编译 处理重复包含的问题  我上面那个a.h头文件  如果被包含在另外几个.c文件中也不会出现变量和结构体重复定义啊，你可以试一下[/quote] 不用试就知道有毛病啦

不OK  需要加一个条件编译 处理重复包含的问题

是这么做的，你说的很ok


Question: c语言代码

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


Question: 以前觉得0个error就万幸，现在就算0warning也只能是弟弟

#include<stdio.h>  void reverse(int x[],int n);//形参是数组名//  int main() {     int i,a[10]={2,3,4,5,6,7,8,9,45,33};      printf("原数组为：\n");     for(i=0;i<10;i++)         printf("%d\t",a[i]);     reverse(a,10);     printf("改变后数组为：\n");     for(i=0;i<10;i++)         printf("%d\t",a[i]);       return 0; } void reverse(int x[],int n) { #if 0     int temp,i,j,m;     m=(n-1)/2;     for(i = 0, j = n-1; i <= m; i++, j--)     {          temp=x[i];         x[i]=x[j];         x[j]=temp;      } #endif     int i, j;     int tmp;      for (i = 0, j = n-1; i < j; i++, j--) {         tmp=x[i];         x[i]=x[j];         x[j]=tmp;     } }  供参考～

总结:如果0个error又0个warning，那么很有可能是逻辑错误而导致无法运行。欢迎大佬指点请教

解决了，我漏了一条语句哎呀 j=n-1-i


Question: C语言中可以使用UML图吗？

标准的没有 可以让那个大四就发明文言文编程的牛蛙给写一个   这个应该是工具的事儿， 像 powerdesigner 那样可以通过uml图生成数据之类， 应该有这种工具 不过c太灵活了，完全支持恐怕做不到  VS里面的界面相关的哪一套所见即所得的界面设计和代码链接本身也可以认为是一种从图到代码的转译过程 没有它，要是自己从头写界面哪些c/c++代码要写好多好多。  无代码编程的工具，等着未来普及再说吧


Question: c语言中函数没被调用

楼主的问题可以描述的更清晰一些，另外，把代码贴的更全一些。谁不能调用谁？


Question: 链表问题 向大佬提问

/*插入链表*/ STUDENT *insertnode(STUDENT *head,STUDENT *p) {     STUDENT *be,*ne;     if(head==0)                        /*第一种情况，链表为空时插入结点*/     {         head=p;         p->next=0;         return(head);     }     if(strcmp(head->num,p->num)>=0)    /*第二种情况，新新结点插入在头结点的前面*/     {         p->next=head;         head=p;         return(head);     }     be=ne=head;                        /*第三种情况，在链表中插入新结点*/     while(ne!=0&&strcmp(ne->num,p->num)<0)                /*查找插入新结点的位置*/     {         be=ne;         ne=ne->next;     }     p->next=ne;                        /*将新结点链接到链表中*/     be->next=p;     return(head); } /*删除链表*/ STUDENT *deletenode(STUDENT *head,char *num) {     STUDENT *be, *p;     if(head==NULL)                    /*第一种情况，链表为空，无结点可删*/     {         printf("No node to delete!\n");         return(head);     }     if(strcmp(head->num,num)==0)    /*第二种情况，需删除的结点是链表的头结点*/     {         p=head;         head=head->next;         free(p);     }     else                            /*第三种情况，删除的是链表中除头结点外的结点*/     {         be=p=head;         while(strcmp(p->num,num)!=0&&p->next!=NULL)        /*查找被删除结点的位置*/         {             be=p;                    /*be始终指向被删除结点的前一个结点*/             p=p->next;         }         if(strcmp(p->num,num)==0)    /*查找到p所指向的结点就是要删除的结点*/         {             be->next=p->next;             free(p);             printf("Delete one node!\n");         }         else                        /*在链表中没有所要删除的结点*/             printf("Not Found!\n");     }     return(head); } int main(void) {     char insert_n[10];                    /*定义要插入的结点号*/     char delete_n[10];                    /*定义要删除的结点号*/     STUDENT *head;     head=create();     travel(head);     printf("请输入要插入的结点号：");     scanf("%s", insert_n);     STUDENT* pNode = (STUDENT*) malloc(sizeof(STUDENT));     strcpy(pNode->num, insert_n);     pNode->next = NULL;     /*      这里还缺少，score的输入      */     head = insertnode(head,pNode);    /*将指针head和要插入的结点数传递给插入函数*/     travel(head);                    /*将指针head传入输出函数遍历输出*/     printf("请输入要删除的结点号：");     scanf("%s", delete_n);     head = deletenode(head, delete_n);        /*将指针head和要删除的结点数传递给删除函数*/     travel(head);                    /*将指针head传入输出函数遍历输出*/     return 0; }  帮你让编译器能过去， 逻辑是否正确自己检测


Question: 求大佬教一教c语言逆矩阵求法。

补充一句：没有扎实的数学基础和逻辑思维能力是做不好软件的

矩阵求逆，还是多看看《线性代数》

不打算自己写的，就自己百度吧，可以快速找到答案 自己写的，无论多少问题都是可以提问的


Question: switch语句

本以为switch语句只能判断字符呢，学到了 感谢各位

#include<stdio.h>  void shanchu(int a) {     switch(a)     {         case 1:printf("信工学院，计科最棒！\n"); break;//return 0;         case 2:printf("信工学院，软工最棒！\n"); break;//return 0;         case 3:printf("信工学院，电信最棒！\n"); break;         case 4:printf("信工学院，物联网最棒！\n"); break;         case 5:printf("信工学院，大数据最棒！\n"); break;         case 6:printf("信工学院，自动化最棒！\n"); break;     } } int main () {     int m,n;     scanf("%d", &n);     for(int i=0;i<n;i++)     {         scanf("%d", &m);         //m=shanchu(m);         shanchu(m);     }     return 0;  } 供参考～

int shanchu(char a) { switch(a) { case'1':printf("信工学院，计科最棒！\n"); break;//return 0; case'2':printf("信工学院，软工最棒！\n"); break;//return 0; case'3':printf("信工学院，电信最棒！\n"); break; case'4':printf("信工学院，物联网最棒！\n"); return 0; case'5':printf("信工学院，大数据最棒！\n"); return 0; case'6':printf("信工学院，自动化最棒！\n"); return 0;     default:         printf("Error char, code is %d\n", a);         break;  }     return 0;  }; 这样改一下，你就能看到每次输入一个数字，再回车的时候，就会跟随一个错误输出 原因就是%c获取了字母后，再次循环进来获得了一个回车符号， ascii就是10  你可以在scanf后面根一个 getchar函数过滤它，就不用2*n次循环输入了


Question: c语言求助

#include<stdio.h> /*编写函数实现如下功能   2维数组每行的最大元素放置该行的首位   如   8 41 73   34 15 85   77 74 55    73 41 8   85 15 34   77 74 55*/ //令每行最大值提前 #define N 3 #define M 3  void swap(int *a, int *b) {     int tmp;      tmp = *a;     *a  = *b;     *b  = tmp; }  void fun(int (*a)[M], int row, int col) {     int i, j, max_idx;      for (i = 0; i < row; i++) {         max_idx = 0;         for (j = 1; j < col; j++)             if (a[i][max_idx] < a[i][j])                 max_idx = j;         if (max_idx != 0) {             swap(&a[i][0], &a[i][max_idx]);         }     }     /*     int max[3]={0,0,0};//用来存储每一行的最大值     int temp;//temp作为交换的中间值     int i,j,k=0;     int m[3];//m记录每一行最大值的坐标     //先找到每一行的最大值及坐标     for(i=0; i<M; i++){         for(j=0; j<M; j++){             if (max[k]<a[i][j]) max[k]=a[i][j],m[k]=j ;         }k++;     }     // 进行交换     for(i=0; i<N; i++){         temp=a[i][0];         a[i][0]=a[i][m[i]];         a[i][m[i]]=temp;     }     */ }  int main() {     int a[N][M];     int i,j;     for(i=0; i<N; i++){         for(j=0 ;j<M; j++)             scanf("%d",&a[i][j]);     }     fun(a, N, M);     for(i=0; i<N; i++){         for(j=0; j<M; j++) {             printf("%d", a[i][j]);             if ((j+1) % M)                 printf(" ");             else                 printf("\n");         }             //printf("%d",a[i][j]),j!=2?printf(" "):printf("\n");     }     return 0; }  供参考～


Question: 递归问题

你自己在f函数里面，第一行增加一个printf（“m=%d， n=%d\n”, m, n）;  这样的语句跟踪一下输出就知道了调用的过程 把return 语句改一下 int result = f(m-1, n) + f(m, n-1); printf("m=%d  n=%d result=%d\n", m, n, result); return result; 这样你就能看到每次调用的返回结果了  学会调试跟踪， 很多事儿就可以自己搞定了

这个输出的是f这个函数，在输出的时候会调用f这个函数，在f函数内如果不满足条件会一直调用f（m-1，n）+f(m，n-1)


Question: 链表错误

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node {     int data;     struct node *next; } linklist;  void link(linklist *head); void create_link(linklist *head); void printfList(linklist *head);  int main(void) {     //int i,n;     int n;      linklist *head;     head = (linklist*)malloc(sizeof(linklist));     head->next = NULL;     while(1)     {         printf("输入1：建立链表：\n");         printf("输入2：除去链表中的相同元素：\n");         printf("输入3：退出：\n");         printf("输入4：输出链表：\n");         scanf("%d",&n);         switch(n)         {             case 1:printf("当输入-1时结束建立链表\n");                    create_link(head);                    break;             case 2:link(head);                    break;             case 3:exit(0);                    printf("已退出\n");                    break;             case 4:printf("正在输出，请稍等。。。。。\n");                    printfList(head);                    break;         }     }     return 0; } void link(linklist *head) {     linklist *p, *q, *prev;     q = head->next;      if (q == NULL)         return; #if 1     while (q) {         p = q->next;         prev = q;         while (p) {             if (p->data != q->data) {                 p = p->next;                 prev = prev->next;                 continue;             }             prev->next = p->next;             free(p);             p = prev->next;         }         q = q->next;     }  #else     p  = q->next;     while(p != NULL)     {         if(p->data == q->data)         {             q->next = p->next;             free(p);             p = q->next;         }         else         {             //q = p;//这里有点疑惑，个人感觉把这一行去掉才对 。             p = p->next;         }     } #endif     printf("已除去\n"); }  void create_link(linklist *head) {     int data1;     linklist *r;      //r = (linklist*)malloc(sizeof(linklist));     //while(scanf("%d",&data1),data1 != -1)     while(scanf("%d",&data1) && data1 != -1) {         r = (linklist*)malloc(sizeof(linklist));         r->data = data1;         r->next = head->next;         head->next = r;     } } void printfList(linklist *head) {     linklist *p = head->next;     while(p != NULL)     {         printf("%d\n",p->data);         p = p->next;     } } 供参考～  两个地方有逻辑错误，创建链表时，除了第一个节点申请了空间，后面的节点没有申请空间呢 第二个错误，是删除相同的，楼主应该用二层循环吧，若用一层循环只能将与第一个节点相同的data去掉。另外，删除节点的地方有也有问题。  建议对比找出自己的问题～