Question: 编写程序，初始化10名学生的基本信息，包括学号、姓名、三科（高数、英语、程序设计）成绩，分别计算每名学生的总分，并按个人总分对学生降序排序

引用 1 楼 chxchxkkk的回复:搞两个结构体太复杂了吧，一个就足够了。 两个结构体，就直接不会使用了

统一回复一下各位大佬 #include <stdio.h> struct courses { 	char cName[20]; 	double score; }; struct student/*?学生信息结构定义?*/ { 	int num;/*?学号?*/ 	char name[10];/*?姓名?*/ 	double sum;/*?总分?*/ 	struct courses sc[3]; }; int main() { 	struct student students[10] = 	{{101,"xiao",0,{{"computer",89},{"math",78},{"english",76}}}, 	{102,"zhao",0,{{"computer",90},{"math",56},{"english",54}}}, 	{103,"qian",0,{{"computer",91},{"math",73},{"english",63}}}, 	{104,"sun",0,{{"computer",92},{"math",95},{"english",82}}}, 	{105,"li",0,{{"computer",93},{"math",74},{"english",73}}}, 	{106,"zhou",0,{{"computer",94},{"math",25},{"english",95}}}, 	{107,"wu",0,{{"computer",95},{"math",34},{"english",13}}}, 	{108,"zheng",0,{{"computer",96},{"math",64},{"english",76}}}, 	{109,"wang",0,{{"computer",97},{"math",68},{"english",68}}}, 	{110,"jiang",0,{{"computer",98},{"math",78},{"english",76}}}}, 	temp;/*?定义结构数据?*/ 	for(int i=0;i<10;i++) 	{ 		printf("num:%d ",students[i].num); 		printf("name:%s ",students[i].name);//sum总分等于?sc数组中的第1，2，3个成员的和 		students[i].sum=students[i].sc[0].score+students[i].sc[1].score+students[i].sc[2].score; 		printf("sum:%.2lf\n",students[i].sum); 	} 	for(int i=0;i<10;i++)//?这就是??冒泡排序算法 	{ 		for(int j=i;j<10;j++) 		{ 			if(students[i].sum<students[j].sum) 			{ 				temp=students[i];/*交换数组元素*/ 				students[i]=students[j]; 				students[j]=temp; 			} 		} 	}/*?输出排序后的信息?*/ 	printf("排序后:\n"); 	for(int i=0;i<10;i++)//还是上面那个打印的for 	{ 		printf("num:%d ",students[i].num); 		printf("name:%s ",students[i].name);//sum总分等于sc数组中的第1，2，3个成员的和 		printf("name:%.2lf\n",students[i].sum); 	} 	return 0; }

引用 1 楼 chxchxkkk的回复:搞两个结构体太复杂了吧，一个就足够了。 那我应该怎么写？

搞两个结构体太复杂了吧，一个就足够了。

引用 6 楼 m0_46108109的回复: struct courses {     char cName[20];     double score; }; struct student /* 学生信息结构定义 */ {     int num;                     /* 学号 */     char name[10];               /* 姓名 */     double sum;              /* 平均分 */     struct courses sc[10]; };  问题主要出在这个镶套结构上，首先你先不用镶套结构，就用一个结构表述一下。 struct student /* 学生信息结构定义 */ {     int num;                     /* 学号 */     char name[10];               /* 姓名 */     double sum;              /* 平均分 */     //把三科成绩平铺在这里 }; 然后再用镶套结构替换，上面的那个只使用一个结构表述的 struct student /* 学生信息结构定义 */ {     int num;                     /* 学号 */     char name[10];               /* 姓名 */     double sum;              /* 平均分 */     struct courses sc[10];//你会发现问题出在这里，每个学生的成绩只有三科。而你的定义是，每个学生的机构里，包含了10个成绩。 }; 另外，下面的初始化错了。 {   {101,"xiao",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {102,"zhao",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {103,"qian",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {104,"sun",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {105,"li",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {106,"zhou",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {107,"wu",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {108,"zheng",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {109,"wang",{{1,"computer",89},{2,"math",78},{3,"english",76}}},                                     {110,"jiang",{{1,"computer",89},{2,"math",78},{3,"english",76}}}                                 }//首先没有初始化平均分，其次，凭空多出来了123索引，两个结构里都没有这个成员 谢谢，确实是我结构的问题和初始化错了。

引用 2 楼 风吟xqy 的回复:[quote=引用 1 楼 chxchxkkk的回复:]搞两个结构体太复杂了吧，一个就足够了。 那我应该怎么写？[/quote] struct student /* 学生信息结构定义 */ {     int num;                     /* 学号 */     char name[10];               /* 姓名 */     double sum;              /* 平均分 */     double gaoshu;     double english;     double chengxu; };

用一个结构体定义 另外可以申明一个student类型的临时变量 排序时用得着


Question: c语言结构体

#include<stdio.h>  int main() {     printf("欢迎进入投票\n");     printf("\n");     printf("候选人有：y,w,e,r");     struct piao     {         int y;         int w;         int e;         int r;     }piao1={0,0,0,0};      int i,j;     char a,b,c,d,t;     b='y';     c='w';     d='e';     t='r';     for(i=0;i<10;i++)     {         printf("\n");         printf("请输入你支持的选手：");         //scanf("%s",&a);         scanf("%c",&a);         getchar();         /*         if(0)         {         }         */         if(b==a)             piao1.y=piao1.y+1;         if(c==a)             piao1.w=piao1.w+1;         if(d==a)             piao1.e=piao1.e+1;         if(t==a)             piao1.r=piao1.r+1;     }     printf("y的票数：%d\n",piao1.y);     printf("w的票数：%d\n",piao1.w);     printf("e的票数：%d\n",piao1.e);     printf("r的票数：%d\n",piao1.r);      if(piao1.y>piao1.w&&piao1.y>piao1.e&&piao1.y>piao1.r)         printf("胜者是：y\n");     if(piao1.w>piao1.y&&piao1.w>piao1.e&&piao1.w>piao1.r)         printf("胜者是：w\n");     if(piao1.e>piao1.y&&piao1.e>piao1.w&&piao1.e>piao1.r)         printf("胜者是：e\n");     if(piao1.r>piao1.y&&piao1.r>piao1.w&&piao1.r>piao1.e)         printf("胜者是：r\n"); } 供参考～

改好了，记得打赏哦，还有楼主记得for循环规范书写，写上｛｝

把%s改成%c

怎么改都搞不定


Question: 求大佬帮忙

加个srand随机数种子试试看

srand我放在什么位置都没用啊。循环里外都没用

srand( (unsigned)time( NULL ) );  G.E[i][j]=rand()%2; 我这样也一直都是得到0

你的srand()函数放在了哪里，是不是放到循环里了。  另外，rand() % 2得到随机数范围是0， 1


Question: 统计票数

gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间  所以 gets(&tick); 这种写法是不对的，可以用   tick = getchar()

[quote=引用 1 楼 user-2 的回复:] 我的代码一直输不出结果 #include <stdio.h> struct person { 	char name[20]; 	int n; }; int main() { 	int i=0; 	struct person a[]={{"张三",0},{"李四",0},{"王五",0},{"谢六",0}};  printf("四位候选人的名字为：张三，李四，王五，谢六；\n");  printf("请输入数字为候选人投票（1为张三，2为李四，3为王五，4为谢六，5结束投票）\n");  char tick;   for(i=0;i<10;i++)  {   printf("\t第%d位投票人",i+1);   gets(&tick); } 	while(i!=5)//判断 若等于5，则跳出循环  	{ 		scanf("%d",&i); 		switch(i) 		{ 			case 1:a[0].n++;break; 			case 2:a[1].n++;break; 			case 3:a[2].n++;break; 			case 4:a[3].n++;break;	 		} 	}  	for(i=0;i<4;i++) 	{ 		printf(" %d的票数为:%d",a[i].name,a[i].n); 	} 	return 0; }

C语言基础 用struct定义一个结构体 用printf输出一些菜单等信息 用getchar来获取用户的选择，比如1,2等


Question: C语言习题，检查不到错误。

int *lst = (int)malloc(sizeof(int) *2); 改为int *lst = (int*)malloc(sizeof(int) *2); 试试 你这是把地址转为整数，又把整数转为地址


Question: 二维指针数组和一维指针数组转化

引用 6 楼 chxchxkkk的回复:接楼上： 1 p是一个指针数组，他有四个指针类型的数组元素，每个成员都是指针 2 p[i] = &a[i*3]    p[0] 指向 1 2 3 的首地址，也就是1的地址    p[1]指向 4 5 6 的首地址，也就是 4的地址    p[2] 指向 7 8 9的首地址，也就是7的地址    p[3]指向 10 11 12 的首地址，也就是 10的地址 这样是不是好理解一些了 p【0】指向1的地址 为什么1 2 3要要作为一组 就是为什么要1 2 3，4 5 6这样分

引用 7 楼 其实一开始我是拒绝的 的回复:[quote=引用 6 楼 chxchxkkk的回复:]接楼上： 1 p是一个指针数组，他有四个指针类型的数组元素，每个成员都是指针 2 p[i] = &a[i*3]    p[0] 指向 1 2 3 的首地址，也就是1的地址    p[1]指向 4 5 6 的首地址，也就是 4的地址    p[2] 指向 7 8 9的首地址，也就是7的地址    p[3]指向 10 11 12 的首地址，也就是 10的地址 这样是不是好理解一些了 p【0】指向1的地址 为什么1 2 3要要作为一组 就是为什么要1 2 3，4 5 6这样分[/quote] 因为 p[i] = &a[i*3]

引用 4 楼 其实一开始我是拒绝的 的回复:[quote=引用 3 楼 其实一开始我是拒绝的的回复:][quote=引用 2 楼 a1007885391的回复:]首先我们来看p，他是一个指针数组，他有四个指针类型的数组元素 在这里p是个常量，不能执行p+1，也不能执行 p =a; 只存在p[0],p[1],p[n-1],而且这些都是指针变量，只用来存放变量地址（但可以使用*p = a,*p表示指针数组第一个元素的值，a的首地址的值） 调用p[3]实际得到的就是a[9]的地址，p[3][2]实际就是*(&a[9]+2) = a[11]  不是很明白你想搞清楚什么，间接访问符你想怎么使用 为什么不是*p【3】【2】  只有p【3】【2】这个不是一个指针？不是需要间接访问符才能访问里面的数据也就是12？[/quote] 为什么p[3][2]实际就是*(&a[9]+2) = a[11]？[/quote] 我们一步一步来梳理这个问题，你看下到了哪步你没搞懂： 1.p是一个指针数组，他有四个指针类型的数组元素（也就是p这个数组有四个成员，这四个成员都是指针） 2.在循环中 对p[i]进行了赋值：现在p[0]的值就是a[0]的地址，p[1]的值就是a[3]的地址，p[2]的值就是a[6]的地址，p[3]的值就是a[9]的地址也就是 p[3] = &a[9] 3.一般我们对一个指针使用索引[n]时就相当于，这个指针的值 + n*这个指针指向的类型，对得到的地址解引用。 此时p[3][2] = (&a[9])[2]=*(&a[9]+2) = a[11]

引用 3 楼 其实一开始我是拒绝的的回复:[quote=引用 2 楼 a1007885391的回复:]首先我们来看p，他是一个指针数组，他有四个指针类型的数组元素 在这里p是个常量，不能执行p+1，也不能执行 p =a; 只存在p[0],p[1],p[n-1],而且这些都是指针变量，只用来存放变量地址（但可以使用*p = a,*p表示指针数组第一个元素的值，a的首地址的值） 调用p[3]实际得到的就是a[9]的地址，p[3][2]实际就是*(&a[9]+2) = a[11]  不是很明白你想搞清楚什么，间接访问符你想怎么使用 为什么不是*p【3】【2】  只有p【3】【2】这个不是一个指针？不是需要间接访问符才能访问里面的数据也就是12？[/quote] 为什么p[3][2]实际就是*(&a[9]+2) = a[11]？

引用 2 楼 a1007885391的回复:首先我们来看p，他是一个指针数组，他有四个指针类型的数组元素 在这里p是个常量，不能执行p+1，也不能执行 p =a; 只存在p[0],p[1],p[n-1],而且这些都是指针变量，只用来存放变量地址（但可以使用*p = a,*p表示指针数组第一个元素的值，a的首地址的值） 调用p[3]实际得到的就是a[9]的地址，p[3][2]实际就是*(&a[9]+2) = a[11]  不是很明白你想搞清楚什么，间接访问符你想怎么使用 为什么不是*p【3】【2】  只有p【3】【2】这个不是一个指针？不是需要间接访问符才能访问里面的数据也就是12？

引用 楼主 其实一开始我是拒绝的的回复:为什么定义一个一维指针数组最好却输出二维指针数组  而且为什么输出p【3】【2】这个指针不用间接访问符？


Question: 运行的时候显示有错误，求指出

有时候遇到问题实在解决不了可以试试一段一段屏蔽，这方法我就用过一次，多线程出现了死锁，把自己坑死了

1.第8行 char *NAME[30]少了个分号，另外这种方式很奇怪 直接char NAME[30]就行了吧。 2.void dnew(struct ml friends[]) 这个新建函数的本意是要输入30个学生的信息吗，可是函数体内并没有循环语句，count++没啥意义

按顺序修改，如果存在多个语法错误，很可能后面会报一堆不相干的错误，按顺序先排除语法错误。

就按照提示改就好，比如第八行少了分号;


Question: c语言: codeblocks运行时error: ld reeturened 1 exit status

引用 9 楼 自信男孩 的回复:先把编译警告和error解决了～ Debug文件删除后errors就没有了，程序就可以正常run了

引用 8 楼 a1007885391 的回复:不清楚你的编译器和运行平台，可能是你第一次检出后出错了，但是修改了问题没有重新生成解决方案或者说是重新编译，又用的之前的编译文件，导致的错误；你删除之后没有那些编译过程产生的文件了，他又自动重新生成了，所以就正常了。反正我一般改了代码都是重新生成解决方案 运行平台是codeblocks 然后编译器是GNU GCC Compiler 很奇怪的是我之前都没这个问题，是在复制project到另一台电脑上后就出现了。 幸好解决了，多谢你的分享

先把编译警告和error解决了～

引用 6 楼 a1007885391 的回复:看一下编译的输出，报错在哪 你好，我一个同事叫我把project下obj和bin里面的debug文件删了 结果还真行了 所以是编译的问题吗？好奇怪，可是之前都ok的啊， 我在笔记本上都可以，然后回学校拷到台式机就不行了。 这下好了，可是原理我还是没搞懂，不知道为啥会这样。

看一下编译的输出，报错在哪

引用 4 楼 a1007885391 的回复:你这。。。贴代码的文本啊，好本地复现，你这贴一个图片又这么多错怎么搞 我这个project下14个文件，你要我都贴吗？ 还是只要main？

你这。。。贴代码的文本啊，好本地复现，你这贴一个图片又这么多错怎么搞

引用 1 楼 user-3 的回复:怎么也需要贴一下代码以及错误截图吧 图在楼下了 谢谢

怎么也需要贴一下代码以及错误截图吧


Question: 学生成绩管理综合应用程序

题目不难，考察数组、函数、排序等知识点，最好自己写一下，不然永远不会

作业要自己写哦


Question: 【小白求救】

引用 2 楼 Disguiser-x的回复:[quote=引用 1 楼 user-1的回复:]目标文件生成路径不对。你这个代码是怎么导入IDE的？ 怎么个不对法？如何修改？手打上去的不行，复制上去的也不行。[/quote] 我自己成功了，手输一遍删掉又复制就成功创建了。

引用 1 楼 user-1的回复:目标文件生成路径不对。你这个代码是怎么导入IDE的？ 怎么个不对法？如何修改？手打上去的不行，复制上去的也不行。

目标文件生成路径不对。你这个代码是怎么导入IDE的？


Question: 求问大佬为什么我输出总是10

你是想让它输出的是什么？按照代码，确实应该这么输出

就是我输入10个数他好像不检测是不是在范围内就直接输出

题目贴出来看看

你调试一下看看ab的值


Question: 运行不出结果，求问我这个程序哪里有问题

不出结果?是没有输出 还是输出结果不对?贴出运行结果

如果规定名字最大输入多长，则 char name[len]//len为长度

char name[20];

引用 2 楼 m0_46108109的回复:char name;//目测这里应该是字符串数组 这里要怎么改

字符数组。。

char name;//目测这里应该是字符串数组


Question: 求帮助，VS2015运行zuc算法，结果一直是密钥交换，换成其他项目运行结果都是这个

引用 1 楼 user-2 的回复:那就是进入死循环了？ 官方代码，不会吧

用打印的循环信息查找定位一下是哪里循环， 检查循环条件

官方源代码，应该不会吧。调用了miracl库

那就是进入死循环了？


Question: 为什么元组(array)无法赋给变量？

引用 5 楼 qq_48095479 的回复:[quote=引用 3 楼 a1007885391的回复:][quote=引用 2 楼 qq_48095479 的回复:] [quote=引用 1 楼 a1007885391的回复:]你的设想中数组的值应该是怎样复制给sum 就是像代码那样，用for循环遍历元组然后依次赋给sum。我试过如果是自己定义而非用户输入的元组的话是可以实现sum的，但是这个用户输入的元组就是不行...[/quote] double arr[n]; scanf("%d", &arr[i]); 注意这两句，你是把他声明为double数组，但你去用整型数据的方式去读他， 应改为scanf("%lf", &arr[i]);[/quote] 我第一次用这个..怎么给你分数啊[/quote] 4、如何给帖子结帖，结帖如何给分？ 点击帖子左上方的"结帖"按钮，可以进行如下操作：  a.单独给分结帖：当您的问题得到解答，请给回答者相应的分数，来结束该帖。当您结帖后，系统将返回给您该帖的50%的可用分。 注：结帖人不允许给自己的回复发分。 b.无满意答案结帖： 当您的问题得不到合适的答案。您可以选择无满意结帖结束这个问题。 注：无满意结帖，系统将回收帖主的悬赏分，且没有任何可用分返还。无满意答复，必须提问满24小时才可以进行操作。 c.平均给分结帖：当回复过长参与人数过多时候，您可以使用平均给分的功能。 注：技术区不允许平均给分结帖。

引用 3 楼 a1007885391的回复:[quote=引用 2 楼 qq_48095479 的回复:] [quote=引用 1 楼 a1007885391的回复:]你的设想中数组的值应该是怎样复制给sum 就是像代码那样，用for循环遍历元组然后依次赋给sum。我试过如果是自己定义而非用户输入的元组的话是可以实现sum的，但是这个用户输入的元组就是不行...[/quote] double arr[n]; scanf("%d", &arr[i]); 注意这两句，你是把他声明为double数组，但你去用整型数据的方式去读他， 应改为scanf("%lf", &arr[i]);[/quote] 我第一次用这个..怎么给你分数啊

引用 3 楼 a1007885391的回复:[quote=引用 2 楼 qq_48095479 的回复:] [quote=引用 1 楼 a1007885391的回复:]你的设想中数组的值应该是怎样复制给sum 就是像代码那样，用for循环遍历元组然后依次赋给sum。我试过如果是自己定义而非用户输入的元组的话是可以实现sum的，但是这个用户输入的元组就是不行...[/quote] double arr[n]; scanf("%d", &arr[i]); 注意这两句，你是把他声明为double数组，但你去用整型数据的方式去读他， 应改为scanf("%lf", &arr[i]);[/quote] 谢谢你！我试过了的确是数据类型的问题😂

引用 2 楼 qq_48095479 的回复:[quote=引用 1 楼 a1007885391的回复:]你的设想中数组的值应该是怎样复制给sum 就是像代码那样，用for循环遍历元组然后依次赋给sum。我试过如果是自己定义而非用户输入的元组的话是可以实现sum的，但是这个用户输入的元组就是不行...[/quote] double arr[n]; scanf("%d", &arr[i]); 注意这两句，你是把他声明为double数组，但你去用整型数据的方式去读他， 应改为scanf("%lf", &arr[i]);

引用 1 楼 a1007885391的回复:你的设想中数组的值应该是怎样复制给sum 就是像代码那样，用for循环遍历元组然后依次赋给sum。我试过如果是自己定义而非用户输入的元组的话是可以实现sum的，但是这个用户输入的元组就是不行...

你的设想中数组的值应该是怎样复制给sum


Question: 大一学生，有问题求指点！

scanf(" %d %d %d",&p,&q,&x);   int sum[p][q],juzhen[p][q];  这个是C99 的VLA（变长数组），可以在运行时初始化大小

就问题所述场景，应该可以使用，但建议使用常量作为size，使用输入的p、q判断size是否越界。 原因如下: 动态数组一般是指malloc, new出来的。 例如int *ary = new int[4]; 题主的写法，在visual studio上会编译不过，在gcc可以使用。  但gcc很多场景都会要求使用常量做为数组的size，例如


Question: Keil运行这个程序没毛病，在while判断那里的时候只有while判断语句里面的值大于等于256就无法进入while语句了


Question: 我是刚刚接触单片机的小白！

引用 2 楼 ༺࿈军仔*江河湖海࿈༻的回复:[quote=引用 1 楼 Simple-Soft的回复:]应该会返回，i大于50就返回了 我的意思是如果函数中的if 语句不成立那么会不会继续执行，或者会不会有返回值？[/quote] if语句控制的是if语句块，如果if不成立，只有if控制的语句块不执行，不影响别的代码逻辑

引用 1 楼 Simple-Soft的回复:应该会返回，i大于50就返回了 我的意思是如果函数中的if 语句不成立那么会不会继续执行，或者会不会有返回值？

在你这个程序会有返回值，返回变量zhi,由于你们有对变量zhi进行初始化，此时变量zhi是一个随机值，即返回的是一个随机值

应该会返回，i大于50就返回了


Question: 求助大神，实在是不会了

思路很简单 每行的总金额-每行的平均金额，就是每行的第一个人应该收回的金额，其余人就是应该支出平均额 这样统计一下收回和支出，最后收回-支出就是该收回的钱，为负数就表示要支出 代码LZ自己先写吧，遇到问题再问


Question: C语言零散知识点总结-钻石段位篇

最后一章还以为能见到古老的DOS中断，原来是Unix版本的~


Question: 怎么样改才能输入多个年份然后一起输出年月日？

那就不要在循环里打印结果，而是把结果先存入数组，最后再一起打印数组的结果

1.根据输入的t   new一个对象数组，该对象使用一个结构体输入年和日 如： srruct datatime { int year; int month; } datatime *pdt = new datatime[t]; 2.每循环一次从pdt当中取出一组数据 3.最后处理完数据记得 释放对象 delete pdt; pdt = nullptr;

没太明白问题是什么


Question: VC++6.0设计通讯录管理系统

引用 2 楼 user-2的回复:闲来无事，写了个，供参考  #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1024  typedef struct Tongxulu { 	char name[20]; 	char addr[50]; 	char phone[15]; }TXL;  /* 菜单 */ void Menu(); /* 保存 */ void SaveTXL(TXL *arr, int n); /* 新建 */ void CreateTXL(TXL *arr); /* 浏览 */ void PrintTXL(); /* 查询 */ void FindTXL(); /* 修改 */ void ModifyTXL();  int len = 0;   int main() { 	int choice = -1; 	TXL arr[N]; 	  	while (1) 	{ 		system("cls"); 		Menu(); 		scanf("%d", &choice); 		switch (choice) 		{ 			case 1: 				CreateTXL(arr); 				break; 			case 2: 				ModifyTXL(); 				break; 			case 3: 				FindTXL(); 				break; 			case 4: 				PrintTXL(); 				break; 			case 0: 				exit(0); 				break; 			default: 				printf("\n输入0-4之间的整数："); 				break; 		}  	} 	 	getchar(); 	return 0; }  /* 菜单 */ void Menu() { 	printf("\n----------- 通讯录 ----------\n"); 	printf("            1. 新建 \n"); 	printf("            2. 修改 \n"); 	printf("            3. 查询 \n"); 	printf("            4. 浏览 \n");	 	printf("            0. 退出 \n"); 	printf("-----------------------------\n\n"); 	printf("选择菜单项(0-4): "); }  /* 新建 */ void CreateTXL(TXL *arr) { 	int i; 	char ch; 	printf("\n输入班级人数："); 	scanf("%d", &len); 	getchar(); 	for (i=0; i<len; i++) 	{ 		printf("\n输入第%d个学生的姓名 家族住址 电话：\n", i+1); 		scanf("%s%s%s", arr[i].name, arr[i].addr, arr[i].phone); 	} 	getchar(); 	printf("\n新建通讯录完毕，要保存吗(y/n): "); 	scanf("%c", &ch); 	if ('y' == ch || 'Y' == ch) 	{ 		SaveTXL(arr, len); 	} 	else 	{ 		printf("提示：通讯录未保存！\n"); 	} }  /* 保存 */ void SaveTXL(TXL *arr, int n) { 	int i; 	FILE *fp; 	if ((fp = fopen("./temp/txl.txt", "w")) == NULL) 	{ 		printf("保存通讯录失败！\n"); 		exit(1); 	}  	for (i=0; i<n; i++) 	{ 		fprintf(fp, "%s %s %s\n", arr[i].name, arr[i].addr, arr[i].phone); 	} 	printf("通讯录保存完毕！\n"); 	fclose(fp); }  /* 浏览 */ void PrintTXL() { 	int i = 0; 	TXL stu; 	FILE *fp; 	fp = fopen("./temp/txl.txt","r"); 	if (!fp) 	{ 		printf("文件不存在！\n"); 		exit(1); 	}  	 	fscanf(fp, "%s%s%s", stu.name, stu.addr, stu.phone); 	 	printf("\n--------------- 通讯录 --------------\n\n"); 	printf("%s\t%s\t%s\n", "姓名", "家庭住址", "联系方式"); 	printf("\n-------------------------------------\n\n"); 	while(!feof(fp)) 	{ 		printf("%s\t%s\t\t%s\n", stu.name, stu.addr, stu.phone); 		fscanf(fp, "%s%s%s", stu.name, stu.addr, stu.phone);		 	} 	 	fclose(fp); 	getchar(); 	getchar(); }  /* 查询 */ void FindTXL() { 	char fphone[15], fname[20]; 	int i = 0, choice = -1, j; 	TXL s[N]; 	FILE *fp; 	fp = fopen("./temp/txl.txt","r"); 	if (!fp) 	{ 		printf("文件不存在！\n"); 		exit(1); 	}	 	while(!feof(fp)) 	{	 		fscanf(fp, "%s%s%s", s[i].name, s[i].addr, s[i].phone); 		i++;		 	}  	while (1) 	{ 		system("cls"); 		printf("\n------------ 通讯录-查询 ------------\n"); 		printf("             1. 按姓名查找\n"); 		printf("             2. 按电话查找\n"); 		printf("             0. 返回\n\n"); 		printf("输入菜单选项："); 		scanf("%d", &choice); 		switch (choice) 		{ 			case 1:				 				printf("\n输入要查找的学生姓名："); 				scanf("%s", fname); 				for (j=0; j<i; j++) 				{ 					if (strcmp(fname, s[j].name) == 0) 					{ 						printf("\n------------ 通讯录-查询结果 ------------\n"); 						printf("%s\t%s\t%s\n", "姓名", "家族住址", "联系方式"); 						printf("\n%s\t%s\t\t%s\n", s[j].name, s[j].addr, s[j].phone); 						getchar(); 						break; 					}					 				} 				printf("姓名为%s的学生未找到！\n", fname); 				getchar(); 				getchar(); 				break; 			case 2:				 				printf("\n输入要查找的学生电话："); 				scanf("%s", fphone); 				for (j=0; j<i; j++) 				{ 					if (strcmp(fphone, s[j].phone) == 0) 					{ 						printf("\n------------ 通讯录-查询结果 ------------\n"); 						printf("%s\t%s\t%s\n", "姓名", "家族住址", "联系方式"); 						printf("\n%s\t%s\t\t%s\n", s[j].name, s[j].addr, s[j].phone); 						getchar(); 						break;						 					}					 				} 				printf("电话为%s的学生未找到！\n", fphone); 				getchar(); 				getchar(); 				break; 			case 0: 				return; 				break; 			default: 				printf("\n输入0-2之间的整数："); 				break; 		} 	} 	 	fclose(fp); }  /* 修改 */ void ModifyTXL() { 	char mphone[15], mname[20], maddr[50]; 	int i = 0, j; 	TXL s[N]; 	FILE *fp; 	fp = fopen("./temp/txl.txt","r"); 	if (!fp) 	{ 		printf("文件不存在！\n"); 		exit(1); 	}	 	while(!feof(fp)) 	{	 		fscanf(fp, "%s%s%s", s[i].name, s[i].addr, s[i].phone); 		i++;		 	} 	printf("\n\n 学生人数 = %d\n\n", i-1);  	printf("要修改第几个学生的信息？\n"); 	scanf("%d", &j); 	if (j <= 0 || j > i) 	{ 		printf("错误：超出范围！\n"); 		getchar(); 		return; 	} 	else 	{ 		printf("输入要修改的信息：姓名 住址 电话：\n"); 		scanf("%s%s%s", s[j-1].name, s[j-1].addr, s[j-1].phone);		  		getchar(); 		printf("修改完成，正在保存......\n"); 		getchar(); 		SaveTXL(s, i-1); 		getchar(); 		return; 	} }  用不了哇。。。

厉害👍，多谢兄弟

引用 1 楼 Simple-Soft的回复:用c的话，打开文件用fopen,读用fread，写用fwrite，如果用c++的话，文件操作可以用fstream来操作文件 不懂😂，c语言白痴一枚


Question: C语言单向链表增加新的结点

节点存储的有用的信息，就是你使用链表的最原始驱动，你需要处理的信息都可以塞进去，额外加一个指针域用来把节点连接起来； 不用那么麻烦，你就把单向链表想象成在排队的一群人，后面的人把手搭在前面的人的肩膀上，这时候你要插队要先把你的手放在即将插入位置的前一位肩膀上，再把这位肩膀上别人的手挪到你的肩膀上，队就插成了，肩膀就好比链表节点的指针域，告诉下一位是谁； 现在在看代码就能看明白未来插入节点各种指针的备份。

引用 7 楼 user-3的回复:插入1 2 3的步骤，LZ可以自己简单画个图 head----NULL tail-------NULL  插入第一个节点 p---------1(next=NULL) //生成新节点 head=p, tail=p就是 (head/tail)----1(next=NULL)  插入第二个节点 p---------2(next=NULL) //生成新节点 tail->next=p就是 (head/tail)-------1(next------p(2,next=NULL)) tail=p就是 head----1(next------tail(2,next=NULL)) //tail变成最后  插入第三个节点 p---------3(next=NULL) //生成新节点 tail->next=p就是 head-------1(next------tail(2,next------p(3,next=NULL))) tail=p就是 head----1(next--------------2,next------tail(3,next=NULL)) //tail变成最后  看链表里的p和tail的移动 请问有没有删除结点的例子？

链表自己画一下图会理解的更清楚一些，尤其是在中间插入、删除结点的时候。

引用 6 楼 user-3的回复:[quote=引用 4 楼 其实一开始我是拒绝的 的回复:] 4 插入p之后，p就是最后一个节点了，所以要修改tail指向p，即tail=p  插入p后为什么要tail=p，我知道最后的结点为NUll 是因为tail为NULL？ 因为tail永远指向链表最后一个节点，就像head永远指向第一个节点一样，所以tail不是NULL（也就是tail指向最后一个节点），而tail->next才是NULL（最后一个节点因为没有后续的节点了，所以next指针指向空）  比如插入 1 2 3 开始的时候，head是NULL，tail是NULL  插入第一个节点，首先生成节点p，然后给节点赋值 p->data=1, p->next=NULL 此时因为head是NULL，进入if(head==NULL)分支，执行head=p，此时head->data=1, head->next=NULL，也就是head指向了第一个节点1 接着因为p此时是最后一个节点（当前链表只有1个节点，p既是第一个节点，也是最后一个节点），所以要修改tail指向p，即执行tail=p, 此时tail->data=1, tail->next=NULL，也就是tail也指向了第一个节点1 到此，插入第一个节点结束，此时head指向了节点1，tail也指向了节点1，显然符合插入第一个节点的要求  插入第二个节点，首先生成节点p，然后给节点赋值 p->data=2, p->next=NULL 此时因为head不是NULL（而是指向节点1了），所以进入if(head==NULL)的else分支，执行tail->next=p, 也就是让tail的next指向新节点p，相当于把新节点连接在tail的后面，此时tail->data=1, tail->next=p(p->data=2, p->next=NULL) 此时可以发现p变成了最后一个节点（因为p连接在tail的后面），所以要修改tail指向最后一个节点（因为tail才应该是链表的最后），即执行tail=p, 此时tail->data=2, tail->next=NULL，也就是tail指向了新节点2 到此，插入第二个节点结束，此时head保持指向节点1不变，tail变成了指向节点2，显然符合head指向头一个节点1，tail指向最尾节点2的要求  插入第三个节点，首先生成节点p，然后给节点赋值 p->data=3, p->next=NULL 然后和插入第二个节点一样，先让tail->next=p，也就是新节点连接在tail的后面，然后再修改tail指向最后一个节点，即tail=p, 此时tail->data=3, tail->next=NULL，也就是tail指向了新节点3 到此，插入第三个节点结束，此时此时head保持指向节点1不变，tail变成了指向节点2，显然符合head指向头一个节点1，tail指向最尾节点3的要求 [/quote] 谢谢，我搞清楚了

引用 4 楼 其实一开始我是拒绝的 的回复:4 插入p之后，p就是最后一个节点了，所以要修改tail指向p，即tail=p  插入p后为什么要tail=p，我知道最后的结点为NUll 是因为tail为NULL？ 因为tail永远指向链表最后一个节点，就像head永远指向第一个节点一样，所以tail不是NULL（也就是tail指向最后一个节点），而tail->next才是NULL（最后一个节点因为没有后续的节点了，所以next指针指向空）  比如插入 1 2 3 开始的时候，head是NULL，tail是NULL  插入第一个节点，首先生成节点p，然后给节点赋值 p->data=1, p->next=NULL 此时因为head是NULL，进入if(head==NULL)分支，执行head=p，此时head->data=1, head->next=NULL，也就是head指向了第一个节点1 接着因为p此时是最后一个节点（当前链表只有1个节点，p既是第一个节点，也是最后一个节点），所以要修改tail指向p，即执行tail=p, 此时tail->data=1, tail->next=NULL，也就是tail也指向了第一个节点1 到此，插入第一个节点结束，此时head指向了节点1，tail也指向了节点1，显然符合插入第一个节点的要求  插入第二个节点，首先生成节点p，然后给节点赋值 p->data=2, p->next=NULL 此时因为head不是NULL（而是指向节点1了），所以进入if(head==NULL)的else分支，执行tail->next=p, 也就是让tail的next指向新节点p，相当于把新节点连接在tail的后面，此时tail->data=1, tail->next=p(p->data=2, p->next=NULL) 此时可以发现p变成了最后一个节点（因为p连接在tail的后面），所以要修改tail指向最后一个节点（因为tail才应该是链表的最后），即执行tail=p, 此时tail->data=2, tail->next=NULL，也就是tail指向了新节点2 到此，插入第二个节点结束，此时head保持指向节点1不变，tail变成了指向节点2，显然符合head指向头一个节点1，tail指向最尾节点2的要求  插入第三个节点，首先生成节点p，然后给节点赋值 p->data=3, p->next=NULL 然后和插入第二个节点一样，先让tail->next=p，也就是新节点连接在tail的后面，然后再修改tail指向最后一个节点，即tail=p, 此时tail->data=3, tail->next=NULL，也就是tail指向了新节点3 到此，插入第三个节点结束，此时此时head保持指向节点1不变，tail变成了指向节点2，显然符合head指向头一个节点1，tail指向最尾节点3的要求

引用 1 楼 chxchxkkk的回复:结点我的理解是一块内存区域，它包含两部分：一是数据域，存放的是数据，二是指针域，存放的是指针，指向下一结点的地址。 增加结点，首先申请一块新的内存区域，大小是链表结构体大小。然后原链表的尾指向这块新申请的内存区域（以尾添加为例），最后将这块内存区域的指针域指向NULL,就完成了新增加结点的操作。 我对指针对指向好乱，能讲讲？

引用 2 楼 user-3的回复:新增节点有两种方法，一种是把新增的节点插入到链表的结尾，一种是把新增的节点插入到链表的开头 插入到链接结尾的方法(也就是你贴图的代码和流程图，这里给你用文字解释一下) 1 申请一个新节点的内存p，并给新节点的字段赋值 2 如果链表的头节点为空，说明p是第一个插入的节点，所以head=p（最头的节点） 3 如果链表的头节点不为空，所以p不是第一个插入的节点，所以p应该插入tail的next，即tail->next=p 4 插入p之后，p就是最后一个节点了，所以要修改tail指向p，即tail=p  也就是如果数据 1 2 3 插入链表，数据的顺序还是保持 1 2 3 （即头节点是1，尾节点是3）  插入到链表开头的方法（其实和上面差不多，只是插入点相反而已） 1 申请一个新节点的内存p，并给新节点的字段赋值 2 如果链表的尾节点为空，说明p是第一个插入的节点，所以tail=p（最尾的节点） 3 如果链表的尾节点不为空，所以p不是第一个插入的节点，所以p应该插入head的前面，即p->next=head; 4 插入p之后，p就是最前一个节点了，所以要修改head指向p，即head=p  也就是如果数据 1 2 3 插入链表，数据的顺序还是保持 3 2 1（即头节点是3，尾节点是1） 我被那些什么 head=p，还有p-＞next=head搞混了， p-＞next=head什么意思，是p里面next的地址改变了？那p的地址和p里面的数据改变？


Question: for循环套if语句

看你的if语句是什么了，如果是break;就会跳出循环

if语句在for循环里面，for的循环变量自增跟if条件是否满足没有关系的。


Question: 【求助！】GPS模块里面的代码解释

就把文本的数字字面转换为计算机存储的整数类型，就好比把"255"转换成内存中的0xFF，不过鲁棒性差了点，输入的文本带非数字字符就死得难看了~


Question: C语言 关于文件读取的问题

引用 2 楼 user-2 的回复:你读取文件是以二进制读取的，所以写文件也要用二进制，你现在用的是文本文件（字符串）的方式写文件的，所以读取肯定不对 改成（这里不知道你的flightnode结构体是怎么的，你照着改吧） void save_flight(flightnode* h) { FILE* fp = fopen("flightList1.in", "w");//以只写('wb')的方式打开名为'flightList.dat'的文件 if (fp == NULL) return; //追加你的测试数据 flightnode node; //定义一个结构体变量，然后给结构体变量的每个字段赋值， strcpy(node.id, "01"); //因为不知道你的结构体是什么样的，这里假设每个字段是字符数组（字符串），所以用字符串拷贝的方式赋值 strcpy(node.from, "北京"); strcpy(node.to, "上海"); strcpy(node.start, "6:00"); strcpy(node.end, "8:00"); strcpy(node.xxx, "500"); strcpy(node.yyy, "20"); strcpy(node.zzz, "0"); fwrite(&node, sizeof(flightnode), 1, fp); //写入文件 //第二条数据 strcpy(node.id, "02"); strcpy(node.from, "上海"); strcpy(node.to, "北京"); //后面的信息一样，所以后面就不用重新赋值数据了 fwrite(&node, sizeof(flightnode), 1, fp); //写入文件  flightnode* temp = h->next;  while (temp != NULL) { fwrite(temp, sizeof(flightnode), 1, fp);//向其中写入temp（temp是指针）地址的l个flightnode类型的数据 temp = temp->next; } fclose(fp);//关闭fp指向的文件 }十分感谢

测试数据不用在程序中做，可以提前写好，在程序中读取就好了


Question: 求助帖

如果是存c的话，用fopen打开文件，fread或者fputs读取内容，然后进行计算，实现一个计算个数这里可能稍微麻烦一点


Question: c语言小问题

引用 5 楼 墨咚 的回复:[quote=引用 4 楼 Rage Your Dream.DS 的回复:] main() //这里貌似应该是 int main() { int a,b;FILE *out ; out = fopen("C:\\KSWJJ\\2454999999010001\\out.dat","w") ; if(fun(111,&a,&b)) { printf("111=%d*%d\n",a,b); fprintf(out, "111=%d*%d\n",a,b); }  main 函数是题自己有的  应该没啥错误 如果是我  int fun 下面野指针得问题 应该怎么改正呢？[/quote]   /*k、k2定义为静态局部变量*/ #include<stdio.h> #include<math.h> int prime(int m) { int k,flag=1; for(k=2;k<(int)sqrt((double)m);k++) if(m%k==0) flag=0; return flag; } int fun(int n,int *x,int *y) { 	static int k,flag=0; 	static int k2;      k=2; do{ k2=n/k; if(k*k2==n) if(prime(k) && prime(k2) && k<k2) {     flag=1; *x=k; *y=k2; break; }    k+=1; } while(k<k2);      return flag; } main() { int a,b;FILE *out ; out = fopen("C:\\KSWJJ\\2454999999010001\\out.dat","w") ; if(fun(111,&a,&b)) { printf("111=%d*%d\n",a,b); fprintf(out, "111=%d*%d\n",a,b); } if(fun(11111,&a,&b)) { printf("11111=%d*%d\n",a,b); fprintf(out, "11111=%d*%d\n",a,b); } if(fun(1111111,&a,&b)) { printf("1111111=%d*%d\n",a,b); fprintf(out,"1111111=%d*%d\n",a,b); }    fclose(out);    getchar();  }  我建议用静态局部变量，因为定义k、k2时加上 static 就是告知编译器，将变量存储在程序的静态存储区而非栈上空间，这样就可以解决该函数结束后，该变量的存储空间还没释放的问题。  我觉得如果你这是小程序，也可以尝试使用全局变量，但是如果大项目，就不太推荐使用k、k2为全局变量了。因为定义一个全局变量有许多缺点，最明显的缺点是破坏了此变量的访问范围（使得在此函数中定义的变量，不仅仅只受此函数控制）。  我觉得就别传指针了...传两个引用过去，然后在fun函数里对对这两个引用进行赋值，这样就可以把主函数里被引用的变量的值改变了。

引用 1 楼 user-3 的回复:在什么地方assert了？表示那里非法访问了 编译后是正确输出 但是会弹出   debug assertion failed   成绩也是0分

引用 2 楼 chxchxkkk 的回复:a和b初始化一下试试看 main函数内容是题自带的 我只编 int fun内容

引用 4 楼 Rage Your Dream.DS 的回复:main() //这里貌似应该是 int main() { int a,b;FILE *out ; out = fopen("C:\\KSWJJ\\2454999999010001\\out.dat","w") ; if(fun(111,&a,&b)) { printf("111=%d*%d\n",a,b); fprintf(out, "111=%d*%d\n",a,b); }  main 函数是题自己有的  应该没啥错误 如果是我  int fun 下面野指针得问题 应该怎么改正呢？

int fun(int n,int *x,int *y) { int k,flag=0; int k2;      k=2; do{ k2=n/k; if(k*k2==n) if(prime(k) && prime(k2) && k<k2) {     flag=1; *x=k; //这里貌似使用了野指针，不能让指针指向一个局部变量，因为当函数调用结束后会撤销该局部变量的内存空间，然后你又有可能在该函数外使用该指针所指向的变量，这是不行的。 *y=k2; //这里也是 break; }    k+=1; } while(k<k2);      return flag; }

a和b初始化一下试试看

在什么地方assert了？表示那里非法访问了


Question: openssl speed命令中添加sm3

感谢回复，你说的没错，openssl是最近支持国密的，但还不完善，目前master分支还不支持openssl speed sm3

版本是不是低了，貌似从1.1.1开始才支持的国密


Question: c语言小问题

引用 1 楼 user-1 的回复:除之前转换成double，不是除之后，改成这样  return (double)（sum)/ji;感谢大佬！


Question: C语言小问题

非常感谢！ 我懂了！

for(j=1;j<=x[i].t;j++)   m*=x[i].a;     这个循环是求t个数相乘 得到m是a的t次方 如果m不重置一下 下一个数就是从m(上一次得到)开始自乘了


Question: 函数参数传递为什么进行了两次

1楼正确。因为main函数中的值并没有发生改变

引用 1 楼 user-2的回复:什么进行了2次？没明白你想问的   你的程序输入了24  2 在gcd函数中将2个参数换了一下  输出了2 24  但是因为你是值传递，所以实参不会改变，main函数中又输出了24 2了， 有啥问题吗 是我把自己绕进去了，忽略了printf

好的，受教了


Question: 使用栈或者队列实现一元多项式的加法和乘法

大佬们，帮帮忙，多谢了

谢谢老师，但是我想要的是栈或者队列来实现

仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node {     float coef;   //系数     int expn;     //指数     struct node *next; } PolyNode;      //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式     PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点     head->next = NULL;     float coef;     int expn;     printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n");     while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列         if (head->next) {             p = head;             while (p->next && expn < p->next->expn)                 p = p->next;             if (p->next) {                 if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式                     p->next->coef += coef;                     if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点                         q = p->next;                         p->next = q->next;                         free(q);                     }                 } else {                     q = (PolyNode*)malloc(sizeof(PolyNode));                     q->coef = coef;                     q->expn = expn;                     q->next = p->next;                     p->next = q;                 }             } else {                 p->next = (PolyNode*)malloc(sizeof(PolyNode));                 p = p->next;                 p->coef = coef;                 p->expn = expn;                 p->next = NULL;             }         } else {             head->next = (PolyNode*)malloc(sizeof(PolyNode));             head->next->coef = coef;             head->next->expn = expn;             head->next->next = NULL;         }     }     return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn     PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));     p = Poly;     q = poly->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = (q->coef*coef);         p->expn = (q->expn + expn);         q = q->next;     }     p->next = NULL;     return Poly; } void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上     PolyNode *p, *q, *r;     r = poly1;     p = poly1->next;  //指向第一个节点     q = poly2->next;     poly2->next = NULL;     while (p && q) {         if (p->expn > q->expn) {             r->next = p;             p = p->next;             r = r->next;         } else if (p->expn < q->expn) {             r->next = q;             q = q->next;             r = r->next;         } else {             PolyNode *t;             p->coef += q->coef;             if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0             {                 r->next = p;                 r = r->next;                 p = p->next;             } else {                 t = p;                 p = p->next;                 free(t);             }             t = q;             q = q->next;             free(t);         }     }     if (p)         r->next = p;     if (q)         r->next = q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式     //把poly2的系数取相反数，形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点     PolyNode *p, *q;     p = poly;     q = poly2->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = -(q->coef);  //系数取反         p->expn = q->expn;         q = q->next;     }     p->next = NULL;     add(poly, poly1);  //利用加法     return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点     poly->next = NULL;     PolyNode *p, *q, *r;     r = poly;     p = poly1->next;     q = poly2->next;     while (p&&q) {         if (p->expn > q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = p->coef;             r->expn = p->expn;             p = p->next;         } else if (p->expn < q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = q->coef;             r->expn = q->expn;             q = q->next;         } else {             float m = p->coef + q->coef;             if (!(m > -0.000001 && m < 0.000001)) {                 r->next = (PolyNode*)malloc(sizeof(PolyNode));                 r = r->next;                 r->coef = m;                 r->expn = p->expn;             }             q = q->next;             p = p->next;         }     }     while (p) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = p->coef;         r->expn = p->expn;         p = p->next;     }     while (q) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = q->coef;         r->expn = q->expn;         q = q->next;     }     r->next = NULL;     return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点     poly->next = NULL;     PolyNode *p;     p = poly2->next;     while (p) {         add(poly, multiply(poly1, p->coef, p->expn));         p = p->next;     }     return poly; } void printPoly(Polynomial poly) {  //打印多项式     if (poly && poly->next) {         PolyNode *p = poly->next;  //p指向第一个节点         while (p->next) {             printf("%gx^%d", p->coef, p->expn);             p = p->next;             if (p && (p->coef > 0))                 printf("+");         }         if (p->expn == 0)             printf("%g", p->coef);   //打印常数项         else             printf("%gx^%d", p->coef, p->expn);         printf("\n");     } } void freePoly(Polynomial poly) {  //释放内存     if (poly && poly->next) {         PolyNode *p, *q;         p = poly;         while (p) {             q = p->next;             free(p);             p = q;         }     }     poly = NULL; } int main() {     printf("用链表实现多项式的加减法\n");     Polynomial poly1, poly2, poly3;     printf("创建多项式一\n");     poly1 = createPolynomial();     printf("多项式一：\n");     printPoly(poly1);     printf("创建多项式二\n");     poly2 = createPolynomial();     printf("多项式二：\n");     printPoly(poly2);     printf("两多项式相加，和为：\n");     poly3 = polyAdd(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两个多项式相乘，积为：\n");     poly3 = polyMultiply(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两多项式相减，差为：\n");     poly3 = polySubtract(poly1, poly2);     printPoly(poly3);     freePoly(poly1);     freePoly(poly2);     freePoly(poly3);     system("pause");     return 0; }


Question: 栈的题

f就是把一个整数按照从低位（个位开始）到高位放入栈中，然后再按照正常值输出来，

说错了，是顺序输出 所以结果是 3401

（1）函数功能就是把整数参数的各个位的数字倒序输出 （2）结果是1043


Question: VSCODE运行问题：第一次运行可以运行，第二次报错。

这个是蔬菜种类信息.csv的基本内容  这个是蔬菜基本信息.csv中的基本内容

#include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN1 sizeof(struct veg1) //令LEN代表struct  student类型数据的长度  typedef struct information1 //蔬菜基本信息 { 	int num1;			 //排序编号 	int num2;			 //分类码 	char nutrition[100]; //营养成分 	char name[20];		 //蔬菜名字 } information1;  typedef struct information2 //蔬菜种植信息 { 	int num;	   //分类编号 	int area;	   //蔬菜种植面积 	int weight;	   //蔬菜收获重量 	int year;	   //收获年份 	char name[20]; //蔬菜名字 } information2;  typedef struct veg1 //下属大类kind的蔬菜类型 { 	int flag;				  //用于标记该单元是否已经进行访问 	struct information1 info; //结构体蔬菜的数据域 	struct veg1 *next; } veg1;  typedef struct veg2 //用于蔬菜种植信息表的结构体 { 	struct information2 plant_info; //结构体蔬菜的数据域 	struct veg2 *next; } veg2;  typedef struct kind { 	int num; 	char kind_name[20]; //类型名称 	struct kind *right; //并列大类 	struct veg1 *down;	//下属子类 } kind;  kind *creat_trunk();			 //创造大类主链 veg1 *sorting_line(FILE *);		 //添加一个排序主链，用于对蔬菜基本信息表中的蔬菜进行排序和导入大类主链 void insert_veg(kind *, FILE *); //往主链添加蔬菜 void save(veg1 *, FILE *); char *split(char *, char *);  //主链的添加 kind *creat_trunk() { 	int i; 	struct kind *head; 	struct kind *p1, *p2; 	head = (struct kind *)malloc(sizeof(kind)); //表头空节点，可以不赋值，或者赋值一个用不到的值 	p2 = head; 	for (i = 1; i < 6; i++) 	{ 		p1 = (struct kind *)malloc(sizeof(kind)); 		p1->num = i; 		p1->right = NULL; 		p1->down = NULL; 		if (i == 1) 			strcpy(p1->kind_name, "根茎类"); 		else if (i == 2) 			strcpy(p1->kind_name, "果菜类"); 		else if (i == 3) 			strcpy(p1->kind_name, "瓜类"); 		else if (i == 4) 			strcpy(p1->kind_name, "叶菜类"); 		else if (i == 5) 			strcpy(p1->kind_name, "菌类"); 		p2->right = p1; 		p2 = p1; 	} 	p2->right = NULL; 	return (head); //返回头指针 }  //植物的插入 void insert_veg(kind *head, FILE *fp) //creat函数 ：返回值是一个指向student结构体的指针 { 	kind *p; 	int i; 	char buffer[40]; 	char *token, *str; //str是从buffer中取出的整行数据，token用来暂存信息; 	char delim[2] = ","; 	veg1 *p1, *p2[6]; //p1用于创造新结点，p2用于记录每个大类遍历到的当前节点; 	p = head->right; 	for (i = 1; i < 6; i++) 	{ 		p2[i] = (struct veg1 *)malloc(LEN1); //每一列都有一个表头空节点; 		p2[i]->next = NULL; 		p->down = p2[i]; 		p = p->right; 	} 	fseek(fp, 69L, SEEK_CUR); //从表格的第二行开始进行读入 	while ((str = fgets(buffer, sizeof(buffer), fp)) != NULL) 	{ 		p = head->right; 		token = split(str, delim); //第一格不取 		for (i = 1; i < 6; i++) 		{ 			token = split(NULL, delim); 			if (token[0] != '\0') 			{ 				p1 = (struct veg1 *)malloc(LEN1); 				strcpy(p1->info.name, token); 				p1->flag = 0; 				p1->next = NULL; 				p2[i]->next = p1; 				p2[i] = p1; 			} 		} 		p = p->right; 	} }  //字符串分割函数类似于strtok，注意若有n个分割符即n+1个数据，此函数将可以有n+2个输出，最后一个输出为NULL char *split(char *strToken, char *strDelimit) { 	char *p; 	char *pd; 	static char *ps; 	if (strToken != NULL) 	{ 		ps = strToken; 		while ((*ps != '\0') && (*ps != '\n')) 		{ 			ps++; 		} 		*ps = 'X'; //X为标识符，帮助循环结束 		ps++; 		*ps = '\0'; 		ps = strToken; 	} 	p = ps; 	while (*ps != '\0') 	{ 		pd = strDelimit; 		while ((*pd != '\0') && (*pd != *ps)) 			pd++; 		if (*pd == *ps) 		{ 			*ps = '\0'; 			ps++; 			return p; 		} 		else 			ps++; 	} 	if (*(ps - 1) == 'X') 	{ 		*(ps - 1) = '\0'; 		return p; 	} 	return NULL; }  //添加一个排序主链，用于对蔬菜基本信息表中的蔬菜进行排序和导入大类主链 veg1 *sorting_line(FILE *fp) { 	veg1 *head, *cur, *p; 	char buffer[500]; 	char *token, *str; //str是从buffer中取出的整行数据，token用来暂存信息; 	char delim[2] = ","; 	head = (struct veg1 *)malloc(LEN1); //表头空节点; 	cur = head; 	fseek(fp, 35L, SEEK_CUR); //从表格的第二行开始进行读入 	while ((str = fgets(buffer, sizeof(buffer), fp)) != NULL) 	{ 		p = (struct veg1 *)malloc(LEN1); 		token = split(str, delim); //导入总排序号 		p->info.num1 = atoi(token); 		printf("%d ", p->info.num1); 		token = split(NULL, delim); //导入蔬菜名称 		strcpy(p->info.name, token); 		printf("%s ", p->info.name); 		token = split(NULL, delim); //导入蔬菜分类码 		p->info.num2 = atoi(token); //字符串转整型函数atoi 		printf("%d\n", p->info.num2); 		token = split(NULL, delim); //导入营养成分 		strcpy(p->info.nutrition, token); 		cur->next = p; 		cur = p; 		p->next = NULL; 	} 	return head; }  int main() { 	int i; 	kind *head1, *p1; //head1为主链类型头指针,p1用于操作主链 	veg1 *L_head1[5]; //L_head1为主链下属分链头指针 	veg1 *pp[5];	  //pp用于操作主链下属分链 	veg1 *sort_head;  //排序链表表头指针 	veg1 *tp;		  //tp为测试指针 	FILE *fp;  	//创建主链 	head1 = creat_trunk(); 	fp = fopen("C:\\Users\\40375\\Desktop\\课程设计\\任务一数据\\csv\\蔬菜种类信息表.csv", "r+"); 	if (fp == NULL) 	{ 		printf("fail to open the file!!!\n"); 		fclose(fp); 		return 0; 	} 	insert_veg(head1, fp); 	p1 = head1->right->right->right->right->right; 	L_head1[0] = p1->down->next; 	while (L_head1[0] != NULL) 	{ 		printf("%s\n", L_head1[0]->info.name); 		L_head1[0] = L_head1[0]->next; 	} 	fclose(fp);  	//初始化五个表头指针 	p1 = head1->right; 	for (i = 0; i < 5; i++) 	{ 		L_head1[i] = p1->down; 		pp[i] = L_head1[i]->next; 		p1 = p1->right; 	} 	//创造排序链 	fp = fopen("C:\\Users\\40375\\Desktop\\蔬菜基本信息表.csv", "r"); 	if (fp == NULL) 	{ 		printf("fail to open the file!!!\n"); 		fclose(fp); 		return 0; 	} 	printf("文件打开成功\n"); 	sort_head = sorting_line(fp); 	tp = sort_head->next; 	fclose(fp); 	return 0; }

数组越界了，下标为-1了

你的代码呢？贴图内容如何能定位问题？


Question: 输入字符串和输入字符之间分隔符

我懂了。。。。。

getchar()的作用是从输入读取一个字符，如果你用一个变量比如下面的ch来接收的话，那么ch的值就是你从键盘输入的那个字符串。  如果你没有用变量来接收，比如就直接getchar()，那么依然会读取输入的一个字符，只不过没有变量来接收这个值。  用在这里的作用是这样，首先你scanf("%s",str),给str这个字符数组进行了赋值，然后一般而言，你需要敲一个回车来结束赋值，下一步你想要给ch进行赋值，如果中间没有一个getchar()的话，那么ch的值就变成'\n'，也就是回车，而不是你输入的下一个值。


Question: 解下

char * func(char **strArry, int num_of_str) { 	if (!strArry) 		return 0; 	char* ret = strArry; 	while (num_of_str) { 		strArry++; 		num_of_str--; 		if (strlen(*strArry) >= str(ret)) 			ret = *strArry; 	} 	return ret; }

题目大致叙述清楚了，但是实在没有兴趣编写这个程序了。


Question: 高分求解答：C API  mysql 事务失败 多条语句执行

引用 3 楼 zlxi 的回复:是不是使用了 DDL 语句。 TRUNCATE DROP等等语句   是DDL语句导致的回滚失败！！刚解决了！

是不是使用了 DDL 语句。 TRUNCATE DROP等等语句

引用 1 楼 春天到了冬天还远吗 的回复:有没有事务相关的接口？   事务相关接口？是什么意思!!   单线程连接，串行的。其他地方没有提交，回滚。

有没有事务相关的接口？


Question: sizeof 运行出错

DEV C上运行程序没有问题。 输出： 8 4

源文件所在的路径不要有中文 空格之类的  好不好？？

你的环境没配置好吧，failed to execute..... 应该还没有编译成功。

引用 2 楼 棉猴 的回复:跟编译器有关，VS2015 C++环境不会报错，得到的值是4。 因为在VS2015中，p的值是0xcccccccc，是一个可以“用”的内存地址。 我也感觉是编译器的锅。。 p又没有进行访问，按理说应该啥值都不影响sizeof啊

不管p是什么？NULL 也好 0xcccc..也好 sizeof(p) 永远返回本机指针长度。

没有编译成功吧？

同学遇到的问题，在我这是好的，感觉有点迷。。。


Question: Xilinx的Vitis的hello world，输出的空白的方格，而不是字符串

哥们儿：你解决了吗？我遇到和你一模一样的问题。


Question: C语言输入文档内的数据如何添加注释

引用 4 楼 zhendeguofenle 的回复:[quote=引用 2 楼 a1007885391 的回复:] 一行一行读取 判断每一行是否注释（看你自己怎么约定注释的标记） 读到注释则不要该行的数据 呃，具体要怎么操作，我只是一个小白，什么都不懂，我是这样读取的 fscanf(p, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &Ta0, &b, &V, &r1, &l1, &Cpd1, &dend1, &kd1, &Cpd2, &dend2, &kd2);[/quote] 你读取文件的时候把注释读取了，但是你处理的方式错了 最简单的验证方法  char buf[100] = {0}; fscanf(p, "%s%lf",buf,&Ta0);//在这打个断点，你会看到buf中是注释 /*空气温度（K）*/

引用 2 楼 a1007885391 的回复:一行一行读取 判断每一行是否注释（看你自己怎么约定注释的标记） 读到注释则不要该行的数据 呃，具体要怎么操作，我只是一个小白，什么都不懂，我是这样读取的 fscanf(p, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &Ta0, &b, &V, &r1, &l1, &Cpd1, &dend1, &kd1, &Cpd2, &dend2, &kd2);

引用 1 楼 user-2 的回复:读到注释的行，就略过就好 呃，具体要怎么操作，我只是一个小白，什么都不懂，我是这样读取的 fscanf(p, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &Ta0, &b, &V, &r1, &l1, &Cpd1, &dend1, &kd1, &Cpd2, &dend2, &kd2);

读到注释的行，就略过就好


Question: 求助C语言数组实训题

引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 ?Victor.?? 的回复:] #include<stdio.h> #include<stdlib.h> #include<time.h>  int main() { 	int a[100] = {0}, b[10] = {0,0,0,0,0,0,0,0,0,0}; 	int i; 	srand(time(0)); 	for(i = 0; i < 100; i++) 	{ 		a[i] = rand() % 10; 		b[a[i]]++; 	} 	for(i = 0; i < 10; i++) 		printf("%d个数是:%d\n",i,b[i]); 	return 0; }  供参考  a可以那样初始化，为什么b要用那么多0呢，完全不用这么初始化～  #include<stdio.h> #include<stdlib.h> #include<time.h>  int main() {     //int a[100] = {0}, b[10] = {0,0,0,0,0,0,0,0,0,0};     int a[100] = {0}, b[10] = {0};     int i;     //srand(time(0));     srand(time(NULL));     for(i = 0; i < 100; i++)     {         a[i] = rand() % 10;         b[a[i]]++;     }     for(i = 0; i < 10; i++)         printf("%d个数是:%d\n",i,b[i]);     return 0; }  供参考～[/quote]  懂了，是我记混了  谢谢大佬~

引用 1 楼 ?Victor.?? 的回复:#include<stdio.h> #include<stdlib.h> #include<time.h>  int main() { 	int a[100] = {0}, b[10] = {0,0,0,0,0,0,0,0,0,0}; 	int i; 	srand(time(0)); 	for(i = 0; i < 100; i++) 	{ 		a[i] = rand() % 10; 		b[a[i]]++; 	} 	for(i = 0; i < 10; i++) 		printf("%d个数是:%d\n",i,b[i]); 	return 0; }  供参考  a可以那样初始化，为什么b要用那么多0呢，完全不用这么初始化～  #include<stdio.h> #include<stdlib.h> #include<time.h>  int main() {     //int a[100] = {0}, b[10] = {0,0,0,0,0,0,0,0,0,0};     int a[100] = {0}, b[10] = {0};     int i;     //srand(time(0));     srand(time(NULL));     for(i = 0; i < 100; i++)     {         a[i] = rand() % 10;         b[a[i]]++;     }     for(i = 0; i < 10; i++)         printf("%d个数是:%d\n",i,b[i]);     return 0; }  供参考～


Question: 求助C语言数组实训题

引用 2 楼 chxchxkkk 的回复: #include <stdio.h> #include <stdlib.h> #include <time.h>  int main() {     int i, sum = 0;     int a[100] = {0};     srand((unsigned)time(NULL));      for (i = 0; i < 100; i++)     {         a[i] = rand()%100+1;         sum += a[i]     }      printf("和： %d, 平均值： %.2f\n", sum, sum * 1.0 / 100);     return 0; }  少了个}

为啥发了两个  主要是看看随机数发生函数就好写了


Question: C语言

嵌套调用虾米意思

计数一下，应该一个循环就可以

int num = 0;//素数的数量 for（int i=0；i<200;i++） { if（//是素数） { num++； } if（num == 40） { //输出i的平方根 } } 这样？


Question: c语言请教大佬

引用 1 楼 user-1的回复:出什么错误了？ 9	6	D:\使用文件\Dvp-Cpp\学校实验作业\文件1.c	[Warning] assignment makes pointer from integer without a cast

出什么错误了？

引用 3 楼 user-1的回复:if((fp=fopen("data.txt","w+"))==NULL) 几个括号吧 多谢指导，得到解决了


Question: c语言里关于define和自增自减运算符的问题

因为SQ(i++)等于 （i++） * (i++)

引用 2 楼 qybao 的回复:你的宏定义属于未定义行为 相当于 while (i<=5) { printf("%d\n", (i++)*(i++)); //宏定义只是展开你的表达式，编译器不一样，结果会不一样，结果是不可知的 }  而函数就不一样了 sq(j++) 相当于 sq(j), j++; 这样的逗号表达式，结果是可知的(i++)*(i++)这里是先进行了乘法运算再进行了自增运算？


Question: 求助

就是字符串截取而已，文件读取就不多说了，不知道怎么读取文件就百度吧 这里只提一下字符串截取，用内存拷贝就可以  char *s = "310110200609093420"; //从文件读取的身份证号 char b[9] = {0}; memcpy(b, s+6, 8);  printf("%s\n", b);

身份证中的生日是固定的，直接去取就可以了


Question: 大佬们帮我看看codeblocks这个编译器的问题

没人知道吗

引用 2 楼 user-1 的回复：每个项目里都有这两个，vs也一样，你可以只选一个，但不能一个都不选。debug是高度，release是发布版，具体百度吧可是我两个都能选啊


Question: 请问vc 如何取出当前正在使用的ip地址?!

引用 5 楼 smwhotjay 的回复:ipconfig -all  这个还要做很多判断吧

ipconfig -all

引用 2 楼 user-2 的回复:[quote=引用 1 楼 user-2 的回复:] 你用的什么api？ 要用 GetAdaptersInfo[/quote]  怎么遍历的时候怎么判断192.168.99.99 这个网卡和取出这个ip阿.

引用 1 楼 user-2 的回复:你用的什么api？  GetAdaptersInfo 能遍历所有网卡,但是也不知道哪张是 192.168.99.99 .. 如果用gethostname() 然后gethostbyname() ,那取出来就是192.168.97.99

引用 1 楼 user-2 的回复:你用的什么api？ 要用 GetAdaptersInfo

你用的什么api？


Question: 那个大佬求解

if与else只会执行一个，怎么会执行到n--

引用 4 楼 m0_48015336的回复:[quote=引用 3 楼 qq_31032311的回复:]咱来个事实说话，答案错了。 哈哈，谢谢，那答案错了，不好意思[/quote] 但是我不知道为什么，不是还有个n--吗

引用 3 楼 qq_31032311的回复:咱来个事实说话，答案错了。 哈哈，谢谢，那答案错了，不好意思

咱来个事实说话，答案错了。

首先谢谢你，但是答案为9

这不就是选 b吗，n++直接就为10了


Question: C语言如何从源函数中获取指向它的函数指针的地址

引用 8 楼 千梦一生 的回复:迭代器用的太少，不是很懂。  ebp前面也是调用函数那行代码的下一行代码。 然后还要通过指针往上找上一行的call xxxxxx，看看[xxxxxxx]是个啥。  单纯C语言除非传参，否则暂时还没有什么比较好的想法 然后还要通过指针往上找上一行的call [xxxxxx]，看看xxxxxxx是个啥。

老铁们？？？？

假如说现在用C语言实现迭代器，begin不能传参，是不是和这个问题差不多。

引用 1 楼 千梦一生的回复:好像在ebp前面 我今天想了一下，这个思路确实是个思路

因为这种普通的调用，你想返回具体哪个结构体的数据。不同结构体存在不同的位置。 C语言也没有thiscal，帮助你告诉函数【底层创建传入this指针】是在操作哪个结构的数据。 ----------------------------- 直观点就是： 你的t1 被存在内存：10001~10002 你的t2 被存在内存：20001~20002  而函数有且仅有一个了。想公用 想要返回 i值。那函数也就纳闷儿了：你是想要10000那块儿的那个i呢，还是20000那块儿的那个i呢？

引用 1 楼 千梦一生 的回复:好像在ebp前面 不对，不是这个。 没办法。不知道咋搞。 除非，这个源函数属于test。则能研究研究使用多态、继承什么的  否则只有直接或者间接地把指针传过去

似乎做不到，可以在fn_t，中加个参数test*,   typedef int(*fn_t)(test*) 或者把他定义成test的成员函数   typedef int(test::*fn_t)()

好像在ebp前面


Question: 关于用链栈模拟计算器遇到的一些问题

应该是StackInit这种方式错了，所以引用next就出问题了，你debug一下可以看看num的值


Question: 求教!!求各位大佬帮我看看这段代码,就Order_Call的最后一个形参好像引用错误了,不知道该怎么改(这个是模拟炉石传说的实践代码)

Role R[] 要改成 struct Role R[]，如果用C++编译的话就不用改Order_Remove要移到Order_Attack的前面，否则需要加提前声明void main最好改成int main，虽然C仍然支持void main，但也不是标准形式

毕业了还是表示感谢

就这？

/*****以下是调试*****/ 1>------ 已启动生成: 项目: LuShi, 配置: Debug Win32 ------ 1>  LuShi.c 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C2146: 语法错误: 缺少“)”(在标识符“R”的前面) 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C2081: “Role”: 形参表中的名称非法 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C2061: 语法错误: 标识符“R” 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C2059: 语法错误:“;” 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C3409: 不允许空特性块 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C2059: 语法错误:“)” 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(25): error C2059: 语法错误:“{” 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(61): warning C4013: “Order_Remove”未定义；假设外部返回 int 1>c:\users\administrator\documents\visual studio 2012\projects\lushi\lushi\lushi.c(171): warning C4013: “exit”未定义；假设外部返回 int ========== 生成: 成功 0 个，失败 1 个，最新 0 个，跳过 0 个 ==========


Question: 求大神帮忙看下代码哪里出错，感激不尽

#include<stdio.h>   float average(float sum[10], int len);  //void main() int main() {     float score[10],result;     int i;      printf("请输入10个数:\n");      for (i = 0; i < 10; i++)         //scanf("%d",&score[i]);         scanf("%f",&score[i]);      result=average(score, 10);      printf("average=%f",result);      return 0; } float average(float sum[10], int len) {      float resule=0;     int i;      //for(i=0;i<10;i++)     for(i=0;i<len;i++)     {         //resule+=sum[10];         resule += sum[i];      }     resule/=len;      return resule; } 供参考～  对于数组还是需要好好学学～

引用 2 楼 风吹花中花吹风的回复:#include <stdio.h>    float average(float sum[10]);  void main() {     float score[10], result;      printf("请输入10个数:\n");      for (int i = 0; i < 10; i++)     {         scanf("%f", &score[i]);     }      result = average(score);      printf("average=%f", result);    } float average(float sum[10]) {      float resule = 0;      for (int i = 0; i < 10; i++)     {         resule += sum[i];     }     resule /= 10;      return resule; }  楼主帮你改好了，不要信楼上的。 楼上的也没什么问题啊

好的多谢了。

楼主没有搞清楚scanf 的用法，如果你想输入10个值的话要用一个循环来输入，这个只会获取一个值，数组 a[]  在scanf 中不要加& 本来就是地址值，然后函数部分，resule+=sum[10];   这个不是10吧，而是i值，你每次都加的是数组的9号位，都是0.所以你输出的就是0


Question: 二叉排序树创建

void insertBST(treeNode **T,int x){     treeNode *s;     if(*T==NULL){         s=(treeNode* )malloc(sizeof(treeNode));         s->data=x;         s->left=NULL;         s->right=NULL;         *T=s;     }     else{         if(x<T->data)             insertBST(&T->left, x);         if(x>T->data)             insertBST(&T->right,x);     } }

void creatBST(treeNode *T,int n){ 	int i,x; 	T=NULL;         for(i=0;i<n;i++){ 		scanf("%d",&x); 		insertBST(T,x); 	} }

没有root吗？设计有点问题吧？


Question: C语言的字符数组的题目程序有段错误，帮忙看一下

{strcpy(a[n],b[n]);           这一句啥意思？ 你自己恐怕都运行不通过吧？为啥要提交给系统去判定？  另外，你这个用的啥系统？


Question: 数据结构邻接表的输出问题

引用 1 楼 山雨。的回复:你的问题是什么 可以麻烦你写个有向带权值的邻接表么？谢谢

你的问题是什么


Question: C语言程序求助

有个打字游戏代码，你自己参考着改成符合你要求的  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h>  //菜单 void tips() { 	printf("==================== 打 字 游 戏 ====================\n"); 	printf("==                按 任 意 键 继 续                ==\n"); 	printf("==                 按 ESC 键 退 出                 ==\n"); 	printf("=====================================================\n"); 	char ch = _getch(); 	if (ch == 27) 	{ 		exit(0); 	} }  //随机字符 void rand_ch(char *arr) { 	srand((unsigned int)time(NULL)); 	for (int i=0; i<20; i++) 	{ 		arr[i] = rand() % 26 + 'a'; 	} }  //输入字符 void print_ch(char *arr) { 	unsigned int starttime, endtime; 	int value = 0; 	for (int i=0; i<20; i++) 	{ 		char ch = _getch(); 		if (i == 0) 		{ 			starttime = time(NULL); 		} 		if ( ch == arr[i] ) 		{ 			printf("%c", ch); 			value++; 		} 		else 			printf("_"); 	} 	endtime = time(NULL); 	printf("\n用时：【%d】秒\n", endtime - starttime); 	printf("正确率：【%.1f】%%\n", value * 1.0 / 50 * 100); 	getchar(); }  int main(void) {  	//字库 	char arr[21]; 	//数组元素设置为0 	memset(arr, 0, 21);  	while ( 1 ) 	{ 		system("cls"); 		tips(); 		//显示随机字符 		rand_ch(arr); 		printf("%s\n", arr); 		//输入字符 		print_ch(arr); 	}  	return 0; }

不用计算正确率吗？

不用计算正确率


Question: 为什么运行成功了输入没结果但是用vc6.0可以成功，是我vs2019出问题了吗

scnaf_s的骚操作  在include<stdio.h>下面加上  #pragma warning(disable: 4996)  scanf_s换成scanf

显示0x790D6942 (ucrtbased.dll)处(位于 xiao.exe 中)引发的异常: 0xC0000005: 写入位置 0x009B1339 时发生访问冲突

debug一下，应该就知道了

截个图 看看 吧


Question: 求问为什么我运行起来答案总是35？

int a[k];  改成 int a[100]; //数组长度用常量 或者改成 int *a = (int*)malloc(sizeof(int)*k); //动态申请内存 ，最后记得free(a)  另外，sum没有初始化，在for循环前加一句 sum=0;

把你运行的截屏看一下

有的编译器支持那种数组定义的方式

那我应该怎么样表示输入数量？，我上次也用这样的方法，没有出现过这样的错误的呀

C语言数组长度要求是常量值， scanf("%d",&k); int a[k]; 这样是不行的

什么意思？新手不是很懂

数组长度不要用变量，或者你可以用动态申请内存


Question: 个位数的表达式求值求大佬看看代码哪错了

没报错，但就是算不出来。。。我也不知道哪错了1+(3+2)*(7^2+6*9)/(2)算这个式子的时候到倒数第二步就结果不对

是什么错误？


Question: C语言代码纠错

引用 3 楼 柚子味儿哒 的回复：[quote=引用 2 楼 qybao 的回复:] 把 strcpy(c_age, “i”); 改成 sprintf(c_age[i], “%d”, i);  注意把整形转成字符串的用法这个需要用头文件吗，我改了后报错了[/quote]#include <stdio.h>

引用 2 楼 qybao 的回复:把 strcpy(c_age, “i”); 改成 sprintf(c_age[i], “%d”, i);  注意把整形转成字符串的用法这个需要用头文件吗，我改了后报错了

调试一下应该就知道


Question: 跪求大佬帮我解决这个问题，我要哭了！！！

用数组读入字符，每次读入用循环和前面所有已有字符比较，若为新字符，则添加，同时计数变量加1，另外定义一个数组对应每个字符，循环比较时若相同则对应值加1，打印出来好办，将第一个字符数组用循环排序就可以了。  这个一个是最容易想到的，当然也可以直接用指针。

引用 1 楼 user-2 的回复： A：应该简单 B：不同的只是没有出现过重复的字符吗？ C： 这种题有个基本思路，叫定桩法（看过最强大脑应该知道，里面好像提到过），就是用256个字符数组来存储，开始每一个里面的值为0，如果出现一个就+1，到最后，谁的值大，谁就是最多的。 如果里面的值为1，表示没有出现过重复。非常感谢，太有启发了


Question: 《新手纠结向》有关二维数组 麻烦各位看看我这段代码

引用 8 楼 天翔龙闪 的回复:那应该可以运行上面我的代码，如果觉得麻烦，你就按照这种方式定义定长数组就可以了 #include<stdio.h> #define  N 100 int main() { 	int a[N][N]; 	return 0; }  谢谢兄弟 我知道问题出在哪里了 我定义数组的方法确实不对 我感觉正确的方法应该是你 那样的 现在我知道了为什么数组的题都要给我数组元素的个数限制的 我把前面的数组都修改为x[10][10]（因为题中要求最多是10行10列）后 程序就完美运行了 不会出现倒置或者减行的情况   同时谢谢围观的各位帮忙顶热度

引用 4 楼 天翔龙闪 的回复:如果你要定长的数组的话，就不要用 i j，而是用将数组设定为定长，一般做法是这样 在头文件下方宏定义define你需要的数组大小，然后写成定长的数组就可以了  #define  N 100 int a[N][N];  我还真没这么做过 一直是用scanf定义的  我们还没学宏的应用

引用 3 楼 天翔龙闪 的回复:哦哦，还有我是在vs里面帮你测试的，你用代码的时候，将scanf_s改成scanf吧，否则有可能编译不通过  好的 谢谢

引用 1 楼 天翔龙闪 的回复:楼主你是想要不定长数组吧，如果想要不定长数组，在c里面，只有在堆区malloc出来数组，  一维数组的malloc方法如下 	//在堆区初始化一维数组 	float* r = (float*)malloc(i*sizeof(float));  二维数组的malloc方法如下 	//在堆区初始化二维数组 	float** x = (float**)malloc(i * sizeof(float*));//分配行的内存 	int k; 	for (k= 0; k < i; ++k) {//分配列的内存 		x[k] = (float*)malloc(j * sizeof(float)); 	}  完整代码如下  #include<stdio.h> #include<malloc.h>//如果你的编译器不通过，则换成<stdlib.h>  int main() { 	int i, j, t, a, b; 	scanf_s("%d %d", &i, &j);  	//在堆区初始化一维数组 	float* r = (float*)malloc(i*sizeof(float));  	//在堆区初始化二维数组 	float** x = (float**)malloc(i * sizeof(float*));//分配行的内存 	int k; 	for (k= 0; k < i; ++k) {//分配列的内存 		x[k] = (float*)malloc(j * sizeof(float)); 	}  	//在堆区初始化二维数组 	float** n = (float**)malloc(i * sizeof(float*)); 	for (k= 0; k < i; ++k) { 		n[k] = (float*)malloc(j * sizeof(float)); 	}  	for (a = 0; a < i; a++) 	{ 		for (b = 0; b < j; b++) 		{ 			scanf_s("%f", &x[a][b]); 			n[a][b] = x[a][b]; 		} 	} 	for (a = 0; a < i; a++)//此处的for循环嵌套是为了挑出数组中的最大值  	{ 		t = 1; 		for (b = 0; b < j; b++) 		{  			if (t <= j - 1) 			{ 				if (x[a][0] >= x[a][t]) 				{ 					t += 1; 				} 				else 				{ 					x[a][0] = x[a][t]; 					t += 1; 				} 			} 			else 				break;  		} 		r[a] = x[a][0];//将i个最大值放入数组中r 	} 	printf("\n"); 	printf("%.2f %.2f \n", n[0][0], n[1][0]); 	printf("\n");  	//删除在堆区开辟的数组 	free(r); 	r = NULL;//置空  	//删除在堆区开辟的二维数组 	for (k = 0; k < i; k++) { 		free(x[k]); 		x[k] = NULL;  		free(n[k]); 		n[k] = NULL; 	}  	free(x); 	x = NULL;  	free(n); 	n = NULL;   	return 0; }  像这种不定长的数组，都需要在堆区做才行。并且用完之后，要手动释放其中的内存，当然，如果用c++的话，就简单多了  兄弟  谢谢你的解答 我还没学那么深 指针都还没有接触  我就是很疑惑我这个代码 为什么会平白无故出现这个问题？我的是比较基本的定长的二维数组  这个就是我写作业程序的一小段代码


Question: c语言实现实时计数

忘了说了a这个实时数的频率是60hz


Question: 大神求带！

排版看得我头晕


Question: 求助，用ShellExecute打开文件，路径是变量怎么弄？

引用 6 楼 凌刀夜心 的回复:[quote=引用 楼主 凌刀夜心 的回复:] 求助，用ShellExecute打开文件，路径是变量怎么弄？ int a=ShellExecute(NULL, TEXT("open"), sta, NULL, NULL, SW_MINIMIZE); sta是字符串补充下，我是char *sta[/quote] string的c_str函数得到的就是char*类型啊，你直接CA2W(sta)就行了

如果是变量也没关系 要么sta申请空间，通过memcpy或strcpy宝贝到sta申请的空间里。 要么就是用一个字符数组存放路径，然后sta = str;然后调用接口就可以了。

引用 楼主 凌刀夜心 的回复:求助，用ShellExecute打开文件，路径是变量怎么弄？ int a=ShellExecute(NULL, TEXT("open"), sta, NULL, NULL, SW_MINIMIZE); sta是字符串补充下，我是char *sta

引用 4 楼 a1007885391 的回复:ShellExecute(NULL, _T("open"), CA2W(strPath.c_str()), CA2W(strFile.c_str()), NULL, SW_SHOWNORMAL);//strPath与strFile是string类型    有用记得结贴他提示表达式必须包含结构或联合类型，这是c++的吗

比如打开QQ.exe ShellExecute(NULL, "open","qq.exe",NULL,NULL,SW_SHOWMAXIMIZED );

抱歉少个引号  TEXT("sta")

TEXT(sta")


Question: winSock2 TCP/IP连接问题

啥叫没有返回任何值？你这样的情况应该把运行结果截个图给看一下


Question: 数据结构，哈希表

呵呵，这个是老师布置的大作业吧？


Question: 多文件模块化出错C语言

引用 1 楼 user-1的回复:把这几个文件放到一个工程里面 ok。。。。。

把这几个文件放到一个工程里面


Question: C语言小白在线求教关于指针的练习，C语言牛逼。各位大神帮忙看看。

引用 1 楼 chxchxkkk的回复:能排一下版吗，这代码让人咋看呢 #include <stdio.h> int main(void) {    int a[6]= {1,2,3,4,5,6}; //  定义包含6个整型元素的数组a     int i=0,j=0;     int aa[3][2]= {{2,3},{4,5},{9,10}} ; // 定义一个二维数组aa，3行2列     for(  i=0; i<6; i++)         printf("a[%d]==%d, ",i,a[i]);    //下标访问法输出元素值；     putchar('\n');     for( i=0; i<6; i++)         printf("*(a+%d)==%d, ",i,*(a+i));  // 指针访问法输出元素值     putchar('\n');                       // 输出一个空行     //-------------------------------------    int *p=NULL;                   // 定义一维指针，用来方位数组a[6]和aa[3][2]    p=a;     // 用指针p，来遍历输出数组a和二维数组aa的元素值及地址值。 //-------------------------------------    int (*pp)[2]= {aa[0],aa[1],aa[2]};     // 用指针pp，来遍历输出二维数组aa的元素值及地址值。 //-------------------------------------    int **pt=NULL;     // 用指针pt，来遍历输出二维数组aa的元素值及地址值。     //-------------------------------------    int a1=100,  b=200;           const int *p1=&a1;     int * const p2=&a1;     const int * const p3=&a1;     // 上面三条语句，(1)尝试通过指针（p1,p2,p3)间接访问(*)修改a1的值为50，(2)修改指针使其指向变量b， 调试程序，看哪些操作可行，哪些不行。 }

引用 5 楼 山雨。的回复:看不下去了，看了上一版 #include <stdio.h> int main(void) {    int a[6]= {1,2,3,4,5,6}; //  定义包含6个整型元素的数组a     int i=0,j=0;     int aa[3][2]= {{2,3},{4,5},{9,10}} ; // 定义一个二维数组aa，3行2列     for(  i=0; i<6; i++)         printf("a[%d]==%d, ",i,a[i]);    //下标访问法输出元素值；     putchar('\n');     for( i=0; i<6; i++)         printf("*(a+%d)==%d, ",i,*(a+i));  // 指针访问法输出元素值     putchar('\n');                       // 输出一个空行     //-------------------------------------    int *p=NULL;                   // 定义一维指针，用来方位数组a[6]和aa[3][2]    p=a;     // 用指针p，来遍历输出数组a和二维数组aa的元素值及地址值。 //-------------------------------------    int (*pp)[2]= {aa[0],aa[1],aa[2]};     // 用指针pp，来遍历输出二维数组aa的元素值及地址值。 //-------------------------------------    int **pt=NULL;     // 用指针pt，来遍历输出二维数组aa的元素值及地址值。     //-------------------------------------    int a1=100,  b=200;           const int *p1=&a1;     int * const p2=&a1;     const int * const p3=&a1;     // 上面三条语句，(1)尝试通过指针（p1,p2,p3)间接访问(*)修改a1的值为50，(2)修改指针使其指向变量b， 调试程序，看哪些操作可行，哪些不行。 }

能排一下版吗，这代码让人咋看呢

编辑上面一行，右边第五个是添加代码

调试一下看看

看不下去了，看了上一版

已重新发布过


Question: 为什么printf函数可以不匹配？scanf却不可以？

引用 7 楼 weixin_45906870 的回复:那printf为什么没问题？[/quote] 测试了一下，以其猜测推断，不如实际代码跑一吧 解释都在注释里  int main() {     int b=17;     int a=15;     char c[4]={'0','1','2','3'};     char *p = (char*)&a;     //测试栈内存顺序     for(int i=0; i<4; i++) {//打印的是a的信息         printf("%02X", p[i]);     }     printf("\n");     for (int i=4; i>0; i--) { //打印的是c的信息         printf("%02X", *(p-i));     }     printf("\n");     for (int i=4; i<8; i++) { //打印的是b的信息         printf("%02X", p[i]);     }     printf("\n"); //说明入栈顺序是从高地址到低地址，即b在高地址，a在中间，c在低地址          p = (char*)&a;     memcpy(c, &a, 4);     printf("%08X\n", a); //直接打印a内存信息     for(int i=0; i<4; i++) { //用数组的方式打印a的内存信息，和直接打印a刚好相反         printf("%02X", c[i]);     }     printf("\n");     for(int i=0; i<4; i++) { //用指针方式打印a的内存信息，和直接打印a刚好相反         printf("%02X", p[i]);     }     printf("\n"); //说明直接打印int的内存信息，内存高低位地址会自动调整          printf("请输入字符：");     scanf("%c", &a); //以字符的方式输入，如果输入多个字符，比如65，则只能获得第一个字符的信息，即只取得‘6’，（‘5’丢失），所以这里会提示警告     printf("%08X\n", a);     for(int i=0; i<4; i++) {         printf("%02X", p[i]);     }     printf("\n");     printf("%c\n", a); //打印是因为会自动截取int的低位内存信息转成字符，所以不会出现问题     return 0; }

引用 6 楼 qybao 的回复：那是因为你把输入信息存入了int地址的高位，导致int信息读取不正确，所以会提示警报。 你的做法相当于 int i; //相当于4个char的数组 char *p=(char*)&i; scanf(“%c”, p);//相当于存入了char数组第一个元素，也就是存入了int的高位地址 scanf(“%d”, &i)相当于scanf(“%c”, p+4);//相当于存入了char数组的第四个元素，也就是存入了int的低地址 比如你输入1，如果是scanf(“%d”, &i)，则i的内存信息为0x00000001（信息存入int的低位），如果scanf(“%c”, &i)，则i的内存为0x01000000（信息存入了int高位），可见两种结果是不同的，只有用”%d”才能保证结果正确，所以你用“%c”就会警报那printf为什么没问题？

这个看编译器了clang/llvm中printf格式和参数不匹配也是有警告的

引用 2 楼 自信男孩 的回复：scanf("%d", &i);     //输入大于128小于-128就会导致i越界了。所以会提示warning. printf("x=%c\n", x);    //%c输出，相当于输出x的一个字节（一般是低字节，因为小端系统）。没问题，不会导致越界或者溢出之类的。我改了，看回复，还是这样

int main() {     int i;     char x = 'A';      scanf("%c", &i);      //由小到大     printf("x=%d\n", x);         return 0; }  我改成由小到大，scanf还是报warning啊？？？printf还是没事啊？？？

因为这里存在覆盖的可能，scanf("%d", &i);  因为是由大到小，地址被覆盖会导致内存错误，进而可能导致程序崩溃。  printf("x=%c\n", x);这里是输出，不存在内存被覆盖，只是会被截断。


Question: 纠错

还有main直接在下面写就行了，不用上面定义下面写，而且你下面的还没有返回值

你这是２２的阶乘加３２的阶乘，不是２的平方的阶乘加３的平方的阶乘 b=a*a; b=a*10+2;

#include<stdio.h>  long f2(int d) { 	long e = 1; 	int i; 	for (i = 1; i <= d; i++) 		e = e*i; 	return e;  }  long f1(int a) { 	int b; 	long c; 	b = 10 * a + 2; 	c = f2(b); 	return c; } int main() { 	int i; 	long s = 0; 	for (i = 2; i <= 3; i++) 		s = s + f1(i); 	printf("\ns=%ld\n", s); 	return 0; }  VS2015 C++环境调试

把 b=a*a; 改成 b=10*a+a;


Question: 请教sqlapi++的使用方法

是要把静态库的文件放在要建立的cpp文件的目录下吗？

加了头文件之后，为什么说不能打开#include <SQLAPI.h>这个源文件呢

把头文件路径包上，如果link错误，把lib加上

#include <SQLAPI.h>


Question: 一道c语言字符型数组的题目

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  int main() {   int i;     char a[81]/*,b[81]*/;     fgets(a, 80, stdin);      if (strlen(a) < 80)         a[strlen(a)-1] = 0;     /*     for(i=0;a[i];i++)     { {if(a[i]>='A'&&a[i]<='Z')   //大括号不匹配吧，怎么连续两个左大括号？           b[i]='A'+'Z'-a[i];           else b[i]=a[i];}      }     if(strlen(a)==0) b[i]='\0';     printf("%s",b);     */      for (i = 0; a[i]; i++)         if (isupper(a[i]))             a[i] = 'Z' - (a[i]-'A');     puts(a);       return 0; } 供参考～

char a[81],b[81]={0}; 初始化一下b应该就可以


Question: 求助C语言循环结构实训题

#include <stdio.h> #include <stdlib.h>  int main() {     float stu[100];     double ave = 0.0;     double sum = 0.0;     int i = 0;     while (1)     {         scanf("%f", &stu[i]);         if (stu[i] != -99){             sum += stu[i];             i++;             ave = sum / i;         }         else             {             printf("%f\n", ave);             return 0;         }     }     return 0; }


Question: 求助C语言循环结构实训题

for example  int main() {     int i, n=20, score, total[5]={0};     printf("请输入20个人的成绩(用空格分开)：\n");     for (i=0; i<n; i++) {         scanf("%d", &score);         score = score/10 - 5;         if (score < 0) score = 0;         else if (score > 4) score = 4;         total[score]++;     }     printf("60分以下的人数：%d\n", total[0]);     for (i=1; i<4; i++) {         printf("%d~%d分的人数：%d\n", (i+5)*10, (i+5)*10+9, total[i]);     }     printf("90分以上的人数：%d\n", total[4]);     return 0; }

引用 3 楼 ?Victor.?? 的回复:[quote=引用 2 楼 山雨。 的回复:] 结帖给1L  咋又跑这来了 [/quote]混一下技术分，发现要么有人答了，要么题目都看不下去

引用 2 楼 山雨。 的回复:结帖给1L  咋又跑这来了

结帖给1L


Question: 求求大佬帮我看看scanf函数，我很困扰！！

在另一个贴里给你回复过查看内存信息 scanf("%d", &i);       //如果用%c，只会接收一个输入字符（即使用户输入多个字符也只会接收第1个字符），所以不会造成内存越界（char的内存只能存1个字符），但是用%d就会接收多个字符，char的内存可能容不下，会造成内存越界，所以这里会警报 printf("x=%c\n", x);   //打印只是截取int的内存低位信息转成字符输出，所以没问题

char类型的只有１字节的大小，％ｄ是整型有四字节。这样会溢出，当然你要是在别的地方用可能也不会报错，就是结果可能出错，但是scanf这个函数他是要求输入与写入的类型相对应的，这是不会去转化的，所以有一点不对应函数会报错，这是这个函数的约定 而printf是输出函数，他是会把你变量转化为你前面的类型再输出的，类型可以转就不会报错。而你这个值是特殊值，６５在字符里刚好是Ａ的字符，所以可以作为字符输出

按标准来就是了，把时间耗费在这上面不值得

引用 8 楼 weixin_45906870 的回复:引用 7 楼 user-4 的回复：[quote=引用 6 楼 weixin_45906870 的回复:] [quote=引用 3 楼 user-4 的回复：][quote=引用 2 楼 weixin_45906870 的回复:] [quote=引用 1 楼 user-4 的回复：]因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关 [/quote]那我这里为啥scanf会报警告，printf却不会呢？[/quote]  和编译器或者IDE有关把  我这儿都没有warning[/quote]你用什么编译器？[/quote]  vscode

引用 7 楼 user-4 的回复：引用 6 楼 weixin_45906870 的回复:[quote=引用 3 楼 user-4 的回复：][quote=引用 2 楼 weixin_45906870 的回复:] [quote=引用 1 楼 user-4 的回复：]因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关 [/quote]那我这里为啥scanf会报警告，printf却不会呢？[/quote]  和编译器或者IDE有关把  我这儿都没有warning[/quote]你用什么编译器？

引用 6 楼 weixin_45906870 的回复:引用 3 楼 user-4 的回复：[quote=引用 2 楼 weixin_45906870 的回复:] [quote=引用 1 楼 user-4 的回复：]因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关 [/quote]那我这里为啥scanf会报警告，printf却不会呢？[/quote]  和编译器或者IDE有关把  我这儿都没有warning

引用 3 楼 user-4 的回复：引用 2 楼 weixin_45906870 的回复:[quote=引用 1 楼 user-4 的回复：]因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关 [/quote]那我这里为啥scanf会报警告，printf却不会呢？

引用 4 楼 user-4 的回复：引用 3 楼 user-4 的回复:[quote=引用 2 楼 weixin_45906870 的回复:] [quote=引用 1 楼 user-4 的回复：]因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关 [/quote]  没啥特殊的需求 乖乖的用数据类型就行了 别搞这个有的没的[/quote]我只是想弄清楚

引用 3 楼 user-4 的回复:引用 2 楼 weixin_45906870 的回复:[quote=引用 1 楼 user-4 的回复：]因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关 [/quote]  没啥特殊的需求 乖乖的用数据类型就行了 别搞这个有的没的

引用 2 楼 weixin_45906870 的回复:引用 1 楼 user-4 的回复：因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的你的意思是大的转小的会出错，小的才可以转大的？  这也不是绝对的   通常来说 char占据1个字节 范围0x0~0xff  int 4个字节 范围0x0~0xffffffff  如果int转char  很有可能造成数据丢失 比如0xff00aaaa 转成char  结果可能就剩0xff了  也有可能是0xaa 而char 转int  比如char = 0xff  转换为int  有可能是0xff000000  也有可能是0x000000ff  和CPU有关

因为有类型转换啊   程序里不同的数据类型之间是可以相互转换的


Question: 大一很简单的关于指针和数组的问题，求助

引用 2 楼 自信男孩的回复:这是一个指针数组，注意修饰词指针，被修饰是数组。因此这个变量是一个数组，成员（元素）是指针。数组长度（即指针个数）由初始化的字符串常量个数决定。因此有几个字符串，长度就是几。  指针数组对应的是数组指针，谁修饰谁，这个要注意。  数组指针; char arr[5][5]; char (*p)[5] = arr;    //p就是数组指针。 谢谢。。。。

这是一个指针数组，也就是数组的元素是个指针，数组第一个元素指向“Batteries”常量字符串，第二个元素指向“Bulbs”常量字符串，第三个元素指向“Fuese”常量字符串，


Question: 求大佬帮我看看这两段代码哪里不同？为什么算出的结果不一样？

十分感谢

#include <stdio.h> #include <math.h>  int main() {     double a=0,b=0;     int year;      for (year=1; a>=b; year++)     {         a = 10000+10000*0.1*year;         b = 10000*(pow((1+0.05), year));         if (a < b)             break;     }      printf("%d年后，黑夜的投资额超过小甲鱼！\n", year);   //28年     printf("小甲鱼的投资额是：%.2lf\n", a);     printf("黑夜的投资额是：%.2lf\n", b);      return 0; } 供参考～  因为这个里面a < b之后year++还是会自增1.


Question: C语言计算小数精度问题

引用 6 楼 zhendeguofenle 的回复:[quote=引用 5 楼 nice_cxf 的回复:] 大小差距接近千分之三，肯定不是精度问题，核对下是不是那里计算有错误？ double运算精度不可能差这么多 计算没问题，只有这一个数差这么多，其他的都很准，至少有十一位精度[/quote] 感觉不太可能，你可以加一些临时变量一步一步核对下看看哪里的问题，浮点计算应该不会有这种问题，double才3个有效位，不太应该

引用 1 楼 自信男孩 的回复:后面的计算中，是否可以考虑省略获取b的过程，比如1/3.0不用0.33333而用1/3.0呢？ 本来是没有b这个参数的，是我排错的时候自己加的输出，这个b是个除数，至于你说的不用0.3333而用1/3.0，我不就是这么用的吗，没用0.3333啊，我不是这个专业的，只是本科学过c语言，加上自学一点，可能有些基础知识不清楚，希望你能说清楚一点

引用 5 楼 nice_cxf 的回复:大小差距接近千分之三，肯定不是精度问题，核对下是不是那里计算有错误？ double运算精度不可能差这么多 计算没问题，只有这一个数差这么多，其他的都很准，至少有十一位精度

引用 3 楼 qybao 的回复:[quote=引用 2 楼 zhendeguofenle 的回复:]  本来是没有b这个参数的，是我排错的时候自己加的输出，这个b是个除数，至于你说的不用0.3333而用1/3.0，我不就是这么用的吗，没用0.3333啊，我不是这个专业的，只是本科学过c语言，加上自学一点，可能有些基础知识不清楚，希望你能说清楚一点 1L的意思可能是说通分 即 b = Cpd *dend *(r *r *r - (r - nr)*(r - nr)*(r - nr)) / 3.0 + kd *nt *(r *r + (r0 - nr)*(r0 - nr)) / nr; 等价于 b = (Cpd *dend *(r *r *r - (r - nr)*(r - nr)*(r - nr)) ) + 300000*(kd *nt *(r *r + (r0 - nr)*(r0 - nr)))) / 3.0;  也就是nr也变成分母为3.0，先计算总和最后再除以3.0 计算过程中减少精度丢失，或许一定程度上能保证一定的精度吧 我觉得你可以考虑一下第三方提供的高精度类型或自己实现一个高精度类型 如GCC Quad-PrecisionMath Library(简称为quadmath)提供的__float128 或者boost lib的cpp_dec_float 自己实现的话，可以参考 https://blog.csdn.net/housisong/article/details/525215   [/quote]好的，通分的意义是在于将小数变大先进行计算再变小对吧，至于高精度类型我去看看，谢了

引用 2 楼 zhendeguofenle 的回复:本来是没有b这个参数的，是我排错的时候自己加的输出，这个b是个除数，至于你说的不用0.3333而用1/3.0，我不就是这么用的吗，没用0.3333啊，我不是这个专业的，只是本科学过c语言，加上自学一点，可能有些基础知识不清楚，希望你能说清楚一点 1L的意思可能是说通分 即 b = Cpd *dend *(r *r *r - (r - nr)*(r - nr)*(r - nr)) / 3.0 + kd *nt *(r *r + (r0 - nr)*(r0 - nr)) / nr; 等价于 b = (Cpd *dend *(r *r *r - (r - nr)*(r - nr)*(r - nr)) ) + 300000*(kd *nt *(r *r + (r0 - nr)*(r0 - nr)))) / 3.0;  也就是nr也变成分母为3.0，先计算总和最后再除以3.0 计算过程中减少精度丢失，或许一定程度上能保证一定的精度吧 我觉得你可以考虑一下第三方提供的高精度类型或自己实现一个高精度类型 如GCC Quad-PrecisionMath Library(简称为quadmath)提供的__float128 或者boost lib的cpp_dec_float 自己实现的话，可以参考 https://blog.csdn.net/housisong/article/details/525215


Question: VS2015编译github项目出现error LNK2019错误，请教如何解决？

引用 1 楼 user-1 的回复:没有相应的头文件被包含进来  你好，我已经按照网上的方法，设置了libdcadec.lib的位置了，但还是不行。请教如何把头文件被包含进来呢？

没有相应的头文件被包含进来


Question: 跪求大佬帮我看看这段代码

a~z 和 A~Z对应的ASCII码你搞反了   正确的判断条件下将输出相反的字符  所以如果用字母  答案是对的  改为数字 答案就错了  而且你第三个putchar(ch);应该在else条件内，与前面2个条件应该并列才对

理论上来说 没有任何区别滴   但是从你的代码来说   区别还是很大滴


Question: 结构体写在头文件中

感谢分享！！！

Stu.h: Struct student { int a; int b; } 函数声明 ------------------------------ Stu.c: #incldue"Stu.h" 函数定义 ------------------------------ main.c :: include"Stu.h" ------------------------------ Stu.c里面那些好像不需要extern。我记得说：extern是声明时用的。说，这个东西啊编译器你现在在这个.c/.h中是找不到具体形态的，只告诉你有这么个东西，到时候其它模块那儿才是具体形态（定义）。 但你这里的Stu.c里面的变量、函数，似乎都是定义。所以看上去用不到extern啊

引用 1 楼 自信男孩的回复:你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”

你的.c文件有没有include头文件（.h）呢？

引用 9 楼 其实一开始我是拒绝的 的回复:[quote=引用 8 楼 自信男孩的回复:][quote=引用 7 楼 其实一开始我是拒绝的 的回复:] [quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 其实一开始我是拒绝的 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分[/quote] #includestdio.h括号就不写了 #include “student.h” int main ｛struct student s【M】； input（s）； output（s）； return 0； ｝[/quote] 代码如果没有保密要求，建议都贴出来～多个文件的都贴出来[/quote] 没有什么保密的，就这些和图片里的[/quote] 你的student.c源文件里引入student.h头文件了吗？[/quote] 没有，还有在main.c里面也没引用这个“student.c”[/quote] include是头文件，不需要Include .c文件 你的问题就是因为在student.c中没有引入student.h文件。  如果student.c中的函数在main函数里被调用，建议函数声明也放到student.h中。

引用 13 楼 其实一开始我是拒绝的 的回复:那什么时候要把“student.c”放到main.c中之前我看到过类似的 只要你控制好不发生重复函数定义，你把student.c方法main.c也可以，但是没必要，加入头文件就可以了（也就是只用函数声明就够了）

引用 14 楼 user-4的回复:[quote=引用 12 楼 user-4 的回复:] [quote=引用 11 楼 其实一开始我是拒绝的 的回复:] 要把“student.c”也放到main里面？ 不用，加入头文件就可以了 在student.c 开头加入 #include "student.h"  //这个是为了解决你最开始说的为什么student.c不认识student结构体的问题 在main.c 开头也加入 #include "student.h"  //这个是为了让你的main函数能正常调用input和output函数[/quote] 而且为了重复定义，你的student.h最好定一个宏 比如 student.h的内容为 #ifndef STUDENT_H  //加个宏判断 #define STUDENT_H    #define M 5 struct student {     int num;     char name[10]; } void input(struct student a[]); void output(struct student a[]); #endif[/quote] 我知道了，谢谢大佬

引用 12 楼 user-4 的回复:[quote=引用 11 楼 其实一开始我是拒绝的 的回复:] 要把“student.c”也放到main里面？ 不用，加入头文件就可以了 在student.c 开头加入 #include "student.h"  //这个是为了解决你最开始说的为什么student.c不认识student结构体的问题 在main.c 开头也加入 #include "student.h"  //这个是为了让你的main函数能正常调用input和output函数[/quote] 而且为了重复定义，你的student.h最好定一个宏 比如 student.h的内容为 #ifndef STUDENT_H  //加个宏判断 #define STUDENT_H    #define M 5 struct student {     int num;     char name[10]; } void input(struct student a[]); void output(struct student a[]); #endif

引用 12 楼 user-4的回复:[quote=引用 11 楼 其实一开始我是拒绝的 的回复:] 要把“student.c”也放到main里面？ 不用，加入头文件就可以了 在student.c 开头加入 #include "student.h"  //这个是为了解决你最开始说的为什么student.c不认识student结构体的问题 在main.c 开头也加入 #include "student.h"  //这个是为了让你的main函数能正常调用input和output函数[/quote] 那什么时候要把“student.c”放到main.c中之前我看到过类似的

引用 11 楼 其实一开始我是拒绝的 的回复:要把“student.c”也放到main里面？ 不用，加入头文件就可以了 在student.c 开头加入 #include "student.h"  //这个是为了解决你最开始说的为什么student.c不认识student结构体的问题 在main.c 开头也加入 #include "student.h"  //这个是为了让你的main函数能正常调用input和output函数

要把“student.c”也放到main里面？

把#include "student.h" 加到 student.c 和 main.c 里 否则你的main也会因为找不到student.c 的函数实现而出错（student.h只有函数声明，没有函数实现）

引用 8 楼 自信男孩的回复:[quote=引用 7 楼 其实一开始我是拒绝的 的回复:] [quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 其实一开始我是拒绝的 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分[/quote] #includestdio.h括号就不写了 #include “student.h” int main ｛struct student s【M】； input（s）； output（s）； return 0； ｝[/quote] 代码如果没有保密要求，建议都贴出来～多个文件的都贴出来[/quote] 没有什么保密的，就这些和图片里的[/quote] 你的student.c源文件里引入student.h头文件了吗？[/quote] 没有，还有在main.c里面也没引用这个“student.c”

引用 7 楼 其实一开始我是拒绝的 的回复:[quote=引用 6 楼 自信男孩的回复:][quote=引用 5 楼 其实一开始我是拒绝的 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分[/quote] #includestdio.h括号就不写了 #include “student.h” int main ｛struct student s【M】； input（s）； output（s）； return 0； ｝[/quote] 代码如果没有保密要求，建议都贴出来～多个文件的都贴出来[/quote] 没有什么保密的，就这些和图片里的[/quote] 你的student.c源文件里引入student.h头文件了吗？

引用 6 楼 自信男孩的回复:[quote=引用 5 楼 其实一开始我是拒绝的 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分[/quote] #includestdio.h括号就不写了 #include “student.h” int main ｛struct student s【M】； input（s）； output（s）； return 0； ｝[/quote] 代码如果没有保密要求，建议都贴出来～多个文件的都贴出来[/quote] 没有什么保密的，就这些和图片里的

引用 5 楼 其实一开始我是拒绝的 的回复:[quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分[/quote] #includestdio.h括号就不写了 #include “student.h” int main ｛struct student s【M】； input（s）； output（s）； return 0； ｝[/quote] 代码如果没有保密要求，建议都贴出来～多个文件的都贴出来

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分[/quote] #includestdio.h括号就不写了 #include “student.h” int main ｛struct student s【M】； input（s）； output（s）； return 0； ｝

引用 2 楼 其实一开始我是拒绝的 的回复:有写了#include“student.h” 你是在哪个文件里写了#include "student.h"的？ 从你的截图来看，student.c里没有#include "student.h"

引用 2 楼 其实一开始我是拒绝的 的回复:[quote=引用 1 楼 自信男孩的回复:]你的.c文件有没有include头文件（.h）呢？ 有写了#include“student.h”[/quote] 把代码都贴出来吧，尤其是头文件部分


Question: 求大神帮我分析分析，为什么我按照网上复数的用法却提示错误？

有啥问题 报啥错你贴出来啊  我这儿运行是正确的


Question: c语言的数据结构之图

去找数据结构交材看看吧。


Question: c语言怎么从txt读取数字，并赋值为变量

读写配置一般用ini文件，有专门的api  GetPrivateProfileString();  WritePrivateProfileString();

直接fread之后，用atoi不就可以了。。。

引用 6 楼 轻箬笠 的回复:直接fread之后，用atoi不就可以了。。。 #include<stdio.h>  int main() {         FILE * file=fopen("1.txt","rb");         char ch_tmp[1024];         fread(ch_tmp,1024,1,file);         int num = atoi(ch_tmp);         fclose(file);         printf("num = [%d]\n",num);         return ( 0 ); }

fscanf()函数从流（stream）中读取数据，并将数据保存在指定的变量中。对于该函数的具体使用方法，请参考 《C++中scanf和printf系列函数简介》 希望能够帮到您！

小白还是从ini配置文件读取开始吧。

引用 4 楼 chxchxkkk 的回复:可以百度一下fscanf fscanf试过了不行

可以百度一下fscanf

FILE * file=fopen("1.txt","rb"); int i; fread(&i,sizeof(int),1,file); fclose(file);

引用 1 楼 user-7 的回复:fopen打开文件，然后fread读给变量比如i，fread(&i,....  有具体实例吗，小白表示不懂

fopen打开文件，然后fread读给变量比如i，fread(&i,....


Question: 在scanf函数中，整型可以存储字符型吗？

最好按标准来，不要自创

跟编译器有关，有的编译器不会报错，但是得到的值可能会很怪异


Question: 求大佬们帮我解答一下选择填空题吧，我都不太看的懂

第一个４次，第二个如果不对ｙ改变４次 首先你要知道循环中的后＋＋是循环体执行完ｘ＋１；这里的循环体执行玩是哪怕循环体是ｃｏｎｔｉｎｕｅ都算 知道＋＋后就正常去看，首先比较条件ｘ<２０，执行循环体，执行次数加１循环体x+=2；等同于ｘ＝ｘ＋２；改变ｘ的值，执行完ｘ＋＋ 相当于执行一次循环ｘ＋３，而三次后ｘ＝１９，满足条件，进入循环，再出来不满足，不再进入循环，所以是３＋１　４词 第二题，看判断条件有两个&&是并且，就是说有一个不满足就不行，所以次数是两个条件中最少的那个，跟短板效应差不多。然后看后面是ｘ＋＋，只对ｘ操作，每次加一，所以就是相当于求ｘ加几次之后就不满足ｘ<４的条件了，ｘ＝０（＋＋），ｘ＝１（＋＋），ｘ＝２（＋＋），ｘ＝３（＋＋），４不满足不进入循环

C,D,C,A,B,D,B,C,4,-1 不用谢

第一个执行4次

最好有解题步骤和思路


Question: Linux守护进程拉起qt程序，qt程序启动异常

问题解决了 原因是env环境变量在守护进程或者service启动的情况下DISPLAY环境变量是未设置的 所以导致界面资源无法加载

请问试过在非root用户下调用吗？我现在是root用户下设置该环境变量后能调用成功，但在非root用户下，即使设置了环境变量也依然报错。

qt程序是需要界面支持的，这个我怎么感觉有点类似在远程登入上（比如crt这种工具上）启动QT程序，他是不行的会报错。

引用 5 楼 非弋 的回复:可以测试一下：在图形界面下直接启动守护进程，观察Qt程序是否启动成功，如果是成功的，那么和守护进程无关。 延时10s再启动Qt程序是为了确保桌面环境已启动，然后这时再启动Qt程序。 谢谢您的回复， 现在这个问题定位出来了 但是结局方案还是没有；问题出在service上  用这个工具启动就是重启虚拟机后启动守护进程服务的方式，貌似这种方式 没权限获取界面资源，所以导致qt程序进了main 主函数但是没办法实例化qapplication

引用 3 楼 非弋 的回复:你可以测试一下是不是启动顺序的问题，比如在守护进程中延时10s再启动Qt程序。 以前有做Qt程序在Linux下的开机自启动，方式是：在安装包（rpm、deb）中添加/etc/init.d脚本，但是Qt程序有时启动失败，后来将脚本的run level降到最低就一直是成功的，猜测是Qt程序在桌面环境启动之前启动  谢谢您的回复，但是我这个功能就是在守护进程完全启动后，有监控系统有特殊操作才会调用qt 程序的 所有顺序应该是没有问题的，我定位出来的情况是 只有重启后的守护进程 在拉起qt的时候才会异常，就好像某种资源加载不了一样，有没有可能是守护进程（服务）没有办法加载界面资源？  这种问题真难唉！！

不行 一手动启动gdb dump core就正常了，这种工具没办法定位，只有重启机器让守护进程拉起的时候才会出现这问题

可以去看一下qt程序的coredump文件，死在什么地方


Question: 求助C语言循环结构实训题

引用 楼主 Ruking0507 的回复:111

三个循环 int main() {     int x,y,z;     for(z=5;z<1002;z++) { //z至少比x大2，所以x是1000，z就是1002         for (y=4;y<z;y++) { //保证y小于z             for (x=3;x<y;x++) { //保证x小于y                 if (x*x+y*y==z*z) { //满足表达式则输出                     printf("%d^2+%d^2=%d^2\n", x, y, z);                 }             }         }     }     return 0; }

for(int i=1;i<1000;i++){     for(int j=i+1;j<1000;j++){        for(int k=j+1;k<1000;k++)           if(i*i + j*j == k*k){               printf();      }   } }

引用 楼主 Ruking0507 的回复:  #include <stdio.h> void ggs(int maxnum) { 	for(int i=2;i<maxnum;i++) 	{ 		for(int j=i;j<maxnum;j++) 		{ 			for(int k=j;k<maxnum;k++) 			{ 				if(i * i + j* j == k*k) 				{ 					printf("勾股数为:%d %d %d\n",i,j,k); 				} 			} 		} 	} }  int main() { 	ggs(1000); 	return 0; }

可以用三层循环来实现，不过可能效率低了一点


Question: 求助C语言循环结构实训题

从2开始计算，然后如果是公约数就加起来


Question: 一个c语言程序没有错误，但是运行不出来

void choice()      //用于输出信息功能选择 {     int c;     printf("请选择接下来想做什么\t1>返回菜单\t2>退出系统    [ ]\b\b");     scanf("%d",&c);     if(c==1)         menu();     else         exit(0);     //puts('\n');     putchar('\n'); } 建议查一下文件读操作～

fscanf(fp,"%d %d %d",&ss[n].sid,&ss[n].pid,&ss[n].sn);试试

for(n=0;!feof(fp);n++) 		{ 			fscanf(fp,"%d %d %d\n",&ss[n].sid,&ss[n].pid,&ss[n].sn); 		} // 这里有问题


Question: 求解

char* fstrcat(char *s,char *t) { 	int i=0; 	char* temp = s; 	char* temp2 = t; 	while(*temp != '\0') 	{ 		i++; 		temp++; 	} 	while(*temp2) 	{ 		s[i++]=*temp2; 		temp2++; 	} 	s[i]='\0'; 	return s; }

供参考  #include <stdio.h> #include <stdlib.h>  //字符串拼接 char *fstrcat(char *s, char *t); //字符串拷贝 char *fstrcpy(char *s, char *t); //字符串比较 int fstrcmp(char *s, char *t); //字符串长度 int fstrlen(char *s);  int main() {     int j, k;     char s1[100], s2[100], s3[100], s4[100];     char *p = s3;     char *q = s4;     printf("\n输入第一个字符串：");     scanf("%s", s1);     printf("\n输入第二个字符串：");     scanf("%s", s2);      p = fstrcat(s1, s2);     printf("\n拼接后的字符串：%s\n", p);      q = fstrcpy(s1, s4);     printf("\n复制后字符串：%s\n", q);      j = fstrcmp(s1, s2);     if ( j == 1)         printf("[%s]比[%s]大\n", s1, s2);     else if (j == 0)         printf("[%s]与[%s]相等\n", s1, s2);     else         printf("[%s]比[%s]小\n", s1, s2);      k = fstrlen(s1);     printf("[%s]的长度是： %d\n", s1, k);      return 0; }  //字符串拼接 char *fstrcat(char *s, char *t) {     int i = 0, j = 0;      while ( s[i] != '\0')     {         i++;     }     j = i;     i = 0;     while (t[i] != '\0')     {         s[j++] = t[i++];     }     s[j] = '\0';      return s; }  //字符串拷贝 char *fstrcpy(char *s, char *t) {     int i = 0;      while ( s[i] != '\0')     {         t[i] = s[i];         i++;     }     t[i] = '\0';      return t;  } //字符串比较 int fstrcmp(char *s, char *t) {     int i = 0;     while (s[i] != '\0' && t[i] != '\0')     {         if (s[i] > t[i])             return 1;         else if (s[i] == t[i])             return 0;         else             return -1;         i++;     } } //字符串长度 int fstrlen(char *s) {     int i = 0;      while ( s[i] != '\0')     {         i++;     }     return i; }


Question: 求解

void sort(int *a,int n) { 	for(int i=0;i<n;i++) 	{ 		for(int j=i;j<n;j++) 		{ 			if(a[i] < a[j]) 			{ 				int temp = a[i]; 				a[i]=a[j]; 				a[j]=temp; 			} 		} 	} }


Question: 大佬们，帮我看看这段代码哪里错了？

关于printf()函数的用法，请参考《C++中printf()函数的用法10-1》

“line1NL” 这种被双引号引起来的，不会识别NL的，这是一个字符串，没办法替换。

ASCII码都可以用“\”加数字（一般是8进制数字）来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符，如\0,\t,\n等，就称为转义字符，因为后面的字符，都不是它本来的ASCII字符意思了。 但是这里定义了一个宏，在“”里编译会把他看成一个字符串“Line1NL”,但是如果“Line1\n”时编译器会识别到“\”即转义字符也就会把“\n”看做换行符。

printf("Line1%c", NL);         printf("Line2%c", NL); 这样试试～

自顶

引用 1 楼 user-5 的回复：首先这里改一下#define NL "\n"  还有有两种用法可以达到你的效果， 1.         printf("Line1"NL);         printf("Line2"NL); 2.         printf("Line1%s",NL);         printf("Line2%s",NL);NL放在字符串中为什么不能被替换呢？


Question: 0xc0000005访问冲突，求大神帮忙

引用 楼主 weixin_45985307的回复:void add(STAFF sta[],char *name,char *username,char *password) { 	int i=0,j=0; 	while (sta[j].staffID[0]!='\0') ++j; 	strcpy(sta[j].staffID,name); 	strcpy(sta[j].name,username); 	strcpy(sta[j].password,password); 	sta[j].compInsur=0; 	sta[j].staffInsurance=0; 	sta[j].staffSalary=0; 	sta[j].staffTax=0; 	sta[j].takeSalary=0; }    运行到sta[j].compInsur=0;就出现这个报错 第一调用这个函数没有报错，第二次调用的时候就报错了

建议提供更多的信息（代码），根据错误判断很可能是内存溢出了（数组越界）

void add(STAFF sta[],char *name,char *username,char *password) {   int i=0,j=0;   while (sta[j].staffID[0]!='\0')    {     strcpy(sta[j].staffID,name);     strcpy(sta[j].name,username);     strcpy(sta[j].password,password);     sta[j].compInsur=0;     sta[j].staffInsurance=0;     sta[j].staffSalary=0;     sta[j].staffTax=0;     sta[j].takeSalary=0;     ++j;   } }

是地址非法访问了，检查一下前面字符串的赋值操作


Question: 能帮我看看我这个 if-else-if 吗？

if的判断要分开写

好的，谢谢

if else if else if是第一种条件的判断 else if是对后面出现的不同的情况判断，但是这里判断的条件又不是剩下的所以情况的 else最后结尾是不用条件的，他的默认条件是排除上面列出的以外剩余的条件 ｃ中没有连比的用法，而是通过＆＆　｜｜连接一个是并且，一个是或者

前面的都理解了，但还是轴在这里。。。

谢谢啊，但是为什么最后else不加if且有条件的话要加；号？

int main() { 	int hight; 	scanf_s("%d", &hight); 	if (hight >= 180) 	{ 		printf("小明可以进入篮球队"); 	} 	else if (hight>=175)//--------else已经暗含hight<180了，因此可以把这个条件去掉---- 	{ 		printf("小明可以进入篮球队替补"); 	} 	else //------else已经暗含hight<175了，因此可以把这个条件去掉 	{ 		printf("小明不可以进入篮球队"); 	} 	return 0; }  VS2015 C++环境调试

引用 5 楼 See-Victory 的回复: 最后的else没有带if，要么就不要条件

第一个最后的else后面多了个分号

好的，不懂就问， int main() {     int hight;     scanf_s("%d", &hight);     if (hight >= 180)     {         printf("小明可以进入篮球队");     }     else if (175 <= hight && hight < 180)     {         printf("小明可以进入篮球队替补");     }     else (hight < 175);     {         printf("小明不可以进篮球队");     }     return 0; } 结果：176 小明可以进入篮球队替补小明不可以进篮球队 改了一下： int main() {     int hight;     scanf_s("%d", &hight);     if (hight >= 180)     {         printf("小明可以进入篮球队");     }     else if (175 <= hight && hight < 180)     {         printf("小明可以进入篮球队替补");     }     else if(hight < 175)     {         printf("小明不可以进篮球队");     }     return 0; } 结果：176 小明可以进入篮球队替补 我在第三个else+if，怎么前后两个结果不一样？

先不要怀疑软件的问题，先认为是自己的问题，找自己的问题比找软件的问题容易一些，可以改成这样   if (hight >= 180) 14     { 15         printf("小明可以进入篮球队"); 16     } 17     else if (175 <= hight && hight < 180) 18     { 19         printf("小明可以进入篮球队替补"); 20     } 21     else (hight < 175); 22     { 23         printf("小明不可以进入篮球队"); 24     }

没有这种写法 (175 <= hight < 180)


Question: 关于大数据量排序问题

引用 6 楼 user-1 的回复：你就用rand来模拟谢谢！指明了方向！

你就用rand来模拟

引用 3 楼 user-1 的回复：这个肯定不能手工输入，动态创建数组，比如int *arr =new int[100000] 或者 int *arr =malloc(100000*sizeof(int)); 然后赋值，可以是顺序的，也可以是随机的值请问创建数组之后怎样随机赋值呀，我记得有一次写过随机取数的代码

请问创建一个大小为10000的整形数组之后怎么随机赋值呀

请问这怎么输入

这里是个数的意思，就是说分别是100个，1000个，10000万个和100000个


Question: 用C语言实现如下功能，将片内RAM区40H的内容拆分，高4位送41H的低4位（高4位清0），低4位送42H的低4位（高4位清0

unsigned char *p = (unsigned char *)0x40;   *(p + 1) = *p >> 4;   *(p + 2) = *p & 15;


Question: C语言自定义头文件

就是和建.c文件一样，后缀改成.h就是了

引用 6 楼 user-2的回复:你就把文件的前三行代码移到length.h里面就可以了，也就是在同一个目录创建一个length.h文件 怎么创建？搞不懂

引用 4 楼 user-2的回复:你就把那些宏定义放到length.h头文件里面就好了 怎么放？新手不懂啊

你就把那些宏定义放到length.h头文件里面就好了

引用 2 楼 其实一开始我是拒绝的的回复:[quote=引用 1 楼 user-2的回复:]你没有length.h头文件，如果不需要，直接去掉那一行 题目是说要把宏定义改成头文件length[/quote] 没有那怎么办？

引用 1 楼 user-2的回复:你没有length.h头文件，如果不需要，直接去掉那一行 题目是说要把宏定义改成头文件length

你没有length.h头文件，如果不需要，直接去掉那一行


Question: 大神求教

最后一张图放错了

把图中的a，K（用大写的都得该）改一下  我用的是vs2019，scanf得改成scanf_s(好像是从vs2017)开始的。不是不用管。

楼上正解，问题应该主要出在你的变量名上，上面用的是定义过得ｋ，下面使用的是没定义过的Ｋ，你的程序报错应该有报哪一行Ｋ没定义吧？

引用 楼主 羌梧的回复:求问各位大神这个为什么会报错呀      int main(void) { 	int a = 0; //数量   	printf("请输入任意的数量\n"); 	scanf("%d",&a);  	int n[a];  	int k=0;//括号内 	printf("请输入任意的分数\n");	// printf()是输出函数，scanf()才是输入函数 	for(k=0;k<=(a-1);k++)  	{ 	scanf("%d", &n[k]);	// scanf()参数列表中注意 “&” 	 	}	  	for(k=0;k<=(a-1);k++) 	{  	if (n[K]<0 || n[K]>100)//排除小于0或大于100的情况 		printf("输入分数有误\n"); 	else if (n[K] <= 59)// 0 <= n <= 59  	 	printf("E\n");  	else if (n[K] <= 69)// 59 < n <= 69   		printf("D\n"); 	else if (n[K] <= 79)// 69 < n <= 79  		printf("C\n"); 	else if (n[K] <= 89)// 79 < n <= 89  		printf("B\n"); 	else if (n[K] <= 100)// 89 < n <= 100  		printf("A\n"); 	}  	return 0; } 把K换成k应该就好

int n[a];  ==》》c语言不支持这样定义数组，a得是个常量值。

int n[a];  ----------- 是这里错了吗？数据声明要用常量，不能用变量a

报什么错？编译错还是运行错?


Question: 求解急用

刚写过了吧？


Question: 链串%c无法输出数据问题

'abc'没有这样的字符，只有"abc"这样的字符串。一个字符是一个字节，'abc'是三个字符了。  如果是判断字符串，可以考虑这样： typedef struct Lnode {      char data[20];         struct Lnode *next; }Sq;

请参考《C++中fflush()函数与rewind()函数》

Sq *s; int n; char a[20]; printf("please enter number:\n"); scanf("%d", &n); getchar()//------这里把回车符屏蔽了------------ if (n <= 0) printf("ERROR!");


Question: 输出生成乱码？

字符串比较用strcmp，你用==是比较两个字符指针指向的地址是否相同 所以改成 if (strcmp(function,”y=x”)==0)//其它的if同样修改 另外，你的f函数都是if elseif 分支，如果这些分支都不满足，f就没有返回值了，所以f函数的最后最好加上return 0

字符串比较不能这样用  if (function == "y=x") {  要用strcmp

字符串比较需要调用字符串接口函数，strcmp/strncmp

正如楼上两位朋友说的 #include <stdio.h> #include <string.h>//--------添加头文件，包含strcmp()函数-----  int f(char function[], int x) { 	if (strcmp(function,"y=x")==0) {//-------改为strcmp()函数，0表示两个值相等--------- 		return x; 	} 	else if (strcmp(function,"y=x^2")==0) {//-------改为strcmp()函数，0表示两个值相等--------- 		return x * x; 	} 	else if (strcmp(function,"y=x^3")==0) {//-------改为strcmp()函数，0表示两个值相等--------- 		return x * x * x; 	} } int main() { 	char func[10]; 	int x[100], y[100]; 	int i; 	scanf_s("%s", &func, 10); 	for (i = 0; i < 100; i++) { 		x[i] = i; 		y[i] = f(func, x[i]); 	} 	for (i = 0; i < 100; i++) { 		printf("%d %d\n", x[i], y[i]); 	}     return 0; } VS2015 C++环境调试


Question: C语言输入任意函数，在DOS窗口模拟运动轨迹

引用 4 楼 Jennie Libra 的回复:[quote=引用 3 楼 user-2 的回复:] 你需要提前定义好输入函数，比如输入aaa对应的函数是fun1，输入bbb，对应函数fun2等，主要是要有对应表 我大概明白你意思了。但是这样是不是太繁琐了？毕竟我可以定义的函数有无数个啊[/quote] 那这样的话 你要设计定义一套语义分析系统，然后依照优先级顺序来计算

引用 4 楼 Jennie Libra 的回复:[quote=引用 3 楼 user-2 的回复:] 你需要提前定义好输入函数，比如输入aaa对应的函数是fun1，输入bbb，对应函数fun2等，主要是要有对应表 我大概明白你意思了。但是这样是不是太繁琐了？毕竟我可以定义的函数有无数个啊[/quote]  如果要支持得好的话，也可以自己解析输入的内容，像编译器分析表达式一样。

引用 3 楼 user-2 的回复:你需要提前定义好输入函数，比如输入aaa对应的函数是fun1，输入bbb，对应函数fun2等，主要是要有对应表 我大概明白你意思了。但是这样是不是太繁琐了？毕竟我可以定义的函数有无数个啊

引用 1 楼 user-2 的回复:什么意思？能描述具体一点吗？ 就是你输入一个函数，然后输出对应的坐标 举个例子：输入y=x^2,则输出（1，1），（2，4），（3，9）。。。

什么意思？能描述具体一点吗？


Question: C语言期中作业   大佬进 急求

题目要求很清楚啊，按要求一步步来呗。你是不会还是懒呢。或者说是哪一模块不会写？

定义得还比较清楚，按照要求一步步去做就好

害最近网课没怎么听，没用心学，一有作业才发现自己不会，拉下了挺多的，大佬帮帮我呗，作业马上要交了。。。


Question: 有个不兼容的32位的EXE文件，无法在WIN7 X64系统中运行，跪求解决办法

不过版本不兼容也可能是老的32位软件，nero 7在win10上就不能运行

引用 5 楼 Gerald_Huang 的回复:可以运行一些之前不行的EXE，不过这个正好不行。郁闷ING~~  这样的话，估计是DOS程序了。可以试试这个ntvdmx64：http://www.columbia.edu/%7Eem36/ntvdmx64.html 这个专门支持DOS程序的(但也不是100%)，实际上这些软件都是依据泄漏的windows源码中ntvdm部分修改的，微软本来应该做这个工作的，但是微软又偷懒又想甩包袱，就把win64中的dos和win16支持去掉了

能不能兼容模式运行 ？

DosBox试试

引用 3 楼 ooolinux 的回复:[quote=引用 2 楼 早打大打打核战争的回复:]应该是DOS或者win16软件，可以使用otvdm：https://github.com/otya128/winevdm/releases/download/v0.7.0/otvdm-v0.7.0.zip 只有6MB多一点，即装即用，在win64上对win16软件支持很好，也支持一部分DOS软件（但不是全部，尤其是32位DOS保护模式程序基本不能用）：  这东西不错，以前都是虚拟机装32位windows。[/quote]  可以运行一些之前不行的EXE，不过这个正好不行。郁闷ING~~

引用 2 楼 早打大打打核战争 的回复:应该是DOS或者win16软件，可以使用otvdm：https://github.com/otya128/winevdm/releases/download/v0.7.0/otvdm-v0.7.0.zip 只有6MB多一点，即装即用，在win64上对win16软件支持很好，也支持一部分DOS软件（但不是全部，尤其是32位DOS保护模式程序基本不能用）：   试过了，不行。比较头大~~~

引用 9 楼 早打大打打核战争 的回复:不过版本不兼容也可能是老的32位软件，nero 7在win10上就不能运行  估计是在DOS下编译出来的，很古老的系统上找到的，没有源程序，但又必须经常用，只能在XP 32位机上运行。现在系统升级了，用不了，正头疼着

引用 8 楼 早打大打打核战争 的回复:[quote=引用 5 楼 Gerald_Huang 的回复:]  可以运行一些之前不行的EXE，不过这个正好不行。郁闷ING~~  这样的话，估计是DOS程序了。可以试试这个ntvdmx64：http://www.columbia.edu/%7Eem36/ntvdmx64.html 这个专门支持DOS程序的(但也不是100%)，实际上这些软件都是依据泄漏的windows源码中ntvdm部分修改的，微软本来应该做这个工作的，但是微软又偷懒又想甩包袱，就把win64中的dos和win16支持去掉了[/quote]  好的，准备下来试试，THX~~~

引用 6 楼 ooolinux 的回复:DosBox试试  好的，下来试试。

引用 2 楼 早打大打打核战争的回复:应该是DOS或者win16软件，可以使用otvdm：https://github.com/otya128/winevdm/releases/download/v0.7.0/otvdm-v0.7.0.zip 只有6MB多一点，即装即用，在win64上对win16软件支持很好，也支持一部分DOS软件（但不是全部，尤其是32位DOS保护模式程序基本不能用）：  这东西不错，以前都是虚拟机装32位windows。

没有源码不太好办吧


Question: 跪求大佬讲解一下

引用 6 楼 刚学c的超级超级超级菜鸟的回复:[quote=引用 5 楼 Jags 的回复：]运算方向从左到右; 一条条语句分析: 第一条:x<y? w:x  这一条是混淆你的，没啥用，因为逗号分割的语句都以最后一条语句为输出;(x<y?w:x,m=m<y )相当于两条语句: x<y? w:x; m=m<y; 第二条:m=m<y;  m<y为真，所以m=1，即(x<y?w:x,m=m<y )为真，进而取m，也就是1 第三条 m<z 为真，所以取m的值而不是z，而m的值为1  所以，最终输出为1第二条，为什么m<y为真呐[/quote] m 声明一般默认为0，这题出的也不严谨

引用 5 楼 Jags 的回复：运算方向从左到右; 一条条语句分析: 第一条:x<y? w:x  这一条是混淆你的，没啥用，因为逗号分割的语句都以最后一条语句为输出;(x<y?w:x,m=m<y )相当于两条语句: x<y? w:x; m=m<y; 第二条:m=m<y;  m<y为真，所以m=1，即(x<y?w:x,m=m<y )为真，进而取m，也就是1 第三条 m<z 为真，所以取m的值而不是z，而m的值为1  所以，最终输出为1第二条，为什么m<y为真呐

引用 1 楼 user-3 的回复：图片看不清楚若有w,x,y,z,m均为int型变量，且w=1;x=2;y=3;z=4;m=(w<y?w:x,m=m<y)?m:y;m=(m<z)?m:z;，则m值是（ ） 1 2 3 4

你这个图让人看的费劲，百度一下三目运算符吧

主要应该考的应该是？表达式

图片看不清楚


Question: 求求大佬帮我看看我的代码哪里出了问题，心态崩了

#include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #include "malloc.h" int main() {     int n,x,j,k,l,m;     for(n=5;;n++) 	{         j=4*(n-1)/5;         k=4*(j-1)/5;         l=4*(k-1)/5;         m=4*(l-1)/5;         if(n%5==1&&j%5==1&&k%5==1&&l%5==1&&m%5==1) 		{             printf("至少合伙捕鱼：%d条\n",n);             break;         }     }     return 0; }


Question: 求大佬找一下错误 输出不了

调试：在改变ｐｔ后把ｐｔ打印一下，这样就知道问题是在前面的函数，还是后面的了，这样逐步打印就则可以确定错误的位置了 还有一个很重要的就是，手动申请的内存空间最后都要去手动释放一下，不然会造成内存泄漏 printf("p[i]%d=%lf\n", i, p[i]);还有这句你是想printf("p[％ｄ]=%lf\n", i, p[i]);这样吧

分配内存地方都要指明大小，比如pt = (double*)malloc(sizeof(double));


Question: 做C的作业，遇到了一些问题，望大佬们解答

gcc连接上了，谢谢大佬

引用 1 楼 user-1 的回复：没有链接gcc的库大佬，gcc的库要怎么连接？本来这个程序是在VMware虚拟机的ubuntu系统里运行的，在ubuntu中也是报了这个错，但我对ubuntu不熟悉刚接触，所以我在dev c++里运行了，所以这个gcc连接在windows系统和ubuntu系统怎么连接？

引用 2 楼 user-1 的回复：print应该是printf吧哈哈哈，最近写python写懵了，谢谢提醒

print应该是printf吧

没有链接gcc的库


Question: C语言数组实验题

#include <stdio.h> int main(int argc,char const*argv[]) { 	int i=0; 	int a[10] = {0}; 	while(i < 10) { 		scanf("%d",&a[i++]);   //读入是个整数 	} 	int max = a[0], min = a[0]; 	for( i=9; i>=0; i--) { 		printf("%d ",a[i]);      //逆序输出 		if(a[i] > max) {      // 比较大小 			max = a[i]; 		}else if(a[i] < min) {    //比较大小 			min =a[i]; 		} 	} 	printf("\nmax = %d, min = %d", max, min); 	return 0; }

for example  int main() {     int i,j,k,a[10];     printf(“输入10个数：”);     for(i=0;i<10;i++)          scanf(“%d”, &a[i]);     j=k=a[9];     printf(“逆序输出：”);     for(i=9; i>=0; i--) {         printf(“%d “, a[i]);          if (a[i]>j) j=a[i];          if (a[i]<k) k=a[i];     }     printf(“\n最大值：%d, 最小值：%d”, j, k);     return 0; }

scanf读入10个数，然后排序(逆序指的是输入逆序的话，就不用排序)，比较大小，存一个最大值和最小值，最后输出


Question: printf中，标记0和-可以同时用吗？

-是待打印项左对齐 0是前导0代替空格填充字段宽度


Question: 数据保存如何固定文件保存类型

一般都这样写: char buf[32]; sprintf(buff,"%s.txt", fliename); printf("%s",buf);

char filename[32];      scanf("%s", filename);      strcat(filename, ".txt");      puts(filename); 供参考～


Question: 求大神解答

#include <string> #include <iostream>   using namespace std;   int main(int argc, char** argv) { int m=0,row=0,col=0; int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; 	m=a[0][0]; 	for(int i=0;i<3;i++) 	{ 		for(int j=0;j<4;j++) 		{ 			if(m < a[i][j]) 			{ 				m=a[i][j]; 				row=i; 				col=j; 			} 		} 	} 	printf("Max  is %d,row is %d, col is %d\n",m,row,col); 	return 0; }

int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}, idx_i, idx_j;      int i, j, max;      max = a[0][0];     idx_i = idx_j = 0;     for (i = 0; i < 3; i++)         for (j = 0; j < 4; j++)             if (a[i][j] > max) {                 max = a[i][j];                 idx_i = i;                 idx_j = j;             }      printf("a[%d][%d] = %d\n", idx_i, idx_j, max);  供参考～

来个双层循环就可以


Question: 求大佬帮我看看这个基础题

n后面的\ 是一个续行符，表示续行符的下一行与续行符所在的代码是同一行，因为一条语句必须是一行。这就像楼上说的，方便阅读

这里每一行最后的\表示一行字符串还没有结束，下面的行接着上面的字符串，为什么要这么写呢？因为如果全都写到一行，不太方便看，所以写到多行里面


Question: ACM输入问题

引用 3 楼 自信男孩 的回复:scanf("xxx", &xxx)  != EOF  windows下是输入快捷键: ctr+z Linux输入快捷键：ctr+d 这是在线的ACM，他会自动给你的程序输入，检查输出

因为scanf是一个有返回值的内置函数，返回值 == scanf读取的数字个数

scanf一个特殊字符作为结束，比如输入q再按回车你就认为输入结束了


Question: 36进制字符串的问题

比如说YQ==解码为a,a的ascii为97，所以转成36进制为2P,因为2P对应10进制97.


Question: printf函数不能输出的问题

basic.h包含了各种需要的头文件 问题已经想明白了：close（1）关闭了stdout，即标准输出，printf函数输出到fd1打开的文件中了，想在屏幕上输出的话重新打开1即可

open是系统调用函数

open是自定义的函数吗

close(1); 是做什么的?

说明打开文件失败了

你的stdio.h呢？我没学过C，C++中printf必须要有stdio.h头文件的

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>  int main() {     int fd1;     int fd2;      fd1 = open("txxxx_est", O_CREAT|O_WRONLY, S_IRWXU);     if(fd1 < 0)     {         perror("open fail");         exit(-1);     }     //close(1);     printf("fd1 = %d\n", fd1);     //close(fd1);     fd2 = dup(fd1);     //printf("pass\n");     if (fd2 < 0)         puts(strerror(errno));     printf("fd2=%d\n",fd2);     //fflush(stdout);     return 0; } 供参考～  dup是The dup() system call creates a copy of the file descriptor oldfd, using the lowest-numbered unused file descriptor for the new descriptor.  所以，不要关闭fd1.不然，dup会执行失败～

那说明没有运行到那里就结束了，这样的话基本应该是你打开文件不成功，你在ｉｆ里打印下ｆｄ看看，还有下面的ｃｌｏｓｅ应该是ｆｄ使用完关闭ｆｄ这个标识符吧？ｆｄ不一定是１的


Question: 请问这个汇编题怎么做？

引用 24 楼 山雨。 的回复：你应该结帖，把分给别人哦，谢谢提醒，第一次弄，我去百度搜一下怎么结

感谢分享！！

你应该结帖，把分给别人

引用 20 楼 北极光~ 的回复：[quote=引用 5 楼 weixin_46673152 的回复:] 有没有人会啊 你确实可以反汇编，我会，你可以用命令行的对吧，就是gcc，汇编是.s文件  打开cmd或者powershell 输入：gcc -S ***文件路径改掉***.c -o ***目标路径加文件名***.s  实例C文件  #include <stdio.h>  int add(int, int); int mode(int, int);  int main() {     int a = 3, b = 2;     int s = add(3, 2);     int m = mode(3, 2);     return 0;     }  int add(int a, int b) {     return a + b; }  int mode(int a, int b) {     return a % b; }  结果是      .file    "sum.c"     .text     .def    ___main;    .scl    2;    .type    32;    .endef     .globl    _main     .def    _main;    .scl    2;    .type    32;    .endef _main: LFB13:     .cfi_startproc     pushl    %ebp     .cfi_def_cfa_offset 8     .cfi_offset 5, -8     movl    %esp, %ebp     .cfi_def_cfa_register 5     andl    $-16, %esp     subl    $32, %esp     call    ___main     movl    $3, 28(%esp)     movl    $2, 24(%esp)     movl    $2, 4(%esp)     movl    $3, (%esp)     call    _add     movl    %eax, 20(%esp)     movl    $2, 4(%esp)     movl    $3, (%esp)     call    _mode     movl    %eax, 16(%esp)     movl    $0, %eax     leave     .cfi_restore 5     .cfi_def_cfa 4, 4     ret     .cfi_endproc LFE13:     .globl    _add     .def    _add;    .scl    2;    .type    32;    .endef _add: LFB14:     .cfi_startproc     pushl    %ebp     .cfi_def_cfa_offset 8     .cfi_offset 5, -8     movl    %esp, %ebp     .cfi_def_cfa_register 5     movl    8(%ebp), %edx     movl    12(%ebp), %eax     addl    %edx, %eax     popl    %ebp     .cfi_restore 5     .cfi_def_cfa 4, 4     ret     .cfi_endproc LFE14:     .globl    _mode     .def    _mode;    .scl    2;    .type    32;    .endef _mode: LFB15:     .cfi_startproc     pushl    %ebp     .cfi_def_cfa_offset 8     .cfi_offset 5, -8     movl    %esp, %ebp     .cfi_def_cfa_register 5     movl    8(%ebp), %eax     cltd     idivl    12(%ebp)     movl    %edx, %eax     popl    %ebp     .cfi_restore 5     .cfi_def_cfa 4, 4     ret     .cfi_endproc LFE15:     .ident    "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 7.3.0"   汇编多长啊，为什么要学汇编 [/quote]谢谢你，老师布置的题，我也不想学

引用 5 楼 weixin_46673152 的回复:有没有人会啊 你确实可以反汇编，我会，你可以用命令行的对吧，就是gcc，汇编是.s文件  打开cmd或者powershell 输入：gcc -S ***文件路径改掉***.c -o ***目标路径加文件名***.s  实例C文件  #include <stdio.h>  int add(int, int); int mode(int, int);  int main() {     int a = 3, b = 2;     int s = add(3, 2);     int m = mode(3, 2);     return 0;     }  int add(int a, int b) {     return a + b; }  int mode(int a, int b) {     return a % b; }  结果是      .file    "sum.c"     .text     .def    ___main;    .scl    2;    .type    32;    .endef     .globl    _main     .def    _main;    .scl    2;    .type    32;    .endef _main: LFB13:     .cfi_startproc     pushl    %ebp     .cfi_def_cfa_offset 8     .cfi_offset 5, -8     movl    %esp, %ebp     .cfi_def_cfa_register 5     andl    $-16, %esp     subl    $32, %esp     call    ___main     movl    $3, 28(%esp)     movl    $2, 24(%esp)     movl    $2, 4(%esp)     movl    $3, (%esp)     call    _add     movl    %eax, 20(%esp)     movl    $2, 4(%esp)     movl    $3, (%esp)     call    _mode     movl    %eax, 16(%esp)     movl    $0, %eax     leave     .cfi_restore 5     .cfi_def_cfa 4, 4     ret     .cfi_endproc LFE13:     .globl    _add     .def    _add;    .scl    2;    .type    32;    .endef _add: LFB14:     .cfi_startproc     pushl    %ebp     .cfi_def_cfa_offset 8     .cfi_offset 5, -8     movl    %esp, %ebp     .cfi_def_cfa_register 5     movl    8(%ebp), %edx     movl    12(%ebp), %eax     addl    %edx, %eax     popl    %ebp     .cfi_restore 5     .cfi_def_cfa 4, 4     ret     .cfi_endproc LFE14:     .globl    _mode     .def    _mode;    .scl    2;    .type    32;    .endef _mode: LFB15:     .cfi_startproc     pushl    %ebp     .cfi_def_cfa_offset 8     .cfi_offset 5, -8     movl    %esp, %ebp     .cfi_def_cfa_register 5     movl    8(%ebp), %eax     cltd     idivl    12(%ebp)     movl    %edx, %eax     popl    %ebp     .cfi_restore 5     .cfi_def_cfa 4, 4     ret     .cfi_endproc LFE15:     .ident    "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 7.3.0"   汇编多长啊，为什么要学汇编

不会

引用 7 楼 weixin_46673152 的回复:[quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote] 只要学过不是看看就想起来了，又没用多少难得东西，直接就说不会要别人写不好吧

引用 7 楼 weixin_46673152 的回复:[quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote]   你是要分别显示正数和负数吗？比如 1 2 3 4 5 6 7.....  -1 -2 -3 -4 -5 ... 这样吗？还是

引用 6 楼 5250 的回复：[quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....

引用 4 楼 weixin_46673152 的回复:[quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有

这个我也想问的

引用 15 楼 5250 的回复：[quote=引用 10 楼 weixin_46673152 的回复:] [quote=引用 8 楼 5250 的回复：][quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote]   你是要分别显示正数和负数吗？比如 1 2 3 4 5 6 7.....  -1 -2 -3 -4 -5 ... 这样吗？还是[/quote]就是这样，能帮帮我吗[/quote]  引用 10 楼 weixin_46673152 的回复:[quote=引用 8 楼 5250 的回复：][quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote]   你是要分别显示正数和负数吗？比如 1 2 3 4 5 6 7.....  -1 -2 -3 -4 -5 ... 这样吗？还是[/quote]就是这样，能帮帮我吗[/quote]   发给你了 你可以参考一下[/quote]好的，非常谢谢你

引用 10 楼 weixin_46673152 的回复:[quote=引用 8 楼 5250 的回复：][quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote]   你是要分别显示正数和负数吗？比如 1 2 3 4 5 6 7.....  -1 -2 -3 -4 -5 ... 这样吗？还是[/quote]就是这样，能帮帮我吗[/quote]  引用 10 楼 weixin_46673152 的回复:[quote=引用 8 楼 5250 的回复：][quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote]   你是要分别显示正数和负数吗？比如 1 2 3 4 5 6 7.....  -1 -2 -3 -4 -5 ... 这样吗？还是[/quote]就是这样，能帮帮我吗[/quote]   发给你了 你可以参考一下

引用 13 楼 qq_1457346882 的回复：[quote=引用 12 楼 weixin_46673152 的回复:] [quote=引用 9 楼 qq_1457346882 的回复：][quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote] 只要学过不是看看就想起来了，又没用多少难得东西，直接就说不会要别人写不好吧[/quote]而且你看不见“我不会”这个留言？[/quote] 那您是看不见我说了您说您不会？不会别人给了思路有去看过怎么写？看起来觉得自己很有理？固然，您的帖子，我没有资格怎么样，您随意，但是我觉得这里别人看一下也知道谁的问题，不知道您在这义正言辞什么？[/quote]抱歉，刚才没看清楚就回复了你，语气不好，对不起

引用 9 楼 qq_1457346882 的回复：[quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote] 只要学过不是看看就想起来了，又没用多少难得东西，直接就说不会要别人写不好吧[/quote]而且你看不见“我不会”这个留言？

引用 9 楼 qq_1457346882 的回复：[quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote] 只要学过不是看看就想起来了，又没用多少难得东西，直接就说不会要别人写不好吧[/quote]大一学了一学期，现在几年了，期间又没有用过，还能记得？那我还真的很佩服你的脑子

引用 8 楼 5250 的回复：[quote=引用 7 楼 weixin_46673152 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 4 楼 weixin_46673152 的回复:] [quote=引用 2 楼 自信男孩 的回复：][quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦[/quote]  用C语言写会不会？写完之后编译，不是有一个.exe文件生成吗  终端输入ojbdump -S XX.exe > log.txt 这个里面这个C语言的所有汇编代码都有[/quote]5年没用c了，不会写....[/quote]   你是要分别显示正数和负数吗？比如 1 2 3 4 5 6 7.....  -1 -2 -3 -4 -5 ... 这样吗？还是[/quote]就是这样，能帮帮我吗

有没有人会啊

引用 2 楼 自信男孩 的回复：[quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我做做吗，我不会，谢谢啦

引用 2 楼 自信男孩 的回复：[quote=引用 1 楼 weixin_46673152 的回复:] 有没有人啊，求 可以试一下用C写，写完之后反汇编一下（就是看一下C语言的汇编形式）。[/quote]你能帮我谢谢吗，我不会