Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于文件的操作

回复:
user: user-1
content: 你fclose之前先判断fp是不是NULL啊。 要使用文件指针之前都判断一下fp的有效性，如果文件打开失败了，你应该让程序终止或者跳转到异常模块去进行一些处理

user: user-2
content: 楼主是从VB6转过来的。我猜。

user: user-3
content: 引用 6 楼 vectorindex 的回复:但是我执行了fp=null后 就没办法执行fclose()了 程序会中断啊啊啊啊啊啊  所以在关闭文件之前你不应该将他改为NULL啊

user: user-0
content: 但是我执行了fp=null后 就没办法执行fclose()了 程序会中断啊啊啊啊啊啊

user: user-3
content: fp=NULL 只是让指针指向NULL，并不是关闭文件  fclose(fp) 是关闭文件

user: user-0
content: 没有人可以帮我吗 啊啊啊啊啊啊

user: user-0
content: 我查询函数 查不到的都返回个NULL给文件指针 当判断 可是fp置位空就fclose不了 程序中断 关不了流 那么 删除必定13

user: user-0
content: 这个我知道 但是 我查找函数 如果查不到就把指针置为NULL 可是 fp置为NULL之后再执行fclose(fp) 程序会中断的 删除不了 就是因为其他功能的查找失败 文件流没有正常关闭 可是我关不了！！！！！！

user: user-4
content: fclose(fp);//才是关掉文件吧 fp = null;//只是防止野指针吧
user-0 提问: dll结构体参数传出不完全

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

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx  资料里说参数是结构体的时候，是将指向它的指针传入R8寄存器，但依然不能解决我的疑惑。结构体成员的顺序不是一开始就划分好内存了吗？为什么写入顺序会造成影响？

user: user-1
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-2
content: 引用 1 楼 cyfcsd 的回复:你的接口函数形参写的是啥啊？ 打一个断点，看看是不是刚执行完这个函数里面就是空的，如果是那就说明这个dll封装的函数有问题，或者是有些初始条件你没给正确

user: user-3
content: 这么写是没问题的, 可能是传出来后又被其他地方覆盖了

user: user-0
content: 引用 1 楼 cyfcsd 的回复:你的接口函数形参写的是啥啊？  不好意思，是帖子里写错了。。。应该是AAA &aaa

user: user-0
content: 问题解决了，实参最开始用的={0}的初始化方式，改用memset之后可以传出剩余的第四个大小为900的参数了，但第五个参数依然无法传出。 后按照接口函数中对结构体成员有写入的顺序，把结构体中e[70]的位置提前，就可以正常传出五个值了 typedef struct AAA { CHAR	a[36];	 CHAR	b[460]; CHAR	e[70]; CHAR	c[12];	 CHAR	d[900];		 } AAA  虽然问题解决了，但为什么是这样还是没有想清楚

user: user-2
content: 你的接口函数形参写的是啥啊？
user-0 提问: 在c使用函数部分是总出现这个

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { 	void p(char a[300]); 	char a[300]; 	gets_s(a, 300); 	p(a); 	puts(a); 	system("pause"); } void p(char a[]) { 	int t,i,j; 	char k; 	t = strlen(a); 	for ( i = 0,j=t; i < t/2; i++,j--) 	{ 		k = a[j-1], a[j-1] = a[i], a[i] = k; 	} }

user: user-2
content: 字符串逆转… 为什么main里头的p模块还要有形参的类型char[]呢？不是应该传实参了麽

user: user-3
content: t = strlen(a[300]);  改成  t = strlen(a);

user: user-4
content: http://blog.csdn.net/u014536527/article/details/48878123

user: user-0
content: 谢谢，那么什么时候用gets 呢？gets和scanf 有什么区别呢？

user: user-5
content: 注意，gets_s不是scanf

user: user-5
content: 你确定这段代码能编译过去？#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { 	void p(char a[300]); 	char a[300]; 	gets_s(a); 	p(a); 	puts(a); 	system("pause"); } void p(char* a) { 	int t,i,j; 	char k; 	t=strlen(a); 	for (i=0,j=t; i < t/2; i++,j--) 	{ 		k=a[j-1],a[j-1]=a[i],a[i]=k; 	} }
user-0 提问:  用c语言模拟 post 上传文件遇到的问题 ， 急！急！急！ 请教大神啊！！

回复:
user: user-1
content: 既然已经用上C了，就该上 Wireshark，这个可以抓包然后直接把包转成C语言数组格式，也就是花括号里一堆数字，这个功能我一直不知道用在什么地方，要不你看看 .... 你那怪异的字符肯定不再话下.....

user: user-2
content: Chrome + Advanced REST client 对比测试
user-0 提问: 杭电acm1019，，有哪位大神可以帮忙看看为什么不能ac？？

回复:
user: user-1
content: 最终结果是32位整型，但中间结果有可能溢出。 ac参考代码 #include<stdio.h> _int64 maxMod(_int64 x,_int64 y){     _int64 m=x,n=y;     _int64 r = x%y;     while(r!=0){         x=y;         y=r;         r=x%y;     }     return m/y*n; } int main(){     int n;     scanf("%d",&n);     while(n--){         int m;         scanf("%d",&m);         _int64 t1,result;         scanf("%I64d%I64d",&t1,&result);         result=maxMod(t1,result);         for(int i=2;i<m;i++){             scanf("%I64d",&t1);             result=maxMod(t1,result);         }         printf("%I64d\n",result);     }     return 0; }

user: user-2
content: 边界条件 输入输出格式 ……
user-0 提问: n的阶乘(n很大)

回复:
user: user-1
content: 考虑用数组存储  #include<stdio.h> int main() { 	static int a[100000]; //设置一个超大数组来存储乘积结果。 	int n;//要求的n的阶乘 	int jw;//用来表示进位 	int i, j;//控制循环 	int len = 1;//初始化数组长度为1 	int temp;//过程变量 	scanf("%d", &n); 	a[1] = 1; 	for (i = 2; i <= n; i++)//遍历。从1到n 	{ 		jw = 0; 		for (j = 1; j <= len; j++)//从数组的低位开始乘 		{ 			temp = a[j] * i + jw;//变量存储结果 			a[j] = temp % 10;//将变量最后一位放入数组。 			jw = temp / 10;//表示除了最后一位需要进位的数 			if (j >= len && jw != 0) 				len++;  //数组长度加一  		}  	} 	for (i = len; i >= 1; i--)//逆序输出数组就是结果 		printf("%d", a[i]); 	printf("\n"); 	return 0; }

user: user-2
content: 仅供参考：#include<stdio.h> #define N 1000    //要计算的N long s[N]={1,1},n=N,t=2,a=1,b=0; int main()//雨中飞燕之作 {     for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)         s[a]=(b+=s[a]*t)%10000,b/=10000;     for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);     return 0; }

user: user-3
content: 要精确的每一位数可以考虑用字符串存储，不然可以用double、long double 类型

user: user-0
content: 引用 3 楼 小灸舞的回复:考虑用数组存储  #include<stdio.h> int main() { 	static int a[100000]; //设置一个超大数组来存储乘积结果。 	int n;//要求的n的阶乘 	int jw;//用来表示进位 	int i, j;//控制循环 	int len = 1;//初始化数组长度为1 	int temp;//过程变量 	scanf("%d", &n); 	a[1] = 1; 	for (i = 2; i <= n; i++)//遍历。从1到n 	{ 		jw = 0; 		for (j = 1; j <= len; j++)//从数组的低位开始乘 		{ 			temp = a[j] * i + jw;//变量存储结果 			a[j] = temp % 10;//将变量最后一位放入数组。 			jw = temp / 10;//表示除了最后一位需要进位的数 			if (j >= len && jw != 0) 				len++;  //数组长度加一  		}  	} 	for (i = len; i >= 1; i--)//逆序输出数组就是结果 		printf("%d", a[i]); 	printf("\n"); 	return 0; }  能不能简单的说下程序的思路。。看的不是很懂。。
user-0 提问: 有人在吗？这是一个C语言问题，改了半天结果还是出不来。有人可以帮我看看吗？非常感谢。

回复:
user: user-1
content: 有点长啊！你可以自己单步调试一下。。写这种长的程序最好还是写一部分编译一下。。确定前面没什么问题了再继续写后面的。。不然就会遇到像你现在这样的问题。。(由于是手机，所以只能给你点小意见)

user: user-0
content: 谢谢大家  我调试好了。。。。嘿嘿。。

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

user: user-0
content: 引用 5 楼 阳光下的彩虹的回复:调用judegEmpty（）时count=0,所以导致judegEmpty()中跟count有关的循环都没有进入 main函数里  count  是赋值了的。。  谢谢你  我已经改好了。

user: user-2
content: 调用judegEmpty（）时count=0,所以导致judegEmpty()中跟count有关的循环都没有进入

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

user: user-4
content: 建议在必要的地方设置断点，然后单步跟踪程序运行，观察每一步结果是否与你期望的一致

user: user-5
content: 为什么学生都指望老师帮自己上厕所呢？

user: user-6
content: 你这么长的代码要我们怎么看?用断点调试了吗?
user-0 提问: 10进制转二进制代码问题

回复:
user: user-1
content: 帮结贴

user: user-2
content: 引用 1 楼 tiandragon00 的回复:已解决 ，谢谢   学会解决问题比解决问题好~

user: user-0
content: 已解决 ，谢谢

user: user-3
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉
user-0 提问: define DOUBLE（x) ((x)+(x))和函数return(x+x）的返回值。

回复:
user: user-0
content: printf("%f\n", dob((double)y/x)-DOUBLE((double)y/x));

user: user-0
content: 引用 8 楼 calen_ 的回复:那里写着 int 这和浮点数有个毛关系，如果楼主没抄错题的话，我敢肯定是因为嵌入式开发需要较高的数学水平，所以出道题来测试楼主十以内加减法。除非..... 除非他说有什么寄存器或者IO给映射到了地址在2或者3的地方，这样的话一个表达式确实能玩出花样............   我记得define 定义的  引用 7 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437  多谢我知道原因了。

user: user-1
content: 那里写着 int 这和浮点数有个毛关系，如果楼主没抄错题的话，我敢肯定是因为嵌入式开发需要较高的数学水平，所以出道题来测试楼主十以内加减法。除非..... 除非他说有什么寄存器或者IO给映射到了地址在2或者3的地方，这样的话一个表达式确实能玩出花样............

user: user-2
content: 表达式相同，这似乎恒成立吧！(x+x)-((x)+(x))不就是0吗？

user: user-2
content: 引用 5 楼 fefe82的回复:[quote=引用 2 楼 qq_36409192 的回复:] 表达式相同，这似乎恒成立吧！(x+x)-((x)+(x))不就是0吗？  由于浮点误差的存在，（以及计算机数值计算的一些其他问题，）数学中的各种运算定律都不能直接使用。[/quote] 谢谢。。

user: user-3
content: 引用 2 楼 qq_36409192 的回复:表达式相同，这似乎恒成立吧！(x+x)-((x)+(x))不就是0吗？  由于浮点误差的存在，（以及计算机数值计算的一些其他问题，）数学中的各种运算定律都不能直接使用。

user: user-0
content: 引用 3 楼 paschen 的回复:你这个式子是要赋值0，还是让他们结果为0  如果你是要让他们的结果为0很容易啊，比如填x+y   这里指的是相减为值0，不是赋值。面试嵌入式C，给的题。

user: user-4
content: 你这个式子是要赋值0，还是让他们结果为0  如果你是要让他们的结果为0很容易啊，比如填x+y

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

user: user-6
content: 这个题目出错了吧。。。 #define DOUBLE(x)  ((x)+(x)) 如果是 #define DOUBLE(x)  (x)+(x) 那还有点意思，有个括号的话，怎么输值都是0，已经可以避开宏的副作用了。
user-0 提问: 请问C语言怎么获取控制台光标的坐标?

回复:
user: user-1
content: 参考：  #include <stdio.h> #include <windows.h> #include <stdlib.h>   int main(int argc, char* argv[]) {     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);     COORD coordScreen = {0, 0}; //光标位置     CONSOLE_SCREEN_BUFFER_INFO csbi;       if (GetConsoleScreenBufferInfo(hConsole, &csbi))     {         printf("光标坐标:(%d,%d)\n",  csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);     }     return 0; }

user: user-2
content: 标准库没有  WINDOWS API：  GetConsoleScreenBufferInfo 可以获取，在CONSOLE_SCREEN_BUFFER_INFO结构中的dwCursorPosition成员  SetConsoleCursorPosition 可以设置  具体可参看MSDN

user: user-3
content: Linux下参考NCURSES库。

user: user-4
content: GetConsoleScreenBufferInfo
user-0 提问: 任何一个大于6的偶数，都可以表示成两个奇质数之和，求一个数的两个奇质数。。。

回复:
user: user-1
content: 最后那个if中，= 换成 ==

user: user-2
content: if(i == flag1 + flag2)

user: user-0
content: 求大神帮忙改改，或者重新帮我写一个，不用函数。。

user: user-3
content: 首先lz的算法就有问题，跟if判断没有任何关系。 ac代码楼主参考下 #include<stdio.h> bool isPrime(int n){     for(int i=2;i*i<=n;i++){         if(n%i==0)return false;     }     return true; }  int main(){     int n;     while(scanf("%d",&n) && n!=0){         int count=0;         for(int i=2;i<n/2;i++){             if(isPrime(i)&&isPrime(n-i)){                 count++;             }         }         printf("%d\n",count);     }     return 0; }
user-0 提问: 字符读入的问题

回复:
user: user-1
content: 用getchar()和scanf %c的时候要特别注意输入缓冲区是不是有遗留的字符（比如回车符） 可以使用fflush(stdin);来清空输入缓冲区

user: user-0
content: 谢谢楼上各位大神！postgres20的回答非常好！

user: user-2
content: 这样改试下：  #include <stdio.h> int main(void) { 	int guess=50,min=0,max=100; 	char ch; 	printf("choose an integer from 1 to 100.    d for larger, x for smaller and y for yes.\n"); 	printf("I guess it is %d\n",guess); 	while((ch=getchar())!='y') 	{ 		switch(ch) 		{ 		case 'd' : max=guess;break; 		case 'x' : min=guess;break; 		case '\n':continue; 		default : printf("Error");return 0; 		} 		guess=(min+max)/2; 		printf("Then I guess it is %d\n",guess); 	} 	return 0; }

user: user-2
content: 因为你while((ch=getchar())!='y') 输入完之后还会在缓冲区中留下\n  下一次while((ch=getchar())!='y')的时候接收了\n，于是退出了循环

user: user-3
content: 楼上的几位，仔细看LZ逻辑，其实LZ已经考虑了\n的情况，如果是\n，会走到  if(ch=='\n') getchar(); LZ的意思应该是如果是\n，那么再读一次，跳过\n，但是LZ并没有把再读到的字符赋值给ch，所以在getchar()前面加上ch=就行了，即改成 if(ch=='\n') ch=getchar();便可。

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

user: user-3
content: if(ch=='\n') getchar(); 这一行并没有改变ch值，getchar()被丢弃了，应该改成  if(ch=='\n') ch=getchar();
user-0 提问: 求助这个-> . 是怎么理解？inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));

回复:
user: user-1
content: 指针指向结构体的内容。

user: user-2
content: 用->还是.关键看你这个左边的变量是不是指针类型啊

user: user-3
content: 用. 还是->看你前面的对象类型的

user: user-3
content: sin_addr是指针类型后面就用->,是结构体对象就用.

user: user-4
content: A->B 等价于 (*A).B  a.b 等价于 (&a)->b

user: user-0
content: remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));
user-0 提问: 结构体数组初始化问题

回复:
user: user-1
content: 建议单步跟踪程序运行，观察每一步结果变化，分析原因

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

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

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

user: user-2
content: 以二进制方式 保存到文件，然后之后从文件读取

user: user-3
content: 将浮点数存入文件中，第二次打开的时候加载读取文件就可以了
user-0 提问: scanf读入字符串不是从数组的首地址开始存储

回复:
user: user-1
content: 重建所有

user: user-2
content: 不可能，估计是你哪里搞错了

user: user-3
content: 数组初始化就行了

user: user-4
content: 你有别的地方越界了吧？ 建议贴上完整代码

user: user-5
content: arr_in数组清空。 memset(arr_in,0x0,sizeof(arr_in)*sizeof(char));
user-0 提问: 新手关于图书管理系统调试不通过的疑问

回复:
user: user-1
content: 想知道哪里的问题为何不单步跟踪程序运行，观察每一步结果是否与你预期一致，以快速找到原因

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

user: user-3
content: struct book library[MAXBKS]; memset(library, 0, sizeof(library));    void add_book(struct book *p) {     if(count<MAXBKS-1)     {         //count++;         printf("Please add new book titles:");         gets(p[count].title);         printf("Now enter the auther:");         gets(p[count].author);         printf("Now enter the value:");         scanf("%lf",&p[count].value);         while(getchar()!='\n')             continue;         count++;     }     else     {         printf("The book.dat file is full.\n");         exit(1);     } }

user: user-3
content: struct book library[MAXBKS];
user-0 提问: C语言中关于指针定义的问题。int*a中a的值到底是什么？

回复:
user: user-1
content: a不是指向4的地址，而是一个可以储存地址的指针变量。int *a，中的*表示a是个指针，而不是int *a中应该把int *看成一部分，表明a是指向整形的指针变量，那么int *a＝4就是定义和赋值的结合，即int *a和a＝4

user: user-0
content: 引用 5 楼 kay_1010 的回复:你用什么编译器编写的，我的怎么都编译不过去。  codeblocks

user: user-2
content: 你用什么编译器编写的，我的怎么都编译不过去。

user: user-0
content: 引用 2 楼 user-3 的回复:int *a=4 已经将int转换成了int * 了，a是指向地址为4的内存地址，而不是内存中的内容为4  int p=&a; p 是已经由 int*转换成了int，存储的是变量a的地址  int* 不是一种变量类型啊，int *a 不是说的是*a是int类型，而a是指针类型嘛。  你的意思我明白了，谢谢！

user: user-0
content: 引用 1 楼 qq_36496856 的回复:a不是指向4的地址，而是一个可以储存地址的指针变量。int *a，中的*表示a是个指针，而不是int *a中应该把int *看成一部分，表明a是指向整形的指针变量，那么int *a＝4就是定义和赋值的结合，即int *a和a＝4  谢谢！

user: user-3
content: int *a=4 已经将int转换成了int * 了，a是指向地址为4的内存地址，而不是内存中的内容为4  int p=&a; p 是已经由 int*转换成了int，存储的是变量a的地址
user-0 提问: C语言宏定义的疑惑

回复:
user: user-1
content: 但宏替换则仍然是用（1.0*2.0）进行替换

user: user-1
content: 编译器会把编译期能计算出的表达式都计算了，所以运行时一般来说都直接是2.0

user: user-2
content: 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: 宏其实就是起名字(#define N (1.0*2.0))。在使用的时候，宏不会自带计算，而是原封不动的将(1.0*2.0)替代N所在的位置。你这里float res=N;，其实就是float res=(1.0*2.0);由程序自己来进行运算。

user: user-4
content: 优化掉了，没有乘法时间。 例：  template<long _NB> struct BBB : public BBB<_NB -1> { 	static const long v = _NB + BBB<_NB -1>::v; };  template <> struct BBB<0>  { 	static const long v = 0; };  LONG fv = __FILE__[0] + __FILE__[1] +__FILE__[2];	//	debug未化，release直接取值 LONG sum = BBB<10>().v;		//	直接取值 printf("The End: %d, %d\n", fv, sum);

user: user-5
content: 2楼正解，预编译不计算，程序里面替换宏，还是要计算的
user-0 提问: 四子棋程序两个问题求帮助！

回复:
user: user-1
content: 建议在必要地方设置断点，然后单步跟踪运行，观察每一步是否与你期望的结果一致

user: user-2
content: 你会调试吗?就问你这句话，自己debug一下，就可以了。不会debug的话，上网搜这方面的内容就可以了
user-0 提问: 简单c语言问题求帮助

回复:
user: user-1
content: while(fabs(t)<0.000001){  改成  while(fabs(t)>=0.000001){  while (xxx) 是要在xxx为真时才运行循环体  建议单步跟踪程序运行观察程序流程及每步结果分析原因

user: user-2
content: 循环是在条件成立的情况下才执行循环题，你fabs(t)第一部就不满足条件，肯定直接跳出来输出pi了啊！

user: user-3
content: #include<stdio.h> #include<math.h> void main(){ 	double t = 1.0, pi = 0.0, s = 1.0; 	int n = 1; 	while (fabs(t)>=0.000001){ 		pi = pi + t; 		n = n + 2; 		s = -s; 		t = s / n; 	} 	pi = pi; 	printf("%lf\n", pi);  	getch(); }

user: user-4
content: While(ture)才运行
user-0 提问: 老是出现这个对话框，请问大家为什么

回复:
user: user-1
content: 既然你的L是个全局变量，InitList函数就不需要传递参数了，如果要传递参数，你要传入L的地址，否则是按值传递的，也就是说InitList中你申请的空间是给了一个复制后的变量，全局的L仍然是NULL

user: user-2
content: 读取位置 0x00000020 时发生访问冲突，表示你尝试操作一个NULL指针。 L已经是全局变量了，InitList就不要带参数了，否则形参作用域会覆盖全局变量作用域 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  #include<stdio.h> #include<stdlib.h>   typedef struct{ 	char name[20]; 	int priority; 	int serviceTime; 	int needTime; }PCB;  typedef struct Node{ 	PCB data; 	struct Node *next; }LinkList, Node;  int InitList();  void print(LinkList *L);  LinkList *L = NULL;  void main() { 	InitList(); 	print(L); 	system("pause"); }   int InitList() { 	int num, i; 	LinkList *p; 	L = (LinkList*)malloc(sizeof(Node)); 	L->next = NULL; 	printf("进程数："); 	scanf("%d", &num); 	for (i = 0; i<num; i++) 	{ 		p = (LinkList*)malloc(sizeof(Node)); 		printf("第%d个进程：", i + 1); 		fflush(stdin); 		scanf("%s,%d,%d", &p->data.name, &p->data.priority, &p->data.serviceTime); 		fflush(stdin); 		p->next = L->next; 		L->next = p; 	} 	return 0; }  void print(LinkList *L) { 	int i = 1; 	LinkList *p = L->next; 	system("cls"); 	while (p) 	{ 		printf("第%d个进程：%s,%d,%d", i++, p->data.name, p->data.priority, p->data.serviceTime); 		p = p->next; 	}  }

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 我自己写的 判断一个三位数是不是水仙花数 但是输出不对！即使输入153这个水仙花数也不行

回复:
user: user-1
content: a 没有初始化就使用了，应该把scanf放到前面  if (a>99,a<999); 应该写成：if (a>99 && a<999);  if (a=m*m+n*n+p*p)("a 是水仙花数%d");  if 中应该用== 而不是=  后面的括号没有这种用法

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

user: user-3
content: 楼主错误有点多啊，还是多去看看书吧，练习一下基本的。 #include <stdio.h> int main() { 	int a,m,n,p;   //m=百位,n=十位,p=个位; 	printf ("输入一个百位数"); 	scanf("%d",&a); 	m=a/100; 	n=(a-m*100)/10; 	p=(a-m*100-n*10); 	if(a==(m*m*m+n*n*n+p*p*p)) 		printf("a是水仙花数\n"); 	else 		printf("a不是水仙花数\n"); 	printf ("a=%d\n",a); 	return 0;  }
user-0 提问: 输入10个整数，将其中最小的数与第一个数对换，把最大的数和最后一个数对换，写三个函数  大神看看这哪里错了.运行时出错！！

回复:
user: user-1
content: scanf("%d",*(p+i));  改成  scanf("%d",p+i);

user: user-2
content: 1.scanf的问题 2.if(max<*(p+i)) max=*(p+i);j=i;少了大括号，而且建议楼主不要一行上写多行代码，很容易出错，可读性差，难调试。 3.最大的数和最后一个数对换的时候应该是*(p + 9)和*(p + j)调换，而不是*p和*(p + j)  #include<stdio.h> void input(int*p) { 	int i, j; 	for (i = 0; i<10; i++) 	{ 		scanf("%d", p + i); 	} } void conduct(int*p) { 	int max, min, i, j, k, temp; 	max = *p; 	min = *p; 	for (i = 0; i<10; i++) 	{ 		if (max<*(p + i)){  			max = *(p + i); 			j = i;  		} 		if (min>*(p + i)){ 			min = *(p + i);  			k = i; 		} 	} 	temp = *p; 	*p = *(p + k); 	*(p + k) = temp; 	temp = *(p + 9); 	*(p + 9) = *(p + j); 	*(p + j) = temp;  } void output(int*p) { 	int i; 	printf("\n"); 	for (i = 0; i<10; i++) 		printf("%d ", *(p + i));  } void main() { 	int a[10]; 	input(a); 	conduct(a); 	output(a); }

user: user-3
content: 引用 1 楼 paschen的回复:scanf("%d",*(p+i));  改成  scanf("%d",p+i); 嗯啊，scanf的后面那个参数要是个地址。  楼主的main语句为什么不加int啊，即使编译器会默认返回类型为int，还有个return 0
user-0 提问: 链表头美有被赋值

回复:
user: user-0
content: 引用 1 楼 paschen的回复:因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址 可以贴个代码么？我听不太懂

user: user-1
content: 因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址

user: user-0
content: 引用 4 楼 qq423399099 的回复:你贴的这个结果我们看不懂啥意思，建议你贴出完整代码。 还有就是你调用addTwoNumbers函数应该接收了它的返回值并且赋值给你的head的吧？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。这是LeeCode上面的题目，我也没其他部分的代码

user: user-2
content: 你贴的这个结果我们看不懂啥意思，建议你贴出完整代码。 还有就是你调用addTwoNumbers函数应该接收了它的返回值并且赋值给你的head的吧？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 3 楼 paschen 的回复:[quote=引用 2 楼 KOMO_TI 的回复:] [quote=引用 1 楼 paschen的回复:]因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址 可以贴个代码么？我听不太懂[/quote]  建议单步跟踪程序运行，观察每一步是否与你期望的致[/quote]我明白了，弄了好久，才发现，tail被附了两次值，导致与head的联系被切断了；

user: user-1
content: 引用 2 楼 KOMO_TI 的回复:[quote=引用 1 楼 paschen的回复:]因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址 可以贴个代码么？我听不太懂[/quote]  建议单步跟踪程序运行，观察每一步是否与你期望的致
user-0 提问: 这个程序为什么会奔溃？求大神解答

回复:
user: user-1
content: if(head=NULL)     {     	head=p; } else { tail->next=p; // tail应该是空的。。 }  奔溃 无非就是地址非法访问。你这里就几个链表的指针。

user: user-2
content: 看到奔溃笑了....... 楼主的编译器处理器和操作系统竭尽全力帮助楼主的程序自尽........

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

user: user-4
content: tail空指针，没有new就用了

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

user: user-6
content: 还有 if(head=NULL) 改成  if(head==NULL)  scanf("%s",&time); 需要char*指针，但你的&time是int*类型

user: user-6
content: createbook函数中：  	if(number==0) 	{ 		return; 	}  改成；  	if(number==0) 	{ 		return NULL; 	}
user-0 提问: 开发数据恢复软件，需要了解那些专业知识

回复:
user: user-1
content: 数据恢复，我觉得主要从数据存储原理，数据介质（软硬件），通过汇编语言掌握对机器码，电脑硬件的调用等。 　数据恢复是一个技术含量比较高的行业，数据恢复技术人员需要具备汇编语言和软件应用的技能，还需要电子维修和机械维修以及硬盘技术。  第一：软件应用和汇编语言基础  第二：电子电路维修技能  第三：机械维修技能  第四：硬盘固件级维修技术

user: user-2
content: http://wenku.baidu.com/link?url=yRANfjhBo61TfHH5z2OmpAuiyEDwiCXK7jkvtJbVaVCOZ77Yy9zga1Nm4WSUSMfPv75RIW7qdGG2thbU5ngnBBQO365DFDRzsBD1R9Vd3Ma

user: user-3
content: fat32，ntfs文件系统。

user: user-4
content: 参考EasyRecovery Professional软件及其类似软件。 参考开源数据恢复方面的项目。
user-0 提问: 请教一个二叉树查找结点问题

回复:
user: user-0
content: 谢谢各位，之前没遇到过，谢谢

user: user-1
content: 可以在scanf后面加一个getchar接收掉留在缓冲区中的\n，否则会被之后调用scanf接收了

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

user: user-3
content: 因为你建立树的时候已经输入过数据了（所以输入缓冲区有遗留的回车符） 会被main函数里的scanf("%c", &data);直接读取掉 在scanf("%c", &data);前面加一句getchar();或者fflush(stdin);就行了。
user-0 提问: 求解答

回复:
user: user-1
content: 前面说的是，换开发工具，要学就实战的，老的就不要用了，

user: user-0
content: 引用 8 楼 paschen的回复:不要用VC6了，太老了，新手可以用VS2010，从大一开始养成好习惯 嗯，我得努力，就是个破二本

user: user-0
content: 有什么书可以推荐一下吗？现在我啥也不会

user: user-0
content: 但他是国家计算机二级的考试环境啊

user: user-2
content: 不要用VC6了，太老了，新手可以用VS2010，从大一开始养成好习惯

user: user-0
content: 引用 5 楼 赵4老师的回复:FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  用英文版的MSDEV.exe替换中文版MSDEV.exe 谢谢赵四老师虽然不懂，刷机吧，我也不会，学习吧

user: user-0
content: 引用 5 楼 赵4老师的回复:FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  用英文版的MSDEV.exe替换中文版MSDEV.exe 下载filetool?

user: user-3
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  用英文版的MSDEV.exe替换中文版MSDEV.exe

user: user-3
content: 玩游戏玩太嗨 或者 杀毒软件太流氓  会重装系统、重装软件、备份重要文件、……都属于码农的基本技能。

user: user-0
content: 是不是要该操作系统，关键是matlab也报废

user: user-0
content: 不是代码问题，压根输入不了程序

user: user-4
content: 是你代码问题还是你的VC6有问题。 代码问题：单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 软件问题：换成VShttp://blog.csdn.net/cometnet/article/details/19551125
user-0 提问: 关于生成随机数

回复:
user: user-1
content: 不太明白楼主的问题。 printf("Computer's turn.\n");之后你有一句scanf("%d", &r); 当然需要输入一个数才能继续下去啊？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 【请教】fprintf的内容存入文本后怎么让他显示在屏幕上？

回复:
user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:system("cmd /c type your_result.txt | mode");//将文件your_result.txt逐屏显示到屏幕上 system("notepad your_result.txt");//将文件your_result.txt用记事本打开显示到屏幕上 纠正：mode应为more

user: user-2
content: fscanf 时需要传入的是地址，而不是数值，所以%d 应该用一个变量的地址来接收

user: user-1
content: system("cmd /c type your_result.txt | mode");//将文件your_result.txt逐屏显示到屏幕上 system("notepad your_result.txt");//将文件your_result.txt用记事本打开显示到屏幕上

user: user-3
content: %d和%f对应的变量需要加上取地址符 fscanf(fp,"收入日期：%d-%d-%d  收入原因：%s  收入%f \n",&year,&month,&day,reason,&money);

user: user-0
content: 引用 1 楼 user-4 的回复:scanf要传地址 拜托能讲详细一点吗 刚学

user: user-0
content: 拜托能讲详细一点吗 刚学

user: user-4
content: scanf要传地址
user-0 提问: 用C语言怎么实现以下功能，请教大神！

回复:
user: user-1
content: 具体代码你自己实现，我把思路说一下： 1.用fopen只读打开源文件A，用fopen以“w”写的方式打开一个空目标文件B。 2.用fread逐行读取内容存储到一个缓存char数组中（数组空间要足够），然后用C函数strstr查找第一个",找到之后，指针操作，再找第二个"，把第一个引号的指针和第二个引号的指针做差得出你要索取的字符个数（步长），然后用fwrite（第一个引号的指针+步长）写进文件B 3.关闭文件A和文件B

user: user-0
content: 怎么把新文件里面重复的NODE名字删掉？求大神指教

user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE *fp1; FILE *fp2; fp1=fopen("src.txt","r"); fp2=fopen("生成.txt","w"); if(NULL==fp1) { 	printf("未发现原文件!!!\n"); 	exit(-1); } if(NULL==fp2) { 	printf("目标文件打开失败!!!\n"); 	exit(-1); } const char* Key[] = {"drive","receive","detector"}; char buf[1024] = {0}; char* p1 = NULL; char* p2 = NULL; int i; while(!feof( fp1 ) ) { 	memset(buf,0,sizeof(buf)); 	fgets(buf,sizeof(buf)-1,fp1); 	for(i=0;i < sizeof(Key)/sizeof(char*);++i) 	{ 		p1=strstr(buf,Key[i]);//对比关键字是否存在 		if(NULL != p1) 		{ 			p1 = strstr(buf,"\"");//查找第一个引号 			if(NULL != p1) 			{ 				p2 = strstr(++p1,"\""); 				if(NULL != p2) 				{ 					*p2 = '\0'; 					fprintf(fp2,"%s\n",p1); 				} 			} 		} 	} } fclose(fp1); fclose(fp2); return 0; }
user-0 提问: 运行时总是出现这样的问题，怎么回事啊。

回复:
user: user-1
content: 建议不要花时间比较这些，只要代码能达到你的要求就可以

user: user-2
content: 引用 2 楼 qq_33347226 的回复:[quote=引用 1 楼 paschen的回复:]void Visit(ElemType T)  函数参数是否应该为BiTree类型  ElemType其实是char，你在Visit中调用printf("%c",T->data);是错的，因为没有data成员 ElemType改BiTree又会出现其它问题[/quote] 一楼说的没问题。不过需要你进行连带修改，不能把函数定义改完，其他调用的地方就不改了。程序段很多情况有关联性。 另外，你要加上main入口函数。  #include <iostream>   #include <stdlib.h>  #include <string.h>  #include <math.h>  using namespace std; typedef char ElemType;   //定义结点数据为字符型  typedef int Status;       //定义函数类型为int型  #define ERROR 0   #define OK 1     int leafNum=0;  typedef struct BiTNode {        //定义结构体   ElemType        data;     //结点数值   struct BiTNode   *lchild;  //左孩子指针   struct BiTNode   *rchild;  //右孩子指针     }BiTNode, *BiTree;   Status InitBiTree(BiTree &T)  //构造空二叉树T   {   T=NULL;    cout<<"空二叉树构建成功!\n"<<endl;  return OK;   }//InitBiTree  Status DestroyTree(BiTree &T)  //销毁二叉树 {     if(T) {                 DestroyTree(T->lchild);      DestroyTree(T->rchild);  free(T); T=NULL;    }         return OK;  }//DestroyTree  Status CreatBiTree(BiTree &T)//用扩展先序遍历序列创建二叉树，如果是当前树根置为空，否则申请一个新节点  {    ElemType ch;    cin>>ch;     if(ch=='#') T=NULL;   else   {      T=(BiTNode*)malloc(sizeof(BiTNode));//申请一段关于该节点类型的存储空间      T->data=ch;                     //生成根结点      CreatBiTree(T->lchild);         //构造左子树       CreatBiTree(T->rchild);         //构造右子树   }    return OK; } void Visit(const BiTree& T) { if(T!=NULL) printf("%c",T->data); }  Status PreOrder(const BiTree& T)  //按先序次序(递归)访问二叉树  {   if(T==NULL) return 0; Visit(T); PreOrder(T); PreOrder(T); //填空 return OK;   }  Status InOrder(BiTree T)  //按中序次序(递归)访问二叉树  {   if(T==NULL) return 0; InOrder(T->lchild); Visit(T); InOrder(T->rchild); return OK;   }  Status PostOrder(BiTree T)  //按后序次序(递归)访问二叉树  {   if(T==NULL) return 0; PostOrder(T->lchild); PostOrder(T->rchild); Visit(T); return OK;   }  Status PrePrintLeaf(BiTree T)  //按先序次序(递归)输出叶子结点 { if(T==NULL) return 0; { if(T->lchild==NULL&&T->rchild==NULL) printf("%c",T->data); PrePrintLeaf(T->lchild); PrePrintLeaf(T->rchild); } return OK;   }  Status CountLeafNum(BiTree T)  //统计叶子结点的个数 { int n;n=0; if(T==NULL) return 0; { if(T->lchild==NULL&&T->rchild==NULL) n++; CountLeafNum(T->lchild); CountLeafNum(T->rchild); } return OK;   }  Status PostPrintNode(BiTree T)  //按后序次序(递归)输出度为2的结点 {  if(T==NULL) return 0; { PostPrintNode(T->lchild); PostPrintNode(T->rchild); if(T->lchild!=NULL&&T->rchild!=NULL) printf("%c",T->data); } return OK;   }  int PostTreeDepth(BiTree T)  //获取二叉树高度  {   int hl,hr,max; if(T!=NULL) { hl=PostTreeDepth(T->lchild ); hr=PostTreeDepth(T->rchild ); max=hl>hr?hl:hr; return(max+1); } else return 0;   }

user: user-0
content: 引用 1 楼 paschen的回复:void Visit(ElemType T)  函数参数是否应该为BiTree类型  ElemType其实是char，你在Visit中调用printf("%c",T->data);是错的，因为没有data成员 ElemType改BiTree又会出现其它问题

user: user-1
content: void Visit(ElemType T)  函数参数是否应该为BiTree类型  ElemType其实是char，你在Visit中调用printf("%c",T->data);是错的，因为没有data成员
user-0 提问: oracle proc insert动态sql和数组使用，请大神指导！

回复:
user: user-0
content: 引用 3 楼 sunyongliang118 的回复:把你的代码贴一下。感觉你的插入的数据和列的个数不匹配 确实是不匹配的，要不我就不标注红丝部分了，如果使用循环多次使用cursor就不纠结了！！！

user: user-1
content: 把你的代码贴一下。感觉你的插入的数据和列的个数不匹配

user: user-0
content: 引用 1 楼 sunyongliang118 的回复:你这是存储过程的代码报错？？？  另外 PCC-S-02365, Indicator array size cannot be smaller than host array size  这句的意思大概是标识的阵列空间不可以比主机阵列的小。  不是存储过程，是oracle proc的代码，就是想直接指定插入的条目数

user: user-1
content: 你这是存储过程的代码报错？？？  另外 PCC-S-02365, Indicator array size cannot be smaller than host array size  这句的意思大概是标识的阵列空间不可以比主机阵列的小。
user-0 提问: C calls C++ class in Eclipse

回复:
user: user-1
content: 引用 1 楼 user-4 的回复:no picture your say a JB 好口语

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不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-3
content: see Stroustrup's answer

user: user-4
content: no picture your say a JB
user-0 提问: c语言在vc++6.0中的问题

回复:
user: user-0
content: vs还是比较好用的．

user: user-1
content: 换成VS吧http://blog.csdn.net/cometnet/article/details/19551125

user: user-0
content: 谢谢! 我明白您的意思，直接连接吗？

user: user-2
content: 因为你的find是在test中定义的，所以test1.c中确实找不到啊。 你可以把定义find的文件先编译成一个.o，再与test11.c编译生成的.o一块链接。

user: user-0
content: test.c: #include "test.h" int find() { return 1; } int test() { return 2; } test.c是这个样子的，但还是有同样的问题

user: user-3
content: 因为你定义了两个main函数

user: user-0
content: 连接时的问题： Linking... test11.obj : error LNK2001: unresolved external symbol _find test11.obj : error LNK2001: unresolved external symbol _test Debug/test11.exe : fatal error LNK1120: 2 unresolved externals 执行 link.exe 时出错.  test11.exe - 1 error(s), 0 warning(s) 三个文件在同一个文件夹下，如何解决，望大神指教一二
user-0 提问: 如何通过指针实现执行代码的软重启（假设执行代码的起始地址为0x0000）

回复:
user: user-1
content: 没那么复杂，用typedef声明下，很简单明了  typedef int(*VF)(); VF vf = (VF)0x10000; vf();   int _tmain(int argc, _TCHAR* argv[]) { 	if (LONG(argv) ==0) 	{ 		printf("0\n"); 		return 0; 	} 	else if (LONG(argv) ==1) 	{ 		printf("1\n"); 		return 0; 	} 	else printf(__FUNCTION__ "\n");  	::getchar(); 	 	((int(*)(int, _TCHAR*[]))_tmain)(0, 0);  	typedef int(*VF)(int,  _TCHAR*[]); 	VF vf = (VF)_tmain; 	vf(0, (_TCHAR**)1);;  	printf("The End\n"); 	::getchar(); 	return 1; }

user: user-2
content: 参考开源虚拟机源代码相关片断。

user: user-3
content: 我估计它的意思是通过函数指针在某一个时刻将某一段代码加载到某个内存段中执行～其实就是拷贝代码动态执行的意思罢……
user-0 提问: 制作图像加密软件，需要了解哪些知识？

回复:
user: user-1
content: 作为初步的尝试...... 楼主可以把图片用 Adobe Photoshop 打开，然后 文件(F) ->存储为(A)，格式(F) 一栏选 Portable Bit Map. 然后楼主上网查一下 PPM 图像格式，这应该是最简单的一种了。当然，jpeg 的库多得是，各种年代的都有......

user: user-2
content: 图像处理基础 http://www.codeproject.com/Articles/781213/Fundamentals-of-Image-Processing-behind-the-scenes

user: user-3
content: http://blog.csdn.net/syrchina/article/details/8223092

user: user-4
content: 建议先把基础打好  如果是位图，在WINDOWS上可以调用GetDIBits，或者直接使用OPENCV
user-0 提问: 怎样将.mat文件应用到C语言中，直接读入就行吗？

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

user: user-2
content: http://blog.csdn.net/left_la/article/details/8206645

user: user-3
content: 你指的是MATLAB中的.mat文件吗，需要了解这种文件的存储格式  可参看：《matlab与c/c++混合编程》
user-0 提问: 数据结构求二叉树深度，问题在代码上标出

回复:
user: user-1
content: 递归出的结果是当前结点的子结点的深度，因为自己也是一层，所以要加一返回给上一层。

user: user-2
content: 分别求出左子树的深度、右子树的深度，两个深度的较大值+1即可求出二叉树深度

user: user-3
content: +1还要算上根节点  函数用到了递归

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

user: user-5
content: 更正：hl是左子树高度，hr是右子树高度

user: user-5
content: hr是左了树的高度，+1是因为当结点要算一层
user-0 提问: 哪位能给我一个不重不漏的C标准库函数大全。

回复:
user: user-1
content: 引用 11 楼 zhao4zhong1 的回复:查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。 请教赵４老师，如果是写linux驱动，要用内核函数，到哪查哪。  我目前下到一个linux-api-2.6.22.14的chm文件，可是发现不全。 另外我也知道了用make htmldocs 能自动生成手册，但那是html的，想要直接查一个函数或结构体很麻烦。 用man命令内核函数根本没有

user: user-2
content: 查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。

user: user-2
content: 不重不漏地将C标准库全部倒背如流又能怎样？ 还是飞不到天外。

user: user-1
content: 你说的ultoa不是标准的C函数库。  网上查一般就cplusplus.com与cppreference.com, cppreference.com有中文版的。 网上可以下到一个根据cppreference做到一个chm格式的文档，但比较早，收录的函数不是很全。

user: user-2
content: grep  https://www.baidu.com/s?wd=linux驱动开发

user: user-1
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 12 楼 ipqtjmqj 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] 查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。 请教赵４老师，如果是写linux驱动，要用内核函数，到哪查哪。  我目前下到一个linux-api-2.6.22.14的chm文件，可是发现不全。 另外我也知道了用make htmldocs 能自动生成手册，但那是html的，想要直接查一个函数或结构体很麻烦。 用man命令内核函数根本没有[/quote] 提醒：Linux是开源的。[/quote] 我试过，源代码太多了，查一个函数都要等好几秒，见这个主题

user: user-2
content: 引用 12 楼 ipqtjmqj 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] 查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。 请教赵４老师，如果是写linux驱动，要用内核函数，到哪查哪。  我目前下到一个linux-api-2.6.22.14的chm文件，可是发现不全。 另外我也知道了用make htmldocs 能自动生成手册，但那是html的，想要直接查一个函数或结构体很麻烦。 用man命令内核函数根本没有[/quote] 提醒：Linux是开源的。

user: user-3
content: 引用 3 楼 stalk12 的回复:呵呵，不好意思，有没有中文注释的？  http://zh.cppreference.com/w/c/header

user: user-4
content: 仅 C 的部分就是这两个网址了： http://www.cplusplus.com/reference/clibrary http://en.cppreference.com/w/c

user: user-5
content: 引用 3 楼 stalk12 的回复:呵呵，不好意思，有没有中文注释的？  没有  http://en.cppreference.com/w/Main_Page

user: user-2
content: 英语也是一门计算机语言的说。

user: user-2
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-0
content: 呵呵，不好意思，有没有中文注释的？

user: user-3
content: http://en.cppreference.com/w/c/header

user: user-2
content: http://www.cplusplus.com
user-0 提问: 杭电2072的题目，为什么我的测试数据自己测试都符合要求，就是WA

回复:
user: user-0
content: 引用 1 楼 赵4老师的回复:边界条件 输入输出格式 …… 发现问题了，如果先打多个空格就会出错

user: user-1
content: 边界条件 输入输出格式 ……
user-0 提问: 不知道哪里出错了，运行不出来，求助；

回复:
user: user-1
content: Void Visit(ElemType T)  改成  void Visit(ElemType T)   if(T==NuLL)  改成  if(T==NULL)  没有下面这两个函数，检查你是要用哪个 PreOrderPrePrintLeaf(T->lchild); PreOrderPrePrintLeaf(T->rchild);

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

user: user-3
content: 建议楼主单步调试一下。
user-0 提问: 使用递归的方法反转单链表 C语言

回复:
user: user-0
content: 大神。。。我改了一下你的code。。结果就可以了。。太感谢了。。 虽然作业早交，还是很开心能知道这道题的代码 结贴了 。。。感谢各位

user: user-1
content: 利用递归的堆栈？关注贴

user: user-2
content: //试试 void reverse (LL_t &L) {     if (L.head->next == L.tail)     {         L.tail->next = L.head;         L.head->next = NULL;          L.head = L.tail;         L.tail = L.head->next;         return;     }     LL_t subL;     subL.head = L.head;     node_t *pOldTailToNewHead = L.tail;     for (node_t * cur = L.head; cur != L.tail; cur = cur->next)     {         subL.tail = cur;     }     reverse(subL);     L.head = pOldTailToNewHead;     L.head->next = subL.head;     L.tail = subL.tail; }

user: user-3
content: 链表节点挨个压栈，然后挨个出栈。示例代码：  for(it = list.begin(); it != list.end(); it++) {         stack.pop(*it);        cnt++; }  for(int i = 0; i < cnt; i++) {          list.insert(stack.push()); }

user: user-4
content: 必要地方设置断点，单步跟踪程序运行，观察每一步是否与你期望的结果一致，分析原因

user: user-5
content: 引用 5 楼 haofannaaa 的回复:大道理我都懂。。。但是 能写code的出来吗。。。 百度搜相关关键字。

user: user-0
content: 大道理我都懂。。。但是 能写code的出来吗。。。

user: user-6
content: 递归的思想和最简单的循环逆转单链表有点类似，一个是利用循环和指针来实现逆转，另一个是利用指针和函数的嵌套来实现。

user: user-0
content: 然而还是不知道怎么写

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

回复:
user: user-1
content: 链接：http://pan.baidu.com/s/1dFcF4e1 密码：9q61 很容易理解。但不知道对你有用没有

user: user-0
content: 感谢各位

user: user-0
content: 引用 2 楼 paschen的回复:静下心读： http://blog.itpub.net/10752043/viewspace-993886/ 感谢

user: user-0
content: 引用 2 楼 paschen的回复:静下心读： http://blog.itpub.net/10752043/viewspace-993886/ 谢谢啦会仔细看的

user: user-2
content: http://wenku.baidu.com/view/953fb977a26925c52cc5bf8e.html?from=search

user: user-3
content: 静下心读： http://blog.itpub.net/10752043/viewspace-993886/

user: user-4
content: 《深入理解C指针》

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

user: user-6
content: 指针是一种变量，是指向变量或数组等其他变量或常量(如字符串）地址的，将指针变量与变量地址捆绑后可以替代变量使用，指针这块内容挺灵活的

user: user-7
content: 多看书，多练习，多思考。如果想要讲解，可以去看看网上大神的帖子(很多)。

user: user-8
content: 用多了，看多了自然就了解了。 http://blog.chinaunix.net/uid-22889411-id-59688.html
user-0 提问: 求助：8皇后问题

回复:
user: user-1
content: 引用 3 楼 DKtion 的回复:[quote=引用 2 楼 u010165006 的回复:] 参考： 数据结构课程设计案例精编:用C/C++描述  额  可以具体点吗？[/quote]  自己查目录

user: user-2
content: 仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-3
content: #include<stdio.h>   int chess[8][8]={0};   int a[8],b[15],c[15];   int sum=0;                                            //统计所有摆法   void PutQueen(int n)   {       int col,i,j;       for(col=0;col<8;col++)       {           if(a[col]&& b[n+col] && c[n-col+7])                 //判断安全位置           {               chess[n][col]=1;                            //放置皇后               a[col]=0;               b[n+col]=0;               c[n-col+7]=0;               if(n==7)               {                   sum++;                   printf("第%d种可能的摆法:/n",sum);    //输出皇后摆法                       for(i=0;i<8;i++){                           printf("/t/t");                           for(j=0;j<8;j++)                               printf("%d ",chess[i][j]);                           printf("/n");                       }                       printf("/n");   //                  goto END;                         //输出第一种摆法                       if(sum%10==0)                     //每输出十种暂停                       {                           printf("按回车键继续……");                           getchar();                       }               }               else                    PutQueen(n+1);                        //递归               chess[n][col]=0;                            //取消皇后               b[n+col]=1;                                                 c[n-col+7]=1;               a[col]=1;                                      }       }   //END:  return;   }   int main()   {         int i;       for(i=0;i<8;++i)           a[i]=1;       for(i=0;i<15;++i)       {           b[i]=1;           c[i]=1;       }       PutQueen(0);       printf("八皇后摆法总数: %d/n",sum);       return 0;   }

user: user-0
content: 谢谢 赵4老师的指点

user: user-0
content: 引用 2 楼 u010165006 的回复:参考： 数据结构课程设计案例精编:用C/C++描述  额  可以具体点吗？

user: user-1
content: 参考： 数据结构课程设计案例精编:用C/C++描述

user: user-0
content: 大神们快来...
user-0 提问: 问一下，链表指针返回值这里应该怎么写啊

回复:
user: user-1
content: 参数LinkList &L 改成 Linklist &L  注意大小写  同理 LinkList current, p; 这句  你返回的是L，所以返回类型应该是Linklist  即Linklist ListReverse2(Linklist &L)

user: user-2
content: 参考：  ListNode* ReverseList(ListNode* head) {  	ListNode* pNode = head; 	ListNode* pPrev = NULL;  	while (pNode != NULL) 	{ 		ListNode* pNext = pNode->m_pNext;//保存下一个节点的值    		pNode->m_pNext = pPrev;//把当前pNode的下一个节点指向pPrev   		pPrev = pNode;//此时pPrev向后移动指向此时的pNode    		pNode = pNext;//而pNode也向后移动，指向刚才保存的pNext;   	}  	return pPrev; 	//  return pReversedHead;    }   http://blog.csdn.net/djb100316878/article/details/41893109
user-0 提问: C语言描述协议头的问题

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545 ^_^  这段话没看懂啊~下面的代码再去研究下

user: user-0
content: 引用 1 楼 bjym1987 的回复:消息 不要么  这只是协议头啊  消息就放在协议后面啦

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

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

user: user-2
content: 消息 不要么