Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 为什么结果显示long和指针p都占12个字节，这不科学啊

回复:
user: user-1
content: 首先回答问题：内存对齐的原因，64位下，int一般需要4字节对齐，而long需要8字节对齐 拿变量b来说，变量a地址 0x7fff5fbff86c - 8 = 0x7fff5fbff864 只满足4字节对齐 要满足8字节对齐还要移动4个字节到0x7fff5fbff860  顺便说一下你这个问题本身就不科学 1) 你这个程序在不同平台、不同编译器、甚至不同优化级别下有可能产生不同的结果，因为不同平台内存对齐要求可能不一样，C标准也没有规定不能移动变量的顺序，比如在Linux gcc环境下，你可以看到编译器把c放到了b的前面来对齐。  2) long占用8个字节，int占用4个字节，char占用1个字节这样的说法都是纯理论的，实际一个变量占用多少内存这个问题情况太复杂，而且基本没有意义，比如根据编译器优化不同，一个变量有可能在寄存器中，所以根本不需要占用任何内存，又比如虽然char通常只需要1个字节，但因为内存对齐以及调用函数时参数传递问题，实际上会占用4个字节，所以理论性讨论这个问题还好，你要研究实际运行时的情况那已经不是C的范畴而是汇编甚至是底层硬件设计的问题。

user: user-2
content: 应该看sizeof吧

user: user-3
content: 因为b需要对齐到8字节，6c往下8字节64并不能对齐到8字节，所以只能再往下从60开始分配。这样68到6c这段内存其实是没有被使用的。b后面的空间有12位但是b本身还是只占用8字节。

user: user-4
content: 看所占字节，要用sizeof，并不是打印他的地址就可以了。  打印的时候，是看格式化字符串，如果我打印%c,%d,那么1字节，4字节都可以打印出来，未必它们就占1字节了。

user: user-0
content: 引用 2 楼 BoyNextDoor 的回复:因为b需要对齐到8字节，6c往下8字节64并不能对齐到8字节，所以只能再往下从60开始分配。这样68到6c这段内存其实是没有被使用的。b后面的空间有12位但是b本身还是只占用8字节。 引用 4 楼 vnvlyp 的回复:首先回答问题：内存对齐的原因，64位下，int一般需要4字节对齐，而long需要8字节对齐 拿变量b来说，变量a地址 0x7fff5fbff86c - 8 = 0x7fff5fbff864 只满足4字节对齐 要满足8字节对齐还要移动4个字节到0x7fff5fbff860  顺便说一下你这个问题本身就不科学 1) 你这个程序在不同平台、不同编译器、甚至不同优化级别下有可能产生不同的结果，因为不同平台内存对齐要求可能不一样，C标准也没有规定不能移动变量的顺序，比如在Linux gcc环境下，你可以看到编译器把c放到了b的前面来对齐。  2) long占用8个字节，int占用4个字节，char占用1个字节这样的说法都是纯理论的，实际一个变量占用多少内存这个问题情况太复杂，而且基本没有意义，比如根据编译器优化不同，一个变量有可能在寄存器中，所以根本不需要占用任何内存，又比如虽然char通常只需要1个字节，但因为内存对齐以及调用函数时参数传递问题，实际上会占用4个字节，所以理论性讨论这个问题还好，你要研究实际运行时的情况那已经不是C的范畴而是汇编甚至是底层硬件设计的问题。  谢谢你们的回答，我去了解了一下内存对齐，又增加了一个知识点。拿分，不谢！

user: user-5
content: 引用 4 楼 vnvlyp 的回复:首先回答问题：内存对齐的原因，64位下，int一般需要4字节对齐，而long需要8字节对齐 拿变量b来说，变量a地址 0x7fff5fbff86c - 8 = 0x7fff5fbff864 只满足4字节对齐 要满足8字节对齐还要移动4个字节到0x7fff5fbff860  顺便说一下你这个问题本身就不科学 1) 你这个程序在不同平台、不同编译器、甚至不同优化级别下有可能产生不同的结果，因为不同平台内存对齐要求可能不一样，C标准也没有规定不能移动变量的顺序，比如在Linux gcc环境下，你可以看到编译器把c放到了b的前面来对齐。  2) long占用8个字节，int占用4个字节，char占用1个字节这样的说法都是纯理论的，实际一个变量占用多少内存这个问题情况太复杂，而且基本没有意义，比如根据编译器优化不同，一个变量有可能在寄存器中，所以根本不需要占用任何内存，又比如虽然char通常只需要1个字节，但因为内存对齐以及调用函数时参数传递问题，实际上会占用4个字节，所以理论性讨论这个问题还好，你要研究实际运行时的情况那已经不是C的范畴而是汇编甚至是底层硬件设计的问题。  说的太好了！
user-0 提问: for(i=0;i

回复:
user: user-1
content: 内部循环变量是从0开始遍历还是从i的值开始的区别  如果理解不了，可以上机单步调试一下就明白有什么不同了

user: user-2
content: 一个倒三角，一个正方形

user: user-3
content: 为什么不上机试试呢

user: user-4
content: 引用 18 楼 zhao4zhong1 的回复:[quote=引用 17 楼 Minikinfish 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D中出现continue，就完蛋了。[/quote] 那麻烦你贴出一段D中出现continue，证明该论断“完蛋了”的例子代码。[/quote]  // for for (int i=0; i<10; ++i) {     if (i == 5)         continue; }  // while int i = 0; while (1) {     if (!(i<10))         break;          if (i == 5)         continue;        // 此处死循环了      ++i; }

user: user-5
content: 前面执行n*n次，后面n*(n+1)/2次，后面j的初始值是i

user: user-6
content: 区别是 1*1 1*2 1*3......... ........ ... ....... .... 9*1 9*2 .......9*9 和 1*1 1*2 .........1*9 2*2 .......  2*9 ... ... 8*8 8*9 9*9

user: user-7
content: 引用 17 楼 Minikinfish 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D中出现continue，就完蛋了。[/quote] 那麻烦你贴出一段D中出现continue，证明该论断“完蛋了”的例子代码。

user: user-4
content: 引用 2 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   D中出现continue，就完蛋了。

user: user-8
content: n * n 和 n * (n + 1) / 2 的区别

user: user-9
content: 循环次数不同

user: user-10
content: 次数不同 一个是n^2 ， 一个是n(n+1)/2

user: user-9
content: 。。。赞一楼

user: user-11
content: for(i=0;i<n;i++) for(j=0;j<n;j++)与for(i=0;i<n;i++) for(j=i;j<n;j++)区别可大了，前者第一个for都执行了n次第二个执行n*n次，后者i对应执行了n次，j第一次执行n，第二次执行n-1次，第三次执行n-2次，以此类推

user: user-12
content: 顶一楼

user: user-13
content: 可以进行赋值输出看看结果

user: user-14
content: j每次循环的初始值不同

user: user-15
content: 没错，初值不同，j执行的次数是不同的。

user: user-16
content: 上机试一下  就知道了

user: user-17
content: 第一个j的值每次都是从0开始，第二个j的值每次是从i开始。

user: user-18
content: 要搞清楚for循环的使用方法，for(j=i;j<n;j++)中j=i是赋初值，表示j的初始值是i，随着i的不同是变化的
user-0 提问: 数据结构初学者求助 char name[20]；用意

回复:
user: user-1
content: char name[20]；  定义字符数组name，这样可以存放字符串

user: user-2
content: 引用 11 楼 u012130706 的回复:用char name[20]可以存放20个学生的姓名，用name只能存一个 瞎扯蛋

user: user-3
content: 不要误导新人嘛

user: user-4
content: char name[20] 是用来存放学生姓名的，char 定义的时字符型，学生姓名一般有多个字符组成，所以这里用了一个字符数组来存放学生姓名！但是如果一个学生的姓名字符数超过了20 ，这么写就有问题了，所以，这里写成char *name我觉得更合适。

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

user: user-0
content: 谢谢大家回答

user: user-6
content: 不就是为了在student 中声明一个char类型的数组，数组存放20个char类型的字符，如果是字符串最后一个是\n。这有什么不明白的

user: user-7
content: 引用 11 楼 u012130706 的回复:用char name[20]可以存放20个学生的姓名，用name只能存一个 胡扯！

user: user-8
content: 引用 11 楼 u012130706 的回复:用char name[20]可以存放20个学生的姓名，用name只能存一个  胡扯 + 1  所有的变量都会对应内存的一个地址

user: user-9
content: 我也是醉了，char  name[20],定义一个字符串数组，数组大小是二十个字节，但是最后一个字节要用来存放'   \0'  所以你实际能用的空间只有19个字节，   每一个姓名不管大小都占用19个字节，前提是数组能够装得下！

user: user-10
content: 引用 2 楼 pjw694438869c 的回复:为什么要用数组?不能直接name吗?你果然是新手呀，姓名是字符串呀

user: user-11
content: char 字符型只能存一个字符集。想多存也就只能用数组了……

user: user-11
content: 对，，明显误人

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

user: user-12
content: 用char name[20]可以存放20个学生的姓名，用name只能存一个

user: user-13
content: C语言没有字符串类型，所以只能利用数组，连续地址存储；char name 表示name是一个字符，但是输入的字符串所以是name【】

user: user-14
content: C语言没有字符串变量,都是用char数组储存,例如一个单词student,它需要8个字符(包括最后的'\0')也就是char a[8]才能完全储存这个单词

user: user-15
content: char 是字符类型，只能存储1个字节的字符，所以一般用字符数组（连续的一组字符）来保存字符串。

user: user-16
content: char 代表字符型，也就是说 这个人名字最长只能有20个字符，来个外国人就放不下了

user: user-17
content: 假如你的name是Tom， "Tom"可以放到char name;吗？ 是不是应该放到char name[20];呢？
user-0 提问: 如何修改特定地址的值

回复:
user: user-1
content: 修改如下：  #include<stdio.h> #include<string.h> int main() { 	//char *c = "im the best";    //c指向一常量，不可对常量修改 	char c[] = "im the best";     //等价于 c[12]={'i','m',' ','t','h','e',' ','b','e','s','t','\0'}; 	char *fynd = strstr(c, "b"); 	printf("%s\n", c); 	*fynd = '6'; 	printf("%s\n", c); 	printf("%s\n", fynd);  	return 0; } //im the best //im the 6est //6best

user: user-2
content: 字符串常量不可 修改

user: user-3
content: 字符串常量的类型是const char *,你用char *很容易出错. 于是改成: char c[]="im the best";
user-0 提问: 求救，帮我看看小程序哪有问题

回复:
user: user-1
content: 运行：

user: user-1
content: 修改  #include<stdio.h>  int main() { 	char s[2]; 	char ch;  	printf("请键入一个大写字母：\n"); 	while ((ch = getchar()) != '\n') 	{ 		if (('A' <= ch) && (ch <= 'Z')) 			printf("%c的小写形式是%c\n", ch, ch + 32); 		else 			printf("抱歉，您的输入有误\n"); 	}  	system("pause"); 	return 0; }

user: user-2
content: 引用 5 楼 whappymanlynn 的回复:[quote=引用 2 楼 super_miker 的回复:] while((ch=getchar())!='\n') 亲，能告诉我为神魔吗？是我哪里出错了，给点明示[/quote] 赋值运算的优先级低于比较运算

user: user-0
content: 引用 2 楼 super_miker 的回复:while((ch=getchar())!='\n') 亲，能告诉我为神魔吗？是我哪里出错了，给点明示

user: user-3
content: while里面不能这么写！

user: user-4
content: 引用 2 楼 super_miker 的回复:while((ch=getchar())!='\n') ++

user: user-2
content: while((ch=getchar())!='\n')

user: user-5
content: while里面不能这么写！
user-0 提问:  使用串口转I2C实现数据的收发总是出现丢数据的现象

回复:
user: user-1
content: 1、 要保证 UART发送前的数据的准确。即gu16ReadAddr + u16I2CSendLen 和 gu16WriteAddr + u16I2CSendLen 不溢出等。  2. HW_UartWriteData 什么方式写，没有code，说不出啥。  3. u8Uart1SendBuf 的内容要对。  4. 你说的太模糊了，不知道你的实际情景，input 指从哪儿input，output从哪儿output，。。。
user-0 提问: socket tcp connect服务端的问题

回复:
user: user-0
content: 在服务端ping其他电脑出现：来自 192.168.0.115 的回复: 无法访问目标主机。  而在其他电脑上ping其他电脑出现的都是：请求超时。

user: user-0
content: 引用 5 楼 focuslight 的回复:先ping 一下    看连接函数返回值  ping 192.168.0.115 结果都是超时，这是为什么  引用 4 楼 zhao4zhong1 的回复:能ping通的话，抓包； ping不通的话，找网管。 ping 192.168.0.115 结果都是超时，你确定这是网络问题了吗？如果是，我就去找网管了，因为找网管不好找

user: user-0
content: 引用 5 楼 focuslight 的回复:先ping 一下    看连接函数返回值  ping 192.168.0.115 结果都是超时，这是为什么

user: user-1
content: 先ping 一下    看连接函数返回值

user: user-2
content: 能ping通的话，抓包； ping不通的话，找网管。

user: user-0
content: 是IOCP，字母打错了

user: user-0
content: 还有，我还想问问，closesocket， 因为我是用ICOP处理数据接收，所以我应该在什么时候使用closesocket关闭连接客户端的socket？

user: user-0
content: 局域网其他电脑连不上，返回的错误吗是: WSAETIMEDOUT 10060 (0x274C)  A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

user: user-3
content: 显然你的 局域网的路由上做了访问规则，找网管 ，妥妥的
user-0 提问: 写了个递归的函数， 为什么会报错啊？标题长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长

回复:
user: user-1
content: 你是要这个吧  #include <stdio.h> #include <stdlib.h>  int f(int n, int A, int B) { 	if (n == 1 || n == 2)return 1; 	else return (A*f(n - 1, A, B) + B*f(n - 2, A, B)) % 7; }  int main() { 	int A, B, n; 	while (1) 	{ 		scanf("%d %d %d", &A, &B, &n); 		if (A == 0 && B == 0 && n == 0)break; 		printf("%d\n", f(n, A, B)); 	}  	return 0; }

user: user-2
content: f不是3个参数吗 你写了1个 f(n-1)
user-0 提问:  求助 一维数组求重复元素以及个数 

回复:
user: user-1
content: 要求  输入6个从小到大排列的数字

user: user-2
content: 引用 6 楼 zhangxiangDavaid 的回复: 一楼有bug，  你的输入不符合题目要求

user: user-2
content: #include<stdio.h> int main() { 	int max_value,cur_value,old_value,max_count=0,cur_count,i;	 	const int SIZE=6; 	for(i=0;i<SIZE;++i) 	{ 		scanf("%d",&cur_value); 		if(!i) 		{ 			old_value=cur_value; 			cur_count=1; 		} 		else if(old_value==cur_value) 			++cur_count; 		else 		{ 			if(cur_count>=max_count) 			{ 				max_value=old_value; 				max_count=cur_count; 			} 			old_value=cur_value; 			cur_count=1; 		} 	} 	if(cur_count>=max_count) 	{ 		max_value=old_value; 		max_count=cur_count; 	} 	printf("value=%d,count=%d\n",max_value,max_count); 	return 0; }

user: user-1
content: 一楼有bug，

user: user-3
content: 引用 4 楼 cfjtaishan 的回复:定义一个数字数组digit[10] = { 0};然后用用一个循环for (i = 0; i <MAX; i++) digit[i]++;最后求一个最大值；是求digit[i]的最大值[

user: user-3
content: 定义一个数字数组digit[10] = { 0};然后用用一个循环for (i = 0; i <MAX; i++) digit[i]++;最后求一个最大值；

user: user-4
content: 给出的都是Ｎ*Ｎ的算法，可以考虑二叉堆。

user: user-5
content: #include <memory.h> #include <stdio.h> #define SIZE 6  struct MyNode { 	int value;//值 	int count;//出现次数 	int valid; //是否有效，1有效，0无效 };  int main (void) { 	MyNode nodes[SIZE]; 	memset(nodes,0,sizeof(nodes)); 	int i=0,j=0,temp=0; 	for(i=0;i<SIZE;++i) 	{ 		scanf("%d",&temp); 		for(j=0;j<SIZE;++j) 		{ 			if(nodes[j].value==temp&&nodes[j].valid==1) 			{ 				nodes[j].count++; 			} 			else if (nodes[j].valid==0) 			{ 				nodes[j].value=temp; 				nodes[j].valid=1; 				nodes[j].count=1; 				break; 			} 		} 	} 	MyNode nd=nodes[0]; 	for(i=0;i<SIZE;++i) 	{ 		if(nodes[i].valid==1) 		{ 			if(nd.count<nodes[i].count) 			{ 				nd=nodes[i]; 			} 			else if(nd.count==nodes[i].count&&nd.value<nodes[i].value) 			{ 				nd=nodes[i]; 			} 		} 	} 	printf("value=%d,相同个数为%d\n",nd.value,nd.count); }

user: user-6
content: Do not let me think! #include <stdio.h> #define SIZE 6 int main () {     int number[SIZE],i,last,j,t,k;     int times[SIZE],n[SIZE];      for (i=0;i<SIZE;i++) {         n[i]=i;         scanf("%d", &number[i]);         if (i==0) {             last=number[i];             times[i]=1;             k=0;         } else {             if (last==number[i]) {                 t=times[i-1];                 for (j=i;j>=k;j--) times[j]=t+1;             } else {                 last=number[i];                 times[i]=1;                 k=i;             }         }     }      for (i=0;i<SIZE-1;i++) {         for (j=i+1;j<SIZE;j++) {             if (times[i]<times[j]) {                 t=times[i];times[i]=times[j];times[j]=t;                 t=n[i];n[i]=n[j];n[j]=t;             }         }     }      if (times[0]>times[1]) {         printf("value=%d, 相同个数为%d\n",number[n[0]],times[0]);     } else {         t=times[0];         for (i=1;i<SIZE;i++) {             if (t!=times[i]) break;         }         t=number[n[0]];         k=0;         for (j=0;j<i;j++) {             if (number[n[j]]>t) {                 t=number[n[j]];                 k=j;             }         }         printf("value=%d, 相同个数为%d\n",t,times[n[k]]);     }      return 0; }
user-0 提问: 关于白盒加密源代码，吐血求一个

回复:
user: user-1
content: 请问下你找到了白盒加密的实现了吗？ 如果有的话，麻烦发我一下，万分感谢。freeitdog@163.com

user: user-2
content: 啥叫“白盒加密”？ 公开算法的RSA加密是不是“白盒加密”？ 参考OpenSSL源代码。

user: user-3
content: 这些源码一堆，就看怎么使用api了~

user: user-4
content: 但是OpenSSL的环境，最新API获取更新之类的东西就比较麻烦了。

user: user-4
content: OpenSSL。玩过它的API接口，感觉加解密的接口蛮容易上手的。

user: user-5
content: I don't know~

user: user-0
content: 大神在哪里呀
user-0 提问: 一个简单的问题，新手问的。

回复:
user: user-0
content: 引用 11 楼 super_miker 的回复:因为j在第一次循环之后就变成了0，所以之后的循环一开始就不会进去。 如果你要让每次都循环5次，那么每次j初始值都要设为5。 是的，非常对，前面的回答都太高大上了，我听不不懂，但是你的答案我最明白

user: user-1
content: 因为j在第一次循环之后就变成了0，所以之后的循环一开始就不会进去。 如果你要让每次都循环5次，那么每次j初始值都要设为5。

user: user-0
content: 不知道大家有没有去尝试，我把我的图帖出来，希望大家看看，为什么a的值是5

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }   这个等价描述很形象

user: user-3
content: 是否为局部变量取决于是否定义在函数（包括主函数）内部，如果在定义在函数内部则为局部变量，反之为全局变量。按照楼主的写法，for循环可以访问之前定义的三个变量。顺便说声楼主的 a++' 多了一个单引号。

user: user-4
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-5
content: 引用 1 楼 jiht594 的回复:变量的作用域是 大括号{} 这么说太对,  你这里2个for里面都可以访问ija

user: user-5
content: 变量的作用域是 大括号{}

user: user-6
content: 你在循环外定义的，作用域是函数内而不是循环内

user: user-7
content: 没看懂你问的什么

user: user-7
content: 没看懂你问的什么

user: user-8
content: 最后a++运行了5*5=25次。
user-0 提问: 栈的输入问题

回复:
user: user-1
content: 简单的示例  #include <stdio.h> #include <stdlib.h> #define MAX 256 static int stack[MAX] = {0}; int top = -1;  void push(int val) {     if(++top >= MAX)         return;     stack[top] = val; }  int pop(void) {     if(top == -1)         return -1;     return stack[top --]; }  int main() {     int val = 0;     while(1) {         scanf("%d", &val);             push(val);          if(getchar() == '\n')             break;     }      while(top != -1)         printf("%d ", (val = pop()) == -1 ? ' ' : val );      exit(0); }   也可以考虑使用链式栈存储

user: user-2
content: 顺序栈： http://blog.csdn.net/zhangxiangdavaid/article/details/26819603

user: user-3
content: 用顺序栈就可以了，类似于数组
user-0 提问: 快速傅里叶变换算法求解！急急急

回复:
user: user-1
content: http://www.baigoogledu.com/s.php?hl=zh-CN&q=fast+FFT+%D4%B4%B4%FA%C2%EB

user: user-2
content: 这个问题在信号与系统里面解决过，算法没有研究过。

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:http://www.baigoogledu.com/s.php?hl=zh-CN&q=fast+FFT+%D4%B4%B4%FA%C2%EB    好厉害的搜索~

user: user-0
content: 首先谢谢你的回答。可是我的算法要求和其他的不一样。首先我用的是c99中的complex.h，直接使用复数。另外我的计算变换的函数参量有6个，每个功能不一样。我在上面有说明。我觉得问题是出现在递归调用的格式上面。关键是那个*w怎么用。。
user-0 提问: 关于字符输出的问题。

回复:
user: user-1
content: 没有现成的C函数库，用VC的话，可以直接显示。  “字符 是以两个字节存储的” ，存储的是 字符编码。很久没有touch FAT32了，不确定是不是用GBK。  显示字符 就是 转换 字符编码为显示点阵，这个网上找的到。  患有，字符编码转换为显示点阵，是与系统语言（简体中文 or 繁体中文 or 日文 or ...）相关的， 对应于不同的编码转换算法。

user: user-2
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 提问: tcp通信中投和尾的字符是确定的，中间消息没有跟他们重复的字符，这种消息怎么接收？、

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

user: user-2
content: 每次尽可能多地接收完，接收到的数据缓存起来，缓存的数据解析出完整的一个消息（有头有尾）交给上层处理，每次接收到的数据与上次解析后剩余的数据拼接后解析。 解析的方法：缓冲区消息头出现之前的数据丢弃，找到消息头后找消息尾，找到消息尾即为一个完整消息，找不到消息尾即为剩余数据，保留在缓存

user: user-3
content: 转base64 再转回来 不过数据长度会变长,

user: user-4
content: 用一个足够长的字符数组接收啊，使用的时候去掉前后的字符就可以了。 还有一种比较简单的：如果你是发送固定长度的结构体，那么直接就用结构体接收
user-0 提问: 基于51单片机的波形发生器

回复:
user: user-1
content: 输入越界了

user: user-2
content: 假设某次输入时flag 为0 num为255 再经过一轮，flag 为0 num在++后变为0(溢出)，再if后又变成了255.  就是说输入时为255，输出时仍为255没变。
user-0 提问: 11）二叉排序树的实现（二叉链表）,用c语言实现

回复:
user: user-0
content: 谢谢

user: user-1
content: typedef struct ADT { 	struct ADT *left; 	struct ADT *right; 	int Height; 	int elements; }TREE_ADT;  TREE_ADT *Delete_Root(TREE_ADT *p,int n) { 	TREE_ADT *Findtheleftmax(TREE_ADT *); 	TREE_ADT *Findtherightmax(TREE_ADT *);  	TREE_ADT *proot = p, *ptmp = NULL, *ptmpn = NULL;  	 ptmp = Findtheleftmax(p->left); 		 if (p->left->right == NULL)//特殊情况，p->left就是最大 		 { 			 ptmp->right = proot->right; free(proot); 			 proot = ptmp; proot->Height = 0; n++;//重新定义proot,让n+1 		 } 		 else 		 { 			 ptmpn = ptmp->right; 			 ptmp->right = ptmp->right->left;//这里把目标节点的上一个节点连接目标节点的左节点 			 ptmpn->left = proot->left; ptmpn->right = proot->right; free(proot); 			 proot = ptmpn; proot->Height = 0; n++;//重新定义proot,让n+1 		 } 		 return proot;//返回新的头 }  TREE_ADT *Findtheleftmax(TREE_ADT *p) { 	TREE_ADT *ptmp = NULL; 	if (p->right != NULL) 	{ 		ptmp = Findtheleftmax(p->right); 		if (p->right->right == NULL) ptmp = p;//这里把前一个节点返回了 	} 	else 	{ 		for (ptmp = p->left; ptmp != NULL; ptmp->Height--, ptmp = ptmp->left); 		return p; 	} 	return ptmp; }  TREE_ADT *Findtherightmax(TREE_ADT *p) { 	TREE_ADT *ptmp = NULL; 	if (p->left != NULL) 	{ 		ptmp = Findtherightmax(p->left); 		if (p->left->left == NULL) ptmp = p;//这里把前一个节点返回了 	} 	else 	{ 		for (ptmp = p->right; ptmp != NULL; ptmp->Height--, ptmp = ptmp->right); 		return p; 	} 	return ptmp; }    这是删除的，以前写的东西，仅供参考。。。。  你应该自己写一遍然后自己调试一次，这样你才会真正知道怎么写

user: user-0
content: 可是菜鸟不会写代码啊，大神写一个让我看看

user: user-1
content: num没有初始化。。。而且就算你想用回车判断，也不是这么写吧。。你可以用链表的形式去挨个输入，用字符的形式，然后强制转换就好了，T也没返回分配好的指针，一直都是NULL，至少也要分个树根进去吧。。。  *T=NULL，赋值了，不是判断。。。。  删除的那里。。。直接把p的左右链链接到f上面。。。。如果f本身就存在左右链呢？那不就破坏二叉树了？正确的做法应该是递归到左树的最大节点或者右树的最小节点，然后数据交换，再链接。。  至于那个函数的问题，你可以在main里面定义个数组，你每查找一次就录入一次查找次数（查找次数可以传递一个指针给递归数组，每传递一次就+1直到找到为止），然后最后算平均值就好了
user-0 提问: 从confstr()中获取的系统PATH信息不全..

回复:
user: user-1
content: 为什么不 system("echo %path%>path.txt"); //然后读文件path.txt的内容 呢？

user: user-2
content: $ getconf -a | grep CS_PATH CS_PATH                            /bin:/usr/bin

user: user-0
content: 引用 1 楼 user-2 的回复:$ man confstr ......        _CS_PATH               A value for the PATH variable which indicates where all the POSIX.2 standard utilities  can               be found. 这个说的是“all the POSIX.2 standard utilities”，和命令行里面输出的$PATH不一样吧？   噢...明白了,,感谢!!

user: user-2
content: $ man confstr ......        _CS_PATH               A value for the PATH variable which indicates where all the POSIX.2 standard utilities  can               be found. 这个说的是“all the POSIX.2 standard utilities”，和命令行里面输出的$PATH不一样吧？
user-0 提问: 关于指针 数组

回复:
user: user-1
content: 运行：

user: user-1
content: 修改如下：  #include <stdio.h> #include <stdlib.h> #include <string.h> //如果q改为数组，此处：q[j] = p[i];提示错误 //如果q不用malloc分配空间，同样提示错误 //用malloc分配空间时，在哪个位置释放free //如下程序在输出结果时，会在q末尾输出“？”怎么回事 char *fun(char *p, char *q) { 	int length = 0; 	int i = 0, j = 0; 	length = strlen(p); 	for (; i < length; i++) 	{ 		if (p[i] % 2 == 0) 		{ 			q[j] = p[i]; 			j++; 		} 		else 		{ 			printf("-%c-%d-\n", p[i], p[i]); 		} 	} 	return q; } void main() { 	char p[100] = { '0' }; 	//char *q = NULL; 	char q[100] = { 0 }; 	printf("\n请输入字符串:\n"); 	scanf("%s", p); 	fun(p, q); 	printf("%s\n", q); 	system("pause"); }
user-0 提问: 自己写的一个字谜游戏，感觉还是效率低，求最佳优化方法

回复:
user: user-0
content: 额。。。我还没学到图论，我先看一下  可是这样的话，这样的散列函数。。好像不能解决单词的顺序问题？比如如果是that,变成了taht

user: user-1
content: 知道图中任一点到其余各点的最短距离算法不？做一些修改，借用一下！ 定义：D^n  =   D^n-1   .   D 其中n和n-1都是幂次，D是初始矩阵。 其中的点运算类似矩阵乘法，但不是矩阵乘法，要借用矩阵乘法的进行方式，矩阵乘法是对应元素相乘再求和，这里改为：对应元素拼接，求其散列值。因此你要一个很好的散列函数——能够在旧散列值基础上推演出新值。其实2^n，n取0-31，做基就不错。 d^n(i,j)表示，矩阵进行了n次点运算第i行第j列上单词，长度为n 不过是O(N^3)复杂度 这个借用或许有优化的方式，交给你了LZ
user-0 提问: 如何访问DLL中的全局变量

回复:
user: user-1
content: 不是一个人的帖子；(,全局数组调用问题

user: user-2
content: 貌似主程序里#include"dll_ex.h"不对，一下子export，一下子import，乱！

user: user-1
content: 谢谢，你的回复。准备抽些时间研读一下  大致写了一段代码，编译能通过，但是好像赋不了值，代码如下： 在 globalarray.h文件中声明全局数组：  extern double randomarray[];  在dll .cpp中定义及初始化全局数组，及定义两个函数。 #include "globalarray.h" extern "C" { 	double randomarray[100] = {0.0}； 	void get_rand(); 	int __declspec(dllexport) APIENTRY AnotherFunction(v1,v2); } // get_rand()用于生成一组数字然后存放于全局数组中,然后在另外一个函数AnotherFunction中调用这个全局数组中的值，一直不成功，返回都是0.好像get_rand 函数没有运行赋值给全局数组。 void get_rand() { 	int i; 	srand(0); //设置随机数种子 	for (i = 0; i <= 99; i++) 	{ 		randomarray[i] = rand()%1000/1001.0; 	}  }  int __declspec(dllexport) APIENTRY AnotherFunction(v1,v2);  {   double t; t=randomarray[1]; }

user: user-3
content: 建议楼主通读MSDN中有关DLL开发和调试相关章节。

user: user-1
content: 接着问一下： 本人C++刚入门，对于 DLL，我要用全局变量（数组好，还是指针好？还是其它方式更好），在DLL中用一个函数生成3组随机数，这3组随机数可以被多个线程及进程调用，有好的方法吗？  这个生成函数也要写成全局的吗？生成函数如下,数组p[]用于保存生成的随机数。大神们能给个示例吗，谢谢  void get_rand(double p[],int n,int seed) { 	int i; 	srand(seed); //设置随机数种子 	for (i = 0; i <= n; i++) 	{ 		p[i] = rand(); 	} }

user: user-4
content: 对于，加载又卸载了的dll 其中的全局变量，具有不确定的特性 DLL卸载以后，全局变量就不存在了 再次加载未必是同一个全局变量，至少上次改变的值，这次未必能用

user: user-4
content: DLL导出全局变量 有个问题 什么样的全局变量（进程内的，还是多个进程都可以访问的共享变量）？

user: user-5
content: 用del文件不能成功导出吗？

user: user-0
content: 引用 1 楼 user-6 的回复:http://bbs.csdn.net/topics/391013001  我刚好昨天问过这个问题  总算搞定了，多谢了。 顺便总结一下： 从dll导出全局变量不好，对于希望从DLL获取资源以实现资源共享的情景，最好是导出Get函数获得，这样操作起来更方便而且更安全。 对于必须使用Dll导出全局变量的情况，需要注意一下几点： 1，在Dll源文件定义全局变量，前面的修饰符跟函数一样，一般采用宏的方法。写出来一般是DLL_EX_API g_iTest =0的形式，切记要初始化一下，不然会报错！！！ 2，在Dll头文件里还要再写一次，修饰方法同上，不需要初始化。 3，在主函数调用的时候只要include了响应头文件即可。  Dll学习到此已到一段落，基本的知识已经掌握了~~~~

user: user-6
content: http://bbs.csdn.net/topics/391013001  我刚好昨天问过这个问题
user-0 提问: C语言 不使用sizeof()怎样计算整型数据大小

回复:
user: user-0
content: 引用 5 楼 jiht594 的回复:[quote=引用 4 楼 u013390088 的回复:] [quote=引用 2 楼 jiht594 的回复:] int a[2]; 		int x = (int)&a[1]; 		int y = (int)&a[0]; 		cout << x - y << endl;  cout << x - y << endl;是什么意思呢？我不会C++[/quote] printf("%d", x - y);也行 就是a[0]和a[1]地址相减[/quote]  我当时看到这个题就懵了呀~~~

user: user-0
content: 引用 3 楼 ren0065 的回复:unsigned int n = (unsigned int)-1; int i=0; while(n) {     n = n >> 1;     i++; } printf("%d\n", i/8); 用按位右移的方法？！  受小弟一拜~

user: user-1
content: 引用 4 楼 u013390088 的回复:[quote=引用 2 楼 jiht594 的回复:] int a[2]; 		int x = (int)&a[1]; 		int y = (int)&a[0]; 		cout << x - y << endl;  cout << x - y << endl;是什么意思呢？我不会C++[/quote] printf("%d", x - y);也行 就是a[0]和a[1]地址相减

user: user-0
content: 引用 2 楼 jiht594 的回复:int a[2]; 		int x = (int)&a[1]; 		int y = (int)&a[0]; 		cout << x - y << endl;  cout << x - y << endl;是什么意思呢？我不会C++

user: user-2
content: unsigned int n = (unsigned int)-1; int i=0; while(n) {     n = n >> 1;     i++; } printf("%d\n", i/8);

user: user-1
content: int a[2]; 		int x = (int)&a[1]; 		int y = (int)&a[0]; 		cout << x - y << endl;

user: user-0
content: 其实这是一道笔试题。。。。没想出来
user-0 提问: 关于Qt

回复:
user: user-0
content: 已经找到了，canvas是Qt3的 在Qt4里面，canvas被Qgrahicsview替代了。

user: user-1
content: QtQuick 慢，那就用 QtWidgets

user: user-2
content: http://www.baigoogledu.com/s.php?hl=zh-CN&q=Qt+CPP+canvas

user: user-0
content: help me!

user: user-0
content: please help!
user-0 提问: char不是有1字节长度么，为什么我的能装这么长

回复:
user: user-0
content: 引用 3 楼 lin5161678 的回复:unsigned char  就不会这样了十分感谢，帮了大忙了！！

user: user-0
content: 十分感谢！！！帮了大忙了

user: user-1
content: unsigned char  就不会这样了

user: user-2
content: 引用 1 楼 zyw067 的回复:截图的结果是没填格式输出“%02x”的，格式输出后第0位和第9位仍然如图，费解 你是想问 mesg[0]==0xffffffef 我们相等吗? 还是这里printf("第%d位为%02x\n",i,mesg[i]);?? http://bbs.chinaunix.net/thread-1070673-1-1.html

user: user-0
content: 截图的结果是没填格式输出“%02x”的，格式输出后第0位和第9位仍然如图，费解
user-0 提问: 关于结构体和指针的故事

回复:
user: user-1
content: st定义在栈上，定义之后系统会自动为你开辟一个264字节的空间，假如你定义了一些函数，其中有该struct类型的参数，假如你传递它的对象，那么一次函数调用的栈空间使用是非常大的，所以这时候你定义了一个该struct类型的指针，正如你所说，指针只占用4个字节，那么函数调用所消耗的空间就很少的。

user: user-2
content: 可能这个code的指针的定义，更多是由于程序员的习惯。  有人喜欢用指针，所以多定义一个指向这个局部变量的指针，以后的引用都是用指针。  有人喜欢用结构体，就不用定义指向这个局部变量的指针。

user: user-3
content: 有一个学生  第一天学了一个 '一' 字 就是画一横 第二天学了一个 '二' 字 就是画两横 第三天学了一个 '三' 字 就是画三横 他就认为他已经懂怎么写字了 知道有一天 他写了一个 '万' 字  楼主 你就是这个学三天的学生

user: user-4
content: 1 这个st是局部变量，仅存在于main中，跟os没有关系 2 在这个程序中确实没看出指针有什么用

user: user-5
content: （1）请问到底操作系统定义了st这个变量了么？  应该是你的程序为st分配空间，并初始化为 {123, "Lucy",10}//struct Student st = {123, "Lucy",10};  （2）我们知道pst变量占用4个字节，为什么要用指针? 定义了结构体？ 还要指针？是不是多此一举啊！  pst是指针类型，在32机上占4个字节~ 定义了结构体，再定义指针是为了访问方便，比如函数之间传值，要把结构体变量st数据全部传递过去要用内存12个字节，把指针或这说把结构体变量st的地址传递过去只占4字节，用地址（指针）操作数据更灵活~

user: user-6
content: 用指针操作内容和用变量操作都是应该掌握的

user: user-7
content: 都可以吧，你习惯用哪个就用。貌似用指针的多一点

user: user-8
content: 小弟你很有才，问的很好 1.栈中定义了此变量 2.有比没有好（C语言），“没有”也比有好（JAVA），是不是有点绕其实就是有谁来做的问题，C中由用户负责，java语言中没有指针，但是由编译器负责底层指针的处理，使得用户和指针画了杠！ 3.不是多此一举，你需要懂得什么是指针，什么是地址，以及二者的关系！

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

user: user-10
content: st这个变量了么？  是的 我们知道pst变量占用4个字节 指针变量属于LONG类型占4个字节  为什么要用指针?   指正是变化的，指向某个内存地址 定义了结构体？ 还要指针？是不是多此一举啊！ 怎么说呢打个比方： 结构体指针就是针对结构体类型房间的万能钥匙 结构体变量就是结构体类型的房间对象 一旦产生房间的对象，房间的位置就是固定的， 然而指针想开哪个房间就开哪个房间，只要是同类型的就可以  换句话说，指针是虚的，变量是实的  如有不对，望广大朋友指正！
user-0 提问: 求助！！！！ 关于linux Ecplise 运行C程序的问题！

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

回复:
user: user-1
content: 每一个连接进入时，如果server允许建立并连接后，记录client的地址。  然后对client进行比对判断，是否是以前已经连接过的。  而5楼的code中，connected对所有的client，不区分不同的client。

user: user-0
content: 下面是服务器接受函数的一段代码  如果是某个客户端第一次连接服务器，则建立握手先，以后，该连接除非重新连接服务器再，则不需要握手动作，做普通SOCKET通信   但是，下面代码作判断时，服务器只能与一个客户端建立连接，其他客户端就不能再连接上了，服务建立握手...   当多个客户端存在时，如何判断每一个客户端是否是第一次与服务器连接，以便建立握手？  len = recv(fd, ev->buff, sizeof(ev->buff), 0);      printf("---------------------\n");     printf("recv data len: %d\n",len);     printf("---------------------\n");     printf("recv data content: %s\n",ev->buff);     printf("\n");     if(len<480){     	printf("recv data content:\n");     	for(i=0;i<len;i++)     		printf("%02x ",ev->buff[i]);     	}              if(0==connected)// 第一次连接 		  { 		    printf("read:%d\n%s\n",len,ev->buff); 		    secWebSocketKey=computeAcceptKey(ev->buff);	 		    shakeHand(fd,secWebSocketKey); 		    connected=1; 		    printf("22222    connected is :%d \n",connected); 		    }     dosomething(); }

user: user-0
content: NONO ， 可能是我描述不清楚  HTML5服务器，，第一次客户端连接时，需要一次握手协议，，当该客户端再发数据来时，与服务器不用再握手 当作普通SOCKET处理

user: user-2
content: 发送心跳包就可以吧

user: user-3
content: 心跳监控连接状态, 即可,

user: user-4
content: 握手动作又不让你去做，tcp底层自己做了
user-0 提问: LCS 递归求最长公共子序列

回复:
user: user-1
content: http://blog.csdn.net/cwcmcw/article/details/44280081

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

回复:
user: user-1
content: 为什么不动态创建链表

user: user-2
content: 运行：

user: user-2
content: 修改如下：  #include<stdio.h> #include<stdlib.h> struct node { 	//char ch[1]; 	char ch; 	struct node *next; }; struct node a, b, c, d, e, f, j, h, i, g, k, l, m, n, *next, *p, *head; void print_node(); void main() { 	a.ch = 's';	b.ch = 'p'; 	c.ch = 'r';	d.ch = 'i'; 	e.ch = 'n';	f.ch = 'g'; 	j.ch = ' ';	h.ch = 'c'; 	i.ch = 'o';	g.ch = 'm'; 	k.ch = 'i'; l.ch = 'n'; 	m.ch = 'g';	n.ch = 'x'; 	head = &a; 	a.next = &b;	b.next = &c; 	c.next = &d;	d.next = &e; 	e.next = &f;	f.next = &j; 	j.next = &h;	h.next = &i; 	i.next = &g;	g.next = &k; 	k.next = &l;	l.next = &m; 	m.next = NULL; 	p = head;  	do 	{ 		print_node(); 	} while (p != NULL);  	printf("删除第四个元素\n"); 	c.next = &e; 	d.next = NULL; 	p = head; 	do 	{ 		print_node(); 	} while (p != NULL);  	printf("在第二个元素前插入'x'\n"); 	a.next = &n; 	n.next = &b; 	c.next = &d; 	d.next = &e; 	p = head; 	do 	{ 		print_node(); 	} while (p != NULL);  } void print_node() { 	printf("%c ", p->ch); 	p = p->next; }

user: user-3
content: 将所有的ch="x'替换为ch='x'

user: user-4
content: 给char[]直接赋值有问题

user: user-5
content: 在此代码段里找链表的增删改操作 https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c

user: user-6
content: 先编译下，看看哪些是明显的错误（编译反馈信息），一般都会提示你第几行第几个字有错误，把这些排除了，还有错误，那就是逻辑错误，使用最简单的printf随时打印自己觉得有问题的变量，随时跟踪，或者用/*……*/把一些代码注释掉，来确定出问题的地方。
user-0 提问: 求助，链接出错麻烦帮帮忙看看怎么回事

回复:
user: user-1
content: 确认将所有.cpp文件添加到项目、源代码中，重建所有。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项 感谢赵老师，附加库内容如下，链接无法通过，还是1楼的错误提示，是不是缺哪个库呢？ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

user: user-1
content: 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项
user-0 提问: 老说我访问了一块不存在的内存。。。。。。还是文件关闭的问题

回复:
user: user-0
content: 能不能把代码嵌在code c/c++中   这确实不会

user: user-0
content: 还是不行啊，fread函数好像有点问题

user: user-0
content: #include<stdio.h> #include<string.h> #include<stdlib.h> struct person { 	char name[20]; 	char department[20]; 	long base_pay; 	long allowance; 	long total; }; void initial(struct person *per); void set(struct person *per); void file_write(struct person*per,FILE *fp); void file_print(FILE *fp);  void main() { 	FILE *fp; 	if((fp=fopen("paydata.txt","ab+"))==NULL) 	{ 		printf("打开文件失败\n"); 		return ; 	} 	struct person *per; 	per=(struct person *)malloc(sizeof(struct person)); 	initial(per); 	set(per); 	file_write(per,fp); 	file_print(fp); 	fclose(fp);  }    void initial(struct person *per) { 	strcpy(per->name,"0"); 	strcpy(per->department,"0"); 	per->base_pay=0; 	per->allowance=0; 	per->total=0; } void set(struct person *per) { 	printf("请输入人员姓名:\n"); 	scanf("%s",per->name); 	printf("请输入人员单位：\n"); 	scanf("%s",per->department); 	printf("请输入人员基本工资：\n"); 	scanf("%ld",&per->base_pay); 	printf("请输入人员奖金：\n"); 	scanf("%ld",&per->allowance); 	per->total=per->base_pay+per->allowance;//总工资计算 } void file_write(struct person*per,FILE *fp) { 	fwrite(&per,sizeof(struct person),1,fp); }  //print void file_print(FILE *fp) { 	struct person *per; 	per=(struct person *)malloc(sizeof(struct person)); 	printf("name\tdepartment\tbase_pay\tallowance\ttotal\n"); 	while(1) 	{ 		if(feof(fp)) 			break;         fread(&per,sizeof(struct person),1,fp); 		printf("%s\t%s\t%ld\t%ld\t%ld\n",per->name,per->department,per->base_pay,per->allowance,per->total); 	}  }这是改后的  如果把‘&’符号去掉

user: user-1
content: 你在main函数之中已经将文件打开了一次，而且没有关闭，就在file_write里面再次打开文件。 而且你在打开文件失败之后，不立即退出，继续执行后面的命令，将内容写入一个并没有正确打开的文件中。 这就造成了错误。

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

user: user-3
content: 能不能把代码嵌在code c/c++中

user: user-4
content: 快捷贴！我还有问题要问！目前没有分！无法提问。

user: user-4
content: void file_write(struct person*per) { FILE *fp; if((fp=fopen("paydata.txt","w"))==NULL) printf("打开文件失败\n"); fwrite(/*&*/per,sizeof(struct person),1,fp); fclose(fp); } 请看被我注释掉的部分！

user: user-0
content: 我们老师说，是文件打开关闭打开关闭次数太多，出了问题。。。。。。。。折磨我快两周了
user-0 提问: 看下这段代码有什么问题

回复:
user: user-1
content: 你的函数需求的是一个数组的数组，但是你传入的是一个二维数组。 数组的数组的本质是在一个一维一数组中储存每一列的指针，但是一个二维数组本质是一个一维数组，只不过编译器记住了它的每一列的长度。

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

user: user-3
content: 这格式都不爱看吧……

user: user-4
content: 楼上的解答正确！！！楼主的程序调用参数不匹配，我在vs2010上试的：  编译的错误好多，都是关于函数调用参数不匹配或者=两边类型不一致……
user-0 提问: 关于TLS的一点问题。

回复:
user: user-0
content: 恩恩，结贴了，多谢各位~~~

user: user-1
content: 这是一个先有鸡还是先有蛋的问题。

user: user-2
content: TLS用得不多，因为它不是解决多线程问题的核心部分，它只是必须部分，而大部分还对用户不可见。 等你以后学做库了，就知道它的重要了

user: user-3
content: 要是每次调用函数都加一个参数，还是太麻烦，特别是要是想添加某个变量的时候，需要改一大堆代码，不可能的。 要只是自己写的一个小程序也就算了，多个模块协作的程序呢？不可能要求别人修改函数参数的
user-0 提问: linux下关闭文件操作的疑问

回复:
user: user-1
content: 4楼验证的合理

user: user-2
content: int fd = open("somefile", mode); FILE* fp = fdopen(fd, "r"); // 文件操作....  // close(fd); fdopen之后，不要close(fd); 应该用fclose(fp); 因为fclose会关闭fd的。 fclose(fp); // 是否有必要, 运行返回值为0,没有错

user: user-3
content: 这种情况应该只需要关FILE吧。。  有几点： 1、用fdopen打开的FILE会使用指定的file descriptor 2、fclose会关闭底层的file descriptor 3、关掉file descriptor是为了释放OS资源，关FILE不光是释放file descriptor，还顺带释放FILE本身，其实都不关程序退出之后现代OS也是会给你关掉/释放掉的，但是作为常驻程序的话有可能造成内存/资源泄露  看这个示例说明fclose会关闭fd 文件"file"的内容 something here  #include <stdio.h> #include <fcntl.h> #include <unistd.h>  int main( void ) { 	int fd; 	FILE *fp; 	char buf[16] = {0};  	fd = open( "file", O_RDONLY ); 	fp = fdopen( fd, "r" );  	printf( "fd=%d\n", fd ); 	printf( "fileno=%d\n", fileno( fp ) );  	printf( "read=%ld, --%s--\n", read( fd, buf, 10 ), buf );  	fclose( fp ); 	return 0; }  这样没问题，输出：(注意fileno和fd是一样的) fd=3 fileno=3 read=10, --something --   #include <stdio.h> #include <fcntl.h> #include <unistd.h>  int main( void ) { 	int fd; 	FILE *fp; 	char buf[16] = {0};  	fd = open( "file", O_RDONLY ); 	fp = fdopen( fd, "r" );  	printf( "fd=%d\n", fd ); 	printf( "fileno=%d\n", fileno( fp ) );  	fclose( fp ); 	printf( "read=%ld, --%s--\n", read( fd, buf, 10 ), buf );  	return 0; }  这样read出错 fd=3 fileno=3 read=-1, ----

user: user-4
content: 感觉操作一个文件时，不应该使用两类I/O函数。

user: user-5
content: 都关好，虽然不知道为什么

user: user-6
content: 1.如果以用户自己负责的说：都需要关闭 2.如果用户不吊的说，都可以不关，而交给OS处理——进程结束时，所有打开的文件描述都会被关闭！
user-0 提问: 结构体数组通过fwrite写入文件，但总是读不出来。

回复:
user: user-0
content: 引用 3 楼 olazuwon 的回复:[quote=引用 2 楼 olazuwon 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] 你是如何打开文件的呢？  fp=fopen();  写入的时候： fp = fopen(path,"w")) 读取的时候：fp = fopen(path,"r")) [/quote] 我发现问题了，读二进制文件必须用fp = fopen(path,"rb")) 不过奇怪了，为什么写入的时候不用"wb“呢？[/quote]  不对， 写入的时候也必须用"wb"，否则读取的时候读了几个以后就错了。

user: user-0
content: 引用 2 楼 olazuwon 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 你是如何打开文件的呢？  fp=fopen();  写入的时候： fp = fopen(path,"w")) 读取的时候：fp = fopen(path,"r")) [/quote] 我发现问题了，读二进制文件必须用fp = fopen(path,"rb")) 不过奇怪了，为什么写入的时候不用"wb“呢？

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:你是如何打开文件的呢？  fp=fopen();  写入的时候： fp = fopen(path,"w")) 读取的时候：fp = fopen(path,"r"))

user: user-1
content: 你是如何打开文件的呢？  fp=fopen();
user-0 提问: 请教各位前辈，c语言基础入门后怎么更好的提升自己水平。

回复:
user: user-0
content: 非常谢谢大家！

user: user-1
content: 需求决定一切

user: user-2
content: 1.多看两遍<k&R>必要时参考C99，这是基础！C专家，C指针，C陷阱与缺陷都可以博览 2.代码风格参考CodingStyle 一般二元运算符前后加空格，一元运算符前后不加空格。一行代码做一件事，注意缩进和ID命名遵循一种，基本上就可以了！ 3.小问题找百度，核心问题找google！google被墙了，谷粉用着还不错！ 第一步，搜索已有的解答，未搞定 第二步，搜索对应的英文解答，还未搞定 第三步，查阅手册或标准，还是搞不定 第四步，整理好自己的问题，找大神求助！

user: user-3
content: 多练习，经验和提高都从代码中来，理论加实践才是提高的最好方式

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

user: user-5
content: 《编程规范》 《c++primer》     写个五子棋，贪吃蛇之类的小游戏， 学生管理系统等。
user-0 提问: 麻烦帮忙看下哪里错了

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

user: user-2
content: 第6行printf的最后是一个全角分号

user: user-3
content: 引用 5 楼 anshiny 的回复:int main() {     double tax, money;     printf("请输入工资（5000至8000元)\n");     scanf("%lf", &money);     tax = (money - 3500) * 0.1 - 105;     money -= tax;     printf("%.2lf\n", money);     return 0; } 五楼正解

user: user-4
content: 类型问题，楼上已给出答案，我顺便漏个脸接接分。。。。

user: user-5
content: int main() {     double tax, money;     printf("请输入工资（5000至8000元)\n");     scanf("%lf", &money);     tax = (money - 3500) * 0.1 - 105;     money -= tax;     printf("%.2lf\n", money);     return 0; }

user: user-0
content: 真诚的感谢您的解答，不过这个应该不是问题。

user: user-6
content: tax=(money-3500)*0.1-105;  中等号右边是double类型  所以tax应该定义为double

user: user-0
content: 谢谢回复，不过不知什么地方还是有错
user-0 提问: matlab代码，但不知道怎么编写函数把它转换为C语言，求大神指导。

回复:
user: user-1
content: 可以读懂matlab程序后，再用c语言实现。 直接转的工具，效果应该都不好。不过matlab程序好像可以编译为动态库，用c语言调用。

user: user-2
content: lz你用c实现c++的类试试？

user: user-3
content: 涉及到矩阵操作，不好转换！如果再涉及到matlab内嵌函数功能，你还要把此功能用C方式实现！不知道matlab有没有库让C调用，自己查查

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

回复:
user: user-0
content: 谢谢回答。我解决问题了   pcap_send_queue *p_sendqueue;

user: user-1
content: //类型不匹配，可以强制转换指针 p_sendqueue=(pcap_sendqueue_queue *)&sendqueue;

user: user-2
content: 不用加 struct 前缀
user-0 提问: 往下看

回复:
user: user-1
content: #include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>10) {             printf("Input too long(>9)!\n");             continue;         }         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }

user: user-2
content: 恢复已经损坏的输入流

user: user-3
content: #include <stdio.h> using namespace std; int main(void) { loop:     int sum = 0;     printf("输入任意正整数：\n");     if(scanf("%d",&sum) == 0)     {         fflush(stdin);//windows有效         printf("输入有误,重新输入");         goto loop;     }      return 0; } //输入任意正整数： //梵蒂冈 梵蒂冈地方 //输入有误,重新输入输入任意正整数：
user-0 提问: 温湿度检测，为什么显示是0？

回复:
user: user-1
content: 示波器、逻辑分析仪、 调试器

user: user-2
content: 引用 4 楼 my_live_123 的回复:电工知识一点不懂，爱莫能助+1，电路挂了的说

user: user-3
content: 电工知识一点不懂，爱莫能助

user: user-4
content: 不懂，态专业了。

user: user-5
content: 百度找ds18b20的驱动程序和你的对照，  时序你应该搞清楚了， 主要是延时一定要准确， 你先测试一下你的延时程序准不准。
user-0 提问: 帮忙看看这段代码有什么问题

回复:
user: user-1
content: 引用 3 楼 qq_26454465 的回复:之所以有:sz[n-1] = ‘\0’是因为怕szs的字符数超出了n或者等于n，这样就没有空字符了。 看不懂为什么是：sz[n - 1 - 48] = '\0',这个关ASCII什么事呢？ 还有为什么：n是char类型？（刚开始有设置的也是chan类型，后来改成了int类型）  getchar得到的是字符'5', 转成int是53, 你明白了吗?

user: user-0
content: 之所以有:sz[n-1] = ‘\0’是因为怕szs的字符数超出了n或者等于n，这样就没有空字符了。 看不懂为什么是：sz[n - 1 - 48] = '\0',这个关ASCII什么事呢？ 还有为什么：n是char类型？（刚开始有设置的也是chan类型，后来改成了int类型）

user: user-2
content: 只需做出一处修改即可  //n = getchar(); scanf("%d", &n);  原因 5被当做字符读入，'5'=53，故copy的字符个数并不是你想的那样。

user: user-1
content: n是char ascii的0-9 实际对应的是48-57  所以sz[n-1-48] = '\0';  你的例子输出应该是wang, 因为\0算1个长度
user-0 提问: 为什么2到100就可以输出所有的素数，2到32767就只能输出一部分？

回复:
user: user-0
content: 嗯，我试了改成空格就可以啦，谢谢你

user: user-1
content: 引用 10 楼 former1024 的回复:  因为太多了, 开始的一些被顶掉了  你可以把\n换成空格

user: user-0

user: user-0
content: 如果是2到100的之间的素数，会有3，5等这些比较小的数出现的，为什么到32767就不出现了？它们也是素数呀

user: user-1
content: 引用 7 楼 former1024 的回复:可是我的目的是想要店脑输出2到32767所有的素数，它只输了一部分？为什么？ 这就是所有啊 对后一个是32749, 没错啊  哪个没有??

user: user-0
content: 可是我的目的是想要店脑输出2到32767所有的素数，它只输了一部分？为什么？

user: user-1
content: 引用 3 楼 former1024 的回复:后面的没有截图，最后一个数确实是32749  结果是对的  这里是素数表, 你可以看一下 http://baike.baidu.com/link?url=TWmat9_vrdT7DGx0KO3qbqVzGIh9RRKhLBPu69JhjlzpGCOrQJzI93vG32LJTkJRf8DlmehHds16c3OhyiS0vK

user: user-0
content: 例如3，5，7等等

user: user-0
content: 但前面的那些比较小的数为什么不能输出？

user: user-0
content: 后面的没有截图，最后一个数确实是32749

user: user-1
content: 一直到32749

user: user-2
content: 简要看下，判断素数的逻辑，并无大问题，只是效率还可以提升。 只是输出到了30047，这就只能说明，后面的都不是素数。
user-0 提问: leetcode ZigZag convertsion问题  提交代码后回复 runtime error 检查代码许久不知何解

回复:
user: user-1
content: abcdefghijklmnopqrst  abcdefghijklmnopqrst  acegikmoqs bdfhjlnprt  a e i m q bdfhjlnprt c g k o s  a  g  m  s b fh ln rt ce ik oq d  j  p  a   i   q b  hj  pr c g k o s df  ln  t e   m  a    k b   jl   t c  i m  s d h  n r eg   oq f    p  a     m b    ln c   k o d  j  p e i   q fh    rt g     s  a      o b     np c    m q d   l  r e  k   s f j    t gi h  a       q b      pr c     o s d    n  t e   m f  l g k hj i  a        s b       rt c      q d     p e    o f   n g  m h l ik j  a b        t c       s d      r e     q f    p g   o h  n i m jl k  a b c d       t e      s f     r g    q h   p i  o j n km l  a b c d e f      t g     s h    r i   q j  p k o ln m  a b c d e f g h     t i    s j   r k  q l p mo n  a b c d e f g h i j    t k   s l  r m q np o  a b c d e f g h i j k l   t m  s n r oq p  a b c d e f g h i j k l m n  t o s pr q  a b c d e f g h i j k l m n o p t qs r  a b c d e f g h i j k l m n o p q rt s  a b c d e f g h i j k l m n o p q r s t

user: user-1
content: 仅供参考：  #include <stdio.h> #include <stdlib.h> void convert(const char *str, int row) { 	if (row == 1) 	{ 		puts(str); 		return; 	} 	int i, j, len, pos; 	len = strlen(str); 	len++; 	char **show = malloc(sizeof(char*)*row); 	for (i = 0; i < row; i++) 	{ 		show[i] = malloc(sizeof(char)*len); 		memset(show[i], ' ', len); 	} 	//关键代码 	pos = i = j = 0; 	while (1) 	{ 		if (show[i][pos] != ' ') i++; 		for ( ; str[j] && i < row; i++) 		{  			show[i][pos] = str[j++]; 		} 		if (str[j] == '\0') break; 		i -= 2; 		for ( ; str[j] && i >= 0; i--) 		{  			show[i][++pos] = str[j++]; 		} 		i++; 	}  	for (i = 0; i < row; i++) 	{ 		for (j = len - 1; j >= 0; j--) 		if (show[i][j] != ' ') 		{ 			show[i][j + 1] = '\0'; 			break; 		} 	}  	//打印 	for (i = 0; i < row; i++) puts(show[i]); 	//释放内存 	for (i = 0; i < row; i++) free(show[i]); free(show); } int main() { 	char *str = "abcdefghijklmnopqrst"; 	puts(str); 	printf("\n"); 	int row, len = strlen(str); 	for (int row = 1; row <= len; row++) 	{ 		convert(str, row); 		printf("\n"); 	} 	return 0; }

user: user-1
content: row=1，出错
user-0 提问: leetcode zigzag conversion 代码提交后回复 runtime error   检查代码很久了不知何解 求帮忙

回复:
user: user-0
content: 你说的很对 我重新编辑一下问题

user: user-1
content: 简要说下这程序是要干嘛？不会让我自己搜吧
user-0 提问: 腾讯笔试的这道题的输出怎么算的

回复:
user: user-1
content: 程序并不复杂，运行结果很好推断。

user: user-1
content: 代码得适当修改：  int inc(int a) { 	return(++a); } int multi(int*a, int*b, int*c) { 	return(*c = *a**b); } //typedef int(*FUNC1)(int in); typedef int(*FUNC1)(int in); typedef int(FUNC2)(int*, int*, int*);  void show(FUNC2 fun, int arg1, int *arg2) { 	FUNC1 p = &inc; 	int temp = p(arg1); 	fun(&temp, &arg1, arg2); 	printf("%d\n", *arg2); }  int main() { 	int a; 	show(multi, 10, &a);//110 	return 0; }

user: user-2
content: 编译出错. 没有输出
user-0 提问: 请问这种格式怎么输出来

回复:
user: user-0
content: 请大家注意下输出示例是   123  9  5 并不是输入一行后下一行回车输出最大值

user: user-1
content: 引用 7 楼 Bpf345 的回复:请大家注意下输出示例是  123 9 5 并不是输入一行后下一行回车输出最大值 int main() {     int repeat, n, a, max, i, j; 	int result[10] = {0};     scanf("%d", &repeat);     for(j=1; j<=repeat; j++) {         scanf("%d", &n);         scanf("%d", &a);         max = a;         for(i=2; i<=n; i++) {             scanf("%d", &a);             if(max < a)                 max = a;         } 		result[j-1] = max;     } 	for(j=0; j<repeat; j++) {         printf("%d\n", result[j]);     }        return 0; }

user: user-2
content: 4楼正解，2楼有问题

user: user-3
content: 楼上已给出正确答案，漏脸凭运气接分。。。。

user: user-1
content: int main() { 	int repeat, n, a, max, i, j; 	scanf("%d", &repeat); 	for(j=1; j<=repeat; j++) { 		scanf("%d", &n); 		scanf("%d", &a); 		max = a; 		for(i=2; i<=n; i++) { 			scanf("%d", &a); 			if(max < a) 				max = a; 		} 		printf("%d\n", max); 	}	 	return 0; }

user: user-0
content: 输入3 (repeat=3)  4 2 123 -100 0  4 9 1 -1 8  3 1 3 5 输出示例   123  9  5  请问怎样输出这种格式

user: user-4
content: 仅供参考：   #include<stdio.h> int main() { 	int repeat, n, a, max, i, j; 	//scanf("%d(repeat=%d)", &repeat, &repeat); 	scanf("%d", &repeat); 	for (j = 1; j <= repeat; j++) 	{ 		scanf("%d", &n); 		scanf("%d", &max); 		for (i = 1; i < n; i++) 		{ 			if (i == 1) 				scanf("%d", &max); 			else 			{ 				scanf("%d", &a); 				if (a > max) max = a; 			} 		} 		printf("%d\n", max); 	} 	return 0; } //3 //2 1 2 //2 //3 1 2 3 //3 //4 1 2 3 4 //4

user: user-5
content: 先把以前的帖子结了
user-0 提问: 数据结构例题，有些看不懂的地方。。。。

回复:
user: user-1
content: 先理解冒泡排序的思想，代码就很好写出来了

user: user-1
content: 鄙人的文章：冒泡排序，可看下：http://blog.csdn.net/zhangxiangdavaid/article/details/30271613

user: user-2
content: 程序写错了呗，冒泡排序网上课本上都有

user: user-3
content: 自己选5个数,  在纸上写一边for的过程