Question: 大一小白

看一下打开文件函数的返回值，确定打不开文件的原因是什么？

引用 7 楼 棉猴的回复:干脆用JK0638.txt的绝对路径吧 就算用绝对路径也打不开。

就算用绝对路径也打不开。

引用 3 楼 qq_48935908 的回复:[quote=引用 2 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h> #include <string.h>  struct paper {     int opus;     char sort[30];     char book[20];     char writer[20];     char press[30];     int number;     float price; }std[15]; int Diaoyon = 10; void menu() {     printf("-------------------------\n");     printf("| 简易图书管理系统 |\n");     printf("-------------------------\n");     printf("| 1:显示全部 |\n");     printf("| 2:按书名查询 |\n");     printf("| 3:按作者查询 |\n");     printf("| 4:按作者排序 |\n");     printf("| 5:按书名排序 |\n");     printf("| 6:添加记录 |\n");     printf("| 7:修改信息 |\n");     printf("| 8:总价 |\n");     printf("| 9:借阅查询 |\n");     printf("| 0:结束 |\n");     printf("-------------------------\n"); } int xsqb() {     int i;     struct paper std[15];     printf("\n编号 分类 书名 作者 出版社 数量 单价");     for (i = 0; i < Diaoyon; i++)         //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);         printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);      return 0;    //定义的是int类型 }  int asmcx() {     char book[20] = "";     int ibook = 0, i;     int G; Loop:     printf("请输入书名:");     //fflush(stdin);    //此句跟编译器有关，不一定有效     scanf("%s", book);     for (i = 0; i < Diaoyon; i++)     {         if (!strcmp(book, std[i].book))         {             //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);             printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);             ibook = 1;         }     }     //下面的语句应该放到for循环外，而不是循环里     if (!ibook)     {         printf("\n未找到匹配图书");     }     printf("\n输入33继续查找：");     //fflush(stdin);     //scanf("%c", G);     scanf("%d", &G);     if (G == 33)         goto Loop;      return 0; }    int azzcx() {     char writer[20] = "";     int abook = 0, i;     int M; Loop:     printf("请输入作者名:");     fflush(stdin);     scanf("%s", writer);     for (i = 0; i < Diaoyon; i++)     {         if (!strcmp(writer, std[i].writer))         {             //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);             printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);             abook = 1;         }     }     //下面的语句放到循环外         if (!abook)         {             printf("\n未找到匹配图书");         }         printf("\n输入00继续查找：");         //fflush(stdin);         //scanf("%c", M);         scanf("%d", &M);         if (M == 0)             goto Loop;  }  int azzpx() {     return 0; } int asmpx() {     return 0; }  int tjjl() {     int i, a;     float j;     char zxc[30]; Loon:     printf("\n请按格式：编号 分类 书名 作者 数量 单价，输入");     //fflush(stdin);     scanf("%d", &a);     if (a >= 1 || a <= Diaoyon)     {         printf("编号重复，请输入1到%d之外的数字：", Diaoyon);         goto Loon;     }     else         std[a - 1].opus = a;     scanf("%s", zxc);     strcpy(std[a - 1].sort, zxc);     scanf("%s", zxc);     strcpy(std[a - 1].book, zxc);     scanf("%s", zxc);     strcpy(std[a - 1].writer, zxc);     scanf("%s", zxc);     strcpy(std[a - 1].press, zxc);     scanf("%d", &i);     std[a - 1].number = i;     scanf("%0.2f", &j);     std[a - 1].price = j;      return 0; }  int xgxx() {     int i, n;     char wtr[20];     float j; Loot:     printf("请输入需修改图书编号：");     scanf("%d", &n);     if (n<1 || n>Diaoyon)     {         printf("输入错误，编号在1到%d之间", Diaoyon);         goto Loot;     }     //printf("所需图书为：%d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort[30], std[n - 1].book[20], std[n - 1].writer[20], std[n - 1].press[30], std[n - 1].number, std[n - 1].price);     printf("所需图书为：%d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort, std[n - 1].book, std[n - 1].writer, std[n - 1].press, std[n - 1].number, std[n - 1].price);     printf("修改顺序为：\n 分类 书名 作者 出版社 数量 单价");     scanf("%s", wtr);     strcpy(std[n - 1].sort, wtr);     scanf("%s", wtr);     strcpy(std[n - 1].book, wtr);     scanf("%s", wtr);     strcpy(std[n - 1].writer, wtr);     scanf("%s", wtr);     strcpy(std[n - 1].press, wtr);     scanf("%d", &i);     std[n - 1].number = i;     scanf("%0.2f", &j);     std[n - 1].price = j;     //printf("\n修改后所得为：\n %d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort[30], std[n - 1].book[20], std[n - 1].writer[20], std[n - 1].press[30], std[n - 1].number, std[n - 1].price);     printf("\n修改后所得为：\n %d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort, std[n - 1].book, std[n - 1].writer, std[n - 1].press, std[n - 1].number, std[n - 1].price); } int zj() {  } int jycx() {  } void ReadFile() {     FILE *fp;     int i = 0, j;     if ((fp = fopen("JK0638.txt", "r")) == NULL)     {         printf("Cannot open file\n");         return;     }     //fscanf(fp, "%s %s %s %s %s %s %s", std[0].opus, std[0].sort, std[0].book, std[0].writer, std[0].press, std[0].number, std[0].price);     fscanf(fp, "%d %s %s %s %s %d %f", &std[0].opus, std[0].sort, std[0].book, std[0].writer, std[0].press, &std[0].number, &std[0].price);     while (!feof(fp))     {         //fscanf(fp, "%d %s %s %s %s %d %f", &std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], &std[i].number, &std[i].price);         fscanf(fp, "%d %s %s %s %s %d %f", &std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, &std[i].number, &std[i].price);         //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);         printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);         i++;     }     Diaoyon = i;     fclose(fp); } void main() {     int ind;     do     {         ReadFile();         menu();         printf("请输入操作编号:");         scanf("%d", &ind);         switch (ind)         {             case 1:xsqb(); break;             case 2:asmcx(); break;             case 3:azzcx(); break;             case 4:azzpx(); break;             case 5:asmpx(); break;             case 6:tjjl(); break;             case 7:xgxx(); break;             case 8:zj(); break;             case 9:jycx(); break;             case 0:exit(17);         }     } while (17);   //这儿为什么用17，用1不一样吗？ }  供参考～  代码问题比较多，但是归纳起来也就几个，多出是相同的错误。建议楼主对比代码找一下自己的问题～ 可以了，十分感谢[/quote]  最重要的是找出自己错误的原因，然后总结学到的东西～

引用 2 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <string.h>  struct paper {     int opus;     char sort[30];     char book[20];     char writer[20];     char press[30];     int number;     float price; }std[15]; int Diaoyon = 10; void menu() {     printf("-------------------------\n");     printf("| 简易图书管理系统 |\n");     printf("-------------------------\n");     printf("| 1:显示全部 |\n");     printf("| 2:按书名查询 |\n");     printf("| 3:按作者查询 |\n");     printf("| 4:按作者排序 |\n");     printf("| 5:按书名排序 |\n");     printf("| 6:添加记录 |\n");     printf("| 7:修改信息 |\n");     printf("| 8:总价 |\n");     printf("| 9:借阅查询 |\n");     printf("| 0:结束 |\n");     printf("-------------------------\n"); } int xsqb() {     int i;     struct paper std[15];     printf("\n编号 分类 书名 作者 出版社 数量 单价");     for (i = 0; i < Diaoyon; i++)         //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);         printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);      return 0;    //定义的是int类型 }  int asmcx() {     char book[20] = "";     int ibook = 0, i;     int G; Loop:     printf("请输入书名:");     //fflush(stdin);    //此句跟编译器有关，不一定有效     scanf("%s", book);     for (i = 0; i < Diaoyon; i++)     {         if (!strcmp(book, std[i].book))         {             //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);             printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);             ibook = 1;         }     }     //下面的语句应该放到for循环外，而不是循环里     if (!ibook)     {         printf("\n未找到匹配图书");     }     printf("\n输入33继续查找：");     //fflush(stdin);     //scanf("%c", G);     scanf("%d", &G);     if (G == 33)         goto Loop;      return 0; }    int azzcx() {     char writer[20] = "";     int abook = 0, i;     int M; Loop:     printf("请输入作者名:");     fflush(stdin);     scanf("%s", writer);     for (i = 0; i < Diaoyon; i++)     {         if (!strcmp(writer, std[i].writer))         {             //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);             printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);             abook = 1;         }     }     //下面的语句放到循环外         if (!abook)         {             printf("\n未找到匹配图书");         }         printf("\n输入00继续查找：");         //fflush(stdin);         //scanf("%c", M);         scanf("%d", &M);         if (M == 0)             goto Loop;  }  int azzpx() {     return 0; } int asmpx() {     return 0; }  int tjjl() {     int i, a;     float j;     char zxc[30]; Loon:     printf("\n请按格式：编号 分类 书名 作者 数量 单价，输入");     //fflush(stdin);     scanf("%d", &a);     if (a >= 1 || a <= Diaoyon)     {         printf("编号重复，请输入1到%d之外的数字：", Diaoyon);         goto Loon;     }     else         std[a - 1].opus = a;     scanf("%s", zxc);     strcpy(std[a - 1].sort, zxc);     scanf("%s", zxc);     strcpy(std[a - 1].book, zxc);     scanf("%s", zxc);     strcpy(std[a - 1].writer, zxc);     scanf("%s", zxc);     strcpy(std[a - 1].press, zxc);     scanf("%d", &i);     std[a - 1].number = i;     scanf("%0.2f", &j);     std[a - 1].price = j;      return 0; }  int xgxx() {     int i, n;     char wtr[20];     float j; Loot:     printf("请输入需修改图书编号：");     scanf("%d", &n);     if (n<1 || n>Diaoyon)     {         printf("输入错误，编号在1到%d之间", Diaoyon);         goto Loot;     }     //printf("所需图书为：%d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort[30], std[n - 1].book[20], std[n - 1].writer[20], std[n - 1].press[30], std[n - 1].number, std[n - 1].price);     printf("所需图书为：%d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort, std[n - 1].book, std[n - 1].writer, std[n - 1].press, std[n - 1].number, std[n - 1].price);     printf("修改顺序为：\n 分类 书名 作者 出版社 数量 单价");     scanf("%s", wtr);     strcpy(std[n - 1].sort, wtr);     scanf("%s", wtr);     strcpy(std[n - 1].book, wtr);     scanf("%s", wtr);     strcpy(std[n - 1].writer, wtr);     scanf("%s", wtr);     strcpy(std[n - 1].press, wtr);     scanf("%d", &i);     std[n - 1].number = i;     scanf("%0.2f", &j);     std[n - 1].price = j;     //printf("\n修改后所得为：\n %d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort[30], std[n - 1].book[20], std[n - 1].writer[20], std[n - 1].press[30], std[n - 1].number, std[n - 1].price);     printf("\n修改后所得为：\n %d %s %s %s %s %d %0.2f", std[n - 1].opus, std[n - 1].sort, std[n - 1].book, std[n - 1].writer, std[n - 1].press, std[n - 1].number, std[n - 1].price); } int zj() {  } int jycx() {  } void ReadFile() {     FILE *fp;     int i = 0, j;     if ((fp = fopen("JK0638.txt", "r")) == NULL)     {         printf("Cannot open file\n");         return;     }     //fscanf(fp, "%s %s %s %s %s %s %s", std[0].opus, std[0].sort, std[0].book, std[0].writer, std[0].press, std[0].number, std[0].price);     fscanf(fp, "%d %s %s %s %s %d %f", &std[0].opus, std[0].sort, std[0].book, std[0].writer, std[0].press, &std[0].number, &std[0].price);     while (!feof(fp))     {         //fscanf(fp, "%d %s %s %s %s %d %f", &std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], &std[i].number, &std[i].price);         fscanf(fp, "%d %s %s %s %s %d %f", &std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, &std[i].number, &std[i].price);         //printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price);         printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price);         i++;     }     Diaoyon = i;     fclose(fp); } void main() {     int ind;     do     {         ReadFile();         menu();         printf("请输入操作编号:");         scanf("%d", &ind);         switch (ind)         {             case 1:xsqb(); break;             case 2:asmcx(); break;             case 3:azzcx(); break;             case 4:azzpx(); break;             case 5:asmpx(); break;             case 6:tjjl(); break;             case 7:xgxx(); break;             case 8:zj(); break;             case 9:jycx(); break;             case 0:exit(17);         }     } while (17);   //这儿为什么用17，用1不一样吗？ }  供参考～  代码问题比较多，但是归纳起来也就几个，多出是相同的错误。建议楼主对比代码找一下自己的问题～ 可以了，十分感谢

引用 1 楼 棉猴的回复:JK0638.txt文件存在么？ 存在，只是一直cannot open file


Question: 大佬再看看我

运行不了，或者出错，就设置断点，调试一下，看看哪里出问题

改了，但是运行不了

student大小写注意一下，有的地方大写了

的左侧部分指定未定义的结构/联合“Student”，谢谢大佬

你得先说你的问题是什么

大佬看看我呀


Question: 先对程序进行编译，修改语法错误。再用设置断点的方法，查找并修改程序中的语义错误，使其完成计算。

发错题目了

楼上说的对哦，fac里得 int f=1; main里得 int add=0;初始化一下，不然f,add就是个随机数

两个函数里的f,add没有初始化，所以你得到的数值不对吧

是送分吗？还是？


Question: 如何用C语言编写一个函数，输入这张有向网，并用邻接矩阵来存储？

用1,2，3...代表节点a，b，c... 定义一个二维数组d[N][N]，有边的d[i][j]就输入边的权值，没有边的就赋值-1或者0x7f

你先定义一个结构体，结构体包含字段比如距离，节点方向等，再定义一个结构体数组


Question: 单片机 缺少语句

大神帮忙看下


Question: 求大佬们看看这10个判断题，最近复习c语言，有好多不太明白的地方

建议把问题用文字描述清楚～

这一黑板的板书内容都不明白吗

不明白的地方，上机体验一下

哪里不明白？


Question: 小白求救        C语言 将文件内容读入结构体后，无法对结构体内数据进行处理，请问是哪里错了

文件内容 10101  m1    85    90   4000 10102  m2    72    65   2500 10103  m3    66    47   1750 10104  m4    40    87   3700 10105  m5    72    91   3600 10106  m6    84    48   1800 10107  m7    90    80   3060 10108  m8    57    84   3200 10109  m9    77    99   4300 10110  m10   81    83   3300 10111  m11   90    44   2020 10112  m12   54    92   4150 10113  m13   75    80   3000 10114  m14   52    64   2250 10115  m15   75    57   2260 10116  m16   76    79   2730 10117  m17   38    95   4220 10118  m18   68    95   4250 10119  m19   80    67   2350 10120  m20   80    58   2050 10121  m21   82    60   2100 10122  m22   53    80   3220 10123  m23   56    94   3640 10124  m24   74    75   2800 10125  m25   84    71   2530 10126  m26   90    90   4000 10127  m27   91    70   2520 10128  m28   80    93   3950 10129  m29   91    66   2320 10130  m30   39    83   3150

for(j = 0;j<30;j++)     { if(class1[j].jump>60 && class1[j].run>60) { printf("%d  %s  %d  %d  %d\n",class1[j].id,class1[j].name,class1[j].jump,class1[j].run,class1[j].breath); }     }  ============================= for (i = 1; i <= nr+1; i++)	{	 fgets(buf, N, fp);    	 sscanf(buf, "\n  %d     %s    %d    %d\n", &line1[i].id, &line1[i].name, &line1[i].jump,&line1[i].run);	  你的class1和读入结构体的 line1有关系吗？

fgets(buf, N, fp); 这句也很可能读不全一行内容，建议把buf定义成128或256，当然要根据一行数据的字节数来定～

#include<stdio.h> #include <string.h> #include<stdlib.h>  #define N 32  struct object {     int id;     char *name;     int jump;     int run;         int breath;     int weight; }class1[N];  void open();  int main(void) {     int number;     printf("               1.查询合格学生\n");     printf("               0.退出系统\n");     printf("               请输入数字指令：\n");     scanf("%d",&number);      while (!(number>=0&&number<=8))     {         printf("               没有这个选项，请重新输入：\n");     }      switch(number)     {         case 0:         {             printf("               已退出管理系统");             return 0;         }         case 1:         {              int j;             open();             for(j = 0;j<30;j++)             {                 if(class1[j].jump>60 && class1[j].run>60)                 {                     printf("%d  %s  %d  %d  %d\n",class1[j].id,class1[j].name,class1[j].jump,class1[j].run,class1[j].breath);                 }             }             printf("-------------------------------------------------\n");              break;         }         /*         case 0:{    //这是做啥？一个switch中两个case 0？                    printf("已退出管理系统");                    return 0;                    break;                }                */      }     return 0; } void open() {     FILE *fp;     int i,j,nr = 0;     char buf[N],c;     fp = fopen("class.txt", "r");     if (fp == NULL) {    //既然文件无法打开了，为啥不退出函数呢？还要继续往下执行吗？那样不就出错了嘛         printf("文件无法打开\n");         return;   //退出      }     while (!feof(fp)) {         c = fgetc(fp);         if (c == '\n')             nr++;     }     printf("nr=%d\n", nr);     rewind(fp);     struct object*line1 = NULL;     //line1= (struct object*)malloc(sizeof(struct object)*(nr+1));     line1= (struct object*)malloc(sizeof(struct object)*(nr));     //for (i = 1; i <= nr+1; i++) {     for (i = 0; i < nr; i++) {         fgets(buf, N, fp);         //sscanf(buf, "\n  %d     %s    %d    %d\n", &line1[i].id, &line1[i].name, &line1[i].jump,&line1[i].run);         sscanf(buf, "\n  %d     %s    %d    %d\n", &line1[i].id, line1[i].name, &line1[i].jump,&line1[i].run);     }     if (nr > N)         nr = N;     memcpy(class1, line1, sizeof(struct object) * nr);     free(line1); }  供参考～  要处理首先需要给class1赋值呢，你把读到的数据放到line1中，然后呢？数据会自动到class1中？

没有看到处理的语句

你想怎么处理？

你想怎么处理？


Question: 文件的上传与下载

谢谢大佬意见

不要socket?你想干什么,绕防火墙?(不是驱动是不可能的),绕过socket就必须直接与驱动通信(WIndows系统建议WinPcap驱动,使用挺简单的) 至于多线程下载(是个含糊的观点,多连接下载不一定要多线程,参考IDM),具体可参考https://github.com/aria2/aria2 上传还是先学好多线程下载再说吧

模拟迅雷完成文件的上传与下载  使用多线程进行文件的上传与下载

这么限制，那怎么弄？不用socket，那么间接可以使用吗？ 你是要做什么？wget、ftp，tftp可以试一下～


Question: 求有代码的线下实体店收银系统

需要涉及到扫码，前段界面，后端数据库等等，这不是一个小工程～

功能都是大众的，只要有现成的模板，有端口开放程序，有app后台管理，就有用


Question: 大佬看看我

引用 楼主 weixin_49032502的回复:请编写一个函数int fun(char *ss,char *s)，该函数的功能是：求出ss字符串中指定字符串s的个数，并返回此值。  例如，若输入ss="1311231232"，s="12"，则输出2。  #include<stdio.h>  #define  M 81  int fun(char*ss, char *s)  {      }  void main()  { char  a[M], s[M];    printf("\nPlease enter a string:");  gets(a);    printf("\nPlease enter a substring:");  gets(s);    printf("\nThe count  is: %d\n", fun(a, s));  }  要求：1）上述程序文件名E4-6.C的文件，存放在E盘根目录下；  2）请勿改动主函数main的任何内容，仅在函数fun的括号中填入你编写的若干语句。 谢谢大佬们，我只会当个字符的计算 多个字符的，只是多一个循环

她这个函数肯定是希望不要用到已有的字符串函数的

int fun(char*ss, char *s) {     int num, len, sublen;     char *p, *q;      len = strlen(ss);     sublen = strlen(s);      p = ss;     num = 0;     while (p < ss+len) {         q = strstr(p, s);         if (q)             num++;         else             break;         p = q+sublen;     }      return num; }  供参考～  没测试，建议楼主自己测试一下～有问题可以先自己调试一下～


Question: 有偿求程序  C语言模拟时钟

[小插曲]VC学习——基于MFC的模拟时钟程序

VC6可以用另外的绘图方式，那个TC的

我也不太懂，可以参考这个程序   https://codebus.cn/bestans/a/clock-simulation

vc6应该是没有这个头文件的吧


Question: 求个大佬帮忙！！！急

引用 1 楼 user-1 的回复：完整的程序主要得自己写，有问题可以帮着看看可以留个微信吗！！！

完整的程序主要得自己写，有问题可以帮着看看


Question: 求助  大佬们帮忙看下这是什么情况

楼主的文件内容是通过fwrite写入的吗？如果不是，或者是手动写入的，建议用fscanf/fprintf而不要用fread。

你看一下文件内容

/*显示地名信息*/ #include <stdlib.h>  #include <conio.h> #include <stdio.h>  #include"place_data.h" /*  * 函数名称：sort  * 函数功能：显示地名相关信息   * 形式参数：无  * 返 回 值：无   */ void sort() { 	system("cls");  	FILE *fpIn,*fpcnt; 	int i; 	fpIn=fopen("Place_date.dat","rb"); 	fpcnt=fopen("number.dat","rb"); 	struct place m[101]; 	fread(m,sizeof(struct place),100,fpIn); 	fread(&total,sizeof(int),1,fpcnt); 	fseek(fpIn,0,SEEK_SET); 	printf("\t\t1代表省、直辖市\n\t\t2代表地级市\n\t\t3代表县、旗、特区\n\t\t4代表街道、镇、乡\n\t\t----------------\n"); 	for(i=0;i<total;i++){ 	printf("\n\t\t行政划分等级为:%d\n",m[i].grade); 	printf("\t\t地区名为:%s\n",m[i].adr); 	printf("\t\t邮编号为:%d\n",m[i].pcode); 	printf("\n\t\t----------------\n"); 	} 	if(getch()){ 		system("cls"); 	} 	 fclose(fpIn); 	 fclose(fpcnt); 	 }   到底是add 有问题还是 sort 有问题

/*增加地名信息*/  #include <stdlib.h>  #include <conio.h> #include <stdio.h>  #include"place_data.h" #include <string.h> /*  * 函数名称：del  * 函数功能：增加地名相关信息   * 形式参数：无  * 返 回 值：无   */ void add(){  	struct place m[100];  	system("cls");  	FILE *fpIn,*fpOut,*fpcnt;  	fpcnt=fopen("number.dat","wb+");//打开记录信息数文件  	fpOut=fopen("Place_date.out","ab") ;//打开临时文件  	fpIn=fopen("Place_date.dat","rb");//打开储存文件   	fread(&total,sizeof(int),1,fpcnt); 	fread(m,sizeof(struct place),100,fpIn);  	if(fpOut!=NULL){ 		printf("\t\t1代表省、直辖市\n\t\t2代表地级市\n\t\t3代表县、旗、特区\n\t\t4代表街道、镇、乡");  		printf("\n\t\t请输入行政划分等级:"); 		fflush(stdin); 		scanf("%1d",&m[total].grade);  		printf("\t\t请输入地区名:");   		fflush(stdin);  		scanf("%s",m[total].adr);  		printf("\t\t请输入邮政编号:");  		fflush(stdin);  		scanf("%6d",&m[total].pcode);  		system("cls"); 		fwrite(&m[total],sizeof(struct place),1,fpOut); 		fflush(stdin); 		total++; 		fwrite(&total,sizeof(int),1,fpcnt); 	 }else { 	 printf("无法打开文件\n");} 	 fclose(fpOut); 	 fclose(fpIn); 	 fclose(fpcnt); 	 remove("Place_date.dat");/*删除原数据文件*/ 	 rename("Place_date.out","Place_date.dat");/*将临时文件更名为数据文件*/  }


Question: 麻烦注释一下这一段代码，中间的if循环和while循环不太懂~

这应该是插入排序，while循环是在找要插入的位置。 per[j+1]=per[j];这个操作就是在腾空间，找到要插入的位置。

while就是在冒泡  t = per[i];//记录下当前要冒泡的元素  per[j+1]=per[j];//要冒泡的元素满足while的条件（比前一个元素小）时把该元素往前放   j--;//往前循环比较  while((strcmp(t.cName,per[j].cName) < 0 && j >= 0));//将要冒泡的元素和前面的元素比较


Question: 麻烦大佬解释一下这段代码如何运行的~

可以想象一下扑克牌，拿到一张牌，然后寻找插入的位置，找到后插入～

类似于一个插入排序。

声明一个结构体变量 t，然后比较cName，交换。


Question: 有偿求程序 设计程序显示汉字 科海无边 然后通过上下箭头键实现缩放功能

gdi绘图，等比缩放

本来显示16x16的点阵，缩放时可以显示24x24，32x32的点阵，字库都带上。

DOS年代科海的书很出名。点阵字体不好缩放。

DOS年代科海的书很出名。

在哪里实现？MFC？


Question: c语言背景音乐无法播放，哪位大佬知道为什么？

调试一下，看看是什么原因，播放完了，还是没有找到文件等


Question: c语言链表

引用 3 楼 user-2的回复:你期待中创建的链表要写入什么数据？ LinkList* InsertLinkListhead(LinkList* head) { LinkList *newhead; newhead= (LinkList*)malloc(sizeof(LinkList)); printf("请输入你要插入的链表节点的数：\n"); scanf("%d", &(newhead->data)); if (head == NULL) { head = newhead; return head; } else { newhead->next = head; head = newhead;  } return head;  你的链表只在头节点里写入了一个节点个数的正数，然后就没了  void PrintLinkList(LinkList* head) { while (head != NULL) { printf("%d ", head->data);  head = head->next; } puts(""); }  在输出节点时，因为你创建的newhead节点并没有设置newhead->next = NULL.所以你的程序可能就无限循环了。 OK大概懂了谢谢哈

你在那里加个断点，调试一下就知道了

head没有初始化


Question: 备考专升本，一个简单的题不知道哪错了运行不出来

d在百分号后面 printf("%d年%d月%d日",year, month, day); 对于printf()函数的用法，请参考《C++中printf()函数的用法10-1》

printf放到switch外面

错误： 1. return 0；语句放在main()函数末尾，不要放在switch(){}语句中； 2. case 2：语句中的if判断部分，其括号中不应该带""；正确写法 if (year % 4 == 0 || year % 400 == 0) {}   规范： 1. case 2：语句中增加break; 2. switch(){}语句中增加default分支； 3. 打印语句（printf()）放在switch(){}外面比较好；

输入时2018 9 不要加逗号  switch (month) {    ... }  printf(); return 0;

'return 0'后面的'}'要放到printf前面去


Question: C语言中的链栈问题

#include <stdio.h> #include <stdlib.h>   #define OK     1 #define ERROR  0   typedef struct node {     int num;     struct node *next; }LinkStackNode,LinkStack;   //链表的一个个结点   链表   void initStack(LinkStack **top);       //初始化链栈 int push(LinkStack *top, int n);      //链栈进栈操作 void pop(LinkStack *top);             //链栈出栈操作 int getTop(LinkStack *top, int *s);   //读取链栈栈顶元素   int main() {     LinkStack *TOP;     int n;     int *data;       initStack(&TOP);   //初始化链栈       getchar();     getchar();     return 0; }   void initStack(LinkStack **top)     //初始化链栈 {     *top = (LinkStack *)malloc(sizeof(LinkStack));     (*top)->next = NULL;     if (!(*top))     {         printf("分配内存失败！\n");         exit(1);     }     printf("初始化成功！\n"); }  需要用二重指针，一重指针不能把malloc的空间返回。  我想程序在后面使用的时候出现的问题，因为TOP是一个野指针，即使是调用了初始化栈之后还是一个野指针，所以用二重指针，或者在C++编译器里，可以用*&top作为形参，实参可以直接用TOP而不用加&

#include <stdio.h> #include <stdlib.h>  #define OK     1 #define ERROR  0  typedef struct node {     int num;     struct node *next; }LinkStackNode,LinkStack;   //链表的一个个结点   链表  void initStack(LinkStack *top);       //初始化链栈 int push(LinkStack *top, int n);      //链栈进栈操作 void pop(LinkStack *top);             //链栈出栈操作 int getTop(LinkStack *top, int *s);   //读取链栈栈顶元素  int main() {     LinkStack *TOP;     int n;     int *data;      initStack(TOP);   //初始化链栈      getchar();     getchar();     return 0; }  void initStack(LinkStack *top)     //初始化链栈 {     top = (LinkStack *)malloc(sizeof(LinkStack));     top->next = NULL;     if (!top)     {         printf("分配内存失败！\n");         exit(1);     }     printf("初始化成功！\n"); }  并没有报错。把你的报错信息截图看一下

但是用法不对，参数可以改成*&或者返回top，这样修改不了top

什么事都没有做，应该不会出错


Question: 编程实现：从键盘输入20个整数，求其平均值，然后输出平均值以上的所有元素。

谢谢谢谢！仰望…

我和我最后的倔强。。。::>_<::无奈

手写代码很不错

#include <stdio.h> #define N 20 int main() { 	int a[N], i, s;//-------数组a的声明改为a[N]---- 	s = 0; 	float k;//-------平均分k的类型改为float-------- 	printf("请输入%d个数字:", N); 	for (i = 0; i < N; i++)//---------把两个循环改为一个，提高效率--------- 	{ 		scanf("%d", &a[i]); 		s = s + a[i]; 	} 	k = (float)s / N;//--------修改求平均分的方法------- 	printf("平均分为%f\n", k); 	printf("超过平均分的有："); 	for (i = 0; i < N; i++) 	{ 		if (a[i] > k) 		{ 			printf("%d ", a[i]); 		} 	} 	return 0; }  VS2015 C++环境调试（只输入了5个数字）

另一位小伙伴指出了除法是\ 和max可以不用定义😂谢谢你们啦

另一位小伙伴指出了除法是\ 和max可以不用定义😂谢谢你们啦👍

很对的样子。


Question: 求一个 linux 下使用 SDL_ttf 显示文字的demo

里面的writeLog（）作用是写日志


Question: 求助：为什么picture1打开不了？

还是不行，图片是我从网上随便下载的，是不是权限问题？

用如下方式打印一下，可以知道错误原因   if( !(f_file = fopen(file_name,"rb")))     {         printf("cannot open the file %s!",file_name);         printf("%s\n", strerror(errno)):         return;     } 需要注意，每个打开文件都建议加上这句，并且需要引入string.h和errno.h头文件

可能1.jpg不存在


Question: 求助一个C语言问题

楼主的代码应该是出现死循环了，因为for循环变量是i，楼主看一下while循环是不是也用到i，并且对i操作了i  = i /10;所以i的变化最后又变成0.

#include  <stdio.h> int main() { 	int n, i, temp, sum, count=0;  	scanf("%d", &n); 	for ( i=1; i<=n; i++ ) { 		sum = 0; 		temp = i; 		while ( temp > 0 ) {		//分解每位数组并求和  			sum += temp%10; 			temp /= 10; 		} 		if ( sum%15==0 ) { 			printf("%d:%d\n", ++count, i); 		} 	} 	printf("count = %d\n", count ); 	return 0; }

上面的都是常规代码，就没有贴出来了


Question: 关于typedef的疑问

上边说的根本没说到点上。 typedef 的作用确实是别名，至于为什么要写一样的名字，因为在c语言里在一些老的编译器声明结构体变量要加struct关键字（而且标准声明变量的时候就是要加struct的）。struct PTNode node; 加了typedef后声明变量就可以直接用PTNode node; 就可以了。

typedef struct PTNode   //为什么这里用了PTNode --》没有为什么，这个名字可以任意取 {     TElemType data;     int parent; } PTNode;                      //这里也用PTNode？？？好好地干嘛用两个一样的名字呢？--》这里也一样，名字可以任意取，如果非要较真，可能写代码的人懒得再换个名字。

从上往下，第一个 PTNode ：是 struct 定义的结构体的名字，此时可以使用此名字构造函数，析构函数等； 第二个 PTNode ：是 typedef 定义的另外一个名字，就像我有一个大名 A ，还有一个小名 B ，你也可以喊我 B 一样。  至于这两个地方的名字一样，此时不建议用一样的名字，不容易区分。真要纠结的话，那就是楼上说的命名不规范了...  希望对你有帮助~

这么写就是不规范


Question: vs运行正常代码在vc6.0中出现bug。可能是getline函数的问题吗？

我重新发了个帖子，有全部代码和问题描述的，这个帖子不知道怎么样删除，刚刚来。。。。。


Question: c++关于结构体的题目想问一下怎么做

第4问自己参照着写吧  #include <stdio.h> #include <stdlib.h>  typedef struct student {     char name[20]; //姓名     float ps;      //平时成绩     float sx;      //实习成绩     float cy;      //测验成绩     float qm;      //期末成绩     float zp;      //总评成绩 }stu;  //输入成绩 void Input(stu *ArrStu, int n) {     int i;     for (i=0; i<n; i++)     {         printf("输入第%d个学生的姓名 平时 实习 测验 期末成绩: \n", i+1);         scanf("%s%f%f%f%f", ArrStu[i].name, &ArrStu[i].ps, &ArrStu[i].sx, &ArrStu[i].cy,               &ArrStu[i].qm);         ArrStu[i].zp = (ArrStu[i].ps * 0.1 + ArrStu[i].sx * 0.2 + ArrStu[i].cy * 0.2 +                         ArrStu[i].qm * 0.5);     } }  void MaxZP(stu *StuArr, int n) {     if (StuArr == NULL)     {         printf("Error!");         exit(1);     }     int i, index;     float max = StuArr[0].zp;     for (i=0; i<n; i++)     {         if (max < StuArr[i].zp)         {             max = StuArr[i].zp;             index = i;         }     }     printf("%d\n", index);     printf("姓名：%s\n平时成绩：%.2f\n实习成绩：%.2f\n测验成绩：%.2f\n期末成绩：%.2f\n总评成绩：%.2f\n",            StuArr[index].name, StuArr[index].ps, StuArr[index].sx, StuArr[index].cy, StuArr[index].qm,            StuArr[index].zp); }  int main() {     stu *StuArr = NULL;     int n = 0, index = -1;      printf("输入学生人数：\n");     scanf("%d", &n);      StuArr = (stu *)malloc(sizeof(stu) * n);      Input(StuArr, n);     MaxZP(StuArr, n);        free(StuArr);     StuArr = NULL;      return 0; }


Question: C语言 文件操作

四个字节的整形可以表示几位数？

引用 1 楼 user-1的回复:因为： 第一种情况，写入4，其实只写了一个字节，读的时候要读4个字节，自然没有4个字节，就到了文件尾了。 第三种情况，读的时候要读到空格或者换行才会结束，所以也会读到文件末尾。 第二种情况，写入一个字节，读一个字节，自然不知道是否到文件尾了。 我把第一种情况改成写入一个5位数，feof还是1啊，显然与这里与字节关系不大

我把第一种情况改成写入一个5位数，feof还是1啊，显然与这里与字节关系不大


Question: 错误列表里的错误提示，请求大神帮助

函数的定义（或实现部分）不能写在main()里吧。

#include <stdio.h>  float aver(int b[]) { int i, sum = 0; float average; for(i=0; i< 10; i++)     sum += b[i]; average = sum / 10; return average; }  void main() {     int i;     float average;     int a[10]={90,80,88,78,94,56,50,70,65,89};     average = aver(a);     printf("the average is :%.2f", average); }

你是不是想把aver定义成aver(float *) 在aver里面计算平均值，外面调用就不用循环了


#include<stdio.h> int Fibonacci(int a){     if(a<=2)         return 1;     else{         return Fibonacci(a-1)+Fibonacci(a-2);     } } int main(){     int i,n,a;     scanf("%d",&n);     for(i=1;i<n;i++){         printf("%d\n",Fibonacci(i));     }     return 0; }

应该还是溢出的问题吧，你换成double类型的试试看 #include<stdio.h> double Fibonacci(int a) {     int i;     double f1 = 1,f2 = 1,f3;     if(a <= 2) return 1;     else     {         for(i = 3 ; i <= a ; i ++)         {             f3 = f1 + f2;             f1 = f2;             f2 = f3;         }         return f3;     } } int main() {     int i,n,a;     scanf("%d",&n);     for(i = 0 ; i < n ; i ++)     {         scanf("%d",&a);         printf("%.0f\n",Fibonacci(a));     }     return 0; }


Question: c语言程序运行后如果玩家1赢了，却无法输出玩家1获胜的文字咋整。小白求大佬帮助

int a; printf("请输入玩家1的名称: "); scanf("%s",a); player1=a;  int 和 %s怎么搞到一起了？

如图


Question: 关于二叉树的建立

引用 4 楼 傻猴子的回复:[quote=引用 3 楼 真相重于对错的回复:]你的递归函数没有出口啊 有的他最后那个n会变成0就跳出来了[/quote] 跳出来又有何用？你的树并没有正确的返回啊，因为跳出来只返回一个null

引用 3 楼 真相重于对错的回复:你的递归函数没有出口啊 有的他最后那个n会变成0就跳出来了

你的递归函数没有出口啊

引用 1 楼 user-2的回复:pre+1错了，为啥要pre+1？ 先序的下一个，中序左边也存在的不就是根的左孩子嘛


Question: 问一下，下面的图片的问题是啥？怎样解决?

输入的问题  改成scanf("%d%d",&a, &b);    //常规写法  或者不改，输入时在键盘输入3,4


Question: 求助！！C语言仓库管理相关

void input() {     struct Info info;     FILE *fp1,*fp2;     char f,ch[10];     fp1=fopen("1.dat","rb");//已存在只读二进制文件     fp2=fopen("2.dat","wb+");// 新建文件，允许读写 ，储存更新后的货物信息     printf("请输入货物编号:");     //scanf("%s",&ch);     scanf("%s", ch);     while(!feof(fp1))//读完fp1中的进库货物     {         if(fread(&info,sizeof(info),1,fp1))//从fp1中可以读1个对象到info中         {             if(strcmp(ch,info.num)==0)//如果该货物已经存在             {                 printf1();                 printf2(info);//查看目前库存                 printf("请输入货物数量：");                 scanf("%d",&info.amount);                 printf("\n");                 fwrite(&info,sizeof(info),1,fp2);//更新库存信息                 while(!feof(fp1))                 {                     if(fread(&info,sizeof(info),1,fp1))                         fwrite(&info,sizeof(info),1,fp2);                 }                 break;             }         }         else//出现新商品种类         {             printf("请输入新的信息：\n");             printf("请输入货物名称：");             scanf("%s",&info.name);             printf("\n");             printf("请输入货物数量：");             scanf("%d",&info.amount);             printf("\n");             printf("请输入货物编号:");             scanf("%s",&info.num);             fwrite(&info,sizeof(info),1,fp2);//更新库存信息         }     }     fclose(fp1);     fclose(fp2);     remove("1.dat");     rename("2.dat","1.dat");     printf("按任意键返回菜单");     getchar();     system("cls");     menu(); } 楼主的input函数没看出有问题吗？  最外层是判断fp1,但是内层while还是判断fp1。另外判断fp1和while循环里的else 输入有啥关系吗？  建议楼主还是把逻辑搞清楚了。

void output()//出库函数 { 	struct Info info; 	FILE *fp1,*fp2; 	int a; 	char ch[20]; 	printf("请输入需要出库的编号"); 	scanf("%s",ch); 	while(!feof(fp1)) 	{ 		if(fread(&info,sizeof(info),1,fp1)) 			if(strcmp(ch,info.num)==0)//是否存在该商品  			{ 				printf1(); 				printf2(info); 				printf("请输入需要出库的数量"); 				scanf("%d",&a); 				if(a<=info.amount)//判断库存是否大于需求  				{ 					info.amount-=a; 				    fwrite(&info,sizeof(info),1,fp2); 					printf("出库成功!\n"); 					if(info.amount==0){ 						zero(ch); 					}//库存为零时删除该货物  				} 				else 				{ 					printf("货物不足！您的请求被拒绝\n"); 				} 				while(!feof(fp1)) 				{ 					if(fread(&info,sizeof(info),1,fp1)) 					fwrite(&info,sizeof(info),1,fp2); 					break; 				} 			} 			else 				fwrite(&info,sizeof(info),1,fp2); 	} 	fclose(fp1);fclose(fp2); 	remove("1.dat"); 	rename("2.dat","1.dat"); 	system("pause"); 	printf("按任意键返回菜单"); 	getchar(); 	system("cls"); 	menu(); } void zero(char ch[10])          //删除货物信息  { 	struct Info info; 	FILE *fp1,*fp2; 	while(!feof(fp1)) 		{ 			if(fread(&info,sizeof(info),1,fp1)) 			{ 	 				printf("删除成功！\n");										 			} 		} 		fclose(fp1); 		fclose(fp2); 		remove("1.dat");//删除  		rename("2.dat","1.dat");  	printf("按任意键返回菜单"); 	getchar(); 	system("cls"); 	menu(); }

void input() {     struct Info info;     FILE *fp1,*fp2; 	char f,ch[10];     fp1=fopen("1.dat","rb");//已存在只读二进制文件  	fp2=fopen("2.dat","wb+");// 新建文件，允许读写 ，储存更新后的货物信息      printf("请输入货物编号:"); 	scanf("%s",&ch);     while(!feof(fp1))//读完fp1中的进库货物  	{ 		if(fread(&info,sizeof(info),1,fp1))//从fp1中可以读1个对象到info中   		{ 			if(strcmp(ch,info.num)==0)//如果该货物已经存在  			{ 				printf1(); 			    printf2(info);//查看目前库存  				printf("请输入货物数量："); 				scanf("%d",&info.amount); 				printf("\n"); 				fwrite(&info,sizeof(info),1,fp2);//更新库存信息  				while(!feof(fp1)) 				{ 				    if(fread(&info,sizeof(info),1,fp1)) 					fwrite(&info,sizeof(info),1,fp2); 				} 				break; 			}  		} 		else//出现新商品种类  		{ 			printf("请输入新的信息：\n");             printf("请输入货物名称："); 			scanf("%s",&info.name); 			printf("\n"); 			printf("请输入货物数量："); 			scanf("%d",&info.amount); 			printf("\n"); 			printf("请输入货物编号:"); 			scanf("%s",&info.num); 			fwrite(&info,sizeof(info),1,fp2);//更新库存信息 		} 	} 	fclose(fp1); 	fclose(fp2); 	remove("1.dat");     rename("2.dat","1.dat"); 	printf("按任意键返回菜单"); 	getchar(); 	system("cls");     menu(); }


Question: error C2440: '=' : cannot convert from 'int (*)[7]' to 'int *'  怎么错误大虾们，如何修改？加粗部

引用 12 楼 千梦一生 的回复:[quote=引用 6 楼 二进制脑袋 的回复:] [quote=引用 4 楼 千梦一生 的回复:] int a[7]; int* pi = &a;//cannot convert from 'int (*)[7]' to 'int *'  int* pii = (int*)&a; 有这样的吗？数组名就是数组首元素的地址了，楼主错在对地址再取地址，是二级指针了。 int* pii = a;[/quote]  有啊，前两天学到的，敲代码验证过int* pi = &a;//报错cannot convert from 'int (*)[7]' to 'int *'。  [/quote] int *p = &a 报错并不意味着&a是二级指针，而是 &a 是指向数组的指针。指向整数数组的指针和指向int*不是一个类型  甚至  int a[3]; int b[4]; &a 和 &b都不是一种类型的指针，他们无法直接转换

引用 6 楼 二进制脑袋 的回复:[quote=引用 4 楼 千梦一生 的回复:] int a[7]; int* pi = &a;//cannot convert from 'int (*)[7]' to 'int *'  int* pii = (int*)&a; 有这样的吗？数组名就是数组首元素的地址了，楼主错在对地址再取地址，是二级指针了。 int* pii = a;[/quote]  有啊，前两天学到的，敲代码验证过int* pi = &a;//报错cannot convert from 'int (*)[7]' to 'int *'。

int a[7]; 	int (*p)[7];  	p = &a; 	printf("a:%p, &a:%p, p:%p, *p:%p, &p[1]:%p, &(*p)[1]:%p.\n", a, &a, p, *p, &p[1], &(*p)[1]);  看看输出，就明白了。

引用 8 楼 真相重于对错 的回复:例如 int a[2][2]; 要用一个指针指向它，那么应该是  int (*p)[2][2]=&a; 数组是一种数据类型，而且他的特殊之处在 int arr[3] 和 int arr[5]是两种类型，而不是一种。 还有无论是一维数组，还是二维数组，在内存中都是连续的，所以一维数组和一级指针在内存的布局一致，但二维数组和二级指针在内存中的布局是不一致，所以不能简单地用 int arr[2][2]; int **p =&arr 而要 int (*p)[2][2]=&arr 也就是说p是一级指针，他指向的数据类型是一个二维数组 的确，一维数组名可以赋给同类型一级指针，但并不意味着一维数组等于一级指针。 int a[7]; int (*p)[7]; p = &a; printf("a:%p, &a:%p,(*p)[7]:%p,*p:%p.\n", a, &a, p, *p); 输出4个相同的值！这也是指向数组的指针的怪异之处。

再给段代码int arr[2][2]{ {1,2},{3,4} }; 	int* p = (int*)((void*)arr); 	for (int i = 0; i < 4; i++) 		cout << p[i] << " "; 输出 1 2 3 4;

&a 不是二级指针，他还是一级指针，只是指向的一个数组而已

引用 4 楼 千梦一生 的回复:int a[7]; int* pi = &a;//cannot convert from 'int (*)[7]' to 'int *'  int* pii = (int*)&a; 有这样的吗？数组名就是数组首元素的地址了，楼主错在对地址再取地址，是二级指针了。 int* pii = a;

scanf("%d",p[n].finalpay); 这儿的finalpay是数组，因此会出现类型不匹配。要么去掉结构体中的finalpay的数组，改用int finalpay;要么用  scanf("%d", &p[n].finalpay[0]);  如下的salary，meritpay，bonus同样如上处理～ scanf("%d",p[n].salary); printf("\t\t请输入的%d个员工的绩效工资:",n+1); scanf("%d",p[n].meritpay); printf("\t\t请输入的%d个员工的奖金:",n+1); scanf("%d",p[n].bonus); printf("\t\t请输入的%d个员工的应发工资:",n+1); scanf("%d",p[n].finalpay);

代码问题不少，关键是不知道你要干什么？

是在void total的定义那里的错误。

struct peolpe { int num; char name[20]; char sex[3]; char department[15]; int salary[6]; int meritpay[6]; int bonus[6];  int finalpay;  };


Question: 大一小白

引用 2 楼 chxchxkkk的回复:你的std结构体是怎么声明的？包含了哪些？ sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], 这几个是数组吗？ 如果类似于  char name[20]这样的，那么 printf时直接 std[i].name就行了，不需要后面的[20] struct paper { int opus; char sort[30]; char book[20]; char writer[20]; char press[30]; int number; float price; }; std[15]; 结构体是这个样子的

就是要做一个简易的图书管理系统，然后这个是要输出所有信息。

struct paper { 	int opus; 	char sort[30]; 	char book[20]; 	char writer[20]; 	char press[30]; 	int number; 	float price; }; std[15]; 结构体是这个样子的。

源码是什么呢？  贴一下可好？

引用 9 楼 ?Victor.??的回复:[quote=引用 8 楼 qq_48935908 的回复:] [quote=引用 1 楼 ?Victor.??的回复:]源码是什么呢？  贴一下可好？   nt xsqb() { 	int i; 		printf("\n编号	分类		书名		作者		出版社		数量	单价"); 	for (i = 0; i < Diaoyon; i++); 		printf("%d	%s	%s	%s	%s	%d	%0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price); } 这个函数完整是这个样子的。[/quote]  struct paper { 	int opus; 	char sort[30]; 	char book[20]; 	char writer[20]; 	char press[30]; 	int number; 	float price; } std[15];     //std[15]前面的分号去掉  int main() { 	int i, Diaoyon; 	printf("\n编号 分类 书名 作者 出版社 数量 单价"); 	for (i = 0; i < Diaoyon; i++)       //这个分号去掉 		printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price); }[/quote] 解决了，十分感谢，我for和if后面都加了分号,加的入魔了。十分感谢

引用 8 楼 qq_48935908 的回复:[quote=引用 1 楼 ?Victor.??的回复:]源码是什么呢？  贴一下可好？   nt xsqb() { 	int i; 		printf("\n编号	分类		书名		作者		出版社		数量	单价"); 	for (i = 0; i < Diaoyon; i++); 		printf("%d	%s	%s	%s	%s	%d	%0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price); } 这个函数完整是这个样子的。[/quote]  struct paper { 	int opus; 	char sort[30]; 	char book[20]; 	char writer[20]; 	char press[30]; 	int number; 	float price; } std[15];     //std[15]前面的分号去掉  int main() { 	int i, Diaoyon; 	printf("\n编号 分类 书名 作者 出版社 数量 单价"); 	for (i = 0; i < Diaoyon; i++)       //这个分号去掉 		printf("%d %s %s %s %s %d %0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price); }

引用 1 楼 ?Victor.??的回复:源码是什么呢？  贴一下可好？   nt xsqb() { 	int i; 		printf("\n编号	分类		书名		作者		出版社		数量	单价"); 	for (i = 0; i < Diaoyon; i++); 		printf("%d	%s	%s	%s	%s	%d	%0.2f", std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price); } 这个函数完整是这个样子的。

引用 6 楼 chxchxkkk的回复:printf("%d	%s	%s	%s	%s	%d %0.2f",std[i].opus, std[i].sort[30], std[i].book[20], std[i].writer[20], std[i].press[30], std[i].number, std[i].price); 修改成： printf("%d	%s	%s	%s	%s	%d %0.2f",std[i].opus, std[i].sort, std[i].book, std[i].writer, std[i].press, std[i].number, std[i].price); 还是一样的，显示表达式必须包含结构或联合类型。而且这只是一句代表性的所有语句，我只要加了std，还都是这个样子。


Question: C语言-条件运算符输出问题

引用 8 楼 早打大打打核战争 的回复:a < 1这条件可以去掉 这样也可以！了解了 VS2019还是0.4，怎么改都不行，我猜是编译器出问题了 VC++6.0没有问题，输出2.5 我带上a<1主要是因为避免和前边a>1重叠。

引用 7 楼 ?Victor.?? 的回复:[quote=引用 6 楼 Clancey P.M.R.S. Yu 的回复:] [quote=引用 5 楼 ?Victor.?? 的回复:] 奇怪  我用了你的代码还是2.5  b = (a >= 1 ? a : (a >= 0 && a < 1 ? 1 / a : -1 * a));  改成  b = (a >= 1 ? a : (((a >= 0) && (a < 1)) ? (1 / a) : (-1 * a)));  试试呢 还是不行，难不成是编译器问题？ [/quote]  vs吗，我也是呀，2017的  按理说不可能呀[/quote]  啊这，果然编译器有问题，我在虚拟机里跑XP，用VC++6.0最终得到了2.5.......  VS2019可能改了点我不知道的特性吧，我了解下

a < 1这条件可以去掉

引用 6 楼 Clancey P.M.R.S. Yu 的回复:[quote=引用 5 楼 ?Victor.?? 的回复:] 奇怪  我用了你的代码还是2.5  b = (a >= 1 ? a : (a >= 0 && a < 1 ? 1 / a : -1 * a));  改成  b = (a >= 1 ? a : (((a >= 0) && (a < 1)) ? (1 / a) : (-1 * a)));  试试呢 还是不行，难不成是编译器问题？ [/quote]  vs吗，我也是呀，2017的  按理说不可能呀

引用 5 楼 ?Victor.?? 的回复:奇怪  我用了你的代码还是2.5  b = (a >= 1 ? a : (a >= 0 && a < 1 ? 1 / a : -1 * a));  改成  b = (a >= 1 ? a : (((a >= 0) && (a < 1)) ? (1 / a) : (-1 * a)));  试试呢 还是不行，难不成是编译器问题？

引用 1 楼 ?Victor.?? 的回复:可以把你的代码复制黏贴上来吗？  我得到2.5 #include <stdio.h> #include <math.h> #include <stdlib.h> int main() { double x, y, a , b; printf("Input the value of x,y:"); scanf_s("%lf%lf", &x, &y); a = (x * 2 + 2) / y; b=(a >= 1 ? a : (a >= 0 && a < 1 ? 1 / a : -1 * a)); printf("%lf", b); system("pause"); return 0; }

可以把你的代码复制黏贴上来吗？  我得到2.5


Question: 错误列表的问题怎么解决，求答案

引用 3 楼 ?Victor.??的回复:[quote=引用 2 楼 jian995229 的回复:] [quote=引用 1 楼 ?Victor.??的回复:]int main() {  return 0;  }  好像是这么回事 你是说把getchar换成return吗？[/quote]  main前面加上int  main函数return 0;  [/quote] 谢谢，搞定了

引用 2 楼 jian995229 的回复:[quote=引用 1 楼 ?Victor.??的回复:]int main() {  return 0;  }  好像是这么回事 你是说把getchar换成return吗？[/quote]  main前面加上int  main函数return 0;

引用 1 楼 ?Victor.??的回复:int main() {  return 0;  }  好像是这么回事 你是说把getchar换成return吗？

int main() {  return 0;  }  好像是这么回事


Question: double 0.29  * 100 强制转化成int型后 变成 28

a*=100; a+=0.5; int b = (int)a; --------------- 好像可以

引用 9 楼 千梦一生 的回复:a *= 100; a+=0.4; int b = (int)a; 不对

a *= 100; a+=0.4; int b = (int)a;

0.29在内存里不一定是0.290000呢。可能是0.28999999呢。所以，扩大100倍，是有可能是28的。

二进制不能表示所有小数，所以存储在内存的是一个近似0.29的值，所以*100后取整变成了28

double x = 0.29; int z = round(x * 100);

0.29没法精确存储，为0.28xxxxx *100得28.xxxxxx 浮点型转整型就是去掉小数部分，得28  方案这有两种 1. +0.5再强转 int  a = 0.29*100 + 0.5; 2. 利用printf相关函数的四舍五入： char  str[100]; int a; sprintf( str, "%.0f", 0.29*100 ); sscanf( str, "%d", &a ); sscanf也可以换atoi： a = atoi(str);

引用 1 楼 user-7 的回复：double的存储机制你了解一下，简单说来就是0.29存成0.2899999，然后就出问题，可以写成int b = 10*a + 0.5为什么0.39可以打印出39呢？

为什么0.39可以 打印出39呢


Question: 为什么会发生错误无法打开求解答

引用 4 楼 ?Victor.?? 的回复:[quote=引用 3 楼 qq_44235371 的回复:] [quote=引用 1 楼 ?Victor.?? 的回复:] scanf 改成 scanf_s  或者在  main函数前面加上  #pragma warning(disable:4996) 感谢！ 已经解决了 请问一下为什么会出现这个问题呢 我用vc+6就没有问题[/quote]  vs要求的，scanf_s()安全性较高  scanf_s() 是针对“ scanf()在读取字符串时不检查边界，可能会造成内存泄露”这个问题设计的。  scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。[/quote]好的感谢

引用 3 楼 qq_44235371 的回复:[quote=引用 1 楼 ?Victor.?? 的回复:] scanf 改成 scanf_s  或者在  main函数前面加上  #pragma warning(disable:4996) 感谢！ 已经解决了 请问一下为什么会出现这个问题呢 我用vc+6就没有问题[/quote]  vs要求的，scanf_s()安全性较高  scanf_s() 是针对“ scanf()在读取字符串时不检查边界，可能会造成内存泄露”这个问题设计的。  scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。

引用 1 楼 ?Victor.?? 的回复:scanf 改成 scanf_s  或者在  main函数前面加上  #pragma warning(disable:4996) 感谢！ 已经解决了 请问一下为什么会出现这个问题呢 我用vc+6就没有问题


Question: 文件feof函数

好的，谢谢兄弟

引用 4 楼 你的小小栗子 的回复：[quote=引用 3 楼 离水的鱼儿的回复:][quote=引用 2 楼 你的小小栗子 的回复：][quote=引用 1 楼 user-2的回复:]你把if最后那个分号去掉 和那个有啥关系[/quote]; 代表此语句结束，你if还有还用？cnt++怎么样都执行[/quote] 这个是在一个函数里面，如果if执行，输出打开文件失败，就返回到主函数了，cnt++不会执行啊 [/quote] 你读一个空文件，while 肯定会执行啊，if而且不成立，由于你加了分号，cnt++会执行。那不就是1了。 至于while为什么会执行，原因是，对于一个空文件来说，当程序打开它的时候，它的光标会停在文件的开头，但是由于文件里什么内容都没有存（但是EOF是存在的），即整个文件就存贮了一个EOF。当程序打开文件，并直接调用feof()时，这个函数就会站在光标的位置向后张望，结果就看见了EOF，然后就当然返回0了。 无论怎么样你的分号都不对，逻辑就不对。 真想判断是否到结尾了，while 读取，循环内判断是否到结尾了。

引用 3 楼 离水的鱼儿的回复:[quote=引用 2 楼 你的小小栗子 的回复：][quote=引用 1 楼 user-2的回复:]你把if最后那个分号去掉 和那个有啥关系[/quote]; 代表此语句结束，你if还有还用？cnt++怎么样都执行[/quote] 这个是在一个函数里面，如果if执行，输出打开文件失败，就返回到主函数了，cnt++不会执行啊

引用 2 楼 你的小小栗子 的回复：[quote=引用 1 楼 user-2的回复:]你把if最后那个分号去掉 和那个有啥关系[/quote]; 代表此语句结束，你if还有还用？cnt++怎么样都执行

引用 1 楼 user-2的回复:你把if最后那个分号去掉 和那个有啥关系

你把if最后那个分号去掉


Question: 二叉树非递归存储类型

代码不全，怎么看，各有各的用法

没有看到什么问题

引用 1 楼 user-1的回复:代码不全，怎么看，各有各的用法 非递归遍历那部分。

引用 1 楼 user-1的回复:代码不全，怎么看，各有各的用法 #include<stdio.h> #include<stdlib.h> #define maxsize 20  //－－－－－－－树的操作－－－－－－－－ //声明 typedef int elemtype; typedef struct Tnode {     elemtype data;     struct Tnode* left;     struct Tnode* right; }Bnode,*Btree;  //2.创建 Btree Btree_create() {     Btree T;     elemtype m;     scanf("%d",&m);     if(!m)     {         T=NULL;         return;     }     T=(Btree)malloc(sizeof(Bnode));     T->data=m;     T->left=Btree_create();     T->right=Btree_create(); }  //3.打印 void Btree_print(Btree T) {     if(!T)         return;     printf("%d ",T->data);     Btree_print(T->left);     Btree_print(T->right); }  //4.清空 void Btree_clear(Btree* T) {     if(!(*T))         return;     Btree_clear(&(*T)->left);     Btree_clear(&(*T)->right);     free(*T);     *T=NULL; }  //5.查找 Btree Btree_search(Btree T,elemtype e) {     if(!T)         return NULL;     if(T->data==e)         return T;     if(!Btree_search(T->left,e))         return Btree_search(T->right,e); }  //6.深度 int Btree_depth(Btree T) {     int m,n;     if(!T)         return 0;     m=Btree_depth(T->left);     n=Btree_depth(T->right);     return (m>n? m:n)+1; }  //7.叶结点 int Btree_leaf(Btree T) {     int m,n;     if(!T)         return 0;     if(!T->left&&!T->right)         return 1;     m=Btree_leaf(T->left);     n=Btree_leaf(T->right);     return m+n; } //8.总结点 int Btree_node(Btree T) {     int m,n;     if(!T)         return 0;     m=Btree_node(T->left);     n=Btree_node(T->right);     return m+n+1; }  //9.插入 void Btree_insert(Btree* T,elemtype e) {     Btree p;     if(!(*T))     {         p=(Btree)malloc(sizeof(Bnode));         p->data=e;         *T=p;         return;     }     if(e>(*T)->data)         Btree_insert(&(*T)->right,e);     else         Btree_insert(&(*T)->left,e); }  //－－－－－－非递归遍历－－－－－－－ //1.声明 typedef struct node {     Btree elem[maxsize];     int top; }sq_stack;  //3.进栈 void stack_push(sq_stack* s,Btree T) {     if(s->top==maxsize)         return;     s->elem[s->top]=T;     s->top++; } //4.出栈 Btree stack_pop(sq_stack* s) {     if(s->top==0)         return NULL;     s->top--;     return s->elem[s->top]; } //2.遍历 void Btree_travel2(Btree T) {     sq_stack s;     elemtype p[maxsize],i;     s.top=0;i=0;     if(!T)         return;     while(T||s.top)     {         while(T)         {             p[++i]=T->data;             stack_push(&s,T);             T=T->right;         }         T=stack_pop(&s);         T=T->left;     }     while(i)         printf("%d ",p[i--]); } //1.遍历 void Btree_travel1(Btree T) {     sq_stack s;     s.top=0;     if(!T)         return;     while(T||s.top)     {         while(T)         {             printf("%d ",T->data);             stack_push(&s,T);             T=T->left;         }         T=stack_pop(&s);         T=T->right;     } } //3.遍历 void Btree_travel3(Btree T) {     sq_stack s;     s.top=0;     Btree Bbool[maxsize];     if(!T)         return;     while(T||s.top)     {         while(T)         {             stack_push(&s,T);             Bbool[s.top-1]=0;             T=T->left;         }         if(!Bbool[s.top-1])         {             Bbool[s.top-1]=1;             T=s.elem[s.top-1]->right;         }         else          {             T=stack_pop(&s);             printf("%d ",T->data);             T=NULL;         }     } }  //－－－－－－－层序遍历－－－－－－－－  //1.声明 typedef struct sq_queue {     Btree base[maxsize];     int front;     int rear; }sq_queue;  //2.入队 void queue_in(sq_queue* Q,Btree T) {     if(Q->rear-Q->front==maxsize)         return;     Q->base[Q->rear++]=T; }  //3.出队 Btree queue_out(sq_queue* Q) {     if(Q->rear==Q->front)         return NULL;     return Q->base[Q->front++]; } //4.判空 int queue_isempty(sq_queue Q) {     if(Q.rear==Q.front)         return 1;     return 0; } //1.遍历 void Btree_travel4(Btree T) {     sq_queue Q;     Q.rear=Q.front=0;     if(!T)         return;     queue_in(&Q,T);      while(!queue_isempty(Q))     {         T=queue_out(&Q);         printf("%d ",T->data);         if(T->left)             queue_in(&Q,T->left);         if(T->right)             queue_in(&Q,T->right);     } } int main() {     Btree T,p;     T=Btree_create();     printf("先序递归");     Btree_print(T);     printf("\n先序非递归a ");     Btree_travel1(T);     printf("\n后序非递归b ");     Btree_travel2(T);     printf("\n后序非递归c ");     Btree_travel3(T);     printf("\n层序非递归d ");     Btree_travel4(T);     p=Btree_search(T,5);     if(p)         printf("查找成功 ");     printf("%d\n",p->data);     printf("\n深度%d\n",Btree_depth(T));     printf("叶结点%d\n",Btree_leaf(T));     printf("总结点%d\n",Btree_node(T));     Btree_insert(&T,5);     printf("插入元素5后");     Btree_print(T); }


Question: 时间换算

#include<stdio.h> int main() { 	int h, m, s, n, sum=0, carry; 	scanf("%d:%d:%d", &h, &m, &s); 	scanf("%d", &n); 	sum = s+n; //	if ( sum >= 60 ) {	//处理秒  		carry = sum/60; 		sum = sum%60; 		m += carry; //		if ( m >= 60 ) {  //处理分  			carry = m/60;  			m = m%10; 			h = (h+carry) % 24;  //		} //	} 	printf("%02d:%02d:%02d",h,m,sum); 	return 0; } 其实，所有的 if 语句都可以不要。

#include<stdio.h>  int main() {     int h,m,s;     int n;     int sum=0;      scanf("%d:%d:%d",&h,&m,&s);     scanf("%d",&n);     sum = s+n;      m += sum / 60;     sum %= 60;      h += m / 60;     m %= 60;      h %= 24;  #if 0     if(sum>=60){         sum=sum-60;         m++;         if(m==60){             m=m-60;             h++;             if(h==24){                 h=0;             }         }     } #endif      printf("%02d:%02d:%02d\n",h,m,sum);      return 0; } 供参考～


Question: C语言题目

引用 4 楼 其实一开始我是拒绝的 的回复:[quote=引用 3 楼 ?Victor.??的回复:][quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 江南蜡笔小新的回复:]答案：ABC6789  gets(ss)执行完之后，ss就已经变成ABC了 为什么之前定义的没了[/quote]  重新赋值了，和以前的没关系了[/quote] gets（）用重新赋值的功能？[/quote] #include<stdio.h>  int main() { 	int a = 3; 	scanf("%d",&a); 	printf("%d",a); }  gets对于字符串相当于scanf对于int(功能上)  会把原来的替换掉

引用 3 楼 ?Victor.??的回复:[quote=引用 2 楼 其实一开始我是拒绝的 的回复:] [quote=引用 1 楼 江南蜡笔小新的回复:]答案：ABC6789  gets(ss)执行完之后，ss就已经变成ABC了 为什么之前定义的没了[/quote]  重新赋值了，和以前的没关系了[/quote] gets（）用重新赋值的功能？

引用 2 楼 其实一开始我是拒绝的 的回复:[quote=引用 1 楼 江南蜡笔小新的回复:]答案：ABC6789  gets(ss)执行完之后，ss就已经变成ABC了 为什么之前定义的没了[/quote]  重新赋值了，和以前的没关系了

引用 1 楼 江南蜡笔小新的回复:答案：ABC6789  gets(ss)执行完之后，ss就已经变成ABC了 为什么之前定义的没了

引用 2 楼 其实一开始我是拒绝的 的回复:[quote=引用 1 楼 江南蜡笔小新的回复:]答案：ABC6789  gets(ss)执行完之后，ss就已经变成ABC了 为什么之前定义的没了[/quote]  根据你的问题，我写了一篇博客， 由入门C语言题目浅析gets()函数的用法 https://blog.csdn.net/ftimes/article/details/106957922 表达能力不好，写得又臭又长，你可以直接拉到最后看结论，希望可以帮到你~

答案：ABC6789  gets(ss)执行完之后，ss就已经变成ABC了


Question: 求助c语言问题

引用 1 楼 user-1的回复:这个图片也太不清晰了吧 手机像素不好

这个图片也太不清晰了吧


Question: c语言怎么打边框？

哦 谢谢各位大佬

应该有一些特殊的角标什么的  百度一下

printf输出是双引号里的直接输出的～遇到%d, %c， %s等等才会特殊处理～

照着他的代码打呗


Question: 请问这段英文是什么意思？

程序返回3221225477这个值然后退出了。 点击任意键继续。。。  如果实在不知道，可以借助翻译软件～


Question: c语言求大佬！！急！！

引用 1 楼 自信男孩 的回复: int i; float sum = 0f;  while (i < n) {     sum += s[i]; } if (n != 0)     return sum / n;  return 0f;   供参考～  int i; float sum = 0f;   while (i < n) {     sum += s[i++]; } if (n != 0)     return sum / n;   return 0f; 需要把i自增一下，上面的代码会导致无限循环。用这个


Question: VC下数组和结构体

引用 2 楼 自信男孩 的回复:ave=sum/j; j在上一个循环之后已经是3了，不是2. 多谢

引用 3 楼 chxchxkkk 的回复:j+1显然不对 已改多谢

引用 1 楼 user-3 的回复:我猜是变量的数据类型问题，程序中 ave 为整型，其实更应该是 double 型，同时 “ave = sum/(j+1);”也应该按double 型进行处理。 已经改了，多谢

j+1显然不对

ave=sum/j; j在上一个循环之后已经是3了，不是2.


Question: C语言程序设计习题

引用 1 楼 user-1的回复:这可看着不简单啊，跟世界杯一样 是呀我感觉挺难的

这可看着不简单啊，跟世界杯🏆一样


Question: for循环读入n个字符串问题

引用 1 楼 user-3 的回复:首先getchar的地方要放开注释，也就是说需要执行getchar（它的作用是清空换行符，否则你按回车就相当于接收2个数据，一个正确数据，一个是换行符）。就你输入的数据，N接收2，a[0]接收换行符（第一次for循环），然后a[1]接收saca（第二次for循环），for循环就结束了，所以程序就直接运行了。 其次，不要用变量定义数组的长度，即a[N][100]改成a[100][100]，想用变量来定义数组长度就要自己申请内存。你的程序能正常运行，是因为a数组越界后，内存没造成冲突，你现在这样用是不安全的。 不需要放开，用的是scanf %s不是gets或fgets，因此不需要getchar();  char a[N][100];这里的N是未知的，数组需要确定长度，因此建议楼主N用宏定义

我懂了，谢谢大佬指导

N没有初始化而已


Question: 大一c语言课题求救!!

使用结构体，二维数组来做这道题，还是建议楼主先自己写写～


Question: 使用libpng将bmp转换成png中遇到的问题

回楼主    我将这行代码注释了就没有了蓝线    ((DWORD *)op)[-1] = 0;

TCHAR 和byte是什么类型的用它libpng库的函数的定义是什么


Question: VC实现音乐功能

引用 2 楼 Simple-Soft的回复:time是关键字，是个函数，你改一下，不要用time作为变量名 改了之后，程序能运行，没有错误，但是播放歌曲没有声音

time是关键字，是个函数，你改一下，不要用time作为变量名

对一个变量，只能声明一次，多次声名，就算声明类型相同，也是错误的。 而函数中，可以直接在 “函数原型” 中声明。 https://blog.csdn.net/weixin_43641971/article/details/88119496


Question: 求解一个题

这道题不难，就是判断，写了一段供参考  #include <stdio.h> #include <stdlib.h>  int main() {     int cj[5] = {0};     int i, aver = 0, total = 0;     printf("输入成绩：\n");     for (i=0; i<5; i++)         scanf("%d", &cj[i]);     aver = (cj[3] + cj[4]) / 2;      if (cj[1] > 95)         total += 100;     if (cj[0] > 95 || cj[2] > 95)         total += 100;     if (aver > 95 && cj[0] > 60 && cj[1] > 60 && cj[2] > 60)         total += 200;          printf("奖学金总数：%d\n", total);      getchar();     return 0; }


Question:
编写程序：
接收用户输入的一个字符，直接输出字符的Ascii码；然后判断输入的字符是否是数字字符，是则输出对应的英文字母。
对应关系如下：

0：A
1

自己试着写几行


Question: 新人求助

setpalette在VC的头函数是：#include <graphics.h>


Question: 救救孩子吧

https://bbs.csdn.net/topics/396858956 去看这个贴子


Question: 求助大佬帮忙看一下怎么画流程图！救救孩子吧

去看这个贴子https://bbs.csdn.net/topics/396858956

顶顶我自己......大佬们看看孩子吧


Question: 求大佬帮我看看这3道选择题 ，要解题步骤和思路，谢谢

第二题，B答案，func的功能是自增传递过来的参数值，main函数中自加一次2，所以答案是6. 第一题，D,未指定a[0][0]的值，所以结果未定，但是在vs2019中无法显示结果。

第一题变量i的类型跟p的类型不一样吧。 第二题答案是6，注意两个地方，变量b是全局变量，mian函数里的局部变量a的值因为传入的是地址，所以被func函数改变了。

C没问题， A是因为野指针，结果未定义； B也是野指针原因，结果也是未定义； D是越界，因为s = p;之后，就是s指针指向了e的首地址，*s = 1;那么对应的是1赋值给int类型的数据，而e只是char类型，能表示1个字节，所以结果也是未定义，因为*s = 1;越界了


Question: 很简单的一道题   但是为什么我一直运行不出来   求解答

双引号内不用加\n

输入不需要\n

去掉scanf中的'\n'。 因为scanf是标准输入，属于行缓冲，因此需要输入回车才能将输入缓存里的数据刷到内存，因此是必须要输入的。而scanf中加上'\n'，则输入的回车会与'\n'匹配，无法完成提交。

scanf（“%f%f%f\n”）;不需要\n

scanf（“%f%f%f\n”）; 这句需要干掉 \n


Question: 求代码

你就按照这个要求一步一步来做就可以

代码不长，代参考  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct Candidate {     char name[20];     int total; }candidate;  int main() {     candidate carray[3] = {{"li", 0}, {"zhang", 0}, {"wang", 0}};     int i;     char str[20];      for (i=0; i<10; i++)     {         printf("输入候选人的姓名：\n");         scanf("%s", str);         if (strcmp(str, carray[0].name) == 0)             carray[0].total++;         else if (strcmp(str, carray[1].name) == 0)             carray[1].total++;         else if (strcmp(str, carray[2].name) == 0)             carray[2].total++;     }      for (i=0; i<3; i++)     {         printf("姓名：%s\t, 票数：%d\n", carray[i].name, carray[i].total);     }      getchar();     return 0; }


Question: 数据结构中对链表的创建、插入、删除、排序、反转

这是成果展示？


Question: 求助大家

引用 1 楼 丁劲犇 的回复：有没有加分号？  函数的返回值定义是不是数值类型，还是别的？  return;  试试看好了，谢谢！


Question: error C2065: 'setpalette' : undeclared identifier问题求助，万分感谢

引用 4 楼 自信男孩 的回复:应该是缺少函数库以及头文件～另外，TC很老的编译器了，建议用最新的编译器，另外，学习一下新的函数接口～ 哈哈，这是老师的作业，就是把tc的改成vc的，感谢指导

引用 1 楼 focuslight 的回复:试试 <stdio.h> <graphics.h> <conio.h> em，还是存在这个问题

试试 <stdio.h> <graphics.h> <conio.h>


Question: 哪里出了问题代码

PRID32是什么？宏定义？

请参考《C++中printf()函数的用法10-1》 希望能够帮到您！

“”里面写 ""要加\   例如  " \"test\" " 而且你%后要加d


Question: 用VSCode调试C代码搞懵了，C语言也有构造函数吗？

C语言无构造函数，但是有函数指针～

构造函数是c++的内容


Question: c语言

去如果这个是系统头文件就去百度下载，然后放到cpp文件同目录下。 如果是你自己写的，就直接放到cpp文件同目录下

首先要有这个DataH.h文件，然后  最后在你的c源文件的起始位置处添加 #include "DataH.h"

你看它在哪里

引用 1 楼 user-3的回复:把它datah.h加进来 怎么加，小白一个

把它datah.h加进来


Question: 求问这个错误提示是怎么回事？拜托大家

无lib库,也就是链接库

引用 1 楼 user-2的回复:无代码无真相，search未声明？ 谢谢解答，我发现我把函数名写错了(＞＜)

无代码无真相，search未声明？


Question: 菜鸡提问：统计二进制文件中某个ASCII码的个数 。这真的把我难到了

[quote=引用 1 楼 user-1 的回复:] 读出文件，然后比较[/quote   能有具体的代码嘛？比较的过程我不太会（下面是我的代码） #include <stdio.h> #include <stdlib.h> main() {    long len;    FILE *fp1,*fp2;    int count=0,a,i;    char *buf;    fp1=fopen("a.dat","rb");    fp2=fopen("b.txt","w");    scanf("%p",&a);    fseek(fp1,0,SEEK_END);    len=ftell(fp1);    rewind(fp1);    buf=malloc(len);    for(i=0;i<len;i++)         fread(&buf[i],1,1,fp1);    for(i=0;i<len;i++)    {        if(buf(i)==a)           count++;    }    fprintf(fp2,"%d",count);    fclose(fp1);     fclose(fp2); }

读出文件，然后比较


需要先安装gmp，去官网下载最新的包，https://gmplib.org

python   matlab

#include <gmpxx.h> #include <iostream> using namespace std; int main() { 	mpz_class u = 1;  	for (int i = 2;i<1700;++i) 		u *= i; 	cout << u.get_str(); 	return 0; }  需要在Linux或者mingw32下，链接 -lgmpxx -lgmp两个库 输出  1763737179740245938059488891567419682264806728476225335393714409724200142498452305702566936745284622536165430226367518211693004886369241918596379382787936845097483353395536324790646024216169591605556433278950290893799353770107547605913195384052079042646305312836505405797933332569987556685833330112114555872261294626640953002 2797122004741016023779384056005980184296506526511906280634796180794865425648476635624093259396549650478384096769786931772465572248111755721862285900308752478256745514551044968421683411283870273548898050295062231331714314153949860367056418163368541846612361817177896973011887651814620025247770494423724950690036795956077691087 2478142835052510404241477067083856262099795839977766623803532725016573796237089683730441074534034526294375186906412936703952642099801705421041016404063889819237225471277173855787130972207341890496938514268820339819905018339868672561612122714205023638262775061144934316413428699226977265498774996518664045103396225270706001961 8111485636533054195741711969025228245757391117300865080255096814133646934362863237499043890389013804714856714976381524428775180610517366830546000024808201790765080126684062310017505144275601872892883962831172242421189095830537740031241171747348396220037118222449568904601721132794639550735965614200575135181037605728277767728 4816043437657272934107606011458551873506820804818811296022789369357673734186365528743416110976742931692990858611663181277023790279095261275655804013450999259040147043013080564960398044260911978147678668819753730490428329977238440287686035402084232236385731529576153659943554896387079852143359240614499599247416673517539344411 9064992278811631825435856966463143184448168683705167754259679358604070013577681174367700635512031621471900469262226391157894357257859912691211298438118350249275222225128877462105334931279478826766592336340695625949750896374066422621656203828376354199262279860054983783618987969374785007367383272411515562403580128072456923315 8978571282112298486897255677676305126289079067791575692639791436429926057767307595922251495206177579448412095050460610349291503844592161886504649343976176657691394575046172321989031669381745852521592662142336493573193719975383322823989156907645356722068640721083236920395356163002378460142952803497855485809660034171061875412 8181587755168503582656445939967080096712255981720739541132605565015250508609719151899789565579611203300379109560976173929014318471034391540184685326445512262507547550216023343219114551052686391137686991140899335596612058492668746238960858968822822199389789756029508638642921751441871667253674317181277299494764788234825663635 2683723694442227807907834347083174091569934748694137796373827019265202182144420822348719500369662076799580713015348362483896841685284272925441948610880722256201319796317351786790350601722877322458399656513195894325296061822644503263315792570422922023140523815895665649103697029058966856052353828601788119831831402195439410708 5053961247596723764123179256443259568085381637458512394846401332357042871852652084003628376192134721180795909363755542008604146189276856156747747551957139029347195108218474199317375095426865147282526115802669841080655266787549801191196301489965167811741479217439523624688605387569463379936855710945610047054575354909765099072 3679278294003399290531772249916261552078342509390554129094969234754539359413593392248193438816168225349102832044901241114402526077734561228412459628326961028886105726001268679510617981582069857280179689183001854078222107016864616794379371578275360200504352686518482928204131387035500002507715240578348494932337829412314531186 8637958502421966377359523701565969944748382759288355136718550439465653492196715346157757213341706515455532705899978506559102589542177243425660324304532326099517920545528009437876337520440852834466416589011011550601094308464185649274226370434797253765794801356364103647227533438391653576267935448083079507297345686161393715771 0944540225845764428957379217547545229725074863335561737821403292315962646206131762292410067216765989893694530512424309514129426493865770949830200513886818295551625005271650265631197358361782587776889776336228599682944389395150790083763134201961494629911090615831012155949742526861159265677177481875266812131136627871090928554 0178677693550903988791439128843743312409363320553320145598761866269929308371059192493406621722692345973964800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


Question: 个人通讯录

解决了，是POS没有初始化

数组的插入比较麻烦，找到插入的位置后，要先把位置之后的元素都后移一个，然后加入插入的数据

这个函数出问题了吧   void insert_record(record *p, int *plen, record person)   { int pos ; for(int i = 0 ; i < *plen ; i++ )     // 找到插入位置  { if(strcmp(person.number, p[i].number)<0)  {     pos =i;    // 保存插入位置 break;      }     }  for(int j= *plen;j>=pos;j--)  //这个有什么用呢 {  } p[pos] = person;     //这里好像替换了原有的一个记录 *plen = *plen +1;  /*len++ ;*/   }


Question: 对称密码体制中密钥的产生方式有哪些，各自具有什么优缺点

这个问题比较大呀，你为什么不自己先试着搜一搜呢


Question: c语言递归题

懂了，谢谢各位

引用 3 楼 你的小小栗子 的回复:那为什么时间会超限呢 因为如果计算fact(0) ，你的代码根本没有出口，无限递归了。

那为什么时间会超限呢

因为0的阶乘等于1，所以要考虑f(0)的情况

应该是n = 0这种情况吧

这种递归算法是比较耗时的


Question: 关于printf输出，运行时中断，显示access violation的问题

这是空指针，但前天我在读取其他指针时确实判断了是否为空，前天报错是0x00000005，这么小的地址让我怎么判断呢？又不是空

dur应该是个指针，指针需要初始化，数组定义后分配好了空间，可以直接赋值。

这个指针为NULL，差不多就是读取了空指针的值出错，但为啥myf=(hmm->dur)[0]这句不报错呢？

Access violation是因为访问了一块无效的内存 要么访问的内存已经释放了 要么使用了一个还未创建对象的指针  记得初始化指针，也记得删除指针后置为NULL


Question: C语言关于fprintf的%f类型问题

多了符号&，去掉即可

这是出现问题的句子


Question: 反序显示命令行参数里的单词

给你的代码我是自测过的，没问题才发给你的。你的编译出错，是因为编译的版本问题，比较老而已。

你知道这个错误是啥意思吗？  #include <stdio.h> #include <string.h>  #define QW "quit" void ar(char r[],int n) {     //char p[100];     char *p = NULL, *q[100];     int i=0;     int j=0;      p = r;     q[j] = p;     while(p[i]){         if(p[i]==' ' || p[i] == '\n'){             //p[i] =='\0';             p[i] ='\0';             q[++j] = &p[i+1];         }         i++;     }     //j-1;     j = j-1;     //for(j;j>=0;j--)     for(;j>=0;j--)         printf("%s ",q[j]); } int main(void) {     char a[100];      while(strncmp(fgets(a, 100, stdin),QW, 4)){         ar(a,100);         printf("\n");     }     return 0; } 编译出错问题，要先找错误的原因，不要什么都马上问。

引用 1 楼 user-2 的回复:字符串不能直接赋值  改一下 char *p = r;对函数做了如下修改后还是不行，无法实现该功能,修改如下： void ar(char r[],int n){ 	char *p=r; 	int i=0; 	int j=0; 	char *q[100]; 	while(p[i]){ 		if(p[i]==' '){ 			p[i]='\0'; 			q[j++]=&p[i+1]; 		} 		i++; 	} 	j=j-1; 	for(;j>=0;j--) 		printf("%s ",q[j]); }

引用 2 楼 自信男孩 的回复:#include <stdio.h> #include <string.h>  #define QW "quit" void ar(char r[],int n) {     //char p[100];     int i=0;     int j=0;      char *p = r;     char *q[100];     q[j] = p;     while(p[i]){         if(p[i]==' ' || p[i] == '\n'){             //p[i] =='\0';             p[i] ='\0';             q[++j] = &p[i+1];         }         i++;     }     //j-1;     j = j-1;     //for(j;j>=0;j--)     for(;j>=0;j--)         printf("%s ",q[j]); } int main(void) {     char a[100];      while(strncmp(fgets(a, 100, stdin),QW, 4)){         ar(a,100);         printf("\n");     }     return 0; } 供参考～你的代码编译器显示这个错误：“[Error] expected declaration or statement at end of input”

字符串不能直接赋值  改一下 char *p = r;


Question: 新人小白问问题希望有大神来看～

引用 3 楼 N-n-N 的回复:用超声波多方向测距 先测出基础距离 然后不断多方向测距 如果哪距离近了 就是人在那 然后再转动 不过这种还是用人脸跟随好做一点 就摄像头+人脸追踪代码感谢老板！

求不要沉啊

超声波 US-100  舵机 MG945


Question: 救救孩子吧

引用 5 楼 rrrr336的回复:楼上 @tryagain2006 的主意非常高。以下是循着他的思路做下去的。  我解释一下：  作一个 1 到 9 的全排列，这样就保证1-9都用 且 只用一次。 把它 分成四个部分，比如：123456789，分成12， 34， 56， 789， 检查12  *  34   和    56  *  789， 看它们是否相等就可以了。  于是，问题就转换为 求 1 - 9 的全排列， 检查每一个排列，找出符合要求的排列。  这个穷举 的循环次数 总共为：  9 ！ =   362880 次，运行非常快。  全排列使用 递归的方法，借鉴了网上现成的算法，特此说明。  程序如下：  #include<stdio.h> void perm(int k, int n, int a[]){     if (k == n-1){         int d1 = a[0] * 10 + a[1];         int d2 = a[2] * 10 + a[3];         int d3 = a[4] * 10 + a[5];         int d4 = a[6] * 100 + a[7] * 10 + a[8];         if (d1 * d2 == d3 * d4){             printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);         }     }     else{         for(int i = k; i < n; i++){             int temp = a[k];             a[k] = a[i];             a[i] = temp;             perm(k+1, n, a);             temp = a[k];             a[k] = a[i];             a[i] = temp;         }     } }  int main(){     int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};     perm(0, 9, arr);     return 0; }  结果是：  46 * 79 = 23 * 158  54 * 69 = 27 * 138  54 * 93 = 27 * 186  58 * 67 = 29 * 134  58 * 69 = 23 * 174  58 * 73 = 29 * 146  58 * 96 = 32 * 174  63 * 74 = 18 * 259  64 * 79 = 32 * 158  67 * 58 = 29 * 134  69 * 54 = 27 * 138  69 * 58 = 23 * 174  73 * 58 = 29 * 146  73 * 96 = 12 * 584  74 * 63 = 18 * 259  76 * 98 = 14 * 532  79 * 46 = 23 * 158  79 * 64 = 32 * 158  93 * 54 = 27 * 186  96 * 58 = 32 * 174  96 * 73 = 12 * 584  98 * 76 = 14 * 532 感谢🙏，我也是这样想的，但是我不会写，感谢大佬

引用 5 楼 rrrr336 的回复:楼上 @tryagain2006 的主意非常高。以下是循着他的思路做下去的。  我解释一下：  作一个 1 到 9 的全排列，这样就保证1-9都用 且 只用一次。 把它 分成四个部分，比如：123456789，分成12， 34， 56， 789， 检查12  *  34   和    56  *  789， 看它们是否相等就可以了。  于是，问题就转换为 求 1 - 9 的全排列， 检查每一个排列，找出符合要求的排列。  这个穷举 的循环次数 总共为：  9 ！ =   362880 次，运行非常快。  全排列使用 递归的方法，借鉴了网上现成的算法，特此说明。  程序如下：  #include<stdio.h> void perm(int k, int n, int a[]){     if (k == n-1){         int d1 = a[0] * 10 + a[1];         int d2 = a[2] * 10 + a[3];         int d3 = a[4] * 10 + a[5];         int d4 = a[6] * 100 + a[7] * 10 + a[8];         if (d1 * d2 == d3 * d4){             printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);         }     }     else{         for(int i = k; i < n; i++){             int temp = a[k];             a[k] = a[i];             a[i] = temp;             perm(k+1, n, a);             temp = a[k];             a[k] = a[i];             a[i] = temp;         }     } }  int main(){     int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};     perm(0, 9, arr);     return 0; }  结果是：  46 * 79 = 23 * 158  54 * 69 = 27 * 138  54 * 93 = 27 * 186  58 * 67 = 29 * 134  58 * 69 = 23 * 174  58 * 73 = 29 * 146  58 * 96 = 32 * 174  63 * 74 = 18 * 259  64 * 79 = 32 * 158  67 * 58 = 29 * 134  69 * 54 = 27 * 138  69 * 58 = 23 * 174  73 * 58 = 29 * 146  73 * 96 = 12 * 584  74 * 63 = 18 * 259  76 * 98 = 14 * 532  79 * 46 = 23 * 158  79 * 64 = 32 * 158  93 * 54 = 27 * 186  96 * 58 = 32 * 174  96 * 73 = 12 * 584  98 * 76 = 14 * 532 其实，这道题目还有一个思路，就是借鉴8后问题的非递归算法，这样程序的效率是一样比较高的。

如果用 Python 写的话，就下面9行就解决问题了。运行结果一样。 真是应了那句话： “人生苦短，我用Python” “Life is short, you need Python!”    from itertools import permutations a = [1, 2, 3, 4, 5, 6, 7, 8, 9] for p in permutations(a):     d1 = p[0] * 10 + p[1]     d2 = p[2] * 10 + p[3]     d3 = p[4] * 10 + p[5]     d4 = p[6] * 100 + p[7] * 10 + p[8]     if d1 * d2 == d3 * d4:         print(d1, "*", d2, "=", d3, "*", d4)

这道题可以看做是将数字 1~9 进行一个不重复的全排列。关键是要尽量提高进行全排列的效率。 实在不愿意写程序了。

引用 1 楼 user-3 的回复:for (int k = 11; k < 100; k++)    {       for (int i = k + 1; i < 100; i++)       {          for (int j = k + 1; j < 100; j++)          {             if (i * j % k == 0 && i * j / k >= 111 && i * j / k < 1000)             {                printf("%dx%d=%dx%d\n", i, j, k, i*j/k);             }          }       }    } 题目要求数字不重复，这段程序没有判断数字重复问题。


Question: 全局变量

全局变量声明与定义还是放在一起吧！这样便于查看和调用。

不一定呢，如果这个头文件可能被多个源文件引入，那么不能在头文件里定义全局变量。反之，没什么问题～

不建议使用全局变量，如果要用，一定要加static


Question: 一个奇怪的现象，求大佬

好吧，之后我测试发现 只要default放最前且没有break，它就不管后面case是什么，只要不遇到break，就一律执行 而不把default这样写就正常会去判断case的值符不符合 真的奇怪。。。 一般也不会这么写，只是一道考题

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 ccqstark 的回复:] 可是此时k为1也不是2呀，不还是不满足case 2吗？为啥会执行呢 因为default没有break，所以继续向后执行，直到break出去 所以，不能少break; switch是根据break跳出来的[/quote] 是的，这个我明白，我不明白的地方是case 2的意思不是说只有当k==2的时候才会执行的意思吗，不会因为没有break就去执行吧，还得满足k==2呀

不是，它执行第一次case2的时候还在第一个循环，第二个循环的时候再次执行了一个case2 最后输出3

引用 2 楼 ccqstark 的回复:可是此时k为1也不是2呀，不还是不满足case 2吗？为啥会执行呢  第一遍k是1，走了default，但是没有break，又循环了一次，k变成2，这个时候不就走case 2了嘛！

引用 2 楼 ccqstark 的回复:可是此时k为1也不是2呀，不还是不满足case 2吗？为啥会执行呢 因为default没有break，所以继续向后执行，直到break出去 所以，不能少break; switch是根据break跳出来的

可是此时k为1也不是2呀，不还是不满足case 2吗？为啥会执行呢

当k为1时，是应该执行default呀，但是你的default后面没加break呀，你加了break就不会执行case 2了。


Question: 求助

图像处理，需要会算法呀，数学必须得很好。傅里叶变换算法等等 这个得找懂图像处理算法的人帮你解决～

可以到网上搜索一下，图像处理相关的代码

我觉得你可以调用一些第三方图形库，没必要自己造车轮啊 想造车轮的话参考一下吧 https://blog.csdn.net/wanty_chen/article/details/80336986


Question: 求助，C语言编程，万分感谢

cout 发出提示信息 并让用户输入1，2选择功能->cin获取选择->cout 输入提示信息->cin获取信息->信息处理->cout或print 格式化输出

对角线元素a[i][i] 遍历所有元素求最大值


Question: C语言大佬们救救我这可怜的小学妹吧！啊啊啊！快要疯掉了呀！

看到学妹我就进来了，看见题目，准备开溜了

引用 10 楼 自信男孩的回复:[quote=引用 8 楼 李Aiden 的回复:] [quote=引用 7 楼 自信男孩的回复:]注意在最后要加上fclose(fp);用于关闭文件 可，谢谢哥哥们[/quote] 你是妹子呢，还是汉子呢，哈哈[/quote] 我是你们心目中最完美的样子

引用 8 楼 李Aiden 的回复:[quote=引用 7 楼 自信男孩的回复:]注意在最后要加上fclose(fp);用于关闭文件 可，谢谢哥哥们[/quote] 你是妹子呢，还是汉子呢，哈哈

引用 4 楼 自信男孩 的回复:{         if (p->average > max->average)         {             max = p;         }         p = p->next;     } 这里内存泄露了，你的max动态申请了空间，然后这里又max = p;那max指向的内存不就找不到了吗？  [quote=引用 3 楼 user-3 的回复:] 小学妹不要慌    #include <stdio.h> #include <stdlib.h> #include <string.h>  struct Stu {     char no[20];     char name[10];     float math;     float political;     float English;     float average;     struct Stu *next; };  int main(void) {     FILE *fp;     fp = fopen("student.txt", "r");     if (!fp)     {         printf("文件打开失败");         exit(0);     }     struct Stu* head = (struct Stu*)malloc(sizeof(struct Stu));     struct Stu* tmp;     head->next = NULL;     char no[20];     char name[10];     float math;     float political;     float English;     float average;     while (fscanf(fp, "%s\t %s\t %f\t %f\t %f\t %f", no, name, &math, &political, &English, &average) != EOF)     {         tmp = (struct Stu*)malloc(sizeof(struct Stu));         tmp->next = NULL;         if (tmp)         {             strcpy(tmp->no, no);             strcpy(tmp->name, name);             tmp->math = math;             tmp->political = political;             tmp->English = English;             tmp->average = average;             tmp->next = head->next;             head->next = tmp;         }     }     struct Stu* max = (struct Stu*)malloc(sizeof(struct Stu));     max->average = 0.0;     struct Stu* p = head->next;     while (p)     {         if (p->average > max->average)         {             max = p;         }         p = p->next;     }     printf("均分最高的学生的姓名是%s,学号是%s\n", max->name, max->no);     return 0; }[/quote]    引用 4 楼 自信男孩 的回复:{         if (p->average > max->average)         {             max = p;         }         p = p->next;     } 这里内存泄露了，你的max动态申请了空间，然后这里又max = p;那max指向的内存不就找不到了吗？  [quote=引用 3 楼 user-3 的回复:] 小学妹不要慌    #include <stdio.h> #include <stdlib.h> #include <string.h>  struct Stu {     char no[20];     char name[10];     float math;     float political;     float English;     float average;     struct Stu *next; };  int main(void) {     FILE *fp;     fp = fopen("student.txt", "r");     if (!fp)     {         printf("文件打开失败");         exit(0);     }     struct Stu* head = (struct Stu*)malloc(sizeof(struct Stu));     struct Stu* tmp;     head->next = NULL;     char no[20];     char name[10];     float math;     float political;     float English;     float average;     while (fscanf(fp, "%s\t %s\t %f\t %f\t %f\t %f", no, name, &math, &political, &English, &average) != EOF)     {         tmp = (struct Stu*)malloc(sizeof(struct Stu));         tmp->next = NULL;         if (tmp)         {             strcpy(tmp->no, no);             strcpy(tmp->name, name);             tmp->math = math;             tmp->political = political;             tmp->English = English;             tmp->average = average;             tmp->next = head->next;             head->next = tmp;         }     }     struct Stu* max = (struct Stu*)malloc(sizeof(struct Stu));     max->average = 0.0;     struct Stu* p = head->next;     while (p)     {         if (p->average > max->average)         {             max = p;         }         p = p->next;     }     printf("均分最高的学生的姓名是%s,学号是%s\n", max->name, max->no);     return 0; }[/quote]   多谢，之前没注意，确实应该改一下 struct Stu* max;     average = 0.0;     struct Stu* p = head->next;     while (p)     {         if (p->average > average)         {             max = p;             average = p->average;         }         p = p->next;     }

引用 7 楼 自信男孩的回复:注意在最后要加上fclose(fp);用于关闭文件 可，谢谢哥哥们

注意在最后要加上fclose(fp);用于关闭文件

#include <stdio.h> #include <stdlib.h> #include <string.h>  struct Stu {     char no[20];     char name[10];     float math;     float political;     float English;     float average;     struct Stu *next; };  int main(void) {     FILE *fp;     fp = fopen("student.txt", "r");     if (!fp)     {         printf("文件打开失败");         exit(0);     }     struct Stu* head = (struct Stu*)malloc(sizeof(struct Stu));     struct Stu* tmp;     //head->next = NULL;     char no[20];     char name[10];     float math;     float political;     float English;     float average;      head->next = NULL;     //while (fscanf(fp, "%s\t %s\t %f\t %f\t %f\t %f", no, name, &math, &political, &English, &average) != EOF)     while (fscanf(fp, "%s %s %f %f %f %f\n", no, name, &math, &political, &English, &average) != EOF)     {         tmp = (struct Stu*)malloc(sizeof(struct Stu));         if (!tmp) {             fprintf(stderr, "malloc error!\n");             exit(0);         }         tmp->next = NULL;         //if (tmp)         //{             strcpy(tmp->no, no);             strcpy(tmp->name, name);             tmp->math = math;             tmp->political = political;             tmp->English = English;             tmp->average = average;             tmp->next = head->next;             head->next = tmp;         //}     }     /*     struct Stu* max = (struct Stu*)malloc(sizeof(struct Stu));     max->average = 0.0;     */     struct Stu *max = head->next;     struct Stu* p = head->next;     while (p)     {         if (p->average > max->average)         {             max = p;         }         p = p->next;     }     printf("均分最高的学生的姓名是%s,学号是%s\n", max->name, max->no);      return 0; } 供参考～  借助楼上的代码，改了一下，可以试一下是否可以使用～

哥哥们好厉害(ง •̀_•́)ง

{         if (p->average > max->average)         {             max = p;         }         p = p->next;     } 这里内存泄露了，你的max动态申请了空间，然后这里又max = p;那max指向的内存不就找不到了吗？  引用 3 楼 user-3 的回复:小学妹不要慌    #include <stdio.h> #include <stdlib.h> #include <string.h>  struct Stu {     char no[20];     char name[10];     float math;     float political;     float English;     float average;     struct Stu *next; };  int main(void) {     FILE *fp;     fp = fopen("student.txt", "r");     if (!fp)     {         printf("文件打开失败");         exit(0);     }     struct Stu* head = (struct Stu*)malloc(sizeof(struct Stu));     struct Stu* tmp;     head->next = NULL;     char no[20];     char name[10];     float math;     float political;     float English;     float average;     while (fscanf(fp, "%s\t %s\t %f\t %f\t %f\t %f", no, name, &math, &political, &English, &average) != EOF)     {         tmp = (struct Stu*)malloc(sizeof(struct Stu));         tmp->next = NULL;         if (tmp)         {             strcpy(tmp->no, no);             strcpy(tmp->name, name);             tmp->math = math;             tmp->political = political;             tmp->English = English;             tmp->average = average;             tmp->next = head->next;             head->next = tmp;         }     }     struct Stu* max = (struct Stu*)malloc(sizeof(struct Stu));     max->average = 0.0;     struct Stu* p = head->next;     while (p)     {         if (p->average > max->average)         {             max = p;         }         p = p->next;     }     printf("均分最高的学生的姓名是%s,学号是%s\n", max->name, max->no);     return 0; }

引用 1 楼 自信男孩的回复:先自己写写吧，不然怎么提高和进步～ 说是这么说，是真写不出啊

先自己写写吧，不然怎么提高和进步～


Question: 一道难题，求大佬帮助

cin + string 输入->然后string.find(start,end,char) + 选段分割每一个学生->if 处理数据->输出


Question: 根据伪代码程序画出来的这个流程图/流图，它是正确的吗？各位能帮我看看吗，我感觉是画多了一条线

不删，而是要加一个②的判断再跳转（因为不是无条件跳转的，而是判断X>0来决定是否跳转的）。看程序也应该是②放到⑨之后


Question: 救救孩子吧……求各位大佬解答。

引用 楼主 半山易的回复:这个题目是数据结构，使用二叉链表，自己写的大概国家还是出来的，但是细节还是不太清楚。希望各位大佬能够解答一下。 题目:设二叉树T：+(A(3,w(x,Y(,7))),a(2(T,?)))采用二叉链表结构存储，数据元素为字符类型。设计算法分别求出二叉链表中data域为英文字母和数字字符的结点个数 我的思路跟你一样的，哈哈

引用 1 楼 user-1的回复:我的理解是这样的： 1、把data数据存到二叉树链表中 2、先序遍历、中序遍历、后续遍历，无论哪种，遍历完整个二叉树 3、遇到英文加1，遇到数字加1。 呃，你来晚了，我昨天晚上自己搞出来了。哭了


Question: 研究生让做的第一个项目，请问各位我该怎么入手，学习一些什么呢？

c，c++基本 c网络通讯 c数据库操作

大工程。慢慢弄吧，边弄边学。啥不懂学啥。


Question: 求大神帮帮忙，下周就要作报告了，但有些错误还是看不出来

把错误描述一下，是编译时刻还是运行时刻错误，什么类型错误等

你说一下哪里报错了啊，最好带上图

是啊，是哪儿出错了？


Question: 管道通信问题

我觉得这个还涉及到管道的读写缓存，如果A没写满缓存数据是不会发送的，这样B就会堵塞，最后A关闭了还是没有flush的话，B可能什么都收不到。

没看出来是管道的题目，不就读写文件嘛，改了一下。  A进程： #include <stdio.h> #include <unistd.h> #include <fcntl.h>  int main() {     int fd;     fd = open("fifo1", O_WRONLY|O_CREAT|O_TRUNC, 0666);     printf("%d\n", fd);      write(fd, "ABCDEFGH", 8);     write(fd, "1234", 6);      close(fd);      return 0; }   B进程： #include <stdio.h> #include <unistd.h> #include <fcntl.h>  int main() {     int fd, n;      char buf[1024];     fd = open("fifo1", O_RDONLY, 0);     n = read(fd, buf, 4);     buf[4] = 0;     printf("%d:%s\n", n, buf);      n = read(fd, buf, 20);     printf("%d:%s\n", n, buf);      close(fd);     return 0;  }   输出： 4:ABCD 10:EFGH1234

引用 4 楼 mmmm0303 的回复:所以B的输出是什么？ 那么为什么不自己试试呢？ 学编程需要多练习，实践～

所以B的输出是什么？

https://blog.csdn.net/yrh159357/article/details/49563787 供参考～  按照楼主的程序，进程1需要先执行，然后进程B才可以执行。楼主的程序没有对open的返回值判断，如果文件不存在，先执行进程2，会出错。即使文件存在了，先执行进程2，那么文件此时可能是空的。

这不是文件的读写吗？两个main，相互独立的两个进程，没有父子关系或者兄弟关系呢。 管道是针对父子进程或者两个子进程通信吧。

有人懂吗？？？？


Question: 阿美的编辑器

#include <stdio.h> #include<string.h> #include<stdlib.h>  #define sizezifu 50000 #define new_size 50  typedef struct{     char **top;     char **base;     int size_top_base; }zifu;  //void init_zifu(zifu *(&s)) void init_zifu(zifu **s) {     *s = (zifu*)malloc(sizeof(zifu)); //先给s分配内存     (*s)->base= (char**)malloc(sizeof(char*)*new_size);     if (!(*s)->base) {         exit(-1);     }     (*s)->top = (*s)->base;     (*s)->size_top_base = 0; } void push(zifu *s,char *st_r1) {     s->top[s->size_top_base] = (char *)malloc(sizeof(char) * sizezifu);     strcpy(s->top[s->size_top_base],st_r1);     s->size_top_base += 1; } void pop(zifu *s) {     for(int i = 0;i < s->size_top_base;i++)     {         printf("%s\n",s->top[i]);     } } int main(void) {     char strr[20];     zifu *s;     init_zifu(&s);     while(1)     {         scanf("%s",strr);         char strr1[3000];         switch(strr[0])         {             case 'E':                 scanf("%s",strr1);                 push(s,strr1);                 break;             case 'B':                 s->size_top_base -= 1;                 break;             case 'F':                 s->size_top_base += 1;                 break;             case 'Q':                 pop(s);         }     }     return 0; } 供参考～

楼主的问题应该是编译的问题。楼主用的g++编译器，而提交用的可能是C编译器。对于参数中出现&，C++识别，但是C语言是不认的。 引用&是C++的语法。


Question: 怎样合理的解释一下这题？

sizeof是运算符不是函数，区别在于 函数是运行的时候执行的 运算符是编译后内嵌在代码中的。

sizeof (int)给出的是int类型的实际大小，一般int类型的变量只占4个字节的大小，不管是在32位下，还是64位下。

sizeof是c 语言的关键字

sizeof（）不是C语言的函数，而是C语言中的字节运算符，是一个单目运算符。 其实他不参与编译的，在预处理的时候，就已经被计算了，比如说int n = sizeof(int)，那么这个式子，在经过预处理后，就已经变成了，int n = 4，（在32位的环境编译器下）。所以这个到底多大，是根据编译器而定，看编译器处在什么样的环境，而得到不同的结果。在编译之前，就已经被计算了。根本不参与编译，所以，sizeof 不是一个函数，而是一个运算符。为什么计算机知道int几个字节，编译器当然是知道。

是函数，描述错误～后面的描述没问题～

sizeof 是C语言的运算符，以字节为单位给出对象的大小，运算对象可以是一个被圆括号括起来的类型说明符，如sizeof（float)或者是一个具体的变量名，数组名等，如sizeof foo。 一开始就错了是运算符不是函数。 类似的strlen（）才是函数，作用是给出字符串中的字符的长度。


Question: 函数实参问题

3个实参，a是一个，b+c是一个，(a,b)是一个

（a,b）是一个逗号表达式

出这样题目的老师一定是一个只会读书的老师，从来没有编写过工程化的项目。


Question: 小鱼油日常求助

引用 6 楼 N-n-N的回复:如果没有 看看更改选项有没有对 w和其他之类的 然后如果打不开要新建一个 ？？？？？？

引用 4 楼 m0_46570923 的回复:为什么txt文件中一直什么都没有 改了那个问题之后，然后运行之后再去看你输入的文件

为什么txt文件中一直什么都没有

真丢人同样的问题遭遇两遍~！~~！

十分感谢你！每回都帮我解决问题！都不知道该怎么感谢你！

if ((fp = fopen(filename, "w") != NULL)) 改成如下： if ((fp = fopen(filename, "w")) != NULL)  注意括号的位置。 因为!=的优先级高于=


Question: C语言（有关背单词系统的）求助大神！！！

你百度一下怎么在C里面获取当前时间，还有单词以时间存储就按照时间查看单词，并把它们写入txt文件

引用 2 楼 wangdong20的回复:首先获取当前时间，这个简单查一下C的api就知道了。然后该时间下的内容一起写入txt文件 我就是不知道怎么把时间和时间下的内容一起写入txt文件鸭

localtime、time函数查一下，还有ctime 如下供参考～         #include <time.h>         char *asctime(const struct tm *tm);        char *asctime_r(const struct tm *tm, char *buf);         char *ctime(const time_t *timep);        char *ctime_r(const time_t *timep, char *buf);         struct tm *gmtime(const time_t *timep);        struct tm *gmtime_r(const time_t *timep, struct tm *result);         struct tm *localtime(const time_t *timep);        struct tm *localtime_r(const time_t *timep, struct tm *result);         time_t mktime(struct tm *tm);


Question: 错误就在//后面，类型总共只有4种，就是不晓得怎么改，求求各位大神救救孩子

发一个干净的完整代码出来 注意换行和对齐～


Question: 哪位大佬会这个

引用 1 楼 user-2的回复:横向图片看的费劲，估计愿意看的人不多 点一下就是横向的了，我传照片时特意设置正常角度看的，发完它自己变成这样的

内容还挺多的啊

横向图片看的费劲，估计愿意看的人不多


Question: 关于文件指针

你的if判断都是fp2呢?那么fp1为什么不判断呢？

那个指的是FILE的成员_ptr为空，不是代表fp1为空，一切都是正常的，你把fp1展开就能看的

好的，谢谢兄弟


Question: 二叉树的建立问题

单个跑是怎么理解呢

引用 9 楼 什么名字都被用了的回复:[quote=引用 8 楼 傻猴子的回复:][quote=引用 7 楼 什么名字都被用了的回复:][quote=引用 6 楼 傻猴子的回复:][quote=引用 4 楼 什么名字都被用了的回复:]那你看看你输入有没有问题 不会吧 因为是字符串 所以他就一个个的读取吧[/quote] 字符串肯定一个一个读啊[/quote] 那怎么弄这个图的啊 这个图是两位数的 我就弄不明白了[/quote] 结合你的输入方式来看吧，要么你读成数字，要么你读成字符串后自己手动两个一位合成两位[/quote] 对呀 所以我不会呀 啊哈哈哈哈 两个一位我查了一些资料还是没有思路 那个数字我也不太懂哈哈哈 明天再搞 今天打了一天的代码

引用 8 楼 傻猴子的回复:[quote=引用 7 楼 什么名字都被用了的回复:][quote=引用 6 楼 傻猴子的回复:][quote=引用 4 楼 什么名字都被用了的回复:]那你看看你输入有没有问题 不会吧 因为是字符串 所以他就一个个的读取吧[/quote] 字符串肯定一个一个读啊[/quote] 那怎么弄这个图的啊 这个图是两位数的 我就弄不明白了[/quote] 结合你的输入方式来看吧，要么你读成数字，要么你读成字符串后自己手动两个一位合成两位

引用 7 楼 什么名字都被用了的回复:[quote=引用 6 楼 傻猴子的回复:][quote=引用 4 楼 什么名字都被用了的回复:]那你看看你输入有没有问题 不会吧 因为是字符串 所以他就一个个的读取吧[/quote] 字符串肯定一个一个读啊[/quote] 那怎么弄这个图的啊 这个图是两位数的 我就弄不明白了

引用 6 楼 傻猴子的回复:[quote=引用 4 楼 什么名字都被用了的回复:]那你看看你输入有没有问题 不会吧 因为是字符串 所以他就一个个的读取吧[/quote] 字符串肯定一个一个读啊

引用 4 楼 什么名字都被用了的回复:那你看看你输入有没有问题 不会吧 因为是字符串 所以他就一个个的读取吧

引用 3 楼 傻猴子的回复:[quote=引用 2 楼 什么名字都被用了的回复:]单个跑是怎么理解呢 就比如说50 他是分为5和0读取的[/quote] 你看看输入有没有问题

那你看看你输入有没有问题

各位大神走过路过不要错过

引用 2 楼 什么名字都被用了的回复:单个跑是怎么理解呢 就比如说50 他是分为5和0读取的


Question: 哪位好心的大佬会这个C语言编程，非常感谢

https://blog.csdn.net/wangdong20/article/details/6779412 我曾今写了个类似的，你可以看着改一下

引用 3 楼 千梦一生的回复:我要是你没兴趣，觉得没意思的就不做了。 像我大学4学期挂了4学期英语一样。 有着时间不如找点感兴趣的 作业啊，没办法啊

引用 1 楼 user-3的回复:好歹自己写一个呀，遇到哪个模块写不出来或出现自己解决不了的错误再来问，这样才能真正掌握。 不会啊做不出来


Question: 关于if语句执行的问题

看见这代码就头疼，你可以用一下缩进的，代码要有点规范的样子嘛！

#include<stdio.h> int main() {     int a,b,c=0,i,j,p1,p2,n=0;     scanf("%d%d",&a,&b);     for(i=a;i<=b;i++)     {         for(j=2;j<i;j++)         {             if(i%j==0)             {                 c=1;                 break;             }             else                 c=c;         }         if(c==0)         {             p1=i/100;             p2=i%100;             if(p1==16||p1==25||p1==36||p1==49||p1==64||p1==81)             {                 if(p2==1||p2==4||p2==9||p2==16||p2==25||p2==36||p2==49||p2==64||p2==81)                 {                     n=n+1;                     printf("%d\n",i);                 }             }         }         c = 0;  //需要重新初始化      }     printf("%d",n); } 供参考～  需要对c重新初始化

#include<stdio.h> #include <stdbool.h>  int main() { 	int a, b, num, num1, num3, k, n=0; 	bool flag; 	scanf("%d%d", &a, &b); 	for ( num1=4; num1<=9; num1++ ) { 		for ( num3=1; num3<=9; num3++ ) { 			num = num1*num1*100 + num3*num3;  	//产生满足条件的4位数 			if ( a<=num && num<=b ) {	//若生成的4位数在指定范围内，则判断是否为素数  				flag = true; 				for( k=2; true && k<num/2; k++) {	//判断是否为素数 					if ( num%k==0 ) {	  						flag = false; 					} 				} 				if ( flag ) {		//	若是素数，则计数并输出  					n++; 					printf("%d\n", num); 				} 			} 		} 	} 	printf("n=%d\n", n); 	return 0; } 可以验证一下这个程序是否正确。

#include<stdio.h> int main() { 	int a,b,c=0,i,j,p1,p2,n=0; 	scanf("%d%d",&a,&b); 	for(i=a; i<=b; i++) { 		c = 0; 		for( j=2; j<i/2; j++) {	//判断是否为素数  			if(i%j==0) { 				c = 1; 				break; 			} /*else 				c=c; */ 		} 		if(c==0) { 			p1 = i/100; 			p2 = i%100; 			if (p1==16||p1==25||p1==36||p1==49||p1==64||p1==81) { 				if(p2==1||p2==4||p2==9||p2==16||p2==25||p2==36||p2==49||p2==64||p2==81) { 					n = n+1; 					printf("%d\n",i); 				} 			} 		}  	} 	printf("n=%d\n",n); 	return 0; }  请看看这个程序，修改了个别地方。其实这个算法可以更优化的。

引用 2 楼 自信男孩的回复:		/* 冗余代码～             else                 c=c; 		*/ 这部分是冗余代码，建议删掉～ 或者这儿改成如下： 		             else                 c=0; 		 已解决，谢谢😜


Question: float a = 0f;

引用 1 楼 真相重于对错 的回复:如果不加f,代表是一个整形 引用 3 楼 轻箬笠 的回复:C++编译器默认处理的是int和double，如果不加后缀的话，会进行强制类型转换，可能会影响最终的数值。 IEEE 754浮点数标准详解  哦，我看了下  确实是那个函数要求float类型  谢谢大佬

引用 1 楼 真相重于对错 的回复:如果不加f,代表是一个整形  然后有一些函数对类型要求比较严格吗  所以加上f

如果不加f,代表是一个整形

如果这个语句是在变量定义的时候出现，则语句 float a=0f; 可以不要那个“f”。


Question: 新手日常求助

引用 6 楼 lstalen的回复:你是不是什么都没有输入 输入了！但是什么都没有？！已经解决问题了但还是很感谢你能够回答我的问题

你是不是什么都没有输入

#include <stdio.h> #include<stdlib.h> int main() {     FILE* fp;     char ch, filename[50];     printf("请输入文件名：\n");     scanf("%s", filename);     //if (fp = fopen(filename, "w") == NULL)     if ((fp = fopen(filename, "w")) == NULL)     {         printf("error");         exit(0);     }     ch = getchar();     ch = getchar();     while (ch != '#')     {         fputc(ch, fp);         ch = getchar();//不了解这个的作用     } } 供参考～  注意==的优先级大于=（赋值），因此后面的先结合。

谢谢你告诉我这些东西！十分感谢

引用 2 楼 m0_46570923的回复:[quote=引用 1 楼 user-3的回复:]ch=getchar()就是继续从输入缓存里取字符啊 要不然，你的while(ch!=‘#’)ch的值就不会变，不就死循环了吗？ fputc只是把ch输出到文件，不会改变ch的值，所以需要ch=getchar()来获得下一个字符 听不太懂[/quote] 懂了懂了(￣∀￣)！谢谢！

引用 1 楼 user-3的回复:ch=getchar()就是继续从输入缓存里取字符啊 要不然，你的while(ch!=‘#’)ch的值就不会变，不就死循环了吗？ fputc只是把ch输出到文件，不会改变ch的值，所以需要ch=getchar()来获得下一个字符 听不太懂


Question: 一个关于英汉电子词典的，麻烦大佬们帮我看下、解决下问题，我怎么搞都不行，谢谢了

int loadSql(data *, char []); void printAction( void ); void dealAction(int); int searchWord(char []); int searchCn(char []); void saveSql( void ); 更一般的函数说明是这样的。

int loadSql(data *sql,char path[100]); void printAction(); void dealAction(int action); int searchWord(char word[20]); int searchCn(char cn[80]); void saveSql(); 请在程序的最前面加上函数说明，这样编译的警告错误就没有了。


Question: 求编程过程

#include <stdio.h> int main(int argc, char** argv) { 	char ch; 	while ( (ch=getchar())!='\n') { 		if ( 'A'<=ch && ch<='Z' ) {			//处理大写字母  			putchar( (ch-'A'+10)%26+'A'); 		} else if ( 'a'<=ch && ch<='z' ) {	//处理小写字母  			putchar( (ch-'a'+12)%26+'a'); 		} else if ( '0'<=ch && ch<='9' ) {	//处理数字  			putchar( ((ch-'0'-4)%10+10)%10+'0'); 		} else {							//处理其他字符  			putchar( ch ); 		} 	} 	return 0; }  请看看这个程序是否满足要求。

用c语言编写 急需


Question: 数据结构队的出队问题

引用 3 楼 qq_46411692 的回复:[quote=引用 2 楼 自信男孩的回复:]如果是队列，那么就会有对头，队尾指针。那么有这两个指针控制着队列，所以头部移动不需要关心移动之后的内容。整个队列在不使用时，统一释放～ 那我在移动队头之后他的队列空间会发生变化吗[/quote] 应该不会，你移动的是指针，不会修改空间内容～

没听说过“数据泄露”这种说法。。。

引用 5 楼 qq_46411692 的回复:[quote=引用 1 楼 真相重于对错的回复:]不一定，如果你用链式结构来实现队列的话，可能需要释放。 要是用数组之类的连续存储来做，就不用清楚，只要调整头部即可，就好比删除文件，没必要把文件的内容全部清除掉。 那如果是这样的话那么他的队其实是没有完成出队过程，只是在销毁顺序表的时候把他给销毁了[/quote] 感觉你在钻牛角尖,队列的访问位置只有头尾,那么我只要把头尾改变,不管那个数据还在不在队列的存储当中,我都无法访问到,访问不到不就是不存在了吗?

引用 1 楼 真相重于对错的回复:不一定，如果你用链式结构来实现队列的话，可能需要释放。 要是用数组之类的连续存储来做，就不用清楚，只要调整头部即可，就好比删除文件，没必要把文件的内容全部清除掉。 那如果是这样的话那么他的队其实是没有完成出队过程，只是在销毁顺序表的时候把他给销毁了

引用 1 楼 真相重于对错的回复:不一定，如果你用链式结构来实现队列的话，可能需要释放。 要是用数组之类的连续存储来做，就不用清楚，只要调整头部即可，就好比删除文件，没必要把文件的内容全部清除掉。 那我在移动队头之后他的队列空间会发生变化吗

引用 2 楼 自信男孩的回复:如果是队列，那么就会有对头，队尾指针。那么有这两个指针控制着队列，所以头部移动不需要关心移动之后的内容。整个队列在不使用时，统一释放～ 那我在移动队头之后他的队列空间会发生变化吗


Question: 求大佬赐教，C语言编译的，求能运行正常的代码和功能

发给我吧，发出来也行

引用 1 楼 Simple-Soft的回复:这么多功能，可能没有线程的 您好，代码我写完了，就是往文件输入和读取怎么也弄不进去，我可以发你代码，您可以帮我看看吗

引用 2 楼 自信男孩的回复:让别人给你写，你是需要付费的。不要以为别人没事专门写程序～ 我们可以商量商量

引用 2 楼 自信男孩的回复:让别人给你写，你是需要付费的。不要以为别人没事专门写程序～ 付费微信可以啊

让别人给你写，你是需要付费的。不要以为别人没事专门写程序～

这么多功能，可能没有线程的


Question: 删除字符串中指定元素的小bug

引用 2 楼 白浅星 的回复:你应该让targetChar这个存储新字符串的数组用另一个变量j来指定它的下标，否则就会因为共用一个i使得targetChar的部分元素跳过了赋值，制造出一个不符合意愿的字符串。 循环部分修改如下：  int j=0; while(i<256){ if(getChar[i]!=target) 	targetChar[j++]=getChar[i]; 	else  		continue; 	i++; }  其实i<256这个条件并不好，应该用getChar[i]!='\0'这个更好 恩，我看到了楼上的回复，确实死循环了，最终如下:  int j=0; while(getChar[i]!='\0'){ if(getChar[i]!=target) 	targetChar[j++]=getChar[i]; 	i++; } targetChar[j]='\0';

把else和continue两条语句都去掉； 因为你continue了，没有i++.那么下次还是第i的和target比较，那不是死循环了吗？


Question: SOCKET close()后状态问题


Question: C语言练习

scandf是让你输入函数，他调用你输入的数去执行的

scanf在等你输入数据呢。你需要在键盘上输入    数字1（空格）数字2（空格）数字3（回车）

scanf在等待你的输入，另外，输出应该用%lf而非%f

没输入三个数

scanf 表示输入，%lf表示双精度浮点数

需要输入三个数才有结果


Question: 求各位大佬帮帮忙

引用 11 楼 chxchxkkk的回复:把你的代码修改了一下，参考  #include <stdio.h> #include <stdlib.h> #include <math.h>  //定义结构体 typedef struct staff {     int id ;     char gender[8];     char name[20]; }STA;  //定义一个数组 STA stas[]={     {23,"男","王火"},     {12,"男","宜丰"},     {45,"女","张小花"},     {18,"男","李超"},     {18,"女","万思思"},     {77,"女","吴方"},     {4,"男","刘一明"},     {96,"男","邓伟"}, };  int main() {     STA temp;     int i,j;     for(i=0; i<8; i++)     {         for (j=0; j<8-1-i; j++)         {            if(stas[j].id>stas[j+1].id)            {                temp=stas[j];                stas[j]=stas[j+1];                stas[j+1]=temp;            }         }      }      printf("\n学号\t性别\t姓名\n");     for (i=0; i<8; i++)     {         printf("%d\t%s\t%s\n",stas[i].id, stas[i].gender, stas[i].name);     }     return 0; }  感谢大佬

不影响啊，符合条件的直接交换结构体了

引用 8 楼 chxchxkkk的回复:不影响啊，符合条件的直接交换结构体了 #include <stdio.h> #include <stdlib.h> #include <math.h>  typedef struct staff{//定义结构体 	int id ; 	char gender[8]; 	char name[20]; }STA; STA stas[]={//定义一个数组 	{23,"男","王火"}, 	{12,"男","宜丰"}, 	{45,"女","张小花"}, 	{18,"男","李超"}, 	{18,"女","万思思"}, 	{77,"女","吴方"}, 	{4,"男","刘一明"}, 	{96,"男","邓伟"} };  int main(){ STA temp; int i; for(i=0;i<=7;i++) { if(stas[i].id>stas[i+1].id) { 	temp=stas[i]; 	stas[i]=stas[i+1]; 	stas[i+1]=temp; }  printf("%c\n",stas[i] ); }return 0; } 大佬我这个代码错了他输出只输出了数字

引用 8 楼 chxchxkkk的回复:不影响啊，符合条件的直接交换结构体了 okk谢啦大佬

引用 6 楼 chxchxkkk的回复:[quote=引用 5 楼 I  don＇t  know 的回复:] [quote=引用 2 楼 qybao的回复:]用个结构体数组就可以 typedef struct staff { //定义结构体     int id;     char gender[8];     char name[20]; } STA;  STA stas[]={ //定义一个数组     {23, “男”, “王火”},     {12, “男”, “宜丰”},     ...     {96, “男”, “邓伟”} }; 大佬如果需要用里面的数字比较大小排序该怎么做呢？[/quote]   定义个临时结构体，然后用学号排序 STA temp; 然后循环排序 if (stas[i].id < stas[i+1]) {     temp =  stas[i];     stas[i] = stas[i+1];     stas[i+1] = temp; }[/quote] 大佬我有个问题，他们里面有字符串，不会影响比较嘛，感谢

引用 5 楼 I  don＇t  know 的回复:[quote=引用 2 楼 qybao的回复:]用个结构体数组就可以 typedef struct staff { //定义结构体     int id;     char gender[8];     char name[20]; } STA;  STA stas[]={ //定义一个数组     {23, “男”, “王火”},     {12, “男”, “宜丰”},     ...     {96, “男”, “邓伟”} }; 大佬如果需要用里面的数字比较大小排序该怎么做呢？[/quote]   定义个临时结构体，然后用学号排序 STA temp; 然后循环排序 if (stas[i].id < stas[i+1]) {     temp =  stas[i];     stas[i] = stas[i+1];     stas[i+1] = temp; }

引用 2 楼 qybao的回复:用个结构体数组就可以 typedef struct staff { //定义结构体     int id;     char gender[8];     char name[20]; } STA;  STA stas[]={ //定义一个数组     {23, “男”, “王火”},     {12, “男”, “宜丰”},     ...     {96, “男”, “邓伟”} }; 大佬如果需要用里面的数字比较大小排序该怎么做呢？

引用 2 楼 qybao的回复:用个结构体数组就可以 typedef struct staff { //定义结构体     int id;     char gender[8];     char name[20]; } STA;  STA stas[]={ //定义一个数组     {23, “男”, “王火”},     {12, “男”, “宜丰”},     ...     {96, “男”, “邓伟”} }; 十分感谢大佬

引用 1 楼 user-3的回复:用你属性的，数组就好，没有说一定要链表 感谢大佬。。

用你属性的，数组就好，没有说一定要链表


Question: 线性表合并问题

用链表比较节省空间，效率也会比较高。如果用数据会考虑到通过移位或者新建新的空间，新的空间应该是两个表的和。 建议用链表，从空间复杂度和时间复杂度都比较合适。

就是不用创建新到了链表，把两个链表重新连起来

就是合并排序


Question: c语言结构体题目

引用 4 楼 自信男孩的回复:#include <stdio.h>  #define N 3  struct Student {     int num;      char name[10];     float score[3];     float aver; };  int main() {     int i;      struct Student stu[N];      struct Student *p=stu;      void average(struct Student stu[N]);      for(i=0;i<N;i++)     {         scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i]. score[0],&stu[i].score[1],&stu[i].score[2]);         //stu[i].aver= (stu[i].score[0]+ stu[i]. score[1]+ stu[i].score[2])/3;         stu[i].aver= (stu[i].score[0]+ stu[i]. score[1]+ stu[i].score[2])/3.0;     }     average(p);     return 0; }  void average(struct Student stu[N]) {     int i,j,k,max[3];     float sum,           aver[3];      for(i=0;i<3;i++) {         sum = 0;         max[i] = 0;         for(j=0;j<N;j++) {             sum += stu[j].score[i];             if (stu[j].score[i] > stu[max[i]].score[i])                 max[i] = j;         }         aver[i]=sum / 3.0;     }     /*     for(i=0;i<3;i++)     {         sum=0;          for(j=0;j<N;j++)         {             sum+=stu[j].score[i];              for(k=1;k<N;k++)             {                 if(stu[j].score[i]<stu[k].score[i])                 {                     max[i]=k;                 }             }         }         aver[i]=sum/3;     }     */     for(i=0;i<3;i++)     {         printf("%d %5.1f\n%5d %s %5.1f %5.1f %5.1f %5.1f\n",i,aver[i],max[i],stu[max[i]].name,                  stu[max[i]].score[0],stu[max[i]].score[1],stu[max[i]].                  score[2],stu[max[i]].aver);     } } 供参考～  对比代码找一下自己的问题～ 万分感谢

那个那里错了，能不能帮忙看一下，结果不太对

#include <stdio.h>  #define N 10  struct Student { int num;  char name[10]; float score[3]; float aver; }; int main() { int i;  struct Student stu[N];  struct Student *p=stu;  void average(struct Student stu[N]); for(i=0;i<N;i++) { scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i]. score[0],&stu[i].score[1],&stu[i].score[2]); stu[i].aver= (stu[i].score[0]+ stu[i]. score[1]+ stu[i].score[2])/3; } average(p); return 0; } void average(struct Student stu[N]) { int i,j,k,max[3]; float sum, aver[3]; for(i=0;i<3;i++) { sum=0;  for(j=0;j<N;j++) { sum+=stu[j].score[i]; max[i]=j;    for(k=1;k<N;k++)   {     if(stu[j].score[i]<stu[k].score[i]) 	{ 		max[i]=k; 	}   } } aver[i]=sum/3; } for(i=0;i<3;i++) { printf("%d %5.1f\n%5d %s %5.1f %5.1f %5.1f %5.1f\n",i,aver[i],max[i],stu[max[i]].name,  stu[max[i]].score[0],stu[max[i]].score[1],stu[max[i]].  score[2],stu[max[i]].aver); } }

不要什么都不写，什么都不做，就让别人帮你写好，调试正确了。别人不一定这么闲，如果真想要，付费给别人吧～ 天上掉馅饼的事情想想就好，没那么多好事～ 现在想起来要交作业了，早干嘛去了？


Question: 单片机花式灯求各位大佬一个代码用C语言写

先自己试试，ｗｈｉｌｅ一下，每隔ｔ１时间计数变量加加，当到你需要的种数的时候归零继续加。然后闪烁就先规定每个值是怎么输出的，到了那个值就调用对应的输出


Question: 学生成绩管理系统

网上一大堆命令行版的，如果实在需要的话，我可以给你用QT做个带界面的。不过要意思意思的哦。

用结构体数组自己按模块写吧，总不能让别人全写好了自己复制粘贴吧，那样有什么收获呢

一行代码都没有，咋帮


Question: 求详细代码注释

这就是它的内存模型

引用 4 楼 自信男孩 的回复:*(*(ptr + i) + j)等价ptr[i][j]，因此*(ptr + i) + j等价&ptr[i][j]  ptr + i即ptr的地址向后偏移i * sizeof(int **)个字节。通过打印可以看出楼主的编译器是64位的，因为每次偏移8个字节，即sizeof(int **)是8；对于这句定论楼主可以再验证一下，使用sizeof(long)输出一下值。  *(ptr+i)即ptr[i]是第i行的首地址。*(ptr+i)因为每行是2个元素（两列），因此ptr[i]每次偏移2 * sizeof(int)个字节。但是这个地方不知道为什么是偏移32个字节，我这里怀疑是申请时故意多给了16个字节。 谢谢请问为什么ptr+0和*(ptr+0)和后面的ptr+1和*(ptr+`1)没有关系

引用 4 楼 自信男孩 的回复:*(*(ptr + i) + j)等价ptr[i][j]，因此*(ptr + i) + j等价&ptr[i][j]  ptr + i即ptr的地址向后偏移i * sizeof(int **)个字节。通过打印可以看出楼主的编译器是64位的，因为每次偏移8个字节，即sizeof(int **)是8；对于这句定论楼主可以再验证一下，使用sizeof(long)输出一下值。  *(ptr+i)即ptr[i]是第i行的首地址。*(ptr+i)因为每行是2个元素（两列），因此ptr[i]每次偏移2 * sizeof(int)个字节。但是这个地方不知道为什么是偏移32个字节，我这里怀疑是申请时故意多给了16个字节。 就好比 int *a,*b; a= new int[2]; b=new int[2]; a和b 差16也好，差32也好，都是可能的

每行一个指针，彼此没有关系。相当于一个数组，每个元素都是一个指针，每个指针各自有其开辟的时机，没必要连续。。。

我觉得我说的已经比较清楚了，如果你不明白，请把你不明白的具体那一行代码说出来，而不是让我从头讲起，就好比初中数学老师上课不会讲加减乘除。

引用 1 楼 真相重于对错 的回复:ptr是二级指针，他的数据是连续的4个指针，每个指针指向一个包含连续的2个int的地址。老哥具体点啊

int arr[m][n], arr[i][j] = arr+((i*n)+j)*sizeof(int); int **arr; ... arr[i][j]=arr+sizeof(int*)*i+sizeof(int)*j

你说的是差32,不可理解,对吧? 那么我这写,你觉得差多少呢？   int** arr = new int[2];     arr[0] = new int[10];     arr[1] = new int[20];  再说你说要在栈动态申请，你不怕破坏栈吗？

引用 14 楼 真相重于对错 的回复:[quote=引用 13 楼 自信男孩 的回复:] [quote=引用 10 楼 真相重于对错 的回复:] 这没有涉及到碎片的问题。 例如 int** aaa = new int*[2]; aaa[0]=new int[7];  //这里执行了另外操作。。 //比如  //又有开辟一个指针 int *x = new int[123]; //然后 aaa[1]=new int[6]; //那么aaa[0]和aaa[1],之间完全可以不连续 这种形式二级指针来模拟二维数组，不同于二维数组，二维数组是连续的，而这个部要求连续。。所以也不涉及碎片。。 是不要求连续，但是malloc/realloc也不是这一下，那里一下分配空间的，需要考虑分配空间的效率和一定规则～所以多分配的可以考虑其他方面。[/quote] 当然写程序，分配内存考虑碎片是肯定的，但是，就此情况来说，他们之间无论差多少都不是灵异事件。没必要大惊小怪。[/quote] 当然需要，这也是为了学习堆分配空间的方法。那么在栈上动态申请空间也是需要考虑。

引用 13 楼 自信男孩 的回复:[quote=引用 10 楼 真相重于对错 的回复:] 这没有涉及到碎片的问题。 例如 int** aaa = new int*[2]; aaa[0]=new int[7];  //这里执行了另外操作。。 //比如  //又有开辟一个指针 int *x = new int[123]; //然后 aaa[1]=new int[6]; //那么aaa[0]和aaa[1],之间完全可以不连续 这种形式二级指针来模拟二维数组，不同于二维数组，二维数组是连续的，而这个部要求连续。。所以也不涉及碎片。。 是不要求连续，但是malloc/realloc也不是这一下，那里一下分配空间的，需要考虑分配空间的效率和一定规则～所以多分配的可以考虑其他方面。[/quote] 当然写程序，分配内存考虑碎片是肯定的，但是，就此情况来说，他们之间无论差多少都不是灵异事件。没必要大惊小怪。

引用 10 楼 真相重于对错 的回复:这没有涉及到碎片的问题。 例如 int** aaa = new int*[2]; aaa[0]=new int[7];  //这里执行了另外操作。。 //比如  //又有开辟一个指针 int *x = new int[123]; //然后 aaa[1]=new int[6]; //那么aaa[0]和aaa[1],之间完全可以不连续 这种形式二级指针来模拟二维数组，不同于二维数组，二维数组是连续的，而这个部要求连续。。所以也不涉及碎片。。 是不要求连续，但是malloc/realloc也不是这一下，那里一下分配空间的，需要考虑分配空间的效率和一定规则～所以多分配的可以考虑其他方面。

续上  for(int i=0;i<3;i++)   a[i]=new int[3];  a[2][1] = *(a+2)+1

引用 9 楼 自信男孩 的回复:[quote=引用 6 楼 真相重于对错 的回复:] [quote=引用 4 楼 自信男孩 的回复:] *(*(ptr + i) + j)等价ptr[i][j]，因此*(ptr + i) + j等价&ptr[i][j]  ptr + i即ptr的地址向后偏移i * sizeof(int **)个字节。通过打印可以看出楼主的编译器是64位的，因为每次偏移8个字节，即sizeof(int **)是8；对于这句定论楼主可以再验证一下，使用sizeof(long)输出一下值。  *(ptr+i)即ptr[i]是第i行的首地址。*(ptr+i)因为每行是2个元素（两列），因此ptr[i]每次偏移2 * sizeof(int)个字节。但是这个地方不知道为什么是偏移32个字节，我这里怀疑是申请时故意多给了16个字节。 就好比 int *a,*b; a= new int[2]; b=new int[2]; a和b 差16也好，差32也好，都是可能的[/quote] 也要考虑多申请的情况，也可能是考虑碎片处理的。 堆上的空间一般也是顺序申请的，一般不会散乱的申请的，所以除非碎片，否则不会差16，差32的[/quote] int array[3][3] array[2][1] 相当于 array+sizeof(int)*2*3+1; 而 int **a  = new int*[3]；

引用 6 楼 真相重于对错 的回复:[quote=引用 4 楼 自信男孩 的回复:] *(*(ptr + i) + j)等价ptr[i][j]，因此*(ptr + i) + j等价&ptr[i][j]  ptr + i即ptr的地址向后偏移i * sizeof(int **)个字节。通过打印可以看出楼主的编译器是64位的，因为每次偏移8个字节，即sizeof(int **)是8；对于这句定论楼主可以再验证一下，使用sizeof(long)输出一下值。  *(ptr+i)即ptr[i]是第i行的首地址。*(ptr+i)因为每行是2个元素（两列），因此ptr[i]每次偏移2 * sizeof(int)个字节。但是这个地方不知道为什么是偏移32个字节，我这里怀疑是申请时故意多给了16个字节。 就好比 int *a,*b; a= new int[2]; b=new int[2]; a和b 差16也好，差32也好，都是可能的[/quote] 也要考虑多申请的情况，也可能是考虑碎片处理的。 堆上的空间一般也是顺序申请的，一般不会散乱的申请的，所以除非碎片，否则不会差16，差32的


Question: 请问一下 k 和return (int *)(&tmp) ；是什么意思， 还有别的写法吗？

&tmp真是糟粕。tmp一般被认为是首地址，更像一个右值。还能取个地址是万万没想到的。  不过我试了以下并不报错。 &tmp是一个int(*)[4]类型的。一个指向 4倍int长度数组 的指针。是我见识短浅，这种类型过去少有见识。 不过非常有趣，有一定的实用价值。  所以我对此有个看法了：&tmp这里的tmp已不作首地址意义，而仅是作为数组的指代意义

return  tmp; 这样写也是可以的。 因为tmp是数组，数组名就是数组的首地址。

tmp没有看到定义啊

返回tmp的地址，别的方式就是直接定义指针，返回指针


Question: 为何这个函数无法实现对字符串的倒序排序？

或者申明静态数组 static char q[100];

q[100]为局部变量，存储在栈里，函数不能返回局部变量的地址。改为malloc在堆上分配地址。   char *q;     q=(char*)malloc(100*sizeof(char)); 另外， q[t]='\0';


Question: 请教一个C语言的问题，PTA上刷题遇到的

转换为整数比较

#include <stdio.h> int main() { 	int n, i, h; 	int std, w; 	scanf("%d", &n); 	for(i=0; i<n; i++) 	{	scanf("%d%d", &h, &w); 		std = (h-100)*18; 		if( (w*100) <= (9*std) ) { 			printf("You are tai shou le!\n"); 		} else if( (100*w) >= (11*std)) { 			printf("You are tai pang le!\n"); 		} else { 			printf("You are wan mei!\n"); 		} 	} 	return 0; } 这个程序，用 int 类型。

建议使用浮点数比较方法，楼主用的是整型数比较的方法。  https://blog.csdn.net/u013760665/article/details/89528140

没有发现本质性错误，只能是试试了。 #include <stdio.h> int main() { 	int n, i, h; 	double std, w; 	scanf("%d", &n); 	for(i=0; i<n; i++) 	{	scanf("%d%lf", &h, &w); 		std = (h-100)*1.8; 		if( w <= 0.9*std ) { 			printf("You are tai shou le!\n"); 		} else if( w >= 1.1*std ) { 			printf("You are tai pang le!\n"); 		} else { 			printf("You are wan mei!\n"); 		} 	} 	return 0; }


Question: c语言pow函数

引用 1 楼 真相重于对错的回复:二元运算符 % 产生以第二操作数整除第一操作数的余数（经一般算术转换后；注意各操作数的类型必须都为整型类型）。若商 a/b 能以结果类型表示，则 (a/b)*b + a%b == a。若第二操作数为零，则行为未定义。若商 a/b 不能以结果类型表示，则 a/b 和 a%b 的行为均未定义（这意味着，补码系统上 INT_MIN%-1 为未定义）。 懂了，谢谢兄弟


Question: 求助 6-17 长整数转化成16进制字符串 (10分)

大佬牛逼牛逼啊。

可以取巧 void f( long int x, char *p ) {     if(x>=0)     {         printf("%X",(unsigned)x);     }     else     {         x=-x;         printf("-%X",(unsigned)x);     } }


Question: 求大佬指点我一下函数

3题，自己可以在PC上试一下。n > 2执行，因此func(3)即f(2) + f(1)执行else即，2+2，最后是4.  4题， 由于C函数内不能再定义函数,C函数的存储类型只能是静态的或外部的之一。若定义函数时不指定存储类型是静态的,则它的存储类型就是外部的(extern),即函数允许被程序的其它函数调用。所以解答是extern;(网上down下来的，自己完全可以自己先去查查）  9题，自己一样可以试试。


Question: 求大佬给一下这个编程题的过程，谢谢

比较基础的问题，为什么不自己先试试呢？另外，图片还是反着的，懒得打字吗？