Question: 求解

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

仅供参考：//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

看优先级，++和-的优先级x++ - 1，++（后增）的优先级比-的优先级高，所以x++现结合，作为一个整体，所以减1之后再算++  https://blog.csdn.net/xtlisk/article/details/40116813


Question: 关于C语言宏定义

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

你用的是全角分号吧

引用 11 楼 qzjhjxj 的回复:[quote=引用 10 楼 Dream1018 lin 的回复:][quote=引用 8 楼 真相重于对错 的回复:]宏就是文本替换，你那个肯定不对。 相当于 printf("...",xxxxxx ;); 所以说所有的宏定义最后边都不需要 " ; " 对吗？ 可是为什么在某些情况下又可以呢？ 比如说： [/quote]这个相当于执行一次空语句，再多加几个也没感觉t = div(x,y);;;;;;[/quote] 怎么会对？“;”代表的语句的结束，但是你前面是调用printf函数，函数调用时，函数名后面的括号一定要匹配，所以肯定不对啊

引用 11 楼 qzjhjxj 的回复:[quote=引用 10 楼 Dream1018 lin 的回复:][quote=引用 8 楼 真相重于对错 的回复:]宏就是文本替换，你那个肯定不对。 相当于 printf("...",xxxxxx ;); 所以说所有的宏定义最后边都不需要 " ; " 对吗？ 可是为什么在某些情况下又可以呢？ 比如说： [/quote]这个相当于执行一次空语句，再多加几个也没感觉t = div(x,y);;;;;;[/quote] 明白了。谢谢大佬

用do {……} while(0)括住宏，解决分号结束问题。

引用 10 楼 Dream1018 lin 的回复:[quote=引用 8 楼 真相重于对错 的回复:]宏就是文本替换，你那个肯定不对。 相当于 printf("...",xxxxxx ;); 所以说所有的宏定义最后边都不需要 " ; " 对吗？ 可是为什么在某些情况下又可以呢？ 比如说： [/quote]这个相当于执行一次空语句，再多加几个也没感觉t = div(x,y);;;;;;

引用 8 楼 真相重于对错 的回复:宏就是文本替换，你那个肯定不对。 相当于 printf("...",xxxxxx ;); 所以说所有的宏定义最后边都不需要 " ; " 对吗？ 可是为什么在某些情况下又可以呢？ 比如说：

肯定不行呢，看看楼上这位大咖已经给你等价替换出来了。  引用 8 楼 真相重于对错 的回复:宏就是文本替换，你那个肯定不对。 相当于 printf("...",xxxxxx ;);

我感觉会不会是连续声明两个宏定义，所以两者之间不能有 " ; "  ？  当只有一个宏定义的时候，“ ; ”便可有可无？ 不太明白为什么。。。求大神空降回答。

引用 1 楼 早打大打打核战争 的回复:你用的是全角分号吧用的是半角符号

引用 2 楼 自信男孩 的回复:报什么错误？在代码里又是如何使用s, area呢？这些是关键，不能说单单的宏定义会报错或不报错。重点是如何用的，宏定义就是等价替换，放在代码里看看是否符合语法规则～ 你看一下，就是这样报错，其他的情况都没问题。

如果s(a,b,c) 在后面代码中直接参与运算，则不加分号，比如 s(a,b,c) +123； //这个里s不能有加号  直接调用，不参与运算则可以加，建议不要加了 s(a,b,c)

VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898


Question: 【C语言求助】静态链表执行赋值语句时暂停运行

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

#include <stdio.h> #include <math.h> #include <stdlib.h> struct node {     int num;     struct node *next; }node;  int main(void) {     //struct node num,* head, * p=head;     struct node num, *head, *tail, *p;     //int ordinal=1,remain=13;      //开辟13个节点     //在节点里存入数据num：1~13      //if(p!=NULL) printf("Not NULL...\n");     //printf("%d ",p->num);     head = NULL;     for(int i=0;i<13;i++)     {         p = (struct node *)malloc(sizeof(struct node));         if (!p)             exit(0);         if (!head)             head = p;         else             tail->next = p;         p->num=i+1;         printf("%d ",p->num);         tail = p;         //p=p->next;     }      p->next = NULL;      p = head;     while (p) {         printf("%d ",p->num);         p = p->next;     }     printf("\n");      return 0; } 供参考～

暂停运行是指什么？参考楼主的代码修改，生成带头节点的13个节点的链表，同时往里存入1-13，供参考：#include <stdio.h> #include <math.h> #include <stdlib.h> struct node {     int num;     struct node *next; }node; void main() {     struct node num,* head, * p,*q;     //int ordinal=1,remain=13;     //开辟13个节点     //在节点里存入数据num：1~13     head = (struct node *)malloc(sizeof(struct node));     head->next = NULL;     q = head;     if(q!=NULL) printf("Not NULL...\n");     //printf("%d ",p->num);     for(int i=0;i<13;i++)     {         p = (struct node *)malloc(sizeof(struct node));         p->num=i+1;         p->next=NULL;         q->next=p;         q=p;         printf("i=%d,%d\n",i,p->num);         //p=p->next;     }     q=head->next;     while(q){           printf("%d\n",q->num);           q=q->next;     }     //p=NULL;     system("pause"); }

head是野指针


Question: ？？？实在不懂了

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

首先，我说的是“看的C书至少都有20年以上的历史了”，引号中的文字意思很清楚。这是个语文的问题。 其次，我说的是标准指定了main函数的语法形式，至少有两种，我只是使用了其中之一，我没说别的。我不知道我的局限性是从何说起的。 最后，关于变长数组，我说的是 int n = 5, a [n]; 这种。而且，这个声明在C语言里是合法的。我也不是指用malloc分配的动态空间数组。 我看的C书不多，严格来说一本都没看过，因为很多书看了不如不看。甚至我连C语言之父的经典著作都没看过。所以，看的C书可能还不如你多。这是实话。唯一的例外是C99，C11，C18的标准文档。但标准文档中库的部分我也没有完全通读。

引用 11 楼 均陵鼠侠 的回复:[quote=引用 8 楼 自信男孩 的回复:]函数声明需要加分号;因为声明也是一条语句～ 有警告，exit函数调用要引入stdlib.h头文件。另外，exit(0)有参数～ 至少在C语言里，声明和语句是严格区分的。声明有声明的语法，语句有语句的组成。因为都有分号所以声明和语句是一回事，这是很奇怪的定义。 我发现这个论坛里的人，看的C书至少都有20年以上的历史了，甚至还在说C语言没有变长数组。如果工作中还用得上C语言，该补的课还是要补的。[/quote]  C语言于1972年11月问世，1978年美国电话电报公司（AT&T）贝尔实验室正式发布C语言，1983年由美国国家标准局（American National Standards Institute，简称ANSI）开始制定C语言标准，于1989年12月完成，并在1990年春天发布，称之为ANSI C，有时也被称为 C89 或 C90  另外，真没你看书历史长，我从接触C语言书本，才有10年左右，但是看的时间也就几年吧。你说的是看书20多年，还是C语言出书20多年，没看你描述清楚～

引用 10 楼 均陵鼠侠 的回复:[quote=引用 2 楼 user-5 的回复:]main()只能有一个，而且它也不需要声明。 只是说main函数的定义只能有一个，函数定义实际上也是函数声明。所以main函数不需要声明的说法是错误的。 函数可以声明多次，但是带有函数体的函数声明只能有一次，main函数也是这样。比如：  int main (void); int main (void) {     exit (0); } 这是没有任何问题的。 函数main 和其它函数只有一个地方是不同的：对它的调用是在运行库中，所以，要求运行库中的调用形式（这是你没办法改变的）必须和你声明的形式匹配。这就是为什么标准指定了函数main的声明形式。[/quote]  那么这样函数声明，也有这样的吧 int main(int argc, char *argv[]);你说的main函数声明也有局限性～

引用 11 楼 均陵鼠侠 的回复:[quote=引用 8 楼 自信男孩 的回复:]函数声明需要加分号;因为声明也是一条语句～ 有警告，exit函数调用要引入stdlib.h头文件。另外，exit(0)有参数～ 至少在C语言里，声明和语句是严格区分的。声明有声明的语法，语句有语句的组成。因为都有分号所以声明和语句是一回事，这是很奇怪的定义。 我发现这个论坛里的人，看的C书至少都有20年以上的历史了，甚至还在说C语言没有变长数组。如果工作中还用得上C语言，该补的课还是要补的。[/quote]  你的理解变长数组是这样的吗？int n, a[n];我说的变长数组是指这样的。int a[0]; a = (int *)malloc(xxxx *sizeof(int));这样的定义可不是我说的变长数组。 所以，你的理解认为是我的理解，这种说法站不住脚。 描述有语句语境，有背景，没看到你提到背景，环境，只是在这讨论理论。那么你看书如果多的话，应该引用一下课本上（或者）书本上的文字，当然这些文字也有时效性，看完书本还不行，还得看编译器的版本，老旧版本的语法检查规则也有差异。 所以，你在这里教训别人，不如引入例子更有说服力，你说呢？

引用 8 楼 自信男孩 的回复:函数声明需要加分号;因为声明也是一条语句～ 有警告，exit函数调用要引入stdlib.h头文件。另外，exit(0)有参数～ 至少在C语言里，声明和语句是严格区分的。声明有声明的语法，语句有语句的组成。因为都有分号所以声明和语句是一回事，这是很奇怪的定义。 我发现这个论坛里的人，看的C书至少都有20年以上的历史了，甚至还在说C语言没有变长数组。如果工作中还用得上C语言，该补的课还是要补的。

引用 2 楼 user-5 的回复:main()只能有一个，而且它也不需要声明。 只是说main函数的定义只能有一个，函数定义实际上也是函数声明。所以main函数不需要声明的说法是错误的。 函数可以声明多次，但是带有函数体的函数声明只能有一次，main函数也是这样。比如：  int main (void); int main (void) {     exit (0); } 这是没有任何问题的。 函数main 和其它函数只有一个地方是不同的：对它的调用是在运行库中，所以，要求运行库中的调用形式（这是你没办法改变的）必须和你声明的形式匹配。这就是为什么标准指定了函数main的声明形式。

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

建议行22的主函数改成int类型 有时候你需要通过主函数的返回值是否为0来判断代码有没有错误的

引用 5 楼 change_2 的回复:[quote=引用 2 楼 user-5的回复:]main()只能有一个，而且它也不需要声明。 谢谢你，大佬，你是对的[/quote]成了吗？  引用 5 楼 change_2 的回复:[quote=引用 2 楼 user-5的回复:]main()只能有一个，而且它也不需要声明。 谢谢你，大佬，你是对的[/quote]可以了吗?

引用 2 楼 user-5的回复:main()只能有一个，而且它也不需要声明。 谢谢你，大佬，你是对的

引用 2 楼 user-5的回复:main()只能有一个，而且它也不需要声明。 第36行的exit（0）那里就是红色的

引用 2 楼 user-5的回复:main()只能有一个，而且它也不需要声明。 哦，但是第一张图片是没有加main的，它那里的错误是为什么呢

main()只能有一个，而且它也不需要声明。

第4行的main()是多余的


Question: 求助

你倒是发个清晰点的照片啊。


Question: 为什么这里是错的？

把int i;放在for之前试试； 编译已经给于提示了，C99标准支持你这种写法～ 要么改成for循环前定义i,要么添加循环-std=c99

C90并不允许在for后面的圆括号里声明循环变量。 删掉int并在函数体开头写int i;可以满足一切C编译器的喜好。


Question: 多项式求和

多项式的式子呢？


Question: 在查询数据库时遇到的一个问题

用try语句捕获该捕获的异常。

dddddd


Question: 为什么我输入的入栈元素只有最后一根能出栈？不应该是出栈六个不一样的吗

引用 1 楼 user-2的回复:供参考：#include<stdio.h> #include<stdlib.h>  #define STACK_INIT_SIZE 100 #define STACKINCREMNT   10 #define OVERFLOW        0 #define ERROR           0 #define OK              1  typedef struct {      int *top ;      int *base;      int stacksize; }SqStack;  int InitStack(SqStack &L) {      L.base=(int*)malloc(10*sizeof(int));      if(!L.base)  exit(OVERFLOW);      L.top=L.base;      L.stacksize=10;      return OK; } int GetTop(SqStack L,int &e) {      if(L.base==L.top)return  ERROR;      e=*(L.top-1);      return OK; } int Push(SqStack &L,int e) //int Push(SqStack L,int e) {      if(L.top-L.base>=L.stacksize){         L.base=(int*)realloc(L.base,(L.stacksize+STACKINCREMNT) * sizeof(int));         L.top=L.base+L.stacksize;         L.stacksize=L.stacksize+STACKINCREMNT;      }      *(L.top++) = e;      return OK; } int Pop(SqStack &L,int &e) //int Pop(SqStack L,int &e) {      if(L.top != L.base)         e=*(--L.top); //e=*(L.top--)      return OK;       //e; }  int main() {      int i,n,m;      SqStack L;      InitStack (L);      for(i=0;i<6;i++){          scanf("%d",&n);          Push(L,n);      }      for(m=0;m<6;m++){          Pop(L,n);          printf("%d\n",n);      }            return 0; } 谢谢了，已经解决了，没有取地址


Question: 求大佬救救孩子

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

救不了了。。

你这，我看的都不敢学了

引用 11 楼 user-13 的回复：抽空写了个，感觉输出时的序号有点想头，供参考：#include<stdio.h> #define STUDENTS 10 //按题目要求<10个学生  void  input(); int   sum(int m,int e,int c); void  sort(); void  print();  typedef struct{ //自定义结构体类型 	int   numcode; 	int   math; 	int   english; 	int   chinese;     int   sum;     int   avg; }STUDENT;  STUDENT student[STUDENTS];//定义10个学生数组 int stu_num;              //学生人数  void main() {       input(); //输入       sort();  //排序,从大到小       print(); //输出       //system("pause"); }  void input() {      printf("Input students number:");      scanf("%d",&stu_num);      if(stu_num >= STUDENTS){         printf("Please input 1-9.\n");         exit(0);      }      for(int i = 0; i < stu_num; i++){         scanf("%d %d %d %d", &student[i].numcode,&student[i].math,                              &student[i].english,&student[i].chinese);         student[i].sum = sum(student[i].math,student[i].english,student[i].chinese);         student[i].avg = student[i].sum/3;      } }  int sum(int m,int e,int c) {      return m+e+c; }  void sort() {       STUDENT temp;       for (int i = 0; i < stu_num ;i++){          for (int k = 0; k < stu_num - 1 -i ;k++){            if(student[k].sum < student[k+1].sum ) {                   temp        = student[k];                   student [k] = student[k+1];                   student[k+1]= temp;            }          }       } }  void print() {      int j=0;      for(int i = 0; i < stu_num; i++){ //打印输出        printf("%4d   %10d   %5d   %5d   %5d\n",            i==0?(j=i+1):(student[i].sum == student[i-1].sum?(j):(j=i+1)),            student[i].numcode,student[i].math,student[i].english,student[i].chinese);       }  }  //Input students number:8 //39060405 78 82 69 //39060412 95 85 91 //39060413 95 86 90 //39060415 98 88 85 //39060419 75 89 88 //39060421 89 88 75 //39060425 85 78 93 //39060427 87 92 88 //   1     39060412      95      85      91 //   1     39060413      95      86      90 //   1     39060415      98      88      85 //   4     39060427      87      92      88 //   5     39060425      85      78      93 //   6     39060419      75      89      88 //   6     39060421      89      88      75 //   8     39060405      78      82      69 //请按任意键继续. . .不错

#include "stdio.h" #include "stdlib.h" /**  * 学生成绩结构体  */ typedef struct student_grade{     char no[10]; //学号     int mathGrade; //数学成绩     int enGrade;//英语成绩     int chGrade;//语文成绩     int total;//总分     int avg; //平均分     int rank; //排名 }StudentGrade;  /**  * 学生列表  */ typedef struct student_list{     StudentGrade * arr[10]; //数组 最大10个     int n;//学生数量 小于10 }StudentList;  /**  * 创建 学生  * @return  */ static StudentGrade * createStudentGrade();  /**  * 释放内存  * @param grade  */ static void freeStudentGrade(StudentGrade* grade);  /**  * 创建列表  * @return  */ static StudentList * createStudentList(int n);  /**  * 释放内存  * @param studentList  */ static void freeStudentList(StudentList* studentList);   /**  * 排序  * @param studentList  */ static void sortStudentList(StudentList* studentList);  /**  * 打印学生成绩列表  * @param studentList  */ static void printStudentList(StudentList* studentList);   /**  * 获取输入数字  * @param min 最小值  * @param max 最大值  * @return  */ static int getNumFromInput(int min, int max);  /**  * 输入学生成绩  * @param grade  */ static void inputStudentGrade(StudentGrade* grade);  /**  * 程序入口  * @return  */ int main(){     //输入学生人数 1-9     printf("please input the number of students:\n");     int n = getNumFromInput(1, 9);     int i;     //创建列表     StudentList * studentList = createStudentList(n);     for(i = 0; i < n; i++){         printf("please input the no.%d student's grade\n", i+1);         //输入成绩         inputStudentGrade(studentList->arr[i]);     }     //排名     sortStudentList(studentList);     //打印     printStudentList(studentList);     freeStudentList(studentList);     return 0; }  /**  * 创建  * @return  */ static StudentGrade * createStudentGrade(){     return (StudentGrade*)calloc(1, sizeof (StudentGrade)); }  /**  * 释放内存  * @param grade  */ static void freeStudentGrade(StudentGrade* grade){     free(grade); } /**  * 创建列表  * @return  */ static StudentList * createStudentList(int n){     //分片内存     StudentList * list = calloc(1, sizeof (StudentList));     if(n > 10){         printf("list size must less than 10\n");         exit(1);     }     list->n = n;     for(int i = 0; i < n; i++){         //创建学生成绩对象         list->arr[i] = createStudentGrade();     }     return list; } /**  * 排序  * @param studentList  */ static void sortStudentList(StudentList* studentList){     StudentGrade * temp;     //冒泡排序     for(int i = 0; i < studentList->n; i++){         for(int j = 0; j < studentList->n - i -1; j++){             if(studentList->arr[j]->total < studentList->arr[j+1]->total){                 temp = studentList->arr[j];                 studentList->arr[j] = studentList->arr[j+1];                 studentList->arr[j+1] = temp;             }         }     }     //设置排名     int rank = 1;     studentList->arr[0]->rank = rank++;     for(int i = 1; i < studentList->n; i++){         if(studentList->arr[i]->total == studentList->arr[i-1]->total){             rank--;         }         studentList->arr[i]->rank = rank++;     } }  /**  * 释放内存  * @param studentList  */ static void freeStudentList(StudentList* studentList){     for(int i = 0; i < studentList->n; i++){         //释放学生对象 内存         freeStudentGrade(studentList->arr[i]);     }     //释放列表内存     free(studentList); } /**  * 获取输入数字  * @param min 最小值  * @param max 最大值  * @return  */ static int getNumFromInput(int min, int max){     int n;     int i;     while (1){         i =  scanf("%d", &n);         if(i == 1 && getchar() == '\n'){             if(n > max || n < min){                 printf("the number should be %d-%d!\n", min, max);                 continue;             }             break;         }else {             printf("please input a number!\n");         }         while(1)//清空缓存区         {             char c = getchar();             if(c == '\n')                 break;         }      }     return n; }  /**  * 输入学生成绩，格式: 学号 数学 英语 语文  * @param grade  */ static void inputStudentGrade(StudentGrade* grade){     scanf("%s %d %d %d", grade->no, &grade->mathGrade, &grade->enGrade,&grade->chGrade);     grade->total = grade->mathGrade + grade->enGrade + grade->chGrade;     grade->avg = grade->total/3;     printf("no:%s, math:%d, en:%d, ch:%d, total:%d, avg:%d\n", grade->no, grade->mathGrade,            grade->enGrade, grade->chGrade, grade->total, grade->avg); } /**  * 打印学生成绩列表  * @param studentList  */ static void printStudentList(StudentList* studentList){     printf("rank result:\n");     printf("%4s%10s%5s%5s%5s%10s%5s\n", "rank","no", "math","en", "ch","total", "avg");     for(int i = 0;i < studentList->n; i++){         printf("%4d%10s%5d%5d%5d%10d%5d\n",                studentList->arr[i]->rank,                studentList->arr[i]->no,                studentList->arr[i]->mathGrade,                studentList->arr[i]->enGrade,                studentList->arr[i]->chGrade,                studentList->arr[i]->total,                studentList->arr[i]->avg);     } }

我的回复收到了吗？怎么感觉被吞了

大兄弟啊，你还是不适合编程呢

引用 7 楼 自信男孩的回复:[quote=引用 6 楼 change_2 的回复:][quote=引用 5 楼 change_2的回复:][quote=引用 4 楼 自信男孩的回复:][quote=引用 3 楼 change_2 的回复:][quote=引用 2 楼 自信男孩的回复:]做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的[/quote] 是错的描述，意思是不满足你的要求吧，还是网上的代码本身就有问题？ 我想不会每个代码都是自身有问题的吧[/quote] 编译运行的时候出错了，运行不了[/quote] 就是这个论坛的代码，编译运行时错误[/quote] 编译和运行的错误是两个独立的错误，先确定是编译出错，还是运行出错。另外，代码也得贴出来呀～[/quote] 这个代码提示编译错误，还有我想把里面关于姓名的东西给删掉，怎么删？

引用 7 楼 自信男孩的回复:[quote=引用 6 楼 change_2 的回复:][quote=引用 5 楼 change_2的回复:][quote=引用 4 楼 自信男孩的回复:][quote=引用 3 楼 change_2 的回复:][quote=引用 2 楼 自信男孩的回复:]做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的[/quote] 是错的描述，意思是不满足你的要求吧，还是网上的代码本身就有问题？ 我想不会每个代码都是自身有问题的吧[/quote] 编译运行的时候出错了，运行不了[/quote] 就是这个论坛的代码，编译运行时错误[/quote] 编译和运行的错误是两个独立的错误，先确定是编译出错，还是运行出错。另外，代码也得贴出来呀～[/quote] #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 10  typedef struct Students {     int id;     char name[10];     int math;     int en;     int ch;  }STU;  STU stu[N];  void sortInfo(STU stu[], int n); void swapInfo(STU *p, STU *q);  int main() {     int n = 10, m = 0, w = 1;          scanf("%d", &n);         if (n>9||n<1) {             printf("Please input 1-9.");             return 0;             }      for (int i = 0; i<n; i++) {         scanf("%d%s%d%d%d", &stu[i].id, &stu[i].name, &stu[i].math, &stu[i].en, &stu[i].ch);      }     sortInfo(stu, n);     for (int i = 0; i < n; i++) {          if (i >0) {             if ((stu[i].en + stu[i].ch + stu[i].math) == (stu[i - 1].en + stu[i - 1].ch + stu[i - 1].math)) {                 m++;                 printf("%4d", w - m);             }             else {                 printf("%4d", w);                 m = 0;             }         }         else {             printf("%d", w);         }         printf("%10d%10s%5d%5d%5d\n", stu[i].id, stu[i].name, stu[i].math, stu[i].en, stu[i].ch);          w++;     }     return 0; }  void sortInfo(STU stu[], int n) {     int i, j;     for (i = 0; i < n - 1; i++) {         for (j = 0; j < n - 1 - i; j++) {             int a = stu[j].en + stu[j].ch + stu[j].math, b = stu[j + 1].en + stu[j + 1].ch + stu[j + 1].math;             if (a<b) {                 swapInfo(&stu[j], &stu[j + 1]);             }             else if ((a == b) && (stu[j].id >stu[j + 1].id)) {                 swapInfo(&stu[j], &stu[j + 1]);             }         }     }  } void swapInfo(STU *p, STU *q) {     STU trmp;     trmp = *p; *p = *q; *q = trmp; }

引用 6 楼 change_2 的回复:[quote=引用 5 楼 change_2的回复:][quote=引用 4 楼 自信男孩的回复:][quote=引用 3 楼 change_2 的回复:][quote=引用 2 楼 自信男孩的回复:]做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的[/quote] 是错的描述，意思是不满足你的要求吧，还是网上的代码本身就有问题？ 我想不会每个代码都是自身有问题的吧[/quote] 编译运行的时候出错了，运行不了[/quote] 就是这个论坛的代码，编译运行时错误[/quote] 编译和运行的错误是两个独立的错误，先确定是编译出错，还是运行出错。另外，代码也得贴出来呀～

引用 5 楼 change_2的回复:[quote=引用 4 楼 自信男孩的回复:][quote=引用 3 楼 change_2 的回复:][quote=引用 2 楼 自信男孩的回复:]做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的[/quote] 是错的描述，意思是不满足你的要求吧，还是网上的代码本身就有问题？ 我想不会每个代码都是自身有问题的吧[/quote] 编译运行的时候出错了，运行不了[/quote] 就是这个论坛的代码，编译运行时错误

引用 4 楼 自信男孩的回复:[quote=引用 3 楼 change_2 的回复:][quote=引用 2 楼 自信男孩的回复:]做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的[/quote] 是错的描述，意思是不满足你的要求吧，还是网上的代码本身就有问题？ 我想不会每个代码都是自身有问题的吧[/quote] 编译运行的时候出错了，运行不了

引用 3 楼 change_2 的回复:[quote=引用 2 楼 自信男孩的回复:]做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的[/quote] 是错的描述，意思是不满足你的要求吧，还是网上的代码本身就有问题？ 我想不会每个代码都是自身有问题的吧

引用 2 楼 自信男孩的回复:做不出来，是一条代码都写不出来吗？现在哭好像没啥用，学习的时候着急，应该学的就会很认真了。  先自己写写吧，或者参考一下网上的代码，自己改改。什么都不做，就要调试好的，不现实～ 是的，是一条代码也不会写，专业不需要这个，只学一学期，网上找的是错的

这个不是很难

把上面的代码复制，点左上角红圈的地方就可以复制，然后再粘贴到你的编译器里。


Question: 段错误:您的程序发生段错误，可能是数组越界，堆栈溢出（比如，递归调用层数太多）等情况引起

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

ListNode* ReverseList(ListNode* pHead) {     if (!pHead)    //判断头结点是否为NULL         return NULL;          ListNode* q = NULL;         ListNode* g = NULL;         q = pHead->next;         pHead->next = NULL;         while(q!=NULL){             g = q->next;             q->next = pHead;             pHead = q;             q = g;         }        return pHead;     } }; 供参考   翻转基本上没什么问题（进入参数先判断一下是否为空链表），建议查一下传入该函数的参数是否正常（传入的链表是否正常）；

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633


Question: 如何安装第三方库？

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


Question: C语言

供参考：#include <stdio.h>  int main() {    int i,tmp,rmd,sum;    for(i=100; i<=999; i++){        tmp=i;        sum=0;        while(tmp>0){              rmd=tmp%10;              sum+=rmd*rmd*rmd;              tmp/=10;        }        if(sum==i){          printf("%d\n",i);        }    }    return 0; }


Question: C语言 关于日期和星期 大佬救救我

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

修正8#楼的错误，供参考：#include <stdio.h>  int  get_Week(int y,int m,int d); int  isLeap(int y); int  GetDaysOfMonth(int y, int m); void CountDaysOfCoincide(int *cdofc,int y,int m,int s_d=1,int e_d=0);  int main() {     int i,y,m,year,month,day,year1,month1,day1;     int cdofc[8]; //([0]:总数，[1~7]:周一 ~ 周日)      while (1){            for(i=0;i<8;i++) cdofc[i]=0;            if(scanf("%d%d%d",&year,&month,&day)==EOF)break; //ctrl+Z 结束输入            scanf("%d%d%d",&year1,&month1,&day1);            if((day > GetDaysOfMonth(year,month)) ||(day1 > GetDaysOfMonth(year1,month1))||                          day < 1 || day1<1 || month>12 || month1> 12 || month<1 || month1<1)                printf("Invalid date,input again!\n");            else{                if(year==year1 && month==month1)   //同年同月                    CountDaysOfCoincide(cdofc,year,month,day,day1-1);                else{                    CountDaysOfCoincide(cdofc,year,month,day);                    for(y=year,m=month+1,m>12?(m=1,y++):m;y<=year1 ;m++,m>12?(m=1,y++):m){                        if(y==year1 && m==month1)break;                        CountDaysOfCoincide(cdofc,y,m);                    }                    if(day1!=1)                         CountDaysOfCoincide(cdofc,year1,month1,1,day1-1);                }                for(i=1;i<8;i++)cdofc[0]+=cdofc[i];                printf("%d %d %d %d %d %d %d %d\n",cdofc[0],cdofc[1],cdofc[2],cdofc[3],                                                   cdofc[4],cdofc[5],cdofc[6],cdofc[7]);            }     }     system("pause");     return 0; }  int get_Week(int y,int m,int d) {     int week = 0;     if(m==1 || m == 2){        m += 12;y--;     }     week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;     return week; }  int isLeap(int y) {     if((y%4==0 && y%100!=0)||(y%400==0))         return 1;     else         return 0; }  int GetDaysOfMonth(int y, int m) {     int daysOfMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};     if(isLeap(y) && m == 2) return daysOfMonth[m-1]+1;     return daysOfMonth[m-1]; }  void CountDaysOfCoincide(int *cdofc,int y,int m,int s_d,int e_d)//月的吻合日天数 {     int week = get_Week(y,m,s_d)+1;     int days;     if(e_d == 0)days = GetDaysOfMonth(y,m);     else        days = e_d;     int i    = s_d;     while(i <= days){           if(week == i%10) cdofc[week]++;           week = (week + 1) % 7;           if(week == 0) week =7;           i++;     } }

觉得终止年月日的控制（不含），一段时间范围内的控制，才是真麻烦，大家批评指正，供参考：#include <stdio.h>  int  get_Week(int y,int m,int d); int  isLeap(int y); int  GetDaysOfMonth(int y, int m); void CountDaysOfCoincide(int *cdofc,int y,int m,int d=1);  int main() {     int i,y,m,year,month,day,year1,month1,day1;     int cdofc[8]; //([0]:总数，[1~7]:周一 ~ 周日)      while (1){            for(i=0;i<8;i++) cdofc[i]=0;            if(scanf("%d%d%d",&year,&month,&day)==EOF)break; //ctrl+Z 结束输入            scanf("%d%d%d",&year1,&month1,&day1);            if((day > GetDaysOfMonth(year,month)) ||(day1 > GetDaysOfMonth(year1,month1))||                          day < 1 || day1<1 || month>12 || month1> 12 || month<1 || month1<1)                printf("Invalid date,input again!\n");            else{                if(year==year1 && month==month1)   //同年同月                    CountDaysOfCoincide(cdofc,year,month,day);                else{                    CountDaysOfCoincide(cdofc,year,month,day);                    for(y=year,m=month+1; y<=year1 ;m++,m>12?(m=1,y++):m){                        if(y==year1 && m==month1)break;                        CountDaysOfCoincide(cdofc,y,m);                    }                    if(month1!=1 && day1!=1)                        CountDaysOfCoincide(cdofc,year1,month1);                }                for(i=1;i<8;i++)cdofc[0]+=cdofc[i];                printf("%d %d %d %d %d %d %d %d\n",cdofc[0],cdofc[1],cdofc[2],cdofc[3],                                                   cdofc[4],cdofc[5],cdofc[6],cdofc[7]);            }     }     system("pause");     return 0; }  int get_Week(int y,int m,int d) {     int week = 0;     if(m==1 || m == 2){        m += 12;y--;     }     week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;     return week; }  int isLeap(int y) {     if((y%4==0 && y%100!=0)||(y%400==0))         return 1;     else         return 0; }  int GetDaysOfMonth(int y, int m) {     int daysOfMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};     if(isLeap(y) && m == 2) return daysOfMonth[m-1]+1;     return daysOfMonth[m-1]; }  void CountDaysOfCoincide(int *cdofc,int y,int m,int d)//月的吻合日天数 {     int days = GetDaysOfMonth(y,m);     int week = get_Week(y,m,d)+1;     int i    = d;     while(i <= days){           if(week == i%10) cdofc[week]++;           week = (week + 1) % 7;           if(week == 0) week =7;           i++;     } }  //2021 2 1 //2021 3 31 //14 2 2 2 2 2 2 2 //^Z //请按任意键继续. . .

90009同学闷头鼓捣小代码，不注意听讲，又退步了~

这题 唯一的难点是 知道一个日期怎么确定是周几 这个其实有固定的数学公式可以计算 比如 蔡勒公式 你查查这种公式然后套进去  就完事了

引用 4 楼 智者知已应修善业 的回复: 2022-3-2 是周三  你又错了哦

能否给个明确的代码

可参自适应函数


Question: 求助，请问这个函数哪里有问题


Question: LoadLibrary根据什么判断DLL已加载？

我成了“有人”；还好没成“等”。

引用 18 楼 六道佩恩 的回复:你们都说判断DLL是根据全路径的 我可没有这么说。上面有人贴的链接里其实说的很清楚了，在正常搜索DLL之前，就有特例：    1、应用程序自己使用了DLL redirection（.loacl文件）或者使用了manifest文件控制dll载入目录 2、应用程序已经载入了一个同名dll模块，不论它的路径在哪，都不会再继续搜索dll（载入是指已在程序的虚拟空间中） 3、dll是已知dll，或者任何已知dll的依赖dll（所谓已知dll在注册表中列出：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.）   当不满足上面的条件时，应用程序才会按照标准搜索顺序搜索dll：    搜索顺序分两种，取决于安全搜索模式是否开启（默认开启，可通过注册表关闭或通过调用 SetDllDirectory关闭）。 如果安全搜索模式开启，则顺序如下： 1、应用程序所在目录 2、系统目录.  3、16位系统目录. 4、Windows目录. 5、当前目录. 6、环境变量PATH指定的目录  如果安全搜索模式关闭，则顺序如下： 1、应用程序所在目录 2、当前目录. 3、系统目录.  4、16位系统目录. 5、Windows目录. 6、环境变量PATH指定的目录  另外还有高级搜索模式，通过使用LOAD_WITH_ALTERED_SEARCH_PATH调用 LoadLibraryEx开启，具体自己去看上面其他人发的那个链接吧。   注意！上面的规则都是以一个应用程序实例的视角来说的，不用应用程序实例是互不影响的，所以你说的： 引用 18 楼 六道佩恩 的回复:其实最开始的问题主要是想知道，当物理内存中已经有一个同名DLL时，此时加载该名称的DLL是重新找还是直接映射到虚拟内存。 这个问题的答案，对你想知道的结果来说，没有任何意义。不管系统是否会重复载入同一个dll到物理内存，都能满足上面所说的一个应用程序实例看到的规则。 说白了，就是因为你不知道已知DLL（known DLL）的概念，导致你想的太多了。。  最后给你捋一下,对于同一个应用程序实例来说！！！ 引用 18 楼 六道佩恩 的回复:你们都说判断DLL是根据全路径的 错！！ 只判断名字！！ 引用 18 楼 六道佩恩 的回复:是官方的DLL有特殊性？ 对！！known DLL

引用 18 楼 六道佩恩 的回复:只不过，刚刚的gdi32.dll的测试并不完全符合这一行为。 Certain operating system-supplied DLLs get special treatment. These are called known DLLs. They are just like any other DLL except that the operating system always looks for them in the same directory in order to load them. Inside the registry is the following key:  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

Process Monitor 实时监视文件系统、注册表、进程、线程和 DLL 活动。 http://www.microsoft.com/china/technet/sysinternals/utilities/processmonitor.mspx

Process Explorer 找出进程打开了哪些文件、注册表项和其他对象，已加载哪些 DLL 等信息。这个功能异常强大的实用工具甚至可以显示每个进程的所有者。http://www.microsoft.com/china/technet/sysinternals/utilities/ProcessExplorer.mspx

引用 21 楼 Intel0011 的回复:  我真是羞愧，没有好好看文档，原来都写了的  真的非常感谢！

写了啥？我都看完了还是一脸懵。_mervyn解释了单个exe实例只会加载同一个dll一次，多个不同exe到底是怎么判断某个dll是否加载的呢(既然全路径都不行)？

引用 22 楼 _mervyn 的回复:  非常感谢！！！ 麻烦您了！！！

山，就在那里 如果你的目标是征服高山，那就做好准备，上 但如果你的目标是征服大海，那就没必要和每座路过的山较真儿

嗯，我其实是打酱油的。 我的懒人哲学一直认为，不打算写操作系统的猿，就应该信任操作系统。 也就是相信系统能做到它承诺做到的那些事，然后去快乐地做我们自己的事。  操作系统里面应该有很多类似于C语言里面的所谓“未定义行为”的自行发挥的部分，闭源系统可能不希望猿们深入它的实现细节，也许它会在下一个版本替换实现细节，只留下一致性接口。  快乐来自适可而止，请相信我。 当然，天花板也来自“适可”而止，所以请不要相信我。

引用 17 楼 _mervyn 的回复:所以，所谓的LoadLibrary判断dll是否已加载，针对的是虚拟地址。 这点不能搞混。  感谢您来问答  前面关于LoadLibrary那个，是我将调用LoadLibrary后直到它返回期间的行为统称为LoadLibrary的行为，其实应该也可以这样看吧，总得有代码去判断。 我说的这个判断是指对于已经加载到物理内存（加载后到未从物理内存释放期间，包含了换出到硬盘）后，如果已经加载到物理内存，判断到这一行为后，直接将其映射到进程的虚拟空间，而不是再去加载  你们都说判断DLL是根据全路径的，但我测试过程中发现一些奇怪的事  首先我要确定加载目录先于system32，除了通过微软的文档，也将两个同名不同内容的DLL放到system32和程序同目录，根据DllMain的输出可以确定，优先加载的是程序所在目录的DLL  确定了这点后，将程序所在目录的DLL命名为gdi32.dll，写如下代码  	HMODULE h0 = GetModuleHandleA( "gdi32.dll" ); 	printf("h0=%p\n", h0 ); 	HMODULE h1 = LoadLibrary( "gdi32.dll" ); 	printf("h=%p\n", h1 );  前两行通过输出可以肯定没有加载gdi32.dll，第三行加载gdi32.dll的时候，没有输出预先设置在DllMain中的字符串，说明此时加载的是system32下的gdi32.dll，而不是程序所在目录自定义的gdi32.dll。（为确保自己的gdi32.dll有正确的输出行为，加载时指定.\\gdi32.dll，能得到预期的结果）  这里就有问题了，它并没有按我期望的加载当前目录的DLL 我推测是内存中已经加载过gdi32.dll了，因为出现同名DLL，所以直接映射过来了，这个行为看起来还是根据文件名来的  但又做了测试，结果又不同 程序A加载A.dll不退出，程序B和它是不同文件夹，它也加载一个不同内容的A.dll，根据输出来看，最终加载的是程序B同目录的A.dll 程序A的A.dll仍在内存中，说明这里又没完全根据名称来，而是确实做了搜索工作的  这么说的话，是官方的DLL有特殊性？    其实最开始的问题主要是想知道，当物理内存中已经有一个同名DLL时，此时加载该名称的DLL是重新找还是直接映射到虚拟内存。 现在根据你们的解惑，算上完整路径的话，当找到的DLL和物理内存中的DLL的完整路径相同（即同一文件），那么直接从物理内存中映射过来； 如果找到的DLL和内存中同文件名的DLL（一个或多个）的路径不同，那么还是会将其加载到物理内存，并映射到当前程序的虚拟内存中 是这样的吧？我是这样理解的。  只不过，刚刚的gdi32.dll的测试并不完全符合这一行为。

模块名不是可以

引用 10 楼 六道佩恩 的回复:这是微软的一段原话 If a DLL with the same module name is already loaded in memory, the system checks only for redirection and a manifest before resolving to the loaded DLL, no matter which directory it is in. The system does not search for the DLL.  按这说的，出现同名的模块，系统不会再搜索第二个的（如果我没理解错的话）  这说的是针对同一个应用程序（exe）来说的。 针对同一个exe运行实例来说，如果它已经加载了一个A.dll，再次加载同名A.dll 是不起作用的，哪怕它们路径不同！  请不要对此有怀疑。 在这种情况下，它就是根据dll名称区别的。  在你确定上述这一点之后，再来看你说的另一种情况： 引用 4 楼 六道佩恩 的回复:比如A程序加载的A.dll在它的当前文件夹 然后B程序也要加载一个A.dll（与之前的A.dll不一样，只是恰好名字一样），这个dll也在B程序的当前文件夹，你看，这就跟搜索顺序无关了对吧 接着，B加载A.dll的时候，系统已经将一个A.dll加载到物理内存了，那么面对B程序要加载当前文件夹的A.dll，是加载还是不加载？ 加载吧，内存里已经有一个同名的DLL了，映射过来就可以了 不加载吧，可两个DLL明明不一样，B程序希望加载的可用的DLL，但系统没给它加载 是这么个问题 首先，你既然问出了“LoadLibrary根据什么判断DLL已加载” 这个问题，就说明你从某处得知LoadLibrary会判断dll是否已加载。 而这点一般情况下说的都是针对一个exe的单个运行实例来说的。我不知道你对这点是否有理解错误才提出的这个多个exe运行实例的例子（包括同名exe的多个运行实例）。 我先假设你是理解错误了，如果你是明确从某处得知的“多个exe实例或同名exe的多个运行实例加载dll也会判断是否已加载过”这个信息的。请不要听我接下来说的，并请告诉我你从哪里获取的信息。 因为关于这一点我也不是很明确，所以接下来说的是以我的经验常识推断的：  我认为多个进程间加载dll肯定是毫无影响的。这里我说的加载是指 将dll映射至进程自身的虚拟地址。 因为事实就是如此（A.exe和B.exe一定能够得到正确的A.dll），所以从事实反推，通过一个dll文件的全路径来判断是否需要将其从硬盘装进物理内存肯定是可以办到的，而只判断名称显然是不行的。 而且我认为“判断该dll是否已经装进在物理内存里了” 这件事情跟LoadLibrary没有关系，这应该是系统 ”内存管理“ 功能相关的知识，在需要的时候装入内存，在不需要的时候换出到硬盘。  另外说一句，一个dll的文件内容是否在实际的物理内存里，不仅仅依靠是否调用过LoadLibrary就能确定的，如果你LoadLibrary之后经常不用甚至完全不用该dll的内容，它很有可能被系统换出到硬盘甚至只把一部分换出到硬盘，把位置留给更需要的内容。

和dll的名称没关系

牛逼，大佬们厉害

Dynamic-Link Library Search Order https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order

引用 10 楼 六道佩恩 的回复:[quote=引用 6 楼 Intel0011 的回复:] 你忽略了一点，虽然两个的名称都是A.dll，但两者的全路径不同呀，系统还是能区分的  你的意思是，路径也作为了辨识DLL的一环吗？  这是微软的一段原话，你那个链接里的 If a DLL with the same module name is already loaded in memory, the system checks only for redirection and a manifest before resolving to the loaded DLL, no matter which directory it is in. The system does not search for the DLL.  按这说的，出现同名的模块，系统不会再搜索第二个的（如果我没理解错的话）[/quote] 路径也作为了辨识DLL的一环吗？--->那是当然的，如果有manifest文件的话，又会使用manifest文件中指定的版本，所以说比较复杂

A程序与程序B不在同一个文件夹，那和A与B的当前路径就不一样，那么各自加载的当前路径下的dll全路径就不一样，所以dll就不一样。 A程序与程序B在同一个文件夹，那和A与B的当前路径就一样，那么各自加载的当前路径下的dll全路径就一样，所以dll就一样。 另外说一句： 1: 每个程序的当前路径好像是可以修改的. 2: 系统中给每个程序维护了一个dll加载链表，如果手动修改此链表，导致其它需要的行为。

在这个问题上我完全是主观臆断的，想当然。

引用 4 楼 六道佩恩 的回复:[quote=引用 3 楼 Intel0011 的回复:][quote=引用 楼主 六道佩恩 的回复:]是根据名称吗？ 如果程序1已加载过A.dll，此时程序2也需要加载一个A.dll，但两个DLL完全不同，那么LoadLibrary会认为这是两个相同DLL而直接将之前的DLL映射过来，还是会判定出两个DLL的不同而重新加载？ 这个涉及到DLL的搜索路径问题，比较复杂，请参阅 https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order [/quote]  搜索顺序我知道呀，我说的是另外的一个问题 比如A程序加载的A.dll在它的当前文件夹 然后B程序也要加载一个A.dll（与之前的A.dll不一样，只是恰好名字一样），这个dll也在B程序的当前文件夹，你看，这就跟搜索顺序无关了对吧 接着，B加载A.dll的时候，系统已经将一个A.dll加载到物理内存了，那么面对B程序要加载当前文件夹的A.dll，是加载还是不加载？ 加载吧，内存里已经有一个同名的DLL了，映射过来就可以了 不加载吧，可两个DLL明明不一样，B程序希望加载的可用的DLL，但系统没给它加载 是这么个问题[/quote] 你忽略了一点，虽然两个的名称都是A.dll，但两者的全路径不同呀，系统还是能区分的


Question: 数据结构小白请教各位大佬一个问题

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

#include<stdio.h> #include<stdlib.h>  #define TRUE 1 #define FALSE 0 #define OK  1 #define ERROR 0 #define INFEASIBLE  -1 #define OVERFLOW   -2 //#define NULL ((void *)0)  typedef int Status; typedef int ElemType;  typedef struct LNode {     ElemType data;     struct LNode  *next; }LNode,*LinkList;  typedef  LNode *LinkList; void CreateList_L(LinkList *L, int n); void MergeList_L(LinkList La, LinkList Lb, LinkList *Lc); void OutputList(LinkList L);  void  CreateList_L(LinkList *L, int n) {     int i;     LinkList p;     *L = (LinkList)malloc(sizeof(LNode));     (*L)->next = NULL;     for (i = 0; i < n; ++i) {         p = (LinkList)malloc(sizeof(LNode));         scanf("%d",&p->data);         p->next = (*L)->next;         (*L)->next = p;     } }//CreateList_L void MergeList_L(LinkList La, LinkList Lb, LinkList *Lc) {     LinkList pa, pb, pc;     pa = La->next; pb = Lb->next;     *Lc = pc = La;     while(pa&&pb)         if (pa->data<=pb->data) {             pc->next = pa; pc = pa; pa = pa->next;         }         else { pc->next = pb, pc = pb, pb = pb->next; }     pc->next = pa ? pa : pb;     free(Lb); }//MergeList_L void OutputList(LinkList L) {     LinkList q;     q=L->next;     while(q){         printf("%d",q->data);         q=q->next;     } }//OutputList_L int main() {     LinkList L1,L2,L3;     printf("Please enter the element of L1:\n");     CreateList_L(&L1, 4);     printf("Please enter the element of L2:\n");     CreateList_L(&L2, 4);     printf("The LinkList L1 is:\n");     OutputList(L1);     printf("The LinkList L2 is:\n");     OutputList(L2);     MergeList_L(L1, L2, &L3);     printf("The LinkList L3 is:\n");     OutputList(L3);     return 0; } 供参考～  试一下这个版本，然后对比一下这两个代码的区别，找出自己的问题；  另外，重点学习一下参数传递，传入参数、传出参数等等；

我的单链表可以输入但无法输出，语法没有错误，请各位大佬帮忙看一看


Question: 问问大佬，这个咋弄啊，C语言设计，球球救救孩子吧


Question: 关于网络编程定时器使用

可以添加心跳机制，即client每隔5秒发一个心跳包，包的大小可以随意定义，只要server能识别这是一个心跳包即可，服务器（也需要一个定时器）定时去检查上次收到心跳包的时间和现在做差，大于5秒则直接关闭连接～

跟你用的网络模型有关，如果使用了select或者epoll，直接用它们自带的定时器就可以，如果时间长短不合适，可以加个倍数关系，比如select 1秒阻塞时间，那就返回5次再清理旧的链接，判断是否是旧链接也很简单，就看select的结果就可以了 如果采用定时器，那就得自己实现一个了，比较麻烦


Question: 求助，c语言简单问题

Segmentation fault (core dumped)指段错误，一般指非法地址访问，就是访问到不可以读写的内存位置，这是系统从安全角度，保证系统正常运行所必须的～  比如一个系统才能访问的地址，一个自定义程序去访问（比如读写）这个地址上的内容，那么就可能导致系统异常，因此不允许其访问～

引用 5 楼 forever74的回复:是啊，那里不能单引号。 哦，好的，谢谢

引用 5 楼 forever74的回复:是啊，那里不能单引号。 哦，好的，谢谢

是啊，那里不能单引号。

引用 2 楼 forever74的回复:Error CFFFF: 楼主眼花看错了。 是说单引号是错误的使用方法吗

是说单引号是错误的使用方法吗

Error CFFFF: 楼主眼花看错了。

不过引号里面的内容不是单个字符，就不要用单引号吧。虽然PHP里面单引号可以替代双引号，但是C/C++这类严谨的语言用不得


Question: 请问一下这个程序怎么运行不了，出现的错误是什么意思，应该怎么改

scanf中的score缺少&和[],或者直接这样：  scanf("%d", score + i);

这个函数的声明和实现，两边不一样呢，在声明的地方中间少了's'，红圈标出。


Question: if条件中使用取反出现问题

引用 1 楼 qzjhjxj 的回复:供参考：#include<stdio.h>  int main() {     unsigned char data1,data2; //unsigned char 的取值范围为0~255     unsigned char temp;     data1=0x01;     data2=0xfe; //254     temp = ~data2;     //这里隐含强制转换，无符号数                        //注意，计算机存储的都是数的补码，无论是正数还是负数     //if(data1 == ~data2)// ~data2 按位取反，在内存中形式为 -255,-255 != 1;并不是我们想像的0x01.     if(data1 == temp)    //这里temp=0x01        printf("temp1和temp2想等\n");     else        printf("temp1和temp2不相等\n");      printf("data2:0x%x,temp:0x%x\n",data2,temp);     system("pause");     return 0; }  感谢大佬热心的回答  哈哈

引用 4 楼 真相重于对错 的回复:[quote=引用 3 楼 dajkhsdawe 的回复:][quote=引用 2 楼 真相重于对错 的回复:]~ 操作符的结果是int，自动扩至32位。并不是你想的还是unsigned char. unsigned char最高位按符号位处理，扩展到结果高位，除符号位外，其余按位反转。 0xfe 按位取反后的实际是 0xffffff01。这个结果就是-255. 你的判断这么写就可以了  if(data1==(unsigned char)~data2)  取反会发生强制类型转换吗[/quote] 不是强制类型转换，专业名词叫整形提升。   引用 3 楼 dajkhsdawe 的回复:[quote=引用 2 楼 真相重于对错 的回复:]~ 操作符的结果是int，自动扩至32位。并不是你想的还是unsigned char. unsigned char最高位按符号位处理，扩展到结果高位，除符号位外，其余按位反转。 0xfe 按位取反后的实际是 0xffffff01。这个结果就是-255. 你的判断这么写就可以了  if(data1==(unsigned char)~data2)  取反会发生强制类型转换吗[/quote] 如果你有疑虑请去查c/c++标准。这个是王八的屁股-规定。[/quote]   哈哈  原来如此    感谢感谢

引用 3 楼 dajkhsdawe 的回复:[quote=引用 2 楼 真相重于对错 的回复:]~ 操作符的结果是int，自动扩至32位。并不是你想的还是unsigned char. unsigned char最高位按符号位处理，扩展到结果高位，除符号位外，其余按位反转。 0xfe 按位取反后的实际是 0xffffff01。这个结果就是-255. 你的判断这么写就可以了  if(data1==(unsigned char)~data2)  取反会发生强制类型转换吗[/quote] 不是强制类型转换，专业名词叫整形提升。   引用 3 楼 dajkhsdawe 的回复:[quote=引用 2 楼 真相重于对错 的回复:]~ 操作符的结果是int，自动扩至32位。并不是你想的还是unsigned char. unsigned char最高位按符号位处理，扩展到结果高位，除符号位外，其余按位反转。 0xfe 按位取反后的实际是 0xffffff01。这个结果就是-255. 你的判断这么写就可以了  if(data1==(unsigned char)~data2)  取反会发生强制类型转换吗[/quote] 如果你有疑虑请去查c/c++标准。这个是王八的屁股-规定。

引用 2 楼 真相重于对错 的回复:~ 操作符的结果是int，自动扩至32位。并不是你想的还是unsigned char. unsigned char最高位按符号位处理，扩展到结果高位，除符号位外，其余按位反转。 0xfe 按位取反后的实际是 0xffffff01。这个结果就是-255. 你的判断这么写就可以了  if(data1==(unsigned char)~data2)  取反会发生强制类型转换吗


Question: 小白提问

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

你输入了两个字符，'N'和'\n' 因此输出两个字符，'n'（'N'+32）和'*'（'\n'+32）

'\n'也是会在下次的scanf中被c接收的。  查一下*的字符的ascii值：42正好匹配；

\n的码值是10，加上32以后就是42


Question: 一道C语言编程题目，代码看不明白，请大家帮忙看看

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

供参考：https://www.cnblogs.com/polebug/p/3502565.html

引用 1 楼 自信男孩的回复:恩，可以用的。  //#include<bits/stdc++.h> #include <stdio.h> #include <stdlib.h>  //using namespace std;  char s[50];  int main(){     int d1,d2,d3;     int cnt=0;     char op;     //while(gets(s)){     while(scanf("%d%c%d=%d", &d1, &op, &d2, &d3) == 4){         //d3=1000;         //sscanf(s,"%d%c%d=%d",&d1,&op,&d2,&d3);         if(d1+d2==d3&&op=='+')         {             cnt++;         }         if(d1-d2==d3&&op=='-')         {             cnt++;         }     }     printf("%d\n",cnt);     return 0; } 供参考～   建议查一下sscanf函数实现；可以看成scanf从s中读取值匹配%d和%c 谢谢你的回答，但是wa哦


Question: 为什么这里不要加&和【】

引用 1 楼 user-4 的回复：别的格式符对应变量加&是为了取地址，而数组名本身就是地址，加方括号就不是地址了，加&就画蛇添足了。多谢

引用 4 楼 自信男孩 的回复：scanf对应的a的位置要求的是地址，而数组a的名字就是数组的首地址，因此不需要加&  楼主定义的a是int类型数组，而用%s输入，类型不匹配吧，虽然不影响程序运行～，根据楼主的程序逻辑，应该将a定义成char类型的数组；   另外，c=c的操作没意义，建议删除；多谢🙏

引用 5 楼 家有萌宝V 的回复：其实楼上已经回答的很清楚了。 int a [100] = {1,2,3,,,,,,,,,,100} 这里， a的值就是指向这一百个数的数组(栈)的指针。那么&a就是这个数组名的地址。你要表达的是通过键盘输入正数，并将整数存入到这个数组中。 那么 scanf参数接受的肯定不是数组名的地址&a， 而是数组的地址，也就是a，希望回答能帮到你。好的，多谢🙏

引用 1 楼 user-4 的回复：别的格式符对应变量加&是为了取地址，而数组名本身就是地址，加方括号就不是地址了，加&就画蛇添足了。那[]呢

scanf("%s",a)是输入一个字符串，不是一个字符，由于字符数组名已经代表数组存放的字符串的首地址，所以不用加取地址运算符&，后面也不用方括号[]指出数组元素都下标。望采纳


Question: 求助帖

修正楼上：printf("d=%.4f\n",d); printf("c=%.4f\n",c); printf("s=%.4f\n",s);

供参考：#include "stdio.h" #define pi 3.14159 int main( ) {     float r,d,c,s;     scanf("%f",&r);//scanf("%.4lf",&r);     if(r<0 || r>10000) return -1;     d=2*r;     c=2*pi*r;     s=pi*r*r;     printf("d=%.4lf\n",d);     printf("c=%.4lf\n",c);     printf("s=%.4lf\n",s);          return 0; }

#include <stdio.h> #include <math.h>  #define PI 3.14159  #define MAX_SIZE    10000  int main(void) {     float r,d,c,s;     //scanf("%.4lf",&r);     scanf("%f",&r);      if (r < 0 || (r > MAX_SIZE && fabs(r - MAX_SIZE) > 1e-6))         return -1;      d = 2 * r;     c = 2 * PI * r;     s = PI * r * r;      printf("d=%.4lf\n",d);     printf("c=%.4lf\n",c);     printf("s=%.4lf\n",s);      return 0; } 供参考～


Question: c语言问题

不一定执行，因为越界访问是未定义行为～

不一定  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

拍照的时间，写个test也可以试验出来了


Question: 写了一个用fwrite写入文件流的DLL，但是引用DLL时参数传不进去

//dllmain.c  /* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> #include <stdio.h>  DLLIMPORT void sendData(const char *jsondata,int len) { 	printf("1\n"); 	FILE *f; 	printf("2\n");     f = fopen( "d:\\json.txt" , "wb" );     printf("3\n");     fwrite(jsondata, len , 1, f );     printf("4\n");     //fflush(f);     fclose(f); }    BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { 	switch(fdwReason) 	{ 		case DLL_PROCESS_ATTACH: 		{ 			break; 		} 		case DLL_PROCESS_DETACH: 		{ 			break; 		} 		case DLL_THREAD_ATTACH: 		{ 			break; 		} 		case DLL_THREAD_DETACH: 		{ 			break; 		} 	}  	/* Return TRUE on success, FALSE on	failure	*/ 	return TRUE; }  //dll.h  #ifndef _DLL_H_ #define _DLL_H_  #if BUILDING_DLL #define DLLIMPORT __declspec(dllexport) #else #define DLLIMPORT __declspec(dllimport) #endif  DLLIMPORT void sendData(const char *jsondata,int len);  #endif  //调用  #include <stdio.h> #include <stdlib.h> #include <windows.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	typedef	void (*FUNT)(const char*,int); 	HMODULE	hMod = LoadLibrary("createdll.dll"); 	if(hMod	!= NULL) 	{ 		printf("%s\n","success!!!"); 		FUNT Data =	(FUNT)GetProcAddress(hMod,"sendData"); 		Data("123",3); 	} 	else 		printf("%s\n","failed!!!");  	    	return 0; }

感谢赵四老师帮我解决那个DLL中fwrite的问题，我有几个疑问1、为什么要加const，虽然我知道这是声明只读。2、const char *和const char [ ]，在我感觉下是相同的，但是用了后者就不行了。3、为什么fwrite中的len要在外面声明，我直接给他固定值的话文本后面会乱码。若赵四老师有空的话希望能帮我解答，或者推荐我这个新手看看什么学习资料比较好，再次感谢

太感谢赵四老师了，牛！


Question: 这段在Dev C++上没问题但是在Visual C++上过不了编译

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

关于文件打开那段，这么写，供参考：fp1=fopen("record.txt","a");//如果不存在record.txt就创建一个  if (fp1==NULL)         {               printf("文件打开失败!\n");               exit(0);              //fp2=fopen("record.txt","w");             //fclose(fp2);         }

这一段作为一个函数，在vc6上正常编译运行的。最好把错误信息或者代码贴上来

从这个例子上看，懵懂时期的初学者严格遵循ANSI/C90利大于弊。

对void save(struct student *head) 、struct student *load(void)、main()函数里做了修改，供参考：//这是全代码 #include <string.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h>//包含system函数头文件 #define LEN sizeof(struct student) struct student {         char num[20]; 		//ID号码         char name[100]; 		//联系人姓名         char phone[20]; 		//联系人电话号码         char home[100]; 		//联系人通讯地址         char birthday[20]; 		//联系人生日         struct student *next; };  void face(void) //功能选择面板 {         printf("********************************************************************");         printf("\t\t\t\t☆★☆★☆★  ~_~  ~_~  ~_~  ☆★☆★☆★\n");         printf("\n\t\t\t☆★欢迎使用<查找联系人>☆★");         printf("\n\n\t☆★选择你需要操作的功能:☆★(若添加联系方式，建议完善联系人信息)★☆\n");         printf("\n");         printf("\t\t\t1.【增加联系人信息〗\n");         printf("\t\t\t2.〖显示<查找联系人>中所有记录】\n");         printf("\t\t\t3.【删除需要删除的信息〗\n");         printf("\t\t\t4.〖以名字查询所需的信息】\n");         printf("\t\t\t5.【保存<查找联系人>中的所有记录到指定文件中〗\n");         printf("\t\t\t6.〖退出不保存!!】\n");         printf("\n");         printf("\t☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★");         printf("\n\n********************************************************************\n\n"); } void print(struct student *head) {         struct student *p;         p=head;         system("CLS"); 		//调用DOS命令CLS能够清屏         printf("*************************************************************\n");         printf("==================== → 联系人信息记录表 ← ===================\n");         printf("*************************************************************\n");         if(head!=NULL)                 do                 {                         printf("联系人ID号码:%s\n",p->num);                         printf("联系人姓名:%s\n",p->name);                         printf("联系人电话号码:%s\n",p->phone);                         printf("联系人地址:%s\n",p->home);                         printf("联系人生日:%s\n",p->birthday);                         printf("********************************************************\n");                         p=p->next;                 } 				while(p!=NULL);         else         {             printf("抱歉!!无法找到该联系人!!\n\n");             printf("=============================================================\n");         } } //增添电子通讯录中的内容，即创建连表过程 struct student *append(struct student *head) {         struct student *p0=NULL,*p1,*p2; 		//p0为要插入的新节点         p1=head;         p2=head;         system("CLS");         printf("\n\n***********************************************************\n");         printf("\t\t你能在此目录下创建并添加联系人信息");         printf("\n***********************************************************\n");         p0=(struct student *)malloc(LEN);         printf("请输入联系人ID号码:");         gets(p0->num);         printf("请输入联系人姓名:");         gets(p0->name);         printf("请输入联系人电话号码:");         gets(p0->phone);         printf("请输入联系人地址:");         gets(p0->home);         printf("请输入联系人生日:");         gets(p0->birthday);                  if(head==NULL) //对插入的节点排序，按姓名的拼音顺序         {            head=p0;            p0->next=NULL;         }         else         {            while((strcmp(p0->name,p1->name)>0)&&(p1->next!=NULL))            {                p2=p1;                p1=p1->next;            }            if((strcmp(p0->name,p1->name))<=0)            {               if(head==p1)                  head=p0;               else                  p2->next=p0;               p0->next=p1;            }            else            {               p1->next=p0;               p0->next=NULL;            }            printf("成功添加联系人信息!!");            printf("\n************************************************************\n");            printf("\n\n");         }         return(head);        }  //查找联系人的维护（删除），通过输入联系人ID号码删除联系人数据 struct student *del(struct student *head) {         struct student *p1,*p2;         char num[12];         system("CLS");         printf("\n\n************************************************************\n");         printf("================= → 联系人信息记录删除功能 ← ===============\n");         printf("************************************************************\n");         printf("输入要删除的联系人ID号码:");         gets(num);          p1=head;         if (head==NULL)                 {             		printf("抱歉!!无法找到该联系人!!\n");                         printf("\n*******************************************************\n");                     return(head);                 }         while(p1!=NULL)         {                 if(strcmp(p1->num,num)==0)                 {                         if(p1==head)                         head=p1->next;                         else p2->next=p1->next;                         free(p1);                         printf("删除成功!!\n");                         return(head);                 }                 p2=p1;                 p1=p1->next;         }         printf("对不起!!没有要删除的联系人纪录!!\n");         return(head); }  //电子通讯录的查找，关键字为用户姓名； void search(struct student *head) {         struct student *p1,*p2;         char name[20];         p1=head;         p2=p1;         system("CLS");         printf("\n**************************************************************\n");                 printf("================ → 联系人信息记录查询功能 ← ==================\n");         printf("**************************************************************\n");         printf("输入要查找联系人的姓名:");         gets(name);         while(p1!=NULL)         {                 if(strcmp(p1->name,name)==0)                 {                        printf("联系人ID号码:");                                 puts(p1->num);                         printf("联系人姓名:");                                puts(p1->name);                         printf("联系人电话号码:");                                 puts(p1->phone);                        printf("联系人地址:");                                 puts(p1->home);                        printf("联系人生日:");                                puts(p1->birthday);                       printf("\n=============================================================\n");                                         break;                 }                 p2=p1;                 p1=p1->next;         }         if(p1==NULL)                 printf("对不起!!没有该联系人的纪录!!\n");  } //电子通讯录的记录存盘操作，使用文件指针； void save(struct student *head) {         FILE *fp,*fp1;         struct student *p;         p=head;                 fp1=fopen("record.txt","w");         //fp1=fopen("record1.txt","w");         //fprintf(fp1,"=============== → 用户信息记录表 ← =================\n");          while(p!=NULL)         {                 //首先把数据保存在record.txt中，这是提供给load函数用的数据                 //fprintf(fp," %s %s %s %s %s %s",p->num,p->name,p->phone,p->email,p->home,p->birthday);                 //然后把数据保存在record1.txt中，这是能提供直接查询看的，有比较友好的画面                 //fprintf(fp1,"====================================================\n");                 fprintf(fp1,"%s\n",p->num);//联系人ID号码:                 fprintf(fp1,"%s\n",p->name);//联系人姓名:                 fprintf(fp1,"%s\n",p->phone);//联系人电话：                 fprintf(fp1,"%s\n",p->home); //联系人家庭地址:                 fprintf(fp1,"%s\n",p->birthday);//联系人出生日期:                 p=p->next;         }               //fprintf(fp1,"*************************************************************\n");         fclose(fp1);         fclose(fp);         printf("\n\n成功储存，你能在record1.txt找到相应信息\n");         printf("**************************************************************\n");         printf("PRESS ANY KEY TO EXIT.\n\n");         getchar();         exit(1); } //电子通讯录的记录读盘操作，使用文件指针； struct student *load(void) {         FILE *fp;         struct student *head=NULL,*p1=NULL,*p2=NULL;         char   c;         int    i;         fp=fopen("record.txt","a+");         if(fp==NULL){            printf("Open File fail!\n");            exit(0);         }         while(1)//for(i=1;(c=fgetc(fp))!=-1;i++)         {                 p1=(struct student *)malloc(LEN);                 if(fscanf(fp,"%s\n",p1->num)!=1) break;                 fscanf(fp,"%s\n",p1->name);                 fscanf(fp,"%s\n",p1->phone);                 fscanf(fp,"%s\n",p1->home);                 fscanf(fp,"%s\n",p1->birthday);//p1->email                 p1->next = NULL;                 if(head==NULL){  //if(i==1)                    head=p1;                    p2=p1;                 }                 else{                    p2->next=p1;                    p2=p1;                 }         }         //if(p1==NULL){         //   fclose(fp);         //   return(head);         //}         //p2->next=NULL;         fclose(fp);         return(head); }  main() {         struct student *head=NULL;         //FILE *fp1,*fp2;         int c; 		//功能选择需要的号码         system("cls");         system("color  2f");         system("cls");         //if ((fp1=fopen("record.txt","r"))==NULL)         //{         //        printf("error\n");                //exit(0);                //fp2=fopen("record.txt","w"); 			//如果不存在record.txt就创建一个               //fclose(fp2);         //}         head=load();         while(1)         {                 face();                 printf("选择你需要操作的功能号码:");                 scanf("%d",&c);                 getchar();                 switch(c)                 {                        case 1:head=append(head);break;                        case 2:print(head);break;                        case 3:head=del(head);break;                        case 4:search(head);break;                        case 5:save(head);break;                        case 6:exit(0);break;                      default :printf("Enter error!!\n");                 }                 //printf("*****************\n");                 printf("◇◆请按ENTER返回功能操作菜单◇◆\n");                 //printf("*****************\n");                 getchar();                 system("CLS");         } } //指定控制台输出的颜色属性// //颜色属性由两个十六进制数字指定 -- 第一个为背景，第二个则为// //前景。每个数字可以为以下任何值之一://  //0 = 黑色 8 = 灰色// //1 = 蓝色 9 = 淡蓝色// //2 = 绿色 A = 淡绿色// //3 = 湖蓝色 B = 淡浅绿色// //4 = 红色 C = 淡红色// //5 = 紫色 D = 淡紫色// //6 = 黄色 E = 淡黄色// //7 = 白色 F = 亮白色//

if ((fp1=fopen("record.txt","r"))==NULL)          {                fp2=fopen("record.txt","w");             //如果不存在record.txt就创建一个               fclose(fp2);         } 如果打开失败，为什么还要调用fclose呢，打开失败直接返回          FILE *fp1,*fp2;         int c;     struct student *head=NULL;         //功能选择需要的号码         system("cls");         system("color  2f");         system("cls");          //struct student *head=NULL;         if ((fp1=fopen("record.txt","r"))==NULL)          {                fp2=fopen("record.txt","w");             //如果不存在record.txt就创建一个               fclose(fp2);         }         head=load(); 在定义时，把head的位置放在system函数之前。Dev C++编译没问题，而Visual C++有问题，可能是编译器版本的原因，应该是Visual C++版本比较老吧～

试试在最开始加上 #include "stdafx.h"

//这是全代码 #include <string.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h>//包含system函数头文件 #define LEN sizeof(struct student) struct student {         char num[20]; 		//ID号码         char name[100]; 		//联系人姓名         char phone[20]; 		//联系人电话号码         char home[100]; 		//联系人通讯地址         char birthday[20]; 		//联系人生日         struct student *next; }; void face(void) //功能选择面板 {         printf("********************************************************************");         printf("\t\t\t\t☆★☆★☆★  ~_~  ~_~  ~_~  ☆★☆★☆★\n");         printf("\n\t\t\t☆★欢迎使用<查找联系人>☆★");         printf("\n\n\t☆★选择你需要操作的功能:☆★(若添加联系方式，建议完善联系人信息)★☆\n");      printf("\n");         printf("\t\t\t1.【增加联系人信息〗\n");     printf("\t\t\t2.〖显示<查找联系人>中所有记录】\n");         printf("\t\t\t3.【删除需要删除的信息〗\n");         printf("\t\t\t4.〖以名字查询所需的信息】\n");         printf("\t\t\t5.【保存<查找联系人>中的所有记录到指定文件中〗\n");         printf("\t\t\t6.〖退出不保存!!】\n");      printf("\n");         printf("\t☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★");       printf("\n\n********************************************************************\n\n"); } void print(struct student *head) {         struct student *p;         p=head;         system("CLS"); 		//调用DOS命令CLS能够清屏         printf("*************************************************************\n");         printf("==================== → 联系人信息记录表 ← ===================\n");         printf("*************************************************************\n");         if(head!=NULL)                 do                 {                         printf("联系人ID号码:%s\n",p->num);                         printf("联系人姓名:%s\n",p->name);                         printf("联系人电话号码:%s\n",p->phone);                         printf("联系人地址:%s\n",p->home);                         printf("联系人生日:%s\n",p->birthday);                         printf("********************************************************\n");                         p=p->next;                 } 				while(p!=NULL);         else         {             printf("抱歉!!无法找到该联系人!!\n\n");             printf("=============================================================\n");         } } //增添电子通讯录中的内容，即创建连表过程 struct student *append(struct student *head) {         struct student *p0=NULL,*p1,*p2; 		//p0为要插入的新节点         p1=head;         p2=head;         system("CLS");         printf("\n\n***********************************************************\n");         printf("\t\t你能在此目录下创建并添加联系人信息");         printf("\n***********************************************************\n");                 p0=(struct student *)malloc(LEN);       printf("请输入联系人ID号码:");                         gets(p0->num);                 printf("请输入联系人姓名:");                         gets(p0->name);                 printf("请输入联系人电话号码:");                         gets(p0->phone);                 printf("请输入联系人地址:");                         gets(p0->home);                 printf("请输入联系人生日:");                         gets(p0->birthday);             //对插入的节点排序，按姓名的拼音顺序                 if(head==NULL)                 { 				head=p0;p0->next=NULL; 				}                 else                 {                         while((strcmp(p0->name,p1->name)>0)&&(p1->next!=NULL))                                 { 									p2=p1;p1=p1->next; 								}                         if((strcmp(p0->name,p1->name))<=0)                         {                                 if(head==p1)                                         head=p0;                                 else                                         p2->next=p0;                                 p0->next=p1;                         }                         else                                 { 									p1->next=p0;p0->next=NULL; 								}                  printf("成功添加联系人信息!!");                 printf("\n************************************************************\n");                 printf("\n\n");                  }         return(head);        }  //查找联系人的维护（删除），通过输入联系人ID号码删除联系人数据 struct student *del(struct student *head) {         struct student *p1,*p2;         char num[12];         system("CLS");         printf("\n\n************************************************************\n");         printf("================= → 联系人信息记录删除功能 ← ===============\n");         printf("************************************************************\n");         printf("输入要删除的联系人ID号码:");         gets(num);          p1=head;         if (head==NULL)                 {             		printf("抱歉!!无法找到该联系人!!\n");                         printf("\n*******************************************************\n");                     return(head);                 }         while(p1!=NULL)         {                 if(strcmp(p1->num,num)==0)                 {                         if(p1==head)                         head=p1->next;                         else p2->next=p1->next;                         free(p1);                         printf("删除成功!!\n");                         return(head);                 }                 p2=p1;                 p1=p1->next;         }         printf("对不起!!没有要删除的联系人纪录!!\n");         return(head); }  //电子通讯录的查找，关键字为用户姓名； void search(struct student *head) {           struct student *p1,*p2;         char name[20];         p1=head;         p2=p1;         system("CLS");         printf("\n**************************************************************\n");                 printf("================ → 联系人信息记录查询功能 ← ==================\n");         printf("**************************************************************\n");         printf("输入要查找联系人的姓名:");         gets(name);         while(p1!=NULL)         {                 if(strcmp(p1->name,name)==0)                 {                        printf("联系人ID号码:");                                 puts(p1->num);                         printf("联系人姓名:");                                puts(p1->name);                         printf("联系人电话号码:");                                 puts(p1->phone);                        printf("联系人地址:");                                 puts(p1->home);                        printf("联系人生日:");                                puts(p1->birthday);                       printf("\n=============================================================\n");                                         break;                 }                 p2=p1;                 p1=p1->next;         }         if(p1==NULL)                 printf("对不起!!没有该联系人的纪录!!\n");          } //电子通讯录的记录存盘操作，使用文件指针； void save(struct student *head) {         FILE *fp,*fp1;         struct student *p;         p=head;                 fp=fopen("record.txt","w");         fp1=fopen("record1.txt","w");         fprintf(fp1,"=============== → 用户信息记录表 ← =================\n");                  while(p!=NULL)         {                 //首先把数据保存在record.txt中，这是提供给load函数用的数据                 //fprintf(fp," %s %s %s %s %s %s",p->num,p->name,p->phone,p->email,p->home,p->birthday);                 //然后把数据保存在record1.txt中，这是能提供直接查询看的，有比较友好的画面                 fprintf(fp1,"====================================================\n");                 fprintf(fp1,"联系人ID号码:%s\n",p->num);                 fprintf(fp1,"联系人姓名:%s\n",p->name);                 fprintf(fp1,"联系人电话:%s\n",p->phone);                 fprintf(fp1,"联系人家庭地址:%s\n",p->home);                 fprintf(fp1,"联系人出生日期:%s\n",p->birthday);                 p=p->next;         }         fprintf(fp1,"*************************************************************\n");         fclose(fp1);         fclose(fp);         printf("\n\n成功储存，你能在record1.txt找到相应信息\n");         printf("**************************************************************\n");         printf("PRESS ANY KEY TO EXIT.\n\n");         getchar();         exit(1); } //电子通讯录的记录读盘操作，使用文件指针； struct student *load(void) {         FILE *fp;         struct student *head=NULL,*p1=NULL,*p2=NULL;         char c;         int i;         fp=fopen("record.txt","r");         for(i=1;(c=fgetc(fp))!=-1;i++)         {                 p1=(struct student *)malloc(LEN);                 //fscanf(fp,"%s %s %s %s %s %s",p1->num,p1->name,p1->phone,p1->email,p1->home,p1->birthday);                 if(i==1)                 { 				 head=p1;p2=p1; 				}                 else                 { 				  p2->next=p1;p2=p1; 				}         }         if(p1==NULL)         { 	    	fclose(fp);return(head); 		}         p2->next=NULL;         fclose(fp);         return(head); }  main() {         FILE *fp1,*fp2;         int c; 		//功能选择需要的号码         system("cls");         system("color  2f");         system("cls");          struct student *head=NULL;         if ((fp1=fopen("record.txt","r"))==NULL)          {                fp2=fopen("record.txt","w"); 			//如果不存在record.txt就创建一个               fclose(fp2);         }         head=load();         while(1)         {                 face();                 printf("选择你需要操作的功能号码:");                 scanf("%d",&c);                 getchar();                 switch(c)                 {                 case 1:head=append(head);break;               case 2:print(head);break;                 case 3:head=del(head);break;                 case 4:search(head);break;               case 5:save(head);break;                case 6:exit(0);break;                 default :printf("Enter error!!\n");                         }                 //printf("*****************\n");                 printf("◇◆请按ENTER返回功能操作菜单◇◆\n");                 //printf("*****************\n");                 getchar();                 system("CLS");         }  } //指定控制台输出的颜色属性// //颜色属性由两个十六进制数字指定 -- 第一个为背景，第二个则为// //前景。每个数字可以为以下任何值之一://  //0 = 黑色 8 = 灰色// //1 = 蓝色 9 = 淡蓝色// //2 = 绿色 A = 淡绿色// //3 = 湖蓝色 B = 淡浅绿色// //4 = 红色 C = 淡红色// //5 = 紫色 D = 淡紫色// //6 = 黄色 E = 淡黄色// //7 = 白色 F = 亮白色//

引用 2 楼 浪客 的回复:这一段作为一个函数，在vc6上正常编译运行的。最好把错误信息或者代码贴上来

引用 1 楼 qzjhjxj的回复:这代码不全，没头没尾呀？ 我只贴了主程序，全部的太长了，只有这一段出现了错误

这代码不全，没头没尾呀？


Question: 冒泡排序

引用 3 楼 哇咔咔biu 的回复:[quote=引用 2 楼 自信男孩的回复:]首先对ch的scanf是越界访问问题，结果是未定义的。另外str是可变数组，C语言不支持这种定义～ 那请问我可以怎么改呀，我改了几次还是不行[/quote] 首先ch定义为8字节长度，后面的对ch的操作都不需要修改了； 第二定义好二维数组（长度确定），而不是用可变数组；

引用 2 楼 自信男孩的回复:首先对ch的scanf是越界访问问题，结果是未定义的。另外str是可变数组，C语言不支持这种定义～ 那请问我可以怎么改呀，我改了几次还是不行


Question: 出现value 3221225477 求助


Question: ccf ISBN不能拿满分

供参考：#include<stdio.h> int main() {         char a[15]={0};         int i,sum=0,j=1;         scanf("%s",&a) ;         for(i=0; i<11; i++) {             if(a[i]>='0' && a[i]<='9') {                sum+=(a[i]-'0')*j;                j++;             }         }         if((sum%11==(a[12]-'0'))||(a[12] == 'X')){                     printf("Right\n");         } else {                     if(sum%11!=10)                         a[12]=sum%11+'0';                     else                         a[12]='X';                     printf("%s\n",a);         }                  return 0; }


Question: 求解


Question: c语言，输入一个文件（不一定是当前文件夹），如何在同一目录下输出一个文件其文件名为原文件名加上前缀

学习一下readdir和rename这两个函数～


Question: c语言求解

可参


Question: OpenMP程序的编译和运行

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


Question: 在python里用def构建函数的时候能不能调用math库啊？

import math def myfunc():     print(math.sin(30*math.pi/180))

当然可以  你定义的函数里可以调用math库中的函数

引用 1 楼 user-4的回复:不知道你啥意思，def是定义函数的，是在自己函数里面调用math库里的函数？ 对对对，就是不知道能不能这样写

对对对，就是不知道能不能这样写

不知道你啥意思，def是定义函数的，是在自己函数里面调用math库里的函数？


Question: python的一个作业，不知道哪有问题，这张学的是构建函数和函数调用等等

可以这么调用，但你的循环变量控制有问题  # -*- coding: UTF-8 -*- import math n = 10 sum = 0 for i in range(1, n+1): 	sum += math.factorial(i) print sum


Question: 有没有大佬知道这是为啥，树生成不出来

仅供参考：#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int nn=0; int CreateBiTree(BiTree *T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         *T = NULL;     } else {         *T = (BiTree)malloc(sizeof(BiTNode)); nn++;         (*T)->data = data;         //生成根结点         CreateBiTree(&(*T)->lchild);//构造左子树         CreateBiTree(&(*T)->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             p = p->rchild;          //访问右子树         }     }     free(stack); } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             printf("%c ",p->data);             p = p->rchild;          //访问右子树         }     }     free(stack); }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));     int sp=0;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || sp) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack[sp]=BT;sp++;       //存入栈中             p = p->lchild;         }         while (sp && (stack[sp-1])->tag == 'R') {//左右子树访问完毕访问根节点             sp--;BT=stack[sp];        //退栈             printf("%c ",BT->biTree->data);             free(BT);         }         if (sp) {//遍历右子树             BT=stack[sp-1];             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     }     free(stack); } void LevelOrder(BiTree T) {//层次遍历     BiTree p;     BiTree *queue;     int h=0,t=0,n=0;      if (T == NULL) return;     p=T;     queue=(BiTree *)malloc(nn*sizeof(BiTree));     queue[t]=p;t=(t+1)%10;n++;//根节点入队     while (n) {    //队列不空循环         p=queue[h];             //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         h=(h+1)%10;n--;         //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue[t]=p->lchild;t=(t+1)%10;n++;         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue[t]=p->rchild;t=(t+1)%10;n++;         }     }     free(queue); } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(&T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G


Question: 刚学c语言求大佬帮忙解答.

基本的结构体使用题目，自己先试着写写吧，不出错，怎么知道结构体不能这么用呢？！


Question: C语言中关于int与long int

C语言标准规定了一些类型  然后规定了这些类型的最小范围而没有规定精确范围  所以不同平台上的实现不一样  标准制定者跟编译器实现者分离  是导致类问题的根本原因 因为使用C的平台太多了 不同平台有不同平台的需求 所以标准必须要综合各方面利益（俗称和稀泥）

所以才有了 int8,int16,int32,int64类型。

int和long的长度是看编译器的，int至少2字节，long不短于int，你说两者相等只能说你的编译器是这样实现的；  对于64位编译器，int是32bit长度，而long int是64bit长度（在64Ubuntu系统下测试）。  你如果用过turbo C，就能知道int表示的范围比long小的；


Question: matlab关于音频读取分帧输出


Question: 项目中有多个.h文件和.c文件怎么生成DLL

看本网页下面CSDN自动推荐的链接。

可以先学习一下动态库的生成


Question: 求大佬帮助

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

ddddddd

#include<stdio.h> #include <math.h> #include <ctype.h>  int main() {     int n;     int i = 1, sum = 1;     double e = 1, tmp;;      scanf("%d", &n);      if (n > 16)         n = 16;     if (n < 1) {         printf("%.2lf\n", 1.0);         return 0;     }     do {         sum *= i;         tmp = 1.0/sum;         e += tmp;         printf("i = %d, sum = %d\n", i, sum);         i++;     } while (fabs(tmp) > 1e-6 && i < n);      printf("%.2lf\n", e);     return 0; } 供参考～


Question: 请问这道c语言题咋写？


Question: 函数传入参数后，实际发生了变化

C/c++编译完哪有什么变量名

还得看一下在调用function_2之前是不是对s1进行了修改或覆盖  参数传递之前，即调用function_2之前，打印一下s1的内容，然后在function_2函数内打印一下形参内容，对比一下再看看

是其他原因导致的。

引用 7 楼 自信男孩 的回复:[quote=引用 5 楼 Roi_ 的回复:][quote=引用 3 楼 flying_music 的回复:]s1 s2都是struct st的对象，怎么会里面的名字不一样呢？而且如果形参跟实参类型不同，是编译不过去的啊  s1 s2都是struct st的对象，但是s1.name 和 s2.name是不一样的。形参、实参类型是匹配的，编译也通过了。[/quote]  描述不能代替代码，把涉及到的完整代码发一下吧[/quote]  谢谢大家提供的思路，问题解决了，刚刚在编译机上重新编译替换了。个人粗心导致编译后的代码没有及时替换，导致GDB调试的时候显示的是新代码，实际运行的是旧代码。

引用 5 楼 Roi_ 的回复:[quote=引用 3 楼 flying_music 的回复:]s1 s2都是struct st的对象，怎么会里面的名字不一样呢？而且如果形参跟实参类型不同，是编译不过去的啊  s1 s2都是struct st的对象，但是s1.name 和 s2.name是不一样的。形参、实参类型是匹配的，编译也通过了。[/quote]  描述不能代替代码，把涉及到的完整代码发一下吧

把你的准确信息贴出来，具体代码，具体错误贴图。不合逻辑必有妖。

引用 3 楼 flying_music 的回复:s1 s2都是struct st的对象，怎么会里面的名字不一样呢？而且如果形参跟实参类型不同，是编译不过去的啊  s1 s2都是struct st的对象，但是s1.name 和 s2.name是不一样的。形参、实参类型是匹配的，编译也通过了。


Question: 如何理解下面这段话，兄弟们

考虑一下：printf("%s\n","abcdef"+1); 它的输出是 bcdef 这说明什么？

有没有例子啊，兄弟们

printf("%d",a);//输出的是地址 用%p打印地址； ，这个地址的名字叫做a，这样描述是不对的，而是a是一个指针，把"helloworld"字符串的地址放到a变量了。

引用 2 楼 自信男孩的回复:比如： const char *str = "helloworld";   //这个赋值（=）表达式的值就是字符串常量的地址赋值给str 比如 char *a="helloworld"; printf("%s",a);//输出helloworld printf("%d",a);//输出的是地址 意思是为helloworld这个字符串指定了一个地址，这个地址的名字叫做a(实际是一串数字，a只是个别名)，另外地址是字符串第一个字符h的地址

引用 2 楼 自信男孩的回复:比如： const char *str = "helloworld";   //这个赋值（=）表达式的值就是字符串常量的地址赋值给str 了解了，谢谢兄弟


Question: 请问一下 我想将一个数组按从大到小的顺序排序，并输出它应该怎么写（用指针的方法）

楼主用的就是指针呢，在reswap函数里，parr是指针，不是数组的～

供参考：#include <stdio.h> #define N 40  void reswap(int *parr,int n);  int main() {     int score[N],n,i;     printf("The number of student:");     scanf("%d",&n);      printf("Input %d student's score:",n);     for(i=0;i<n;i++)     {         scanf("%d",&score[i]);     }      reswap(score,n);          return 0; }  void reswap(int *parr,int n) {     int i,j,temp;     for(i=0;i<n-1;i++)     {         for(j=i+1;j<n;j++)         {             if(*(parr+i) < *(parr+j))//从大到小             {                 temp     = *(parr+i);                 *(parr+i)= *(parr+j);                 *(parr+j)= temp;             }         }     }     for(i=0;i<n;i++)     {         printf("%d ",*(parr+i));     }     printf("\n"); }


Question: 小白问题，困扰好久了 有大佬能帮忙分析一下嘛

打开《数据结构》 教科书，翻到 图 章节，自习吧。这都要讲好几节课的~~~


Question: 求助

简单地说，每个getchar()的执行，就要读入一个字符，并且就地比较，并不保存。 这种行为在东北话里叫做熊瞎子劈（第三声）苞米，劈一根丢一根。

#include<stdio.h> #include <ctype.h>  int main() {     //char ch;     int ch;     int count=0;     int i;     while((ch = getchar())!=EOF)     {         if (ch == '\n')             break; #if 1         if(ch >= 'A'&&ch<='Z')         {             count++;         }         else if(ch>='a'&&ch<='z')         {             count++;         } #else         if (isalpha(ch))             count++; #endif         //i=count;     }     //printf("%d",i);     printf("%d\n", count);      return 0; } 供参考～


Question: 打印机驱动开发

c++可以做吧，还是c


Question: 请问下面程序的功能

拿着代码问功能，这样的毕竟很少。看代码逻辑不复杂，是不是自己的问题呢？

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 求下列选择题答案！！！

这个数组元素a[i][j]的行数不应该是（i+1）吗？？ 因为行数是从0开始的呀

正如楼上几位朋友所说，这个题选“B”  对于二维数组，请参考《C++中的二维数组1》 《C++的二维数组2》 希望能够帮到您！

m列，那么就是i *m，即i行的个数，+j说明是第j个数。

将m=3，i=1,j=1带入题目中各式，掰手指头数一下。  1 2 3 4 5 6  答案因该是B

特殊值法，把i j都想成0，前面肯定有0个元素

一定要六个字，选B


Question: 关于while((getchar())!='\n')吃掉回车的问题

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

输入缓冲区是关联到进程的，所以你的程序从上到下，用的都是同一个输入缓冲区。

第二个while不一定会执行一次键盘输入（最终的还是键盘输入的），为什么说不一定呢，比如你输入的是ab然后回车，那么内循环的while接收的是b；如果是输入的a回车，那么内循环getchar()接收的是'\n'。

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。


Question: C#如何读取文件的指定行，并且对改行进行编辑，之后保存文件？

所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224


Question: 【C语言求助】n个人围成一圈1~3循环报数，不断剔除报到3的人，找出剩下的人的序号

再多用用，就熟练了。

引用 3 楼 qzjhjxj的回复:供参考：void main() {     int people[1000],n_5;     printf("Please enter the number of people:\n");     scanf("%d",&n_5);      for(int i=0;i<n_5;i++)     {         people[i]=i+1;     }      int *p_5=people;     int remain=n_5,num_off=0;     while(remain>1)//剩下的人数大于1     {         p_5 = people; //这里相当于把数组首尾相连         while((p_5)<=(people+n_5-1))//判断是否到了数组尾，到尾部跳出重新一轮         {                           //这里循环都是一个n的长度              if(*p_5!=0)//判断有没有出圈，如果已经出圈了就跳过，进入p_5++下一位数据判断             {                num_off++;//没出圈的才计数值加1                 if( num_off==3)                 {                   printf("此为报到3的数：*p_5=%d num_off=%d\n",*p_5,num_off);//便于观察过程                   *p_5=0;                   remain--;//总人数减一                   num_off=0;//从0开始重新计数                 }             }                      //printf("*p_5=%d num_off=%d\n",*p_5,num_off);//便于观察过程             p_5++; //数组下一个数据         }     }      p_5 = people; //此时要让p_5指针回到数组的首部位置      while(*p_5==0)//找到最后不是0的位置             p_5++;     printf("The number of remained one is:%d \n",*p_5);      } 谢谢！while循环太难搞了🤒

引用 2 楼 赵4老师的回复:仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }  好的，谢谢！

引用 1 楼 user-4的回复:建议自己调试一下，调试能力跟编码能力同样重要，甚至更重要 知道的，谢谢！这个已经是调了好多遍了，还是不行😭

建议自己调试一下，调试能力跟编码能力同样重要，甚至更重要


Question: 【C语言求助】为什么这个代码会进入死循环？

放在while(*p!=0)循环里面，循环条件是*p!=0，也就是只有*p=0时才能退出，在循环体里这个条件始终是满足的，最后p++跑出数组的范围了。

引用 1 楼 qzjhjxj的回复:供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);                          while(*p!=0)             {                  if(num_off!=3)                 {                      num_off++;                     //p++;                 }                 else if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                 }             }             p++;         }     }     printf("打印此段话说明循环结束");      } 还有就是，为什么把p＋＋；跟while(*p！＝5)并列以后，while会循环3次？

注意下数组不要越界，因此再输入n之后要对n的值进行判断，处理。

引用 5 楼 qzjhjxj的回复:仔细分析楼主的代码，里面用while(*p!=0)来判断*P==0这里是错误的，*p表示的是数组里某一位的值，这里应用if，逻辑判断设计问题，修正如下，供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);              if(*p!=0 )  //while(*p!=0)             {                      //if(num_off!=3)                      num_off++;                  //  p++;             }                 //else                 if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                  }             //}             p++;         }     }     printf("打印此段话说明循环结束");      } 好，我再看看，谢谢

引用 5 楼 qzjhjxj的回复:仔细分析楼主的代码，里面用while(*p!=0)来判断*P==0这里是错误的，*p表示的是数组里某一位的值，这里应用if，逻辑判断设计问题，修正如下，供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);              if(*p!=0 )  //while(*p!=0)             {                      //if(num_off!=3)                      num_off++;                  //  p++;             }                 //else                 if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                  }             //}             p++;         }     }     printf("打印此段话说明循环结束");      } 我又开了一个帖子，里面是完整的代码，麻烦帮忙看看

引用 7 楼 自信男孩的回复:注意下数组不要越界，因此再输入n之后要对n的值进行判断，处理。 我又开了一个帖子，里面是完整的代码，麻烦帮忙看看

引用 8 楼 forever74的回复:楼主的代码每次都从头开始数数，与常见的不同啊。请楼主确认一下，题目确实是这样的？ 我又开了一个帖子，里面是完整的代码，麻烦帮忙看看

引用 1 楼 qzjhjxj的回复:供参考：#include<stdio.h>  void main() {      int people[1000],n;     printf("Please enter the number of people:\n");     scanf("%d",&n);     //给n个人按顺序编号      for(int i=0;i<n;i++)     {         people[i]=i+1;     }          int *p=people;     int remain=n,num_off=1; //num_off是循环过程中该人在1~3中报的数     while(remain>1) //剩下的人数大于1     {         p=people;                  while(p!=(people+n-1))//剩下的人不是编号最后一个         {            //printf("p=%d\n",*p);                          while(*p!=0)             {                  if(num_off!=3)                 {                      num_off++;                     //p++;                 }                 else if(num_off==3)                 {                      *p=0;  //如果报数为3则剔除该人，用赋值0来达到此效果                     remain--; //剔除后剩余人数减1                     //p++;                     num_off=1; //报数开始新的一轮 1 2 3 1 2 3.。。                 }             }             p++;         }     }     printf("打印此段话说明循环结束");      } 请问为什么p＋＋；放在while循环里面会无限循环啊？难道说while里面的p＋＋；影响不了while循环条件里的*p的值吗？


Question: C语言疑问

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

试着用memset进行初始化为同一个字符或整数；  其实这些推测或疑问，你都可以自己试一下的。比如第一个是不是都初始化为'\0'，那你初始化后，用一个循环可以打出来的～

1. 自己去试一下不就知道了 2. 可以都设置为0，不能随便设置，就像int a[10] = {0}; 3.  普通的二维数组int a[10][10] 形参可以写int a[10][10] 或 int a[][10] 或 int (*a)[10]，实参是a 4. '\0'是其ASCII码值 跟数字0没关系

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！


Question: 按回车不执行一直换行，为什么

while(~scanf("%d",&a)) 改成这样：  while(scanf("%d",&a)==1) 或者  while(scanf("%d",&a)) 试试

引用 1 楼 user-3 的回复:供参考：#include<stdio.h> int main(){     int a;     int cnt=-2;     int n[100]={0};     while(~scanf("%d",&a)){   //Ctrl+Z 结束输入         for(int i=2;i<=a;i++){             n[i]=i;         }         for(int j=2;j<=a;j++){             for(int k=2;k<j;k++){                 if(n[j]%k==0){                     n[j]=0;                 }             }         }     }     for(int i=0;i<=a;i++){         if(n[i]==0){             cnt++;             continue;         }         else {             printf("%d ",n[i]);         }     }     printf("\n");     printf("%d\n",cnt);         return 0; }  //~是按位取反 //scanf的返回值是输入值的个数 //如果没有输入值就是返回-1 //while(~scanf("%d", &n))就是当没有输入的时候退出循环 //和while(scanf("%d",&n)!=EOF)一个意思 //知识1：只有-1取反（~-1）是0 //知识2：scanf读入到EOF时返回-1 //注：一般这种用法在oj（确保数据正确）上使用，平常基本用不到  //scanf的返回值是输入匹配对象的个数，%d如果输入的是非数字，那么即使是输入了，返回的也是0，因为字母与%d不匹配


Question: 一道C语言编程题目，想了好久了，老是WA，请大家帮忙看看

引用 6 楼 早打大打打核战争 的回复:虽然你结帖了，#1的代码实际是错的~ 相当错 那天急着吃饭就走了 今天才又看到

引用 6 楼 早打大打打核战争的回复:虽然你结帖了，#1的代码实际是错的~ 哦哦，不过我没怎么看，我ac了就结帖了，还是很谢谢哦

虽然你结帖了，#1的代码实际是错的~

供参考：  #include <stdio.h> int main() { 	int ncase, nline, maxx, sumx; 	int line[20]; 	scanf("%d", &ncase); 	while (ncase--) 	{ 		int i; 		maxx = 0; 		sumx = 0; 		for (i = 0; i < 20; i++)line[i] = 0; 		scanf("%d", &nline); 		while (getchar() != '\n'); 		i = 0; 		while (i < 2*nline) 		{ 			switch (getchar()) 			{ 			case 'X': 				line[i%nline]++; 				break; 			case '\n': 				i++; 			} 		} 		for (i = 0; i < nline; i++) 		{ 			sumx += line[i]; 			if (line[i] > maxx)maxx = line[i]; 		} 		printf("%d\n", maxx*nline - sumx); 	} 	return 0; }

我知道了，第一次发帖，谢谢你们的帮助

引用 3 楼 因为天气好 的回复:嗯嗯，但是我还是不知道自己的代码错哪了，样例可以过 楼主的代码，问题出在进入第二轮测试时，第一轮的统计的 max1[100]   max2[100]  sum  sat这些值都没有复位归零。供参考：#include<stdio.h> #include<string.h> char s[1001]; int main() {     int k,n,i,j,sta=0;     int sum=0;     int max1[100];     int max2[100];     int max;     scanf("%d",&k);     while(k--)     {         scanf("%d",&n);         getchar();          sum=0;sta=0;    //这些值需要复位归零         for(i=0;i<100;i++){max1[i]=0;max2[i]=0;}          for(i=0;i<n;i++)         {             gets(s);             for(j=0;s[j]!='\0';j++)             {   if(s[j]==' ')                 {                     sta++;//统计左边零件本身的空格                 }             }             sum=sum+strlen(s);             max1[i]=strlen(s);         }         for(i=0;i<n;i++)         {             gets(s);             for(j=0;s[j]!='X';j++)             {                 ;             }             int temp=j;                 for(;s[j]!='\0';j++)             {   if(s[j]==' ')                 {                     sta++;//统计右边零件本身的空格                 }                              }             sum=sum+j-temp;//j-temp为右边零件长度             max2[i]=j-temp;         }         max=0;         for(i=0;i<n;i++)//求出平凑出来的最长的一行的值             if((max1[i]+max2[i])>max)                 max=max1[i]+max2[i];         sum=n*max-sum;         printf("%d\n",sum+sta);     }          return 0; }

嗯嗯，但是我还是不知道自己的代码错哪了，样例可以过

把这样的左右两个零件紧密地拼在一起！


Question: 请教泰勒公式求sinx C语言，实在不知错哪了

引用 2 楼 芒光淀 的回复:[quote=引用 1 楼 user-2的回复:]供参考，误差较大：//sin x = x - x^3/3! + x^5/5! - x^7/7! + ... + (-1)n-1x2n-1/(2n-1)!  #include <stdio.h>  int main(void)  {     int i,j,num=0;//x     double n=1,sum=0,x;                       //scanf("%d",x);     scanf("%lf",&x); //x是弧度，所以数据类型应为double     for(i=1;n>=1e-5;i+=2)     {         n=1;         for(j=i;j>0;j--)             n *= ( double)x/j;         if(num%2==0)         {            sum+=n;            //num++;         }         else         {            sum-=n;            //num++;         }         num++;     }     printf("%lf %d",sum,num+1);     return 0;  } 好像还是不对[/quote] 咋不对了？没问题呀，看截图：

引用 1 楼 user-2的回复:供参考，误差较大：//sin x = x - x^3/3! + x^5/5! - x^7/7! + ... + (-1)n-1x2n-1/(2n-1)!  #include <stdio.h>  int main(void)  {     int i,j,num=0;//x     double n=1,sum=0,x;                       //scanf("%d",x);     scanf("%lf",&x); //x是弧度，所以数据类型应为double     for(i=1;n>=1e-5;i+=2)     {         n=1;         for(j=i;j>0;j--)             n *= ( double)x/j;         if(num%2==0)         {            sum+=n;            //num++;         }         else         {            sum-=n;            //num++;         }         num++;     }     printf("%lf %d",sum,num+1);     return 0;  } 好像还是不对


Question: 球球大佬解决 C语言结构体的一个问题，初学C语言

修改如下，问题见注释，供参考：#include<stdio.h> #include<stdlib.h> #define N 100  struct fract{        int   fenzi;        int   fenmu;        float shuzhi; };  void shuzhi_paixu(struct fract *fracccc,int n)//从这里开始编译不通过？？？？？？很迷惑 {     fract temp;     for(int i=0;i<n;i++)  // for(int i=0;i<n-1;i++)     {         for(int j=0;j<n-1-i;j++)         {             if(fracccc[j].shuzhi>fracccc[j+1].shuzhi)             {                 temp=fracccc[j+1];                 fracccc[j+1]=fracccc[j];                 fracccc[j]=temp;             }         }     }     printf("\n");     printf("根据数值排序的情况:\n");     for(int i=0;i<n;i++)         printf("%d/%d ",fracccc[i].fenzi,fracccc[i].fenmu);// printf("%d/%d ",fracccc[i],fracccc[i+1]); } static long F(int n)//递归调用 {     if(n==1||n==2)         {return 1;}     else {         return 2*F(n-1)+F(n-2);     } }  int main() {   int m,x;      struct fract frac[N];   //,*pfrac;     printf("请输入数字\n");     scanf("%d",&x);     m=x;     for(int i=0;i<m;i++){       frac[i].fenzi=F(i+1);   // frac[i].fenmu=F(i+1);       frac[i].fenmu=F(i+2);   //frac[i].fenzi=F(i+2);       //frac[i].shuzhi=(float)F(i+1)/F(i+2);       frac[i].shuzhi=(float)frac[i].fenzi/frac[i].fenmu;// 整数/整数 = 0，强制类型转换下     }     for(int i=0;i<m;i++)         printf("%d/%d ",frac[i].fenzi,frac[i].fenmu);// printf("%d/%d ",frac[i].fenmu,frac[i].fenzi);                             //pfrac=frac;     shuzhi_paixu(frac,m);          return 0; }   //请输入数字 //5 //1/1 1/3 3/7 7/17 17/41 //根据数值排序的情况: //1/3 7/17 17/41 3/7 1/1 请按任意键继续. . .

void shuzhi_paixu(struct fract *fracccc,int n)  main函数最后加 return 0;


Question: 为什么运行后输入数字没有反应，不能将两个数组合并？求指点

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

引用 2 楼 qzjhjxj 的回复:代码错误修正，增加了打印输出函数，逻辑没整明白，供参考：#include<stdio.h> #include<stdlib.h>  #define MAXSIZE 10  typedef struct LNode {     int data;     int cur; }LNode,SLinkList[MAXSIZE];  void InitSpace(SLinkList &L) {     int i;     for(i=0;i<MAXSIZE-1;i++){         L[i].cur=i+1;         L[i].data=0;     }     L[MAXSIZE-1].cur=0;     L[MAXSIZE-1].data=0; }  int Malloc (SLinkList &L) {     int i;     i=L[0].cur;     if(L[0].cur)        L[0].cur=L[i].cur;     return i; }  void Free(SLinkList &L,int k) {     L[k].cur=L[0].cur;     L[0].cur=k; }  void Different(SLinkList &L) {     //InitSpace(L);     int S;     S=Malloc(L);     int r;     r=Malloc(L);     r=S;     int m=4,n=6,i,j;     for(i=0;i<m;i++)  //这里输入m次     {        j=Malloc(L);        //scanf("%d",L[j].data);        scanf("%d",&L[j].data);        L[r].cur=i;        r=j;     }     L[r].cur=0;     for (i=0;i<n;i++)  //这里循环n次     {        int b;        //scanf("%d",b);        scanf("%d",&b);        S=b;  //b=S;        int k=L[S].cur;        while(k!=L[r].cur&&L[k].data!=b)        {            int p=k;            k=L[k].cur;        }        if(k==L[r].cur){           j=Malloc(L);           L[j].cur=b;           L[j].cur=L[r].cur;           L[r].cur=i;        }        else        {           int p;           L[p].cur=L[k].cur;           Free (L,k);           if(r==k)              r=p;        }     } }  void print(SLinkList &L) {     int i;     for(i=0;i<MAXSIZE;i++)         printf("%d %d \n",L[i].data,L[i].cur); }  int main () {     SLinkList L ;          InitSpace(L);     print(L);      Different(L);     print(L);          return 0; }  int p;           L[p].cur=L[k].cur; 这样操作，很大可能会出错，因为数组越界了呀，p是一个随机值

for (i=0;i<n;i++)  {  int b;  scanf("%d",b);  ---------- 比如这一段，为何把int b;放循环里？ 另外应该是 scanf("%d",&b);  还有你没有任何打印输出，你怎么知道运行成功了没有，多加几个打印语句，打印一下中间值和最后结果吧。


Question: SPI通信实验-关于主函数数组const定义相关疑问

各位大佬帮我看看，谢谢

这是源码程序，具体内容如上

具体原因，没有具体代码，无法说清。 加了const 代表你不能直接修改TEXT_Buffer 的内容


Question: 秋梨膏 大佬看看 为什么串口收不到数据

在主程序中我用串口助手进行调试过程中串口的数据一直为0

是我忘记开中断了，智障了，有个新问题问大佬们，我用串口助手发送1，然后SBUF接收到的是12544请问是什么原因呢


Question: MSVC 环境如何使用复数？

用不了, 自己处理复数运算

我是 windows 平台下 mingw 编译 成dll 是没问题的


Question: 这个怎么设计

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

定义一个字符串数组，根据输入的字符-'a'获得牌色


Question: 结果是对的，但运行后总是说段错误，真不知道是哪里的原因，哪位大佬帮帮忙，感谢!

谢谢，要是没有你们我又得卡死在这了

楼主的解法是可行的，只是效率低了点，数据输入是有些问题，主要是这一句while((a[j]=getchar())!=' ')键盘输入一般以回车结束应改为while((a[j]=getchar())!='\n')另外上机测试大部分是自动化脚本运行，数据从文件通过管道输入，输入结束多数是 eof ,这时要有对eof的检测，否则，会出问题，另外一点，对题目的理解，n 是非负整数，自然包括0,楼主忽略了对n=0的处理。 以下代码供参考  #include <stdio.h>  #include <stdlib.h>   int main(int argc,char* argv[])  {  int i,len,n,k; char arr[1000] ;  scanf("%d",&n);  i=0; while((isspace(arr[i]=getchar())!=0));//忽略一个或多个空白符，取得第一个有效字符 ++i; while(((arr[i]=getchar())!='\n')&&(arr[i]!=EOF)){++i;} //键盘输入用回车结束，数据从文件通过管道输入大部分以EOF结束 len=i;  k=n%len; //>=len的移动是重复的     /*题目所要求的移动是一种循环移动，如果把字符串首尾相连的话，就是起点位置的移动，可以直接循环输出*/     for (i=len-k;i<len+len-k;++i)     {         printf("%c",arr[i-(i>=len)*len]); //printf("%c",arr[i%len]);               }     printf("\n");     return 0 ;  }

楼主的解法是可行的，只是没契合这题的要求而已，这题要求你用8#方法。

引用 8 楼 jianyue---的回复: #include <stdio.h>   #include<string.h>   int main(int argc,char* argv[])  {       int i,len,n,k;     char str[1001] ;         scanf("%d%s",&n,str);     len=strlen(str);     k=n%len; //>=len的移动是重复的     /*题目所要求的移动是一种循环移动，如果把字符串首尾相连的话，就是起点位置的移动，可以直接循环输出*/     for (i=len-k;i<len+len-k;++i) 	{ 		printf("%c",str[i-(i>=len)*len]); //printf("%c",str[i%len]);              } 	printf("\n");       return 0 ;  }  额，能解释下我那个解法为什么不行吗？或者能行的能告诉我怎么修改吗？我挺想知道自己错在了哪?

#include <stdio.h>   #include<string.h>   int main(int argc,char* argv[])  {     int i,len,n,k;   char str[1001],s[1001] ;   {             scanf("%d%s",&n,str); 	len=strlen(str); 	k=n%len; //>=len的移动是重复的 	/*题目所要求的移动是一种循环移动，如果把字符串首尾相连的话，就是起点位置的移动，作为字符串，以k为分界前后对换即可实现*/ 	strncpy(s,str+len-k,k); 	strncpy(s+k,str,len-k); 	s[len]='\0' ;         printf("%s\n",s);    }   return 0 ;  }

改这样试试：#include<stdio.h> #include<string.h> int main() {     int i,len,n,m;     char a[1001],w;     scanf("%d",&n);     getchar();     gets(a);     len = strlen(a);     for(i=1;i<=n;i++){         for(m=len-1,w=a[m];m>0;m--){             a[m] = a[m-1];         }         a[m]=w;     }     puts(a);         return 0; }

什么样的错误提示？

引用 3 楼 user-3的回复:修正楼上的，第22行增加printf("\n"); :#include<stdio.h>  int main() {     int i,j,n,m;     char a[1024],w;     j=0;     scanf("%d",&n);     getchar();     while((a[j]=getchar())!='\n'){           j++;     }     for(i=1;i<=n;i++){         for(m=j-1,w=a[m];m>0;m--){             a[m] = a[m-1];         }         a[m]=w;     }     for(i=0;i<j;i++){         printf("%c",a[i]);     }     printf("\n");          return 0; } 额，好像不行，心态崩了，好难啊

修改如下，供参考：#include<stdio.h>  int main() {     int i,j,n,m;     char a[1024],w;     j=0;     scanf("%d",&n);     getchar();     while((a[j]=getchar())!='\n'){           j++;     }     for(i=1;i<=n;i++){         for(m=j-1,w=a[m];m>0;m--){             a[m] = a[m-1];         }         a[m]=w;     }     for(i=0;i<j;i++){         printf("%c",a[i]);     }          return 0; }

第一眼看去，输入应该改这样： while((a[j]=getchar())!='\n'){           j++;     }