Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言 为什么我这个gets语句没有执行

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:第一个可以正常输入，后面的就直接跳过。这个是gets的问题，gets遇到回车符会结束输入，第一次输入的%d之后会有一个回车符停留在stdin缓存里，所以再次gets时，遇到了这个回车符，就直接返回了；所以，就什么也没输入。 解决办法，直接在scanf后加一句：getchar();用于接收stdin里的回车符。下次gets就可以正常接收输入了。  谢谢啊！行了。对于学Java的我，遇到这个问题只能一脸懵逼。

user: user-1
content: 第一个可以正常输入，后面的就直接跳过。这个是gets的问题，gets遇到回车符会结束输入，第一次输入的%d之后会有一个回车符停留在stdin缓存里，所以再次gets时，遇到了这个回车符，就直接返回了；所以，就什么也没输入。 解决办法，直接在scanf后加一句：getchar();用于接收stdin里的回车符。下次gets就可以正常接收输入了。
user-0 提问: include一个很长的路径，能否通过宏或者其他手段表示可重用的部分？

回复:
user: user-1
content: 在项目属性中包含目录里添加：../../../project 这一部分，然后include的时候就直接写文件名，不用前面的那些了

user: user-2
content: 建议楼主了解一下代码生成技术。

user: user-3
content: 引用 4 楼 super_admi 的回复:我估摸着，你这部分：project/header.h应该是固定的，但前面是变动的。  所以，这部分应该可以直接写在宏里面，而前面部分，作为宏的一个参数。那是行不通的  #include "这个并不是字符串"

user: user-0
content: 谢谢楼上各位，我用的是Qt项目，INCLUDEPATH增加project的路径就可以了  引用 4 楼 super_admi 的回复:我估摸着，你这部分：project/header.h应该是固定的，但前面是变动的。  所以，这部分应该可以直接写在宏里面，而前面部分，作为宏的一个参数。 我试过用宏来代替，但是gcc编译器貌似不允许使用宏来组合头文件路径，这个要怎么做？

user: user-4
content: 我估摸着，你这部分：project/header.h应该是固定的，但前面是变动的。  所以，这部分应该可以直接写在宏里面，而前面部分，作为宏的一个参数。

user: user-5
content: Makefile里，可以通过-I指定头文件路径

user: user-6
content: VS在工程配置中的包含路径把该路径填入  gcc等可以使用Makefile吧
user-0 提问: 有一个问题怎么也搞不明白，求各位解惑

回复:
user: user-1
content: unsigned char 和 char 运算时转换成 int

user: user-2
content: 隐式类型转换，int

user: user-0
content: 引用 1 楼 u010165006 的回复:unsigned char 和 char 运算时转换成 int 我懂了，谢谢你的解答

user: user-3
content: 你第一次int的值都是-1 第二次第一个的值是255 第二个值是-1 当然返回0咯
user-0 提问: 结构体的成员变量如果类型各不相同的话是不是不能用这种方式初始化？

回复:
user: user-1
content: 引用 2 楼 xiaoleecr 的回复:[quote=引用 1 楼 cfjtaishan 的回复:]  struct entry e = { 0, NULL};   我这样写，报错了[/quote] 我写的方式是定义时初始化，否则是会报错的。

user: user-2
content: 引用 2 楼 xiaoleecr 的回复:[quote=引用 1 楼 cfjtaishan 的回复:]  struct entry e = { 0, NULL};   我这样写，报错了[/quote] 可以这样 	a1 = (struct entry){100, &a2}; 这是C99开始支持的结构体常量（字面量）

user: user-2
content: 引用 2 楼 xiaoleecr 的回复:[quote=引用 1 楼 cfjtaishan 的回复:]  struct entry e = { 0, NULL};   我这样写，报错了[/quote] 你这不叫初始化，叫赋值

user: user-0
content: 引用 1 楼 cfjtaishan 的回复: struct entry e = { 0, NULL};   我这样写，报错了

user: user-1
content: struct entry e = { 0, NULL};
user-0 提问: C语言入门经典书中的一个例子，在VS2017里编译出错~

回复:
user: user-1
content: 编译器已经提示出问题所在了，建议你查一下相关函数的使用，尤其是参数类型和个数。 可以利用这次机会熟悉一下这些函数的调用。

user: user-2
content: https://msdn.microsoft.com/en-us/library/ftsafwz3.aspx
user-0 提问: 有关C语言的一些有名的算法问题

回复:
user: user-1
content: 数据结构            多看多练

user: user-2
content: 算法和语言基本没关系 自己做点小项目吧。。

user: user-3
content: 《数据结构（C语言描述）》 《算法精解（C语言描述）》

user: user-4
content: 算法不是一个简单的问题，如果研究起来可以作为一门高深的专业课。可以找本算法导论看看，图书馆里应该有

user: user-5
content: 数据结构

user: user-6
content: 算法和语言无关
user-0 提问: 多项式环上的扩展的欧几里得算法C语言代码实现      改了半天无奈水平实在太差，在网上搜的，请各位大神帮忙改下

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

回复:
user: user-1
content: struct things   //物品结构体 {     int id;//编号     char name[50];//名字     char time[20];//朝代     char introduce[300];//简短介绍     double price;//价格     struct things * next;//指向下一个物品的指针     struct yonghu *yonghu;//指向用户的指针  } thing1,*pp1;//一个物品,一个指向物品结构体的指针

user: user-2
content: 这个结构体定义了两个变量：结构体变量thing1和结构体指针pp1； 除了next指针和yonghu指针之外，其他的结构体成员都是比较好理解的。 next指针是用于指向下一个节点的指针，yonghu是在该结构体里嵌套了另一个结构体；
user-0 提问: 请精通C语言的前辈解答一下。

回复:
user: user-1
content: 引用 4 楼 u010165006 的回复:C语言诞生于上个世纪70年代，那个时候的硬件配置是极低的，对性能要求很苛刻。而且那时候的计算机用户都是很专业的，很少考虑编程爱好者的需求。 尤达大师只用光剑，不用机关枪！

user: user-2
content: 安全检查与用途有关，如果追求性能和代码短小就可以不要，追求安全性、可靠性就要，像Delphi中溢出检查、范围检查之类的都有编译开关控制。

user: user-2
content: 瞎侃几句：尤达的造型和ET中外星老植物学家很像，应该是后者模仿了尤达，另外功夫熊猫中的师傅小熊猫造型也有模仿尤达的味道。

user: user-3
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 u010165006 的回复:] C语言诞生于上个世纪70年代，那个时候的硬件配置是极低的，对性能要求很苛刻。而且那时候的计算机用户都是很专业的，很少考虑编程爱好者的需求。 尤达大师只用光剑，不用机关枪！[/quote]  不懂老赵的意思

user: user-3
content: C语言诞生于上个世纪70年代，那个时候的硬件配置是极低的，对性能要求很苛刻。而且那时候的计算机用户都是很专业的，很少考虑编程爱好者的需求。

user: user-4
content: 从效率上考虑的，将下标检查交给开发者

user: user-1
content: 对比一下那些号称执行数组下标的有效性检查的语言，看看C语言有哪些优势。

user: user-5
content: 运行时检查肯定是有性能损失的,，是否越界是程序员的责任  编译器在编译时会帮你检查能检查出越界行为（VS中项目属性——代码分析，勾选：生成时启用代码分析）
user-0 提问: 求大神教导 最近项目模块要使用glib中平衡二叉树读写配置文件,不知道怎么入手,求大神

回复:
user: user-1
content: 引用 10 楼 qq_36088602 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] https://www.baidu.com/s?wd=将keyvalue数据插入glib库的平衡二叉树  赵老师,你好!对于我已经把文件信息读取出来 怎么给搞到树里去....越想越迷糊了?[/quote] http://web.mit.edu/barnowl/share/gtk-doc/html/glib/glib-Balanced-Binary-Trees.html#g-tree-insert

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=将keyvalue数据插入glib库的平衡二叉树  赵老师,你好!对于我已经把文件信息读取出来 怎么给搞到树里去....越想越迷糊了?

user: user-1
content: https://www.baidu.com/s?wd=将keyvalue数据插入glib库的平衡二叉树

user: user-0
content: 引用 6 楼 qq_24276421 的回复:http://blog.chinaunix.net/uid-25696269-id-1595853.html        (百度得到) 具体的你怎么用,怎么去读,文件什么结构巴拉巴拉.....就不知道了,希望能帮到你 谢了

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 qq_36088602 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] https://www.baidu.com/s?wd=将keyvalue数据插入glib库的平衡二叉树  赵老师,你好!对于我已经把文件信息读取出来 怎么给搞到树里去....越想越迷糊了?[/quote] http://web.mit.edu/barnowl/share/gtk-doc/html/glib/glib-Balanced-Binary-Trees.html#g-tree-insert[/quote] 谢了

user: user-0
content: 引用 6 楼 qq_24276421 的回复:http://blog.chinaunix.net/uid-25696269-id-1595853.html        (百度得到) 具体的你怎么用,怎么去读,文件什么结构巴拉巴拉.....就不知道了,希望能帮到你 谢谢,主要是问题是不知道怎么读取到的配置文件的数据插入的glib库里的平衡二叉树里去 配置文件格式 <段名> key=value

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=glib库%20平衡二叉树%20读写配置文件 这年头，连怎样使用百度搜索都得手把手教了！ 可惜楼主不是妹子。 可惜我已经名草有主了。  汗,我想说的是我用链表把配置文件的数据读取到了 那该怎么把链表的数据插入的glib库中去了, 虽然我知道glib库中有专门的来读取配置文件的,但是使用glib库里的平衡二叉树不是效率更加高吗

user: user-0
content: 大哥,搜不到...我搜过了

user: user-1
content: 百度搜相关关键字。

user: user-2
content: http://blog.chinaunix.net/uid-25696269-id-1595853.html        (百度得到) 具体的你怎么用,怎么去读,文件什么结构巴拉巴拉.....就不知道了,希望能帮到你

user: user-1
content: https://www.baidu.com/s?wd=glib库%20平衡二叉树%20读写配置文件 这年头，连怎样使用百度搜索都得手把手教了！ 可惜楼主不是妹子。 可惜我已经名草有主了。

user: user-0
content: 还是没人...是太难 还是我基础太差

user: user-0
content: 没有人嘛
user-0 提问: 这个转换算法。。。要怎么写。。。。

回复:
user: user-1
content: 线性插值就行了

user: user-2
content: double fun(int x) {     return (0.75 + 1.5*x/8000); }

user: user-3
content: 就是一元一次方程，y=（1.5/8000）x+0.75，再用c语言描述一遍

user: user-4
content: void main() { 	int	   nInput = 0,  	double dblOutput = 0.0;  	double dblStep = (2.25 - 0.75)/8000; 	printf("Please input a number: ");         scanf("%d", &nInput);  	if ((nInput > 8000) || (nInput < 0)) 		printf("Error Number!"); 	else 	{ 		dblOutput = 0.75 + dblStep*nInput; 		printf("Output:%f",dblOutput); 	} }

user: user-5

user: user-6
content: y=0.75*(1-x/8000.0)+(2.25-0.75)*(x/8000.0);
user-0 提问: 快速修改源文件的缩进

回复:
user: user-1
content: astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415

user: user-2
content: 描述有误，是4个字符

user: user-2
content: 第一步修改vim配置设置tab为4字节，然后vim打开源文件，使用v命令选中所有代码，最后按一下backspace前面的一个键（是+和=共用的）

user: user-3
content: 全文替换
user-0 提问: 一个struct问题

回复:
user: user-1
content: 前置声明  不这样的话，你会发现两个相互引用的结构体没法定义。 struct A { B *p }  struct B { A *p }

user: user-2
content: struct event_base; 是结构体不完整声明的语法，使得不必先完整定义结构就可以在后面使用其指针形式。

user: user-3
content: 结构体先声明后定义

user: user-4
content: struct struct [tag] { member-list } [declarators];  [struct] tag declarators;  The struct keyword defines a structure type and/or a variable of a structure type. See Anonymous Structures and Unsized Array in a Structure for more information.  A structure type is a user-defined composite type. It is composed of "fields" or "members" that can have different types.  In C++, a structure is the same as a class except that its members are public by default.  Using a Structure  In C, you must explicitly use the struct keyword to declare a structure. In C++, this is unnecessary once the type has been defined.  You have the option of declaring variables when the structure type is defined by placing one or more comma-separated variable names between the closing brace and the semicolon.  For related information, see class, union, and enum.  Example 1  struct PERSON              // Declare PERSON struct type {    int   age;              // Declare member types    long  ss;    float weight;    char  name[25]; } family_member;           // Define object of type PERSON     struct PERSON sister;   // C style structure declaration    PERSON brother;         // C++ style structure declaration     sister.age  = 13;       // assign values to members    brother.age =  7; Structure variables can be initialized. The initialization for each variable must be enclosed in braces.  Example 2  struct POINT            // Declare POINT structure {    int x;               // Define members x and y    int y; } spot = { 20, 40 };    // Variable spot has                         //     values x = 20, y = 40 struct POINT there;     // Variable there has POINT type struct CELL             // Declare CELL bit field {    unsigned character  : 8;  // 00000000 ????????    unsigned foreground : 3;  // 00000??? 00000000    unsigned intensity  : 1;  // 0000?000 00000000    unsigned background : 3;  // 0???0000 00000000    unsigned blink      : 1;  // ?0000000 00000000 } screen[25][80];       // Array of bit fields

user: user-5
content: 声明

user: user-6
content: struct abc; ..... struct abc{  };  int func();  .... int func(){  }   这两个看起来是一毛一样的感觉……

user: user-7
content: 引用 2 楼 csdtdp 的回复:引用 1 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 定义我是知道的啊   我是问这样 struct event_base；    这样的语法有问题么？  该如何解释？  语法没问题啊，就先声明啊，类似函数的声明与实现

user: user-7
content: 这里只是先声明，后面应该还有结构体的定义

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。 定义我是知道的啊   我是问这样 struct event_base；    这样的语法有问题么？  该如何解释？

user: user-4
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 有一篇文章共有三行 每行80个字符   要求分别统计其中大写字母小写字母数字 空格以及其他字符数

回复:
user: user-1
content: #include<stdio.h> #include <string.h>  int main() {     int i,j;     int len, capital = 0,lower_case=0,number=0,space=0,other=0;     char str[3][80];      for(i = 0; i < 3; i++)     {         printf("input %d line\n",i+1);         fgets(str[i], 80, stdin);         len = strlen(str[i]);         str[i][len - 1] = 0;         for(j = 0; j < len - 1; j++)         {             if(str[i][j]>='a'&&str[i][j]<='z')                 lower_case++;             else if(str[i][j]<='Z'&&str[i][j]>='A')                 capital++;             else if(str[i][j]>='0'&&str[i][j]<='9')                 number++;             else if(str[i][j] == ' ')                 space++;             else                 other++;         }     }     printf("\n");     printf(" capital=%d   lower_case=%d  number=%d  space=%d  other= %d\n",capital,lower_case,number, space, other);     return 0;  } 建议提问时，先要把问题描述明白，不能让帮助你的人去猜问题。代码行数少的还行，多了就呵呵了。 两个问题，二层循环次数是80，若输入的不到80，剩余的就加到other计数器里了。 第二个问题，输出时没有space的值。

user: user-0
content: 感谢指导！！！！
user-0 提问: memset问题

回复:
user: user-1
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

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

user: user-2
content: 你仔细按照F10分步调试看一下你的ant_arry的值，我估计你for循环里取到的m或者n的值越界了，导致m>C_CITY_COUNT或者n>C_CITY_COUNT

user: user-3
content: 怀疑不是memset的问题，而是你在循环中m, n的值是不是导致temp_array访问越界呢

user: user-0
content: C_CITY_COUNT=N_CITY_COUNT=51

user: user-3
content: [N_CITY_COUNT和C_CITY_COUNT这两个宏分别是多大？

user: user-4
content: 那直接这样吧：  double temp_array[C_CITY_COUNT][C_CITY_COUNT] = {0};
user-0 提问: 新人求助，C语言程序

回复:
user: user-0
content: 感谢，感谢，我会好好学习的。

user: user-1
content: #include<stdio.h> #include<malloc.h> typedef struct LNode {     int data;     struct LNode *next; }LNode,*Linklist;  Linklist create(int n) {     int i;     Linklist l = (Linklist) malloc(sizeof(LNode));     struct LNode *s,*r;     r = l;     printf("输入元素: \n");     for(i = 1; i <= n; ++i)     {         s = (Linklist) malloc(sizeof(LNode));         scanf("%d", &s->data);         r->next = s;         r = s;     }     return l; } void print(Linklist head) {     Linklist p;     p = head->next;     while(p) {         printf("%d\n", p->data);         p = p->next;     } } int main(void) {     int n;     Linklist head = NULL;     printf("输入的节点数为：\n");     scanf("%d", &n);     head = create(n);     print(head);      return 0; } 建议先把C语言的语法学懂了，你的这个程序里有许多语法错误，基本函数使用错误；这是最基本的，链表操作还是有一定的难度的，所以我的建议是先学好基本的，在学习有难度的。一点点的来，一口不好吃个胖子。
user-0 提问: 哪位能阐述关于编码思路的问题，求各位分享编码思路，共同学习！

回复:
user: user-1
content: 《C语言课程设计案例精编》——俄罗斯方块

user: user-2
content: 《算法精解（C语言描述）》

user: user-3
content: 我做的大多都是单片机的编程。 单片机的编程比较简单。硬件驱动和业务区分很清楚。分模块实现硬件功能，分模块实现软件业务。模块化的设计思想在单片机里，个人感觉是最实用的。

user: user-4
content: 编码首先需要熟悉一门语言吧，然后根据需求用这门语言去解决问题。

user: user-1
content: 这属于《软件工程》的问题了吧

user: user-5
content: 上网查用什么库，找到库，看库的例子确定是否合适。 确定之后则参考文档与例子开写，不会写则继续用搜索引擎搜。
user-0 提问: 网络编程，怎么实现数据发送成功率？

回复:
user: user-0
content: 引用 6 楼 cfjtaishan 的回复:[quote=引用 5 楼 qq_38374462 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 qq_38374462 的回复:] 我写的就是TCP，失败的次数指send返回哪个值？就是数跟总成功的比率吗？ 看send的返回值，send成功和失败都会有对应的返回值[/quote] send成功是根据recv成功同时判断的吗，会不会send成功了，recv会失败？[/quote] 这个是TCP来保证的，底层会重传，recv失败那是接收的问题，你要计算两边的成功率吗？ 如果你要保证发过去的对方真的接收了，并且接收成功了，那么你就让对端发一个接收成功的回应包（或者失败的回应包），本端通过判断该回应包来确定是否成功或着失败[/quote] 这样写对不对 可是打印出来有问题，这里显示发送成功率100%，但是已经不能从数据库读数据，应该是逻辑显示错误的，大神可以帮我改一下吗

user: user-1
content: 引用 5 楼 qq_38374462 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 qq_38374462 的回复:] 我写的就是TCP，失败的次数指send返回哪个值？就是数跟总成功的比率吗？ 看send的返回值，send成功和失败都会有对应的返回值[/quote] send成功是根据recv成功同时判断的吗，会不会send成功了，recv会失败？[/quote] 除非经常断网，否则不太可能。

user: user-2
content: 引用 5 楼 qq_38374462 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 qq_38374462 的回复:] 我写的就是TCP，失败的次数指send返回哪个值？就是数跟总成功的比率吗？ 看send的返回值，send成功和失败都会有对应的返回值[/quote] send成功是根据recv成功同时判断的吗，会不会send成功了，recv会失败？[/quote] 这个是TCP来保证的，底层会重传，recv失败那是接收的问题，你要计算两边的成功率吗？ 如果你要保证发过去的对方真的接收了，并且接收成功了，那么你就让对端发一个接收成功的回应包（或者失败的回应包），本端通过判断该回应包来确定是否成功或着失败

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 qq_38374462 的回复:] 我写的就是TCP，失败的次数指send返回哪个值？就是数跟总成功的比率吗？ 看send的返回值，send成功和失败都会有对应的返回值[/quote] send成功是根据recv成功同时判断的吗，会不会send成功了，recv会失败？

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:这个成功率是发送次数的总数除以成功的次数； 如果是TCP的可以做到，如果是UDP，可以考虑加一个回应协议包。 发送成功跟发送失败是根据什么判定的？

user: user-2
content: 引用 2 楼 qq_38374462 的回复:我写的就是TCP，失败的次数指send返回哪个值？就是数跟总成功的比率吗？ 看send的返回值，send成功和失败都会有对应的返回值

user: user-0
content: 我写的就是TCP，失败的次数指send返回哪个值？就是数跟总成功的比率吗？

user: user-3
content: 在服务器端增加回应逻辑， 如果客户端收到了server的回应包，则就可以确保client发送是成功的 如果没有收到回应包，超过发送timeout时间，就认为是失败的

user: user-1
content: 搜“心跳包”

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545 感谢你的回复 请问大神我这样写的发送成功率对不对？因为我把服务器关闭的时候，send还没有返回-1，直到第二次开始发送才返回-1，我想要的是当我把服务器关闭的时候（或者数据发送失败的时候），send能否马上响应到？

user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-2
content: 这个成功率是发送次数的总数除以成功的次数； 如果是TCP的可以做到，如果是UDP，可以考虑加一个回应协议包。
user-0 提问: printf()里的自动转换规则是怎样的？

回复:
user: user-1
content: int 或者short 都可以，

user: user-2
content: 引用 2 楼 <span style="color:#4788C7">自信男孩</span>的回复:%u是unsigned int类型的，printf以%u输出，类似unsigned int a = (unsigned int )v; printf("%u", a);<br />那想请问一下unsigned char要怎么输出呢，用%u就转换成int了嘛

user: user-3
content: %u 是指输出无符号int类型， -1 转换为无符号int类型 = 4294967295

user: user-0
content: @jianwen0529 @cfjtaishan  感谢二位解答，论坛解决问题效率高，对新人帮助很大

user: user-4
content: %u是unsigned int类型的，printf以%u输出，类似unsigned int a = (unsigned int )v; printf("%u", a);

user: user-5
content: unsigned char uv=(unsigned)v; // uv = 255，数据截断  %u 是指输出无符号int类型， -1 转换为无符号int类型 = 4294967295
user-0 提问: 关于动态分配内存的问题

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 oYeYuanXinZhiZhu1 的回复:] 这是我自己修改后的代码，其中有一点，在动态创建z【n】这个数组后，如何将元素初始值全部赋为0？ 我不知道就用了个循环一个个赋值的#include <stdio.h> #include <stdlib.h> int main () { 	int n; 	while(scanf("%d",&n)!=EOF) 	{ 		//int  x[n],y[n],z[n]={0}; 	//	int y[n],z[n]={0}; 		int *x=(int *)malloc(n*sizeof(int)); 		int *y=(int *)malloc(n*sizeof(int)); 		int *z=(int *)malloc(n*sizeof(int)); 		for(int i=0;i<n;i++) 		{ 			z[i]=0; 		} 		for(int i=0;i<n;i++) 		{ 			scanf("%d%d",&x[i],&y[i]); 			z[x[i]]=y[i]+z[x[i]];	 		} 		for(int i=0;i<n;i++) 		{	 			if(z[i]!=0) 			{ 				printf("%d %d\n",i,z[i]); 			} 		} 		free(x); 		free(y); 		free(z); 	} 	return 0; } calloc就能做到，它是申请空间并且对元素初始化为0；所以，我建议你查查这两个函数的不同嘛[/quote] 谢谢~

user: user-1
content: 引用 2 楼 oYeYuanXinZhiZhu1 的回复:这是我自己修改后的代码，其中有一点，在动态创建z【n】这个数组后，如何将元素初始值全部赋为0？ 我不知道就用了个循环一个个赋值的#include <stdio.h> #include <stdlib.h> int main () { 	int n; 	while(scanf("%d",&n)!=EOF) 	{ 		//int  x[n],y[n],z[n]={0}; 	//	int y[n],z[n]={0}; 		int *x=(int *)malloc(n*sizeof(int)); 		int *y=(int *)malloc(n*sizeof(int)); 		int *z=(int *)malloc(n*sizeof(int)); 		for(int i=0;i<n;i++) 		{ 			z[i]=0; 		} 		for(int i=0;i<n;i++) 		{ 			scanf("%d%d",&x[i],&y[i]); 			z[x[i]]=y[i]+z[x[i]];	 		} 		for(int i=0;i<n;i++) 		{	 			if(z[i]!=0) 			{ 				printf("%d %d\n",i,z[i]); 			} 		} 		free(x); 		free(y); 		free(z); 	} 	return 0; } calloc就能做到，它是申请空间并且对元素初始化为0；所以，我建议你查查这两个函数的不同嘛

user: user-0
content: 这是我自己修改后的代码，其中有一点，在动态创建z【n】这个数组后，如何将元素初始值全部赋为0？ 我不知道就用了个循环一个个赋值的#include <stdio.h> #include <stdlib.h> int main () { 	int n; 	while(scanf("%d",&n)!=EOF) 	{ 		//int  x[n],y[n],z[n]={0}; 	//	int y[n],z[n]={0}; 		int *x=(int *)malloc(n*sizeof(int)); 		int *y=(int *)malloc(n*sizeof(int)); 		int *z=(int *)malloc(n*sizeof(int)); 		for(int i=0;i<n;i++) 		{ 			z[i]=0; 		} 		for(int i=0;i<n;i++) 		{ 			scanf("%d%d",&x[i],&y[i]); 			z[x[i]]=y[i]+z[x[i]];	 		} 		for(int i=0;i<n;i++) 		{	 			if(z[i]!=0) 			{ 				printf("%d %d\n",i,z[i]); 			} 		} 		free(x); 		free(y); 		free(z); 	} 	return 0; }

user: user-1
content: #include <stdio.h> #include <stdlib.h> int main () {     int n;     int *x, *y, *z;     while(scanf("%d",&n)!=EOF)     {         x = (int *)malloc(n * sizeof(int));         if (!x) {             fprintf(stderr, "malloc error!\n");             exit(-1);         }         y = (int *)malloc(n * sizeof(int));         if (!y) {             fprintf(stderr, "malloc error!\n");             exit(-1);         }         z = (int *)calloc(1, n * sizeof(int));         if (!z) {             fprintf(stderr, "malloc error!\n");             exit(-1);         }         for(int i=0;i<n;i++)         {             scanf("%d%d",&x[i],&y[i]);             z[x[i]]=y[i]+z[x[i]];         }         for(int i=0;i<n;i++)         {             if(z[i]!=0)             {                 printf("%d %d\n",i,z[i]);             }         }         free(x);         free(y);         free(z);     }     return 0; } 注意输入x[i]时，可能会导致z越界。 建议百度一下malloc, calloc
user-0 提问: 分享几本C语言的书，适合新手看

回复:
user: user-1

user: user-2
content: 要注册啊 好像很麻烦

user: user-3
content: 谭老师的书是否已经更新，老版本已经不适应现在的使用了。

user: user-4
content: 收下了，我再网上视频中也听老师介绍了基本关于C的书，可以去看看 《C Primer plus》这本书我买了，不过暂时我看不懂，需要一定的基础 《C语言程序设计》网上有视频，可以对照视频看 《C和指针》介绍和学习指针的，为学习JAVA打基础

user: user-5
content: 谢谢，指明学习方向

user: user-3
content: 顶一下，

user: user-6
content: 帮顶  《深入理解C指针》 《C语言点滴》 《C陷阱与缺陷》 《C专家编程》

user: user-7
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-8
content: 收下了
user-0 提问: C嵌套SQL 多个c文件link问题

回复:
user: user-1
content: 将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项
user-0 提问: 问个问题，

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

user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 建议自己动手做一下，不论是是命令拷贝，还是编程读写，都可以尝试一下，这样说服力可能会更好

user: user-3
content: 通常不一样  比如存：1.23，文本4个字符4字节，二进制double则8字节

user: user-4
content: 一般不一样。如整数12在文本文件中占两个字符，dat文件中占sizeof (int)个字节，小数1.2文本中3个字符，dat中double是8个字节

user: user-0
content: 没人吗？？？？？？？？？？？？？？？？？？
user-0 提问: define的问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-2
content: 首先宏定义，A(x) 为   x/2，当执行时把参数直接替换X 不做任何处理  就变为7+3/2，这就是宏定义存在的缺陷，在运算时会存在副作用，还有就是不能通过调试解决，一般定义时就要带上括号，看做一个整体((x)/2)

user: user-3
content: 楼上正解，即 7+（3/2）

user: user-4
content: 替换成 7+3/2    先运算除法，再加法  所以：宏与函数不同，宏只是替换

user: user-5
content: A(7+3) ==> 7+3/2 就是8了
user-0 提问: my.cpp(1): fatal error C1083: 无法打开包括文件:“stdafx.h”: No such file or directory

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:引用 2 楼 suifengjz 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] //#include "stdafx.h"为什么要注释掉呢，我看网上大部分的源码都带这个，新手不懂 百度搜stdafx.h[/quote]在百科里面看到了答案，谢谢了

user: user-1
content: 引用 2 楼 suifengjz 的回复:引用 1 楼 zhao4zhong1 的回复://#include "stdafx.h"为什么要注释掉呢，我看网上大部分的源码都带这个，新手不懂 百度搜stdafx.h

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复://#include "stdafx.h"为什么要注释掉呢，我看网上大部分的源码都带这个，新手不懂

user: user-1
content: //#include "stdafx.h"
user-0 提问: 点用这个函数，输入为123返回什么

回复:
user: user-1
content: 建议动手运行一下～

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

user: user-0
user-0 提问: 新生用cfree写了个石头剪刀布，运行出现问题，求解。

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

user: user-2
content: 你的user是char类型，当你输入1，2，3的时候，user得到的是这个数字的ascii码的值49,50,51。你用这么大的数字和cp进行比较得到的结果是负数，而不是你需要的结果。一个简单的修复：         do {             color(7);             printf("\t\t\t\t\tplease correct input: ");             fflush(stdin);             color(11);             scanf("%d",&user);         } while((user!=1)&&(user!=2)&&(user!=3));

user: user-3
content: 引用 1楼赵4老师 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。道理我都懂，可是到底哪里出错了？
user-0 提问: 第一个和第二个for语句不是很明白，有打大神能详解一下吗？

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

user: user-2
content: 引用 2 楼 sonefinn 的回复:[quote=引用 1 楼 user-5 的回复:] ++i先自加后参与与运算啊，i++是先运算后自加，你是不明白哪呢   是这吗     for(gap=n/2;gap>0;gap/=2)是这里，这里的思维逻辑是怎样的？ [/quote] 逻辑的设计是根据需求来的，如果仅仅是分析语法，可以接看代码，但是如果要分析为什么要这样做循环要看你的需求是什么！ 代码不会无故写出，要看你的需求

user: user-3
content: 假设此时n=8 对于for的两个循环  for(gap=n/2;gap>0;gap/=2) for(i=gap;i<n;++i)  来说 第一次循环，以上代码等价于 gap=4 for(i=4;i<8;++i) gap=2 第二次循环 for(i=2;i<8;++i) gap=1 第三次循环 for(i=1;i<8;++i) gap=0

user: user-4
content: C必须学会单步调试啊你试试就知道啊  放n=100 gap=100/2 gap/=2 每次都2  25  12  6 3 1

user: user-0
content: 引用 1 楼 user-5 的回复:++i先自加后参与与运算啊，i++是先运算后自加，你是不明白哪呢   是这吗     for(gap=n/2;gap>0;gap/=2)是这里，这里的思维逻辑是怎样的？

user: user-5
content: ++i先自加后参与与运算啊，i++是先运算后自加，你是不明白哪呢   是这吗
user-0 提问: C语言问题，大神们帮帮忙！

回复:
user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-0
content: 非常感谢您！

user: user-2
content: scanf("%c",&ok); =====>>>>> scanf("%d", &a);
user-0 提问: C语言数据保存到TXT文本中，打开TXT看全是乱码，那么该如何做才能让信息变成人能看懂的文字呢？

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: fwrite是按照块去写的，不想fprintf，fputs这样，文本形式并且带格式的写入。

user: user-3
content: 用fprintf函数写入，fwrite写入的是二进制

user: user-4
content: 先sprintf,再fwrite
user-0 提问: return 在函数中返回错误！ 为什么

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

user: user-2
content: int gcd(int x, int y) { 	int tmp = x; 	if(tmp > 0) 	{ 		if( x > y ) 		{ 			tmp = x % y; 			return gcd(tmp, y); 		} 		else 		{ 			tmp = y % x; 			return gcd(tmp, x); 		} 	} 	return y; }

user: user-2
content: 或者用简单的方法 int gcd(int x, int y) { 	if( y != 0 ) 		return gcd(y, x%y); 	return x; }

user: user-1
content: 引用 2 楼 yaoqibbs 的回复:又改了下 if(tmp>0)     tmp＝x>y?gcd(x%y,y):gcd(y%x,x); else       return y; 手机打得 真费劲啊 把手机砸了！换笔记本电脑。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-3
content: 这个问题需要去理解递归的原理，递归简单的讲是从一个函数里调用自己的函数；在函数栈上理解是，一直申请函数栈（函数栈都是一样的），不同的地方是实参值不一样。每次函数调用都要返回，你看到return y；应该是最后一次的调用的返回或者倒数第二次函数调用的返回值等等，直到第一次调用的返回值返回了，才是递归调用的结束。 递归是一个申请自身函数栈和释放自身函数栈的过程；这两个过程是相反的

user: user-0
content: 虽然不太懂函数与堆栈关系 但是还是把这道题用两种方法做出来了

user: user-0
content: 引用 3楼自信男孩 的回复:这个问题需要去理解递归的原理，递归简单的讲是从一个函数里调用自己的函数；在函数栈上理解是，一直申请函数栈（函数栈都是一样的），不同的地方是实参值不一样。每次函数调用都要返回，你看到return y；应该是最后一次的调用的返回或者倒数第二次函数调用的返回值等等，直到第一次调用的返回值返回了，才是递归调用的结束。 递归是一个申请自身函数栈和释放自身函数栈的过程；这两个过程是相反的你的意思是每次调用自己结束后都要返回一次？

user: user-4
content: 递归返回之后还会继续执行没执行完的代码，不加else，递归返回之后还会执行后面的代码

user: user-0
content: 又改了下 if(tmp>0)     tmp＝x>y?gcd(x%y,y):gcd(y%x,x); else       return y; 手机打得 真费劲啊

user: user-0
content: 没人吗 帮帮啊
user-0 提问: Call 大牛，关于PE头的问题

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

user: user-1
content: 《Windows PE权威指南》

user: user-2
content: char *FileToFileBuffer(char* pPath) {     //open the read file     FILE* pFile=fopen(pPath,"rb");     if(!pFile) {         printf("open read file failed!\n");         return NULL;     }     //get size of file     int size = FileSize(pFile);     //apply memory     char* pFileBuffer = (char *)malloc(size * sizeof(char));     if(!pFileBuffer) {         printf("Apply the memorry failed!\n");         fclose(pFile);         return 0;     }     //read file to memory     fread(pFileBuffer, size, 1, pFile);     fclose(pFile);     return pFileBuffer; } 从文间里读数据，一般都是char类型吧
user-0 提问: 多组数据输入——如何避免第一个scanf对输出结果的影响。

回复:
user: user-1
content: 不要使用 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;  //... } 类似的例子还可以举很多。

user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-2
content: #include<stdio.h> #include<math.h> #include<string.h> int main() {     int n,b,c,d,e=0;     int i = 0;      while(scanf("%d",&n)!=EOF &&n != 0)     {         //scanf("%d",&n);         if(n < 8) {             b = n;         } else         {             c = n;             e = 0;    /* Initize the value. */             do{                 d = c % 8;                 e += d * pow(10,i);                 c /= 8;                 i++;             }while(c >= 8);             b = c * pow(10, i) + e;         }         printf("%d\n", b); 	/* Initize the value */         i = 0;     }     return 0; } 注意对e和i的初始化。

user: user-0
content: 引用 1 楼 user-3 的回复:尝试使用一下dowhile试试看 我尝试了一下使用do while ,但是输出结果还是错误的。 输出成： 110 156 18 然后就没有结果了

user: user-3
content: 尝试使用一下dowhile试试看
user-0 提问: 哪位大牛能帮我解释下软件保护及分析技术的问题

回复:
user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-1
content: 去看雪论坛逛逛。
user-0 提问: 用迭代法求平方根遇到一个输出的问题

回复:
user: user-1
content: 这是因为float类型和double类型占用的内存长度不一样，所以表示精度不一样，如果将一个float类型（4个字节）放在double类型的低4字节位置，那么输出的就是0.00000 若改成double，输入和输出都都要用%lf

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-1
content: 引用 4 楼 FancyMouse 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 若改成double，输入和输出都都要用%lf 输出可以不要的[/quote] 嗯，我建议是要的

user: user-3
content: 引用 3 楼 cfjtaishan 的回复:若改成double，输入和输出都都要用%lf 输出可以不要的

user: user-4
content: scanf("%f",&a);  这里也要换成 %lf
user-0 提问: 学生成绩管理系统中文件操作问题.

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

user: user-2
content: 引用 1 楼 Kaciry 的回复:对文件操作的函数还不能用，怎么更改？，比如要删除某学生的成绩 如果要删除文件中的某个学生信息，需要现将文件内容读到内存，然后将该学生信息从内存里删除，最后再将剩余的学生信息写入文件。

user: user-0
content: 对文件操作的函数还不能用，怎么更改？，比如要删除某学生的成绩
user-0 提问: 帮我看看这个程序

回复:
user: user-1
content: x y 没有传递给什么函数，你程序中x y 只是用于循环记录，x向重复width次， y向重复height次

user: user-2
content: x和y并没有传递给谁，x是控制循环的次数，控制打印换行符的数量从而打印宽度。而y也是同样的道理，则是控制打印的高度。
user-0 提问: 急死了，求助大神

回复:
user: user-0
content: 谢谢指导！

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 3 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h>  int main() {     int N;//有N组测试数据     int i;     char ch1, ch2, ch3,temp;     scanf_s("%d", &N);      getchar();    /* recv '\n' from stdin*/     for (i = 0; i < N; i++)     {         scanf_s("%c%c%c", &ch1, 1, &ch2, 1,  &ch3, 1);         if (ch1 > ch2)         {             temp = ch2;             ch2 = ch1;             ch1 = temp;         }         if (ch1 > ch3)         {             temp = ch3;             ch3 = ch1;             ch1 = temp;         }         if (ch2 > ch3)         {             temp = ch3;             ch3 = ch2;             ch2 = temp;         }         printf("%c %c %c\n", ch1, ch2, ch3);         getchar();    /* recv '\n' from stdin*/     }     system("pause"); } 注意输入之后的回车符 谢谢！

user: user-2
content: #include<stdio.h> #include<stdlib.h>  int main() {     int N;//有N组测试数据     int i;     char ch1, ch2, ch3,temp;     scanf_s("%d", &N);      getchar();    /* recv '\n' from stdin*/     for (i = 0; i < N; i++)     {         scanf_s("%c%c%c", &ch1, 1, &ch2, 1,  &ch3, 1);         if (ch1 > ch2)         {             temp = ch2;             ch2 = ch1;             ch1 = temp;         }         if (ch1 > ch3)         {             temp = ch3;             ch3 = ch1;             ch1 = temp;         }         if (ch2 > ch3)         {             temp = ch3;             ch3 = ch2;             ch2 = temp;         }         printf("%c %c %c\n", ch1, ch2, ch3);         getchar();    /* recv '\n' from stdin*/     }     system("pause"); } 注意输入之后的回车符
user-0 提问: 新生在限制判断字符时遇到问题

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-2
content: #include <stdio.h> #include <string.h>  int main() {     char user[8];     int len;      do {         printf("请正确输入: ");         //scanf("%c",&user);         fgets(user, 8, stdin);         if (len > 2)             user[strlen(user)-1] = 0;         len = strlen(user);     }while(len > 2 || (user[0] != '1' && user[0] != '2' && user[0] != '3'));      return 0; }

user: user-3
content: 你的程序只判断了输入的第一个字符是不是你需要的。如果你需要验证全部的输入，你需要用 #include <stdio.h> main() {char user[100];   do     {      printf("\t\t\t\t\t请正确输入: ");      fflush(stdin);      scanf("%s",&user);     }while(strcmp(user, "1") != 0 && strcmp(user, "2") != 0 && strcmp(user, "3") != 0); }

user: user-4
content: 我没太明白你要说的是什么意思，不懂什么叫“通过了”  while((user!='1')&&(user!='2')&&(user!='3')); 表示只有user同时不为 '1'  '2'  '3'才继续循环  如果你需要为其中一个就继续循环，改成；while ((user == '1') || (user == '2') || (user -= '3'));

user: user-5
content: 改为字符串，用strcmp进行比较是否 "1", "2", "3"
user-0 提问: C语言文件的3个问题

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  读写文件的函数对应的C源代码都有，自己看或单步调试一下，在crt\src\*.c

user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 因为最后一次EOF时并没有读取，但你代码又会把之前的 i再输出一次   这样改可以：   int main() { 	FILE *f1, *f2; 	int i; 	f1 = fopen("F:\\date.dat", "wb"); 	for (i = 1; i <= 10; i++) 		fwrite((int*)&i, sizeof(int), 1, f1); 	fclose(f1); 	f2 = fopen("F:\\date.dat", "rb"); 	while (1) 	{ 		fread((int*)&i, sizeof(int), 1, f2); 		if (feof(f2)) 			break; 		printf("%d ", i); 	} 	fclose(f2); 	return 0; }

user: user-2
content: 看操作系统吧，WINDOWS下，文本文件换行符会被替换为\r\n  控制台中按Enter得到的是\n
user-0 提问: malloc时出错。提示 0xC0000374: 堆已损坏 (参数: 0x778CD8D0)什么原因？

回复:
user: user-1
content: Link s = (Link)malloc(sizeof(Link)) 这句肯定是有问题的；sizeof(Link)是指针的长度，4个字节（32位系统）；	 Link s = (Link)malloc(sizeof(LNode))

user: user-2
content: 少用点typedef

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

user: user-4
content: 检查使用堆内存有没越界，越界会导致堆被破坏，之后申请内存或释放内存都可能崩溃

user: user-5
content: 至少这里是要改的  Link s = (Link)malloc(sizeof(*Link))
user-0 提问: 汉诺塔II

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

回复:
user: user-1
content: 仅供参考：#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

user: user-2
content: int find_min_diff(char *str, int len) {     struct tm_info from, to;     int min = 0;      while (*str == ' ')         str++;     if (len <= 0)         return -1;     sscanf(str, "[\"%d:%d\", \"%d:%d\"]",            &from.hour, &from.min,            &to.hour, &to.min);      if (to.min < from.min) {         to.min += 60;         to.hour -= 1;     }     if (to.hour < from.hour)         to.hour += 24;     min = (to.hour - from.hour) * 60 + to.min - from.min;      return min; }  int main() {     char s[50];     fgets(s, 50, stdin);      printf("Min diff: %d\n", find_min_diff(s, strlen(s)));     return 0; } 你的代码可读性比较差呀，如果可以不建议使用那么多局部变量，并且局部变量都是一些a,b单个字母，这样不知道变量用来做什么的。可读性自然不好了。 如果可以多用结构体，联合体来处来多变量的问题，多用库函数来解决我们的问题。
user-0 提问: C和C++的默认链接属性

回复:
user: user-1
content: 你要了解c语言变量的存储类别，可以参考这个博文http://blog.csdn.net/libing403/article/details/72934528

user: user-2
content: 是指的外部链接, 内部链接这种属性吗? 是一样的.
user-0 提问: xcode环境下int强制转成unsigned char报错问题

回复:
user: user-1
content: a=unsigned char(inta[i]);  =>  a=(unsigned char)inta[i];  这个是语法错误.  至于死循环, 和转型没关系, 还是检查下循环自身的结束条件吧.
user-0 提问: 运行程序的时候，程序停止

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: c语言基础编程问题，scanf(格式化字符串，格式化变量地址);

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

user: user-3
content: #include<stdio.h> int main() {     int T, i;      do     {         printf("how many example?(1<=T<=100)  ");         scanf("%d", &T);     } while(T>100||T<1);      int a[T], b[T], c[T], d[T];      printf("enter example:\n");     for(i=0;i<T;i++) {         scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);         //scanf("%d%d%d%d", a + i, b + i, c + i, d + i);     }     for(i = 0; i < T; i++)     {         if(a[i]==10 && b[i] <= 255 && b[i] >= 0 && c[i] >= 0 && c[i] <= 255 && d[i] >= 0 && d[i] <= 255)             printf("yes\n");         else if(a[i] == 172 && b[i] <= 31 && b[i] >= 16 && c[i] >= 0 && c[i] <= 255 && d[i] >= 0 && d[i] <= 255)             printf("yes\n");         else if(a[i] == 192 && b[i] == 168 && c[i] >= 0 && c[i] <= 255 && d[i] >= 0 && d[i] <= 255)             printf("yes\n");         else             printf("no\n");     }     return 0; } 注意代码风格；  #if 0     scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]); #else     scanf("%d%d%d%d", a + i, b + i, c + i, d + i); #endif  两种方式都是可以

user: user-4
content: scanf的参数应该是变量的地址，而非变量本身。应该改成： scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);

user: user-4
content: scanf的参数应该是变量的地址，而非变量本身。应该改成： scanf("%d%d%d%d",a[i],b[i],c[i],d[i]);
user-0 提问: 数据结构 栈问题求助

回复:
user: user-1
content: #include <iostream> #include <stdlib.h> #include <stdio.h> //#include <malloc.h> using namespace std;  typedef int SElemType; typedef int Status;  const int STACK_INIT_SIZE = 100; const int STACKINCREMENT = 10; #define ERROR 0 #define OK 1  typedef struct {     SElemType  *base;        //在栈构造之前和销毁之后,base的值为NULL     SElemType  *top;        //栈顶指针     int  stacksize;            //当前分配的存储空间,以元素为单位 }SqStack;  Status InitStack_Sq(SqStack &S) {     S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));     if (!S.base)         exit(0);    //存储分配失败     S.top = S.base;     S.stacksize = STACK_INIT_SIZE;     return true; }  Status GetTop(SqStack S, SElemType &e) {     if (S.top == S.base)         return ERROR;     e = *(--S.top);     return OK; } //Push Status Push(SqStack &S, SElemType e) {     if (S.top - S.base >= S.stacksize)     {         S.base = (SElemType *) realloc (S.base,             (S.stacksize + STACKINCREMENT) * sizeof(SElemType));         if (!S.base)             exit(0);//失败         S.top = S.base + S.stacksize;         S.stacksize += STACKINCREMENT;     }     *S.top++ = e;      return OK; }  // Pop Status Pop(SqStack &S, SElemType &e) {     if (S.top == S.base)         return ERROR;      e = *--S.top;     return OK; }  Status StackEmpty(SqStack &S) {     //if (*S.top == -1)     if (S.top == S.base)         return OK;     else         return ERROR; } void conversion(int n, int m, SqStack &S) {     SElemType e;     while (n) {         Push(S, n % m);         n = n / m;     }     while (!StackEmpty(S)) {         Pop(S, e);         printf("%d", e);     }     printf("\n"); }  int main() {     int N, M;     SqStack S;     InitStack_Sq(S);      cout << endl << "输入计算的十进制数据：N=  ";     cin >> N;     cout << endl << "输入转换为什么进制数据：M=  ";     cin >> M;     conversion(N, M, S);      return 0; } 参考一下上面的代码吧；问题主要是： 1. 宏定义后面加分号，这是不对的，宏定义是等价替换（在预编译阶段），如果带着分号替换，你看是否可行； 2. main函数调用使用栈时，没有初始化栈，那么就无法使用； 3. 栈判断是否为空，不能判断其是否等于-1,初始化时，并没有对其初始化为-1； 4. Gettop，需要先自减，再取值，指针减1，不能指向下一个元素，因为指针是4个字节，减1只是偏移1个字节。 注意代码风格，希望有自己的一个代码风格，主要是让读代码的人能比较舒服
user-0 提问: 关于C语言输入的问题，出现奇怪的输出

回复:
user: user-0
content: 上面那个是main函数的，这个是print函数 #include"ADD.h" #include<stdio.h> void print(struct staff *head) { 	struct staff *p; 	printf("\n员工的数据为："); 	p = head; 	if (head != NULL) 		do 		{ 			printf("%d  %-10s  %f  %d  %d  %d  %d\n", p->no, p->name, p->gender, p->birthday.month, p->birthday.day, p->birthday.year, p->salary); 			p = p->next; 		} while (p != NULL);  }

user: user-0
content: #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct staff) #include"ADD.h" #include"alter.h" #include"delete.h" #include"search.h" #include"print.h"  int n; void main() { 	struct staff *creat(); 	extern staff *add(struct staff *head, struct staff *info); 	extern staff *alter(struct staff *head, int m); 	extern struct staff *Delete(struct staff *head, int m); 	extern void search(struct staff *head, int m); 	void print(struct staff *head); 	int x; 	struct staff *head,sta; 	head = creat(); 	printf("添加请输入1，删除请输入2，查找请输入3，修改请输入4"); 	scanf("%d", &x); 	if (x == 1) 	{ 		scanf("%d,%s,%f,%d,%d,%d,%d", &sta.no, &sta.name, &sta.gender, &sta.birthday.month, &sta.birthday.day, &sta.birthday.year, &sta.salary); 		head=add(head,&sta); 		print(head); 	} 	else if (x == 2) 	{ 		printf("请输入要删除的职工的员工号:"); 		int c; 		scanf("%d", &c); 		head=Delete(head,c); 		print(head); 	} 	else if (x == 3) 	{ 		int c; 		scanf("%d", &c); 	 search(head,c); 	} 	else if (x == 4) 	{ 		int b1; 		scanf("%d", &b1); 		head=alter(head,b1); 		print(head); 	} 	else 	{ 		printf("輸入有誤！"); 	};    } struct staff *creat() { 	struct staff *head; 	struct staff *p1, *p2; 	n = 0; 	p1 = p2 = (struct staff*)malloc(LEN); 	scanf("%d,%s,%f,%d,%d,%d,%d", &p1->no, &p1->name, &p1->gender, &p1->birthday.month, &p1->birthday.day, &p1->birthday.year, &p1->salary); 	head = NULL; 	while (p1->no != 0) 	{ 		n = n + 1; 		if (n == 1)head = p1; 		else p2->next = p1; 		p2 = p1; 		p1 = (struct staff*)malloc(LEN); 		scanf("%d,%s,%f,%d,%d,%d,%d", &p1->no, &p1->name, &p1->gender, &p1->birthday.month, &p1->birthday.day, &p1->birthday.year, &p1->salary);  	} 	p2->next = NULL; 	return(head); }

user: user-1
content: 最好能贴出代码～

user: user-1
content: scanf("%d,%s,%f,%d,%d,%d,%d", &p1->no, p1->name, &p1->gender, &p1->birthday.month, &p1->birthday.day, &p1->birthday.year, &p1->salary); 这个地方也是需要去掉&

user: user-1
content: scanf("%d,%s,%f,%d,%d,%d,%d", &sta.no, sta.name, &sta.gender, &sta.birthday.month, &sta.birthday.day, &sta.birthday.year, &sta.salary); 去掉sta.name前面的&

user: user-0
content: 如果需要代碼請回復
user-0 提问: 一个关于C语言的问题，值得思考一下。

回复:
user: user-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-2
content: 数组越界～最后一次循环会把array[ARRAY_SIZE]置为0

user: user-0
content: 这个题是从《C和指针》（Kenneth A.Reek）中文版（徐波译）的113页看到的，对于给出的参考答案我不是很理解，参考答案给出了两个错误，其中一个是数组越界，有没有人能找出并理解另一个错误？

user: user-3
content: ARRY_size确定是常数吗？

user: user-4
content: 上面的我发的太快，有误，请看下面的 int array[ARRAY_SIZE]; int *pi; for(pi = array; pi < array+ARRAY_SIZE;)     *pi++ = 0;  或者  int array[ARRAY_SIZE]; int *pi; for(pi = array; pi < array + ARRAY_SIZE; pi++)     *pi = 0;

user: user-4
content: int array[ARRAY_SIZE]; int *pi; for(pi = &array[0]; pi < &array[ARRAY_SIZE);)     *++pi = 0; 或者 int array[ARRAY_SIZE]; int *pi; for(pi = array; pi < array+ARRAY_SIZE;pi++)     *pi = 0;

user: user-5
content: 越界了呗，前置++是先自加  *++pi = 0;  改成：  *pi++ = 0;