Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 新手提问。。关于printf输出

回复:
user: user-1
content: 对无符号数，右移补0。 对有符号数，正数（最高位为0）右移补0；负数（最高位为1）右移补1。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:#include <stdio.h> unsigned char ui;   signed char si; char main() {     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui>>1;     si=si>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)>>1;     si=((unsigned char)si)>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("==============\n");      ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui<<1;     si=si<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)<<1;     si=((unsigned char)si)<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      return 0; } //ui=128 //si=-128 //ui=64 //si=-64 //-------------- //ui=128 //si=-128 //ui=192 //si=64 //============== //ui=128 //si=-128 //ui=0 //si=0 //-------------- //ui=128 //si=-128 //ui=0 //si=0  被大神这么一搞，我又有点晕了~~ 看这例子，左移的情况都是补零，但右移时要复杂很多，能否费心费力，解释下，有没有好的理解 方式呢~书上说的不太看懂

user: user-2
content: 楼主所言甚是 #include<stdio.h>  int main(void) { 	unsigned i = 0xcffffff3; 	long j=0xcffffff3; 	int k=0xcffffff3; 	printf("num:\t%x\n",0xcffffff3 >> 2); 	printf("i:\t%x\n",i >> 2); 	printf("j:\t%x\n",j >> 2); 	printf("k:\t%x\n",k >> 2);     return 0; }

user: user-3
content: 是正确的，根据输出结果来看，这样的判断是对的

user: user-4
content: 对啊 无符号 补0 有符号补1啊

user: user-1
content: #include <stdio.h> unsigned char ui;   signed char si; char main() {     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui>>1;     si=si>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)>>1;     si=((unsigned char)si)>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("==============\n");      ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui<<1;     si=si<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)<<1;     si=((unsigned char)si)<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      return 0; } //ui=128 //si=-128 //ui=64 //si=-64 //-------------- //ui=128 //si=-128 //ui=192 //si=64 //============== //ui=128 //si=-128 //ui=0 //si=0 //-------------- //ui=128 //si=-128 //ui=0 //si=0
user-0 提问: 关于二元数组寻找的问题，新手求教@-@(100分)

回复:
user: user-0

user: user-1
content: //给定n个数,他们的构成情况是A或者B后面跟上一个小于500000的数。如(A100,B111) //要求：找出所有二元数组(Ai,Bj)如果(Ai>Bj)：即A后面跟的数字大于B后面跟的数字。 //则A的计分不变,B的计分=B+i(也就是A后面跟上的这个数i的值)。 //而如果(Ai<Bj)则A的计分=A+j的数字,B的计分不变,A,B初始计分为0； //输入输出举例： //  输入：4 A1 B2 A3 B5 //  输出：A=12 B=3 //      原因：组成所有二元数组有 //          (A1,B2)此时A+2 //          (A1,B5)此时A+5 //          (A3,B2)此时B+3 //          (A3,B5)此时A+5 //          最后得分A=12 B=3 //  输入：5 A1 A3 B2 B4 B5 //  输出：A=20 B=3 #include <stdio.h> #define MAXN 100 int n,i,j,d; int A,B; int a[MAXN],an; int b[MAXN],bn; char s[10]; int main() {     n=0;     scanf("%d",&n);     if (n<1 || MAXN<n) {         printf("1<=n<=100\n");         return 1;     }     an=0;     bn=0;     for (i=0;i<n;i++) {         scanf("%s",s);         if (1==sscanf(s,"A%d",&d)) a[an++]=d;         if (1==sscanf(s,"B%d",&d)) b[bn++]=d;     }     A=0;B=0;     for (i=0;i<an;i++) {         for (j=0;j<bn;j++) {             if (a[i]>b[j]) B+=a[i];             if (a[i]<b[j]) A+=b[j];         }     }     printf("A=%d B=%d\n",A,B);     return 0; }

user: user-2
content: 1）分割，转换 2）求和

user: user-0
content: [quote=引用 3 楼 turingo 的回复:] 题目看不太懂！  题目已经修正~

user: user-0
content: 引用 2 楼 user-4 的回复:不是很懂意思！说明白点  给定n个数，他们的构成情况是A或者B后面跟上一个小于500000的数。如（A100，B111）   要求：找出所有二元数组（Ai,Bj）    如果（Ai >Bj）：即A后面跟的数字大于B后面跟的数字 。 则A的计分不变，B的计分=B+i(也就是A后面跟上的这个数i的值)。而如果（Ai<Bj）则A的计分=A+j的数字，B的计分不变，A，B初始计分为0；   输入输出举例：   输入：  4  （n=4）  A1 B2 A3 B5   输出：   A的分数=12   B的分数=3  原因：   组成所有二元数组有（A1，B2）此时A+2;  (A1，B5),此时A+5  (A3，B2),  此时B+3  (A3，B5)；C此时A+5；  最后得分A=12，B=3；     输入：  5 （n=5） A1 A3 B2 B4 B5    输出：A=20  B=3

user: user-3
content: 题目看不太懂！  引用 楼主 zw627092693 的回复:n个数-分别由A或者B加上一个小于五十万的数构成。  如（A10，B5）。 现在要求找出全部（Ai,Bj）.如果i>j 则sumA+=j;  如果j>i.sumB+=i; 如果是首字母相同不做处理 eg：输入：4 A1 B2 A3 B5 输出：A=12 B=3 理由：（A1，B2）---> A+2 (A1，B5) ---> A+5 (A3，B2) ---> B+3 (A3，B5) ---> A+5 ps:超时问题。。。。

user: user-4
content: 不是很懂意思！说明白点

user: user-0
content: 大神人呢@-@
user-0 提问: 关于不同数据类型的问题

回复:
user: user-1
content: 1）定义三种类型的表 2）根据类型采用不同的表 3）数据可以全部采用字符串输入 好吧C用宏

user: user-2
content: C++可以用模版  C用宏。。。
user-0 提问: 关于单链表的问题~ 编译没错 但无法实现功能~  求帮忙~~

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: #if （？） 在宏定义中的问题    急！！！ 

回复:
user: user-1
content: const int auto[10] = {      .      .      .    #if （a == 0）       x = 0,    #else       x = 1,    #endif      .      .      . }  这不行  可以这样  const int auto[10] = {      .      .      .       .      .      . }   1)  .... i=8; x=auto[i]; if （a == 0）x = 0,    else       x = 1;  2) const int auto[10] = {      .      .      . };  ......  int tmp[10]={....}; for(int i=0;i<10;i++)tmp[i]=auto[i];   if(a== 0)tmp[8] =0;else tmp[8]=1;

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:Code Generation 不懂 可以解说下哈

user: user-2
content: 引用 13 楼 ForestDB 的回复:一个是预编译，一个是编译，两个阶段的事。楼主说 a的值通过输入 获取  那么 这个已经是运行期的事情了

user: user-3
content: 一个是预编译，一个是编译，两个阶段的事。

user: user-2
content: 早就说了 不可能 别白费心思了

user: user-4
content: 分清程序代码的编译与执行, 它们是不同阶段的东西. 宏是编译期使用的东西, 代码执行是不用宏的, 宏在编译的时候已经被替换成对应的代码了.执行期是看不见的, 而编译的时候, 同理, 需要执行的时候才能确定的东西, 是不能拿到编译期用的.  总之要理解, 宏就是代码替换, 在编译的时候就替换掉了, 执行的时候看不见.

user: user-5
content: google 运行时和编译时  引用 10 楼 sanye8879cd 的回复:[quote=引用 6 楼 AnYidan 的回复:] #define a (1)   #if （a == 0）       x = 0,    #else       x = 1,    #endif  a是变量 不可直接赋值[/quote]  google 运行时和编译时

user: user-0
content: 引用 6 楼 AnYidan 的回复:#define a (1)   #if （a == 0）       x = 0,    #else       x = 1,    #endif  a是变量 不可直接赋值

user: user-0
content: 引用 7 楼 kfbyj 的回复:预编译期确实确定不了a的值。。所以肯定有问题的。 有没有其他好的方法推荐一下

user: user-0
content: 引用 5 楼 jerry_dqh 的回复:[quote=引用 2 楼 sanye8879cd 的回复:] [quote=引用 1 楼 lin5161678 的回复:] 常量表达式.... 别闹  预编译阶段 怎么可能让你确定 运行期才能知道的变量的值 对的，现在做到了一个很大的宏，但是其中有细微的差别需要一个变量来判断选用哪个X，有什么其他的方法吗？号头大哦...[/quote] 需要确定你这个变量能在编译器确定吗？[/quote] 不能  这个是需要输入确定的...或者不用预编译，有没有什么方法？

user: user-6
content: #define MY_MACRO(a) \ if （a == 0）       \       x = 0,       \ else               \      x = 1,         \ endif

user: user-6
content: 晕，这不就是带参数的宏定义么...  #define MY_MACRO(a) \ #if （a == 0）       \       x = 0,         \ #else               \      x = 1,         \ #endif

user: user-7
content: 预编译期确实确定不了a的值。。所以肯定有问题的。

user: user-5
content: #define a (1)   #if （a == 0）       x = 0,    #else       x = 1,    #endif

user: user-8
content: 引用 2 楼 sanye8879cd 的回复:[quote=引用 1 楼 lin5161678 的回复:] 常量表达式.... 别闹  预编译阶段 怎么可能让你确定 运行期才能知道的变量的值 对的，现在做到了一个很大的宏，但是其中有细微的差别需要一个变量来判断选用哪个X，有什么其他的方法吗？号头大哦...[/quote] 需要确定你这个变量能在编译器确定吗？

user: user-9
content: Code Generation

user: user-2
content: 没有 不可能做到的

user: user-0
content: 引用 1 楼 lin5161678 的回复:常量表达式.... 别闹  预编译阶段 怎么可能让你确定 运行期才能知道的变量的值 对的，现在做到了一个很大的宏，但是其中有细微的差别需要一个变量来判断选用哪个X，有什么其他的方法吗？号头大哦...

user: user-2
content: 常量表达式.... 别闹  预编译阶段 怎么可能让你确定 运行期才能知道的变量的值
user-0 提问: 关于递归，请各位谈谈看法

回复:
user: user-1
content: 当年去某一公司面试的时候我也跟对方的工程师说了递归开销大，对方告诉我，其实对现在的计算能力来说，其实也不算很大

user: user-2
content: 简单，但是很慢

user: user-3
content: 递归慢，容易栈溢出，不易调试，就一个好处，易读，可读性好，自己个儿权衡。。。。。

user: user-4
content: 引用 17 楼 true_casey 的回复:递归慢，容易栈溢出，不易调试，就一个好处，易读，可读性好，自己个儿权衡。。。。。我也觉得是自己个的事。。。

user: user-5
content: 无量天尊,递归是我的最爱呀,语意清晰,简洁!!!

user: user-6
content: http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and

user: user-7
content: 引用 12 楼 N_sev7 的回复:[quote=引用 8 楼 max_min_ 的回复:] 同意，尽量少用！除非特别需求！ 高端谈不上~ 除非特别需求！ 高端谈不上    ++[/quote]

user: user-0
content: 引用 14 楼 wangdahu888 的回复:无量天尊,递归是我的最爱呀,语意清晰,简洁!!!

user: user-0
content: 引用 8 楼 max_min_ 的回复:同意，尽量少用！除非特别需求！ 高端谈不上~ 除非特别需求！ 高端谈不上    ++

user: user-0
content: 引用 9 楼 baichi4141 的回复:自我感觉很高端就很高端呗，有啥可在意的。 代码效率低开销大自然有他哭的，如果效率不太低开销不太大，难道你还想规定无论任何情况一概禁用递归？  递归写起来比非递归要简单，性能差别大看脑子，性能差别不大看心情，就这样 哎，可能是每个人对自己精心写出来的代码在前提是程序功能无误的情况下很难容忍按照别人的想法去修改吧！

user: user-8
content: 递归只是保持了和数学思想的一致性，以及数学般的简洁！递归都能用非递归解决，但是代码会上升。  在效率，代码量以及可理解性三者的折中上，因人而异吧，有些看中效率，有些为了简洁，思想观点的差异，一般没有标准可言！

user: user-9
content: 自我感觉很高端就很高端呗，有啥可在意的。 代码效率低开销大自然有他哭的，如果效率不太低开销不太大，难道你还想规定无论任何情况一概禁用递归？  递归写起来比非递归要简单，性能差别大看脑子，性能差别不大看心情，就这样

user: user-10
content: 同意，尽量少用！除非特别需求！ 高端谈不上~

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

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

user: user-12
content: 引用 3 楼 N_sev7 的回复:[quote=引用 1 楼 nice_cxf 的回复:] 递归用了也谈不上什么高端，如果递归层数不深，写递归程序看起来要简单些，用了也就用了 即使是在递归层数不深的情况下，如果循环就可以解决了，还有用递归的必要吗？[/quote] 任何递归都可以用迭代解决，但是有些时候，如果用迭代写代码会变得很长很难理解的话，为什么不用呢？ 递归用了也就用了，不用也没啥，只是一种方法而已

user: user-0
content: 引用 2 楼 user-13 的回复:递归的特点就是思路比较清晰、好理解。但是如果递归次数太多的话对栈空间损耗过大，甚至程序崩溃出错。小问题的话可以使用一下。另外，递归也确实谈不上什么高端，只是一种程序设计方法而已。 是啊，不过就有些人在自己的代码里面老用递归，即使循环能解决的还是用递归，然后讲解代码的时候就给人一种自己很高端一样的感觉，而且不管你怎么说，他都始终坚持能用递归就用递归，可能就和我的原则不一样，能不用递归就坚决不用递归...

user: user-0
content: 引用 1 楼 nice_cxf 的回复:递归用了也谈不上什么高端，如果递归层数不深，写递归程序看起来要简单些，用了也就用了 即使是在递归层数不深的情况下，如果循环就可以解决了，还有用递归的必要吗？

user: user-13
content: 递归的特点就是思路比较清晰、好理解。但是如果递归次数太多的话对栈空间损耗过大，甚至程序崩溃出错。小问题的话可以使用一下。另外，递归也确实谈不上什么高端，只是一种程序设计方法而已。

user: user-12
content: 递归用了也谈不上什么高端，如果递归层数不深，写递归程序看起来要简单些，用了也就用了
user-0 提问: 几个简单C的程序，不知道怎么回事，大家看看。。

回复:
user: user-1
content: 浮点数不能直接跟0比较吧吧吧

user: user-2
content: 着重查看一下log()函数的描述，man log

user: user-3
content: 有啥问题么? c中的log(x)是以e为底的, 以10为底的是log10(x),
user-0 提问: 已知矩形四边长及其坐标。求矩形内其他任意一点的坐标？

回复:
user: user-0
content: 结了吧，感谢各位。已经解决了！

user: user-1
content: 你这信息太少，给出原题：

user: user-2
content: 引用 7 楼 d383137359 的回复:[quote=引用 6 楼 ri_aje 的回复:] 第一题没有唯一 解，因为矩形可以旋转。 第二题无解，平面两点只够定出直线的，信息不足定不出矩形。  恩，你理解到我第一题的意思的。 我就是说有没有什么关于 这打转的公式， 比如转向偏向的夹角之内的公式，计算出这几个顶点的坐标？  第二题应该条件更充分，已知两个点了，我想是不是对任意一个点都可以够成一个三角形。会不会更好算呢[/quote] 第一题该说的都说完了。 第二题你要是有解法，最好发上来让大家看看，说不定你那里想漏了呢。我是没看出解法，不过我也可能想错了。

user: user-0
content: 引用 6 楼 ri_aje 的回复:第一题没有唯一 解，因为矩形可以旋转。 第二题无解，平面两点只够定出直线的，信息不足定不出矩形。  恩，你理解到我第一题的意思的。 我就是说有没有什么关于 这打转的公式， 比如转向偏向的夹角之内的公式，计算出这几个顶点的坐标？  第二题应该条件更充分，已知两个点了，我想是不是对任意一个点都可以够成一个三角形。会不会更好算呢

user: user-3
content: 计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx

user: user-2
content: 第一题没有唯一 解，因为矩形可以旋转。 第二题无解，平面两点只够定出直线的，信息不足定不出矩形。

user: user-3
content: 提示：线段(x1,y1)-(x2,y2)的中点坐标为((x1+x2)/2,(y1+y2)/2)

user: user-0
content: 引用 3 楼 user-4 的回复:1. 已知矩形四边的边长和矩形中心的坐标，求矩形四个顶点以及四条边中心点的坐标，如下图： 小学数学题 2. 已知矩形四边的边长和矩形中两点的坐标，求矩形四个顶点以及四条边中心点的坐标，如下图： 提出错了  1.  第一题的小学题还真不会做。尴尬，求方法。 2. 题没错，第二题就是知道两点的坐标。

user: user-4
content: 1. 已知矩形四边的边长和矩形中心的坐标，求矩形四个顶点以及四条边中心点的坐标，如下图： 小学数学题 2. 已知矩形四边的边长和矩形中两点的坐标，求矩形四个顶点以及四条边中心点的坐标，如下图： 提出错了

user: user-0
content: 引用 1 楼 lm_whales 的回复:图形比较小时，近似看作平面图形计算，大时按照球面坐标计算。 高精度，归化到椭球面计算。 能说详细点吗？或有没有什么资料链接，贴链接我自己去看方法也可以、感谢！

user: user-1
content: 图形比较小时，近似看作平面图形计算，大时按照球面坐标计算。 高精度，归化到椭球面计算。
user-0 提问: 数组内容修改后，返回主函数如何实现

回复:
user: user-0
content: 测试完毕，地址传也测试成功了，不过直接写行。

user: user-1
content: 传地址就好了  //调用 test_func(a);  // 原型 void test_func(int *a); //实现作操作

user: user-2
content: 直接修改原数组，不用传递给主函数

user: user-3
content: 指针

user: user-4
content: #include <stdio.h>  void changeArray(int *arr);  int main() { 	int a[10],i; 	for (i=0;i<10;i++) 		a[i]=i; 	printf("调用函数之前:\n"); 	for (i=0;i<10;i++) 		printf("%d\t",a[i]); /*******************1#**************/ 	changeArray(a); /*******************1#**************/ 	printf("调用函数之后:\n"); 	for (i=0;i<10;i++) 		printf("%d\t",a[i]); 	return 0; }  void changeArray(int *arr) { 	int i=0; 	while(i<10) 	{ 		*(arr+i)+=10;  		i++; 	} }  /*修改(使每个元素增加10)*/
user-0 提问: socket抓包

回复:
user: user-1
content: #define ETH_P_PPP_DISC  0x8863          /* PPPoE discovery messages     */ #define ETH_P_PPP_SES   0x8864          /* PPPoE session messages       */

user: user-2
content: 引用 3 楼 u010423430 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 参考winpcap源代码。 看windows 程序设计 对理解如何写抓包的c程序，会有帮助么？ [/quote] 没有帮助。建议看一下网络协议（至少要了解一下）和winpcap库。

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:参考winpcap源代码。 看windows 程序设计 对理解如何写抓包的c程序，会有帮助么？

user: user-4
content: 建议从网卡上直接抓取。即可以借助libpcap库（linux下），windows下可以借助winpcap

user: user-5
content: 参考winpcap源代码。
user-0 提问: C++红外线编程

回复:
user: user-0
content: 谢谢各位的回复。  我想自己做一块单片机来接收、编码、解码红外线发射器发射来的信号  具体需要哪些硬件，怎么配置  谢谢

user: user-1
content: 引用 2 楼 truelance 的回复:每个开关需要分配一个中断和I/O地址

user: user-2
content: 每个开关需要分配一个中断和I/O地址

user: user-1
content: 你想用什么做接口？ 板卡？ 串口？ U口？.....你必须先规划好物理要怎么做 通常，最简单的办法是，下位机使用单片机对检测信号进行处理，然后通过串口传送给电脑
user-0 提问: 设计一种没有外部碎片的内存管理方案

回复:
user: user-1
content: 引用 9 楼 true_casey 的回复:不懂什么叫外部碎片、、、、、、　 管理空间： 伙伴系统 +　ＳＬＡＢ？？？？？？ 定长定界就考虑：ＨＡＳＨ　链 自己管理的称为内部的， 其他，比如系统管理的称为外部， 这不是一个概念，只是一个习惯，可能只是自己的习惯。  他的意思是基本上，碎片都是自己管理的那一部分产生的，而系统分配函数则基本不会产生碎片，都是分配大块内存，回收大块内存。 你这个，第一个讲的是系统分配内存的方法，或者策略。  第二个讲的是算法。 虽然，解决他的那个问题，是绰绰有余的。  但是，第一个有点杀鸡用牛刀的味道， 这是操作系统，和编译系统的库函数里，分配内存的方法。 自己从0开始，也是可以的。  不过，分配小块内存，比如 char 较多时，并且分配，释放频繁时，会产生叫较多的碎片。  所以，这种时候，用内存池分配单一元素，碎片就比较少一点，而且基本都在内存池内部。 内存池，用于不确定大小的数组分配，就不是很合适，不如直接用库函数，等系统提供的分配机制。  第二个HASH 比较实用，链就有点不够具体的了。

user: user-2
content: 不懂什么叫外部碎片、、、、、、　 管理空间： 伙伴系统 +　ＳＬＡＢ？？？？？？ 定长定界就考虑：ＨＡＳＨ　链

user: user-3
content: 想要避免内存碎片到是可以, 好肯定要合并小碎片, 移动内存数据, 这个效率就大大降低了.  性能与碎片需要你自己去平衡, 现在采用的基本都是性能优先.

user: user-4
content: 引用 楼主 zhuangdaizi 的回复:如题？？求教设计一种没有外部碎片的内存管理方案  完全可以，你可以申请一大片内存A，然后重载new，在你的内存中分配,当然你得做好这片内存的发放和收回，还得重载delete，进程结束前，释放A

user: user-5
content: 内存池还是很好实现的, 但要制造一个业界顶尖的需要学学jemalloc这种。

user: user-6
content: 引用 楼主 zhuangdaizi 的回复:如题？？求教设计一种没有外部碎片的内存管理方案  如果有，其内部碎片一定惊人

user: user-1
content: 最可靠的是，垃圾回收，和handle 机制，对象在内存时可移动的。当碎片较多时，移动对象，集中起来，进行整理，把碎片聚零为整，这个就是CLR的机制了，.net 就是这么干的，java 好象也是。

user: user-1
content: 每个对象大小相同，一次分配一个对象。（不分配数组） 然后，内存池，就几乎不会产生外部碎片了。

user: user-7
content: 只能尽量减少吧！不能完全避免的！ 内存池是是应该考虑的

user: user-8
content: 你可以试试，呵呵。除非加强条件，比如最小分配单位是page
user-0 提问: 求查此程序在最后为什么会执行错误

回复:
user: user-0
content: soga ,通过这个问题学到了挺多，谢各位大神们

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-2
content: 这个一般只能自己单步调试。或者谁有功夫，给你调试一下。

user: user-0
content: 最后一句好像确实没用，前面那句是做成循环链表的语句

user: user-3
content: h -> next = L -> next;  p = h -> next;  你是要干嘛呢？表示没看懂

user: user-4
content: 引用 4 楼 u010461582 的回复:[quote=引用 3 楼 buyong 的回复:] 这个一般只能自己单步调试。或者谁有功夫，给你调试一下。 表示调试无果，问了一个大神，说是不要随便写while（p），事实也证明确实是这个的问题，大神可否解释下为什嘛[/quote] while(p != NULL) // p 为某指针类型的判断  while( p ) //针对 p为bool类型来判断的

user: user-0
content: 表示已经找到问题了，谢谢各位的讨论。 我找到的问题是，所建立的链表是循环链表，当链表中只剩下一个元素的时候，p = p -> next = p -> next -> next.可以看到Delete函数陷入了死循环这就程序就无法跳出Delete函数了的说，所以出现的错误。 解决方案有两个，一个就是被我/*   */里面的该法，另一种就是让循环在还剩一个节点的时候跳出，条件改成while(p -> next != p)循环结束后，再输出p -> data.这样就对啦。            此乃渣渣领悟的拙见（不对，这个见解是大神想出来的，表述是渣渣的），有什嘛问题望大神们不吝赐教。

user: user-0
content: 引用 3 楼 buyong 的回复:这个一般只能自己单步调试。或者谁有功夫，给你调试一下。 表示调试无果，问了一个大神，说是不要随便写while（p），事实也证明确实是这个的问题，大神可否解释下为什嘛
user-0 提问: MFC基于对话框,设置鼠标图形

回复:
user: user-1
content: 你说的是模态对话框么。。。。

user: user-2
content: 系统API. SetCursor是可以改变全局光标的, 但是呢, 程序都有动态修改功能,所以就不能保证移动到其它程序区域还有效.  最直接的办法就是修改系统主题.

user: user-3
content: 编程只能决定你的鼠标在哪个对话框中显示什么样的，移出的话就是相对其他应用程序的类型了，想做到你的要求，直接改变系统的光标类型呗

user: user-0
content: 呵呵,各位不好意思哈,只要鼠标按下不放 就能保证设置的鼠标图标不变.
user-0 提问: C语言，栈的实现，报错。

回复:
user: user-1
content: 2013-10-17  Anonymous 9:45:11  #include <stdio.h> #include <malloc.h>  #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10  typedef struct {     char *base;     char *top;     int stacksize; }OPTR;  int InitStack(OPTR *S)//运算符 {     S->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));     if(!S->base) return 0;     S->top = S->base;     S->stacksize = STACK_INIT_SIZE;     return 1; }   int StackEmpty(OPTR *S) {     if(S->base == S->top) return 1;     else return 0; }   int Push1(OPTR *S,char e) {     if(S->top - S->base >= S->stacksize)     {         S->base = (char *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(char));         if(!S->base) return 0;         S->top = S->base + S->stacksize;         S->stacksize += STACKINCREMENT;     }     *S->top++ = e;     return 1; }    int Pop1(OPTR *S,char *e) {     if(S->top == S->base) return 0;     e = *--S->top;     return e; }   这样照着改

user: user-2
content: 引用的问题，C里面没有引用

user: user-3
content: 函数定义参数可以直接写地址吗？ Status InitStack(SqStack &S) 不应该是SqStack * S

user: user-4
content: 引用 1 楼 xiaoliang1201 的回复:楼主这是用哪种语言写的？？？C语言函数传参是没有引用传递的。只有值传递和地址传递。+++++++++++

user: user-5
content: 楼主这是用哪种语言写的？？？C语言函数传参是没有引用传递的。只有值传递和地址传递。

user: user-6
content: 把文件格式改为*.cpp，引用是C++中的，C语言里没有引用； 如果不想改，那就用指针吧，把运算符“.”改为“->”，在调用的时候，改为传地址，而不是被引用的值。
user-0 提问: 求大神分析openssH源码中的收发包函数~~

回复:
user: user-0
content: 引用 1 楼 Idle_Cloud 的回复:这个的封装是会有很多层，你可以搜索socket，反向搜索看看能不能找到，因为通信终究是要使用socket那一套函数。 这个封装的太多了，看不懂啊~~

user: user-1
content: 这个的封装是会有很多层，你可以搜索socket，反向搜索看看能不能找到，因为通信终究是要使用socket那一套函数。

user: user-2
content: 引用 2 楼 lileilei2b 的回复:[quote=引用 1 楼 Idle_Cloud 的回复:] 这个的封装是会有很多层，你可以搜索socket，反向搜索看看能不能找到，因为通信终究是要使用socket那一套函数。 这个封装的太多了，看不懂啊~~[/quote]  一层一层的慢慢的向里面看，先不要太看重实现细节，理清楚框架思路先！拿笔画画！  ps：尽量不要重复发贴
user-0 提问: 结构中伸缩性数组为什么显示指针转换错误 

回复:
user: user-1
content: 引用 4 楼 xiaobaiwupen 的回复:[quote=引用 2 楼 relaxisland 的回复:] 楼上说的对 不过在 内存分配之前，做如下操作， 不会爆掉？  fp->a=i; 不会吧  只是动态数组的内存空间没有分配 之前定义结构的时候int a 已经说明了 结构至少要有一个整数型内存空间[/quote] 只是说明了要有  可是你没有给  你不觉得fp 在分配内存之前是野指针吗？ 如果不分配内存就能往里面塞东西的话 那么后面也就没必要malloc

user: user-0
content: 引用 2 楼 relaxisland 的回复:楼上说的对 不过在 内存分配之前，做如下操作， 不会爆掉？  fp->a=i; 不会吧  只是动态数组的内存空间没有分配 之前定义结构的时候int a 已经说明了 结构至少要有一个整数型内存空间

user: user-2
content: lz 用的 c++ 的 compiler

user: user-3
content: 楼上说的对 不过在 内存分配之前，做如下操作， 不会爆掉？  fp->a=i;

user: user-4
content: fp=(struct book *)malloc(sizeof(struct book)+n*sizeof(int));  malloc返回的是void*，要强制转换下。
user-0 提问: 如何把一个自定义（编写）的函数变成一个独立的文件

回复:
user: user-1
content: A.C： FILE *fp1;   fp1=fopen("c:\\test.txt","rw");  for (i=0;i<10;i++)  {      fscanf(fp1,"%d",&a[i]);  printf("%d",a[i]);  }      fclose(fp1); #include <stdio.h>  int a[11],i,k,x;  void xiugai()  {  scanf("%d%d",&k,&x);  for (i=10-1;i>k;i--)  a[i+1]=a[i];  a[k-1]=x;  }   void myp()  {  for (i=0;i<10;i++)   printf("%d",a[i]);   }  void main()  { #include "A.C" printf("输入更改的位数，和更改的内容");   xiugai();  myp();  }

user: user-2
content: 写成函数，单独放在一个c 文件中，为其建立头文件，并将它们添加到你目前的 project 中，

user: user-3
content: 例如 独立的文件 叫做 special.c #include <stdio.h>  void special_deal() { FILE *fp1;   fp1=fopen("c:\\test.txt","rw");  for (i=0;i<10;i++)  {      fscanf(fp1,"%d",&a[i]);  printf("%d",a[i]);  }      fclose(fp1);printf("输入更改的位数，和更改的内容");  } 之后你头文件引用 在主函数中 在主函数文件中加入 #include "special.h" void main()  {   special_deal();        xiugai();  myp();  }

user: user-3
content: 静态库 动态库的封装  管理.c文件 和.h文件  或者只能用 函数宏来实现 或者把它封装成一个函数
user-0 提问: 无法打开源文件

回复:
user: user-0
content: 引用 13 楼 china_jeffery 的回复:这个不是错误，只要编译不报错就行了  代码没错误，但调试不了。

user: user-1
content: 这个不是错误，只要编译不报错就行了

user: user-2
content: 引用 5 楼 turingo 的回复:直接安装带有mingw的那个版本。[/quote] 谢谢！

user: user-3
content: path设置对吗？

user: user-4
content: 直接安装带有mingw的那个版本。  引用 4 楼 lm_whales 的回复:[quote=引用 3 楼 turingo 的回复:] 推荐用Code::Blocks(http://www.codeblocks.org/)。  [quote=引用 楼主 Explorer_day 的回复:]    如图，不管什么头文件都无法打开，在网上查了好久也解决不了。本人菜鸟一个，望前辈们赐教。[/quote] 请问 gdb 怎么装  [/quote]

user: user-2
content: 引用 3 楼 turingo 的回复:推荐用Code::Blocks(http://www.codeblocks.org/)。  [quote=引用 楼主 Explorer_day 的回复:]    如图，不管什么头文件都无法打开，在网上查了好久也解决不了。本人菜鸟一个，望前辈们赐教。[/quote] 请问 gdb 怎么装

user: user-4
content: 推荐用Code::Blocks(http://www.codeblocks.org/)。  引用 楼主 Explorer_day 的回复:   如图，不管什么头文件都无法打开，在网上查了好久也解决不了。本人菜鸟一个，望前辈们赐教。

user: user-5
content: 引用 楼主 Explorer_day 的回复:   如图，不管什么头文件都无法打开，在网上查了好久也解决不了。本人菜鸟一个，望前辈们赐教。 intellisense先关掉一下

user: user-6
content: 这可能是编译环境有问题，建议重装一下VC

user: user-7
content: 换个VC版本试试

user: user-8
content: 打开方式不对。  用别的环境打开试试

user: user-9
content: 实在搞不懂 留下qq 远程帮你看一下 或者帮你装个codeblocks

user: user-10
content: VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 引用 2 楼 u012071720 的回复:这可能是编译环境有问题，建议重装一下VC  都已经重装两遍了，解决不了。
user-0 提问: 想从文本文件里提取字符，输出到屏幕

回复:
user: user-1
content: [quote=引用 3 楼 qq523176585 的回复:] 仅供参考  #include <stdio.h>  int main() { 	FILE *fp; 	int i,a[10] = {0}; 	 	fp=fopen("1.txt","r"); 	for (i=0;i<10;i++) 	{ 		fscanf(fp,"%d",&a[i]); 		printf("%d\n",a[i]); 	}     fclose(fp);  	return 0; }   1.txt的文件内容如下 123 122 212 14511 1251 12514 141251 2524125 1251412 1236541 2145   fscanf遇到空格停止读数据

user: user-1
content: 仅供参考  #include <stdio.h>  int main() { 	FILE *fp; 	int i,a[10] = {0}; 	 	fp=fopen("1.txt","r"); 	for (i=0;i<10;i++) 	{ 		fscanf(fp,"%d",&a[i]); 		printf("%d\n",a[i]); 		fseek(fp,1,1); 	}     fclose(fp);  	return 0; }   1.txt的文件内容如下 123 122 212 14511 1251 12514 141251 2524125 1251412 1236541 2145    fscanf()函数不能是文件指针下移。

user: user-2
content: fp1=fopen("c:\\test.txt","r"); 你改成这个 读出来的时候 加上空格 printf("%d ",a[i]);

user: user-2
content: 这是我以前写的一个例子 你可以参考下 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> // //实现魔塔地图读取器 ，地图编辑器 编辑好地图后存入txt文件  本程序实现读取 // bool write_map(char *filename,char (*pos)[14]) {     FILE * fd;     int i, j ;     fd = fopen(filename,"w");      for(i = 0 ; i < 14 ; i++)         for(j = 0; j < 14 ;j++)                   fprintf(fd,"%d ",pos[i][j]);//必须有空格 要不读的时候会出问题      fclose(fd);      return true;  } bool read_map(char *filename,char (*pos)[14]) {     FILE * fd;     int i, j ;     fd = fopen(filename,"r");      for(i = 0 ; i < 14 ; i++)         for(j = 0; j < 14 ;j++){                    fscanf(fd,"%d",&pos[i][j]);         }     fclose(fd);      return true; } int main() {     int i ;     int j ;      int8_t pos[14][14] ;     int8_t pos1[14][14] ;    read_map("E:\\write.txt",pos1);      for(i = 0 ; i < 14 ;i++)         for(j = 0 ; j < 14 ;j++){             printf("%d\n",pos1[i][j]);         }    // write_map("E:\\wtite.txt",pos1);      return 0; }
user-0 提问: atof()转换问题,如何不转换成科学计数法

回复:
user: user-0
content: #include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream> using namespace std; int main() { char s1[100]="21"; char s3[100]="19"; char *M_show; double num; static char buf[40]; num=atof(s1)+atof(s3); sprintf(buf,"%.15lg",num); M_show=(char *)buf; cout<<M_show;//40 return 0; } 代码很好用，是我错了，问题解决，谢谢给位，让这个计算器程序可以完成了。

user: user-1
content: #include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream> using namespace std; int main() {     char s1[100]="21";     char s3[100]="19";     char *M_show;     double num;     static char buf[40];      num=atof(s1)+atof(s3);     sprintf(buf,"%.15lg",num);     M_show=(char *)buf;     cout<<M_show;//40     return 0; }

user: user-2
content: double test=10000000000.1111111111111111111; 	int sz=sizeof(double); 	char cDisp[25]; 	sprintf(cDisp, "%.8f", test);   cdisp显示普通形式

user: user-0
content: 一楼的的帮助谢谢，不过没有用，我的错误是数值超过六位，就好用科学计数法表示

user: user-0
content: 5楼的代码也用了，没有效果， std::ios_base::fixed 可以解释是什么意思吗？

user: user-0
content: 7楼的东西没有用，测试代码如下，不知道对不对 	char s1[100]="21"; 	char s3[100]="19"; 	char *M_show=""; 	int num;     num=atof(s1)+atof(s3); 	static char buf[40]; 	sprintf(buf,"%.15lg",num); //	M_show=(char *)buf; 	cout<<M_show;     return 0;

user: user-1
content: num=atof(s1)+atof(s3); static char buf[40]; sprintf(buf,"%.15lg",num); M_show=(char *)buf;

user: user-3
content: 用 gcvt函数吧

user: user-4
content: ostringstream oss;     oss<< std::ios_base::fixed << num;     k=oss.str();     M_show=k.c_str();

user: user-5
content: 引用 2 楼 turingo 的回复:跟数值本身没有关系，是输出格式的缘故，可以试试用printf自定义格式输出。 +++

user: user-6
content: 确认下 你的num变量是什么类型！ 用标准输出看看，是否得到正确数值

user: user-7
content: 跟数值本身没有关系，是输出格式的缘故，可以试试用printf自定义格式输出。  引用 楼主 u011930458 的回复:num=atof(s1)+atof(s3);     ostringstream oss;     oss<<num;     k=oss.str();     M_show=k.c_str();  这是程序的部分代码，当输入的数字过大时，num会变为科学计数法表示，如何将科学计数法表示的num变为double类型，大神指导 我要保证double类型转变为字符串类型时，是使用普通的数组表示，谢谢各位了

user: user-8
content: 这样不行吗 加强转不行吗 num = double(atof(s1))+double(atof(s3));
user-0 提问: 从语言的整数分割

回复:
user: user-1
content: #include <stdio.h> int main() {     int n, c[10], k, i;     scanf("%d", &n);     k = 0;     while (n){         c[k++] = n%10;         n /= 10;     }     for (i=k-1; i>0; i--)         printf("%d ", c[i]);     printf("%d\n", c[0]);     return 0; }

user: user-2
content: 引用 3 楼 caozhy 的回复:说错了。  是让整数转换成字符。  ascii中0~9字符是连续排列的。 因此 '0' + 0 = '0' '0' + 1 = '1' ...  小白求解：为何不能直接用整型输出，要用字符型输出呢？

user: user-3
content: 看 ASCII 码表

user: user-4
content: 我说错了 ‘0’是字符  是char型的  你加上‘0’ 相对于ASCII 48 在加上取余的 那个 用char输出就是 int     ASCII 0       48 1 。。。 49 2 。。。 50 3 。。。 51 4 。。。 52 5 。。。 53 6 。。。 54 7 。。。 55 。。。。。。

user: user-5
content: 说错了。  是让整数转换成字符。  ascii中0~9字符是连续排列的。 因此 '0' + 0 = '0' '0' + 1 = '1' ...

user: user-4
content: c[k++] = (n%10)+'0'; '0' 是字符串啊 你把整数和‘0’ 相加 等于加上‘0’的ASCII码 就是整形数48 你输出的时候是用char输出的 所有的加上相对的偏移量

user: user-5
content: C语言规定，用字符数组保存字符串，必须以'0'作为结尾。 表示这是数组的结尾。
user-0 提问: linux一个简单的fork

回复:
user: user-0
content: 还有没有大牛了呢？

user: user-1
content: 引用 3 楼 max_min_ 的回复:子进程的输出缓冲阻塞了！没有刷新输出缓冲区！ 加"\n"或者fflush(stdout)都可以！  ps: 上面加法减法程序printf函数少了一个左双引号！  ++

user: user-0
content: /*子函数修正*/ //add.c #include<stdio.h>  int main()  {              int a=3,b=2;              printf("a+b=%d\n",a+b);                return 0;  }//minus.c #include<stdio.h>  int main()  {               int a=3,b=2;               printf("a-b=%d\n",a-b);                 return 0;  }

user: user-2
content: 子进程的输出缓冲阻塞了！没有刷新输出缓冲区！ 加"\n"或者fflush(stdout)都可以！  ps: 上面加法减法程序printf函数少了一个左双引号！

user: user-3
content: printf("child process running , minus sucessed!"); 改为 printf("child process running , minus sucessed!\n"); 试试

user: user-0
content: //minus函数修正 //minus.c  #include<stdio.h> int main() {     int a=3,b=2;     printf(a-b=%d\n",a-b);      return 0; }
user-0 提问: c语言跟文件的关联，没错误但运行不了，求帮忙

回复:
user: user-1
content: 3.因为读取的是字符，所以在请使用%c 补充：我已经测试好了的，fscanf和fprintf都用%c

user: user-1
content: #include <stdio.h> FILE *fp1; FILE *fp2; int a[5],i; int main() {  fp1=fopen("g:\\5.txt","r");  fp2=fopen("g:\\6.txt","w");  if(fp1==NULL)  	printf("fp1 is NULL\n");  if(fp2==NULL)  	printf("fp2 is NULL\n");  for (i=0;i<5;i++) 	fscanf(fp1,"%c",&a[i]);  for (i=0;i<5;i++) 	fprintf(fp2,"%c",a[i]);  fclose(fp1);  fclose(fp2);  return 0; }   /*C-Free5.0编译成功，你要实现的功能应该是将文件的前5个字符从5.txt复制到6.txt吧，若是如此： 1.请保证5.txt存在，最好内容不少于5个字符； 2.一般请不要放在c盘，一般c盘这样是写不进数据的，需要管理员权限才可以； 3.因为读取的是字符，所以在请使用%,你可以用%d测试一下，看看，文件里面显示的内容，那么前面也最好定义为char a[5];。 仅供参考。 */

user: user-2
content: 引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 user-3 的回复:] 加上这几句判断，打印，看看是提示啥错误     perror("main:"); 就可以了 [/quote]对了 冒号是多余的  直接  perror("main");

user: user-2
content: 引用 2 楼 user-3 的回复:加上这几句判断，打印，看看是提示啥错误     perror("main:"); 就可以了

user: user-3
content: 加上这几句判断，打印，看看是提示啥错误  #include <errno.h>  FILE *fp1 = NULL ; FILE *fp2 = NULL ; fp1=fopen("c:\\5.txt","r"); fp2=fopen("c:\\6.txt","w"); if( fp1 == NULL )     printf(" open 5.txt failed :%s\n", strerror(errno)); if( fp2 == NULL )        printf(" open 6.txt failed :%s\n", strerror(errno));

user: user-2
content: 打赌  我读你C盘下 根本没有 5.txt 这个文件  你输了要请我吃饭哈
user-0 提问: 求大神解释openssh中数据包的构造！！

回复:
user: user-1
content: 一层一层的向里面剥嘛， 先把框架理清楚，再去看实现的细节！

user: user-0
content: 引用 1 楼 wangdahu888 的回复:太笼统了,建议先学一下提问的技巧 我就是想问一下，使用openssh发送数据时数据包的构造的整个过程~~

user: user-2
content: 太笼统了,建议先学一下提问的技巧
user-0 提问: STC串口中断问题，请各位老师帮帮我！

回复:
user: user-1
content: 引用 2 楼 u011642985 的回复:请问一下 我的串口助手上设置的波特率是19200，然后给它发送数据，没反应。你的检查波特率是检查这个波特率的意思吗？ 检查波特率是指你单片机和上位机设置是否一致。

user: user-2
content: 示波器有没有？看看Tx脚上有没有信号输出

user: user-0
content: 请问一下 我的串口助手上设置的波特率是19200，然后给它发送数据，没反应。你的检查波特率是检查这个波特率的意思吗？

user: user-1
content: #define BAUD  2400 #define BAUD2 19200  检查波特率
user-0 提问: 通过Makefile.am和configure.in自动生成Makefile的问题

回复:
user: user-1
content: 这个不是通过时间戳来决定是否重新生成的吗 每个文件都有生成时间 和修改时间的 一个结构体的值 不是判定 当如果修改了 就重新生成 没有的话不会重新生成 貌似 我以前都是 touch *.c 之后一定会重新生成
user-0 提问: 【背包问题。】

回复:
user: user-1
content: 根据我从这两个连接里面所了解的,你这个问题,不是0,1背包,是二维背包. 他那里给出的是一维数组,如果你的程序,没问题的话,估计就是空间复杂度太高. O(N^2) 我也运行了你的程序,好像是对的. 我对这个问题,理解的和肤浅,还不能具体看出来,你的程序有没有错误.  他那里,好像也有个,用二维数组的,他说,可以改成一维的; 并且说,没有解决,时间复杂度问题,但是解决了,空间复杂度问题了.  如果,你的问题,和他的那个问题,性质相同,那么程序没错,就是空间复杂度问题了. 不知是不是这样.

user: user-0
content: 引用 9 楼 lm_whales 的回复:搜到两个关于背包问题的链接。感觉还可以。 前一个是01背包，后一个泛论一下。觉得可以看一下。 http://www.baidu.com/link?url=4z0M_wdTSkvvx9qjLILOumedEogFKRdjrCb0cQR3oYFPF40rN1gAQjpEps http://baike.baidu.com/view/841810.htm我用的二维数组，知道我的哪里错了吗

user: user-1
content: 搜到两个关于背包问题的链接。感觉还可以。 前一个是01背包，后一个泛论一下。觉得可以看一下。 http://www.baidu.com/link?url=4z0M_wdTSkvvx9qjLILOumedEogFKRdjrCb0cQR3oYFPF40rN1gAQjpEps http://baike.baidu.com/view/841810.htm

user: user-2
content: #include <stdio.h> #include <stdlib.h> #define MAX(A,B) ((A)>(B)?(A):(B)) #define SIZE 5 #define MAXVOL 12 int main(void) {  int v[SIZE] = {8,3,4,5,6}; // 体积  int p[SIZE] = {12,4,3,6,8}; // 价值    int kp[MAXVOL + 1] = {0}; // 背包  int i,j,max=0;     for (i=0; i<SIZE; ++i)   {     /* 对各个已经可计算的背包价值进行记录, 已经取了v[i], 计算记录的背包容量范围，必然是从v[i]到 MAXVOL */     for (j=MAXVOL; j>=v[i]; --j)      {        printf("old[%d] = %d, cur[%d] = %d, \n", j, kp[j], j, kp[j-v[i]] +p[i]);        kp[j]=MAX(kp[j], kp[j-v[i]] +p[i]);        max=MAX(kp[j], max);     } }       printf("\n\nMAX VALUE: %d\n", max);  system("Pause");  return 0; } 仅供参考

user: user-1
content: 1000 个数据，光是输入也累得要死。 所有数据0～1000；n 和V 都可能达到1000 而且还不一定只有一批数据，你用控制台时间够吗？？3000ms 只有3秒 如果数据有100 批光输入数据，也不够。 //w数组表示 输入苹果的价钱，c表示质量。n表示苹果个数，v表示背包容量。  这个注释很不好 题目告诉你， 应该表示苹果的大小，你写的是质量，这个注释简直就是给人添堵的。 一点都没有达到注释的要求。

user: user-1
content: 没有错误，就是时间了。 控制台输入输出太耗时了。 用文件吧。 一般这种问题，都是用文件输入输出的。 文件比控制台快多了。

user: user-0
content: 引用 2 楼 lm_whales 的回复:1）按照体积价值比例排序 ，对分数 价值 / 体积 排序 2）从小到大装包 3）如果，还有苹果没装，但是体积不够装一个的了，查找最值钱的替换方案。 直到 转满或找不到为止。我的那种理解01背包 应该没有错。

user: user-0
content: 引用 1 楼 user-2 的回复:#include <stdio.h> #include <stdlib.h> #define MAX(A,B) ((A)>(B)?(A):(B)) #define SIZE 5 #define MAXVOL 12 int main(void) {  int v[SIZE] = {8,3,4,5,6}; // 体积  int p[SIZE] = {12,4,3,6,8}; // 价值    int kp[MAXVOL + 1] = {0}; // 背包  int i,j,max=0;     for (i=0; i<SIZE; ++i)   {     /* 对各个已经可计算的背包价值进行记录, 已经取了v[i], 计算记录的背包容量范围，必然是从v[i]到 MAXVOL */     for (j=MAXVOL; j>=v[i]; --j)      {        printf("old[%d] = %d, cur[%d] = %d, \n", j, kp[j], j, kp[j-v[i]] +p[i]);        kp[j]=MAX(kp[j], kp[j-v[i]] +p[i]);        max=MAX(kp[j], max);     } }       printf("\n\nMAX VALUE: %d\n", max);  system("Pause");  return 0; } 仅供参考我感觉我按01背包写的没有问题，能帮忙找找我程序的错吗

user: user-1
content: 另外控制台输入输出，是很耗时的，最好用文件输入输出。

user: user-1
content: 2）搞错了，按照 价值 / 体积比例，从大到小装包  还有一种方案，先按体积从小到大装包。 然后按价值查找替换方案。

user: user-1
content: 1）按照体积价值比例排序 ，对分数 价值 / 体积 排序 2）从小到大装包 3）如果，还有苹果没装，但是体积不够装一个的了，查找最值钱的替换方案。 直到 转满或找不到为止。
user-0 提问: 关于socket 抓包 求大神

回复:
user: user-0
content: 引用 5 楼 caigzhi 的回复:从以太层开始解析，下一层就是PPPoE。不是解析 而是抓包，包都没抓到何来的解析

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:使用winpcap吧，socket不能解析到链路层的。 这个是windows下的吧 linux下能用么

user: user-0
content: 继续顶！！，，

user: user-1
content: 从以太层开始解析，下一层就是PPPoE。

user: user-1
content: winpcap

user: user-2
content: 用开源库把  SOCKET自带的太慢了，别人有封装好的，PFRING 内核抓包！

user: user-0
content: 顶上去 反反复复反复

user: user-3
content: 使用winpcap吧，socket不能解析到链路层的。
user-0 提问: 在指定位置插入字符

回复:
user: user-1
content: 引用 2 楼 user-3 的回复:void insert(char s[] , char t, int i) {     char *p = s;     while (*p++); // 结果p指向'\0'下一个字符     while (p > &s[i]) {         *p = *(p - 1);         --p;     }     *p = t; } ++

user: user-2
content: char *strcat(char *dest,char *src); 但是你传参数的时候确实一个字节！所以再改改吧

user: user-3
content: void insert(char s[] , char t, int i) {     char *p = s;     while (*p++); // 结果p指向'\0'下一个字符     while (p > &s[i]) {         *p = *(p - 1);         --p;     }     *p = t; }

user: user-3
content: strcat(string, t)有问题
user-0 提问: linux 网络编程 求推荐开源代码

回复:
user: user-1
content: 网络编程的API基本是通用的，这有很多socket例子： http://download.csdn.net/detail/geoff08zhang/4571358

user: user-0
content: 引用 3 楼 qq120848369 的回复:学我的吧： https://code.csdn.net/qq120848369/ez_poll/tree/master 我看你代码用的是C++，但是C++没学过啊，我学的是linux C

user: user-2
content: 学我的吧： https://code.csdn.net/qq120848369/ez_poll/tree/master

user: user-3
content: http://www.baidu.com/s?wd=unix%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%20%E6%BA%90%E7%A0%81&rsp=8&f=1&oq=Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0&tn=haojs&ie=utf-8&rsv_ers=xn0&rs_src=0 百度下很多的！ 网络的东西比较多比较杂！慢慢来 ps： 学会使用wireshake抓包工具，分析！
user-0 提问: fread/fwrite与read/write哪个更快？

回复:
user: user-1
content: 权威教程  unix 环境高级编程  里面有对比 推荐用 fopen

user: user-2
content: 我平常使用不大会去使用open/read/write ,基本是使用 fopen/fread/fwrite, 另设置一合适缓冲大小,减少I O的频繁度

user: user-3
content: 一般是 fopen/fread/fwrite 快

user: user-4
content: 在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快

user: user-5
content: open/read/write更快，前提是你要给他弄一个合适的输入/输出缓冲区。

user: user-6
content: ++  引用 1 楼 user-7 的回复:http://blog.163.com/zhaohai_1988/blog/static/2095100852012623105329412/ 参考下

user: user-7
content: http://blog.163.com/zhaohai_1988/blog/static/2095100852012623105329412/ 参考下
user-0 提问: 浮点数强制转换和直接截断的区别

回复:
user: user-1
content: data 赋值为 1.9 自己运行看输出

user: user-2
content: 引用 3 楼 nice_cxf 的回复:强转是去掉了小数点后边，%.0lf是四舍五入，难道不知道自己测试下么？ 人家就是不知道才问嘛。

user: user-3
content: MOVSD传送双字  一个用了eax       cvttsd2si   eax,mmword ptr [data] //cvttsd2si r32,XMM/m64 类似cvtsd2si,截断取整.  另一个用了 xmm0    movsd      xmm0,mmword ptr [data]//用了printf的实现的函数处理 详情看C标准库printf的实现

user: user-4
content: 强转是去掉了小数点后边，%.0lf是四舍五入，难道不知道自己测试下么？

user: user-3
content: 区别在于 请看反汇编代码 printf("%d",int(data));             //强制类型转换后输出 002C13FB  cvttsd2si   eax,mmword ptr [data]   002C1400  mov         esi,esp   002C1402  push        eax   002C1403  push        2C5858h   002C1408  call        dword ptr ds:[2C92C0h]   002C140E  add         esp,8   002C1411  cmp         esi,esp   002C1413  call        __RTC_CheckEsp (02C1136h)    printf("%.0lf",data);  //直接舍弃小数位 002C1418  mov         esi,esp   002C141A  sub         esp,8   002C141D  movsd       xmm0,mmword ptr [data]   002C1422  movsd       mmword ptr [esp],xmm0   002C1427  push        2C585Ch   002C142C  call        dword ptr ds:[2C92C0h]   002C1432  add         esp,0Ch   002C1435  cmp         esi,esp   002C1437  call        __RTC_CheckEsp (02C1136h)

user: user-3
content: 可以通过啊 只不过输入的是俩个数连一起了大哥 比如 int main() {   	 double data = 5.2;  printf("%d",int(data));             //强制类型转换后输出  printf("%.0lf",data);  //直接舍弃小数位  getchar(); }  输出55 你都没加空格 连在一起了

user: user-5
content: 强转如果数据太大，不论截断取整，还是转换成最大值都是一种错误。 数据不能转换回来了误差就非常大。  输出截断，只是省略，一些位不写，可能还有舍入，误差可控-- 比如 %.0f,是有舍入的吧，截断误差 <= 0.5。--- 不会出现控制不了的局面。  即使自己截断  比如 使用floor,ciel 函数， 误差 < 1 ，误差同样可控。  强转是不可控的，如果需要使用； 必须确保你知道，它的结果，是你可以接受的。
user-0 提问: 新手c语言问题

回复:
user: user-1
content: 引用 3 楼 turingo 的回复:字符串交换不能直接赋值，要用strcpy复制内容。你弄错了 这里是只能 直接赋值交换 不能strcpy复制内容

user: user-0
content: 引用 3 楼 turingo 的回复:字符串交换不能直接赋值，要用strcpy复制内容。  [quote=引用 楼主 u012142460 的回复:] 一个指针数组的问题  奖若干字符串按字母顺序（由小到大）输出 #include"stdio.h" #include"string.h" void main() {  void sort(char * name[],int n);  void print(char * name[],int n);  char * name[]={"Follow","BASIC","Great","ZORTRAN","Computer"};  int n=5;  sort( name,n);  print( name,n); }  void sort(char * name[],int n)  {   int i,j,k;   char *temp;   for(i=0;i<n-1;i++)   {    k=i;    for(j=i+1;j<n;j++)         if(strcmp(name[k],name[j])>0)k=j;   /*比较字符串的大小*/        if(k=!i)         { temp=name[i];name[i]=name[k];name[k]=temp;}    }   }    void print(char * name[],int n)  {    int i;    for(i=0;i<n;i++)    {     printf("%s\n",name[i]);    /*输出比较后的字符串*/    }       为什么输出的是这样呢[/quote] 但是前两个不是交换成功了吗

user: user-0
content: 引用 2 楼 buyong 的回复:你这个就是冒泡，最后一个好像处理的不对 可否细说一下

user: user-0
content: 引用 8 楼 qin_moon 的回复:额  貌似是这一句      if(k=!i)          { temp=name[i];name[i]=name[k];name[k]=temp;}          判断不相等符号写错了  把=!改成!= 就ok啦 好吧好吧 这错误犯得太不着调了

user: user-2
content: 额  貌似是这一句      if(k=!i)          { temp=name[i];name[i]=name[k];name[k]=temp;}          判断不相等符号写错了  把=!改成!= 就ok啦

user: user-3
content: 仅供参考  #include <stdio.h> #include <string.h> #include <ctype.h>  void sort(char * name[],int n); void print(char * name[],int n);   int main() { 	char *name[]={"what","how old are you","Thanks","Follow","BASIC","Great","ZORTRAN","Computer"}; 	int n = 8; 	sort(name,n); 	print(name,n); }  void sort(char *p[],int n) { 	int i,j; 	char *temp; 	for (i = 0; i<n; i++) 	{ 		for (j = n-1; j>i; j--) 		{ 			if (toupper(*p[j]) < toupper(*p[j-1])) 			{ 				temp = p[j-1]; 				p[j-1] = p[j]; 				p[j] = temp; 			} 		} 	} }   void print(char *name[],int n) {  	int i; 	for(i=0;i<n;i++) 	{ 		printf("%s\n",name[i]);    /*输出比较后的字符串*/ 	} }

user: user-4
content: 字符串交换不能直接赋值，要用strcpy复制内容。  引用 楼主 u012142460 的回复:一个指针数组的问题  奖若干字符串按字母顺序（由小到大）输出 #include"stdio.h" #include"string.h" void main() {  void sort(char * name[],int n);  void print(char * name[],int n);  char * name[]={"Follow","BASIC","Great","ZORTRAN","Computer"};  int n=5;  sort( name,n);  print( name,n); }  void sort(char * name[],int n)  {   int i,j,k;   char *temp;   for(i=0;i<n-1;i++)   {    k=i;    for(j=i+1;j<n;j++)         if(strcmp(name[k],name[j])>0)k=j;   /*比较字符串的大小*/        if(k=!i)         { temp=name[i];name[i]=name[k];name[k]=temp;}    }   }    void print(char * name[],int n)  {    int i;    for(i=0;i<n;i++)    {     printf("%s\n",name[i]);    /*输出比较后的字符串*/    }       为什么输出的是这样呢

user: user-5
content: 你这个就是冒泡，最后一个好像处理的不对

user: user-6
content: 先用简单的冒泡法把 F B G  Z C 这几个字母 按照从小到大的顺序排列好！ 然后再想想这个指针数组要怎么排！
user-0 提问: 帮忙调试程序！栈的应用：行编辑器！

回复:
user: user-0
content: 引用 4 楼 u011327682 的回复:或者在你的基础上把这个改一改引用//输出栈的元素 Status print_stack(linkstack *s) { 	for(linkstack *p=s;Stack_Empty(p)==false;p=p->next) 		printf("%c",p->next->data); 	printf("\n");  	return OK; }  嗯，输出正确。。。谢谢。

user: user-1
content: 指针参数传递二级指针试试，然后单步走一遍，代码粘贴过来居然没换行，真没劲一行一行的换了....

user: user-2
content: 或者在你的基础上把这个改一改引用//输出栈的元素 Status print_stack(linkstack *s) { 	for(linkstack *p=s;Stack_Empty(p)==false;p=p->next) 		printf("%c",p->next->data); 	printf("\n");  	return OK; }

user: user-2
content: 上面的两个空格 一个是你初始定义的 top->data = -1;一个是字符串结尾的'\0'

user: user-2
content: 引用//判断栈是否为空 bool Stack_Empty(linkstack *top) { 	if(top==NULL) 		return true; 	else 		return false; }改为这个就可以。下一个为NULl，你就退出，所以少打印一个。
user-0 提问: 二维数组作为函数参数，报错。

回复:
user: user-1
content: 引用 5 楼 z1179675084 的回复:你这么做本身就不对，按你的程序，a是什么数组指针吧，类型是int（*）p；而p是什么二季指针，类型是int **p，再次理解二维数组本质上还是一维数组。那么现在调用的时候p确实是指向了你这个二维数组的首地址，那么下面呢，看看你被调用函数里面的指针运算。 *（p + 1）看第一步 p + 1 = （unsigned int ）p + 1*sizeof（*p） *p的类型是什么int *对吧，所以上面的结果是p + 1 = （unsigned int ）p + 4这是谁的地址a[0][1]的吧，几接下来干什么？ *（p + 1） 不就是取得地址a[0][1]的值吗！不是2是谁？你的问题是没有理解了二级指针与二维数组的区别，你程序编译的时候应该是有警告吧，这是说两个类型不一样，这种情况下除非你很确信这么做可以达到目的，否则最好修改的没有警告了。 接上面所说如果不修改你的函数原型，那么在调用函数里面再给他转回来， int （*ret）[2] = (int (*)2)p; 之后就可以像二维数组那样调用ret了！这里只是帮组你理解一下，最好别这么用。下面介绍一下我认为比较可取的方法。 前面说过二维数组本质上还是一维存储的所以term(int **p)可以这么写  term（int *p,int row*col） {   int i,j;   for(i = 0;i <row*col;i++ )   printf("%d"a[i]); }  } 第二种  void term(int (*p)[col],int row) //等价于void term(int p[2][col],int row)  再来看看数组名作为参数的退化  void print(int a[],int num)   ==>	void print(int *a,int num) 调用一维数组  void print(int *a[],int num)   ==>	void print(int **a,int num) 调用指针数组  void print(int a[row][col],int row)   ==>	void print(int *a[col],int row)   记得昨天晚上回去前回复过你的，如果还有问题加我Q1179675084 不好意思，最后打错一句话 void print(int a[row][col],int row)   ==>	void print(int (*a)[col],int row)

user: user-1
content: 你这么做本身就不对，按你的程序，a是什么数组指针吧，类型是int（*）p；而p是什么二季指针，类型是int **p，再次理解二维数组本质上还是一维数组。那么现在调用的时候p确实是指向了你这个二维数组的首地址，那么下面呢，看看你被调用函数里面的指针运算。 *（p + 1）看第一步 p + 1 = （unsigned int ）p + 1*sizeof（*p） *p的类型是什么int *对吧，所以上面的结果是p + 1 = （unsigned int ）p + 4这是谁的地址a[0][1]的吧，几接下来干什么？ *（p + 1） 不就是取得地址a[0][1]的值吗！不是2是谁？你的问题是没有理解了二级指针与二维数组的区别，你程序编译的时候应该是有警告吧，这是说两个类型不一样，这种情况下除非你很确信这么做可以达到目的，否则最好修改的没有警告了。 接上面所说如果不修改你的函数原型，那么在调用函数里面再给他转回来， int （*ret）[2] = (int (*)2)p; 之后就可以像二维数组那样调用ret了！这里只是帮组你理解一下，最好别这么用。下面介绍一下我认为比较可取的方法。 前面说过二维数组本质上还是一维存储的所以term(int **p)可以这么写  term（int *p,int row*col） {   int i,j;   for(i = 0;i <row*col;i++ )   printf("%d"a[i]); }  } 第二种  void term(int (*p)[col],int row) //等价于void term(int p[2][col],int row)  再来看看数组名作为参数的退化  void print(int a[],int num)   ==>	void print(int *a,int num) 调用一维数组  void print(int *a[],int num)   ==>	void print(int **a,int num) 调用指针数组  void print(int a[row][col],int row)   ==>	void print(int *a[col],int row)   记得昨天晚上回去前回复过你的，如果还有问题加我Q1179675084

user: user-2
content: void term(int p[][2]) { 	printf("*(p+1):%d",*(p+1)); }  你传递一个**p，程序怎么知道你的第二维是多大呢？

user: user-3
content: void term(int *p) { printf("*(p+1):%d",*(p+1)); } int main(){   int a[][10]={{.....}......};   term(a[0]); } 二维数组，通常传递，一级指针操作。 指针数组，也行，不过很讨厌 比如 void term(int (*p)[2]) //void term(int **p) { printf("*(p+1):%d\n",(p+1)); printf("*(p+1):%d\n",*(p+1)); printf("*(p+1):%d\n",**(p+1)); }  int main(){ int b[4][5]={。。。。。}; term(b)//错误，类型不匹配。  }

user: user-4
content: void term(int (*p)[2]) //void term(int **p) { printf("*(p+1):%d\n",(p+1)); printf("*(p+1):%d\n",*(p+1)); printf("*(p+1):%d\n",**(p+1)); }

user: user-5
content: 函数  term 并不知道 p 指向一个二维数组
user-0 提问: 求助大神！C语言网络方面

回复:
user: user-1
content: 你看看这的 http 例子 WebClnt ： http://download.csdn.net/detail/geoff08zhang/4571358

user: user-0
content: 引用 2 楼 u010152577 的回复:你看看这的 http 例子 WebClnt ： http://download.csdn.net/detail/geoff08zhang/4571358  谢谢 我先去看看！

user: user-0
content: 大神在哪！大神！
user-0 提问: 新手求解！！！求解！！！！

回复:
user: user-1
content: 仅供参考 #include <stdio.h>  int main() { 	int i; 	char s[100]; 	printf("请输入一个需要加密的字符串:"); 	gets(s); 	for (i=0; s[i]; i++) 	{ 		if (s[i] >='w' && s[i] <= 'z') 		{ 			s[i] = s[i] + 3 - 'z' + 'a'; 		} 		else if (s[i] >='W' && s[i] <= 'Z') 		{ 			s[i] = s[i] + 3 - 'Z' + 'A'; 		} 		else 		{ 			s[i] = s[i] + 4; 		} 	}  	printf("加密后的字符串:"); 	puts(s);  	return 0; }

user: user-2
content: 刷OJ题的吧……这个是入门级的啊，每个char+4就好，判断一下是不是大于‘z’/‘Z’，大于的话减掉'z'/'Z'加上'a'/'A'（如果题目要求）

user: user-3
content: #include <stdio.h> void main() { 	char a[]="China"; 	for(int i=0;i<5;i++) 		a[i] +=4; 	printf("%s",a); }

user: user-4
content: 引用 1 楼 user-5 的回复:你都说了用原来字母后面的第4个字母代替原来的字母代替了，直接+4不就好了 char c1,c2,c3,c4,c5; c1='C'+4; c2='h'+4; c3='i'+4; c4='n'+4; c5='a'+4; ++

user: user-5
content: 你都说了用原来字母后面的第4个字母代替原来的字母代替了，直接+4不就好了 char c1,c2,c3,c4,c5; c1='C'+4; c2='h'+4; c3='i'+4; c4='n'+4; c5='a'+4;
user-0 提问: C++中"\0"和'\0'的区别

回复:
user: user-1
content: 因为串的“\0”只是结束符号，所以“\0”这个串，不过是两个结束符的串而已。 字符串显示，到结束符为止。不再输出其他字符。 字符串可以链接在一起中间用'\0'分割，但是第一个'\0'后面的字符，输出串的时候都不能够输出。  字符'\0'就是ASCII为 0的字符。是个控制字符，显示为空格。 许多不显示的ASCII字符，都会显示为空格，这些多半都是控制字符。 ASCII只有128个字符，最大为127是个控制字符 del 可能会显示，也可能不会显示。 128 以上的图形字符，不是标准的ASCII码，有时称为扩充（扩展）ASCII码。

user: user-2
content: 你这个问题可以简化为2行         cout << "i"  << '\0' << "i" << endl;         cout << "i"  << "" << "i" << endl; cout << 字符 cout << 字符串 这俩最终调用的是不同的函数，字符总是会输出，\0输出为NULL，不可见字符，你看到的就是空格，而字符串则是碰到\0结束输出。

user: user-1
content: 引用 2 楼 lg1544650023 的回复:我的怎么没非法 不同编译器的string 的实现不一样，有的空串用“” 有的用NULL指针

user: user-0
content: 我的怎么没非法

user: user-3
content: s[0]访问非法呀
user-0 提问: c和指针

回复:
user: user-0
content: 正确的是：这是处理字符串第一个字符的判断条件，仅此而已

user: user-1
content: 程序是调试出来的

user: user-2
content: 那是处理开始就是空格，如果没有这句，dest会访问越界的。其他的就是如果不是空格就直接赋给dest，如果是空格，就判断dest前一个是否是空格了，如果不是，赋值空格，如果前一个也是空格，跳过

user: user-3
content: 你自己动手画一画，如果第一个就是就为空呢？
user-0 提问: 一个整数，一个浮点数，求倒数，求指导

回复:
user: user-0
content: en ,多谢指导,

user: user-0
content: 刚开始学，有点搞不懂

user: user-1
content: 引用 2 楼 AnYidan 的回复:scanf("%f,%f",&a,&b);  错误  c=1.0/a; 数学上的定义不是很清楚，计算机中，int的倒数是什么类型 计算机中： 1/0 = 除法中断 ，1/1 =1 ，1/n=0 (n>1) 不过，输入整数，可以认为是整型数。  求倒数则不必。不可太拘泥于形式  。 数学上的定义，不必太谦虚。  除了小学1，2，3年级，只学到整数外。  整数也是实数，当然也有倒数，二分之一不是2的倒数？？，难道2不是整数？？ 这个你一定懂，不用谦虚。

user: user-2
content: scanf("%f,%f",&a,&b);  错误  c=1.0/a; 数学上的定义不是很清楚，计算机中，int的倒数是什么类型

user: user-3
content: int a; scanf("%f,%f",&a,&b);  这两句一对比，问题很明显 应该将后一句改为：scanf("%d,%f",&a,&b);   或者将第一句改为double a; （反正要求倒数，把a定义为整形也可以） 注意在输入时的格式，两个数要用逗号分隔，比如： 23,45.67 [回车] 为避免出错，还应该判断输入的数是否为0，否则当输入0时，程序会崩溃。
user-0 提问: 二维数组传参为题。为什么报错，

回复:
user: user-1
content: 二维数组的名称，是数组指针，指向数组的一级指针，不是二级指针。  直接传递一级指针，最好。  其次是数组指针，因为长度固定，所以不灵活，用的不多。  #include<stdio.h>  int main() { float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}}; void average(float *,int);    void search(float*,int);  search(score[0],2,4); getchar(); return 0; } void search(float *p,int n，int m) { int i; printf("The score of NO.%d are:\n",n);  for(i=0;i<m;i++) printf("%5.2f  ",*(p + n * m + i));  printf("\n"); }

user: user-0
content: 不好意思,刚发帖的时候删除了写没用到的代码,同时,把二维数组的定义部分给漏掉了: float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}}; 3楼的说的对printf("%5.2f  ",*( (*p+n)+i));这句是不行的. 不明二维数组传参到函数中传递的为什么是指针,而不是指针的指针.这里有点不明白. 二维数组的名称不是指针的指针么.?

user: user-2
content: 他们俩把你的问题说出来了，但是还有个很大的问题，就是你里面打印printf("%5.2f  ",*( (*p+n)+i));用这个可以？我个人觉得是不行的，二维数组本质上还是以以一维存储的！你再看看指针运算 (*p+n) = *p + （szieof（*p）* n）= 什么呢？*p是你二维数组的第一个元素，至于后面的就不用我说了吧，你也觉得不行了！ 我个人觉得打印二维数组要不传递个一级指针，和一个int数= row*col；比如 int p[2][3]; print（int *p,int n）; 调用就是print（p,2*3）;至于内部如何用，就是一个for循环了 第二种print（int *p[3],int cow）数组名作为参数时退化为指针，这个不是很准确，他只能退化一维的 print（int *p[3],int cow）== print（int p[2][3],int cow）,因此我们还需要另外传递一个参数来表示行号。有疑问1179675084

user: user-3
content: 传的参数score变量定义在那里呢？ 楼主，找本基础点c语言书好好看看吧！

user: user-4
content: main()函数里，search(score,2); 这一句，score未定义，应该是一个float类型的二维数组吧，比如：float score[大于2的数][4]={/*初始化*/};
user-0 提问: c语言指针++的问题

回复:
user: user-1
content: 把printf("%d\n",ptr++); 换成printf("%d\n",++ptr); 就会不同了 一个是后自加，一个是先自加

user: user-2
content: printf("%d\n",ptr++); 相当于 printf("%d\n",ptr); ptr++;  引用 楼主 y516599087 的回复:int main() { int * ptr=(int*)malloc(10);//arr; printf("%d\n",ptr); printf("%d\n",ptr++); } 为什么输出的结果是相同的呢

user: user-3
content: 自加后缀式ptr++是先执行打印操作然后再自加的，如果你把两句打印语句换一下的话，结果就可以不同了

user: user-4
content: http://bbs.csdn.net/topics/370153775

user: user-5
content: 引用 4 楼 y516599087 的回复:[quote=引用 2 楼 wangjunsheng 的回复:] ptr++ 后++ 执行完以后才 ++ 前++ 执行前先++  就是 11了 哦   printf（）相当于赋值是吧，那（ptr++）是不是相当于（ptr），ptr+1 所以打出来的结果也是ptr的值啊/？？[/quote] 不是的！ptr++是把ptr的指向的地址向前移动一位了(这里是4个字节)， 只是在你第二句printf函数执行打印的时候ptr++的值还没有生效，ptr++是先执行操作，再++的 你把两句对换下位置，再打印试试，就明白了

user: user-0
content: 引用 2 楼 wangjunsheng 的回复:ptr++ 后++ 执行完以后才 ++ 前++ 执行前先++  就是 11了 哦   printf（）相当于赋值是吧，那（ptr++）是不是相当于（ptr），ptr+1 所以打出来的结果也是ptr的值啊/？？

user: user-5
content: 因为都是以十进制的方式打印出来 ptr的地址值的！ ptr++ 执行完后才生效的！  建议把 两行打印信息换个位置， 然后用%p打印试试吧！

user: user-6
content: ptr++ 后++ 执行完以后才 ++ 前++ 执行前先++  就是 11了

user: user-7
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）
user-0 提问: 这个我竟然不知道怎么输入

回复:
user: user-1
content: 叫兽。。

user: user-2
content: 福州大学的老师一直很牛逼Orz。。。

user: user-3
content: 同学你是福州大学的吧？ 我是你们数据结构的老师，不懂可以来问我不要上网找答案，作业要独立完成。

user: user-4
content: 先输入一个n值，确定个数，可定义一个数组int a[n] 在用循环输入获取 n个值 for（） {    scanf（“%d”，a + i）； }

user: user-5
content: scanf("%d",&User_Type_Data)

user: user-5
content: 1,cin>_User_Type_Data; 2,scanf("%d",&>User_Type_Data)