Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求助，我这个排序，程序怎么写啊，谢谢！

回复:
user: user-0
content: temp.name = a[j].name;  temp.loops = a[j].loops;  temp.point = a[j].point;  temp.distance = a[j].distance;   a[j].name = a[j+1].name;  a[j].loops = a[j+1].loops;  a[j].point = a[j+1].point;  a[j].distance = a[j+1].distance;     a[j+1].name = temp.name;  a[j+1].loops = temp.loops;  a[j+1].point = temp.point;  a[j+1].distance = temp.distance;  这些 = 可以重载不啊？ 如果重载 要怎么写？

user: user-0
content: 编译提示：  1>c:\paix2\paix2.cpp(71) : error C2784: “bool std::operator >=(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)”: 无法从“重载函数类型”为“const std::reverse_iterator<_RanIt> &”推导 <未知> 参数 1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2286) : 参见“std::operator >=”的声明 1>c:\paix2\paix2.cpp(71) : error C2784: “bool std::operator >=(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)”: 无法从“重载函数类型”为“const std::_Revranit<_RanIt,_Base> &”推导 <未知> 参数 1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2105) : 参见“std::operator >=”的声明 1>c:\paix2\paix2.cpp(71) : error C2784: “bool std::operator >=(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)”: 无法从“重载函数类型”为“const std::pair<_Ty1,_Ty2> &”推导 <未知> 参数 1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(124) : 参见“std::operator >=”的声明 1>c:\paix2\paix2.cpp(71) : error C2676: 二进制“>=”: “Ranking”不定义该运算符或到预定义运算符可接收的类型的转换 1>c:\paix2\paix2.cpp(101) : error C2679: 二进制“<<”: 没有找到接受“std::string”类型的右操作数的运算符(或没有可接受的转换)

user: user-0
content: 谢谢， 我就试！

user: user-1
content: 仅供参考//字母优先级是  d, f, e, c, a .  然后字符数组是str=｛"deec","dac","ceef","fee"｝;输出的是"deec","dac","fee","ceef" #include <stdio.h> #include <string.h> int od(char c) {     char *p;     char order[6]="dfeca";      if (0==c) return -1;     p=strchr(order,c);     if (NULL==p) return -1;     return p-order; } int cmp(char *s1,char *s2) {     int od1,od2;      while (1) {         od1=od(*s1);         od2=od(*s2);         if (od1<od2) return -1;         if (od1>od2) return  1;         if (-1==od1 && -1==od2) return 0;         s1++;         s2++;     } } int main() {     char *str[4]={"deec","dac","ceef","fee"};     char *t;     int i,j;      for (i=0;i<4-1;i++) {         for (j=i+1;j<4;j++) {             if (1==cmp(str[i],str[j])) {                 t=str[i];str[i]=str[j];str[j]=t;             }         }     }      for (i=0;i<4-1;i++) printf("\"%s\",",str[i]);     printf("\"%s\"",str[i]);     return 0; } //"deec","dac","fee","ceef"

user: user-2
content: 引用 4 楼 lshlsh2009 的回复:temp.name = a[j].name;  temp.loops = a[j].loops;  temp.point = a[j].point;  temp.distance = a[j].distance;   a[j].name = a[j+1].name;  a[j].loops = a[j+1].loops;  a[j].point = a[j+1].point;  a[j].distance = a[j+1].distance;     a[j+1].name = temp.name;  a[j+1].loops = temp.loops;  a[j+1].point = temp.point;  a[j+1].distance = temp.distance;  这些 = 可以重载不啊？ 如果重载 要怎么写？ 内嵌的变量类型不能重载=，也不需要重载=。
user-0 提问: C语言初学者，一个问题我感觉是对的总是不通过啊！！！

回复:
user: user-1
content: 引用 5 楼 wax14111205058 的回复:按你的结果输入还是wrong answer。根本不知道是什么情况啊，而且我这个例子转换成整数后结果还是6啊。 刚才类型转换的时候忘了，浮点数转换成整数的时候最好加上0.5再转。 比如，如果x=0.9999999，x==1.0不成立。如果转换成int，(int)x会转换成0，那就更不对了。加上0.5可以四舍五入，(int)(x+0.5)==1这样就成立了。 楼主如果有兴趣可以加上0.5再试试，我也很想知道库函数pow的解法为什么不行。

user: user-0
content: 我不用pow函数 自己编了个函数终于accept了,本来我是没学到如何调用函数才用pow的……总之谢谢大家了。

user: user-1
content: 引用 8 楼 wax14111205058 的回复:我们校园网就是这样 我都懒得吐槽了，估计不是自己编那个函数就不让对吧。竟然连个提示或说明都没有我也是醉了。 据我所知，ACM都没有任何提示的，只能自己猜。而且一般的ACM只会对比输出，还没有智能到检查代码的程度。比如这个题，如果直接printf("6\n");可能也就过了

user: user-0
content: 我们校园网就是这样 我都懒得吐槽了，估计不是自己编那个函数就不让对吧。竟然连个提示或说明都没有我也是醉了。

user: user-0
content: 按你的结果输入还是wrong answer。根本不知道是什么情况啊，而且我这个例子转换成整数后结果还是6啊。

user: user-1
content: 也可以试试不用pow这个库函数，自己写个函数计算整数乘方很容易。

user: user-1
content: pow的返回值是浮点数。理论上浮点数用"=="做比较的时候可能有问题，通常的正确做法是两个浮点数相减结果很接近0(比如小于1e-6)就认为他们相等。不过具体到这个例子，不知道是不是这个造成的问题。 试试把结果转换成整数再比较： while((int)(pow(1,n) + pow(6,n) + pow(7,n) + pow(17,n) + pow(18,n) + pow(23,n)) == (int)(pow(2,n) + pow(3,n) + pow(11,n) + pow(13,n) + pow(21,n) + pow(22,n)))

user: user-0
content: 在校园网做题的,不应该不会让我用math函数啊。我看别人最短的Code Length 0.02k 我要郁闷死了。

user: user-2
content: 可能是math.h的问题，你在哪里做题的？
user-0 提问: 函数

回复:
user: user-1
content: 看输出。。。

user: user-2
content: 这是学习递归的一个经典的例子。 /*************************************************************************     > File Name: fb.cpp     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月17日 星期五 18时00分28秒  ************************************************************************/ #include<vector> #include<iostream> using namespace std; int main() { 	long fib(int,vector<int>&); 	vector<int> v1; 	for(int i=0;i<=20;i++) 	{ 		v1.push_back(fib(i,v1)); 	} 	for(auto s:v1) 		cout<< s <<endl; 	return 0; } long fib(int n,vector<int> &v) { 	if(n==0 || n==1) 		return 1; 	else 		return v[n-2] + v[n-1]; }

user: user-3
content: 你跟踪一遍差不多就明白了

user: user-4
content: 斐波那契数列

user: user-5
content: /*输出斐波那契数列的前40个，输出格式要求为每行四个数字，每个数字域宽为12个字符*/ #include<iostream>   #include<cmath> #include<iomanip> using namespace std; int main() { 	long f1,f2; 	int i; 	f1=f2=1;  //数列的头两个数字为1、1 	for(i=1;i<=20;i++) 	{ 		cout<<setw(12)<<f1<<setw(12)<<f2; //每次输出两个数字 		if(i%2==0) cout<<endl;  //当输出4个后换行 		f1=f1+f2;  //斐波那契数列的规则，第三个数是前两个数之和 		f2=f2+f1; 		 	}     return 0; }

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

user: user-7
content: 1  1  2  3 5   8......
user-0 提问: 新手。c语言的一些语句不懂，请指教

回复:
user: user-1
content: 还有int fun2(int *x, int n) int fun2(int *x, int n) {  int t; if(n==1) return; t=x[0];x[0]=x[n-1]; x[n-1]=t;       fun2(x+1,n-2); }红色这句什么意思 ========================== fun2（）自己调用自己，递归，每次讲x数组的后一个传给自己，数组个数减2  楼主应加强c的基础知识

user: user-0
content: #include <stdio.h> #include <string.h> void fun(int a[3][3], int c1,int c2) {  int i,t;    for(i=0;i<3;i++)    {  t=a[c1][i];       a[c1][i]= a[c2][i];       a[c2][i]=t;    } } void main() {   int i,j,k;     int a[3][3]={2,3,4,1,3,2,1,2,3};     for(k=0;k<3;k++)     {  for(j=0;j<3;j++)           printf("%3d",a[k][j]);         printf("\n"); 	}        for(i=0;i<3;i++)        {  k=i;            for(j=0;j<3;j++)              if(a[j][0]<a[k][0]) k=j;              else if(a[j][0]==a[k][0]&& a[j][1]==a[k][1])  k=j;            if(i!=k) fun(a,i,k); 	}        for(k=0;k<3;k++)        {  for(j=0;j<3;j++) printf("%3d",a[k][j]);            printf("\n"); 	} }第一个整个是这样的

user: user-2
content: 递归调用，后面是想写个实现逆序的子函数，无非就是调用了。代码有点小问题，比如return之类的。不过没必要用递归。直接一个循环不就好了么。

user: user-3
content: 不出意外  你的代码 应该有问题吧  能编译过？

user: user-4
content: fun2(x+1,n-2); 这是递归调用自身的函数，就是int fun2(int *x, int n)

user: user-5
content: n=strlen(a)<strlen(b)? strlen(a): strlen(b); 比较字符串a与b的长度，将长度最长的长度值赋给变量n，  红色这句是调用自身函数，也说是常说的递归。  前面3行，不全吧
user-0 提问: c语言用哪个编程软件比较好

回复:
user: user-1
content: 网上有cfree的注册码。。。 用qt的路过。。。

user: user-2
content: 推荐Dev-C++的编程环境。比vc6.0简单，也比较适合初学者。此IDE使用的编译器就是gcc，linux下最常见的编译器。而且有一定的智能识别功能。

user: user-3
content: 并且学如何使用cl.exe编译代码  学习编程够用了

user: user-3
content: 装这个吧， 没有IDE的VS 2008

user: user-4
content: Visual  c++ 6.0  很好的  我们上学就用这个

user: user-5
content: 初学的,CodeBlocks也不错

user: user-6
content: 个人推荐你用VS2010，因为他的即时错误检查非常方便，还有最好同时在装个VC6
user-0 提问: 请教关于自定义的类型大小问题

回复:
user: user-0
content: 引用 2 楼 lovesmiles 的回复:类型里面的成员函数是不是不占大小？ 函数不占类的大小  函数名算指针的话是不是应该有4个字节大小？ 这句话是什么意思？所有的函数都不占空间，只有变量才点空间。 虚函数也不占空间，但是c++要实现虚函数的功能，隐藏了一个叫虚函数表指针的成员变量，也就是说只有带有虚函数的类都会多一个4字节的隐藏成员变量。   this指针怎么算？ 你想怎么算？指针的大小都是4字节，不管是什么指针 。一个类内部并没有this指针这种成员，所以计算类的大小也不用理它。  决定一个类的大小由下面几个因素：  1成员变量（包括继承来的） 2隐藏的虚函数表成员 3内存对齐方式瞬间明白了。

user: user-1
content: 类型里面的成员函数是不是不占大小？ 函数不占类的大小  函数名算指针的话是不是应该有4个字节大小？ 这句话是什么意思？所有的函数都不占空间，只有变量才点空间。 虚函数也不占空间，但是c++要实现虚函数的功能，隐藏了一个叫虚函数表指针的成员变量，也就是说只有带有虚函数的类都会多一个4字节的隐藏成员变量。   this指针怎么算？ 你想怎么算？指针的大小都是4字节，不管是什么指针 。一个类内部并没有this指针这种成员，所以计算类的大小也不用理它。  决定一个类的大小由下面几个因素：  1成员变量（包括继承来的） 2隐藏的虚函数表成员 3内存对齐方式

user: user-2
content: 虚函数是要占空间的，在32位系统里面要占用四个字节 普通函数不占空间，this指针不是类成员
user-0 提问: 销毁链表时出现DAMAGE after narmal

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

user: user-0
content: 引用 1 楼 lovesmiles 的回复:InitList(L);  MakeNode(tmp,i+1);         InsFirst(L.head,tmp);  有内存销毁二次了。检查上面这几个函数，自己断点看看就行了。 就是free  和 malloc没有对应上这样的问题。 2 3 4 5 6 我忘了说了，我用了引用，不是指针   Status MakeNode(Link &p,ElemType e); void FreeNode(Link &p); Status InitList(LinkList &L); Status DestroyList(LinkList &L);

user: user-0
content: 我忘了说了，我用了引用，不是指针  Status MakeNode(Link &p,ElemType e); void FreeNode(Link &p); Status InitList(LinkList &L); Status DestroyList(LinkList &L);

user: user-2
content: InitList(L);  MakeNode(tmp,i+1);         InsFirst(L.head,tmp);  有内存销毁二次了。检查上面这几个函数，自己断点看看就行了。 就是free  和 malloc没有对应上这样的问题。
user-0 提问: while后边的分号作用

回复:
user: user-1
content: while后面是要加代码块的，一对大括号或者是一条语句。while后面加一个 ；号的意思意思就是while后面接了一条空语句。空语句就是只有一个 ； 号，其他的什么都没有的那种语句，表示什么都不做。PS：LZ，我最近在攒积分，求LZ给点积分

user: user-2
content: 二楼是亮点……

user: user-3
content: 二楼说出了答案

user: user-2
content: #define XXX(a,b) do { \     a = b; \     } while(0);

user: user-4
content: while (  expression )  statement///如果直接是；说明执行空的statement

user: user-2
content: 大家一起努力吧，把它顶成热帖！

user: user-5
content: 不循环了呗,没有循环体,这句应该没啥用

user: user-6
content: 空语句。。。

user: user-7
content: 这是把需要循环的部分放到了括号里执行，代码不易让人看懂，可以说有利有弊吧

user: user-2
content: 类似的 if (XXX); else ...

user: user-8
content: 空语句，啥不都不执行  顺便膜拜2L

user: user-9
content: 一条空语句

user: user-10
content: 引用 5 楼 mymtom 的回复:while (  expression )  statement哇，双蛋刀！

user: user-11
content: while (  expression )  statement

user: user-12
content: 有分号就是因为不需要或者没有循环体；一般是将循环体集成到判断条件里了，楼主这个就是这种情况；

user: user-13
content: 引用 2 楼 zxhuser-14 的回复:二楼正解。。 2L就是那么自信

user: user-14
content: 二楼正解。。

user: user-2
content: 结束循环体，如果没有分号，下一行printf将被认为是循环体的一部分
user-0 提问: 24点游戏

回复:
user: user-0
content: 表示很无力 不会在easyx里面做  不会显示扑克牌

user: user-1
content: 洗牌算法参考 #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

user: user-1
content: 参考MSDN98\SAMPLES\VC98\SDK\COM\ACTIVEXCONTROL\BASECTL\CARD\*.*  http://bbs.csdn.net/topics/380157851

user: user-2
content: 这个不难。。。 只会c的路过。。。
user-0 提问: C语言将小图插入Qr码图形中心出错，原因是小图WIDTH不是4的倍数，求解！

回复:
user: user-1
content: 更正：(bmpWidth*bibitCount/8+3)/4*4-bmpWidth*3;

user: user-1
content: 晕 k+=(bmpWidth+3)/4*4-bmpWidth;

user: user-1
content: 引用 2 楼 user-2 的回复:图像一行占的字节数必须是4的倍数，如果不是的话需要在尾部补齐，否则就会出现错位  同意楼上说法。还有个更简单的解决方法，但稍有损失，只是对于在Qr码中贴图，无所谓了。具体的做法是处理WIDTH向的for循环中有个k变量，指示pBmpBuf当前位置，循环结束后，让k跳过补齐位即可。  unsigned char* p; for(i=0; i<bmpHeight; i++) { 　　for(j=0; j<bmpWidth; j++) 　　{ 　　　　p = pBmpBuf + k;   　　　　/// 更新数据到旧BMP 　　　　set_pixel(x+j,y+i,*(p+2),*(p+1),*(p));/// x,y为叠加位置   　　　　k+=3; 　　} 　　k+=(sminfo.width+3)/4*4-sminfo.width; }

user: user-2
content: 图像一行占的字节数必须是4的倍数，如果不是的话需要在尾部补齐，否则就会出现错位

user: user-2
content: 图像一行占的字节数必须是4的倍数，如果不是的话需要在后面补齐，否则就会出现错位
user-0 提问: 谁能帮我看下这段代码，书上关于静态变量的课后题

回复:
user: user-1
content: #include <stdio.h> int  square (int i)  {  return i*i;  }  void main()  {  int i=0;  i=square(i);  for (;i<3;i++)  {  static int i=1;  i+=square(i);  printf("%d\t",i);  }  printf("\n");  }

user: user-2
content: 1. +=与 =+ 2. 少了个；和“\n” 3. 没有renturn  结果2，6，42； 1 + 1*1； 2+ 2*2；6+6*6；

user: user-3
content: 围观。。。。

user: user-4
content: 这不是误人子弟吗？无语啊

user: user-0
content: 哈工大苏小红编的，哎 ~

user: user-4
content: 这个课本误人哪，这个循环控制，里面又是修改控制变量，自己又要累加。 你这到底是什么课本啊？？？换一个吧

user: user-0
content: 引用 3 楼 xpdavis 的回复:还有，你这里2个i，外层的i应该起名叫sum比较合适一点 这个是书上课本后的题    我自己的话 肯定不会把代码搞成这样

user: user-4
content: 还有，你这里2个i，外层的i应该起名叫sum比较合适一点

user: user-0
content: i+=square（i）

user: user-4
content: i=+square(i); 还是 i+=square(i); ？？？
user-0 提问: 用ADOX创建mdb数据库

回复:
user: user-0
content: 引用 2 楼 jiangsheng 的回复:ADOX不支持托管代码 .Net程序应该使用ADO.Net 话说回来你的程序难道是数据库设计器么？安装程序里带一个数据库不是什么问题。 谢谢您，问题已经解决了。。。

user: user-0
content: 引用 1 楼 zhaowech 的回复:搜索ADO2，这是一个已经封装好的类库，应该更好用 十分感谢您，问题已经解决了

user: user-1
content: ADOX不支持托管代码 .Net程序应该使用ADO.Net 话说回来你的程序难道是数据库设计器么？安装程序里带一个数据库不是什么问题。

user: user-2
content: 搜索ADO2，这是一个已经封装好的类库，应该更好用
user-0 提问: 新手提问

回复:
user: user-1
content: 直接用   char  num=0xFF;  char data;  for(i=1;i<=8; i++)  {  data&(num-1);  }  从低到高想要哪位取哪位！  仅供参考  说错了，应该是  char  num=0xFF;  char data;  for(i=1;i<=8; i++)  {  data|(num<<i);  }  大概思路是这样，没有细细思考，如有问题请指正！

user: user-1
content: 直接用  char  num=0xFF; char data; for(i=1;i<=8; i++) { data&(num-1); } 从低到高想要哪位取哪位！ 仅供参考

user: user-2
content: 看一下位运算那章。。。

user: user-3
content: 仅供参考#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des);     r = READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3
user-0 提问: 如何编写C语言程序遍历pagefil.sys和Hiberfil.sys两个文件？

回复:
user: user-1
content: 将Windows放在虚拟机里面运行，在虚拟机外就可以读取这两个文件了。我猜。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:虚拟机 知道赵老师很忙，但是我真是刚刚接触这个，理解不过来，能不能说的再详细点点。指明清楚问题思路，我好更确切的去百度或谷歌来解决问题，谢谢了哈！

user: user-2
content: 楼上。。。。

user: user-1
content: 虚拟机

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
user-0 提问: 种子

回复:
user: user-1
content: 这题目起的，你要问随机种子就问随机种子。。。。。。

user: user-2
content: 参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

user: user-3
content: 请加上随机数种子。害我不纯洁了一把。

user: user-4
content: int main() {   int i; //  srand(time(NULL));  // 如果不加这一句，每次运行的结果都一样。加上之后每次就都不一样了。   for (i=0; i < 10; i++) {     printf("%d  ", rand());   }   return 0; }

user: user-4
content: c语言的随机数函数，其实是所谓"伪随机数"，每次调用随机数函数rand()，返回的值都是从上一次的返回值算出来的。最开始的头一个值就叫“种子”，从种子开始然后产生一系列的随机数。如果用同一个种子，产生的一系列随机数就都是一样的。所以调用随机数函数之前，都要一次性的设置一个不同的种子，用time(0)就是一个简单有效的办法
user-0 提问: 关于#if defined和#ifdef

回复:
user: user-1
content: 参考gcc源代码中实现这两个条件编译指令的源代码相关片断。

user: user-2
content: #ifdef _ABC_ //... #else //... #endif  //或者 #ifndef _ABC_ #define _ABC_  #endif  貌似用的多都是在防止文件的重复包含

user: user-3
content: 引用 3 楼 xpdavis 的回复:#if defined后面还可以加上其它的defined #ifdef 只能有一个here you go

user: user-4
content: #if defined后面还可以加上其它的defined #ifdef 只能有一个
user-0 提问: 如何使用ioctl命令控制SCSI设备？

回复:
user: user-1
content: 仅供查看收发的每个字节的原始值使用：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-2
content: sprintf(driver,"\\\\.\\%s:","H");  // 	 		 hUDisk = CreateFile(driver, GENERIC_READ | GENERIC_WRITE,  			 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING,0,NULL);   		 if (hUDisk ==INVALID_HANDLE_VALUE)  		 { 			 printf("INVALID_HANDLE_VALUE\n");  			 return false; 		 } 		 memset(&sptdwb,0, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER)); 		 sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); 		 sptdwb.sptd.PathId = 0; 		 sptdwb.sptd.TargetId = 1;    		 sptdwb.sptd.Lun = 0;  		 sptdwb.sptd.CdbLength = 16; 		 sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN; 		 sptdwb.sptd.SenseInfoLength = 24; 		 sptdwb.sptd.DataTransferLength = 10;  		 sptdwb.sptd.TimeOutValue = 2; 		 sptdwb.sptd.DataBuffer = bufDataRead;  		 sptdwb.sptd.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf);  		 sptdwb.sptd.Cdb[0] = 0x40 ;   //MODE SENSE[6] 		 sptdwb.sptd.Cdb[1] = 0x56 ;  		 sptdwb.sptd.Cdb[2] = 0x65 ; 		 sptdwb.sptd.Cdb[3] = 0x3b ; 		 sptdwb.sptd.Cdb[4] = 0x38 ; 		 sptdwb.sptd.Cdb[5] = 0x3b ;   		 sptdwb.sptd.Cdb[6] = 0x31 ;  		 sptdwb.sptd.Cdb[7] = 0x32 ;  		 sptdwb.sptd.Cdb[8] = 0x33;  		 sptdwb.sptd.Cdb[9] = 0x34 ;  		 sptdwb.sptd.Cdb[10] = 0x35 ;  		 sptdwb.sptd.Cdb[11] = 0x36 ;  		 sptdwb.sptd.Cdb[12] = 0x37 ;  		 sptdwb.sptd.Cdb[13] = 0x38 ;  		 sptdwb.sptd.Cdb[14] = 0x3b ; 		 sptdwb.sptd.Cdb[15] = 0x23 ;;    		 length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER); 		 printf("length=%d\n",length);  		 ret  = DeviceIoControl(hUDisk, 			 IOCTL_SCSI_PASS_THROUGH_DIRECT, 			 &sptdwb, 			 length, 			 &sptdwb, 			 length, 			 &bytesReturn, 			 NULL);  转成Linux的

user: user-2
content: InitCmdPacket(CMD_TEST_CONNECTION, m_bySrcDeviceID, m_byDstDeviceID, NULL, 0);           SEND_COMMAND(CMD_TEST_CONNECTION, w_bRet, m_bySrcDeviceID, m_byDstDeviceID);   能否把你的这些参数也贴出来呢？ 我现在需要给U盘 scsi 命令。

user: user-3
content: LS。

user: user-4
content: 完全可以，要是你下一步问“怎么实现？”，我也不知道。协议都是公开的，相信只要参考win32和android的代码改就可以了。

user: user-0
content: 引用 1 楼 lovesmiles 的回复:完全可以，要是你下一步问“怎么实现？”，我也不知道。协议都是公开的，相信只要参考win32和android的代码改就可以了。 就是参考了Windows下的代码，还是不行，现在完全不知道如何下手了
user-0 提问: 难以理解的+=符号使用错误

回复:
user: user-1
content: for(i = 0; i < ATM; i++){         fgets(buf, 82, fp);          //strcpy(head[i], buf);         strncpy(head[i],buf,30);head[i][30]=0;//改为这样          *(*head + i*31 + 30) = 0;         sscanf(buf + 30, "%lf%lf%lf", A + 3 * i, A + 3 * i + 1, A + 3 * i + 2);         p[0] += *(A + 3 * i);         p[1] += *(A + 3 * i + 1);         p[2] += *(A + 3 * i + 2);         printf("%d  %f  %f\n", i, *(A+3*i), p[0]);     }

user: user-2
content: strcpy(head[i], buf); 这一行写head内存区越界了，恰好影响到紧随其后的 p ,  q 等变量。                  strncpy(head[i], buf,  30) ; head[i][30] = 0;

user: user-3
content: #include <mkl.h> 这个文件在哪？ 要上传就整个工程上传上来，有什么库的，头文件的。

user: user-4
content: strcpy 是依据 \0 作为结束判断的
user-0 提问: 关于文件拷贝的问题

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

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 不要使用 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;  //... } 类似的例子还可以举很多。  为什么if (atoi(getc(frd)))会显示段错误，我是想取出文本中的数字 还有您这段代码有可能a=fgetc(f)就不满足条件啊为什么还要先执行它  while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 不要使用 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-0
content: 引用 1 楼 xpdavis 的回复:文本文件不要用fseek ftell 直接判断fgetc返回值是不是EOF，即为文件结束了 丢字符的原因已经找到了，是调用了两次fget，取到了下一个字符。 你说的文本文件不要用fseek ftell什么意思，那这个是用在哪里的，谢谢

user: user-2
content: 文本文件不要用fseek ftell 直接判断fgetc返回值是不是EOF，即为文件结束了
user-0 提问: WINDOWS下Fortran与c混合编译环境搭建

回复:
user: user-0
content: 引用 3 楼 dbzhang800 的回复:[quote=引用 楼主 npu123456 的回复:] 要进行windows下Fortran和C语言的混合编程，但是之前没有接触过，不知道如何搭建编译环境，也不知道如何操作。有一段是C和fortran互相调用的程序，在linux下已运行通过，现在需要在windows编译。自己有使用visual studio开发的经验。 编译环境如何搭建？ linux和windows中C调用Fortran的语法相同吗？ 求指点，尽量详细些，谢谢！  如果你用VS的话：应该是，购买了微软的Visual Studio，又买了因特尔的Fortran编译器配合使用吧？这些商业版的东西应该有技术支持的。  如果你既然linux下编译通过了，在Windows下，为什么不继续用GCC中的c和fortran编译器呢？[/quote]  没有很好的界面不太方便调试啊，感觉还是visual studio爽一些，虽然可能没那么高的分辨率吧。

user: user-1
content: 引用 楼主 npu123456 的回复:要进行windows下Fortran和C语言的混合编程，但是之前没有接触过，不知道如何搭建编译环境，也不知道如何操作。有一段是C和fortran互相调用的程序，在linux下已运行通过，现在需要在windows编译。自己有使用visual studio开发的经验。 编译环境如何搭建？ linux和windows中C调用Fortran的语法相同吗？ 求指点，尽量详细些，谢谢！  如果你用VS的话：应该是，购买了微软的Visual Studio，又买了因特尔的Fortran编译器配合使用吧？这些商业版的东西应该有技术支持的。  如果你既然linux下编译通过了，在Windows下，为什么不继续用GCC中的c和fortran编译器呢？

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

user: user-3
content: 围观，，，，
user-0 提问: 为什么Codeblocks里的注释字体方向会这样？见所未见。。。

回复:
user: user-0
content: 引用 4 楼 akirya 的回复:字体前面加@符号 比如用 "@宋体" 这个字体就倒过来了 解决了，多谢大神指点！请收分，不谢~

user: user-1
content: 字体前面加@符号 比如用 "@宋体" 这个字体就倒过来了

user: user-2
content: 这是困为你的字体或者编码选择不对，我也遇到过这样的现象

user: user-0
content: 引用 1 楼 lovesmiles 的回复:闻所未闻，不过word有这样的功能，将它放到Code编程器也不算什么。 百度一下，也不知道。。。

user: user-3
content: 闻所未闻，不过word有这样的功能，将它放到Code编程器也不算什么。
user-0 提问: 关于变参宏的使用

回复:
user: user-1
content: #include <boost\preprocessor.hpp> 使用 BOOST 的 宏可以简单实现。 使用 KEYWORD_IS_VOID 可以区分是否存在返回值。 使用 REPEAT 可以实现参数的类型和变量的定义和使用。

user: user-0
content: 引用 6 楼 mymtom 的回复:[quote=引用 3 楼 jwj070524 的回复:] 函数定义里面的参数列表和函数调用传入的参数列表不一样啊，一个有类型，一个没有。所以宏没法做啊。 ++[/quote] 就是有没有办法1个宏传入两组变参，第1组传入类型做包装函数的定义，第2组作为被包装参数的实参。

user: user-2
content: 引用 3 楼 jwj070524 的回复:函数定义里面的参数列表和函数调用传入的参数列表不一样啊，一个有类型，一个没有。所以宏没法做啊。 ++

user: user-3
content: Collapse AllExpand All      Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript   Visual Basic C# Visual C++ J# JScript Visual C++ Language Reference  Variadic Macros  Example  See Also  Send Feedback     Variadic macros are function-like macros that contain a variable number of arguments.  Remarks To use variadic macros, the ellipsis may be specified as the final formal argument in a macro definition, and the replacement identifier __VA_ARGS__ may be used in the definition to insert the extra arguments. __VA_ARGS__ is replaced by all of the arguments that match the ellipsis, including commas between them.  The C Standard specifies that at least one argument must be passed to the ellipsis, to ensure that the macro does not resolve to an expression with a trailing comma. The Visual C++ implementation will suppress a trailing comma if no arguments are passed to the ellipsis.  Support for variadic macros was introduced in Visual C++ 2005.  Example   Copy Code  // variadic_macros.cpp #include <stdio.h> #define EMPTY  #define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } #define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); } #define CHECK3(...) { printf(__VA_ARGS__); } #define MACRO(s, ...) printf(s, __VA_ARGS__)  int main() {    CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");    CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n");   // won't print     CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n");   // won't print    CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");     // always invokes printf in the macro    CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");     MACRO("hello, world\n");    // MACRO("error\n", EMPTY);   would cause C2059 }     Copy Code  here are some varargs1(1) here are some varargs2(4) here are some varargs3(5) hello, world    See Also Concepts Macros (C/C++) Send feedback on this topic to Microsoft.

user: user-4
content: #define IRRELEVANT_CALLBACK(CallBack, Return, ...) \ Return ext_##CallBack(##__VA_ARGS__) \ { \    CallBack(##__VA_ARGS__); //对应的返回值好像不会返回吧。 }

user: user-5
content: 函数定义里面的参数列表和函数调用传入的参数列表不一样啊，一个有类型，一个没有。所以宏没法做啊。

user: user-6
content: Return ext_##CallBack(##__VA_ARGS__) \ { \    CallBack(##__VA_ARGS__); }  你看看你这代换进去什么东西

user: user-7
content: 貌似宏定义没有变参的吧？？？
user-0 提问: 有没有哪个大神写过斗地主C语言版程序，使用#include "graphics.h"  /*图形系统头文件*/编程，毫无头绪呀

回复:
user: user-1
content: http://www.easyx.cn

user: user-2
content: 你们老师是古董中的极品,几十年前的东西还在搞

user: user-3
content: 那你就去问老师。。。

user: user-0
content: 这是我们算法分析上课用的，哎，坑，不懂

user: user-4
content: graphics.h 文件是很老的东西了，这个是TC编译才有的。你的代码估计也是TC代码，楼主放弃它吧。太过时了。
user-0 提问: libxml2库写xml文件，保存不了为utf-8格式 的文件，问题在哪儿呢？求指教

回复:
user: user-1
content: #define MY_ENCODING "ISO-8859-1" 这个要不要改一下？

user: user-2
content: 是不是没设置XML文件头？ xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL); 这句是什么意思，"ISO-8859-1"是什么意思？ 没用过libxml2，只是提出有疑问的地方。

user: user-3
content: 引用 2 楼 lovesmiles 的回复:#define MY_ENCODING "ISO-8859-1" 这个要不要改一下？   我记得那个xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);   换"UTF-8" 好像也不行。 不晓得到底哪儿有问题

user: user-3
content: 引用 1 楼 BeanJoy 的回复:是不是没设置XML文件头？ xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL); 这句是什么意思，"ISO-8859-1"是什么意思？ 没用过libxml2，只是提出有疑问的地方。   我记得那个xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);   换"UTF-8" 好像也不行。 不晓得到底哪儿有问题

user: user-3
content: 我记得那个xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);   换"UTF-8" 好像也不行。 不晓得到底哪儿有问题
user-0 提问: break是跟最近的IF，还是for循环？

回复:
user: user-1
content: break只能用在switch和循环中,另外,程序有问题,if(buffer[0]='\0')这是赋值!

user: user-2
content: for 循环

user: user-3
content: 只适用for  while  do-while

user: user-4
content: BREAK不能用在IF下，只能用在FOR下，除了SWITCH语句的特例

user: user-5
content: 学习了，很游泳

user: user-6
content: 單步調式就知道了

user: user-7
content: break是跳出循环和switch中的case选项，也只有这两个地方会用到break吧。

user: user-1
content: break可以用在选择结构的switch,不能用在if,break也可以用在循环结构， 所以，这个break,会中断for循环的执行。

user: user-8
content: break只能用在循环和switch语句里面，跟if-else无关  if ('\n' == buffer[0])   return ...

user: user-9
content: for(i=0;i<=n;i++)       if(!str_in(&pS[i]))       break; /* break是跟最近的IF，还是for循环? */      //是在if下，跳出for循环
user-0 提问:  我想任意输入5个字符串存放到指针数组name[]中，然后输出这些字符串，但上面的方法不行，要怎么样才可以实现？

回复:
user: user-0
content: 哦哦 这样啊 谢谢啊

user: user-1
content: 引用 楼主 qq_21938717 的回复:char* name[5];  你这5个指针都没有分配空间，要用malloc和free分配和释放空间
user-0 提问: 关于对某一段地址赋值问题

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

user: user-2
content: 看二楼。。。。

user: user-3
content: 手机和电脑的地址空间映射不一样的

user: user-4
content: 一般写好像问题还不大    这个问题影视先要进行读   如果你不加那个或的运算   应该不会导致错误的 也就是结果不对

user: user-5
content: 地址能随便用的？不能访问的内存肯定要报错。

user: user-6
content: 0x40280000 该地址在PC上是否可以访问呢？这个是关键。应该是访问权限的问题；

user: user-7
content: 嗯，记住了

user: user-8
content: 楼上正解....

user: user-1
content: 手机0x40280000地址可写 电脑0x40280000地址不可写
user-0 提问: VC++6.0  Debug assertion Failed! 2进制转化为10进制

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

user: user-2
content: ElemType *base;     ElemType *top;     int stackSize; 这些都需要有一个初始值，写程序有的地方是不能偷懒的 此外，话说，你InitStack写得也有问题啊，还是好好检查一下代码吧

user: user-0
content: sqStack s;   不是这样初始化建立栈么?

user: user-2
content: sqStack s; 初始化完全没搞好，哎……
user-0 提问: 问个DNS的问题，实在不知道发在哪里了

回复:
user: user-0
content: 恩恩，应该是配置问题。信任那个我只是在开玩笑的。

user: user-1
content: 这不是信任不信任的问题，应该是配置的问题，从截图来看，似乎存在一个根节点的配置，bind9没用过，不敢下结论

user: user-0
content: 截图没有截好
user-0 提问: linux编译出现  (.text+0x20)：对‘main’未定义的引用 collect2: 错误：ld 返回 1

回复:
user: user-1
content: 围观。。。。

user: user-2
content: gcc -odes1 des1.c -I/root/ssl/include -L /root/ssl/lib/ -lcrypto

user: user-3
content: gcc des1.o -L/root/ssl/lib/ -lcrypto -o a.out

user: user-4
content: gcc des1.o /root/ssl/lib/libcrypto.a -o a.out
user-0 提问: 简单的扬声器程序详细解释下吧

回复:
user: user-1
content: 这是一个用引脚反复输出高低电平，让扬声反复振动产生声音的。 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SPK = P3^7;//接扬声器的引脚 sbit K1 = P1^4;//接开关  void Alarm(uchar t) {  	uchar i,j; for(i=0;i<200;i++) {//振动200次  	SPK = ~SPK;//通过电平转换，使扬声器振动一次 for(j=0;j<t;j++);//延时 } }  void main() {  	while(1) {  	if(K1==1)//假如开关一直通电 {  	Alarm(90);//发出时延为90的声音，高频声 Alarm(120);//发出时延为120的声音，低频声 } } }

user: user-2
content: #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SPK = P3^7; sbit K1 = P1^4;  void Alarm(uchar t) {     uchar i,j;     for(i=0;i<200;i++)     {         SPK = ~SPK;         for(j=0;j<t;j++);     } }  void main() {     while(1)     {         if(K1==1)         {             Alarm(90);             Alarm(120);         }     } } 只是把代码格式化了一下。。。
user-0 提问: 关于while(条件表达式）其中判断下一次 循环的 问题

回复:
user: user-1
content: 先别考虑*fast和IsNumber，先来看while(a ? b : c)。这里判断循环结束的条件是整个表达式 a?b:c的返回值，这个值或者是b或者是c，a只起一个选择的作用。把这个弄明白，你的代码就不难理解了。

user: user-2
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-3
content: while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))；  IsNumber(*fast) ? *fast++ : (*slow++= *fast++)先解析这个表达式 IsNumber(*fast)为真返回*fast++；否则返回*slow++= *fast++ 所以while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； 的判断条件是*fast++或*slow++

user: user-0
content: 引用 3 楼 brookmill 的回复:[quote=引用 1 楼 brookmill 的回复:] 从判断循环终止的角度来说，把它简化为while (a ? b : c)，也就是说如果a不为0，用b是否为0来判断；如果a为0则用c 具体到这里，while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； b和c的值实际上都是*fast，所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow 更正：如果*fast不是数字就把它赋值给*slow[/quote] 为何不是判定IsNumber(*fast)的真假而是判定*fast是否为0呢？

user: user-1
content: 引用 1 楼 brookmill 的回复:从判断循环终止的角度来说，把它简化为while (a ? b : c)，也就是说如果a不为0，用b是否为0来判断；如果a为0则用c 具体到这里，while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； b和c的值实际上都是*fast，所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow 更正：如果*fast不是数字就把它赋值给*slow

user: user-1
content: 整个代码的思路：两个指针，fast依次走过字符串里的每个字符，直到字符串结束(也就是while循环里面的*fast为0)；slow走的比较慢，遇到数字就停下来，只有*fast非数字的时候才赋值并前进。

user: user-1
content: 从判断循环终止的角度来说，把它简化为while (a ? b : c)，也就是说如果a不为0，用b是否为0来判断；如果a为0则用c 具体到这里，while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))； b和c的值实际上都是*fast，所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow
user-0 提问: 着急！！不用itoa怎么把int变成string

回复:
user: user-1
content: 仅供参考char * comma(__int64 num) {     static char commades[80];     static char commasrc[80];      sprintf(commasrc,"%I64d",num);     int L=strlen(commasrc);     register int j=0;     register int k=0;     for (int i=L-1;i>=0;i--) {         commades[j]=commasrc[i];         k++;         j++;         if ((k%3)==0 && i>0) {             commades[j]=',';             j++;         }     }     commades[j]=0;     strcpy(commades,strrev(commades));     return commades; }

user: user-2
content: std::to_string直接搞定。 http://en.cppreference.com/w/cpp/string/basic_string/to_string

user: user-3
content: 就标题问题，现在标准做法是std::to_string。要逗号嘛在结果里插入……有些逗。 一些现成的代码： http://stackoverflow.com/questions/7276826/c-format-number-with-commas

user: user-4
content: 自己实现很简单的

user: user-5
content: 转换成1000进制表示

user: user-6
content: 或者这个C版的， msvc不可以

user: user-6
content: 引用 3 楼 mujiok2003 的回复:C只能自己实现， C++可以使用facet[code=c] C++实现

user: user-6
content: C只能自己实现， C++可以使用facet

user: user-7
content: 那就使用sprintf()函数把

user: user-8
content: 自己写个函数实现

user: user-9
content: //调用者应该给出足够大的buf char *my_itoa(int n, char *buf) {     int i, j, k=0, l=0;     char tmp[32] = {0};      i = n;     do {         j = i%10;         i = i/10;         sprintf(tmp+k, "%d", j); //倒序         k++;         l++;         if (i!=0 && l%3 == 0) {             sprintf(tmp+k, ",");             k++;             l = 0;         }     }while(i);      for (k--,i=0; i<=k; i++) {         buf[i] = tmp[k-i];     }      return buf; }  int main() {     char buf[32] = {0};     int n;     printf("input a number: ");     scanf("%d", &n);     printf("output: %s\n", my_itoa(n,buf));     return 0; }  欢迎点评
user-0 提问: 关于openssl 的des加密方法详细点的函数说明

回复:
user: user-1
content: 你好, 请问你怎么使用openssl的DH密钥交换的呢, 我有自己设定好的p和g, 不知道该怎么转换成openssl中的DH结构体

user: user-2
content: 不懂，帮你顶一下
user-0 提问: 开平方函数

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include<math.h> void  main() { double y0,y2,R1; scanf("%lf%lf",&y0,&y2); printf("y0=%lf\ny2=%lf\n",y0,y2); R1=sqrt((y2-y0)*(y2-y0)); printf("R1=%lf",R1); system("pause"); } 改成这样就可以了

user: user-2
content: 看4楼，用scanf时注意输入数据的格式

user: user-3
content: 输入后可以先输出输入的内容，这样可以判断是否是输入的问题；

user: user-4
content: 运行时要按照scanf函数中的格式进行输入呐，即y0和y1要按照"%lf,%lf"格式输入，中间有逗号。不然你也可以修改输入格式。

user: user-5
content: /*************************************************************************     > File Name: sqrt.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月14日 星期二 17时53分38秒  ************************************************************************/ #include<float.h> #include<stdio.h> #include<math.h> int main() { 	double y0,y2,R1; 	scanf("%lf",&y0); 	getchar(); 	scanf("%lf",&y2); 	printf("y0=%lf\ny2=%lf\n",y0,y2); 	R1 = sqrt((y2 - y0)*(y2 - y0)); 	printf("R1 = %lf\n",R1); 	return 0; } 你试试这个

user: user-5
content: 引用 2 楼 xpdavis 的回复:输入2个double的时候，记住用“,”分隔正解

user: user-6
content: 请检查scanf函数的返回值。

user: user-7
content: 输入2个double的时候，记住用“,”分隔

user: user-8
content: 我试了下，把void改成int，加个return 0;
user-0 提问: 着急！有没有人对汇编语言很在行啊！！

回复:
user: user-1
content: c语言编译后反汇编就可以了。不同的机器对应不同的指令集。如果想用win32的汇编到单片机上面跑，那是不可能的，别人估计也帮不了你。

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

user: user-3
content: 是PC程序还是其它芯片的程序？每种芯片指令集可能会不一样的。

user: user-4
content: c可以编译成汇编的啊，具体要参考编译器命令行的参数

user: user-5
content: 对了，gcc 参考链接 http://bbs.csdn.net/topics/190172069

user: user-5
content: 网上没有编译成汇编的软件吗

user: user-6
content: 如果逻辑不复杂，写起来容易，如果复杂，你先编译出来，然后反汇编一下就行了。
user-0 提问: 存储元 存储单元 地址 字位 字节 的描述 

回复:
user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 1. 一个字节。 2.看大小端吧。要么高地址都是0，要么地地址都是0，没有前后的概念。 3.计算机内部都是2进制的概念。显示的是什么，是人的概念，编码问题。

user: user-3
content: Q2: 整形占用多少字节与不同的平台有关,不一定是4字节;

user: user-0
content: 顶顶，求解答

user: user-0
content: 引用 1 楼 user-4 的回复:0-255 需要1个字节即可  其他几个问题呢，几个词语的理解有没有什么问题啊

user: user-4
content: 0-255 需要1个字节即可
user-0 提问: Linux 进程通信传递Map

回复:
user: user-0
content: 引用 5 楼 lovesmiles 的回复:[quote=引用 3 楼 owen00sun 的回复:] [quote=引用 1 楼 slx_391987 的回复:] 父子进程间通信，管道最好。 子进程写，父进程读。  管道间如何传递Map对象？[/quote]  你的Map对像是什么？stl的map吗？这个怎么能传递。[/quote] 问题已经解决了，把Map转换成了结构体，还可以序列化或者组成字符串发送

user: user-1
content: 引用 3 楼 owen00sun 的回复:[quote=引用 1 楼 slx_391987 的回复:] 父子进程间通信，管道最好。 子进程写，父进程读。  管道间如何传递Map对象？[/quote]  你的Map对像是什么？stl的map吗？这个怎么能传递。

user: user-2
content: Map对象是对象，不是一段内存或字符串，无法直接通过管道等任何传输通道在进程间传输。

user: user-0
content: 引用 1 楼 slx_391987 的回复:父子进程间通信，管道最好。 子进程写，父进程读。  管道间如何传递Map对象？

user: user-3
content: 可以转成json文本，传递之后再去加载文本

user: user-4
content: 父子进程间通信，管道最好。 子进程写，父进程读。
user-0 提问: 獲取資料夾絕對路徑

回复:
user: user-1
content: win7下没有HOMEPATH环境变量吗？

user: user-0
content: 引用WIN7用户目录一般在C:\User下面 C:\User 後面每一個使用者有不同的資料夾 ex : 使用者名為 123，啟動即為C:\Users\123\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup  但我要如何得到使用者的名字? 這樣我只要在C:\Users\         \AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 填上使用者的名字就好了

user: user-1
content: C:\Documents and Settings\Administrator\「开始」菜单\程序\启动  HOMEPATH=\Documents and Settings\Administrator 你自己比较一下吧，还有WIN7用户目录一般在C:\User下面

user: user-0
content: 我所指的"啟動"資料夾 (Startup) 是這個 http://windows.microsoft.com/zh-tw/windows/run-program-automatically-windows-starts#1TC=windows-7

user: user-1
content: 启动资料夹是在当前用户目录下面，你找一下，环境变量有的，比如 HOMEPATH=\Documents and Settings\Administrator 知道怎么取环境变量吧？

user: user-0
content: 我要找到一個叫做啟動的資料夾。每一個使用者都會有不同的"啟動"資料夾， 所以我不能確定"啟動"資料夾的絕對路徑，那我要怎麼將程式移到"啟動"資料夾? 如果我要用第2種方法 (全盘搜索) 要如何實現?

user: user-2
content: 二个方法 1将你的执行文件放到这个文件夹里面，当前路径自然就是文件夹的绝对路径 2全盘搜索，查找同名的文件夹，如果存在，搜索结果自然就是该文件夹的绝对路径了

user: user-3
content: 台湾的？。。。

user: user-4
content: 好好描述问题
user-0 提问: 使用fopen打开的文件，想把文件截短应该怎么办？

回复:
user: user-1
content: SetFilePointer＋SetEndOfFile

user: user-2
content: 在Windows下，crt库里当然没有ftruncate。所以如果要在Windows下实现相同功能，必须用fileno() + _chsize()

user: user-3
content: 看二楼，长知识

user: user-4
content: http://baike.baidu.com/view/3567004.htm?fr=aladdin 获取描述符可以用fileno函数 #include <stdio.h>  int fileno(FILE *fp);  Returns: the file descriptor associated with the stream

user: user-5
content: 已打开的文件可以找 ftruncate

user: user-5
content: 试试你用的函数库中是否有truncate
user-0 提问: 最长公共子序列问题

回复:
user: user-1
content: 回溯....

user: user-2
content: 看不懂。。。

user: user-0
content: 引用 5 楼 u012421456 的回复:最字有两种意思，一种是表极限，最强的国家，这个最强只有一个，最强的国家之一，这里的最强是一些 看样子，楼主是属于第二种意思，但你的最长标准是什么呢？即多长的公共字符串算最长呢 引用 5 楼 u012421456 的回复:最字有两种意思，一种是表极限，最强的国家，这个最强只有一个，最强的国家之一，这里的最强是一些 看样子，楼主是属于第二种意思，但你的最长标准是什么呢？即多长的公共字符串算最长呢 举个例子来说吧，加入两个字符串,一个是BDCABA ;一个是ABCBDAB则它们所有的最长公共子序列为BDAB  BCAB  BCBA 。 不知道你是否明白我的意思了

user: user-3
content: 最字有两种意思，一种是表极限，最强的国家，这个最强只有一个，最强的国家之一，这里的最强是一些 看样子，楼主是属于第二种意思，但你的最长标准是什么呢？即多长的公共字符串算最长呢

user: user-0
content: 引用 3 楼 u012421456 的回复:所有的最长 恩呢

user: user-3
content: 所有的最长

user: user-0
content: 引用 1 楼 u012421456 的回复:http://www.baidu.com/baidu?word=%E7%BB%99%E5%87%BA%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%A6%82%E4%BD%95%E8%83%BD%E6%B1%82%E5%87%BA%E8%BF%99%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%89%80%E6%9C%89%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97&ie=utf-8&tn=98597150_hao_pg&lans=132 我希望能求出所有的最长公共子序列。。。。

user: user-3
content: http://www.baidu.com/baidu?word=%E7%BB%99%E5%87%BA%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%A6%82%E4%BD%95%E8%83%BD%E6%B1%82%E5%87%BA%E8%BF%99%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%89%80%E6%9C%89%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97&ie=utf-8&tn=98597150_hao_pg&lans=132
user-0 提问: 快速排序，递归时堆栈溢出

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

user: user-2
content: 楼上。。。。

user: user-3
content: 你没有return啊，必须让它收敛，在满足一个条件的时候返回
user-0 提问: 编译链接 静态局部变量也需要重定位？

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

user: user-0
content: 内部符号（包括内部静态变量和内部全局变量）都会在重定位时进行符号解析。在进行编译时，内部全局变量被暂赋假的0x0，而静态局变量被赋值0x00000004（？）。所以我们在重定位表中可以看到他们。 ----------------------------------------------------------- 符号解析 符号解析的方式很广，有简单直观的，也有错综复杂的。大多数解析由链接编辑器执行，且没有任何提示。但是，某些重定位可能伴随有警告诊断，而其他重定位可能导致致命错误状态。  这两种符号的解析取决于符号的属性、提供符号的文件的类型以及要生成的文件的类型。有关符号属性的完整说明，请参见符号表节。但是，对于以下论述，标识了三种基本符号类型：  未定义－文件中已引用但尚未指定存储地址的符号。  暂定－文件中已创建但尚未确定大小或尚未分配存储空间的符号。这些符号在文件中显示为未初始化的 C 符号或 FORTRAN COMMON 块。  已定义－文件中已创建并且已指定存储地址和空间的符号。  符号解析最简单的形式涉及使用优先级关系。此关系中，已定义符号优先于暂定符号，而暂定符号又优先于未定义符号。

user: user-2
content: 那本传说把GDI叫做图形设备抽象DX叫做声音设备抽象、前半页还在讲状态机后半页就变自动机、“C语言的一个语句是一个表达式”的逗比读物拿来参考么……LZ自求多福。

user: user-3
content: 引用 2 楼 isunn 的回复:[quote=引用 1 楼 jerry_dqh 的回复:] 局部静态变量并不是放在栈上的，应该需要重定义。不然无知道知道在进程中的位置  可是我在《程序员的自我修养》上说链接过程，只关心全局变量的”粘合“。。。[/quote] 这个说法可能不是很严谨吧。很多时候我们只关注全局变量和局部变量的区别，而忽略了静态局部变量，这时候就需要根据具体情况来判断他是接近全局变量还是接近局部变量

user: user-3
content: 静态局部变量比较特殊，从可见范围上来说类似局部变量(只在函数内可见)，从存储上来说类似全局变量(保存在全局区而不是栈)。从链接的角度来说更像是全局变量。

user: user-0
content: 自顶，求高人回复

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:局部静态变量并不是放在栈上的，应该需要重定义。不然无知道知道在进程中的位置  可是我在《程序员的自我修养》上说链接过程，只关心全局变量的”粘合“。。。

user: user-4
content: 局部静态变量并不是放在栈上的，应该需要重定义。不然无知道知道在进程中的位置
user-0 提问: sizeof(long) 的大小VS2010 和 linux 下Gcc 为什么得到的值不同？

回复:
user: user-1
content: 首先C语言并没有规定数据类型的长度，类型具体的长度由具体实现决定。  至于为什么sizeof(long)一个等于64一个等于32，是因为两个平台采用不同的数据模型，一个是LP64，另外一个是LLP64。直接搜一下“LP64 LLP64”就能找到更多解释。前面版主也贴出了一个网址，可以看一下

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-3
content: 和编译器的有关，和操作系统无关。

user: user-4
content: 不同的64位编译器的64数据模式不同， VS: sizeof(long) = 32 sizeof(long long) = 64 sizeof(void *) = 64 GCC: sizeof(long) = 64 sizeof(long long) = 64 sizeof(void *) = 64  http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models

user: user-5
content: 因为没有规定sizeof(long)必须是多少， 只需要sizeof(long)>= sizeof(int)

user: user-6
content: 在windows上用gcc看看 标准中没有明确的规定long的长度，它的范围是4-8字节 这个和系统没有关系 和编译器有关

user: user-7
content: 围观。。。。
user-0 提问: C语言，错在哪里了？怎么改？

回复:
user: user-1
content: 楼主你的编程习惯好棒奥 嘿嘿 #include <stdio.h> long fac(long n);//在这里声明一下函数   int main()  { 	 long i = 50;  	long m;  	m = fac(i);  	printf("%ld",m);   	getch(); 	 return 0;   }  long fac(long n)  {   int a,b,c;  	if(n == 0)  	{ 	return 1; 	}  	else 	 { 	a = n-1;  	b = fac(n); 	 c = b*a;  	return (c); 	} }

user: user-0
content: 引用 8 楼 zhaozhaohelu 的回复:楼主你代码，呼呼呼呼，我此刻先休息一会儿再说。哈哈哈

user: user-0
content: 引用 7 楼 u013163178 的回复:良好的代码风格，看起来会让人产生美感你是对的

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

user: user-3
content: 楼主你代码，呼呼呼呼，我此刻先休息一会儿再说。

user: user-4
content: 良好的代码风格，看起来会让人产生美感

user: user-5
content: 楼上说的很对。提醒楼主要搞清楚，函数声明，函数定义，函数原型等基本概念

user: user-0
content: 引用 2 楼 u012421456 的回复:main后面的函数要在main前面声明一下啊 #include <stdio.h> long fac(long n);//////////// int main() { 	long i = 50; 	long m; 	m = fac(i); 	printf("%ld",m); 	getch(); 	return 0; } long fac(long n) { 	int a,b,c; 	if(n == 0) { 		return 1; 	} 	else { 		 a = n-1; 		 b = fac(n); 		 c = b*a; 		 return (c); 	} } 楼主你倒是简单整理一下代码啊，就这么上传了？？谢谢啦

user: user-6
content: 整理一下代码

user: user-7
content: #include <stdio.h>  long fac(long n)  {   	int a,b,c;  	if(n <= 1) 	 	{ 	 		 return 1; 	 	}		 	a = n; 	 	b = fac(n-1); 	  	c = b*a; 	    	return (c); 	 }	 int main() {  	long i = 10; // 50 的阶乘太大了。。	 	long m; 	 	m = fac(i); 	 	printf("%ld",m); 	getchar(); 	return 0;   }    竟供参考！！！

user: user-8
content: main后面的函数要在main前面声明一下啊 #include <stdio.h> long fac(long n);//////////// int main() { 	long i = 50; 	long m; 	m = fac(i); 	printf("%ld",m); 	getch(); 	return 0; } long fac(long n) { 	int a,b,c; 	if(n == 0) { 		return 1; 	} 	else { 		 a = n-1; 		 b = fac(n); 		 c = b*a; 		 return (c); 	} } 楼主你倒是简单整理一下代码啊，就这么上传了？？

user: user-9
content: 程序停不下来吧。 递归不会结束。  在 fac(long n) 里，调用 b=fac(n)。终止不了。  可能是你笔误吧，想写 b=fac(n-1)，是这样吗？
user-0 提问: c 内存 问题

回复:
user: user-1
content: 你可以把dest直接返回，比如改成这样子： char *inf(char *source,size_t len,char *dest) {   return (char*) realloc (dest,new_size); } char *run(char *source,size_t len,char *dest) {  return inf(source , len,dest); }

user: user-2
content: inf 函数中dest实际上是一个局部变量，只是copy了run的dest的值，如果你需要改变run函数中的dest，在inf函数中，应该传递取run函数中dest的地址

user: user-0
content: 当我 变成2级指针 就行   一开始 我是 定义  char ** temp ； 传递 temp 后面我换成  char *temp ，传递 &temp 就行 我不是只需要 一快地方存数据 不就可以么？  2级指针 可以改变 1级指针 指向的方向么？   为所么要2级指针？？？？？？？？？  我  1级  malloc 出来的 怎么会被直接释放？？？？