Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 新手求教：这是一段输出最小字符串的程序，加粗的两行如果换成char ＊sx；char ＊smin；在Xcode里面就会运行不出结果，为什么呀？

回复:
user: user-1
content: 换成char*sx后他只是一个指针，还没有指向一块有效的内存，所以不行

user: user-2
content: 换成*sx, *smin，就是野指针；当然不可以了，对于能否输出结果还是未定义行为（可以理解为随机的）；运行时可能会直接提示段错误； 换成指针，可以这样做：  #include <stdio.h> #include <stdlib.h> #include <string.h>   int main() {     char *sx;     char *smin;       sx = (char *)malloc(sizeof(char) * 80);     smin = (char *)malloc(sizeof(char) * 80);      printf("Let us start!\n");     scanf("%s", sx);     strcpy(smin, sx);     for(int i=1;i<5;i++)     {         scanf("%s",sx);         if(strcmp(sx,smin) < 0)             strcpy(smin,sx);       }     printf("The smallest string is: %s\n",smin);     free(sx);     free(smin);      return 0; } 试一下能不能输出；

user: user-3
content: 1楼正确了。

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495
user-0 提问: 新手的一个小问题，想请大家看看

回复:
user: user-1
content: scanf_s("%s", &id);

user: user-0
content: 引用 2 楼 qq_29846883 的回复: scanf_s("%s", &id);   这样我试了，还是不行啊，一楼那样能解决。 而且对指针这个地址不是应该直接用id， 不用&id取id的地址吧。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:id是指向NULL的指针变量，所以不能直接使用，需要通过malloc或者new申请空间；或者直接将id定义为字符数组，这样就可以直接使用了。 另外，scanf_s对于输入的%s需要第三参数，即字符串长度（id的长度）；   谢谢了，解决了问题。

user: user-2
content: id是指向NULL的指针变量，所以不能直接使用，需要通过malloc或者new申请空间；或者直接将id定义为字符数组，这样就可以直接使用了。 另外，scanf_s对于输入的%s需要第三参数，即字符串长度（id的长度）；
user-0 提问: c语言读取txt文件二维数组中的相关数据后把相关数据存入一个新文件，求大神指点

回复:
user: user-0
content: 能讲讲你的思路吗？

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <math.h>  #define n    396 #define m  7  struct info {     double d1;     double d2;     int num[5]; };  int main(void) {     errno_t err0, err1;     FILE* fp0, *fp1;     if ((err0 = fopen_s(&fp0, "F:\\ a1.txt", "r")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     if ((err1 = fopen_s(&fp1, "F:\\6-0-1-0-0.txt", "w")) != 0)     {         printf("Cannot open this file\n");         exit(0);     }     int i, j;     struct info tmp;     for (i = 0; i < n; i++)     {         for (j = 2; j < m; j++)         {             fscanf_s(fp0, "%lf %lf %d %d %d %d\n", &tmp.d1, &tmp.d1, &tmp.num[0], &tmp.num[1], &tmp.num[2], &tmp.num[3], &tmp.num[4]);             //fscanf_s(fp0, "%d", &data[i][j]);             printf("%lf %lf  %d    %d    %d    %d    %d\n", tmp.d1, tmp.d2, tmp.num[0], tmp.num[1], tmp.num[2], tmp.num[3], tmp.num[4]);             if (tmp.num[0] == 6 && tmp.num[1] == 0 && tmp.num[2] == 1 && tmp.num[3] == 0 && tmp.num[4] == 0)                 fprintf(fp1, "%lf\t%lf\n", tmp.d1, tmp.d2);         }     }     fclose(fp0);     fclose(fp1);     system("pause"); } 试一下改过的这个程序。然后给我回馈一下是否可行。 如果还有问题，继续提出来。 既然是将a文件的部分内容转移到b文件中，那么就不需要定义那么长的二位数组，只需要一个临时变量作为中转即可。

user: user-2
content: 在cmd中执行以下命令： cd /d in.txt文件所在盘符和文件夹路径 find "6    0    1    0    0" in.txt >out.txt type out.txt

user: user-0
content: 比如这些数据： 2.040000    0.250000    6    0    1    0    0     2.030000    0.250000    6    0    1    0    0     2.020000    0.250000    6    0    1    0    0      2.000000    0.250000    6    0    1    0    0       1.980000    0.250000    6    0    1    0    0     1.970000    0.250000    6    0    1    0    0     把后缀为6    0    1    0    0的数据写入新的txt文件，里面的数据格式如下： 2.040000    0.250000        2.030000    0.250000      2.020000    0.250000       2.000000    0.250000           1.980000    0.250000       1.970000    0.250000

user: user-0
content: 坐等大神指点！！！
user-0 提问: C语言链表结点指针打印值与监视窗口值不同

回复:
user: user-1
content: 原因应该是head->next为NULL，phead又指向了head->next，所以phead为NULL；所以tail = head;那么tail为NULL； phead = head->next; 这句会导致内存泄露，因为phead指向了堆上的一块内存区域，但是现在又让phead指向head->next;那么phead刚才申请的空间就找不到了，也不能释放了，只能等到程序退出才会被释放。

user: user-2
content: 不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”  数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-3
content: 在DEBUG下调试程序，否则可能被优化了
user-0 提问: c语言 堆排序 运行结果错误求教

回复:
user: user-1
content: 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

user: user-2
content: 建议单步跟踪程序运行去找原因

user: user-3
content: 堆排序？ 粗略的看了下你代码也没有对堆操作的函数啥的？ 你是要干嘛？ 到是看到你不少地方写int i; 不给初值，然后直接使用， 那本书介绍这样使用的，还是老师教的，这里先改了，程序还有问题的话 把问题说清楚
user-0 提问: 下面的是我写的二分法查找程序，dubug已经成功，但是算不出结果，求指导

回复:
user: user-1
content: 最后加上getchar();暂停下来才能看得到结果

user: user-2
content: #include<stdio.h>  int BinaryS(int b[],int s,int Arraysize);  int BinaryS(int b[],int s,int Arraysize) {     if (b[0]==s)         return 0;     else if(b[Arraysize-1]==s)         return Arraysize-1;     int L=0;     int R = Arraysize-1;     int Mid = L + (R-L)/2;      while(L<=R){         if(b[Mid]==s)             return Mid;         if(b[Mid]>s)             R=Mid-1;         if(b[Mid]<s)             L=Mid+1;         Mid=L+(R-L)/2;        }     return -1;  }  int main() {     int a[]={1,2,3,6,9,61,71,82,93,101,111,121,136};        int di=BinaryS(a,93,sizeof(a)/sizeof(int));     printf("Let us Start!!!\n");     printf("The Array point is: %d\n",di);      return 0;  } 代码应该没问题，问题可能出在输出之后立即退出了。试试加上system("pause");

user: user-3
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

user: user-4
content: 代码没有任何问题，VS2013编译通过，结果正确！！！
user-0 提问: 判断C语言数组内元素相等，下面程序为什么不行？

回复:
user: user-1
content: 问题是求相反数还是相同数

user: user-2
content: if(a[i]==a[j])\\这里的写法无法实现，但是写成（(a[i]+a[j])==0）就能实现\\    printf("相反数对数为 %d\n",count);           a[i] == a[j]   是相反数吗？

user: user-3
content: 程序可以呀，只是注意你的main函数是void型的，后面return 0应去掉，还有注释符号不是 \\ ，是 // 。

user: user-4
content: 思路有问题。i和j都应该是全循环，而不是固定的i排除最后一个，j排除第一个，因为每次要排除的位置并不固定。 i和j都全循环的情况下，只要判断a[i]==a[j] && i!=j就行了。 你说的换成加法能实现，估计也是巧合而已。
user-0 提问: 数据结构与算法 头插法创建单链表

回复:
user: user-1
content: 上面的链表创建都会有内存泄露的问题。  #include <stdio.h> #include <stdlib.h>  typedef struct node {     int data;     struct node *next; }Node, *LinkList;  LinkList CreateList(LinkList *L); void PrintList(LinkList L);  int main(void) {     LinkList phead = NULL;      CreateList(&phead);      PrintList(phead);      return 0;  }   LinkList CreateList(LinkList *L) {     if (!L)         return NULL;     LinkList p, s;     int i, len, data;      *L = (LinkList)malloc(sizeof(Node));     p = *L;     p->next = NULL;      scanf("%d", &len);      for (i = 0; i < len; i++) {         s = (LinkList)malloc(sizeof(Node));         scanf("%d", &data);         s->data = data;         s->next = p->next;         p->next = s;     }      return *L;  }  void PrintList(LinkList L) {     LinkList p = L->next;      while (p) {         printf("%d ", p->data);         p = p->next;     }     putchar(10); }    带哨兵的头插法创建链表demo。

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

user: user-3
content: 他这个只是头为空的时候赋值一下而已 你要是不用头节点可以不赋值 但是建议不要使用野指针
user-0 提问: 关于 线性表 数据结构 问题

回复:
user: user-1
content: 优先级应该跟链表排序有关 随机生成一个链表，类似链表的创建； 随机插入一个节点，那就是链表的插入操作， 随机删除，就是随机删除链表中的某个节点。

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

user: user-0
content: 每个元素除了关键字外，还有一个优先级。 关键字指的是？？

user: user-0
content: 我只学习了c语言，数据结构就看了链表，百度了优先队列看不大懂。好多都是用二叉树实现的，可以用数组，结构之类实现吗，由于题目要求只能用顺序存储结构的链表实现（静态链表是吧）
user-0 提问: 合并两个线性表，这个代码错在哪里，求大神指点。

回复:
user: user-1
content: 你怎么知道错了？

user: user-2
content: 写代码建议还是注意理解逻辑，Traverse函数是既有创建又有输出，所以对于lc线性表就不需要输入了，而是输出。 merge时，注意更新lc的length

user: user-2
content: #include <iostream> //#include<algorithm>  #include<stdio.h> #include <stdlib.h>  #define maxsize 100  using namespace std; struct List {     int *elem;     int length; };  void Init_list(List &l) {     l.elem = new int[maxsize];     if(l.elem==NULL) {         cout<<"动态分配失败"<<endl;         exit(1);     }     l.length = 0; } void Sort_list(List &l) {     for(int i=0; i<l.length; i++)         for(int j=0; j<l.length-i-1; j++)             if(l.elem[j]>l.elem[j+1])             {                 int temp;                 temp=l.elem[j];                 l.elem[j]=l.elem[j+1];                 l.elem[j+1]=temp;             } }  void Traverse_list(List &l) {     int n;     while(scanf("%d",&n) != EOF && l.length <= maxsize)    /*为了保证不越界，需要判断是否大于maxsize*/         l.elem[l.length++] = n;     Sort_list(l);     for(int i=0; i<l.length; i++)         cout<<l.elem[i]<<" ";     cout<<endl;     cout<<"该线性表的长度为："<<l.length<<endl; } void Merge_list(List la,List lb,List &lc) {     int *pa,*pb,*pc;     int *pa_last,*pb_last;      pa=la.elem;     pb=lb.elem;     pa_last = la.elem+la.length-1;     pb_last = lb.elem+lb.length-1;     pc = lc.elem;   /*初始化pc */     while(pa<=pa_last&&pb<=pb_last)     {         if(*pa <= *pb) {             *pc++=*pa++;             lc.length++;    /*增加lc的长度值*/         }         else {             *pc++=*pb++;             lc.length++;    /*增加lc的长度值*/         }     }     while(pa <= pa_last) {         *pc++=*pa++;         lc.length++;    /*增加lc的长度值*/     }     while(pb <= pb_last) {         *pc++ = *pb++;         lc.length++;    /*增加lc的长度值*/     } } int main() {     List l,la,lb,lc;     Init_list(l);     Traverse_list(l);     Init_list(la);     Traverse_list(la);     Init_list(lb);     Traverse_list(lb);     Init_list(lc);     Merge_list(la,lb,lc);     //Traverse_list(lc);     /*输出lc */     for(int i=0; i < lc.length; i++)         cout<<lc.elem[i]<<" ";     cout<<endl;      return 0; } 参考一下上面修改的代码吧。

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
user-0 提问: static作用消失了？

回复:
user: user-1
content: static 变量存在堆上       只初始化一次，，并没有释放掉

user: user-2
content: 第二个程序，a是局部变量，并且未初始化，这样做前置加加应该是随机值加1；所以不会是1，1，1 但是，这个随机值是上次程序留下的，每次调用foo函数，都会去上次的函数栈地址申请函数栈，所以上次的a是1，那么后面调用foo时也可能都是1了，这个不是一定的，是随机或者未定义的。

user: user-3
content: static 效果还是有的。 初始化一下吧。

user: user-4
content: 初始化之后，重新编译试一下。

user: user-5
content: static修饰的局部变量在bss 或者date段，不初始化数据为0；不初始化的局部变量的值是不确定的

user: user-6
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-7
content: static的作用是初始化函数之外的变量，也就是全局变量，你这样写本身就有问题

user: user-8
content: 不知道你是什么编译器 我的编译器会报错 不能使用为初始化的变量

user: user-9
content: 不会啊，我在TC3.0中运行，每次都是815（a未初始化，所以a的值不定）

user: user-10
content: 初始化……static会零初始化，正常的局部变量可不会。
user-0 提问: vs2010，c语言中的复数定义和使用1

回复:
user: user-1

user: user-2
content: 别用vs

user: user-3
content: C99提供complex.h #include <complex.h>试试

user: user-4
content: 引用 2 楼 赵4老师 的回复:#include <complex>  这是c++ 的，不是c的。  我也碰到了， 可能得自己写

user: user-5
content: #include <complex>
user-0 提问: C语言给单链表p加头节点报段错误，怎么解决？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  struct LNode {     char data;     struct LNode *next; };  //创建链表,count为创建的链表的节点数目 struct LNode *create(int count,char cdata[]) {     int i=0;     struct LNode *pNode = NULL;     struct LNode *pNewNode = NULL;     struct LNode *head = NULL;     //struct LNode *p=NULL;       //head->data = cdata[0]; /* 此处会导致段错误*/      for(i =0;i <count;i++)     {         pNewNode = (struct LNode*)malloc(sizeof(struct LNode));//分配节点空间         pNewNode->data = cdata[i];          if(head == NULL)    //指定头结点         {             head = pNewNode;             pNode = pNewNode;         }         else         {             pNode->next = pNewNode;             pNode = pNewNode;         }     }     pNode->next = NULL;       //head->next = p; //加了这句话就报错。注释掉就没问题了      return head; } head 指向NULL，那么这句/head->data = cdata[0];一定会导致段错误；那么head->next = p；也会出现段错误，我想在前面已经导致段错误，不会执行到这句； 以上是修改后的代码，可以参考一下；

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

user: user-3
content: head 若不malloc ，则只有4个字节    ，，，  你定义的结构体字节超过4 ，，，所以head无法存放过多东西

user: user-0
content: head 需要malloc一下才能用！
user-0 提问: 这个是socke网络聊天的服务端 存储客户端发来的信息和操作。没有报错 但是运行stuSeek用姓名查询这里出行了问题，弄了好久，到底是什么问题 求大神们帮个忙

回复:
user: user-1
content: if(pTemp=NULL) { break; } stuSeek中的这句改一下，if中的表达式是赋值表达式，而不是判断表达式； 改成如下：  if(pTemp==NULL) { break; }
user-0 提问: c/c++中%s的问题，只能打印第一个字符。。 不是因为\0吧， 求帮助！！！！！！！

回复:
user: user-1
content: s是输出字符串 你是int类型的line  不搭  int是四位 可能它误判成结束符了吧 不太懂 既然是输入字符为什么不用char

user: user-1
content: int是四个字节 char是一个字节

user: user-0
content: 自己先顶下，在线等，挺急的。。。。
user-0 提问: 大佬们帮我找找这个链表中关于查找元素的地方的错误！！

回复:
user: user-1
content: #include<stdio.h> #include<malloc.h> #include <string.h> #include<stdlib.h>  #define ok 1    /* delete ;*/ #define size 100    /* delete ; */ typedef char elemtype;  typedef struct Lnode {     elemtype data;     struct Lnode *next; }linklist;  void creatlist(linklist *&head,elemtype a[],int n)//尾插法建立线性表 {     linklist *p, *r;     int i;      head = (linklist*)malloc(sizeof(linklist));     r = head;     for(i=0;i<n;i++)     {         p = (linklist*)malloc(sizeof(linklist));         p->data = a[i];         r->next = p;         r = p;     }     r->next = NULL; } int locatedelem(linklist *&head, int i, elemtype &n)/* 缺少 &*/ {     int j = 1;     linklist *s;     s=head->next;     while(s&&j<i)     {         s=s->next;         j++;     }     n = s->data;     return 1; } int listinsert(linklist *&head,int z,elemtype e)//插入节点 {     int j=0;     linklist *p=head,*s;     while(j<z-1&&p!=NULL)     {         j++;p=p->next;     }     if(p==NULL)return 0;     else     {         s=(linklist *)malloc(sizeof(linklist));         s->data=e; s->next=p->next; p->next=s;         return 1;     } } int deleteelem(linklist *&head ,int j)//删除结点 {     int q=0;     linklist *p=head,*s;     while(q<j-1&&p!=NULL)     {         q++;         p=p->next;     }     if(p==NULL)return 0;     else {         s=p->next;         p->next=s->next;         free(s);         s=NULL;         return 1;     } } void DispList(linklist *head)   //输出线性表 {     linklist *p = head->next;     while(p) {         printf("%c",p->data);         p = p->next;     }     putchar(10); }  int converse(linklist *&head)//将链表就地逆序 {     linklist *p,*q;     p=head->next;     head->next=NULL;     while(p)     {         q=p;         p=p->next;         q->next=head->next;         head->next=q;     }      return ok; }  int main(void) {     int i,j,z;     char e;     char a[10];     printf("请输入要创建的链表：\n");     scanf("%s",a);     linklist *s;     creatlist(s, a, strlen(a));    /*第三个参数应该是实际输入的字符长度 */     printf("创建的链表为：\n");     DispList(s);     printf("\n");     printf("查找i号元素并输出,请输入I的值：\n");     scanf("%d",&i);     printf("第i号元素的数值是；\n");     locatedelem(s, i, e);    /*用e，而不要用n类型不匹配, 查找不正确主要是形参n前缺少& */     printf("%c\n", e);     printf("请输入要在z号位置前插入元素,并输入E的值，以空格隔开\n");     scanf("%d %c",&z,&e);     listinsert(s,z,e);     printf("现在的链表为：\n");     DispList(s);     printf("\n");     printf("请输入要删除的j号节点\n");     scanf("%d",&j);     deleteelem(s,j);     printf("现在的链表为：\n");     DispList(s);     printf("\n");     printf("逆序后的链表为：\n");     converse(s);     DispList(s);     return 0; } 宏定义不能加分号; 查找不正确，主要是形参n前缺少& 其他修改详见代码注释

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

user: user-3
content: n是int 你应该传char类型的吧 你想让值改变用引用传递
user-0 提问: 这是一段自己定义字符串函数strtok的代码，代码里面加粗的两行for循环里面的＊start这个判断条件去掉后好像有问题，求解答

回复:
user: user-1
content: 如果取消 *start 判断，在处理最后一个"you!"时，局部变量情况如下： start: "you!" q: " ,._" 此时下面的这个循环结束后将会导致start指向一个“不合适”的位置！(不一定非法，但并不是程序希望的位置。) for(;!strchr(q,*start);start++); 因为在start指向的"you!"范围内，都没有q对应的内容，所以函数strchr()在这个范围内都会返回NULL，然后start+++++++++就不知道加到哪里去了！ 如果加了*start的条件，就会在"you!"后面紧接着的'\0'处停下。
user-0 提问: 正则表达式匹配

回复:
user: user-0
content: 是不是说在C语言下，pcre库已经是最快， 会不会因为pcre作为一个通用库，比一些小型库速度慢， 我在github上也看了一些小型的regex engine ，，有没有可能从中找到更快的，，，

user: user-1
content: 使用release版
user-0 提问: 函数定义

回复:
user: user-1
content: void sum(int a, int b) {     printf(" %d ",  a + b);          return; }

user: user-2
content: int sum(int a, int b) {     int total;     total = a + b;     return total; } 这是函数定义。你代码中还有其他问题，先尝试着自己找，这样学起来效果更好
user-0 提问: 使用已经释放的指针变量问题

回复:
user: user-1
content: 不是“使用已经释放的指针变量问题”，而是“使用已经释放的内存问题”。 如果 free(w) 之后，又给w赋值了，w指向有效可用的内存区域，则 *w 就是可用的，没问题；否则就是问题

user: user-0
content: 非常感谢两位的讲解

user: user-2
content: 引用 2 楼 nanohappy1 的回复:本人菜鸟一枚，还请解释一下原理， 这个语句并没有 返回（return ）啊 我说的是有可能，条件是x是不等于0；因为w指向堆上的空间，free(w)；就是将堆上的空间释放掉，即空间不可用，使用free之后的空间是未定义行为，因为释放之后就是其他变量或者程序可以申请这部分空间，可以对这部分空间进行赋值等操作，那么再通过w使用这部分空间就会导致读到的数据是其他程序或者变量的值，如果通过w写，那么它会修改其他变量或者程序里变量的值。

user: user-0
content: 本人菜鸟一枚，还请解释一下原理， 这个语句并没有 返回（return ）啊

user: user-2
content: 有可能会返回已经释放的指针，因为： if(x){     free(w);    q = p; } 这儿有可能释放w
user-0 提问: VS2013 报错0x50D3134E (msvcr120d.dll) (ConsoleApplication16.exe 中)处有未经处理的异常:  0xC0

回复:
user: user-1
content: 引用 4 楼 GGlance 的回复:谢谢大神，你的方法是对的，用了你的方法就能输入，但是只输入一次，就卡了。有什么这方面的课程或者书籍推荐么？还是用不习惯VS2013@cfjtaishan 如果想继续学习C语言，可以看一些电子书<<C prime plus>>找一下这本书的最新版本看看，主要是多写，多调试，多思考。然后多做总结。

user: user-2
content: 我一般用  while(scanf("%d", &num) == 0){  //处理  }   进行读取

user: user-3
content: scanf_s("%5d", &stu[l].score);红字的是一个数值，而不是指针，而scanf_s要求那是一个指针，所以需要加入&

user: user-0
content: 谢谢大神，你的方法是对的，用了你的方法就能输入，但是只输入一次，就卡了。有什么这方面的课程或者书籍推荐么？还是用不习惯VS2013@cfjtaishan

user: user-0
content: 首先谢谢大佬们回答，确实是输入name时出现的问题，但是name是数组名，可以直接用啊，缺少参数是什么意思？不是很理解@cfjtaishan

user: user-4
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-1
content: for (i = 0; i <= 5; i++)  和 for (j = 0; j <= 5; j++) 数组已经越界了。 去掉=试试。 scanf_s("%s", stu[i].name, 10); 输入name缺少参数；
user-0 提问: c语言循环输入的时候，第一组数据和第二组数据一起输入了，但是最终显示出的数据顺序是对的，求大神指教！！！

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  struct students {     char name[10];     char number[10];     int score;     struct students *next; };  int main() {     int i,j,k;     struct students stu[5],*head,*p;     char n[10],no[10];      for(i=0;i<5;i++)     {         printf("input the information of %dth student:\n",i+1);         scanf("%s%s%d",n,no,&stu[i].score);    /* delete \n*/         strcpy(stu[i].name,n);         strcpy(stu[i].number,no);     }     head=&stu[0];     stu[4].next = NULL;     for(i=0;i<4;i++)     {         stu[i].next=&stu[i+1];     }     p=head;     printf("students list:\n");     while(p!=NULL)     {         printf("%s\t%s\t%d\n",p->name,p->number,p->score);         p=p->next;     } } 去掉scanf中的回车符；

user: user-2
content: 输入的东西，只要没有被scanf取走（扫描后符合%所对应的格式），也没有被清空（flush），还是要被下一次的scanf扫描的
user-0 提问: 递归的函数使用

回复:
user: user-1
content: 如果楼主能够将递归函数的原理理解了，这个问题就好结局了。  递归函数是不停的建立函数栈，根据栈的特性：先进后出； 那么先计算出来的是低位，然后逐步算出高位，先进后厨那么高位的0和1先出，低位的0和1后出。所以结果是楼主看到的现象。

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-3
content: 通俗点跟你说吧。 因为递归是在一个函数里面不断调用本函数，直到满足条件后调用的函数才返回。 一个函数调用另一个函数时，本函数会挂起在函数表中，执行调用函数直到遇到返回，本函数就继续。 所以你写的程序知道遇到n<2时才开始返回，返回前输出，所以是从个位数开始。  记得给分。
user-0 提问: 求助C语言关于定义变量的一个问题，多谢各位！

回复:
user: user-1
content: Linklist  &L是引用

user: user-2
content: 百度一下指针和引用的区别，相信比我们回答的更专业清晰

user: user-3
content: 在C++语言里，类型后面跟&表示后面声明的是变量的引用，也就是说传递实参变量本身而不是传拷贝。 C语言里没有引用，所以你的代码是c++语言。

user: user-4
content: 引用 9 楼 Steven_Lenny 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 这个是C++里的语法功能：引用，在C语言的编译器里是不支持的，编译的时候会报错； 如果想写成C语言识别的接口，可以改一下： void Initlist(Linklist *L, int n) {     *L = (Linklist)malloc(sizeof(Node));     (*L)->next = NULL; } 我试了一下，可是为什么这样编译不通过呢？[/quote] 用这样初始化还会提示和上次有一样的编译错误吗？ 注意，这样该形参，你的实参也要跟着改的，不然会提示类型不匹配。

user: user-0
content: 引用 7 楼 qq_29846883 的回复:百度一下指针和引用的区别，相信比我们回答的更专业清晰 嗯呐，多谢啦

user: user-0
content: 引用 8 楼 sdghchj 的回复:[quote=引用 6 楼 Steven_Lenny 的回复:] [quote=引用 3 楼 sdghchj 的回复:] 在C++语言里，类型后面跟&表示后面声明的是变量的引用，也就是说传递实参变量本身而不是传拷贝。 C语言里没有引用，所以你的代码是c++语言。 也就是说在这种用法下，在函数里面就可以改变main函数中定义的变量，而不需要用传递地址的方式吗[/quote] 嗯是的，但是是C++语法[/quote] 嗯嗯！多谢啦

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:这个是C++里的语法功能：引用，在C语言的编译器里是不支持的，编译的时候会报错； 如果想写成C语言识别的接口，可以改一下： void Initlist(Linklist *L, int n) {     *L = (Linklist)malloc(sizeof(Node));     (*L)->next = NULL; } 我试了一下，可是为什么这样编译不通过呢？

user: user-3
content: 引用 6 楼 Steven_Lenny 的回复:[quote=引用 3 楼 sdghchj 的回复:] 在C++语言里，类型后面跟&表示后面声明的是变量的引用，也就是说传递实参变量本身而不是传拷贝。 C语言里没有引用，所以你的代码是c++语言。 也就是说在这种用法下，在函数里面就可以改变main函数中定义的变量，而不需要用传递地址的方式吗[/quote] 嗯是的，但是是C++语法

user: user-0
content: 引用 3 楼 sdghchj 的回复:在C++语言里，类型后面跟&表示后面声明的是变量的引用，也就是说传递实参变量本身而不是传拷贝。 C语言里没有引用，所以你的代码是c++语言。 也就是说在这种用法下，在函数里面就可以改变main函数中定义的变量，而不需要用传递地址的方式吗

user: user-4
content: 这个是C++里的语法功能：引用，在C语言的编译器里是不支持的，编译的时候会报错； 如果想写成C语言识别的接口，可以改一下： void Initlist(Linklist *L, int n) {     *L = (Linklist)malloc(sizeof(Node));     (*L)->next = NULL; }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:引用  指针即地址 引用即别名  请问这样的情况下L是一个值，相当于通常情况下的*p，而&L是一个指针吗

user: user-0
content: 补充一下……在函数形参里面可以这么写，但是在函数里面再写 Linklist &p; 就发现报错，这是为什么呢？

user: user-5
content: 引用  指针即地址 引用即别名
user-0 提问: 为什么此题的答案为C,而不是D,哪位大神能给解释一下吗？

回复:
user: user-1
content: http://en.cppreference.com/w/c/io/fscanf

user: user-2
content: http://en.cppreference.com/w/c/io/fscanf

user: user-2
content: scanf返回值表示的是成功接收的参数个数，返回给str[i]肯定不对

user: user-3
content: D选项厉害了，scanf有没有返回值我不知道，不过这种写法我也是第一次见，str[i] 也不是地址吧 不过就算这种写法是正确的，那也不可能是正确答案，很明显这个需要一个字符一个字符的输入，不可能输入字符串吧 我咋感觉压根不能运行呢

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

user: user-5
content: 另外，D选项还有语法错误！

user: user-5
content: 因为gets是读取一行，即遇到回车符结束；并将除回车符以外的字符刷到缓存str中，并加上字符串结束'\0‘。（gets不会检查输入的数据会不会导致str越界） scanf是格式化读写，遇到空格就认为是一种格式的结束（但是%c比较特殊），所以scanf只输入了zhang，后面的没存放到str中 B选项能将'\n'放到str缓存中，并且没有加字符串结束标记。 D选项就是死循环，无法结束循环；
user-0 提问: vc6.00能运行的C语言程序在VS2017中得不到结果

回复:
user: user-1
content: 程序没问题，应该是编译器输出时需要处理一下。在Linux下不做修改也可以输出数据。

user: user-2
content: 或者像1楼说的那样，在main()函数的最后田间 system("pause"); 并且在源文件的起始位置处添加 #include <stdlib.h>

user: user-2
content: 没有VS2017，在VS2015上调试的。主要把scanf改为scanf_s,把printf()中表示宽度的数字进行了修改 void inputstu(struct student stu[]) { 	int i, j; 	for (i = 0; i<N; i++) 	{ 		printf("\n please input %d of %d\n", i + 1, N); 		printf("num:"); 		scanf_s("%s", stu[i].num, 6); 		printf("name:"); 		scanf_s("%s", stu[i].name, 8); 		for (j = 0; j<3; j++) 		{ 			printf("score %d", j + 1); 			scanf_s("%d", &stu[i].score[j]); 		} 		printf("\n"); 	} }   void printstu(struct student stu[]) { 	int i, j; 	printf("\nNo.Name Sco1 Sco2 Sco3\n"); 	for (i = 0; i<N; i++) 	{ 		printf("%3s%5s", stu[i].num, stu[i].name); 		for (j = 0; j<3; j++) 			printf("%-4d", stu[i].score[j]); 		printf("\n");  	} }

user: user-3
content: 在最末尾加一个system("pause");  可能要加头文件#include <process.h>
user-0 提问: 关于getchar（）函数的问题，求大神帮忙

回复:
user: user-0
content: 貌似scanf是会自动跳过换行符的吧

user: user-1
content: 如果用getchar();换成scanf("%c", &ch);那么你预想的情况就会出现。 getchar()；  引用 2 楼 a645328869 的回复:的确吃掉了。但是换行的ASCII是10，10-64=-54，不满足循环，没做什么事情。你在for循环外面写一个输出语句就看到变化了。 赞同，建议楼主在f=getchar();这句后面加上一句调试语句printf("%d\n", f); 你会发现会输出10（输出两行，但是其中一行是10）就是回车符；

user: user-2
content: 可以用getch来获取。 或者getchar后用fflush(stdiin)清理一下缓冲区。

user: user-3
content: 的确吃掉了。但是换行的ASCII是10，10-64=-54，不满足循环，没做什么事情。你在for循环外面写一个输出语句就看到变化了。
user-0 提问: ping www.baidu.com都用到了哪些协议

回复:
user: user-1
content: 首先将域名转成ip地址，要做DNS解析，那么走TCP或者UDP的53端口（DNS协议）；TCP或者UDP下面是IP。 然后是ping的ICMP。 所以最基本的就是这里的DNS协议，TCP/UDP/IP协议，ICMP协议。  如果还往局域网考虑，那么根据接的有线还是无线，可以有802.3和ARP；也可以是802.11协议簇。 如果往广域网考虑，那么可以有PPP，HDLC，ATM，X.25……。 如果是蜂窝网接入（手机3G/4G），那么还有移动网络的协议，这块不熟。

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 zjq9931 的回复:] TCP IP的 UDP协议啊。 DNS将域名转换成IP地址。 然后UDP协议发送数据接收数据。 我怎么记得ping包是ICMP协议呢，从底层向上一次为MAC, 数据链路层， IP层,ICMP协议层 www.baidu.com需要解析成IP地址，所以需要DNS协议[/quote] 确实我说的不对。这里看到了详细的过程。 http://blog.csdn.net/guoweimelon/article/details/50865642

user: user-2
content: TCP IP的 UDP协议啊。 DNS将域名转换成IP地址。 然后UDP协议发送数据接收数据。

user: user-3
content: 引用 1 楼 zjq9931 的回复:TCP IP的 UDP协议啊。 DNS将域名转换成IP地址。 然后UDP协议发送数据接收数据。 我怎么记得ping包是ICMP协议呢，从底层向上一次为MAC, 数据链路层， IP层,ICMP协议层 www.baidu.com需要解析成IP地址，所以需要DNS协议

user: user-4
content: 理解和讨论之前请先学会如何观察！  学会使用抓包软件比如wireshark

user: user-4
content: 百度搜相关关键字。
user-0 提问: 刚入门遇到了一点小问题= =

回复:
user: user-1
content: 1 产生原因 正如你所说，在scanf_s()中多了一个转义字符\n。在scanf_s中 “\n” 不是表示接受一个回车符，而是表示忽略所有的空白字符（包括回车,空格,tab ）。所以想要结束输入,输入任意一个非空白字符即可,但是该字符仍然会留在缓冲区中。 2 转义字符\n在scanf_s()中使用的时机 一般在输入字符时作为屏蔽回车键。例如 	scanf_s("%d", &a); 	scanf_s("%c", &b); printf("a=%d,b=%d\n", a, b); 输入1回车时，还没有输入字符，就输出了，如图所示  此时，a的值是1，b的值是10，即回车键 可以在scanf_s()中加入转义字符\n来屏蔽回车符 	scanf_s("%d\n", &a); 	scanf_s("%c", &b); printf("a=%d,b=%d\n", a, b); 此时，输入1回车a，如图所示  a的值是1，b的值是97，即'a' 3 拓展 不仅是转义字符\n能起到屏蔽回车的作用，空格键也可以实现该功能。 将上述代码改为 	scanf_s("%d ", &a); 	scanf_s("%c", &b); printf("a=%d,b=%d\n", a, b); 也能起到屏蔽回车的作用

user: user-0
content: 啊  我找到问题了= =%d后面的\n让程序多了一个换行  就要多输入一次

user: user-0
content: 我之前也是那么做的 用逗号分隔 输入的时候就加了逗号 但是还是需要输入一次确认后再随便输入一个数确认才能显示结果

user: user-0
content: 之后还是这个样子。大佬能指导一下么= =

user: user-2
content: scanf_s("%d%d\n", &a, &b,4);//这一块的代码决定的 %d%d//主要是这块，如果改成%d，%d那么就需要用逗号分隔，如果是空格，那就需要用空格分隔，因为你要连续输入两个数，如果少输入一个就不会向下继续执行

user: user-3
content: scanf  后面那个4你没看到吗？ 还有main 返回值不是void  吗，return 0不报错吗？  你可以试试输入 1空格2空格3enter
user-0 提问: 7道C语言面试题，7分钟完成。你能做对几道？

回复:
user: user-1
content: 第二个求i的值可能会有不同的值（不同编译器上编译）

user: user-2
content: 第4题应指定大小端及short的大小，题目中就有两个错误。不做也罢

user: user-3
content: [img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/25.gif][/img 卧槽！对比答案，我0分。。

user: user-4
content: 不经意的话可能就掉坑里了
user-0 提问: 链表中如何给所有的结点的data值初始化

回复:
user: user-1
content: 引用 5 楼 zihui0459 的回复:引用 4 楼 paschen 的回复:C语言的话就自己进行赋值，C++的话可以在构造函数中将data赋值为-1是每一个结点用的时候都得自己赋值吗  是的，你可以为创建节点写一个函数，函数中先创建，然后赋值，之后就只用调用这个函数就行

user: user-0
content: 引用 4 楼 paschen 的回复:C语言的话就自己进行赋值，C++的话可以在构造函数中将data赋值为-1是每一个结点用的时候都得自己赋值吗

user: user-1
content: C语言的话就自己进行赋值，C++的话可以在构造函数中将data赋值为-1

user: user-2
content: 这个。。。应该重写构造函数比较好吧。。 typedef struct LNode { LNode（） ：data(-1)  , next(nullptr) {}  int data; LNode*next; }LNode;

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

user: user-4
content: 创建链表节点时，初始化为-1. for example:  LNode *p = (LNode *)malloc(sizeof(*p)); if (!p) {     fprintf(stderr, "malloc error!\n");     exit(-1); } p->data = -1; p->next = NULL;
user-0 提问: 用SOCK_RAW(原始套接字)模拟SYN Flood攻击，目标主机不响应ACK+SYN数据报

回复:
user: user-1
content: IP头校验码不对

user: user-0
content: 引用 6 楼 赵4老师的回复:其实我也是略知皮毛。  现代中国人的能力差别很大程度上体现在会不会合理高效地使用百度上。 百度搜相关关键字。 我就是那个不会用百度的，有些问题在百度上搜不出来，这就很尴尬。

user: user-2
content: 其实我也是略知皮毛。  现代中国人的能力差别很大程度上体现在会不会合理高效地使用百度上。 百度搜相关关键字。

user: user-2
content: 《TCPIP详解卷一：协议》

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:《TCPIP详解卷一：协议》 请教一下赵老师，利用SOCK_RAW构造自己的TCP报文时，“IP数据报的首部校验和”以及“TCP报文的首部校验和”需要自己手动填写，还是内核自动填写？如果是手动填写，是不是要自己用C语言实现一个计算校验和的函数？

user: user-2
content: 智能路由器上可能有过滤功能。 学会使用抓包软件分析具体原因。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:防火墙…… 我在Kali Linux上运行这段程序，目标主机是Windows 2003虚拟机，打开80端口，关闭win主机的防火墙，可还是得不到ACK+SYN响应。 你说是防火墙的原因，那为什么正常HTTP访问的SYN请求能建立连接？而我构造的SYN数据包不能。 我对比了一下这两个数据报，它们有差异：正常的SYN请求报文66字节，而我构造的SYN数据报60字节。 我也检查了它们的TCP首部和IP首部字段，都没问题啊，百思不得其解。。。

user: user-2
content: 防火墙……
user-0 提问: C语言的函数名字的有效长度是多少

回复:
user: user-1
content: C89标准　　C99标准 内部标识符中的有效字符个数　　31　　　　　63 外部标识符中的有效字符个数　　6　　　　　 31

user: user-2
content: 一般见名知义就好了，

user: user-3
content: 255   ........

user: user-4

user: user-5
content: https://docs.microsoft.com/en-us/cpp/c-language/c-identifiers Microsoft Specific Although ANSI allows 6 significant characters in external identifier names and 31 for names of internal (within a function) identifiers, the Microsoft C compiler allows 247 characters in an internal or external identifier name. If you aren't concerned with ANSI compatibility, you can modify this default to a smaller or larger number using the /H (restrict length of external names) option. END Microsoft Specific  总的来说，标准（这里引用的应该是C89标准）指明了最小要支持的长度，任何支持标准的编译器实现，至少得遵循这个最小长度；然后特定的编译器实现，比如这里的微软C编译器，可以支持更长。  http://en.cppreference.com/w/c/language/identifier 这里有对C99前后的标准差异有描述。

user: user-6
content: 每个编译器对函数名字的长度要求都不一样，但是每个项目都有各自的编码规则，一般是不超过30个字母

user: user-7
content: 现在的C编译器一般都支持C++， 支持的函数名啥的有效长度非常非常大，  简单的测试了下 ， VS 大约 4K 个字符，   gcc 几百K 都没问题， 不过你写个 上百字符的函数名可能被人打死 ....

user: user-8
content: 函数名和变量名一样，都会有字符数限制。所以，建议函数名能做到见名知意即可，有时为了减少名字长度还会考虑使用单词缩写，当然这些单词缩写也是大家都这么用，都了解，看到单词缩写就明白其意思。

user: user-8
content: 函数名和变量名的长度都会有限制的，不要使用太长的变量名，例如50个字符，这很难阅读，而且可能超出一些编译器的限制； 有些公司或者机构对于编码都会有要求，比如每行不超过80个字符（包括前面换行的空格或者tab），这个是GNU内核有这样的要求。

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

回复:
user: user-0
content: 还有就是i==5时的break..我是复制了前次没修改过的代码，修改了的就没有这个错误了

user: user-0
content: 啊哈谢谢各位大神，知道怎么解决了！对，就是sum应该赋予另外一个值，因为它会变！

user: user-1
content: 百度搜“倒推法”

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> int main() {     int sum, i, peachs;     for (peachs = 0; peachs < 10000; peachs++)     {         sum = peachs;         for (i = 0; i < 5; i++)         {             if (sum % 5 == 1)                 sum = sum - (sum / 5) - 1;             else                 break;         }         if (i == 5) {   /*加上大括号*/             printf("最小的数目是：%d\n", sum);             break;         }     }      return 0; } 参考一下吧。 当算出最小数目的桃子时就要break出去，所以当i == 5时才要break;所以这个也是为什么一直没有输出，因为当sum == 0时，就break出外循环了。正解！~

user: user-3
content: 我好像看错了呀~~  好尴尬~

user: user-4
content: #include<stdio.h> int main() {     int sum, i, peachs;     for (peachs = 0; peachs < 10000; peachs++)     {         sum = peachs;         for (i = 0; i < 5; i++)         {             if (sum % 5 == 1)                 sum = sum - (sum / 5) - 1;             else                 break;         }         if (i == 5) {   /*加上大括号*/             printf("最小的数目是：%d\n", sum);             break;         }     }      return 0; } 参考一下吧。 当算出最小数目的桃子时就要break出去，所以当i == 5时才要break;所以这个也是为什么一直没有输出，因为当sum == 0时，就break出外循环了。

user: user-3
content: 算法是对的   里面的变量sum出了问题， sum作为循环条件，你每一次都在循环里面改变了sum的值 你可以跟踪一下sum变量， 看看它值的变化， sum肯定不是从1一直往上加的  解决办法： sum 作为循环变量 不要改变它 只用sum++操作，另外定义一个变量进行判断  如果解决了问题，还请给点分

user: user-5
content: 应该逆向思考吧  	int sum = 1; 	for (int i = 0; i < 5; i++) 	{ 		sum = (sum * 5 + 1); 	}
user-0 提问: 请问 全局变量赋初值是在什么阶段

回复:
user: user-1
content: 操作系统加载exe时。

user: user-2
content: 程序退出后，程序里所申请的空间，不论是栈上的，堆上的，还是数据段上的都会被释放。这个我们看不到，是系统负责处理的。 所以，再次运行时，就会重新申请，重新赋值等等。 所以每次执行都是一样的

user: user-3
content: 你多次运行你main函数，main对全局变量的改变会保存下来吗？每次运行main之前才分配赋值吧

user: user-4
content: 全局变量在main之前就申请好的。

user: user-5
content: 程序加载的时候，进入Main之前。 如果你会C++，可以在C++里自定义一个类，然后在类的构造函数中打印一个信息。 用这个类，定义一个全局变量。 看什么时候打印出构造函数信息，就是什么时候执行的。 下面的代码供参考：  #include <iostream> using namespace std;  class abc { public: 	abc(); 	~abc();  private:  };  abc::abc() { 	cout << "abc Init" << endl; }  abc::~abc() { 	cout << "abc destroy" << endl; }  abc a; int main() { 	cout << "main" << endl; 	return 0; }
user-0 提问: 指针新手求问大神个问题

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: void ptr_subtraction_001 (){      int buf1[10];      int buf2[5];      intptr_t offset;      offset = buf1 - buf2;      sink = offset; } 从这几条语句看不出问题来，offset就是得到buf1和buf2的便宜量，可能的值是10 * 4 = 40个字节；是不是代码没有贴全？

user: user-2
content: void ptr_subtraction_002 () {     int x= 10;     int *ptr = &x;     int *buf = (ptr);     *buf = 20; /*重写x变量的值*/ } 这样写没问题，就是将变量x的值由10改成20，就是用20覆盖原来的10.
user-0 提问: stack和dqueue的底层是什么

回复:
user: user-1
content: 感谢各位大神

user: user-2
content: 数据结构啊。

user: user-3
content: 如果你指的是标准库的stack和queue的话，底层默认是deque，当然你也可以自己指定，比如  std::stack<int> s; // 底层是默认的deque std::stack<int, std::vector<int>> s; // 底层是vector  只要满足相应要求即可。  具体要求见 stack queue

user: user-4
content: 一般而言是链表，其他的我不清楚你想问什么。

user: user-5
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。
user-0 提问: 求助：将结构体地址作为函数形参，但在函数中无法读取内存参数

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: 代码贴的不全。

user: user-0
content: 已找到解决方法
user-0 提问: 求dos系统下的矢量汉字库的库文件

回复:
user: user-1
content: 这里有： https://blog.twofei.com/embedded/hzk.html  TC（Turbo C）老代码（比如小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。  楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-2
content: C源代码:显示指定字符在指定字体中对应的由直线段和Bezier曲线段组成的笔划形状的命令行工具FontPath http://download.csdn.net/download/zhao4zhong1/6588091
user-0 提问: 萌新小白求大神解决char 与 ASCⅡ的问题

回复:
user: user-1
content: 为什么不阅读printf的源代码crt\src\output.c呢？

user: user-2
content: 直接用printf的%c输出即可。或者用putchar(a);也是可以的。 变量b也是可以用着两种方式打印出来。

user: user-3
content: 直接输出到控制台就可以了 printf....  控制台会显示   输出试一试 实践才是验证真理的唯一标准

user: user-4
content: 动手实验就好了啊 换行的那个：  printf("%c",a);  蜂鸣的那个确实是： printf("%c", beep); 就可以。

user: user-5
content: 直接把你想输入的打印出来试试，用printf

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: 很困惑，希望对你有帮助
user-0 提问: scanf

回复:
user: user-0
content: 各位都是大神666

user: user-1
content: 引用 2 楼 cfjtaishan 的回复:如果想获取一行里的所有字符放到缓存里，建议使用fgets函数。 scanf遇到空格就认为是下一个格式的字符了，除了%c  char buf[80]; fgets(buf, 80, stdin);   char buf[80]; fgets(buf, 80, stdin); if ('\n'==buf[strlen(buf)-1]) buf[strlen(buf)-1]=0; //去掉buf末尾的\n，如果有

user: user-2
content: 如果想获取一行里的所有字符放到缓存里，建议使用fgets函数。 scanf遇到空格就认为是下一个格式的字符了，除了%c  char buf[80]; fgets(buf, 80, stdin);

user: user-3
content: scanf(“%[^\n]”,str);输入回车就代表输入完成。这样就可以输出hello word了
user-0 提问: '=' : cannot convert from 'char *' to 'char'

回复:
user: user-1
content: #include<stdio.h>  char *sm(int i,char o[20]);  int main() {     char *m;    /*定义位char *类型*/     int len=1;     char l[20]={"adasdas"};     m=sm(len,l);     printf("%s",m);     return 0; } /*该函数没有意义呢，数组名可以看成指针常量*/ char *sm(int i,char o[20]) {     char *p;     p=o;     return p; }

user: user-2
content: 2楼是正确答案 不过这函数确实没啥意义 不如直接 char *m; char l[20] = {"  123"}; m = l;

user: user-3
content: 不过主要错在char m;

user: user-4
content: char m; ===>char* m

user: user-3
content: 数组不能传值，会自动转成相对应的指针
user-0 提问: CodeBlocks怎么设置编辑器

回复:
user: user-1
content: 参考Quake3源代码。

user: user-2
content: 你说的是编译器吧，预先装好GCC或者VS，codeblocks能检测到的。 游戏开发中C++就是一个开发工具啊
user-0 提问: C语言 文件读取……

回复:
user: user-1
content: 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 引用 1 楼 zjq9931 的回复:这两句不用取地址，因为数组名，本身就已经是首地址了。  		scanf("%s", stu[i].num);	//不用取地址 		scanf("%s", stu[i].name);	//不用取地址  赞同。 对于这类问题，建议楼主在写文件前，先将其输出到终端，这样可以判定写入的是什么数据。

user: user-3
content: stu[i].num已经表示num数组的首地址了，你又取地址就没必要了，直接stu[i].num就好了

user: user-4
content: 这两句不用取地址，因为数组名，本身就已经是首地址了。  		scanf("%s", stu[i].num);	//不用取地址 		scanf("%s", stu[i].name);	//不用取地址
user-0 提问: 新手，想问问这两者执行为什么有差异

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 楼主的代码中，修改这一处：if(s[i]>='0' && s[i]<='9') 之后，两种写法应该就是一致的了。

user: user-3
content: #include<stdio.h> #include<conio.h>  void fun(char *s) {     int i,j;      for(i=0,j = 0;s[i]!='\0';i++)         if(s[i] >= '0' && s[i]<='9')    /*此处判断有误，应该用i遍历字符串，用j存放数字。*/             s[j++]=s[i];     s[j]='\0'; }  int main(void) {     char item[80];      gets(item);     fun(item);     puts(item);     return 0; } 用gets不够安全，建议使用fgets函数代替gets

user: user-4
content: 你代码有问题，改成 if(s[i]>='0' && s[i]<='9') 代码原理是把数字放到原数组，因为数字个数肯定不会大于所有字符个数，所以用j当统计数字字符的下标，会小于等于i最后添加个尾零，输出。

user: user-5
content: 不好意思，刚才楼上的解答严重有问题。 s[j++]=s[i]; 可以拆分成两步，第一步是s[j] = s[i]，第二步是j++，就相当于if(s[j]>='0' && s[i]<='9')这个条件下有两步要执行。  楼主写成下面这样，就表示if(s[j]>='0' && s[i]<='9')这个条件下有只有s[j] = s[i]这一句了。  for(i=0,j=0;s[i]!='\0';i++，j++)         if(s[j]>='0' && s[i]<='9')           s[j]=s[i];

user: user-5
content: 做了一下调试： 下面的代码输出的是原封不动的数组。  #include<stdio.h> #include<conio.h> void fun(char *s) { 	int i,j; 	for(i=0,j=0;s[i]!='\0';i++) 	{ 		if(s[j]>='0' && s[i]<='9') 			s[j]=s[i]; 			j++; 	}	 	s[j]='\0'; } void main() { 	char item[80]; 	gets(item); 	fun(item); 	puts(item); }  但是下面的代码会只输出数字字符：  #include<stdio.h> #include<conio.h> void fun(char *s) { 	int i,j; 	for(i=0,j=0;s[i]!='\0';i++) 	{ 		if(s[j]>='0' && s[i]<='9') 			s[j++]=s[i]; 	}	 	s[j]='\0';  } void main() { 	char item[80]; 	gets(item); 	fun(item); 	puts(item); }  做对比就应该清楚：s[j++]=s[i]; 执行的是j++，再执行的是赋值。
user-0 提问: C++指针问题  超级简单的 求大佬解释一下

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: 链表操作，end_ptr这个缺少定义，这个链表是尾插法，即每次新节点都是在链表的尾部插入链表。end_ptr是指向尾节点。

user: user-3
content: 这个应该是链表操作吧？你可以去看看c语言关于链表的实现

user: user-4
content: 这个得问出来，哪里不明白。
user-0 提问: C语言调用java JNI_CreateJavaVM只能调用一次

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-0
content: 这是我的执行结果，除了第一条执行了jar包中的代码，之后的两条都没有执行
user-0 提问: C调用java JNI_CreateJavaVM只能调用成功一次

回复:
user: user-0
content: 在执行c调用java的过程中只要执行一次JNI_CreateJavaVM，结束之后在执行DestroyJavaVM，不要把JNI_CreateJavaVM执行多次

user: user-1
content: 你好，关于用jni调用java虚拟机，JNI_CreateJavaVM后，DestroyJavaVM，然后在JNI_CreateJavaVM出错了，返回-1，这个要怎么解决，还望指点一二，谢谢

user: user-0
content: 因为代码开发的是dll文件 ，不能单独初始化，  我选择将java虚拟机做成静态，但是注销虚拟机这个操作就没法进行了。感谢大家的帮助，这个贴我结了！

user: user-2
content: jvm 在进程内就是只能初始化一次的， 你把jvm寄宿从功能调用中分离出来单独初始化

user: user-3
content: 直接通过命令行调用更简单： java -jar xxx.jar param1 param2... >out.txt 其中param1等是传入的命令行参数，数据可以作为参数传入，或者作为文件名传入。 然后通过读取out.txt获取它的运行结果。

user: user-4
content: c语言通过读写临时文本文件，间接调用java写的读写相同临时文本文件并调用jar包的程序。

user: user-0
content: 您好 ，   跨语言并非我所愿，只是因为需求是这样的，本来运行IBM的optim的脱敏函数接口是用C语言开发的。但是客户需要我们用他们的算法，而且不给算法我们，只给我一个jar包让我们调用，现在大部分难点都慢慢解决了 ，但是卡在c语言重复调用jar包的问题上了，希望赵老师能给我提供一点思路

user: user-4
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问: 自定义取整数各位数函数计算错误

回复:
user: user-1
content: int divNum[4]; void intGet(int pInt) {     int i;     for (i = 0; i < 4; i++) {         divNum[i] = pInt %  10;         pInt /= 10;     } } 上面的有误，用这个吧

user: user-1
content: int divNum[4]; void intGet(int pInt) {     divNum[0] = pInt%10;     divNum[0] = pInt/10%10;     divNum[0] = pInt/100%10;     divNum[0] = pInt/1000%10; } 都把每个整数值赋值给divNum[0],这怎么可以呢。  int divNum[4]; void intGet(int pInt) {     int i;     for (i = 0; i < 4; i++)         divNum[i] = pInt % ((i + 1) * 10); } 参考一下这个。

user: user-2
content: 首先, 数组序号全部都是0   再有 int divNum[4];   这个变量的位置很关键. 既然是一个函数, 并且固定是4位数.  那么你可以把这个传进去. void intGet(int *divNum,  int pInt) {     divNum[0] = pInt%10;     divNum[1] = pInt/10%10;     divNum[2] = pInt/100%10;     divNum[3] = pInt/1000%10; }

user: user-3
content: divNum[0] = pInt%10;     divNum[1] = pInt/10%10;     divNum[2] = pInt/100%10;     divNum[3] = pInt/1000%10;
user-0 提问: 请帮我解释一下这个程序，最后结果是咋得到的

回复:
user: user-0
content: @zjq9931,谢谢您的解答，我明白了

user: user-0
content: @sty_app,谢谢您的解答，我明白了，

user: user-1
content: 引用 5 楼 mongoose_tonny 的回复:您好，根据您的解答运行结果应为7,8 可是最终的运行结果为8,8，这个该如何解释 8,8啊。++ptr已经变成指向8了啊，

user: user-0
content: 您好，根据您的解答运行结果应为7,8 可是最终的运行结果为8,8，这个该如何解释

user: user-1
content: #include <stdio.h>  void main( )  {              int arr[]={6,7,8,9,10};            int *ptr=arr;  //指向6           *(ptr++)+=123;    //指向7+123           printf("%d,%d",*ptr,*++ptr); //从右向左的顺序都指向了8  }

user: user-2
content: 引用 1 楼 qq_38204686 的回复:一开始指向6 +=123这句 运行完指针加一 指向7 最后一句输出 前++ 先加一后输出 指向8  分清 ++前后位置的不同意义就可以 详情可以百度 简单明了

user: user-3
content: 建议对指针操作时，不要合并语句，难以理解不说还容易出错。 楼主，把握好前++和后++的执行顺序就很容易理解了，你的代码实际执行为如下：  #include <stdio.h> void main( ) {   	int arr[]={6,7,8,9,10}; 	int *ptr=arr;  	/* 此语句拆分：*(ptr++)+=123;  */ 	*ptr += 123; ptr++; 	/* 词语句拆分：printf("%d,%d",*ptr,*++ptr);*/ 	++ptr; printf("%d,%d",*ptr,*ptr); }

user: user-4
content: 一开始指向6 +=123这句 运行完指针加一 指向7 最后一句输出 前++ 先加一后输出 指向8  分清 ++前后位置的不同意义就可以 详情可以百度
user-0 提问: c 的问题

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: static int callback_text(void *notused,int argc,char **argv,char **azcolname) {    char *item="NULL";     *((char *)notused=argv[0]?argv[0]:item;     if (argv[0])         strcpy(notused, argv[0]);     else         strcpy(notused, item);    printf("ss--->%p,%s\n",notused,*((char *)notused));     return 0; }

user: user-3
content: 你参数是按值传递的，只能更改指针指向的内容，更改指针本身没有效果

user: user-4
content: 首先在a.c里面的这一句 p="aaaa"; 已经改了p的值了。  这一句，也不用这么崎岖： *((char *)notused=argv[0]?argv[0]:item; 直接 notused = argv[0]?argv[0]:item;就好了。 用printf输出的时候，也只要这样就好了 printf("%s", (char*)notuse);

user: user-5
content: 你把p又指向了一个常量的位置，函数返回当然出错了，你应该在修改p指向内存的值，不能p="aaaa"；这样做 可以这样  char *p=malloc(sizeof(char) * 32); strcpy(p, "aaaaaa");  但是要注意内存的释放，否则会造成内存泄露！
user-0 提问: 从记事本里按行读取字符串问题

回复:
user: user-0
content: 引用 1 楼 zjq9931 的回复:上代码。  #include<stdio.h> #include<stdlib.h> #include<time.h> #define length 10  char *creat(char *str) {  	int i;  	for (i = 0; i < length; i++) 	{ 		switch (rand() % 3) 		{ 		case 0: 			str[i] = rand() % 26 + 'a'; 			break; 		case 1: 			str[i] = rand() % 26 + 'A'; 			break; 		case 2: 			str[i] = rand() % 10 + '0'; 			break; 		} 	}   	FILE *fp; 	if ((fp = fopen("ggg.txt", "a")) == NULL) 		printf("ERROR"); 	fprintf(fp, "%s\n", str); 	puts(str);	// 输出一下，看存入文件的是什么顺序 	fclose(fp);  	return str; }  void main() { 	srand((unsigned)time(0));  	char str[length + 1] = { 0 }; 	char str1[length + 1] = { 0 }; 	char str2[length + 1] = { 0 };  	FILE *fp; 	if ((fp = fopen("ggg.txt", "w")) == NULL) 		printf("ERROR");  	fclose(fp);   	puts("生成顺序："); 	creat(str); 	creat(str1); 	creat(str2);  	char s1[length+1] = { 0 }; 	char s2[length + 1] = { 0 }; 	char s3[length + 1] = { 0 };  	int i = 0, j, k, r = 0, t = 0, y = 0; 	 	puts("读取顺序1："); 	FILE *pfl; 	pfl = fopen("ggg.txt", "rb"); 	fgets(s1, 10, pfl); 	while(!feof(pfl)) { 		printf("%s", s1); 		fgets(s1, 11, pfl); 	} 	fclose(pfl);   	puts("读取顺序2："); 	FILE *fp3; 	fp3 = fopen("ggg.txt", "r"); 	for (i; i < 11; i++)	//读取11个字符？ 	{ 		fscanf(fp3, "%c", &s1[i]); 		printf("%c", s1[i]); 	} 	//for (j = i; j < 22; j++)	// 在读取22个字符？ 	//{ 	//	fscanf(fp3, "%c", &s2[j]); //s2只有11个字符的空间限制的j已经大于11了会越界访问，下面的s3也一样，所以才会出错，从0开始才对 	//	printf("%c", s2[j]); 	//} 	//for (k = j; k < 33; k++)	//上面已经把文件读完了，还要读取？ 	//{ 	//	fscanf(fp3, "%c", &s3[k]); 	//	printf("%c", s3[k]);  	//}  	fclose(fp3); } 我想读出来的字符串能用三个数组分别存着

user: user-1
content: 上代码。  #include<stdio.h> #include<stdlib.h> #include<time.h> #define length 10  char *creat(char *str) {  	int i;  	for (i = 0; i < length; i++) 	{ 		switch (rand() % 3) 		{ 		case 0: 			str[i] = rand() % 26 + 'a'; 			break; 		case 1: 			str[i] = rand() % 26 + 'A'; 			break; 		case 2: 			str[i] = rand() % 10 + '0'; 			break; 		} 	}   	FILE *fp; 	if ((fp = fopen("ggg.txt", "a")) == NULL) 		printf("ERROR"); 	fprintf(fp, "%s\n", str); 	puts(str);	// 输出一下，看存入文件的是什么顺序 	fclose(fp);  	return str; }  void main() { 	srand((unsigned)time(0));  	char str[length + 1] = { 0 }; 	char str1[length + 1] = { 0 }; 	char str2[length + 1] = { 0 };  	FILE *fp; 	if ((fp = fopen("ggg.txt", "w")) == NULL) 		printf("ERROR");  	fclose(fp);   	puts("生成顺序："); 	creat(str); 	creat(str1); 	creat(str2);  	char s1[length+1] = { 0 }; 	char s2[length + 1] = { 0 }; 	char s3[length + 1] = { 0 };  	int i = 0, j, k, r = 0, t = 0, y = 0; 	 	puts("读取顺序1："); 	FILE *pfl; 	pfl = fopen("ggg.txt", "rb"); 	fgets(s1, 10, pfl); 	while(!feof(pfl)) { 		printf("%s", s1); 		fgets(s1, 11, pfl); 	} 	fclose(pfl);   	puts("读取顺序2："); 	FILE *fp3; 	fp3 = fopen("ggg.txt", "r"); 	for (i; i < 11; i++)	//读取11个字符？ 	{ 		fscanf(fp3, "%c", &s1[i]); 		printf("%c", s1[i]); 	} 	//for (j = i; j < 22; j++)	// 在读取22个字符？ 	//{ 	//	fscanf(fp3, "%c", &s2[j]); //s2只有11个字符的空间限制的j已经大于11了会越界访问，下面的s3也一样，所以才会出错，从0开始才对 	//	printf("%c", s2[j]); 	//} 	//for (k = j; k < 33; k++)	//上面已经把文件读完了，还要读取？ 	//{ 	//	fscanf(fp3, "%c", &s3[k]); 	//	printf("%c", s3[k]);  	//}  	fclose(fp3); }
user-0 提问: 我认为结果为a=5,b=0 哪位大神能给解释一下吗，谢谢！

回复:
user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！哈哈，跟你们讲有时候我都觉得赵四老师疯了，可是一想呢，又觉得说的很有道理

user: user-2
content: 引用 7 楼 Rocco01 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！哈哈，跟你们讲有时候我都觉得赵四老师疯了，可是一想呢，又觉得说的很有道理[/quote] 实践是检验真理的唯一标准。

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

user: user-3
content: do while循环只会执行一次，因为b--<0条件决定的。 执行完do while体后，a = 2, b = 9; 然后执行判断条件，b-- < 0即判断9 < 0吗？，然后再执行b--；即b = b -1; 所以结果是a = 2, b = 8;

user: user-4
content: 建议你单步跟踪程序运行，观察每一步执行后变量变化情况，比给你解释你更容易理解

user: user-5
content: 建议楼主学会设置断点调试

user: user-6
content: 你循环条件错了，改成b-->0就是你的答案了

user: user-7
content: 你是怎么认为出来的...  首先这个循环体只会执行一次, 所以等价于  int a=1,b=10; b−=a;  // b = 9 a++;    // a = 2 b−−;    // b = 8