Question: 各位大佬帮帮忙，要参加答辩，系统没有报错，但运行不出来，应该是逻辑问题

#include<stdio.h> #include<stdlib.h> #include<time.h> #include <string.h>  /*参赛者姓名和参赛号码*/ struct competitor{     char Name[20];     int Num; }com[3];  /*用来配置机会次数，题量大小*/ struct config{     int chance;//用来存储每道题目机会次数     int topicNum;//用来存储题目数量 }con;  /*结构体award用于保存奖励语*/ struct award{     char good[30];     char well[20];     char cheers[20]; }award1;  int menu(struct competitor com[],int n); void chuangguan_mode(); void easy_mode(struct config con); void difficulty_mode(struct config con); int practice_mode(struct config con); void see(); void see1(); void see2(); void score();  int main() {     struct competitor com[3]={{"Li",1001},{"Wang",1002},{"Zhang",1003}};     struct config con={2,5};     struct award award1={"非常棒！","不错！加油","干得漂亮！"};  } int menu(struct competitor com[],int n) {     int i,j,x;     printf("\t\t\t\t模拟中学生计算大赛小游戏\n");     printf("\t\t*******************************\n");     /*     printf("请输入你的姓名:\n");     for(i=0;i<3;i++)     {         scanf("%s",com[i].Name);     }     printf("请输入你的参赛号：\n");     for(j=0;j<3;j++)     {         //scanf("%s",&com[i].Num);         scanf("%d", &com[i].Num);     }     */     for(i=0;i<3;i++) {         printf("请输入你的姓名:\n");         scanf("%s",com[i].Name);         printf("请输入你的参赛号：\n");         scanf("%d", &com[i].Num);    //不是%s      }     printf("\t\t*******************************\n");     printf("\t\t\t\t[1]闯关模式\n");     printf("\t\t\t\t[2]练习模式\n");     printf("\t\t\t\t[3]查看错题\n");     printf("\t\t\t\t[4]查看历史分数\n");     printf("\t\t\t\t[5]退出游戏\n");     printf("\t\t\t*****************************");     printf("请选择想要进行的操作:");     scanf("%d",&x);     switch(x)     {         case 1:chuangguan_mode();break;         case 2:practice_mode(con);break;         case 3:see();break;         case 4:score();break;         case 5:printf("期待您取得好的成绩，再见！");break;         default:printf("input error!");     }      return 0;    //要么加上这句要么int改成void }  void chuangguan_mode() {     void easy_mode(struct config con);     void difficulty_mode(struct config con);     int i;     printf("[1]简易模式");     printf("[2]困难模式");     printf("请再次输入你的选择：");     scanf("%d",&i);     switch(i)     {         case 1:easy_mode(con);break;         case 2:difficulty_mode(con);break;         default:printf("input error!");     } } void easy_mode(struct config con) {     printf("欢迎来到简易模式！");     srand((unsigned)time(0));     int a,b,c,d,i,j,p,z;     float x;     for(i=0;i<(con.topicNum);i++)     {         a=rand()%11;         b=rand()%101;         c=rand()%101;         d=rand()%101;         z=a*b+c-d;         printf("请看题：%d*%d+%d-%d=\n",a,b,c,d);         printf("请输入答案：");         scanf("%f",&x);         if(x==z)         {             printf("\t\t\t恭喜你做对了,请看下一题\n");             int y=rand()%4;             switch(y)             {                 case 1:printf("\t\t\t\t%s\n",award1.good);break;                 case 2:printf("\t\t\t\t%s\n",award1.well);break;                 case 3:printf("\t\t\t\t%s\n",award1.cheers);break;             }         }     }     for (j=0;j<(con.chance-1);j++)     {         printf("\t\t\t\t请再次输入: ");         //scanf("%d",&x);         scanf("%f",&x);    //上面定义的float，这儿为啥要用%d呢？         if (x==z)         {             printf("\t\t\t恭喜你做对了，正在加载下一题\n");             int y=rand()%4;             switch(y)             {                 case 1:printf("\t\t\t\t%s\n",award1.good);break;                 case 2:printf("\t\t\t\t%s\n",award1.well);break;                 case 3:printf("\t\t\t\t%s\n",award1.cheers);break;             }         }         else         {             FILE *fp;             if((fp=fopen("错题集(闯关模式).txt","a+"))==NULL)             {                 printf("can't open this file!\n");                 exit(1);             }             fprintf(fp,"%d=%d*%d+%d-%d\n",z,a,b,c,d);             fclose(fp);             printf("正确答案为：%d,这道题被存放在“错题集(闯关模式)中",z);         }     } } void difficulty_mode(struct config con) {     printf("欢迎来到困难模式!");     srand((unsigned)time(0));     int a,b,c,d,e,i,j,z;     float x;     for(i=0;i<(con.topicNum);i++)     {         a=rand()%11;         b=rand()%101;         c=rand()%101;         d=rand()%101;         z=a*b+c-d*2-e;    //这儿的e没有初始化哦         printf("请看题：%d*%d+%d-%d*2-%d=\n",a,b,c,d,e);         printf("请输入答案：");         scanf("%f",&x);         if(x==z)         {             printf("\t\t\t恭喜你做对了,请看下一题\n");             int y=rand()%4;             switch(y)             {                 case 1:printf("\t\t\t\t%s\n",award1.good);break;                 case 2:printf("\t\t\t\t%s\n",award1.well);break;                 case 3:printf("\t\t\t\t%s\n",award1.cheers);break;             }         }     }     for (j=0;j<(con.chance-1);j++)     {         printf("\t\t\t\t请再次输入: ");         //scanf("%d",&x);         scanf("%f",&x);    //相同的问题,同上         if (x==z)         {             printf("\t\t\t恭喜你做对了，正在加载下一题\n");             int y=rand()%4;             switch(y)             {                 case 1:printf("\t\t\t\t%s\n",award1.good);break;                 case 2:printf("\t\t\t\t%s\n",award1.well);break;                 case 3:printf("\t\t\t\t%s\n",award1.cheers);break;             }         }         else         {             printf("正确答案为：%d,这道题被存放在“错题集(闯关模式)中",z);             FILE *fp;             if((fp=fopen("错题集(闯关模式).txt","a+"))==NULL)             {                 printf("can't open this file!\n");                 exit(2);             }             //fprintf(fp,"%f=%d*%d+%d*2-%d\n", z,a,b,c,d,e);             fprintf(fp,"%d=%d*%d+%d*2-%d\n", z,a,b,c,d);   //5个%d为啥后面跟6个参数呢？             fclose(fp);         }     } } int practice_mode(struct config con) {     printf("欢迎来到练习模式");     srand((unsigned)time(0));     int a,b,c,d,e,i,j;     float x,z;     for(i=0;i<con.topicNum;i++)     {         a=rand()%11;         b=rand()%101;         c=rand()%101;         d=rand()%101;         e=rand()%10;         z=a*b+c-d/e;         printf("请看题：%d*%d+%d-%d/%d=\n",a,b,c,d,e);         printf("请输入答案：");         scanf("%f",&x);         if(x==z)         {             printf("\t\t\t恭喜你做对了，正在加载下一题\n");             int y=rand()%4;             switch(y)             {                 case 1:printf("\t\t\t\t%s\n",award1.good);break;                 case 2:printf("\t\t\t\t%s\n",award1.well);break;                 case 3:printf("\t\t\t\t%s\n",award1.cheers);break;             }         }     }     for (j=0;j<con.chance-1;j++)     {         printf("\t\t\t\t请输入 ");         //scanf("%d",&x);         scanf("%f",&x);   //问题同上         if (x==z)         {             printf("\t\t\t恭喜你做对了，正在加载下一题\n");             int y=rand()%4;             switch(y)             {                 case 1:printf("\t\t\t\t%s\n",award1.good);break;                 case 2:printf("\t\t\t\t%s\n",award1.well);break;                 case 3:printf("\t\t\t\t%s\n",award1.cheers);break;             }         }         else         {             FILE *fp;             if((fp=fopen("错题集(训练模式).txt","a+"))==NULL)             {                 printf("can't open this file!\n");                 exit(3);             }             fprintf(fp,"%d=%d*%d+%d-%d/%d",a,b,c,d,e);             fclose(fp);             //printf("正确答案为：%d,这道题被存放在“错题集(练习模式)中",z);             printf("正确答案为：%f,这道题被存放在“错题集(练习模式)中",z);    //注意z定义的类型         }     } } void see() {     void see1();     void see2();     int i;     printf("请选择错题集：");     printf("[1]闯关模式");     printf("[2]练习模式");     switch(i)   //i有初始化吗？     {         case 1:see1();break;         case 2:see2();break;         default:printf("input error!");     } } void see1() {     FILE *fp;     if((fp=fopen("错题集(闯关模式).txt","r+"))==NULL)     {         printf("can't open this file!\n");         exit(4);     }     fclose(fp); } void see2() {     FILE *fp;     if((fp=fopen("错题集(训练模式).txt","r+"))==NULL)     {         printf("can't open this file!\n");         exit(5);     }     fclose(fp); } void score() {     FILE *fp;     if((fp=fopen("历史成绩.txt","r+"))==NULL)     {         printf("can't open this file!\n");         exit(6);     }     fclose(fp); } 供参考～  逻辑问题没发现，倒是语法问题很多。楼主的main函数里有调用接口吗？如果不加调用函数，程序是什么也不会执行的，你虽然定义了。  基本语法问题是基础问题，所以建议楼主关注一下编译警告

这是一个模拟中学生算数比赛的小游戏


大佬有解决问题嘛

引用 3 楼 xiyuyan的回复:估计是所用库函数对中文兼容不好，处理中文输入输出，推荐用 中文C 之前可以输出中文的，我前几天升级了一下版本，是不是这个原因啊

估计是所用库函数对中文兼容不好，处理中文输入输出，推荐用 中文C

暂没看出有啥问题，把第一个printf中的&ch前的&去掉；


Question: c语言求助

引用 1 楼 @大愚@ 的回复:你的scanf中少了一个取地址符&,犯了低级错误。非常感谢。

你的scanf中少了一个取地址符&,


Question: 求大佬帮我解释一下getchar函数的内容，最好可以逐行解释

1 从标准输入读入BUFSIZ个字符保存到buf缓存里 2 如果缓存中没有字符（n是0，--n就会小于0）则返回EOF，否则返回*bb（缓存指针当前的字符），并且缓存指针往前移动一个地址bb++。

read函数， 读，第一个参数0是stdin，你可以理解为键盘输入 a？b：c 三元表达式， 就是 if(a) {b} else {c} 的意思


Question: error C141: syntax error near 'led', expected ')'怎么解决，跪求大佬救救我

一个明显的问题： 第22行代码后面多了“；”  代码书写风格不好，建议不要把多行代码放在一行，不好检查

知道define是干啥的吧，写在一行是几个意思

源代码发一下


Question: C语言数组问题

这个很简单，分三部，获取字符串，字符串逆序，写入文件中。这都是c的基础啊

#include <stdio.h> #include <string.h>  int main() {      char str[50]={'0'};     char res[50]={'0'};     int index = 0;     gets(str);      for (int i = strlen(str)-1; i >= 0; i--)     {         res[index] = str[i];         putchar(str[i]);         index++;     }      FILE *fp = NULL;     fp = fopen("out.txt", "w");     fputs(res, fp);     printf("\n");     printf("the file out.txt write into %s\n",res);     fclose(fp);      return 0; }

void switchString(char* arr) {     char tmp;     int len = strlen(arr);     int i = 0;     int j = len-1;     for(i=0;i<len/2;i++,j--)     {         tmp = arr[i];         arr[i] = arr[j];         arr[j] = tmp;     }  } void reverseString() {     char tmpStr[32];     scanf("%s",tmpStr);     switchString(tmpStr);     printf("%s\r\n",tmpStr); }

最好自己先写写，不论写对写错，起码自己尝试了，努力了～


Question: 输出乱码问题

多谢了


Question: 简单题

哦，知道答案了。这应该是一道古代有名的几何题。应该早就被证明过。 不过，我是独立想出来的。 取任意三点组合成一个三角形，若第四个点落在这个三角形内，那么会有六个凹四边形。

这道题有点复杂，我不会做。大致提供一下思路。 如果这个四边形是凸四边形的话，那么只有一种可能，这个应该都会做。 问题的难点在于如何判断这是一个凸四边形。 因为如果是凹四边形的话，会有一个边不等的两种可能。 盲猜涉及到这个凹四边形的夹角和第四点的坐标。  这个好像是个有名的几何题，应该有现成的模型。

4个点还能组成多种四边形？


Question: 用下面的 scanf 函数输入数据，使 a=10,b=12,c1='B',c2='b',x=2.6,y=-3.89,z=6.7，考虑在键盘上如何输入数据？

请参考《C++中printf()函数的用法7》 希望能够帮到你！

给你提供个思路，就是先输入，再输入看看最后的结果和题目中的结果是否相同


Question: 图像识别检测圆心位置

不会 让我猜猜  第一种 找出差异区(像素对比) 比对原始图  第二种 直接比对原始图

hough检测圆 根据园的方程（x－a）×（x－a）＋（y－b）×（y－b）＝R×R，将参数空间增加到a，b，R三维空间. 常用的hough变换计算量太大,然而随机hough变换虽然计算量相对小点,但是准确率没有前者高.现在使用 一种改进的方法:提取边缘图像,然后边缘跟踪,在边缘曲线上进行hough变换检测圆.  double x=0.0,y=0.0,x0=0.0,y0=0.0,cc=0.0,ss=0.0,temp1,temp2;  int aa=0,bb=0,rr=0,saveaa=0,savebb=0,saverr=0,savexx0=0,saveyy0=0,saveQ=0;  int pos = ptNumber/3;     int i = 0,off = 0,k = 0,iBaseFlag = 100,jj = 0;  int tt = 0,m=0,n=0;  int firstBase = 5;  int secendBase = (2*firstBase+1);  int aaBase = (R.right+R.left)/2 - firstBase,bbBase = (R.bottom+R.top)/2 -firstBase;  LONG minrr = 0;  minrr = (R.right - R.left)>(R.bottom - R.top)?(R.bottom - R.top):(R.right - R.left);     int memsize = (int)(minrr+2*firstBase) * secendBase *secendBase;  BYTE * lpabr = new BYTE[memsize];  memset(lpabr,0,sizeof(BYTE)*memsize);  int maxcount = -1;   /* 局部hough变换检测圆曲线段的一部分*/  for(k=0;k<ptNumber;k+=pos)  {   for(aa=(int)(R.left+R.right)/2 - firstBase;aa<=(int)(R.left+R.right)/2 + firstBase;aa++)    {        if(aa<0)      continue;     if(aa>ImageWidth)      break;     for(bb=(int)(R.top+R.bottom)/2 -firstBase;bb<=(int)(R.top+R.bottom)/2 + firstBase;bb++)     {      if(bb<0)       continue;      if(bb>ImageHeight)       break;      temp1 = (pt[k].x-aa)*(pt[k].x-aa) + (pt[k].y-bb)*(pt[k].y-bb);          rr = (int)sqrt(temp1);      if(rr>=10&&rr<=(int)(minrr/2) + firstBase)      lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)]++;      }         }    }   for(rr=10;rr<=(int)(minrr/2) + firstBase;rr++)   for(aa=(int)(R.left+R.right)/2 - firstBase;aa<=(int)(R.left+R.right)/2 + firstBase;aa++)   {    if(aa<0)     continue;    if(aa>ImageWidth)     break;    for(bb=(int)(R.top+R.bottom)/2 - firstBase;bb<=(int)(R.top+R.bottom)/2 + firstBase;bb++)    {     if(bb<0)      continue;     if(bb>ImageHeight)      break;     if(maxcount<lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)])     {      maxcount = lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)];      saverr = rr;      saveaa = aa;      savebb = bb;     }    }   } if(maxcount>=4) { //记录保存中心,半经      saverr = rr;      saveaa = aa;      savebb = bb;   }


Question: 向大牛们请教下一个简单的问题

max作为计数器，从左、右子树两边往下走，每走一层自加1，最后返回左、右中更大的数

函数的返回值难道不是int吗？


Question: 求大神帮忙

if语句只管到第一个分号，将代码用大括号括起来才管到整个代码块

for(j=i+1;j<=10;j++)                 if(a[i]>a[j])                 temp=a[i];                 a[i]=a[j];                 a[j]=temp;   FOR循环用括号括起来   以后记住了

if(a[i]>a[j]) 后面的交换操作要用{}


Question: 全局变量和局部变量同名但类型不同的情况如何分析？

引用 3 楼 better *man 的回复:[quote=引用 1 楼 自信男孩 的回复:]  printf("%d,%lf\n",a,a); double类型用%lf格式输出。  当全局变量名和局部变量名同名时，局部变量名屏蔽全局变量，即全局变量无效；  float和double类型的输出时的格式说明符都是％f呀！float型会自动转为double型，用％lf和％f结果都一样的。[/quote] 要看编译器吧，要不你自己试试，看看是否一样。

引用 1 楼 自信男孩 的回复: printf("%d,%lf\n",a,a); double类型用%lf格式输出。  当全局变量名和局部变量名同名时，局部变量名屏蔽全局变量，即全局变量无效；  float和double类型的输出时的格式说明符都是％f呀！float型会自动转为double型，用％lf和％f结果都一样的。

请参考double类型在内存中的存储 : https://blog.csdn.net/slience_j/article/details/51965009


Question: 为什么三个科目的平均分都是 0

引用 4 楼 weixin_45698079的回复:sub[j]+=stu[i].score[j]; 这句错了，你是求三个班级的六个数（科目）的sum，不是每个科目的三个班级总分，建议把stu[i].score[j]的I和j对调 不好意思 没有看懂“每个科目的三个班级总分” 一个班级 六个学生 每个学生对应三个科目的分数

引用 1 楼 自信男孩的回复:注意sub是int类型，不是float类型，建议把sub改成float类型。 找了好久谢谢！

注意sub是int类型，不是float类型，建议把sub改成float类型。


Question: 关于返回整数的getchar函数的三个问题，求大佬解答一下，万分感谢

引用 2 楼 21211321 的回复：1、你把int（一般4字节）赋值给char（1字节）当然会被截断，其余3字节就没了； 2、是，只不过有时候看不出区别； 3、EOF是结束符，跟你说的没关系。那为什么geychar的返回值类型要定义成int而不是char类型？

1 如LS所说 2 那是在能正常转换的前提下（包括强行转换），否则就会发生类型不匹配的异常 3 除了EOF（宏定义-1）外，还有一些扩展字符（详见ascii码表）在128～255区间，超出了char的-128～127的范围


Question: C 利用bitwise operator判斷是否為2的立方的倍數

if (b & (1 << a) - 1) puts("b不是p的倍數"); else puts("b是p的倍數");


Question: 程序问题

引用 3 楼 zedd3337502212 的回复:[quote=引用 2 楼 自信男孩 的回复:] 在fp为NULL的执行体里加上一句： printf("%s\n", strerror(errno)); 可以看一下打开文件失败的原因是invalid argument但我不知道咋改[/quote]  https://blog.csdn.net/hpu11/article/details/52693581 如果第二个参数还是没问题，那就不清楚了。

引用 2 楼 自信男孩 的回复:在fp为NULL的执行体里加上一句： printf("%s\n", strerror(errno)); 可以看一下打开文件失败的原因是invalid argument但我不知道咋改

看看你的 文件存在不


Question: 求助！C语言 二叉树遍历代码错误，无法正常判断空结点

30 *T==NULL;   *T=NULL

引用 1 楼 bo_self_effacing 的回复:30 *T==NULL;   *T=NULL 谢了，我瞎了


Question: 害死人不偿命的3n+1猜想问题

引用 5 楼 user-1的回复:[quote=引用 4 楼 LINUX/ 的回复:] [quote=引用 1 楼 user-1的回复:]n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。 噢，那这个条件限制不需要写了，是运行时输入的时候自己明白这个限制，避免输入违法值？[/quote]    恩，你如果真的想限制输入，可以加入判断 if(n<=0 || n>1000)  printf("输入超过范围"); [/quote] 嗯嗯，明白了，谢谢大佬的帮助。

嗯嗯，明白了，谢谢大佬的帮助。

引用 4 楼 LINUX/ 的回复:[quote=引用 1 楼 user-1的回复:]n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。 噢，那这个条件限制不需要写了，是运行时输入的时候自己明白这个限制，避免输入违法值？[/quote]    恩，你如果真的想限制输入，可以加入判断 if(n<=0 || n>1000)  printf("输入超过范围");

引用 1 楼 user-1的回复:n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。 噢，那这个条件限制不需要写了，是运行时输入的时候自己明白这个限制，避免输入违法值？


Question: 用if语句比较两个数的大小  大神求解小白

引用 1 楼 user-1的回复:%d, %d  不是  %d, d% 谢谢了。。。

%d, %d  不是  %d, d%


Question: malloc分配内存问题

引用 2 楼 bo_self_effacing 的回复:void* malloc (size_t size); If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.  当 malloc 的参数传0的时候，返回的指针为不为null 取决于具体实现，但是该指针不能被解引用。  你这里返回的明显不是null，那就是一个未定义的地址。 你后面的赋值就是在一块未定义的地址上操作。[绝对不可以的] 你这里是程序简单，所以没发现异常。 当你程序复杂，内存分布各种数据的时候你这种操作，程序很容易崩溃。 明白了，谢谢大哥，感谢。

求解，谢谢了。


Question: C语言程序编译没有问题但是控制台会报错

Elemtype* transfer = (Elemtype*)malloc(sizeof(Elemtype));  //建立一个Elemtype类型的数组      Elemtype* p = copy(s, transfer, i); //执行数组传递操作，把s传递给数组p  你申请空间不够，只申请了元素空间，i大于1时会踩内存


Question: 字母大小写转换

vs2015运行不聊，先要确认是否编译成功，vs下不支持scanf吧，应该是scanf_s

#include<stdlib.h> int main() { 	char a; 	printf("please input the character\n"); 	scanf("%c", &a); 	char ch = (a >= 'A' && a <= 'Z' ? a + 32 : a);//-------注意这行代码的修改---------- 	printf("%c", ch);     return 0; } VS2015 C++环境调试结果

兄弟，你箭头那里不应该是ch、而应该是a吧？ 还有一个，就是最好把 (a>= 'A' && a <='Z')这样用括号括起来

求大神帮助哈，箭头哪个地方会出错，怎么办

ch未定义，兄弟，你输入的保存在a中了


Question: C语言冒泡排序问题请教

引用 3 楼 qq_1457346882的回复:ｉ<n-1是要跑得外循环次数，是数组大小减一，你减ｉ会少跑很多次 对啊 蟹蟹嗷

ｉ<n-1是要跑得外循环次数，是数组大小减一，你减ｉ会少跑很多次

for(i = 0; i < max-1; i++) { for(j = 0; j < max-1-i; j++) { if(b[j] > b[j+1]) { tmp = b[j]; b[j] = b[j+1]; b[j+1] = tmp;  } } } 应该是这样的


Question: getchar（）的返回值具体是怎么把char类型转换成int类型的？

注意类型隐式提升～

引用 10 楼 weixin_45906870的回复:引用 9 楼 5250 的回复：[quote=引用 8 楼 weixin_45906870 的回复:] [quote=引用 6 楼 5250 的回复：][quote=引用 5 楼 weixin_45906870 的回复:] [quote=引用 3 楼 5250 的回复：]getchar的返回值是char类型的啊  你在疑惑什么不是的，应该是int类型   它是char字符对应的ASCII码，是个int值，但是一般用时候都用char数据取接受它，可以看一下getchar函数定义 __CRT_INLINE __cdecl __MINGW_NOTHROW  int getchar (void) {   return (--stdin->_cnt >= 0)     ?  (int) (unsigned char) *stdin->_ptr++     : _filbuf (stdin); } 这边是强制转化了char字符为int型  [/quote]为什么getchar返回值类型要用int而不是char？[/quote]   按理应用返回值应用char,但为了包含EOF，EOF是一个整型数,通常值为-1，char就装不下，就用了更大的int来装。[/quote]我是不是可以理解成整型数EOF在内存里面是1111 1111 1111 1111 1111 1111 1111 1111，一共四个字节，char只有我一个字节，所以装不下？[/quote] 你看一下这篇文章 https://www.cnblogs.com/Jack47/archive/2012/12/23/2819111.html

你可以看一下这篇文章 https://www.cnblogs.com/Jack47/archive/2012/12/23/2819111.html

引用 9 楼 5250 的回复：引用 8 楼 weixin_45906870 的回复:[quote=引用 6 楼 5250 的回复：][quote=引用 5 楼 weixin_45906870 的回复:] [quote=引用 3 楼 5250 的回复：]getchar的返回值是char类型的啊  你在疑惑什么不是的，应该是int类型   它是char字符对应的ASCII码，是个int值，但是一般用时候都用char数据取接受它，可以看一下getchar函数定义 __CRT_INLINE __cdecl __MINGW_NOTHROW  int getchar (void) {   return (--stdin->_cnt >= 0)     ?  (int) (unsigned char) *stdin->_ptr++     : _filbuf (stdin); } 这边是强制转化了char字符为int型  [/quote]为什么getchar返回值类型要用int而不是char？[/quote]   按理应用返回值应用char,但为了包含EOF，EOF是一个整型数,通常值为-1，char就装不下，就用了更大的int来装。[/quote]我是不是可以理解成整型数EOF在内存里面是1111 1111 1111 1111 1111 1111 1111 1111，一共四个字节，char只有我一个字节，所以装不下？

引用 8 楼 weixin_45906870 的回复:引用 6 楼 5250 的回复：[quote=引用 5 楼 weixin_45906870 的回复:] [quote=引用 3 楼 5250 的回复：]getchar的返回值是char类型的啊  你在疑惑什么不是的，应该是int类型   它是char字符对应的ASCII码，是个int值，但是一般用时候都用char数据取接受它，可以看一下getchar函数定义 __CRT_INLINE __cdecl __MINGW_NOTHROW  int getchar (void) {   return (--stdin->_cnt >= 0)     ?  (int) (unsigned char) *stdin->_ptr++     : _filbuf (stdin); } 这边是强制转化了char字符为int型  [/quote]为什么getchar返回值类型要用int而不是char？[/quote]   按理应用返回值应用char,但为了包含EOF，EOF是一个整型数,通常值为-1，char就装不下，就用了更大的int来装。

引用 6 楼 5250 的回复：引用 5 楼 weixin_45906870 的回复:[quote=引用 3 楼 5250 的回复：]getchar的返回值是char类型的啊  你在疑惑什么不是的，应该是int类型   它是char字符对应的ASCII码，是个int值，但是一般用时候都用char数据取接受它，可以看一下getchar函数定义 __CRT_INLINE __cdecl __MINGW_NOTHROW  int getchar (void) {   return (--stdin->_cnt >= 0)     ?  (int) (unsigned char) *stdin->_ptr++     : _filbuf (stdin); } 这边是强制转化了char字符为int型  [/quote]为什么getchar返回值类型要用int而不是char？

getchar获得的是字符的ascii码，是int类型 scanf根据你的输入格式来决定，“%c”是字符类型，“%d”是整形，“%s”是字符串等等，具体你可以参考scanf函数的文档

getchar的返回值是char类型的啊  你在疑惑什么

输入1234,已经溢出了。因为char变量只能接收一个字符，1234是4个字符。

引用 5 楼 weixin_45906870 的回复:引用 3 楼 5250 的回复：getchar的返回值是char类型的啊  你在疑惑什么不是的，应该是int类型   它是char字符对应的ASCII码，是个int值，但是一般用时候都用char数据取接受它，可以看一下getchar函数定义 __CRT_INLINE __cdecl __MINGW_NOTHROW  int getchar (void) {   return (--stdin->_cnt >= 0)     ?  (int) (unsigned char) *stdin->_ptr++     : _filbuf (stdin); } 这边是强制转化了char字符为int型

引用 1 楼 前行者001 的回复：你输入的是1234按字符格式接收的 字符时char类型， char类型变量中存储的是字符对应的ASCII码，不是字符本身， 字符'1'对应的ASCII码是49，同样字符'2'->50，字符'3'->51，字符'4'->52，你在输出的时候使用10进制，输出的是字符对应的ASCII码。那getchar呢？


Question: 内存动态分配问题

引用 2 楼 user-1 的回复:这是常见问题 函数里改变参数指针的指向，不影响函数外指针的指向 所以，要么 void init_zifu(zifu **s) //改成双指针 要么 void init_zifu(zifu *&s) //改成指针引用 要么 zifu* init_zifu() //改成返回值是指针  以最少修改量的方式 void init_zifu(zifu *&s) {     s = (zifu*)malloc(sizeof(zifu)); //先给s分配内存     s->base= (zifu**)malloc(sizeof(char*)*newsize);     if (!s->base) {         exit(-1);     }     s->top = s->base;     s->size_of_base = 0; } 谢谢大哥，一下就懂了。谢谢了。

多谢了


Question: c语言:计算1到100000的偶数和

for (i=2；i<=10000; i+=2) sum+=i;

引用 4 楼 newshou1 的回复:for (i=2；i<=10000; i+=2) sum+=i; 这个靠谱，简单，好理解～

等差数列求和公式 2+4+6+...+100000=2*(1+2+3+...+50000)=2*(50000+1)*50000/2=(50000+1)*50000

#include<stdio.h> #include<stdlib.h>  int main() { 	int i = 1; 	int sum = 0; 	while(i < 10000) 	{ 		if(i%2 == 0) 		sum += i; 		i++; 	} 	printf("%d",sum); 	return 0; }

推导公式。。。。。


Question: 编程，要求从键盘输入数据，使整型变量 a=2011,b=2012；字符型 c1='N',c2='n'；实型变量 x=3.14,y=23.45。

scanf("%d %d%c%c %f %d", &a, &b, &c1, &c2, &x, &y); 试试这样～

简单的打印用选择判断一下就行


Question: c语言请教大佬

因为是后增，优先级是高于赋值，所以要先(*--p)与++结合，把整体的值赋值给y，最后在++； 你上一个帖子还发张图片出来，这个帖子没有任何图片不好定位问题呢


Question: 萌新想有点不会的

++是后置 后置就是语句结束之后在进行自增

前自增减的优先级高于赋值，后自增减有个条件是这一行语句执行完后才会执行。先－－ｐ得到ｐ０地址，取值五，在（*ｐ）＋＋

a  = b++; 是先执行 b++； 不过 返回给a 的值是 b++ 之前的值。

引用 3 楼 qq_47279096 的回复:[quote=引用 2 楼 蜗牛千泷的回复:]* 指针p指向数组a的第1个元素a[1]  表达式：y = ( *--p )++;  1. 括号的优先级大于“++”。先运算括号内的表达式（ *--p ） 2. *与--的优先级相同，结合方向是由由到左，先运算“--” 3. --p 是前自减，所以先对指针p做移位操作，前移一个位置(int)，那么指针p指向了数组a的第0个元素a[0] 4. 然后做*的取内容操作，取得是a[0]的数据，为5 5. 下面看括号后的运算符++，这是后自增，就是先运算当前表达式，再自增，也就是先对y赋值（（ *--p ）赋值给y, 就是y = 5 ）,再自增（（ *--p ）自增，就是a[0]自增，则a[0]为6） 画重点左结合性[/quote] 你去查一下优先级表哦，看一下运算符*、--、++的结合方向

引用 2 楼 蜗牛千泷的回复:* 指针p指向数组a的第1个元素a[1]  表达式：y = ( *--p )++;  1. 括号的优先级大于“++”。先运算括号内的表达式（ *--p ） 2. *与--的优先级相同，结合方向是由由到左，先运算“--” 3. --p 是前自减，所以先对指针p做移位操作，前移一个位置(int)，那么指针p指向了数组a的第0个元素a[0] 4. 然后做*的取内容操作，取得是a[0]的数据，为5 5. 下面看括号后的运算符++，这是后自增，就是先运算当前表达式，再自增，也就是先对y赋值（（ *--p ）赋值给y, 就是y = 5 ）,再自增（（ *--p ）自增，就是a[0]自增，则a[0]为6） 画重点左结合性

后置++是要执行完这行语句才执行的


Question: 函数返回值

参数类型和返回值类型 没有任何关系 所以你的所有疑问都不成立 没必要讨论了

你贴的截图函数原型不完整，要看最前面的声明，是否是char *n_to_char(int)之类的声明。是的话表明是转为字符串。 如果是char n_to_char(int)，那就像你初始理解的，如果没有限制int范围，就会存在一个多至少的映射，会损失数据

引用 1 楼 arfi的回复:这里的char估计说的是字符串，而不是单个字符  比如IP地址，Ipv4的话，在网络传输中，使用4字节存储，而与人交流时，可能就得转成192.168.1.1之类的字符串，就不止4个字节了。 哦哦，那个字符串char返回时与int的类型是不匹配的

c里面char就表示一字节，int是4字节

因为本质上，int和char都是内存上的数据，只不过int是4个字节，char是1个字节。从本质上去看，两者互相转换没有任何问题。一些语言不让你转，是为了保护你不去搞些骚操作引起内存问题。

函数的返回值  和接受的实参类型没有关系

返回值和参数的类型没有一点关系


Question: c语言 萌新小白求指教

引用 2 楼 slanis 的回复:谢谢大神的回复； main 函数scanf这个地方运行有点问题； 请问如何修正？   有啥问题

#include <stdio.h> #include <string.h>  void StrSwap(char *x, char *y) {     for (int i = 0; i < strlen(x); i++)     {         int InputOrignalChar = 1;         for (int j = 0; j < strlen(y); j++)         {             if (x[i] == y[j])             {                 InputOrignalChar = 0;                 break;             }         }         if (InputOrignalChar)         {             putchar(x[i]);         }         else         {             putchar('*');         }     } }  int main(void) {     char str1[20], str2[10];      printf("第一文字列：");     scanf("%s", str1);     printf("第二文字列：");     scanf("%s", str2);      StrSwap(str1, str2);     return 0; }


Question: C语言十个数降序帮帮忙

int a[9]是不是要a[10]  冒泡好像也有点问题  int a[10] = {1024,10,2,35,48,92,69,17,8,19}; 	//框架 + 建立交换法 	int temp = 0,i,j; 	//控制比较的次数 	for(i=0;i<10;i++) 	{ 		//每一个数比较的轮数 		for(j=0;j<10-i-1;j++) 		{ 			//前大于后 >升序  <降序 			if(a[j]>a[j+1]) 			{ 				//内层循环 交换相邻 				//两个数的值 				temp = a[j]; 				a[j] = a[j+1]; 				a[j+1]=temp; 			}		 		}		 	}

因为你10个数据只定义了a[9]


Question: 创建二叉树中的疑惑，求解答

引用 1 楼 吴**的回复:1.使用*ptr，是你前面传参用的&root。如果直接传root，main()里面的root不会变。这是指针这块的内容 2.二叉树你可以看看原理你就清楚了 谢了，后面看到了一些很好的解释解决了问题1。有好多创建二叉树的方法，都差不多，也明白了一些。


Question: 链表的创建

引用 2 楼 自信男孩的回复:struct Node { int data; //数据域 struct Node * pNext; //指针域 }; //NODE等价于struct Node    PNODE等价于struct Node * 这个结构体声明放在上面typedef的前面试一下。  在我的环境下你的代码编译没问题，编译运行都是可以的。 我试了，也是同样的错误，所以我才定义在前面

标准不一样， typedef struct Node NODE; typedef struct Node * PNODE; 放在结构体声明后面。


Question: OJ 队列题 求解 ！！！

[color=#FFFF00][quote=引用 10 楼 user-1 的回复:]   QueCut是怎么定义的 没懂...

int PRINT(SqQueue &Q) {     int index = Q.front;   for(int i=0; i<QueCnt; i++) {     printf("%c ",Q.base[index++]);     index %= 10000; } printf("\n");      return OK; }

建议增加元素计数，否则不好判队列空和队列满 int ENTER(SqQueue &Q,char value) {     if (QueCnt >= 10000)         return;      Q.base[Q.rear++]=value;     Q.rear %= 10000;     QueCnt++;     return OK; }

你想复杂了呀，举个函数修改例子（建议参考你初始代码） int ENTER(SqQueue &Q,char value) {      Q.base[Q.rear++]=value;    Q.rear %= 10000;    return OK; }

引用 5 楼 user-1 的回复:1. 最好记录下队列中元素数目，防止front'/rear重叠后不知道是空队列还是满队列 2. 函数中front/rear在++后对10000求余 3. print函数考虑rear小于front的场景（要么分两段打印，要么同样对10000求余就行，只是循环条件写清楚，最好写成从0到队列数目。  以上改动主要就是加个求余，以实现“环形”队列操作  能再帮我看看代码吗 我看了你的建议修改了但是OJ还是不给通过 实在是不知道怎么办  #include <stdio.h> #include <stdlib.h> #include<string.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 10020  typedef char QElemType; typedef struct {     QElemType *base;//存储空间基地址     int front;//头指针     int rear;//尾指针  }SqQueue;  int INIT(SqQueue &Q) {     Q.base=new QElemType[MAXSIZE]; 	if(!Q.base)  exit(OVERFLOW); 	Q.front=Q.rear=0; 	return OK; }   int PRINT(SqQueue &Q) {      if(Q.front>=Q.rear%MAXSIZE) return ERROR;      else{     for(int i=Q.front;i<Q.rear;i++) 	{ 		printf("%c ",Q.base[i]); 	} 	printf("\n");      return OK;} }  int ENTER(SqQueue &Q,char value) {     if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;     Q.base[Q.rear]=value;    Q.rear=(Q.rear+1)%MAXSIZE;    return OK; }  int OUT(SqQueue &Q,char &value) {     if(Q.front==Q.rear%MAXSIZE)  return ERROR; 	else{ 	value=Q.base[Q.front];     Q.front=(Q.front+1)%MAXSIZE; 	return OK;}  }  int LENGTH(SqQueue &Q) {     return (Q.rear-Q.front+MAXSIZE)%MAXSIZE; }      int main(){     SqQueue Q;     int i=0;     char value;     int choice;     char s[10000],ch;     scanf("%d",&choice);      while(i<choice)     {          scanf("%s",s);         if(strcmp("INIT",s)==0) INIT(Q);          else if(strcmp("ENTER",s)==0)         {             scanf("%s",&value);             ENTER(Q,value);         }           else if(strcmp("LENGTH",s)==0) printf("%d\n",LENGTH(Q));         else if(strcmp("PRINT",s)==0) PRINT(Q);         else if(strcmp("OUT",s)==0) OUT(Q,value);    i++;      }      return 0; }

好的 十分感谢  引用 5 楼 user-1 的回复:1. 最好记录下队列中元素数目，防止front'/rear重叠后不知道是空队列还是满队列 2. 函数中front/rear在++后对10000求余 3. print函数考虑rear小于front的场景（要么分两段打印，要么同样对10000求余就行，只是循环条件写清楚，最好写成从0到队列数目。  以上改动主要就是加个求余，以实现“环形”队列操作

引用 1 楼 user-1的回复:异常考虑不完善，你要把队列当一个环来处理。 假设塞满10000数据，弹出一个，再塞入一个，你的rear++不就越界了吗？  所以各个函数都要考虑求余，考虑rear反转的情况！ 那请问我得用什么办法解决比较合适，我对这方面也是刚在学，谢谢你的回答。


Question: 求大佬们告知我getchar和scanf函数的区别

首先 getchar()，如果没错，是获取输入的一个字符，然后putchar是输出一个字符，1和2是可以换的吧，你自己改程序运行一下就知道了。 然后scanf也是输入，按两次enter是指？


Question: 程序出问题求解答

引用 2 楼 N-n-N 的回复:把ave(a[5])改成ave(a)看看，因为a[5]是传递a数组中的第5位，而不是数组a感谢  成功了

ave() 的参数 是 float*  你传的 a[5] 是float ； 改成 ave(a)


Question: C语言入门遇到个棘手的问题急求解决

x = x/2;  int类型会自动只保留前面的整数位，可能是这儿错了。（float）x = (float)x / 2;

VS 2015 下跑，没问题

不应该用int类型，涉及除法了，用float吧。


Question: 为什么malloc申请的空间free后，指针变量的地址还存在？？而且还能再次使用？如果一直malloc，free，那岂不是最后内存也会用尽？？？

1.free 和 delete 内存释放是释放的指针指向的内存, 指针本身不会被你释放，在这里指针本身属于自动变量，会在程序块执行完后释放内存； 2.释放只是那块内存可以用作其他，并不会主动给你清理内存的数据，所以每次申请内存后最好设置一下初始值来覆盖以前的值； 3.p 指向的内存被释放了，但是你还可以利用p来操作那块地址，虽然可行，但这是一个未定义的操作，危险的操作，即访问一块未分配的内存空间，这里没出问题因为你刚分配过，释放后接着访问，而且只访问int大小的空间，如果你执行 *(p++) 之类的操作就可能引发严重的问题；  所以一般 释放指针指向的内存后 需要 p = NULL; 来将指针指向NULL 表示以前那块内存不再可用。  野指针 百度百科: 野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。 指针变量未初始化 任何指针变量刚被创建时不会自动成为NULL指针，它的缺省值是随机的，它会乱指一气。所以，指针变量在创建的同时应当被初始化，要么将指针设置为NULL，要么让它指向合法的内存。如果没有初始化，编译器会报错“ ‘point’ may be uninitializedin the function ”。 指针释放后之后未置空 有时指针在free或delete后未赋值 NULL，便会使人以为是合法的。别看free和delete的名字（尤其是delete），它们只是把指针所指的内存给释放掉，但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL，防止产生“野指针”。

楼上正解，说得很详细了，释放之后逻辑地址依然在那，只是你不应该人为去修改它，应该交由操作系统管理，后续再malloc使用，但是不能保证下次malloc到的一定是这个地址，不过对于用户来说这个并不重要，毕竟是逻辑地址而不是物理地址。

通常我们访问的逻辑地址，你申请或者不申请，地址都在那里，你就可以往里面放东西。  但是，你得知道该地址是个有效地址，否则就可能程序崩溃（比如，你往地址为1的内存写入东西）  内存释放后，当前没有别人在用它，所以你仍然用了，但是这算是非法访问。针对多线程的程序来说，可能别人把这个内存地址刚给申请了，而你改写了他的东西，就会导致他那边出异常。


Question: 一道数据结构的问题

我用的是栈啊

这是栈的基本应用

可否在我的基础上进行修改呢？当然有更好的办法也可以请大佬们提出来，谢谢啦

引用 1 楼 user-3 的回复:感觉好复杂的样子，我觉得定义个数组，一次判断符号就好了左边加右边减，最后判断是不是０，０就配对可能会交叉使用，如【（6+9】*6），这样就不是匹配的了


Question: 文本的读写位置问题

引用 1 楼 棉猴 的回复：getc()函数的作用是从流中读取一个字符，如果读完这个字符后没有读到流的最后一个字符，此时调用其他读写数据流函数（例如fprintf()等函数）时，就会报错。只有当getc()函数读取了数据流中的所有元素后，getc()函数才会释放对流的占用。 如果您代码中的“123.txt”是空文件时，您使用getc()函数后，再使用fprintf()函数写入数据，此时就会写入成功，原因是调用一次getc()函数就已经把流中的所有数据都读完了（因为是空文件），此时getc()函数就释放了对流的占用。 如果“123.txt”中的内容大于1个字符，此时只调用一次getc()无法读取完流中的数据，可以考虑使用fseek()函数将流指针移动到最后位置，然后再次调用getc()，之后getc()函数就释放对流的占用，再次调用fprintf()函数就可以写入成功了。 	FILE * fp; 	long pos; 	int bytes;  	fp = fopen("123.txt", "r+"); 	if (fp == NULL) 	{ 		fprintf(stderr, "Can't open file 123.txt.\n"); 		exit(EXIT_FAILURE); 	} 	getc(fp); 	pos = ftell(fp); 	printf("当前文件位置:%ld\n", pos); 	fseek(fp, 0L, SEEK_END);//-------将流中光标位置移动到最后--------- 	getc(fp);//---------------再次读取，使得getc()释放流------------ 	bytes = fprintf_s(fp, "new words"); 	if (bytes>0) 		printf("测试数据写入成功!\n"); 	else 		printf("测试数据写入失败!\n");     return 0; VS2015 C++环境调试 你好，getc函数占用流，应该是输入流吧，和输出流应该没关系吧。


Question: 结构体指针调用成员时vs2017总说不能指向不完整的类类型

楼上正解，楼主对结构体概念不清

创建一个指针,指向struct st类型.struct st*pst1;你的结构类型是struct st,哪里是struct st1呢? st表示结构模板,st1表示表示结构变量.


Question: 关于段错误的问题，为何if语句判断会出错

p_mov = p_mov->next; 因为这句在if(id == p_mov->id)之前，当p_mov->next是NULL时，再if判断不就是段错误了吗？


Question: 输出一个字符串中所有长度为5的子串

引用 2 楼 折腾的小飞 的回复:引用 1 楼 N-n-N 的回复：for 循环每一位，然后开始计数i，空格截止，如果i=5，就从i-5开始到i输出能写个具体的代码吗？用数组实现  string a="xxxxxx xxxx xxxx xxxxx"; int each=0; for(int i=0;i<length(a);i++){ if(a[i]!=" ")each++; if(a[i]==" "){ if(each==5){ for(int x=5;x>=0;x++){  cout<<a[i-a]; } cout<<endl; } else{ each=0; } } }  大概是这样子，纯手打的，有可能有错

%.5s 跑一圈就完事了


Question: c语言基础知识

引用 18 楼 千面人像的回复:问问题要过脑子 ：尼玛的... 没毛病，兄弟加油，

引用 5 楼 自信男孩的回复:注意输入格式里逗号的中英文。你输入的逗号好像是中文的，而代码里的是英文吧。 我还真没注意

对的，我太难了哈哈谢谢

引用 14 楼 bo_self_effacing的回复: 我这执行一切正常 ， 我就说没这么怪，我在linux上执行也对的，现在vs跑也对的，我只能想到你输入的符号不对了 检查下输入法吧，再奇怪一点难道是你控制台的输入编码有问题， 我没法拉  好的，谢谢你了，还真是符号不对，哈哈哈😬😬

引用 11 楼 bo_self_effacing的回复:[quote=引用 10 楼 加油编程 的回复:] [quote=引用 9 楼 bo_self_effacing的回复:][quote=引用 6 楼 加油编程 的回复:] [quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号[/quote] 还是不行，换了英文逗号，或是直接不用逗号，结果都是一样的[/quote] 把你整个代码贴出来 我复制到vs里跑一下试试呢[/quote] 粘贴了，哈哈哈，太难了

include <stdio.h> int main() {     int day,month,year,sum,leap;     printf("\n请输入年、月、日，格式为：年,月,日（2015,12,10）\n");     scanf("%d,%d,%d",&year,&month,&day);  // 格式为：2015,12,10     switch(month) // 先计算某月以前月份的总天数     {         case 1:sum=0;break;         case 2:sum=31;break;         case 3:sum=59;break;         case 4:sum=90;break;         case 5:sum=120;break;         case 6:sum=151;break;         case 7:sum=181;break;         case 8:sum=212;break;         case 9:sum=243;break;         case 10:sum=273;break;         case 11:sum=304;break;         case 12:sum=334;break;         default:printf("data error");break;     }     sum=sum+day; // 再加上某天的天数     if(year%400==0||(year%4==0&&year%100!=0)) {// 判断是不是闰年         leap=1;     } else {        leap=0;     }     if(leap==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天         sum++;     }     printf("这是这一年的第 %d 天。",sum);     printf("\n"); }

引用 10 楼 加油编程 的回复:[quote=引用 9 楼 bo_self_effacing的回复:][quote=引用 6 楼 加油编程 的回复:] [quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号[/quote] 还是不行，换了英文逗号，或是直接不用逗号，结果都是一样的[/quote] 把你整个代码贴出来 我复制到vs里跑一下试试呢

引用 9 楼 bo_self_effacing的回复:[quote=引用 6 楼 加油编程 的回复:] [quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号[/quote] 还是不行，换了英文逗号，或是直接不用逗号，结果都是一样的

引用 6 楼 加油编程 的回复:[quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号

引用 1 楼 user-5的回复:sum垃圾值  所以sum+day 没意义 先给sum赋值就可以了 sum赋值后那个错误确实没了，但是输出结果报错

引用 1 楼 user-5的回复:sum垃圾值  所以sum+day 没意义 先给sum赋值就可以了 sum赋初值了，没报错但是结果还是有错误

引用 2 楼 bo_self_effacing的回复:我怀疑你是不是输了中文逗号 不能吧老哥哈哈

注意输入格式里逗号的中英文。你输入的逗号好像是中文的，而代码里的是英文吧。

你好，变量定义要养成初始化的好习惯哟

sum没有初始化

我怀疑你是不是输了中文逗号

sum垃圾值  所以sum+day 没意义 先给sum赋值就可以了


Question: 求大佬拯救C语言萌新！！！

一维数组去用二维数组的第一行填充。然后固定ｎ比较就好了  #include <stdio.h> #define M 5 #define N 6 void fun(int t[M][N],int p[N]){         int i=0,j=0;         for(i=0;i<N;i++){                 p[i]=t[0][i];         }//赋值，如果你会指针可以直接指向第一行         for(j=0;j<N;j++){             for(i=0;i<M;i++){                 if(p[j]>=t[i][j])                 {                     p[j]=t[i][j];                 }             }         } } int main(){     int i=0;int j=0;     int t[M][N]={};     int p[N]={};     for(i=0;i<M;i++){         for(j=0;j<N;j++){                 scanf("%d",&t[i][j]);         }     }     fun(t,p);     for(i=0;i<N;i++){         printf("%d ",p[i]);     }     printf("\n");     return 0; }   楼上直接定义ｍ也是一个原理，就是为的后面的比较

随手写了一个，参考一下吧  #define M 5 #define N 6 void fun(int t[M][N], int p[N]) {     int r, c, m;     for (c=0; c<N; c++)     {         m = t[0][c];         for (r=1; r<M; r++)         {             if (t[r][c] < m)              {                  m=t[r][c];             }         }         p[c] = m;     } }   int main() {     int r, c, t[M][N]={0}, p[N]={0};     for (r=0; r<M; r++)      {         for (c=0; c<N; c++)          {             scanf("%d", &t[r][c]);         }     }     fun(t, p);     for (c=0; c<N; c++)         printf("%d ", p[c]);       return 0; }


Question: 求出二维数组每列中最小元素，并依次放入一维数组p中。

一维数组去用二维数组的第一行填充。然后固定ｎ比较就好了  #include <stdio.h> #define M 5 #define N 6 void fun(int t[M][N],int p[N]){         int i=0,j=0;         for(i=0;i<N;i++){                 p[i]=t[0][i];         }//赋值，如果你会指针可以直接指向第一行         for(j=0;j<N;j++){             for(i=0;i<M;i++){                 if(p[j]>=t[i][j])                 {                     p[j]=t[i][j];                 }             }         } } int main(){     int i=0;int j=0;     int t[M][N]={};     int p[N]={};     for(i=0;i<M;i++){         for(j=0;j<N;j++){                 scanf("%d",&t[i][j]);         }     }     fun(t,p);     for(i=0;i<N;i++){         printf("%d ",p[i]);     }     printf("\n");     return 0; }  楼上直接定义ｍ也是一个原理，就是为的后面的比较

for example #define M 5 #define N 6 void fun(int t[M][N], int p[N]) {     int r, c, m;     for (c=0; c<N; c++)     {         m = t[0][c];         for (r=1; r<M; r++)         {             if (t[r][c] < m)              {                  m=t[r][c];             }         }         p[c] = m;     } }  int main() {     int r, c, t[M][N]={0}, p[N]={0};     for (r=0; r<M; r++)      {         for (c=0; c<N; c++)          {             scanf("%d", &t[r][c]);         }     }     fun(t, p);     for (c=0; c<N; c++)         printf("%d ", p[c]);      return 0; }


Question: 为什么我线程池5个线程，打印ready ,weakup总有时候只有3,4次，然而执行print任务函数却5个线程都执行？？？

引用 5 楼 bo_self_effacing 的回复:[quote=引用 4 楼 adlatereturn 的回复:] [quote=引用 3 楼 bo_self_effacing 的回复:] while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印 你说的对，线程还没进来。那还有别的好的处理方式吗？？？[/quote]  阻塞肯定得阻塞的， 就算你用锁也是阻塞的，我的话可能会在 init 后面加： void prdpool_init(int num) {     trdpool=malloc(sizeof(trdpool_t));     pthread_mutex_init(& trdpool->mutex,NULL);     pthread_cond_init(& trdpool->cond,NULL);           trdpool->status=0;     trdpool->phead=malloc(sizeof(pthread_t)*num);     trdpool->num=num;     for(int i=0;i<num;i++)         pthread_create( trdpool->phead+i,NULL,start_routine,NULL);    lblready:     遍历检查封装的 线程结构 { pthread_t a, char state } 就不只是你现在的 pthread_t *phead   在线程拿到锁后就可以state = 1 表示准备好了     {        if(state == 0)            //usleep(...) 要不要sleep看你             goto lblready;        } }[/quote]懂了谢谢！

引用 4 楼 adlatereturn 的回复:[quote=引用 3 楼 bo_self_effacing 的回复:] while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印 你说的对，线程还没进来。那还有别的好的处理方式吗？？？[/quote]  阻塞肯定得阻塞的， 就算你用锁也是阻塞的，我的话可能会在 init 后面加： void prdpool_init(int num) {     trdpool=malloc(sizeof(trdpool_t));     pthread_mutex_init(& trdpool->mutex,NULL);     pthread_cond_init(& trdpool->cond,NULL);           trdpool->status=0;     trdpool->phead=malloc(sizeof(pthread_t)*num);     trdpool->num=num;     for(int i=0;i<num;i++)         pthread_create( trdpool->phead+i,NULL,start_routine,NULL);    lblready:     遍历检查封装的 线程结构 { pthread_t a, char state } 就不只是你现在的 pthread_t *phead   在线程拿到锁后就可以state = 1 表示准备好了     {        if(state == 0)            //usleep(...) 要不要sleep看你             goto lblready;        } }

引用 3 楼 bo_self_effacing 的回复:while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印 你说的对，线程还没进来。那还有别的好的处理方式吗？？？

引用 1 楼 bo_self_effacing 的回复:prdpool_init(5);  //这里sleep(1) 暂停一下 等 线程全部趴在cond_wait那里了 再执行下面的 addwork也会和他们抢锁  for(int i=0;i<200;i++)         add_work(); 争锁是一回事 打印是另一回事，那个sleep(1)的确可以打印出5条，但是没有sleep的情况下这些线程也是去执行了work却没有打印ready和weakup!!!岂不怪哉！！！


Question: 求求大佬们告诉我I/O的原理

刚翻了下书 <<UNIX 环境高级编程>> 第三版 讲的很详细啦，你这里写入文件应该是全缓冲模式了，不是行缓冲所以只是加换行符没用的。

引用 7 楼 lin5161678 的回复：[quote=引用 6 楼 bo_self_effacing 的回复:] 避免行缓冲: a.setvbuf(文件描述符[例如 stdout 标准输出],NULL,_IONBF,0) 禁止缓冲区的使用 b.调用 fflush(stdout) 刷新缓冲区 c.行尾添加换行符 首先 fputs不是行缓冲  就算是 看清楚代码是带\n的[/quote]嗯，没看仔细，这里换行符是不能解决问题，我试了一下，前两种方法是可行的。

引用 6 楼 bo_self_effacing 的回复:避免行缓冲: a.setvbuf(文件描述符[例如 stdout 标准输出],NULL,_IONBF,0) 禁止缓冲区的使用 b.调用 fflush(stdout) 刷新缓冲区 c.行尾添加换行符 首先 fputs不是行缓冲  就算是 看清楚代码是带\n的

引用 3 楼 weixin_45906870 的回复:为什么按了enter键就能运行下去？难道enter键可以刷新缓冲区吗？ 这个不一定要按enter键，按任意键都可与你 getchar会阻塞程序（也就是程序停止往下执行），等待用户一个键盘输入

引用 2 楼 丁劲犇 的回复：文件不关闭的时候，是要缓存一定量在内存后，才真的写盘的。 改成  //... fputs("I love FishC.com!\n", fp); fflush(fp); getchar(); //...  就好了。不过这样在写入大量细碎数据时，性能很糟糕。为什么按了enter键可以运行下去？难道enter键可以刷新缓冲区吗？

引用 1 楼 chxchxkkk 的回复：getchar();等你按键才运行下去，否则卡在这里为什么按了enter键就能运行下去？难道enter键可以刷新缓冲区吗？

getchar();等你按键才运行下去，否则卡在这里


Question: 结果出现这种1.#INF00是怎么回事啊大佬们

50阶乘太大了  int存不下


Question: 《C Primer Plus》中的一个问题：为什么应使用long类型而不是int类型？

为什么用32位，都64位了，long8字节，int4字节，

引用 楼主 zaixiankaifa 的回复:在<<C Primer Plus>> P48：“如果在long类型和int类型占用空间相同的机器上编写代码，当确实需要32位的整数时，应使用long类型而不是int类型，以便把程序移植到16位机后仍然可以正常工作。”  难道使用了int类型之后，程序移植到16位机后就不可以正常工作了？对呀 16位机器的int不是32bit的

看这个链接 int 标准中 至少保证16位 而 long 至少保证32位

请试一下再这么说

一般公司代码，都要封装数据类型int、long为其他的，比如uint32, uint64等  这样就不用了考虑整体替换了，最多在重定义的时候修改下uint32/uint64

这已经不适用了，在当前64位机器上，long就是8字节，明确指定short才是2字节(16位)


Question: 链表怎么实现先输入先输出

恭喜恭喜，是否结贴送分呢？

恭喜恭喜！！！

void CreateList_L(LinkList &L,int n){ 	LinkList p,tail; 	L=(LinkList)malloc(sizeof(LinkList)); 	tail=L; 	for(int i=1;i<=n;i++){ 		p=(LinkList)malloc(sizeof(LNode)); 		printf("请输入数据元素:"); 		scanf("%d",&p->data); 		tail->next=p; 		tail=p; 	} 	tail->next=NULL; }摸索出来了


Question: 结构体相关程序

是不是scanf输出函数的问题，应该为都加&

职务，年份  输反了

引用 1 楼 ?Victor.?? 的回复:53行怎么用了逗号分隔  应该是分号吧不是这个问题。。改了也一样

把sex[]调大点试试，或者输入时输入不超过2字符，留出结束符位置

53行怎么用了逗号分隔  应该是分号吧


Question: 文本读写写不进去

引用 10 楼 arfi 的回复：你写之前，是不是得先 fseek到文件末尾呀不到文件尾写不进去是吗？那我想在某处位置写文本怎么办呢？

你写之前，是不是得先 fseek到文件末尾呀

引用 7 楼 ?Victor.?? 的回复：有空格，回车时  需要循环输入，输出没太理解你的意思，意思是要写入两次才能正常写入吗，fscanf()后，此时读写位置在回车处。

有空格，回车时  需要循环输入，输出

引用 3 楼 m0_46108109 的回复：不是不是，我说错了。r+可以写。听听其他人意见。我猜是文件流标记出现了问题。读写位置在换行符的位置，似乎写不进去

引用 4 楼 ?Victor.?? 的回复：操作是正确的呀 就是写不进去

操作是正确的呀

不是不是，我说错了。r+可以写。听听其他人意见。我猜是文件流标记出现了问题。

引用 1 楼 m0_46108109 的回复：你好像理解错r+的含义了。这块挺乱的，自己看函数手册。 大致是r是读，w是写，a是追加，加号的含义好像是对前面三个字母的增强。很奇怪，如果不读取文本中数据，直接写，能写的进去。


Question: C语言程序设计问题

字符串结尾加上\0

引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:p=c -> strcpy(p,c)改过后两个平台运行后都有问题。。

p=c -> strcpy(p,c)


Question: 时间复杂度

引用 楼主 user-0的回复:给定问题，给定平台，对于解决同一问题的两个算法A和B 1、如果A的时间复杂度比B的大，执行时间一定比B长？ 2、如果时间复杂度相同，执行时间相同吗？ 刚学，求大神讲一下 感觉没有可比性，算法A的一步的执行时间和算法B的一步的执行时间可能不同，比较大O，只能比出来增长率，比不出来不同算法的执行时间吧？


Question: OJ的SIGSEGV错误（Dev C++正常运行）

void AddNode(List &list, int dt){     Node *pNode = create_Node();     pNode->data = dt;      if (list.head == NULL){         list.head = create_Node();        //无用代码，导致内存泄漏         list.head = pNode;         list.length = 1;     }     else{         Node *pt = create_Node();        //无用代码，导致内存泄漏         pt = list.head;         while (pt->next != NULL)             pt = pt->next;         pt->next = create_Node();        //无用代码，导致内存泄漏         pt->next = pNode;         list.length++;     } }

我现在的电脑没有编译器, 不好调试。不过这个代码有明显问题      List** node_lists = new List*[n + 1];         for (int i = 1; i <= n; i++){         node_lists[i]->head = NULL;         node_lists[i]->length = 0;         AddNode(*node_lists[i], i);     }  node_lists[i]是一个List*指针，本身是不是没有分配啊。可以仔细看看。另外，这个代码AddNode存在多次create，以及内存泄漏。


Question: c程序设计问题

引用 5 楼 TorresFans 的回复: 你对指针的理解有问题，不是p的地址会自动移动。 p存的是int型地址，p+1 表示p指向的地址向后移动4个字节。 但是图中没看到有对p进行移位的语句啊

加上头文件  <stdlib.h>  15行之后加上  p=(int*)malloc(15*sizeof(int));  最后加上free(p);

需要给指针p分配内存

引用 3 楼 TorresFans 的回复:#include<stdio.h>  void main() { 	int a[15],i,*p; 	for(i=0;i<15;i++) 	{ 		scanf("%d",&a[i]);		 	} 	for(i=0;i<15;i++) 	{ 		p = (a+14-i);	 		printf("%d\n",*p);	 	} 	 }为啥p = (a+14-i)中指针p的地址会自动移动？


Question: C语言：PlaySound函数为什么编译不正确

用的是devc++吗，换个编译器试试看

引用 1 楼 user-2的回复:指定winmm.lib路径了吗？例如gcc xx -lwinmm 貌似没有，能说具体一点吗

指定winmm.lib路径了吗？例如gcc xx -lwinmm


Question: c语言指针问题（大二菜鸟）

后置++是先运算再++，也就是说下次调用的时候才++。

引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:a=(++(*p)); 这样写 引用a=(*p)++; 在C语言里面都是未定义行为 结果没意义

VS2017也跑11。可能GCC编译器结果是00。 后置++运算符优先级高于=，所以最后一步才应该是给a赋值为0，按理说结果是00。 https://c.runoob.com/compile/11 在线编译，结果是00。 年轻人别浪费时间研究这些，尽量避免这种写法（不同编译器结果不同）。

什么编译环境？VS2015跑11

a=(++(*p)); 这样写


Question: 一个有点懵的问题

同学记得结贴给分

引用 5 楼 user-2的回复:extern这个关键字是告诉编译器：我这个东西是在别的地方定义，请不要给我再分配空间了。 但是，你得告诉它定义时的完整信息。你定义的是 float variable; 则就需要告诉它类型。 编译器不同，默认的数据类型可能就不同，比如extern g;这个g有可能就会默认成int类型。 学了编译原理可能你就知道了，类型不同，将可能导致编译器无法找到符号。 一些弱的编译器，会直接报错。 不好意思这么晚结

引用 7 楼 TorresFans 的回复:同学记得结贴给分抱歉抱歉，刚玩没多久还不知道这个功能

将程序模块化真是打开了新世界

成功了，真的非常感谢！Emmmm,请问一下为什么要加上float呢？extern不是已经告诉编译器这个heg是什么东西了吗？

extern heg;改为extern float heg;

引用 5 楼 user-2的回复:extern这个关键字是告诉编译器：我这个东西是在别的地方定义，请不要给我再分配空间了。 但是，你得告诉它定义时的完整信息。你定义的是 float variable; 则就需要告诉它类型。 编译器不同，默认的数据类型可能就不同，比如extern g;这个g有可能就会默认成int类型。 学了编译原理可能你就知道了，类型不同，将可能导致编译器无法找到符号。 一些弱的编译器，会直接报错。 谢谢，知道了


Question: 请问该截取子串函数为什么不能运行

引用 1 楼 user-2的回复:其实，你的代码在输入处理时就出现问题了。 for (i=0;s[i]!='\0';i++);  这一句就好几处问题。 1.  s这个数组你如果定义的是全局变量的话，编译器一般会给初始化为0，即数组的每个元素都是0。如果定义的是局部变量的话，则不会被初始化，也就是所分配的栈空间里的脏数据。关于堆和栈的概念，全局和局部的概念，如果不明白的话，可以找找书看看，这些是基础。 也就是说，你写的代码中，i=0时，s[i]就已经是0了('\0'这个字符就是0的意思) 2。 分号(;)不可以乱用，分号表示语句结束的意思。 你在for语句后面直接写分号，表示for语句执行循环条件判断和i++，直到条件结束，不做其他的事情。 这个for结束时，i=0。（你的例子里） 3. 上面的for彻底结束后，才会去执行scanf("%c",&s[i]);而且它是跟你的for语句是同一个层次的，因为你把for用分号结束了。 这一句执行后，s数组的第i=0个元素被设置了一个字符。s数组其实就是长度为1的字符串了。 所以，你想从index=3开始，取得length=5的子串，按照你的代码处理，自然没有结果了。  我想，你是想： 1. 先输入一段字符串。这个应该是 scanf("%s", s);  %s是表示输入的是字符串    如果使用%c一个字符一个字符的话，就需要结束条件了，比如代码要变成类似下面这样：   int i;   char c;   i = 0;    scanf("%c", &c);    while( c != 'e' && i < MAX-1) { /* 输入字母e就结束。这个字母你随便指定，但不能是'\0'，因为这个需要按组合键输入，系统不同，没准输入不了 */      s[i++] = c;      scanf("%c", &c);    }   s[i] = 0; /* 字符串末尾加上0 */  2. 剩下就是调用你的代码去处理字符串了。  作为学生，练习题怎么写都可以，在实际的商业开发中，你的这些代码写法是完全不可以的。 那么，学生该学什么呢？ 其实，就是 “原理”二字，知道每种语言的它的内部处理机制，这也是编译器的最基本功能。 了解了基本原理之后，再掌握这样语言的书写特性，最后，结合不断的经验，就能写出好的代码了。  现在，语言繁多，每种都有其优缺点，要学会抽取其精髓，就是"原理"，然后，就可以快速写出代码了。 十分感谢，感觉懂了很多

楼上点评精辟


Question: zint源码怎么进行交叉编译？

引用 1 楼 自信男孩 的回复：看一下readme和config配置文件。里面会提到编译器解压文件里没有config配置文件，它是用cmake进行编译的，我在cmakelists.txt里面也没看到提到编译器

看一下readme和config配置文件。里面会提到编译器


Question: C 时间复杂度

你好，推荐阅读我这篇博客，将会让你成为班上最靓的仔。

时间复杂度，其实是根据你的代码执行的次数决定的 次数一般随着规模增大而增大，这种增大的过程可以用一个方程表示 一般是 A*N^a+B*N^b+......+常数项，这样的多项式。 那么只取最高次的数据来确定时间的复杂度，并把他的常数项去掉 比如 3n^2+2n+3 那么这个多项式的复杂度是O(n^2)

引用 2 楼 m0_463737261616 的回复:[quote=引用 1 楼 自信男孩的回复:]for(i=0;i<n;i++ 一共执行了n次呢？楼主怎么算的？时间复杂度就是O(n)呢 i=0一次  i<n执行了n+1次 i++执行了n次 我把他们都加起来了是2n+2 刚学，还很迷糊[/quote]  时间复杂度大致分为 O(1)   O(logn)  O(n)   O(nlogn)   O(n^2)   O(n^3)   O(2^n)几种。 你所说的 2n+2 属于N的常数倍，也归入 O（N）中

大多数情况下，问题基本操作的原操作是指最深层循环内的语句中的原操作，它的执行次数和包含它的语句的频度相同。语句的频度指的是该语句重复执行的次数，   原操作是指固有的数据类型的操作，可以理解为变量类型所支持的基本运算，比如算数预算 +，-，*，/；赋值运算，逻辑运算等 题中原操作为 ：sum += i;

引用 1 楼 自信男孩的回复:for(i=0;i<n;i++ 一共执行了n次呢？楼主怎么算的？时间复杂度就是O(n)呢 i=0一次  i<n执行了n+1次 i++执行了n次 我把他们都加起来了是2n+2 刚学，还很迷糊


Question: 一个问题

引用 10 楼 大娱乐家cpy的回复:你好。getchar() !=b条件在getchar() ==b时判为假，因为b是ASCII码为6的字符，所以getchar() 拿到ASCII码为6的字符是循环终止。 但是        他没有终止 一直在执行 用什么样的方式输入才可以让他判定为假呢？

引用 8 楼 weixin_44930231 的回复:[quote=引用 7 楼 N-n-N的回复:][quote=引用 6 楼 weixin_44930231 的回复:] [quote=引用 4 楼 N-n-N的回复:]把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下[/quote]特殊字符好像是可以输入的，或者像楼上那样/006那种试一下[/quote] 不行，还是判定为真。[/quote]可以在百度上搜asciii码6代表什么，然后复制进去“”（这个是我找的）这个应该有用吧

引用 7 楼 N-n-N的回复:[quote=引用 6 楼 weixin_44930231 的回复:] [quote=引用 4 楼 N-n-N的回复:]把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下[/quote]特殊字符好像是可以输入的，或者像楼上那样/006那种试一下[/quote] 不行，还是判定为真。

引用 6 楼 weixin_44930231 的回复:[quote=引用 4 楼 N-n-N的回复:]把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下[/quote]特殊字符好像是可以输入的，或者像楼上那样/006那种试一下

引用 4 楼 N-n-N的回复:把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下

挺有趣的所以想了解一下

把b值换一个就好了，为什么一定要特殊字符

你可以试试用转义8进制输入试试 即输入 \006 试试看 那你为啥非要用一个不可显示的字符作为输入结束判断呢？

引用 1 楼 user-3的回复:你查查看ascii码为6的字符是什么？ https://wk.baidu.com/view/07394e1b52d380eb62946d59?pcf=2 这个是非显示字符，要特殊方法输入的 你好，可否说明一下是用什么样的方法输入


Question: fputs的第一个参数是字符型地址吗？为什么可以是字符串？

引用 1 楼 user-3 的回复：你表面看是个常量字符串，实际上是个指向常量字符串的指针，就好像下面的代码 char *str = ”test” 等号左边是个指针，等号右边是个字符串，字符串为啥能赋给指针？这和你的问题是一样的。所以其实你看到的字符串，是一个指向该字符串的指针而已。那只向该字符串的这个指针是不是没有名字？

字符串是首字符的地址,跟数组名一个道理.

一个经常被挂在嘴边却很容易忽视的常识 C没有字符串类型 C风格字符串指的是0结尾的char数组 根据这一点 其实  "123456789\n"是一个数组 fputs(数组,....) 常见操作了

引用 1 楼 user-3 的回复：你表面看是个常量字符串，实际上是个指向常量字符串的指针，就好像下面的代码 char *str = ”test” 等号左边是个指针，等号右边是个字符串，字符串为啥能赋给指针？这和你的问题是一样的。所以其实你看到的字符串，是一个指向该字符串的指针而已。非常感谢


Question: C语言编程题

我写过一篇博客专门写有这类问题

我写过一篇博客专门写有这类问题

#include <stdio.h>   int main()  {  	char a[10];  	for(int i=0,j=0;i<10;i++,j++)  	a[i]=65+j;//数组赋值A到J    	int n;  	scanf("%d",&n);//输入n   	int m,k;  	for(m=0;m<n;m++)  	{ 	 for(k=0;k<m;k++) 	 printf(" "); 	 int b=0; 	 for(k=m;k<n;k++,b++) 	 printf("%c",a[b]); 	 printf("\n");}//输出上三角形    }


Question: 请问我这个判断回文的程序哪里有问题，为什么输入12321也会输出不是回文。

#include<stdio.h> #include<string.h> int main() {     char a[100];     int i,j,n,m=0;      fgets(a, 100, stdin);     n = strlen(a);     if (n < 100)    //for '\n'         n = n - 1;     for(i=0;i<n/2;i++)     {         if(a[i] != a[n-1-i])         {             m=1;             break;         }     }     //if(m=1)     if(m==1)         printf("不是回文");     else         printf("是回文");     return 0; } 供参考～

兄嘚，书写格式要注意哦

m==1 m=1是赋值，基础还要看看吧..

1、m的初始值和你判断不是回文的值一样，那么不管是不是回文，都会输出“不是回文”，m的初始值可以改成m=0或者其他； 2、格式还是要多注意，if(m==1)。


Question: PAT 人口普查测试点 测试点0，1，4为啥错误

测试点0的错误原因是啥啊？我的就是测试点0通不过  #include<iostream> using namespace std; #include<string>  struct xinxi{     string name;     string time; }s[100010],s1,s2;  int main(){     int N;     cin>>N;     for (int i=0;i<N;i++){cin>>s[i].name>>s[i].time;}          int count=0;     s1=s[0];s2=s[0];//s2表示年长者，s1表示年轻者     for (int i=0;i<N;i++){         if (s[i].time>="1814/09/06"&&s[i].time<="2014/09/06"){             count++;             if (s1.time<=s[i].time){s1=s[i];}             if (s2.time>=s[i].time){s2=s[i];}         }     }          cout<<count;     if (count!=0){cout<<" "<<s2.name<<" "<<s1.name;}          return 0; }

建议直接贴源码～


Question: c[警告]不兼容指针类型的赋值不知道为什么

#include<stdio.h> #include<string.h> #include<stdlib.h>  struct answer{      int number;      //struct anwser *next;     struct answer *next;  };  struct answer *first,*second,*mid;  int main(){      int m,n,q,i,z=1;      scanf("%d %d %d",&n,&m,&q);      first=(struct answer *)malloc(sizeof(struct answer));      first->number=1;      mid=first;      for(i=2;i<=q;i++){          second=(struct answer *)malloc(sizeof(struct answer));          second->number=i;          mid->next=second;       //这句报错我感觉没什么问题啊   报c[警告]不兼容指针类型的赋值          mid=second;      }      return 0; } 供参考～  单词拼写错误～另外函数缺少大括号～

struct answer{  int number;  struct r anwse*next; 注意红字

感觉没啥问题，用的什么编译器


Question: matlab新手求助  程序如下 单个带进去的结果N和程序计算不一样 不知道哪里出错了 求大神帮忙解答

你这是不是少了个R变量

引用 1 楼 user-3 的回复:直接上代码吧，这伪代码看不明白 。。。。。。。。。。

直接上代码吧，这伪代码看不明白


Question: 求助！！！c语言使用变长的数组来实现逆序输出

思路要理清楚   #include <stdio.h> #include <malloc.h>  int _tmain(int argc, _TCHAR* argv[]) {   const long iInc = 10; //缓冲区增量   long *p = NULL, *pn; //缓冲区指针   long iItem=0; //数据个数   long iBufLen=0; //缓冲区个数   long tmp;    printf("Please input value, -1 for exit\n");   while(scanf_s("%ld", &tmp) == 1  && tmp != -1)   {     //个数超过缓冲区大小     if(iItem >= iBufLen)     {        //分配缓冲区       if((pn = (long*)realloc(p, (iBufLen+iInc) * sizeof(long))) != NULL)       {         //记录缓冲区个数         iBufLen += iInc;         //更新数据指针         p = pn;       }       else       {         //分配缓冲区失败         printf("alloc memory failed\n");         break;       }     }      //追加数据     p[iItem++] = tmp;   }    //逆序输出   if(p && iItem > 0)   {     printf("Reverse order output is:\n");      //pn指向最后一个数据     pn = p + (iItem-1);      for(tmp=0; tmp<iItem; tmp++, pn--)     {       //1行10个数据       if(tmp && (tmp%10==0)){ printf("\n"); }        //输出数据       printf("%ld ", *pn);     }   }    //结束清理   if(p)   {     free(p);     p = NULL;   }    return 0; }

for(i=n+10-1;i >= 0;i--)           printf("%d\t",*(p+i));   逆序输出


Question: 关于使用VC6调用openssl遇到的问题

自己顶一下，求求大佬解惑

你查查，根据你的编译器

引用 3 楼 自信男孩 的回复:应该是缺少动态库，你看看你的openssl库在哪？ C:\OpenSSL-Win32\lib\VC 这应该就是动态库的路径吧

已解决，手动添加了 #pragma comment(lib,"libcrypto32MD.lib")  #pragma comment(lib,"libcrypto32MDd.lib")  #pragma comment(lib,"libcrypto32MT.lib")  #pragma comment(lib,"libcrypto32MTd.lib")  #pragma comment(lib,"libssl32MD.lib")  #pragma comment(lib,"libssl32MDd.lib")  #pragma comment(lib,"libssl32MT.lib")  #pragma comment(lib,"libssl32MTd.lib") 但为什么在目录中添加了相关lib路径还是需要自己手动添加呢

应该是缺少动态库，你看看你的openssl库在哪？

再来顶一下


Question: 关于数组问题

1.  nums[3] = temp; 为什么会第0到1位会是1     从程序看，程序里数组数据移位时，并没有对nums[0]进行赋值操作，所以nums[0]的数据仍然是之前的输入值1  2. nums[i] = nums[i-2];  数组访问越界     for循环i == 1 时，nums[i-2] >> nums[-1] 访问越界，访问到nums数组前一段内存，这段内存的数据是不确定的，可能是16，也可能是其他值，你换个时间段运行，或者做一通其他操作，运行出来的数据也可能会不一样的。     你可以调试看一下内存数据，或者定义一个指针，指向nums数组前一个地址（int），获取一下该内存地址的数据就清楚了  PS：一定要万分注意数组的访问越界问题，一定要避免，以免出现不必要的错误。数组可以通过下标取余的方法来访问：数组名[ 下标值 % 数组长度]

你也知道是越界了   至于为什么是16 这是一个多余的问题 输出17一样问为什么17 没为什么 没必要讨论  别越界就没这破事了

最好贴代码出来

nums[3] = temp; 为什么会第0到1位会是1 nums[i] = nums[i-2]; 越界是，第一位为什么会输出个16而不是其他的数


Question: C语言没有源文件头文件

在源文件位置右键选择新建一个.c文件就可以了

创建工程后，需要自己添加文件


Question: 萌新想问这是递归嘛？看不懂，害。

刚刚问大佬们了，说是什么二层链表。还告诉俺是用define定义的，此贴终结，撒花。源代码来自linux内核

自己踩自己一下


Question: 求教！自定义函数 不提前声明时

是不是调用了自带的max函数

引用 4 楼 akari10032 的回复：隐式声明默认返回值是int，这个特性已经在c99中被废弃了啥意思 麻烦解释一下

隐式声明默认返回值是int，这个特性已经在c99中被废弃了

引用 2 楼 m0_46351125 的回复:[quote=引用 1 楼 ?Victor.?? 的回复：]所以应该提前声明  或者把main函数放到后面嗯 谢谢 但是我想知道为啥出现一个能用一个不能[/quote]  编译器的问题，vc++应该是比较老的  正常编译器直接报错不给过

引用 1 楼 ?Victor.?? 的回复：所以应该提前声明  或者把main函数放到后面嗯 谢谢 但是我想知道为啥出现一个能用一个不能

所以应该提前声明  或者把main函数放到后面


Question: 新手创建单链表的时候，后面的结果都输出不出来了，没有报错。求助大神。

引用 1 楼 自信男孩 的回复：#include <stdio.h> #include <malloc.h>  #define MAXSIZE 100  typedef struct LNode {     int data;     struct LNode *next; }LNode,C,*head;  void createlianbiao(LNode *&C) {     int a[3];     int i,j,k;     printf("请输入：\n");     for(j=0;j<3;j++)     {         scanf("%d",&k);         a[j]=k;     }     printf("a[3]=");     for(j=0;j<3;j++)     {         printf("%d",a[j]);     }     printf("\n");      LNode *s,*r,*z;     //到这里程序就停止了     C=(LNode *)malloc(sizeof(LNode));     r=C;     C->next=NULL;     for(i=0;i<3;i++)     {         s=(LNode*)malloc(sizeof(LNode));         s->data=a[i];         r->next=s;         r=r->next;     }     r->next=NULL;     //z=(LNode *)malloc(sizeof(LNode));     z = C->next;     printf("输出为=");     for(int i=0;i<3;i++)     {         printf("%d",z->data);         z=z->next;     } } //void main(LNode *&C) int main() {     LNode *C;     createlianbiao(C);     printf("结束\n"); } 供参考～ 建议注意下main函数的定义。另外自定义函数里，z不需要申请空间～谢谢大佬！我自己弄了很久都不知道错在哪里，现在终于可以了！感谢🙏！


Question: 求助大佬，编译ntp源码时报错的问题,CCLD sntp 是什么意思，CCLD 是哪个命令？

不知道哪里有问题，能否告知怎么解决？

楼主问题解决了没，碰到同样的问题，

不用客气，可以关注我的博客，咱们随时交流。

感谢大佬

从你发送的信息来看，CCLD sntp是makefile打印出来的跟踪语句，CCLD是编译器的link指令，生成可执行文件，sntp应该是目标或者伪目标。 从整个图片看，就是链接过程，有些函数的引用，找不到实现，可以用编译器nm指令查看。


Question: 能帮我看一下问题出在哪里吗 实在找不出谢谢

引用 8 楼 qq_46905382的回复:[quote=引用 4 楼 棉猴的回复:]VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试  我的for后面多了分号 谢谢！[/quote] 不好意思 我看了的  谢谢

引用 4 楼 棉猴的回复:VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试  我的for后面多了分号 谢谢！

for后面多了分号 谢谢！

引用 4 楼 棉猴 的回复:VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试   int*x和int x[]有什么不同吗? 但数据名做为形参时自动退化成指针吧。

循环多分号了。

。。。谢谢！

第一个for循环后面也多了个分号

第二个for循环后面多了个分号


Question: 请问这是什么意思？

引用 2 楼 qybao的回复:char s1="I am a student." //应该是这里警告，把字符串的地址赋给了字符（也就是把地址转成整形赋给了char类型） 另外，copy_partstr(p1,p2,a,b); //a，b哪来的？ 谢谢 ！# define a 8

引用 1 楼 與蘤舊縐的回复:char s1="I am a student."  看看少了什么 可以了 谢谢！

char s1="I am a student."  看看少了什么


Question: 学生管理系统,双向链表结构,在最后进行字符串比较时出了一点小问题

楼主，他们类型不同啊，num[IDLen]类型是char，而p->stu.id类型是char*，你不能这么判断是否相等。


Question: C语言素数判定（二维数组，自定义函数）求改错

引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <time.h>  int ss(int num) {     int flag=0,i;     for(i=2;i<num;i++)     {  if(num%i==0)         {  flag=1;             break;         }     }     return flag; }  int main(void) {     //int   i=0,j,a[100][2],count=0;     int   i=0,j,a[100],count=0;     int ret;      srand(time(0));     for(;i<100;i++)     {         a[i] = 50 + rand()%151;         if ((ret = ss(a[i])) == 0)                 count++;         printf("a[%d]=%d %d\n", i, a[i], ret);     }     printf("\n这组数据中共有%d个素数。",count);     return 0; } 供参考～  不用考虑的那么麻烦，另外，函数参数建议楼主多去了解一下 好的，谢谢你


Question: 求大佬

我一般管理系统，做了有几百个了，类数组的，链表的，vector的，从来没见过还要用二叉树来做管理系统的，这玩意根本不搭。 二叉树一般不是要搞个什么前序中序后序吗，你们老师脑子咋想的。

就是需要一个二叉树算法的实例，就是个可视化的东西

图书管理系统为什么要用二叉树，完全扯不上边。或者你想用bst来做搜索？


Question: 求解答关于指针和malloc的题

兄弟，你这拿来主义不太好啊，起码你要先想一想、写一写啊。


Question: C\C++文件边读边写

我知道首先要用读写分离区操作这个文件

引用 3 楼 真相重于对错 的回复:你可以使用内存映射文件，把文件当内存来使用 大佬，我刚网上搜了一下文件当做内存映射使用机制，有点复杂

[quote=引用 2 楼 user-2 的回复:] 同一文件指针可行，读取和写入都会改变位置偏移量，写入时移动位置偏移量到最后，写完后进行刷新立即保存到文件，读取时保存文件读取的位置偏移量，下次读取时从该位置偏移量进行读取。 不同文件指针自行测试（应该必须加锁）。[/quo  有代码么，老哥

你可以使用内存映射文件，把文件当内存来使用


Question: 文件新建失败的问题

引用 4 楼 m0_46196884 的回复:[quote=引用 1 楼 yukint的回复:]头文件没包含？ 你一定要学会看编译报错说明。 编译报错invalid arguement,我理解成语法错误，不知道对不对[/quote] ============所谓 invalid arguement,翻译过来是什么，非法的参数， 那就是参数的问题，编译器一般还会告诉你是第几行出这样的问题，你没仔细去看罢了 你的代码中充斥着这类问题。  char* pstrs = NULL;     gets(pstrs);//gets的原型是什么?===>char *gets(char *s);，//这个参数类型对了，可是你的ptrs是NULL，空指针，你没有内存来容纳gets取出来的字符；，你可以把ptrs定义成数组，比如char ptrs[1024];       FILE* ptest = NULL;          if((ptest = fopen(ptest,"w")) == NULL){//ptest是文件指针，fopen是打开文件，不是打开文件指针 //函数原型FILE *fopen(const char *path, const char *mode); ，第一个参数是char *， 你却传给他FILE *，所以错误了          printf("打开文件失败\n");         perror("");   再解释下去有些繁琐，，好多东西需要解释，比如文件操作的这些库函数， 你应该怎么去理解他们，他们为你提供什么？你要告诉他们一些基本信息，以便让这些函数完成你交代下去的任务。。。

引用 6 楼 m0_46196884 的回复:[quote=引用 3 楼 自信男孩的回复:]char* pstrs = NULL;     gets(pstrs); 还没到打开文件的那步就会段错误了。因为pstrs指向了NULL，对于指向NULL的理解还是有问题的。NULL的位置是不可读不可写的，那么gets是往pstrs里写，所以一定会出现段错误。 所以，不是文件打开的问题，而是指针的使用错误。 那我初始化指针前，是不是应该定义NULL为0？[/quote] 不需要。NULL是(void *)0.

引用 3 楼 自信男孩的回复:char* pstrs = NULL;     gets(pstrs); 还没到打开文件的那步就会段错误了。因为pstrs指向了NULL，对于指向NULL的理解还是有问题的。NULL的位置是不可读不可写的，那么gets是往pstrs里写，所以一定会出现段错误。 所以，不是文件打开的问题，而是指针的使用错误。 那我初始化指针前，是不是应该定义NULL为0？

那我初始化指针前，是不是应该定义NULL为0？

引用 1 楼 yukint的回复:头文件没包含？ 你一定要学会看编译报错说明。 编译报错invalid arguement,我理解成语法错误，不知道对不对

首先把  char *pstrs = NULL  改成  char pstrs[256];  否则gets(pstrs)的参数是空指针，会发生非法内存操作错误  其次把 if((ptest=fopen(ptest, “w”))!=NULL) 改成 if((ptest=fopen(”文件路径字符串”, “w”))!=NULL)  否则fopen的参数同样是空指针，肯定找不到路径，就会打开文件失败

头文件没包含？ 你一定要学会看编译报错说明。


Question: 各位大佬耽误你们一分钟时间！为什么给变量赋了0值，变量不是0.

引用 2 楼 user-1 的回复:你把代码发全不行么应该是数组空间分配不足导致的

引用 2 楼 user-1 的回复:你把代码发全不行么我已经断点了，就在初始化后面，总之谢了，兄弟，问题解决了

你把代码发全不行么

自顶！！！！！！


Question: C语言基础知识

引用 1 楼 user-2的回复:在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1 好的，懂了哈哈

引用 3 楼 user-2的回复:因为%s的scanf不会接收换行符，也就是你虽然按了回车，但str并没有能把回车读进来，所以回车符就还留在输入缓存里。而%c会任意字符，所以刚好把残留在缓存区的换行符的读进来了。所以要用getchar来清空残留的换行符，否则%c读进来的数据就不对了。 懂了，谢了老哥

引用 1 楼 user-2的回复:在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1 ok，好的谢谢

标准输入流，是行缓冲，就是你调用scanf，虽然你可以通过格式串去吸取你要的字符， 但是底层实现上，没办法严格限制用户按照你所需要的格式，精确的控制用户输入。 用户可以随意输入，行缓冲的意思是，你按回车之前的一整行，都会读入到一个缓冲区。 你可以把缓冲区看成一个文件，回想下你读文件的时候，有一个什么？位置，你当前的文件指针的附属信息。 ------------------------ 而scanf函数就类似于fread（fd，。。。）函数，scanf也有一个潜在的位置指针，在缓冲区（类比文件）中移动， 指示读到哪里了，（具体看scanf的帮助文档，你需要了解这个函数的机制，才知道你指定的格式串，在特定的输入串中， 以怎样的方式推进这个位置指针）！！！！特别是一些格式串对空白符（空格，tab，换行）的处理， 特别地：比如%c，一次就析取一个字符出来，不管是什么字符，然后指针向前推进1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 假如你两次调用scanf，他一定会触发（弹出）两次用户输入界面吗？ 不一定的，这取决于第一次的scanf，是否把缓冲区的内容析取完了，类似于文件指针，读到文件尾。 ---------------------------------- 在有限的范围内，至少在你初步学习C语言的时候，你的输入都是小心翼翼的按照你的需求进行的 这种时候scanf确实是很强大的，，但是前提你要弄懂他，很仔细的去了解。 1.看文档，2.写程序验证你的猜测。 ----------------------------------- https://linux.die.net/man/3/scanf 如果你是在linux或者类似的环境里 直接man scanf就可以获得。 windows应该也有一套相关的开发帮助文档 你可以搜索scanf msdn https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms860361(v=msdn.10) 这个相对简陋些就是了，没有写那么详细

引用 1 楼 user-2的回复:在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1 为什么得加一个，getchar（），能再解释一下吗大哥😂😂


Question: C语言scanf循环赋值进入死循环了

哦，我懂了，谢谢各位！

引用 2 楼 自信男孩 的回复:因为除了第一个m[0]之外，for循环判断都是i+1的值，所以即使输入的是m[i]是大于等于16的，m[i] < 16判断的i是i+1了，不是输入的第i个值。理解了吗？  #include<stdio.h> int main() { int i; int m[17]={0}; printf("请输入m项的值");  for(i=0;m[i]<16;i++)    {    scanf("%d",&m[i]);   }    } 供参考～  发错代码了，应该是下面的： #include<stdio.h> int main() {     int i;     int m[17]={0};     printf("请输入m项的值");      //for(i=0;m[i]<16;i++)     for(i=0;;i++)     {         scanf("%d",&m[i]);         if (m[i] >= 16)             break;     } }

你给前一个元素赋值但是后一个元素没有值你就判断是不是小于16了


Question: 关于printf的一个小疑问

你试试把字符串改成“%123d@”还能正常打印吗？你做的只不过是printf("aaabb")为什么不能省略参数？


Question: C语言简单编程

引用 1 楼 user-3的回复:第一题分成分子分母来看第二题是一个求进制位上数字的算法建议看看我博客 深奥的样子

引用 3 楼 Jacob Cai的回复: #include <stdio.h> #include <stdlib.h>  int main() {     int n;     int i;     double data = 0;     printf("\n*************************\n");     printf("请输入一个奇数：");     scanf("%d", &n);     if(n%2 != 0)     {         for(i = 1; i <= n; i ++)         {            data += pow(-1, i + 1) * 1 / i;         }         printf("data: %f\n", data);     }     else     {         printf("请输入奇数");     }     printf("\n*************************\n");      int a[5];     for(i = 0; i < 5; i++)     {         printf("请输入第%d个数字：", i + 1);         scanf("%d", &a[i]);     }     printf("你输入的数组为：");     for(i = 4; i >= 0; i--)         printf("%-6d\t", a[i]);     printf("\n*************************\n");  }   好的，谢谢你

引用 2 楼 狐帝的回复:第1题： int n; scanf("%d", &n); float factor = -1.0; float data = 0.0; for(count = 1; count <= n; count ++) {    data += -1 * factor * 1.0 / count; } printf("data: %f\n", data);  第2题：把这个5位数字当做字符数组处理，每一位数字是字符数组中的一个字符，将这个字符数组倒排即可。 好像第二句运行的时候显示错误😢😢

第一题分成分子分母来看第二题是一个求进制位上数字的算法建议看看我博客


Question: 卷子小题目！！

引用 4 楼 chxchxkkk 的回复：楼上的说法是对的，printf应该放在循环体后面问题解决了谢谢，没看清题目并没有括号 printf输出最后结果

引用 3 楼 與蘤舊縐 的回复：打印问题？？  最后答案应该是13654问题解决了谢谢，没看清题目并没有括号 printf输出最后结果

引用 2 楼 自信男孩 的回复：应该把那条printf放到外面吧。不然输出的结果是 1 13 136 1365 13655问题解决了谢谢，没看清题目并没有括号 printf输出最后结果

楼上的说法是对的，printf应该放在循环体后面

打印问题？？  最后答案应该是13654

所以你的结果是什么  按该程序的思路确实应该得到13654


Question: c语言求众数

引用 2 楼 qq320277 的回复:可能可以用数组，但代码是什么呢 对，你的代码呢？

可能可以用数组，但代码是什么呢


Question: C语言中。如何从文本中读取汉字到结构体中？

文本文件都是以字符串的形式保存，先读出字符串，打印看看，保证读出的数据正确。 然后，转换成需要的数据类型。

首先声明我也不太懂哈。我也不怎么用控制台。随便说说 你都写到文本文件里了，都是文本，再读出来怎么可能是结构体？如果是UNICODE，需要在文件头先写入0XFEFF，那样就不会有乱码了。

引用 1 楼 自信男孩的回复:看你的文件格式，另外贴出你的代码吧 谢谢提醒，第一次发帖没经验

引用 楼主 m0_46235144的回复:将一个名单读入到结构体中，如果用fscanf %s的形式读入的是乱码！这个应该如何从txt文本中读取汉字 #include<stdio.h> #include<process.h> #define MAX 1024 struct student { 	int no; 	char name[30]; 	char dao[30]; }stu[29]; int main() { 	FILE *fp; 	if((fp=fopen("C:\\Users\\47390\\Desktop\\名单.txt","r"))==NULL) 	{ 		printf("定位失败"); 		getchar(); 		exit(0); 	} 	int a[30]={0},i=0; 	char str[30];  	for(i=0;i<29;i++) 	{ 		fscanf(fp,"%d %s",&a[i],&stu[i].name); 		stu[i].no=a[i]; 		fgets(str,sizeof(str),fp);   		printf("%d %s\n",a[i],stu[i].name ); 	}     	return 0; }

以二进制格式保存文件，然后以二进制格式读取试试看

看你的文件格式，另外贴出你的代码吧


Question: 为什么这个冒泡排序不能排序？我以前也是这么写的

引用 1 楼 與蘤舊縐 的回复:思路没问题  程序大体没问题  这时候你就得想想到底什么地方有问题  这时你得到了j始终为5的错误  你离成功就只差一步  查看该行for j=……，看看后面多了什么 有一说一刚刚开始我没理解你说的啥意思，，，我发现问题后终于明白了，，这错误太...

引用 3 楼 自信男孩 的回复:你的for循环后面多了一个分号；检查一下第二层for循环后是不是少了一个分号～ ！！发现了....这错误太低级了.....

引用 2 楼 神童i 的回复:第一张图片的冒泡排序怎么感觉也有问题呢。 我以前也是这么写的一点问题都没有

你的for循环后面多了一个分号；检查一下第二层for循环后是不是少了一个分号～

第一张图片的冒泡排序怎么感觉也有问题呢。


Question: 想知道这个程序为什么在devc++能运行在vc++6.0中无法运行 。谢谢！

引用 2 楼 真相重于对错的回复:开头加上#include "stdafx.h" 试过了 好像还是不可以 按另一位提供的方式是可以的 将int i放到第一个printf之前可以 谢谢

引用 4 楼 自信男孩的回复:贴出错误吧，应该就是不同编译器检查规则不一样。 试着把i, j的声明定义放在数组定义之后，第一个printf之前。遵循先定义后使用，并且，定义在前～ 编译通过了 谢谢

引用 1 楼 自信男孩的回复:程序暂未发现什么问题，楼主所说的无法运行是编译不通过，还是结果不对？  编译器不一样，语法检查也可能有所差异～ 编译没通过。

开头加上#include "stdafx.h"


Question: 如何给简单c程序添加背景图

#include "windows.h" HBITMAP hbitmap=NULL; //加载一张bmp图片  void LoadMyBitmap( char* FileName ) { 	hbitmap = LoadImage( NULL, FileName, 0, 0, 0, LR_LOADFROMFILE ); } //在控制台窗口上绘制之前加载的图片  void DrawBitmapInConsole( void ) { 	BITMAP bitmap; 	GetObject( hbitmap , sizeof(BITMAP), &bitmap );  	HWND hwnd = GetConsoleWindow(); 	HDC hdc = GetDC( hwnd ); 	HDC mdc = CreateCompatibleDC( hdc ); 	SelectObject( mdc, hbitmap ); 	BitBlt( hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, mdc, 0, 0, SRCCOPY ); 	ReleaseDC( hwnd, hdc ); 	DeleteDC( mdc ); } int main( void ) { 	LoadMyBitmap( "背景.bmp" );	 	while( 1 ) 	{ 		DrawBitmapInConsole(); 		Sleep(300); 	} 	return 0; }  效果如下（设置控制台窗口上）：   准备一张bmp图片，将它的文件名（不和exe同一目录则用绝对路径或相对路径）传给LoadMyBitmap。绘图前这样加载一次就行。然后循环时每次先调用一次DrawBitmapInConsole()。这两个函数你照抄就行了。效果不是很好。对于控制台窗口宽高和图片不符的情况，你可以用MoveWindow或system函数修改控制台窗口的大小以适应图片。

undefined reference to `__imp_GetObjectA'    请问这个怎么解决？

链接gdi32这个库

[Error] invalid conversion from 'HANDLE {aka void*}' to 'HBITMAP' [-fpermissive]这怎么办

控制台添加背景图建议使用GDI绘图 由GetConsoleWindow和GetDC获取画图设备 再由LoadBitmap或LoadImage加载图片,然后绘图  不过这样的话文本输出只能用TextOut或DrawText了

C++ Builder简单电话簿Demo例子v1.11

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

你好，控制台添加背景图这怕不是小白能搞得，你需要基于对话框的应用程序，比如Qt或Vc，而不是控制台应用程序。

添加背景图有点难度，起码需要图片解析，改变颜色是可行的。 能控制显示信息，主要是gdi模块在起作用，更下面是通过像素操作framebuf空间。如果需要添加图片，最好使用gui框架，如：mfc，minigui，qt等等。

改变控制台背景颜色及输出信息颜色 《VS2015中修改控制台背景及输出字体颜色》 类似如下图  希望能够帮到你！

如果你想改背景颜色，是可以的，但是你写的再长也是控制台程序，想添加背景图，就得做图形开发啦，学学Qt或C++Builder，不行的话Python简单

这只是个控制端程序，运行时调出来的背景可不是C代码控制的。 如果是觉得不好看，想做成界面化得，你得用那种java, C++ builder等支持图形化编程的工具

改变背景颜色还容易些，放个背景图比较复杂


Question: VSC常规变量赋值无效

引用 1 楼 user-1 的回复:还是贴代码出来吧 过了几个小时又能运行了。。。我晕了

还是贴代码出来吧


Question: 这啥用c语言实现连续四个空格转换成tab，我的代码在oj上显示presentation error

#include <stdio.h> #include <stdlib.h> int main() {     int c,i;     int flag = 1;      while((c=getchar()) != EOF) {         if (c == ' ') {             if (flag == 0)                 i++;             else                 i = 1;             //i=1;             /*             while((c=getchar())==' '){                 ++i;                 if(i==4){                     printf("\t");                     i=0;                 }             }             */             flag = 0;             if(i==4) {                 printf("\t");                 i = 0;             }             //printf("%*s",i," ");             //putchar(c);         }         else{             flag = 1;             putchar(c);             i=0;         }     }     return 0; } 供参考～

引用 楼主 weixin_46841697 的回复:printf("%*s",i," "); printf有这个用法吗 应该是printf("%d ",i);吧


Question: 指针报错，希望大神赐教。

while(fgets(str[i],10,fp) != NULL )     {         printf("%s",str[i]);         i++;     }   注意下i的值是否>=3了？如果大于等3了，那么就是数组越界了～

你写文件的函数，写完文件后没有close关闭文件，估计文件还没真正存储在磁盘上，所以读的时候可能还是空文件。 WriteToFile的getchar之后或则之前加上 fflush(fp); //缓存写到磁盘 fclose(fp); //关闭文件  另外，你的MAXSIZE是多大？你写文件的时候输入了什么内容，有没有大于10个字符？因为你读文件每次只取10个字符，如果文件没行的内容大于10，则你循环里的 i 就像LS说的，有可能大于3，造成数组越界


Question: 【求助】字符统计统计不进去，到底是哪里的错      泪奔

你函数islower（）在哪呢

你这 i 都没有初始化，if和else if估计都没进入，又或者进入了一个分支以后，i 的值还一直不变 这道题你把它复杂化了，其实可以简单一些 #define N 300 int main() {     int n[N],max[N],i,cnt=0;     char ch[N],a[N];     while (cnt<N)     {         if (gets(a) == NULL) break;         memset(n, 0, sizeof(n));         ch[cnt] = 0;         max[cnt] = 0;         for (i=0; i<strlen(a); i++)         {             if(isalpha(a[i]))             { //只考虑英文字母的情况                 n[a[i]]++; //相同字符出现次数累加                 if (n[a[i]] > max[cnt])                 { //如果出现次数大于max，则更新max和ch                     max[cnt] = n[a[i]];                     ch[cnt] = a[i];                 }                 else if (n[a[i]] == max[cnt])                 { //如果出现次数和max相同，则更新ch为更小ascii的字符                     if (ch[cnt] > a[i])                         ch[cnt] = a[i];                 }             }         }         cnt++;     }     for (i=0; i<cnt; i++)     {         printf("%c %d\n",ch[i],max[i]);     }     return 0; }

引用 1 楼 Master Chicken 的回复:你函数islower（）在哪呢 在头文件<ctype.h>中～

#include<stdio.h> #include<ctype.h> #include<string.h>  //#define N 300 #define N 300 int main() {     //int n[N]= {0},max,i, j;     //char a[N],ch;//,j;      int n[52] = {0}, i;     int ch, max;     char a[N];      while(fgets(a, N, stdin)!=NULL)     {         i = 0;         //puts(a);         while (a[i]) {             //putchar(a[i]);             if (isupper(a[i]))                 n[a[i]-'A']++;             if (islower(a[i]))                 n[a[i]-'a'+26]++;             i++;         }         max = n[0];         for (i = 1; i < 52; i++)             if (max < n[i]) {                 max = n[i];             }         printf("max = %d\n", max);          for (i = 0; i < 52; i++)             if (max == n[i]) {                 if (i >= 26)                     ch = 'a' + (i - 26);                 else                     ch = 'A';                 break;             }          printf("%c %d\n", ch, max);          memset(n, 0, sizeof(n)); #if 0             if(isalpha(j)!=0)          if(islower(a[i])!=0)         {             for(j='A'; j<='Z';j++)                 for(i=0; i<strlen(a); i++)                     if(a[i]==j)                         n[j]++;         }         else if(isupper(a[i])!=0)         {             for(j='a'; j<='z';j++)                 for(i=0; i<strlen(a); i++)                     if(a[i]==j)                         n[j]++;         }         ch='A',max=n[ch];          for(j='A'; j<='z';j++)             if(isalpha(j)!=0)             {                 if(n[j]>max)                     max=n[j],ch=j;                 else if(n[j]==max&&j<ch)                     max=n[j],ch=j;             }         printf("%c %d\n",ch,max); #endif     }      return 0; } 供参考～


Question: C语言一个小问题求解！

#include <stdio.h> struct Test { 	int NUM; 	char NAME[10]; }; int main() { 	Test test[3]; 	for (int k = 0; k < 3; k++) 	{ 		scanf("%d", &((test + k)->NUM));//---------注意，test+k是指针，所以要用->符号----------- 		scanf("%s", test[k].NAME); 	} 	return 0; } 输入为  最后test数组的值是

test是结构体，还是结构体指针呢，是结构体显然+k是不成立的。

谢谢！！！！

scanf("%d",&((test + k)->NUM));


Question: 关于relloc函数的，可编译不能运行，麻烦大佬看看问题出在哪了（C和指针十一章编程练习3））

引用 5 楼 自信男孩 的回复:#include<stdio.h> #include<stdlib.h>  char *readstring(void); int main(void) {     char *str = readstring();     if(str == NULL)         printf("error\n");     else         printf("%s\n",str);     if (!str)         free(str);     return 0; }  char *readstring(void) {     char *array,*p;     char *ptr;     int length = 0;      ptr = (char *)malloc(sizeof(char) * 32);     if (!ptr)         return NULL;     fgets(ptr, 32, stdin);     array = (char *) malloc (sizeof(char));     //if (ptr == NULL || array == NULL)     if (array == NULL)         return NULL;     while(*(ptr + length) != '\0')         length++;     array = (char *) realloc (array,(length + 1) * sizeof(char));     if(array == NULL)         return NULL;     for(int i = 0; i < length; i++)         array[i] = *(ptr + i);     array[length] = '\0';     p = array;     //free(array);      return p; } 供参考～  内存还没用完不要着急释放，释放了概念就是这部分空间不用了，但是在main函数里还会输出，那就是还在用。

引用 1 楼 user-2 的回复:ptr未配置空间 将char *ptr改为char ptr[256]; 然后将ptr == NULL改为*ptr == NULL 一直以为是realloc的时候出问题了。。。谢谢

引用 2 楼 自信男孩 的回复:array = (char *) malloc (sizeof(char)); gets(ptr); 申请一个字节，输入一个字符就会导致内存溢出～ 为什么下面的方法可以运行呢 char *readstring(void) { 	char *array; 	char *ptr; 	int length = 1; 	array = (char *) malloc (sizeof(char)); 	gets(ptr); 	if (ptr == NULL || array == NULL) 	{ 		return NULL; 	} 	while (*ptr != '\0' ) 	{ 		length++; 		array  = (char *) realloc (array , length * sizeof(char)); 		if (array == NULL) 			return NULL; 		array[length - 2] = *ptr; 		ptr++; 	} 	array[length - 1] = '\0'; 	 	return array; }


Question: 求解：C语言Socket套接字TCP/IP程序疑问---服务端和客户端不能正确接收数据

直接printf不行吗 printf("Sendbuf:%s\n", Sendbuf);

引用 1 楼 user-2 的回复：send(socket_client, Sendbuf, 100, 0);查看下Sendbuf里到底是什么,100改成实际长度，socket发送的是字节流，不是字符串，不一定能打印出来，要完成打印的话最好转成16进制打印怎么查看sendbuf里的信息呢？转换成16进制又怎么转呢？新手小白，谢谢了。


Question: c语言求一定范围内的斐波那契数

写个while(1)，直到数字大于b就停止，然后在循环内用变量计次  int count=0; int a,b,c,d; c=0; cin>>a>>b; while(1){ if(c>b) break; d=c; c=a+c; a=d; count++; } cout<<"有"<<(count-1)<<"个";  应该是这样子没错了，是存手打的，有可能出错

写个递归函数用count记录序号

问的是ab区间内一共有多少个斐波那契数，不求出来是哪几个数


Question: C语言题目，求助大神

这才是源代码，二楼的发错了。。。  /*  求cos x的近似值 模块化设计*/ //输入精度e，用下列公式求cos x的近似值，精确到最后一项的绝对值小于e， //Cos（x）=x0/0!-x2/2!+x4/4!-x6/6!+… //要求求x的n次方、求阶乘以及余弦函数都用自定义函数实现。 //本例为参考代码，需要完善mycos,main函数 #include<stdio.h> #include<math.h> int fac(int n);   //阶乘函数申明 double CF(double x,int n);   //x^n 幂次方函数申明 double mycos(double x,double e);    //自定义余弦函数申明 //阶乘函数定义 double fac(int n) { 	int i; 	double fact=1; 	for(i=1;i<=n;i++) fact*=i; 	return fact; } //x^n 幂次方函数定义 double CF(double x,int n) { 	double f=1; 	if(n>0) 		for( ;n>0;n--)	f*=x;  	else if(n<0) 		for( ;n<0;n++)	f/=x; 	return f; } //自定义余弦函数  x为角度值,e为精度值 double mycos(double x,double e){ 	//角度转弧度 	//级数求和，满足精度e要求结束 	//返回余弦值return  } //主函数测试自定义余弦函数 void main() { 	double x,x0,e,g=0; 	int n=0; 	printf("测试自定义余弦函数 mycos\n"); 	printf("请输入角度值与精度值，用空格隔开\n"); 	scanf("%lf%lf",&x,&e); 	x0=x*3.1415926/180;//角度转弧度  	while(CF(x0,2*n)/fac(2*n)>e)//精度限制 	{ 		g+=CF(-1,n)*CF(x0,2*n)/fac(2*n);  //级数求和 		n++; 	} 	//分别显示自定义余弦函数与系统函数值，尝试输入e=0.001，0.000001进行对比 	printf("mycos(%.1lf)=%lf\t\tcos(%.1lf)=%lf\n",x,g,x,cos(x0)); }

啥意思，自定义cos函数，修改了mycos和main，看看是你想要的吗？ //阶乘函数定义 int fac(int n) {     int i;     double fact=1;     for(i=1;i<=n;i++) fact*=i;     return fact; } //x^n 幂次方函数定义 double CF(double x,int n) {     double f=1;     if(n>0)     for( ;n>0;n--) f*=x;     else if(n<0)     for( ;n<0;n++) f/=x;     return f; } //自定义余弦函数  x为角度值,e为精度值 double mycos(double x, double e){     x = x*3.1415926/180;//角度转弧度     double c=0, s=0, f=1, k;     while((k=CF(x,c)/fac(c))>=e)//精度限制     {         s += f*k;  //级数求和         c += 2;         f *= -1;     }//级数求和，满足精度e要求结束     return s;//返回余弦值return } //主函数测试自定义余弦函数 int main() {     double x,x0,e;     printf("测试自定义余弦函数 mycos\n");     printf("请输入角度值与精度值，用空格隔开\n");     scanf("%lf%lf",&x,&e);     x0 = x*3.1415926/180;     printf("mycos(%.1lf)=%lf\t\tcos(%.1lf)=%lf\n",x,mycos(x, e),x,cos(x0));     return 0; }

//输入精度e，用下列公式求cos x的近似值，精确到最后一项的绝对值小于e， //Cos（x）=x0/0!-x2/2!+x4/4!-x6/6!+… //要求求x的n次方、求阶乘以及余弦函数都用自定义函数实现。 //本例为参考代码，需要完善mycos,main函数 #include<stdio.h> #include<math.h> int fac(int n);   //阶乘函数申明 double CF(double x,int n);   //x^n 幂次方函数申明 double mycos(double x,double e);    //自定义余弦函数申明 //阶乘函数定义 int fac(int n) { 	int i; 	double fact=1; 	for(i=1;i<=n;i++) fact*=i; 	return fact; } //x^n 幂次方函数定义 double CF(double x,int n) { 	double f=1; 	if(n>0) 		for( ;n>0;n--)	f*=x;  	else if(n<0) 		for( ;n<0;n++)	f/=x; 	return f; } //自定义余弦函数  x为角度值,e为精度值 double mycos(double x,double e){ 	double m,w=0;  	int c=0; 	m=x*3.1415926/180;//角度转弧度 	while(CF(m,2*c)/fac(2*c)>=e)//精度限制 	{ 		w+=CF(-1,c)*CF(m,2*c)/fac(2*c);  //级数求和 		c++; 	}//级数求和，满足精度e要求结束 	return w;//返回余弦值return  } //主函数测试自定义余弦函数 int main() { 	double x,x0,e,g=0; 	int n=0; 	printf("测试自定义余弦函数 mycos\n"); 	printf("请输入角度值与精度值，用空格隔开\n"); 	scanf("%lf%lf",&x,&e); 	x0=x*3.1415926/180;//角度转弧度  	while(CF(x0,2*n)/fac(2*n)>e)//精度限制 	{ 		g+=CF(-1,n)*CF(x0,2*n)/fac(2*n);  //级数求和 		n++; 	} 	//分别显示自定义余弦函数与系统函数值，尝试输入e=0.001，0.000001进行对比 	printf("mycos(%.1lf)=%lf\t\tcos(%.1lf)=%lf\n",x,g,x,cos(x0)); 	return 0; } 代码在这里！！！


Question: 问题

p在十六进制中是以2为底数p后面的数字为次幂数的计数法如p5代表2的5次方

只找到了p计数法，但p计数法是啥真的不懂

查了，没找到

。。。建议上网查一下


Question: 求助大佬，指针和数组名的区别

指针是*类型，数组是[]类型，对char*类型取地址得到的是char**，对char[]取地址得到的是数组首元素的地址也就是char的地址char*

指针是用来存放地址的 数组存放一系列数据，数组名指向数组的首地址 这么一看可能没什么区别 你可以使用sizeof() 看一下数组和指针的字节大小可能就懂了


Question: C语言

这种定义声明方式第一次见，长见识了。 刚学习了一下，虽然是被后来的标准所兼容。不过建议用新一些的方式

引用 1 楼 寻开心的回复:函数一章， 形参和实参 ok好的哥

引用 2 楼 Italink的回复:记住一条定律：无论函数形参如何改变，实参都不会变 函数传参其实是将实参复制一份作为形参，函数内部其实只是对实参的复制进行操作 那为什么第一个能改变呢？因为传的是指针，指针里存放的是数据的地址，通过函数传参，形参就是复制了一个实参（指针），但这个指针跟实参是指向同一个地方的，因此在函数内部使用*b，就能访问到这片数据区域，从而进行修改，回到定律，我们修改了形参的值吗？没有吧，我们只是通过形参里存放的地址，去访问并修改它，归根结底没有修改形参的值 而你第二个为什么没变？上面已经说你，你操作的其实是实参的一份复制 好的谢谢😜，我下去再看看，明天把帖结了

引用 3 楼 白色一大坨的回复:这都不会还考二级，你开玩笑呢 牛皮大佬，能告诉我怎么屏蔽人吗

函数一章， 形参和实参


Question: 大佬帮我看看这个怎么写啊

for (int i=0; i<N; i++ )    average +=  cj[i][0] * 1.0f/N;

有没有人会。。。。。。


Question: 一道循环结构的题目，有点小错误，但是不知道怎么改，看了好久了，望大神指点

m没初始化啊

就是m没初始化 int A,i,j,k,m=0;

把 m 初始化一下试试


Question: 求助大佬帮助：想用C语言的结构实现多态，但是为什么创建子类对象时不能在堆空间中创建呢？？？

引用 2 楼 user-1的回复:不是不能在对上创建对象，是你的用法不对 试试以下的代码 DeriveA* deriveA =(DeriveA*)malloc(sizeof(DeriveA)); //要么用malloc，注意参数是sizeof(DeriveA) deriveA->base.vptrTable.eat = aEat; deriveA->base.vptrTable.play = aPlay; deriveA->base.age = 40; deriveA->age = 20; deriveA->base.vptrTable.eat(); free(deriveA);  deriveA = new DeriveA(); //要么用new deriveA->base.vptrTable.eat = aEat; deriveA->base.vptrTable.play = aPlay; deriveA->base.age = 40; deriveA->age = 20; deriveA->base.vptrTable.play(); delete deriveA; 哦习惯了new。。。突然用malloc，忘了要用sizeof，谢谢大佬了

为什么不能在堆空间上创建对象呢


Question: 数据结构作业，要实现链表类型，我写了一个.h函数，一开始还好好的，睡觉之前不知道是点到什么还是删了什么，突然就不能实现功能了，请大佬帮我看一下，真的感谢！！！

头文件里定义函数？头文件里一般用于函数声明～

下面的注释不用管，有的注释还没改，预定义那一块的注释是没问题的


Question: 求助，谁能解释一下这个代码

不理解就调试呀           if(j==0 || T[i] == T[j]){                 ++i; ++j;                  next[i] = j;                   printf("%d i=%d j=%d %d\n", __LINE__, i, j, next[i]);           }           else          {                 j = next[j];                   printf("%d j=%d %d\n", __LINE__, j, next[j]);          }

字符串匹配算法，就是数据结构中的KMP算法

。百度kmp算法。。。。。

统计字符出现的位置？


Question: 二叉树创建

创建二叉树时，你输入格式是%d， int类型，设置的变量是  x 是char类型，ASCII码值 1，2，4所对应的字符是非打印字符，打印出来无法显示。 如果你想存入二叉树的数据为int 类型，建议你讲二叉树中data的类型改变为 int 类型，输出也为int类型。

建议参考：https://blog.csdn.net/weixin_46695826/article/details/105315351


Question: if else语句增加个开关的区别

要么把ｊ拿出来单独判断，不管放外面还是里面都行，要么就直接if else，就不要再加第二个了，这样就是满足三个都为１执行，其余都不执行

else是你上面的判断不满足就执行下面假如有６种组合，你的代码是if(１)执行clr。else(剩下的２３４５６)都执set。然后又来一个if(2)执行clr,else(１３４５６)set，你没发现你的语句里是重复的吗？

哪里一样了？你第二个都没有else，三个if语句都会进行判断。  引用 楼主 wenroudelang8888 的回复:各位大神，我最近在做OLED显示的程序，遇到需要反色显示的情况，需要加个开关控制是否反色， 原来语句是这样的   我加完开关j后的语句是这样的   可这个语句不能正确执行，  我又在main里用同样的格式写了这几句语句测试下，但这样的语句正常执行，如下    同样的格式，却结果不一样，请大神们帮忙看看，指点指点。谢谢了！！ 你修改之后的if语句判断条件从一个变成了两个，容易出错，比如当（dat&0x80）为假时，也执行了Set操作。 既然是开关，应该是先判断开关j是否等于0，再判断dat&0x80是否为0。


Question: 求助各位大佬，谢谢谢谢，明早就要收了，万分感谢！

#include <stdio.h> //母鸡５元一只，公鸡３元一只，小鸡１元三只，现１００元买了１００只鸡，各有多少？ int main(){         int i=0,j=0,k=3;         for(i=0;i<=19;i++){                 for(j=0;j<=(100-5*i)/3;j++){                         for(k=3;k<=(100-5*i-3*j)*3;k+=3){                                 if(i*5+j*3+k/3==100&&i+j+k==100){                                         printf("母鸡%d只,公鸡%d只,小鸡%d只\n",i,j,k);                                 }                         }                 }         }         return 0; }

楼主和你们玩游戏，你猜你猜你猜猜猜

哥们，你要问的是啥呀？怎么只贴出了代码？问题呢？

是答案不对还是咋滴


Question: SDL2使用单独线程来绘制时绘制的东西大小会自动随窗口大小改变

引用 8 楼 Pudron 的回复：解决了，在新的线程里创建渲染器就行了可以，通过控制不变量，猜测，验证问题，加油吧

解决了，在新的线程里创建渲染器就行了

使用多线程是因为我使用单线程时，我缩放窗口（改变大小）的时候，主线程会因为事件处理而阻塞，使窗口无法刷新，导致里面的物体的坐标没法随窗口变化，直到窗口大小定了（鼠标松开）时才刷新，很难看，所以我想试一下多线程能不能解决这个问题

引用 5 楼 user-1 的回复:最后问题来了 既然归根结底都是ren在触发刷新， 主窗体并没有说要进行一些异步的动作，为何要用多线程呢？ 如果纯为练习，可以理解 最近试了一下，发现在窗口大小改变时原来屏幕根本没有渲染，找好久都不知道问题出在哪

你在修改宽和高的时候，给他加锁 线程在根据宽高设置rt的时候也加锁 试试看吧 ~~~刚才的分析可能有些问题，你这边刷屏幕应该全都是靠正方形的刷新来触发整体的刷新的。     SDL_RenderFillRect(ren,&rt);     SDL_RenderPresent(ren); ~~~~

屏幕刷新主窗体和里面的正方形，这两个步骤不是同步的吧 但是这两个窗体肯定要通信，  你放在主函数是放在handleEvent（）函数后面，（也在循环体里面？） 这样的意思是刷新主窗体的同时，刷新正方形。 ~~~~~~~~~~~~~~ 你所谓的垂直同步是什么意思呢? 假设你的ren只在main里面present一次，后续handleEvent会如何？ ~~~~~~~~~~~~~~ 假设你要完全独立控制你的正方形，（也许有分离模式，detach？这个组件我没用过，不知道了） 你的ren既然是通过win创建的，他们肯定有一些内部实现，互相通信的，你需要去了解，阅读相关文档。 那么你主线程在处理事件（拖拽外部主窗体）的时候， 是不是应该跟你的drawing线程（描绘正方形）通信，告诉他，外部环境已经变化 比如正方形的位置，是不是要跟着变，你通过帧的刷新率来同步，这种是不靠谱的， 需要线程间一种同步机制， 或许，你的ren也可以捕获事件？ ~~~~~~~~~~~~~~~~~~~~~~~

引用 1 楼 user-1 的回复:虽然这块功能和API没接触过， 还是提供一些思路和猜测吧。 1.你里层的正方形其实和外层窗口是关联的。因为你的ren是基于win创建的 ren = SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC); 这个应该表示ren和win始终保持同步的意思吧，（按比例同步缩放） ----你看看是不是还可以设置成不同步的，应该是有另外的flag 2.你可以尝试先不拖拉外层窗体，然后修改render函数， 不断的去修改边长，看你的程序运行结果如何。 是否能入你预期的，正方形在不断的刷新出来？如果不能，那就是你还不知道怎么单独刷新SDL window里面的元素， 可能你还需要去了解下 ~~~~ 以上两点都可能是导致这个问题的原因 1. 那个SDL_RENDERER_PRESENTVSYNC是垂直同步，与此无关，我删了试过了。 2. 我把render()函数改在主线程里那个正方形的大小就不会改变，但如果把它放在线程了就这样了，我很想知道这和线程有什么关系...


Question: 求助大佬，C语言从文件里面读取数据到链表和将链表保存到文件

就是把整个结构体当做一块写入，而不是把里面的一项一项写入

引用 1 楼 user-1 的回复:fwrite(&write->n,write->n,sizeof(write->n),fp);         fputs(write->name,fp);         fputs(write->place,fp);         fputs(write->writer,fp);         fwrite(&write->price,write->price,sizeof(write->price),fp)  fwrite(write, sizeof(struct Node), 1, fp); 这个我看不太明白。。。麻烦详细说明一下


Question: 麻烦大佬帮我看一下我这个代码，主函数的第一个for循环为什么运行不了

引用 6 楼 六道佩恩的回复:[quote=引用 5 楼 weixin_45663602 的回复:] [quote=引用 2 楼 六道佩恩的回复:]内外循环的递增变量（i）混用了 大佬 我照你的改了 循环是可以了 结果也和要求的一样了 但是提交到平台还是报runtime error 请问是什么问题啊  求告知 非常感谢[/quote] 没看完，这道题的题的意思也没怎么看懂，不知道你的程序逻辑会不会有问题，不过代码还是有点问题的，f[i][j]这里，你的f数组申请为int**[] 类型，它表示，每个数组成员都是int**类型，即每个数组成员都是一个指向int*指针的指针，而照你的使用方法f[i][j]来看，你应该是想申请一个二维数组，二维数组不是这么申请的，你可以循环创建一些数组，让前面你的int**数组的成员来保存它们的首地址，但这样显然太麻烦了。 申请二维数组最简单的办法就是像申请一位数组那样，int arr[a][b]，a、b是整型变量，这是C99引入的变长数组，即用变量指定申请数组的长度。 如果要用malloc的话，最简单的办法就是申请一个一维数组，因为二维数组本质上就是在一维上顺序排列的，比如int arr[5][4]，那就是每4个元素为一个小组，这四个元素位置是相连的，大数组中一共有5个这样的小组，这5个小组也一样是相连的，你只要确定好位置方位就可以了，比如要使arr[i][j]赋值1，首先申请内存 int *arr = malloc( 5*4*sizeof(int) )，这里malloc返回的是void*指针，不需要强转，接着*( arr+ i*4+j ) = 1，或者 arr[ i*4+j ] =1; 如果一定要用malloc申请二维数组，应该这样申请：int (*arr)[4] = malloc( sizeof(4*5*sizeof(int)) )， 使用时  arr[i][j]=1;[/quote] 哇 非常感谢 已经解决了

引用 5 楼 weixin_45663602 的回复:[quote=引用 2 楼 六道佩恩的回复:]内外循环的递增变量（i）混用了 大佬 我照你的改了 循环是可以了 结果也和要求的一样了 但是提交到平台还是报runtime error 请问是什么问题啊  求告知 非常感谢[/quote] 没看完，这道题的题的意思也没怎么看懂，不知道你的程序逻辑会不会有问题，不过代码还是有点问题的，f[i][j]这里，你的f数组申请为int**[] 类型，它表示，每个数组成员都是int**类型，即每个数组成员都是一个指向int*指针的指针，而照你的使用方法f[i][j]来看，你应该是想申请一个二维数组，二维数组不是这么申请的，你可以循环创建一些数组，让前面你的int**数组的成员来保存它们的首地址，但这样显然太麻烦了。 申请二维数组最简单的办法就是像申请一位数组那样，int arr[a][b]，a、b是整型变量，这是C99引入的变长数组，即用变量指定申请数组的长度。 如果要用malloc的话，最简单的办法就是申请一个一维数组，因为二维数组本质上就是在一维上顺序排列的，比如int arr[5][4]，那就是每4个元素为一个小组，这四个元素位置是相连的，大数组中一共有5个这样的小组，这5个小组也一样是相连的，你只要确定好位置方位就可以了，比如要使arr[i][j]赋值1，首先申请内存 int *arr = malloc( 5*4*sizeof(int) )，这里malloc返回的是void*指针，不需要强转，接着*( arr+ i*4+j ) = 1，或者 arr[ i*4+j ] =1; 如果一定要用malloc申请二维数组，应该这样申请：int (*arr)[4] = malloc( sizeof(4*5*sizeof(int)) )， 使用时  arr[i][j]=1;

引用 2 楼 六道佩恩的回复:内外循环的递增变量（i）混用了 大佬 我照你的改了 循环是可以了 结果也和要求的一样了 但是提交到平台还是报runtime error 请问是什么问题啊  求告知 非常感谢

引用 2 楼 六道佩恩的回复:内外循环的递增变量（i）混用了 好的 谢谢 我去改了试试

引用 1 楼 user-2的回复:复制粘贴代码不是比截图再上传图片更方便些吗 复制粘贴的代码在这儿看起来很乱  所以我就只有截图了

内外循环的递增变量（i）混用了

复制粘贴代码不是比截图再上传图片更方便些吗


Question: (!a) || (!b) || (!c)逻辑表达式是否等同于!(a&&b&&c)？

你先找一个不等的

引用 10 楼 kkuipp 的回复:[quote=引用 9 楼 ggglivw 的回复:] [quote=引用 4 楼 qq_41515678 的回复:] 如果不是宏定义,在逻辑上是等同的(但执行命令不同)  别误导别个，如果执行的是一个函数，差别很大，一个是执行1-3个，一个是一定执行3个，最后看结果。[/quote] 两个逻辑是一样的，执行命令也是一样的，都是执行1-3个，第二个！（a&&b&&c），也是abc有一个为假即退出。[/quote] 。。。我眼花了

引用 9 楼 ggglivw 的回复:[quote=引用 4 楼 qq_41515678 的回复:] 如果不是宏定义,在逻辑上是等同的(但执行命令不同)  别误导别个，如果执行的是一个函数，差别很大，一个是执行1-3个，一个是一定执行3个，最后看结果。[/quote] 两个逻辑是一样的，执行命令也是一样的，都是执行1-3个，第二个！（a&&b&&c），也是abc有一个为假即退出。

引用 4 楼 qq_41515678 的回复:如果不是宏定义,在逻辑上是等同的(但执行命令不同)  别误导别个，如果执行的是一个函数，差别很大，一个是执行1-3个，一个是一定执行3个，最后看结果。

德·摩根定律 编辑 讨论 在命题逻辑和逻辑代数中，德·摩根定律（或称德·摩根定理）是关于命题逻辑规律的一对法则。 [1]  奥古斯都·德·摩根首先发现了在命题逻辑中存在着下面这些关系： 非(P 且 Q) = (非 P) 或 (非 Q) 非(P 或 Q) = (非 P) 且 (非 Q) 德·摩根定律在数理逻辑的定理推演中，在计算机的逻辑设计中以及数学的集合运算中都起着重要的作用。 [1]  他的发现影响了乔治·布尔从事的逻辑问题代数解法的研究。这巩固了德摩根作为该规律的发现者的地位，尽管亚里士多德也曾注意到类似现象，且这也为古希腊与中世纪的逻辑学家熟知。 该定律也被称作反演律。

明显不是，仔细看书上解释。

基础知识，多学习、或者多花点时间思考、甚至试验就能得到结果。并且印象有可能会更深

a,b,c三个条件，他们的组合，不过是8种情况，从000到111，分别用程序跑一下就知道了。 结果是一致的

如果不是宏定义,在逻辑上是等同的(但执行命令不同)

自己看逻辑运算的公式吧，以下链接的【二 基本公式】章节 https://wk.baidu.com/view/0a94de232f60ddccda38a0c3?pcf=2

前一个可以退出后一个，但后一个推不出前一个

根据逻辑表达式的关系推导应该是等的。 难道你反现的不等的现象？


Question: c语言开关

完了，无迹可寻了    结帖了

再给点提示啊，用于什么用途？是选择了什么东西？

引用 9 楼 與蘤舊縐 的回复:这怕不是你自己取的名字  网上搜C语言开关就看见这俩  好像确实不是什么官方用语

这怕不是你自己取的名字  网上搜C语言开关就看见这俩

引用 6 楼 與蘤舊縐 的回复:你这没例子没提示不好猜啊  不是宏，确实不好猜    引用 7 楼 user-3 的回复:编译开关？ #if 0 #else #endif ？  不是

编译开关？ #if 0 #else #endif ？

你这没例子没提示不好猜啊

宏？？？？？

引用 3 楼 大娱乐家cpy 的回复:难道是三目运算符？   c = a > b ? 1 : 0;  不是呀，有可能需要具体情境 才好说

难道是三目运算符？   c = a > b ? 1 : 0;

引用 1 楼 與蘤舊縐 的回复:你说的是switch？？  不是，就是一种选择语句的设计技巧  可惜我记不住了

你说的是switch？？


Question: 这是什么东西?

基本等同于VB中的 For i = a To b Step c  (main函数里,上限低于下限 For i = 100 To 1 Step -1) 即在100到1中每隔1作为一个加数,加到返回值里 即100+99+98+...+1 结果是5050

这是什么编译器，可以支持中文标识符了？ 这个程序就是一个可以根据“起始”和“上限”的值判断是执行递增循环还是递减循环的程序，可以用作练习编写C语言的循环代码的练习题。 给你重新格式化了一下，容易看明白： #include <stdio.h> int 递变(int 起始, int 上限, int 递变量) //自定义递变函数,可以递增,可以递减. {    int 返回值;    if (起始 < 上限)    {       for (; 起始 <= 上限; 起始 = 起始 +递变量)       {          返回值 = 返回值 +起始;           printf("%d    ", 返回值);          printf("%d\n", 起始);           //getchar();       }    }    else if (起始 > 上限)    {       for (; 起始 >= 上限; 起始 = 起始 -递变量)       {          返回值 = 返回值 -起始;           printf("%d    ", 返回值);          printf("%d\n", 起始);           //getchar();       }    }    else if (起始 == 上限)    {       返回值 = 0;    }     return 返回值; }  void main() {    int  起始 = 100, 上限 = 1, 递变量 = 1;    int 结果 = 递变(起始, 上限, 递变量);     printf("%d\n", 结果); }

现在的编译器支持中文变量吧？ 反正我是没用过中文变量名，没试过。。

看着像程序，但是变量名没有是中文的，编译器不支持。


Question: PTA上的题

引用 1 楼 user-1的回复:供参考  #include <stdio.h>  void Creat(int a[][5], int m); void Output(int a[][5]);  int main(void) {     int num[5][5], m;     scanf("%d", &m);     Creat(num, m);     Output(num);      return 0; }  void Creat(int a[][5], int m) {     int i, j, n;     n = m;     for (i=0; i<5; i++)     {         for (j=0; j<5; j++)         {             a[i][j] = n+j;         }         n = m+1;         m++;     } }  void Output(int a[][5]) {     int i, j;     for (i=0; i<5; i++)     {         for (j=0; j<5; j++)         {             printf("%5d", a[i][j]);         }         printf("\n");     } }   不管怎么样谢谢你啊啊啊啊


Question: 想请教一下关于C语言文件数据读入的问题，不知道为什么输出了奇怪的东西

没有人吗？求大佬回答


Question: vc下c语言的运行

引用 2 楼 chxchxkkk的回复:scanf除了数组名、函数名、字符串这些，其它的类型都要用 & 嗯呐，scanf接收的是地址，我知道啦，昨晚没注意

引用 1 楼 user-2的回复:地址访问异常,改为scanf_s("%f",&num[i]); 这里需要的是num[i]的地址,而不是值(0),scnaf_s无法访问0x0,故会引发错误 妈呀我昨晚弄了半天，没看到，这么低级的错误谢谢了

scanf除了数组名、函数名、字符串这些，其它的类型都要用 &


Question: c语言%c输入字符无法执行

跟%c没关系，主要原因是 scanf("%f%c%f", &a, &po, &b); 在输入了表达式之后，回车按键没有被屏蔽，导致 scanf("%c", &k); 读取的是回车符号。可以在输入了表达式后，使用rewind()函数来清理输入缓冲区中的数据，把回车符清理掉。 scanf("%f%c%f", &a, &po, &b); 		rewind(stdin);//----------清理回车符--------  关于rewind()函数的详细用法，请参考《C++中getchar()的使用方法》 希望能够帮到你！

//加减乘除 #include <stdio.h> int main(){  float a,b;char k,po;     do{   printf("请输入执行运算的数（如a+b)\n");   scanf("%f%c%f",&a,&po,&b);    switch(po){   case '+': printf("%.2f+%.2f=%.2f\n",a,b,a+b);break;   case '-': printf("%.2f-%.2f=%.2f\n",a,b,a-b);break;   case '*': printf("%.2f×%.2f=%.2f\n",a,b,a*b);break;   case '/':     if(b==0)      printf("分母为0"); //判断除数是否为0     else      printf("%.2f÷%.2f=%.2f\n",a,b,a/b);     break;  }   printf("是否继续执行：y or n\n");   while ((k = getchar()) != '\n'); //这里换成这个  }while(k=='y');  }  这个考虑到scanf从缓冲区读取时留下的'\n',如果直接用scanf("%c",&k);它直接从缓冲区读取'\n',而scanf("%s",&k)视'\n'为分隔符,但这种做法也不好,你输入字符串"y"是{'k',0},它将把&k视作字符串起始点,就算你只输入"k"并回车,po会被赋值为0


Question: 怎么定义指向指针数组(malloc的空间)的指针？

int *p[10]; p = (int **)malloc(sizeof(int *) * 10); if (!p) exit(0); for (i = 0; i < 10; i++)     p[i] = (int *)malloc(sizeof(int) * 20);

引用 2 楼 千梦一生 的回复:如楼上。 或者乱来，强转也可以 int **p=(int **)malloc(sizeof(int));//malloc本质仅仅是申请某个大小的空间 并返回该空间第一个字节地址

int **p=(int **)malloc(sizeof(int*));


Question: C语言 输入正整数将正整数分解质因数。质因数要满足两个条件:1）是这个数的因数;2）是质数（素数）如： 6=2*3 12=2*2*3 课后作业

15行改为：   printf(" %d 的质因数分解为：%d = ",a,a);


Question: 打开文件后再写入就不用fprintf了吗

没有重定向就可以啊乁( ˙ ω˙乁)

引用 2 楼 weixin_45974777 的回复:[quote=引用 1 楼 棉猴的回复:]printf()函数的输出是标准控制台窗口，除非进行了重定向，将其重定向到文件。 那为什么他用的printf[/quote] 所以你要看他有没有重定向

引用 1 楼 棉猴的回复:printf()函数的输出是标准控制台窗口，除非进行了重定向，将其重定向到文件。 那为什么他用的printf


Question: 算法题！！求教大佬！小白学算法学得有点乱，求指导

既然是有序，按照时间复杂度要求，可以用折半查找

引用 1 楼 user-2 的回复：algorithm库中有个binary_search函数，够简洁吧，但最好还是自己实现一下我有点搞不懂输出俩位置怎么实现


Question: VS2019编译器的问题，有哪位大神帮我看看这个是什么情况研究一下午也没整明白，这个警告是怎么回事

点结贴给分啊

引用 4 楼 focuslight的回复:比如把代码放到 if(fp!=NULL)里 我怎么才能把分给你，第一次用这个软件

比如把代码放到 if(fp!=NULL)里

能告诉下怎么保护么， 大神

文件指针可能为空，你在使用指针前做好空指针检测处理就可以了

你打开文件可能失败， fp可能为NULL,  保护一下即可


Question: c程序设计问题

谭浩强书有这题

刚才说错了。 逗号不适用于%s的分隔。 因为%s的时候 不识别除了空白字符外的其他分隔符。 只能用空格。

尝试使用scnaf("%s %s",x,y); 因为scanf中的字符串分隔符为空格符(包括' ','\t'等),如果输入"%s,%s" , scanf将会把输入的字符串(如"1,2")统一送给第一个%s(即x),这时的y是未初始化的。 而且 你输入的是"asp asp",不符合"%s,%s"输入规范。

我运行程序时没有问题呀，只是你的scanf的控制符中有“，”，输入数据时有些麻烦。

输入 asf,asf 试试


Question: 求问关于指针文件的问题

你在循环中打印一下pay的值看看，是不是都能正确读出pay的值？

在devc++上跑你的代码结果如上

引用 1 楼 qybao 的回复:你在循环中打印一下pay的值看看，是不是都能正确读出pay的值？ 我改了一下，是这个      int i,pay; 	i=1; 	double tax; 	FILE *fp1,*fp2; 	fp1=fopen("salary.txt","r"); 	fp2=fopen("taxes.txt","w"); 	while(!feof(fp1)) 	 { 	 	fscanf(fp1,"%d",&pay);  	 	if(pay<800) 	 	 	tax=0;    	 	else if(pay<2000) 	 	 	tax=(pay-800)*0.1;  	 	else if(pay<5000) 			tax=1200*0.1+(pay-2000)*0.15; 		else if(pay<20000) 			tax=1200*0.1+3000*0.15+(pay-5000)*0.2; 	   		fprintf(fp2,"该人今年第%d个月的所得税为：%lf\n",i,tax); 		i++; 		if(i>12) break;	  	 }  	 fclose(fp1); 	 fclose(fp2); 而且两个文件也在同一个文件夹里，但还是0.0000


Question: 求助（数位dp）T^T

排列算法请百度

其实就是求排列


Question: 题目看不懂

引用 1 楼 ?Victor.??的回复:题目都没拍全呀  就是n阶方阵的每一个元素向右移m的单位

题目都没拍全呀


Question: python基础题

引用 1 楼 ?Victor.?? 的回复：import math n=eval(input()) s=0 i=1 while(i < n+1): 	s=s+(-1)**(i-1)*1/(2*i-1) 	i+=1 s=s*4 print(s-math.pi)  好像是这样感谢！


Question: 大佬，这个程序电脑怎么执行不了

你上题中的return0；后少了一个 " } " 括号。程序没有问题，可以执行。


Question: 谁帮我解释一下这个段代码做什么

查表法计算crc检验值吧


Question: sprintf格式化字符串的问题

加个计数器，隔两个加一个空格

sprintf((char *)sengdtest+i*3," %02X ",sendtest);


Question: 程序设计问题

首先y， z要初始化为0， 假设a[0]就是最大值或者最小值，你这个y，z就是未知的值了  其次最后交换的时候， t = a[n]; a[n] = a[y]; a[y] = t; 这个错了a[n]已经越界了，应该是a[n-1] ~~~~~~~~~~~~~ 顺便提一下 程序中一些细节，值得改进，有些看起来很繁琐，绕人，有时候绕来绕去会把自己绕晕 你最好写得直观易懂些，这样不容易出错，后面自己或者别人再回头看的时候也简单。 比如这个交换，你可以写成宏或者函数调用，代码会明朗一些 还有循环控制，比如逆序的这个 for(i = 0; i < n; i++)     printf("%3d", a[n-i-i); 看起来得小心翼翼，怕怕的 你想，直白来说不就是从最后一个往前打印吗？ 最后一个是什么？ n -1嘛， 第一个呢 0，OK，循环这样写如何? for(i = n-1; i >=0; i--)     printf("%3d", a[i]); 有没有更直白，更简单些呢？（不要被一些说>=比较的效率比> 低一些这种言论所蛊惑，现代计算机不差那点性能）

引用 1 楼 user-2 的回复:在开始的时候给z赋个0试试赋值之前试过了 能出结果但不对

在开始的时候给z赋个0试试


Question: 便没出错，运行的时候停在while循环前没有进去是什么情况？？？

一个分号的问题

唉，自己太马虎了

#include <stdio.h> int main() { 	int a,b,c,count; 	scanf("%d %d", &a, &b); 	count = a*b;  	while (b != 0) 	{ 		c = a%b; 		a = b; 		b = c; 	} 	 	printf("%d %d", a, count/a);		 	return 0; }


Question: 请教枚举和结构体在都文件的应用

不好意思昨天上传错图片了，结构体只能在函数里做声明吗？想作为一个全局变量来使用应该怎么写？

#include "你的头文件";


Question: C语言：求第n个到第m个之间的素数和。求大神解答一下我的代码哪里出错了？

而且在循环中的时候，其实并不需要判断所有小于sqrt(n）的整数，只需要判断小于sqrt(n）的质数即可

用到什么推理？当然就是数学推理啊。 你觉得x/3会大于x/2吗？x/1是x本身，按理是最大的除数，除了它，最大的除数会是什么？你再自己好好想想。

还有就是除了2之外所有的偶数都不是素数，因为他们都有2这个因子。也可以根据这个改进一下程序。

引用 2 楼 千梦一生 的回复:判断一个数n是和数，相当于一定有两个大于1的整数x、y 有：x*y = n。  比如 5(循环中的i)*2 = 10（和数）。其实在i = 2时已经判断过一次了。  换句话说循环到sqrt(10）即可。因为当循环过了这个阈值后，相当于两个乘数颠倒。之前已经做过判断了  如果说要效率的话，网上搜200个质数，代码效率应该不差。运行效率也快，多占点内存，但800B应该不大吧 我觉得你这么说更明确，不过你的答案也帮到我了。因为如果它如果是和数，那么它一定可以表示成两个数（除了1和它本身）相乘，这两个数必然有一个小于等于它的平方根。只要找到小于或等于的那个就行了，所以循环到sqrt(x)就行。

引用 1 楼 user-2 的回复:你的代码逻辑上没看出问题，你运行出什么错了？ 至于sqrt(）这个函数，用不用无所谓，用了就是能改善些效率，减少循环次数，也就是for( i=2; i<x; i++){ //没必要循环到x-1，本来循环到sqrt(x）就可以了。当然你也可以用x/2代替sqrt(x），因为一般x/2就是最大的除数了，超过x/2，除了x本身，不可能有被x整除的数了。 能告诉我为什么一般x/2是最大的除数吗？是用到什么推理了吗？


Question: c语言程序问题

你怎么不缩进

你这个ave加下来是6名学生5门课总成绩，不是某一行的成绩了。 非要用数组的话要不定义6个ave，每一行用一个ave统计，比如 ave1是第一行的，它的平均成绩就是 ave1/5。 还是用结构体方便

引用 4 楼 bug10086 的回复:在J的循环体外面，I的循环体里面加上ave=0,清空后记录下一个学生的成绩懂了 感谢兄弟

在J的循环体外面，I的循环体里面加上ave=0,清空后记录下一个学生的成绩

我是个小白，但我觉得ave应该定义成float类型的，按你写的代码的话ave/5是个int类型的吧，把这个改成float类型的试试


Question: 递归问题

递归问题，他是怎样占用内存的。

但是我把判断条件中的<=100改成<=5他就行，改成小点的数就可以。

递归中我用 while为什么没有输出

引用 8 楼 棉猴 的回复:[quote=引用 6 楼 end245835 的回复:] [quote=引用 4 楼 棉猴 的回复:] while(i<=100) while循环的条件是i<=100是true，而结束循环的条件是i<=100是false 而while的循环体中 s = s+i; f(i+1,s); 根本没有修改i的代码，导致i<=100始终是true，所以一直在while循环中，跳不出来 执行 f(i+1,s);  不会使i+1并且跳回到f函数吗？[/quote] 需要注意的是，while()的条件语句是i<=100，你的代码中，i根本没有变化，就是说没有使得循环结束的迭代语句，所以while循环一直不会结束，也就是死循环。所以不会有输出[/quote]  奥 明白了  以为f(i+1,s)会使while循环结束，谢谢大佬的指教。

引用 6 楼 end245835 的回复:[quote=引用 4 楼 棉猴 的回复:] while(i<=100) while循环的条件是i<=100是true，而结束循环的条件是i<=100是false 而while的循环体中 s = s+i; f(i+1,s); 根本没有修改i的代码，导致i<=100始终是true，所以一直在while循环中，跳不出来 执行 f(i+1,s);  不会使i+1并且跳回到f函数吗？[/quote] 需要注意的是，while()的条件语句是i<=100，你的代码中，i根本没有变化，就是说没有使得循环结束的迭代语句，所以while循环一直不会结束，也就是死循环。所以不会有输出

if是判断语句while是循环语句，感觉这两个就不同，而且你可以在while语句中打印一下i的值和s的值，你会发现一些不一样的东西

引用 4 楼 棉猴 的回复:while(i<=100) while循环的条件是i<=100是true，而结束循环的条件是i<=100是false 而while的循环体中 s = s+i; f(i+1,s); 根本没有修改i的代码，导致i<=100始终是true，所以一直在while循环中，跳不出来 执行 f(i+1,s);  不会使i+1并且跳回到f函数吗？

执行 f(i+1,s); 不会跳回到f函数吗？


Question: C语言函数返回局部变量的地址

VC2010中是这样的：  楼主你自己不看，怪谁？

编译器通常会给警告信息的，比如在mningw中是这样的:

分析内存堆栈:  address()返回时 mian()返回地址      p(int *)            printf;(address()返回地址)    a(int 2)       |未使用 address()返回后 main()返回地址      p(int *指向a)   |未使用                                 a(已弃用 int 2)  可以看到,这时的a并没有被覆盖,它只是被弃用,但值还是2,故输出值还是2,但如果再调用其他函数 a的值就会被覆盖

引用 5 楼 千梦一生 的回复: #include<stdio.h> int* address(); int* address() {         int a=2;         return &a; } void func() { int x = 4; return; } int main() {          int* p=address();          func();          printf("%d\n",*p);//试试这回会打印什么？有可能是4（函数不被优化的情况下，就算是4也是未定义行为。或者说不符合规范的行为）          return 0; }  楼主找个栈什么的讲解的学习下自然就明白是为何了

你再加个函数 int address2() {         int a=3;         return a1; } 然后main方法加一句  int* p=address(); address2(); //多调用一个函数试试？因为调用完address后，函数栈释放了，但是栈的内存信息没被更新（也就是垃圾信息），所以你再多调用一个函数，把栈内存刷新，这时你再看看就明白了 printf("%d\n",*p);

返回局部变量的地址是未定义行为，即不能保证每次都能得到局部变量的值。因为局部变量的生命周期就是从定义到函数结束。既然函数调用结束了，它的生命周期也结束了，既然结束了再用就没意义了吧

这东西就像手机丢水里后，拿出来吹干了有可能能用，有可能就费了一样不确定性，但谁会故意把手机扔水里再拿出来用呢。

巧合而已，不建议这样用


Question: 求助！！！

？？？？？？？？？？？ 结果是正确的呀！！！

math.h

math %f%f%f%f AB sqrt %. 3f

%f%f%f%f AB sqrt %f  如果基础还行，我想至少能填上2个到3个吧 全让别人帮忙，自己能学到多少？  建议楼主扎扎实实学习吧


Question: C语言源代码如下，编译没问题，运行出现该内存不能为read情况，求指导

你没有输入参数，程序在获取参数时肯定会报错啊

运行后是这样的


Question: 返回值为数组的时候函数怎么定义

你好，要实现对数组进行传递，可以借助指针来完成。 在传递过程中，需要将保存结果的数组首地址传入子函数，计算后返回首地址。 因为子函数结束时会将形式参数变量的内存全部释放掉，数据清除。但是地址不会发生改变。  以下为源程序 #include <stdio.h> #include <stdlib.h>  int *fun_sum_order(int a[],int b[],int c[],int *sum,int num)//sum表示求和结果存储的首地址, num 表示数组中元素个数  {	 	int *p = sum;     	for (int i = 0;i < num;i++) //求总分      {         sum[i] = a[i] + b[i] + c[i];     }          /*输出初始的sum求和值 与结果对比*/     printf("初始sum数组值\n");     for (int i = 0;i < num;i++) //数组输出      {         printf("%d ",sum[i]);     }          for (int i=0;i<num;i++)//对数组进行排序      {         int k = i,temp = sum[i];         for(int j = i + 1;j < num;j++)         {	         	if(temp < sum[j] ){temp = sum[j];k = j;}//每次寻找最大值 记录最大值所在数组下标	 		} 		if(k != i){temp = sum[k];sum[k] = sum[i];sum[i] = temp;}//发现最大值，位置替换。      }          return p; }  int main() { 	int a1[15]={72,21,85,23,65, 9,92,48,88,98,20,59,36,36,70};//第一喜欢分数 	int a2[15]={95,38,98,9, 58,78, 7,44,28,46,96,78,34,82,5};//第二喜欢分数 	int a3[15]={99,18,71,20,78,33,79,39,25,7, 61,20,15,31,57};//第三喜欢分数     int sum0[15] = {0}; 	int *str;//定义一个指针,子函数的返回值为指针，需要用一个指针来接收。      str = fun_sum_order(a1,a2,a3,sum0,15);     printf("\n排序后sum数组值\n"); 	for (int i = 0;i < 15;i++) //输出sum数组值      {         printf("%d ",str[i]);     }     return 0; } 测试结果

为什么一定要return 一个返回值呢? 给你个代码体会一下 void func(int* array,int len) {    for(int i=0;i<len;i++)      array[i]=2*array[i]; } int main() {    int arr[10]={1,2,3,4,5,6,7,8,9,10};    func(arr,10);    for（int i=0;i<10;i++)     print("%d ",arr[i]）; }

你返回局部变量（数组），是未定义的行为。 如果把要返回的数组加上static，可以直接返回数组名  int *sort(int s1[],  int s2, s3) {    static int t[15]; xxx  return t; } int main() { int *p = sort(xxxx); }

C 做不到

不知道，你是不是这个意思  #include<algorithm> #include<iostream> #include<vector> #include<map> using namespace std;  typedef pair<int, int> PAIR;   bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {     return lhs.second > rhs.second;   }    void Sum_Sort( 	vector<int>&a2, 	vector<int>&a3, 	vector<int>&a4, 	map<int,int>&a5, 	vector<int>&ans, 	vector<int>&a1) { 	for(int i = 0;i != a2.size(); ++i) 		a5.insert(make_pair(i, (a2[i]+a3[i]+a4[i])));  	vector<PAIR> score(a5.begin(), a5.end());    	sort(score.begin(), score.end(), cmp_by_value);  	for (int i = 0; i != score.size(); ++i){     	ans.push_back(score[i].first);     	a1.push_back(score[i].second);       } } int main(int argc, char const *argv[]) { 	vector<int> a2 = {72,21,85,23,65,9,92,48,88,98,20,59,36,36,70}; 	vector<int> a3 = {95,38,98,9,58,78,7,44,28,46,96,78,34,82,5}; 	vector<int> a4 ={99,18,71,20,78,33,79,39,25,7,61,20,15,31,57}; 	vector<int> ans;//编号排序 	vector<int> a1;//总分数 	map<int,int> a5;//总分 	Sum_Sort(a2,a3,a4,a5,ans,a1); 	 	for(int i = 0;i != ans.size(); ++i) 	{ 		cout<<ans[i]<<" "<<a1[i]<<endl; 	}  	return 0; }


Question: 求助

#include<stdio.h> #include<string.h>  struct MyStruct {     int num;     char name[20];     int s1;     int s2;     int s3;     int s4;     int s5;     int pj; }s[1000];  #if 0 struct student {     int num;     char name[20];     int s1;     int s2;     int s3;     int s4;     int s5;     int pj; }e[1000]; #endif  void main() {     int i, n, m,a,b=0,c[1000],d;     printf("请输入班级人数\n");     scanf_s("%d", &n);     for (i = 0; i < n; i++)     {         printf("请输入第%d位学生的学号\n", i + 1);         scanf_s("%d", &s[i].num);         printf("请输入第%d位学生的姓名\n", i + 1);         scanf_s("%s", s[i].name, 10);         printf("请输入第%d位学生的第一科成绩\n", i + 1);         scanf_s("%d", &s[i].s1);         printf("请输入第%d位学生的第二科成绩\n", i + 1);         scanf_s("%d", &s[i].s2);         printf("请输入第%d位学生的第三科成绩\n", i + 1);         scanf_s("%d", &s[i].s3);         printf("请输入第%d位学生的第四科成绩\n", i + 1);         scanf_s("%d", &s[i].s4);         printf("请输入第%d位学生的第五科成绩\n", i + 1);         scanf_s("%d", &s[i].s5);         s[i].pj = (s[i].s1 + s[i].s2 + s[i].s3 + s[i].s4 + s[i].s5) / 5;         printf("___________________________________________\n");     }     struct MyStruct tmp;     for (i = 0; i < n; i++)     {         //d = n;         d = i;         for (a = 0; a < n; a++)         {             if (s[i].pj > s[a].pj)             {                 d = a;                 //d--;             }         }          if (d != i) {             tmp = s[d];             s[d] = s[i];             s[i] = tmp;         } #if 0         e[d].num = s[i].num;         strcpy_s(e[d].name,10, s[i].name,10);         e[d].s1 = s[i].s1;         e[d].s2 = s[i].s2;         e[d].s3 = s[i].s3;         e[d].s4 = s[i].s4;         e[d].s5 = s[i].s5;         e[d].pj = s[i].pj; #endif     }     printf("请输入你想输出的排名\n(注意排名请不要大于班级人数)\n");     scanf_s("%d", &m);     if (m >= n)         m = n-1;     //printf("第%d名\n学号：%d\n姓名：%s\n第一科成绩：%d\n第二科成绩：%d\n第三科成绩：%d\n第四科成绩：%d\n第五科成绩：%d\n平均成绩：%d", m, e[m].num, e[m].name, e[m].s1, e[m].s2, e[m].s3, e[m].s4, e[m].s5, e[m].pj);     printf("第%d名\n学号：%d\n姓名：%s\n第一科成绩：%d\n第二科成绩：%d\n第三科成绩：%d\n第四科成绩：%d\n第五科成绩：%d\n平均成绩：%d", m, s[m].num, s[m].name, s[m].s1, s[m].s2, s[m].s3, s[m].s4, s[m].s5, s[m].pj); } 供参考～  结构体类型声明一次就好了，可以定义多个变量； 选择排序有点问题，对比代码找一下问题吧

既然私信我了，就写个代码代参考  #include <stdio.h> #include <stdlib.h> #include <string.h>  struct student1 {     int num;     char name[20];     char birth[10];     int yw;     int sx;     int yy;     int wl;     int hx;     float aver; };  struct student2 {     int ranking;     int num;     char name[20];     float aver; };  void InputStudent(struct student1 *arr, int n); void SortArr(struct student1 *arr, struct student2 *arr2, int n);  int main() {     int m=0, n=0, i;     struct student1 sarr1[1000] = {0};     struct student2 sarr2[1000] = {0};      printf("请输入班级人数：\n");     scanf("%d", &n);     InputStudent(sarr1, n);     SortArr(sarr1, sarr2, n);     while (1)     {         printf("请输入排名号(0退出)：\n");         scanf("%d", &m);         if (m == 0)             break;         if (m<0 || m>n)         {             printf("输入错误，请重新输入：\n");         }         else         {             for (i=0; i<n; i++)             {                 if (m == sarr2[i].ranking)                 {                     printf("学号\t姓名\t出生日期\t成绩一\t成绩二\t成绩三\t成绩四\t成绩五\t平均分\n");                       printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n",sarr1[i].num, sarr1[i].name,                            sarr1[i].birth, sarr1[i].yw, sarr1[i].sx, sarr1[i].yy, sarr1[i].wl,                            sarr1[i].hx, sarr1[i].aver);                     break;                 }             }         }     }       return 0; }  void InputStudent(struct student1 *arr, int n) {     int i;     for (i=0; i<n; i++)     {         printf("请输入第%d位学生的学号、姓名、出生日期、成绩一、成绩二、成绩三、 成绩四、成绩五：\n", i+1);         scanf("%d%s%s%d%d%d%d%d",&arr[i].num, arr[i].name, arr[i].birth,               &arr[i].yw, &arr[i].sx, &arr[i].yy, &arr[i].wl, &arr[i].hx);         arr[i].aver = (arr[i].yw + arr[i].sx + arr[i].yy + arr[i].wl + arr[i].hx) / 5.0;      } }   void SortArr(struct student1 *arr, struct student2 *arr1, int n) {     struct student1 temp = {0};     int i, j;     for (i=0; i<n-1; i++)     {         for (j=0; j<n-i; j++)         {             if (arr[j].aver < arr[j+1].aver)             {                 temp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = temp;             }         }     }     for (i=0; i<n; i++)     {         arr1[i].ranking = i+1;         arr1[i].num = arr[i].num;         strcpy(arr1[i].name, arr[i].name);         arr1[i].aver = arr[i].aver;     } }