Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言求助

回复:
user: user-0
content: 另一个问题 #include<stdio.h> char *fun(char *p) { 	int i,j=0; 	char *q=p; 	for(i=0;i<20;i++) 	{ 		if('0'<=q[i]&&q[i]<='9') 			p[j++]=q[i]; 	} 	for(i=0;i<20;i++) 	{ 		if('0'<=q[i]&&q[i]<='9') 			continue; 		else	p[j++]=q[i]; 	} 	 	return(p);//为什么不能返回局部变量q的地址 } /*{ 	char *q=NULL; 	for(i=0;i<20;i++) 	{ 		if('0'<=p[i]&&p[i]<='9') 			q[j++]=p[i]; 	} 	for(i=0;i<20;i++) 	{ 		if('0'<=p[i]&&p[i]<='9') 			continue; 		else	q[j++]=p[i]; 	} 	 	return(q);//为什么不能返回局部变量q的地址,如果在前一句加p=q；返回q也是错误的，为什么？ 	} */ main() { 	 	char s[20]="asd123fgh5##43df";//为什么输出为123543fgh##df 	char *b=NULL; 	b=fun(s);  	printf("%s\n",b); }

user: user-1
content: char *q=p;           // 这样写 for(i=0;i<20;i++) { if('0'<=p[i]&&p[i]<='9') q[j++]=p[i]; } for(i=0;i<20;i++) { if('0'<=p[i]&&p[i]<='9') continue; else q[j++]=p[i]; }  return q;

user: user-2
content: 正确来讲，是第一个出现两次以上的字符

user: user-2
content: 2.这样可好：  int i, pos1, pos2, n; unsigned char bm[32]; int main(void) { 	char *s = "beijing"; 	n = strlen(s); 	memset(bm, 0, 32); 	for (i = 0; i < n; i++) 	{ 		pos1 = s[i] / 8; 		pos2 = s[i] % 8; 		if (0 == (bm[pos1] & (1u << pos2))) 		{ 			bm[pos1] |= 1u << pos2; 		} 		else 		{ 			printf("%c\n", s[i]); 			break; 		} 	} 	if (i == n) printf("non a character occurs twice!\n"); 	return 0; }

user: user-2
content: 1.修改如下：  #include<stdio.h> void fun(char x[5][10], int n) { 	x[n][0] = 0; } int main() { 	char x[5][10] = { "create","modify","sort","skip","delete" }; 	int i; 	printf("the original string:\n"); 	for (i = 0; i<5; i++) 		puts(x[i]); 	printf("\n"); 	printf("the string after delect:\n"); 	fun(x, 4); 	for (i = 0; i<5; i++) 		puts(x[i]); 	printf("\n"); 	return 0; }
user-0 提问: assignment from incompatible pointer type [enabled by default]警告如何排错

回复:
user: user-1
content: 你确定15、16行这样做合适？ 暂且不论常量赋值给非常量，ptr[1...11] 貌似也没用吧。

user: user-0
content: 已找到原因，数组被定义成常量，而指针是非常量，将常量数组赋值于非常量指针，可能会导致利用指针修改常量的值，所以警告。
user-0 提问: 菜鸟求助帖，寻大神解释程序运行的毛病

回复:
user: user-1
content: 还得确保你的输入是合法的

user: user-1
content: 修改如下：  //对一个长度为n的字符串从其第k个字符起，删去m个字符，组成长度为n-m新字符串，并输出处理后的字符串。用自定义函数实现。 #include <stdio.h> #include <stdlib.h> char *fact(int n, int m, int k, char *str1, char *str2); int main() { 	int n, m, k, i; 	char *str1, *str2; 	printf("请输入长度n:\n"); 	scanf("%d", &n); 	str1 = (char*)malloc(n*sizeof(char)); 	printf("请输入删去字符的个数m:\n"); 	scanf("%d", &m); 	str2 = (char*)malloc((n - m)*sizeof(char)); 	printf("请输入开始删除的字符个数:\n"); 	scanf("%d", &k); 	printf("请输入长度为%d的字符串:\n", n); 	getchar();    //读入回车 	for (i = 0; i<n; i++) 	{ 		scanf("%c", str1 + i); 	} 	str1[i] = 0;    //加结束符 	str2 = fact(n, m, k, str1, str2); 	printf("处理后的字符串为:%s\n", str2); 	return 0; } char *fact(int n, int m, int k, char *str1, char *str2) { 	int i; 	for (i = 0; i < k; i++) 	{ 		*(str2 + i) = *(str1 + i); 	} 	for (i = 0; i < n - m; i++)  //n - m 	{ 		*(str2 + k + i) = *(str1 + k + m + i); 	} 	*(str2 + k + i) = '\0'; 	return str2; }

user: user-2
content: /**************************************  *FILE    :D:\c\main.c  *PROJECT :NULL  *AUTHOR  :user-2  *CREATED :2015-5-14 下午 10:18:01  *TEXT    :对一个长度为n的字符串从其第k个字符起，删去m个字符并输出  *EMAIL   :gtsoft_wk@foxmail.com  *CODE    :https://github.com/user-2 ***************************************/  #include <stdio.h>  void strcatstr(char* str1,char *str2) { 	while(*str1)str1++; 	while(*str1++=*str2++); }  int main() { 	int start; 	int end; 	char str[100]; 	printf("请输入字符串:\n"); 	scanf("%s",str);     printf("请输入开始删除的字符位置:");     scanf("%d",&start);     printf("请输入删去字符的个数:");     scanf("%d",&end);          str[start-1]='\0'; 	strcatstr(str,str+start+end-1); 	     printf("处理后的字符串为:%s\n",str);     return 0 ; }
user-0 提问: C++的总结

回复:
user: user-1
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-2
content: 有点长，看了前面，我觉得步长的1，2可以合在一起，指针指向的内容大小就是步长

user: user-3
content: 不错，我支持楼主
user-0 提问: Win32项目listControl控件怎么使用

回复:
user: user-1
content: 楼主我最近也在研究这个问题  我遇到了个更简单的问题  初始化  包含什么静态库 和用什么初始化 想问下你是怎么写的

user: user-2
content: 我是来看vs2012的

user: user-3
content: 参考：http://blog.csdn.net/lovton/article/details/6527208

user: user-4
content: 先定义一个列表控件的变量m_list，然后  DWORD dwStyle = m_list.GetExtendedStyle();  	dwStyle |=LVS_EX_FULLROWSELECT; 	dwStyle |= LVS_EX_GRIDLINES; 	m_list.SetExtendedStyle(dwStyle);

user: user-5
content: 是ListView麽？

user: user-5
content: void InitialListView(HWND hWnd) { 	HWND hListView; 	LVCOLUMN lvc; 	LVITEM lvI; 	LVITEM lvSub; 	WCHAR Num[10]; 	RECT rect; 	int xBorder;  	hListView = GetDlgItem(hWnd, 1001);  	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 	lvc.fmt = LVCFMT_CENTER; 	lvc.cx = 80; 	for (int i = 0; i < 5; i++) 	{ 		wsprintf(Num, L"%d", i); 		lvc.iSubItem = i; 		lvc.pszText = Num;		  		ListView_InsertColumn(hListView, i,&lvc); 	}  	lvI.mask = LVIF_TEXT; 	lvI.iSubItem = 0; 	 	GetClientRect(hListView, &rect); 	xBorder = GetSystemMetrics(SM_CXBORDER); 	MoveWindow(hListView, 0, 0, 404, 150, FALSE); 	GetClientRect(hListView, &rect); 	// Initialize LVITEM members that are different for each item. 	for (int index = 0; index < 3; index++) 	{ 		lvI.iItem = index; 		lvI.iImage = index; 		wsprintf(Num, L"vlaue %d", index); 		lvI.pszText = Num; 		// Insert items into the list. 		ListView_InsertItem(hListView, &lvI); 		{ 			//添加子项 			lvSub.iItem = index; 			lvSub.mask = LVIF_TEXT; 			lvSub.pszText = L"subvalue";  			for (int j = 1; j <5; j++) 			{ 				lvSub.iSubItem = j; 				ListView_SetItem(hListView, &lvSub); 			} 		} 	} 	  }

user: user-0
content: 请问，正确的使用方开头应该是怎样的，为什么我怎么也不能写入数据！
user-0 提问: 新手求助：关于fwrite的问题

回复:
user: user-1
content: UDP是不可靠的包交换协议。

user: user-2
content: 缓冲的原因？

user: user-3
content: 引用 1 楼 q3733353520 的回复:man fread  看看 fread 第二个 和第三个  参数

user: user-3
content: man fread
user-0 提问: 写一个程序，它从标准输入读入字符文件，输出所有字符数不超过10的行

回复:
user: user-1
content: 输入时候的那个for循环就有问题了。 第一个for里面有个getchar，如果不是#号的话，那当前行的第一个字符已经被读了 所以第二个for循环中的getchar，是从当前行的第二个字符开始读的

user: user-2
content: fgets 一次读取一行.  (缓冲区大一些, 到小需要大于10,  同时注意\n等换行标记) 然后strlen计算长度是否小于10 循环前两步, 直到读取完成.

user: user-3
content: 修改如下：  #include <stdio.h> #include <ctype.h> enum { maxline = 1024 }; char line[maxline][maxline]; int count[maxline]; int main() { 	int i, j, r; 	char c; 	//for (i = 0; i < maxline && (c = getchar()) != '#'; i++) 	for (i = 0; i < maxline && (c = getchar()) != '\n'; i++) 	{ 		line[i][0] = c; 		//for (j = 1; j < maxline - 2 && (c = getchar()) != '\n'; j++) 		//{ 		//	line[i][j] = c; 		//} 		for (j = 1; j < maxline - 2 && (line[i][j] = getchar()) != '\n'; j++); 	} 	r = i;   //r记录实际读入的行数 	//for (i = 0; i < maxline; i++) 	for (i = 0; i <= r; i++) 	{ 		count[i] = 0; 		for (j = 0; j < maxline - 2; j++) 		{ 			if (line[i][j] != '\n') count[i]++; 			else break; 		} 	} 	//for (i = 0; i < maxline && count[i] >= 1 && count[i] <= 10; i++) 	for (i = 0; i <= r && count[i] >= 1 && count[i] <= 10; i++) 	{ 		for (j = 0; j < count[i]; j++) 		{ 			printf("%c", line[i][j]); 		} 		printf("\n"); 	} 	return 0; }
user-0 提问: 关于字符运算有一些不懂的

回复:
user: user-0
content: 1.由于头文件的存在 这里CHAR＿BIT编译时被直接替换为8 2.而且sizeof 的优先级高于 *   所以为了打字简便而sizeof不加打括号时  编译理解为先取长后乘法  而不是想象中的先数值类型转换再运算 然后对运算后的字符取长  总结如上 谢谢各位大大的帮助  vb 转c 有些地方会有vb老根 希望大大们助我一力 么么哒

user: user-1
content: printf("%d bits\n",  sizeof 2147483647*CHAR_BIT);            // 显示32 bits  printf("%d bits\n",  sizeof (-2147483647-1)*CHAR_BIT);     // 显示32 bits  printf("%d bits\n",  sizeof CHAR_BIT);                                 // 显示4 bits      printf("%d bits\n",  sizeof 1);                                                 // 显示4 bits printf("%d bits\n",  sizeof 1*CHAR_BIT);                              // 显示32 bits   首先要明明sizeof是运算符，且sizeof的运算符优先级要高于 * （乘法） 另外#define CHAR_BIT 8 以第五个为例 sizeof 1 * CHAR_BIT 实际就是(sizeof(1))*8 =32 sizeof(1) =4

user: user-2
content: 理解sizeof操作符以及数据的默认类型。 sizeof Operator Yields the size of its operand with respect to the size of type char. The operand to sizeof can be one of the following: A type name. To use sizeof with a type name, the name must be enclosed in parentheses. An expression. When used with an expression, sizeof can be specified with or without the parentheses. The expression is not evaluated. 默认类型 整型->int 浮点型->double CHAR_BIT是一宏 = 8

user: user-3
content: 4*8=32，小学生都懂吧

user: user-4
content: 你把代码中所有的 CHAR_BIT 换成 8 就懂了 或者你可以把第三个printf 中的 sizeof 删掉
user-0 提问: C语言-结构体声明疑惑

回复:
user: user-1
content: 没有问题。。

user: user-2
content: 你是不是把控制台和windows程序搞混了.

user: user-3
content: C语言中变量的定义 必须在函数的开始部分，修改成如下代码就OK了 char *getMemory4(int memorySize) {     struct Teacher *pTmp = NULL;     char *cVar = NULL;        pTmp = (struct Teacher *)malloc(memorySize * sizeof(struct Teacher));                cVar = (char *)malloc(memorySize * sizeof(struct Teacher));           return cVar; }

user: user-4
content: char *cVar = NULL;  C语言能在中间定义?

user: user-5
content: char[]应该不知道你这个多大吧。

user: user-5
content: char name[]是什么意思

user: user-6
content: 没有问题
user-0 提问: “统计英语字符个数”程序编译出现问题

回复:
user: user-1
content: 【FROM CSDN】 调用： gets(buffer) //函数对输入长度不加以限制    //所以在vs中用gets会有警告信息This function or variable may be unsafe. gets_s(buffer,size)  //其中第二参数就是允许的输入长度     //这里的size是分配buffer-1的长度才正好，否则自动为'\0'分配空间的时候会溢出。

user: user-2
content: 写错了，是gets_s(text[i], 80);

user: user-2
content: 改为：gets_s(test[i], 80);
user-0 提问:   除了论坛，学校编程内网，我还可以在哪里找到关于c语言各式各样的问题。

回复:
user: user-1
content: 数据结构，算法，学校里面有ACM网站吗？没有的话上网找一个开放的ACM刷题网页。不过这个太专业了，你可以上网找找C语言面试题做做。

user: user-2
content: 仅仅懂C语法，是干不了什么的。你得接着学数据结构，网络，操作系统……

user: user-3
content: https://www.baidu.com/
user-0 提问: c语言使用json格式替换数组合适吗

回复:
user: user-1
content: 其实我的意思是只用sqlite即可，不需要额外的json。

user: user-0
content: 引用 2 楼 ForestDB 的回复:嵌入式的话其实是可以用sqlite的。 不过json应该也不错。 现在使用的就是sqlite3， 从sqlite取值保存为json作为初始状态，然后和sqlite的值变化比较

user: user-1
content: 嵌入式的话其实是可以用sqlite的。 不过json应该也不错。

user: user-2
content: 可以用nosql的数据库，简单的leveldb，功能强大的mongodb啥的
user-0 提问: 关于linux下的malloc函数和windows下的不同

回复:
user: user-1
content: Linux是开源的。

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

user: user-2
content: 你malloc分配了多少内存就用多少内存，越界肯定是错误的，至于错误的具体表现就跟C库的实现有关，各个C库会保证正确使用库函数的行为一致，但并不保证错误行为也一致。 那个free的错误是因为你越界多写了一个字节导致内存管理列表乱了造成的。

user: user-3
content: linux malloc函数的底层是brk，sbrk系统调用现的， windows是其他的系统调用、 linux下的malloc函数在该进程第一次申请内存的时候实际会像内存请求33页的大小（1页=4096字节）， 之后程序中再用到malloc的时候就可以直接在这33页中分配， 而不需要系统调用， 减少内核到用户态的切换， 提高效率。  windos也会有这样的一些底层维护， 只是不开源的话无从细说。  关于分配33页是ubuntu系统下的验证结果。
user-0 提问: 读取第一个非空白字符程序分析

回复:
user: user-1
content: 第一段代码就差一个continue吗？那个continue可以不用管的，就像楼上说的，有没有都一样。  get_first函数的执行逻辑，先找到第一个空白字符，然后将该行一个字符一个字符的读完（就是读到\n） 因为只要第一个字符，所以除了第一个字符，后面的字符没用，就不需要任何操作了。

user: user-2
content: 略作解释    while (isspace(ch))   //这个while就可以读到第一个非空白字符     {         ch = getchar();     }     while (getchar() != '\n')  //读完一整行，为下一次判断作准备     {         continue; //这个有没有都是一回事     }  引用 2 楼 yshj1182831071 的回复:首先，谢谢您的回答，还有一点不是很明白  while (getchar() != '\n')  //读完一整行，为下一次判断作准备     {         continue; //这个有没有都是一回事     } 这一句读取后不做任何操作吗？ 不用，读取位置已转到新的一行

user: user-0
content: @zhangxiangDavaid

user: user-0
content: 首先，谢谢您的回答，还有一点不是很明白  while (getchar() != '\n')  //读完一整行，为下一次判断作准备     {         continue; //这个有没有都是一回事     } 这一句读取后不做任何操作吗？

user: user-2
content: 略作解释    while (isspace(ch))   //这个while就可以读到第一个非空白字符     {         ch = getchar();     }     while (getchar() != '\n')  //读完一整行，为下一次判断作准备     {         continue; //这个有没有都是一回事     }
user-0 提问: 关于SOCKET C语言编程

回复:
user: user-1
content: 接收到的数据保存成文件打开后就正常，这说明传输是没问问题了。主要是这里有好几个问题没搞清： 1.这里不知道楼主是什么系统，用的什么编译环境。这里假设是Windows和VC吧、 2.发送端发送的是什么编码？按照你说是UTF-8，这没问题。我猜测你传输的可能是UTF-8编码的htm文件。 3.程序看到是乱码，是如何看的？是通过调试还是通过打印。如果你用的是VC，那么VC无论是调试还是打印都不支持UTF-8，只支持GBK（这么说其实不准确，可以粗浅这么认为）。如果网络数据本身是UTF-8，那么如果要在程序中输出，请转换一下编码后printf，用4楼的API就可以，也可以用开源库。 3.至于printf("中文")显示是乱码，取决于你承载这句话的源文件是什么编码。对于编译器来说只是输出的两个引号之间的东西，里面是什么就是什么。如果是VC，可能会做得多一些。如果原文件是用GB码保存的，输出一般没问题。如果源文件是用加了BOM头的UTF-8保存的，编译器其实会自动把UTF-8转码为本地码，也没问题。如果没有BOM头的UTF-8，这时候编译器无法识别UTF-8，就无法转码，那么可能就会有问题 4.你把接收到了内容保存成文件，打开又没乱码，这说明你网络编程没问题。因为只要是二进制传输，网络这里其实就是原样拷贝而已，原来是啥就是啥。打开的时候，你的记事本或者文本工具会自动识别，自认没乱码了。

user: user-2
content: 引用 楼主 qq_25235869 的回复:自己学教程用SOCKET 写接受网页源码的一个程序，然后及就是recv（）函数接收的源码全都是乱码，我已经按网上说的确定了 都是UFT-8的编码  所以自认为不是编码的问题  然后就不知道哪里出问题了 求网友指点 指点，ps：只有中文的字符才出现了问题，然后接收到的字符保存为html文件 代开文字一切正常  ConvertUtf8ToGBK(CString& strUtf8)  { 	int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0); 	unsigned short * wszGBK = new unsigned short[len+1]; 	memset(wszGBK, 0, len * 2 + 2); 	MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len); 	 	len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); 	char *szGBK=new char[len + 1]; 	memset(szGBK, 0, len + 1); 	WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);	 	strUtf8 = szGBK; 	delete[] szGBK; 	delete[] wszGBK; } 中文用这个函数转换一下就可以了

user: user-3
content: socket你设置是以stream形式的吧。那么就是字节流，需要相同的编码形式

user: user-0
content: 可是为什么 当我的VS输出中文的时候（中文不是来自网页就是简单的printf("中文");）显示乱码，然后当我设置了UFT-8就OK了呢？？

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

user: user-5
content: 控制台输出UTF-8编码的字符串这要系统支持吧。。比如中文版Windows默认一般默认是GB系列编码 一定要输出的话转换成GBK之类的再输出吧。。或者至少转换成UCS-2编码再输出吧
user-0 提问: sizeof （int）*p

回复:
user: user-1
content: 编译器是这样做的： p = 2; apple = p << 2 （相当于p*sizeof(int)）

user: user-0
content: 这个结果是计算int型所占内存数再乘以p。

user: user-2
content: 引用 2 楼 user-11 的回复: 没看过 c专家编程 但如果真像你所说的 apple=sizeof (int) *p; 可以从这个表达式YY出 p 指针....这书也真是太能扯了... size(int) == 4 p  == 2 apple = 4 * 2 == 8 就特么一个 4 * 2 这能扯出个 *p 指针来。。我也醉了+1,lz该吃药了

user: user-3
content: 引用 6 楼 zhao4zhong1 的回复:《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！ 赵四老师一直如此机智。

user: user-4
content: sizeof （int *） p 语法错误

user: user-5
content: 不就是不规范的编码习惯造成的误解么？良好的编码习惯中，二元运算符前后要加空格的 apple=sizeof(int) * p; 如果是强制类型转换，必须用括号在sizeof后面也吧P扩上才行

user: user-6
content: sizeof(int) * p  优先级还是要管的吧. sizeof是一个编译期就要计算的东西. 肯定是括号与sizeof永远在一起的.  它类似一个函数. 那个"专家"把它分开, 也是奇葩.

user: user-7
content: 首先那本书这个级别的吐槽没意思。 其次，很多时候加个括号即可。

user: user-8
content: 《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

user: user-9
content: 重点不在此。  引用 4 楼 sholber 的回复:[quote=引用 3 楼 super_admi 的回复:] 从前有个人，叫曹操，生了个儿子，叫曹植，曹植被他兄弟杀了，埋在地里，长出了一根葫芦藤，结出七个葫芦，葫芦成熟后，从中蹦出七个葫芦娃，葫芦娃碰到一个蛇妖，大战之后，葫芦娃化作大山，将蛇妖镇压，但有一个叫愚公的人很不爽这座山，所以天天和家人一起在这里挖山，挖了很久，惊动了天神，天神派人将山背走了。  长葫芦藤的过程不够形象，应该是“酷哧酷哧长出一根藤来”。[/quote]

user: user-10
content: 引用 3 楼 super_admi 的回复:从前有个人，叫曹操，生了个儿子，叫曹植，曹植被他兄弟杀了，埋在地里，长出了一根葫芦藤，结出七个葫芦，葫芦成熟后，从中蹦出七个葫芦娃，葫芦娃碰到一个蛇妖，大战之后，葫芦娃化作大山，将蛇妖镇压，但有一个叫愚公的人很不爽这座山，所以天天和家人一起在这里挖山，挖了很久，惊动了天神，天神派人将山背走了。  长葫芦藤的过程不够形象，应该是“酷哧酷哧长出一根藤来”。

user: user-9
content: 从前有个人，叫曹操，生了个儿子，叫曹植，曹植被他兄弟杀了，埋在地里，长出了一根葫芦藤，结出七个葫芦，葫芦成熟后，从中蹦出七个葫芦娃，葫芦娃碰到一个蛇妖，大战之后，葫芦娃化作大山，将蛇妖镇压，但有一个叫愚公的人很不爽这座山，所以天天和家人一起在这里挖山，挖了很久，惊动了天神，天神派人将山背走了。

user: user-11
content: 没看过 c专家编程 但如果真像你所说的 apple=sizeof (int) *p; 可以从这个表达式YY出 p 指针....这书也真是太能扯了... size(int) == 4 p  == 2 apple = 4 * 2 == 8 就特么一个 4 * 2 这能扯出个 *p 指针来。。我也醉了

user: user-10
content: 劝你最科学的方法是愉快的使用的万能的搜索引擎了解一下sizeof的功能和语法。别的都是瞎耽误工夫。
user-0 提问: HDOJ-1010基础的迷宫问题（DFS）

回复:
user: user-1
content: int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};  int check(int x,int y) { 	if(x>=0 && y>=0 && x<n && y<m) 		return 1; 	return 0; }  void dfs(int x, int y, int step) { 	int temp; 	int dx,dy;  	if(flag == true || x==atx && y==aty && step==0) 	{ 		flag = true; 		return; 	}  	temp=abs(x-atx)+abs(y-aty)+step;  	if(temp%2!=0)return; 	map[x][y] = 'X'; 	for(int i=0; i<4; i++) 	{ 		dx = x+dir[i][0]; 		dy = y+dir[i][1]; 		if(check(dx,dy) && map[dx][dy]!='X') 		{ 			dfs(dx,dy,step-1); 		} 	} 	map[x][y] = '.'; }

user: user-0
content: 引用 6 楼 user-1 的回复:不仅是返回的问题 map[-1][y]这个会直接给你Runtime error的。 的确是栈溢出了，可我看网上的那些AC了的答案都是这样写的。小弟刚想了很久也试了一下 还是不知道该怎么写，希望前辈提醒一下具体该怎么做。 还有我又想到一个问题，就是我的程序刚开始在while scanf 后面不用加个getchar()吃回车么？ 小弟感激不尽！

user: user-1
content: 引用 5 楼 qq_23908539 的回复:[quote=引用 4 楼 user-1 的回复:]如果当前x=0 if(map[x-1][y]!='X') map[x-1][y]不就数组越界了吗？ 对啊，所以当把x-1也就是-1作为新的参数传进数组的时候会有直接因为通不过 if(x<0||y<0||x>=n||y>=m)语句而被 return了[/quote]  不仅是返回的问题 map[-1][y]这个会直接给你Runtime error的。

user: user-0
content: 引用 4 楼 user-1 的回复:如果当前x=0 if(map[x-1][y]!='X') map[x-1][y]不就数组越界了吗？ 对啊，所以当把x-1也就是-1作为新的参数传进数组的时候会有直接因为通不过 if(x<0||y<0||x>=n||y>=m)语句而被 return了

user: user-1
content: 引用 2 楼 qq_23908539 的回复:也就是说奇偶剪枝的唯一作用就是在一开的时候判断下能否奇偶是否对等，而在后面的步骤中就没有用了？ 可以这么说。   引用 3 楼 qq_23908539 的回复:有判断啊，当刷新dfs参数的时候，也就是一进入dfs函数就会有个if语句来看他们是否出界。 如果当前x=0 if(map[x-1][y]!='X') map[x-1][y]不就数组越界了吗？

user: user-0
content: 引用 1 楼 user-1 的回复:这里面你没有对x+1,x-1,y-1,y+1其范围是否还在[0,N),[0,m)进行判断。这个有可能造成数组越界 有判断啊，当刷新dfs参数的时候，也就是一进入dfs函数就会有个if语句来看他们是否出界。

user: user-0
content: 引用 1 楼 user-1 的回复:奇偶剪枝的作用，当门在T秒开时，假设T为奇数，abs(x-atx)+abs(y-aty)的值为偶数(或者是T为偶数,另一个结果为奇数)。此时无论怎么走都不可能走出去的(因为此时到门的时间一定是偶数，具体要什么数学证明我也搞不懂)，不用再进行搜索，直接可以判断无法出去。速度不是很快吗？ 也就是说奇偶剪枝的唯一作用就是在一开的时候判断下能否奇偶是否对等，而在后面的步骤中就没有用了？

user: user-1
content: 奇偶剪枝的作用，当门在T秒开时，假设T为奇数，abs(x-atx)+abs(y-aty)的值为偶数(或者是T为偶数,另一个结果为奇数)。此时无论怎么走都不可能走出去的(因为此时到门的时间一定是偶数，具体要什么数学证明我也搞不懂)，不用再进行搜索，直接可以判断无法出去。速度不是很快吗？   引用 楼主 qq_23908539 的回复:问题一：我的代码不知道哪里出错了，自己举一些例子总是过不了，更不用说AC了，请教大神们看看哪里有问题。  if(map[x+1][y]!='X'){         bfs(x+1,y,step-1);         if(flag)return;     }     if(map[x-1][y]!='X'){         bfs(x-1,y,step-1);         if(flag)return;     }     if(map[x][y+1]!='X'){         bfs(x,y+1,step-1);         if(flag)return;     }     if(map[x][y-1]!='X'){         bfs(x,y-1,step-1);         if(flag)return;     } map[x+1] [y],map[x-1][y], map[x][y-1],map[x][y+1]，这里面你没有对x+1,x-1,y-1,y+1其范围是否还在[0,N),[0,m)进行判断。这个有可能造成数组越界
user-0 提问: 中序遍历线索二叉树添加头结点时，头结点总是指向不对，，，，，

回复:
user: user-1
content: 用递归解决问题， 再说你这个看起来就不像是中序遍历 	//树节点 	struct node 	{ 		int num; 		struct node * p_left; 		struct node * p_right; 	}; //中序遍历二叉树 void mTraverse(const struct node * tree) { 	if(tree == NULL) 		return; 	if(!tree->p_left && !tree->p_right) 	{ 		printf("%d ",tree->num); 		return; 	} 	if(tree->p_left) 	{ 		mTraverse(tree->p_left); 	} 	printf("%d ", tree->num); 	if(tree->p_right) 	{ 		mTraverse(tree->p_right); 	} }
user-0 提问: opencv编译出错，以下几个错误不知如何解决，我是新手

回复:
user: user-1
content: 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-2
content: 这是没配置好造成的，照着下面重新配置一遍， release版本和debug版本都要重新配置， 因为在配置 附加依赖项时候，  opencv_calib3d240d.lib  有d的表示debug版本 opencv_calib3d240.lib   release版本 http://www.cnblogs.com/freedomshe/archive/2012/04/25/2470540.html  使用静态库的原则就是， 让编译器能找到静态库放在那里， 以及包含的头文件。
user-0 提问: 这个宏的含义

回复:
user: user-1
content: 结构体或类成员的偏移量

user: user-2
content: 这个不一定地结构， 也可以是类 c、c++ 可以无耻的把0转换成 类/结构 指针， 再计算出成员变量的偏移量。 &得到的结果就是偏移量。

user: user-3
content: 结构成员在结构中的偏移

user: user-4
content: 获取结构TYPE的成员变量MEMBER在结构中的偏移量，编译时就能计算出

user: user-5
content: offsetof( type,  member-designator)  which expands to an integral constant expression that has type size_t,  the value of which is the offset in bytes, to the structure member (designated by member-designator ), from the beginning of its structure (designated by type ).
user-0 提问: 关于const字符的c语言程序疑问

回复:
user: user-1
content: const int *a,a是指针变量，*a是常量，不能赋值

user: user-2
content: 第二个改成 int* const a.   原理：  const & 指针  　　类型声明中const用来修饰一个常量，有如下两种写法，那么，请问，下面分别用const限定不可变的内容是什么?  　　1)、const在前面  　　const int nValue； //nValue是const  　　const char *pContent; //*pContent是const, pContent可变  　　const (char *) pContent;//pContent是const,*pContent可变  　　char* const pContent; //pContent是const,*pContent可变  　　const char* const pContent; //pContent和*pContent都是const  　　2)、const在后面，与上面的声明对等  　　int const nValue； // nValue是const  　　char const * pContent;// *pContent是const, pContent可变  　　(char *) const pContent;//pContent是const,*pContent可变  　　char* const pContent;// pContent是const,*pContent可变  　　char const* const pContent;// pContent和*pContent都是const  　　答案与分析：  　　const和指针一起使用是C语言中一个很常见的困惑之处，在实际开发中，特别是在看别人代码的时候，常常会因为这样而不好判断作者的意图，下面讲一下我的判断原则：  　　当const所在代码段中不包含括号时，沿着*号划一条线，如果const位于*的左侧，则const就是用来修饰指针所指向的变量，即指针指向为常量；如果const位于*的右侧，const就是修饰指针本身，即指针本身是常量。你可以根据这个规则来看上面声明的实际意义，相信定会一目了然。  　　另外，需要注意：对于const (char *) ; 因为char *是一个整体，相当于一个类型(如 char)，因此，这时限定指针是const。  　　一个简单的判断方法：指针运算符*，是从右到左，那么如：char const * pContent，可以理解为char const (* pContent)，即* pContent为const，而pContent则是可变的。

user: user-3
content: constt的使用 http://blog.csdn.net/zhangxiangdavaid/article/details/38082159

user: user-4
content: const int * a    内容常量 int* const a.    指针常量

user: user-5
content: 第一个 const int *a是说*a为常量，不能给*a赋值，但可给a赋值，例如：*a=4；error     a=&c；right int   * const  a；则是a不可赋值，*a可以 例如 1.#include<stdio.h> main() {  const int *a ; int c=3; a=&c;无警告//*a=4;错误 } 2. #include<stdio.h> main() { 	int b=4,c=3; 	int  *const a=&c ;//要初始化，不然会出现野指针 	*a=4;//正确a=&b; 错误 }
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: 呵呵，书上狠多也是错的，很正常，遇见错误，就问一下周围的高手，或者查查其他相关资料就好了

user: user-0
content: 引用 4 楼 zhangxiangDavaid 的回复:你用的是struct student; 可在很多地方你写成了struct Student; 改过来即可。见笑了啊

user: user-0
content: 好了 我已经知道了 是课本太坑了 自己脑子又不好使 见笑了

user: user-3
content: 你用的是struct student; 可在很多地方你写成了struct Student; 改过来即可。

user: user-0
content: 很简单的链表入手而已

user: user-4
content: 链表有什么好学的，看看故事会，快活吃酒要紧。

user: user-0
content: #include<stdio.h> #include<stdlib.h> struct student { 	char cName[20]; 	int iNumber; 	struct student *next; };  int iCount; struct Student *create() { 	struct Student *pHead=NULL; 	struct Student *pEnd,*pNew; 	iCount=0; 	pEnd=pNew=(struct Student *)malloc(sizeof(struct student)); 	scanf("%s",pNew->cName); 	scanf("%d",&pNew->iNumber); 	while (pNew->iNumber!=0) 	{  	iCount++; 	if (iCount==1) 	{ 		pNew->next=pHead; 		pEnd=pNew; 		pHead=pNew; 	} 	else 	{ 		pNew->next=NULL; 		pEnd->next=pNew; 		pEnd=pNew; 	} 	pNew=(struct Student *)malloc(sizeof(struct student)); 	scanf("%s",pNew->cName); 	scanf("%d",&pNew->iNumber); 	} 	free(pNew); 	return pHead; } void print(struct Student *pHead) { 	struct Student *pTemp; 	int iIndex=1; 	printf("************%d*************\n",iCount); 	pTemp=pHead; 	while (pTemp!=NULL) 	{ 		printf("%d:\n",iIndex); 		printf("%s",pTemp->cName); 		printf("%d",&pTemp->iNumber); 		pTemp=pTemp->next; 		iIndex++; 	} }  int main() { 	struct Student *pHead; 	pHead=create(); 	print(pHead); 	return 0; }
user-0 提问: signal()返回值SIG_ERR的定义

回复:
user: user-0
content: 引用 4 楼 ID870177103 的回复:vs2012里给的定义是 #define SIG_ERR (void (__cdecl *) (int))-1 其它的也是都有int 说明是你的编译器的问题吧 不过能编译通过也不会产生错误 但是不同指针也能比较，是什么编译器啊 刚刚查了下源代码，确实是有int的，上面这些我都是用手机在网上查到的，看来网上的也不能尽信，得自己验证，谢谢。

user: user-0
content: 引用 3 楼 a30037338 的回复:你确定这个能正确执行， 编译就过不了，不能这样用。 我是直接百度signal函数，有的百科介绍这函数的时候引用了上面的例子。 手机上网查的，没验证。

user: user-1
content: vs2012里给的定义是 #define SIG_ERR (void (__cdecl *) (int))-1 其它的也是都有int 说明是你的编译器的问题吧 不过能编译通过也不会产生错误 但是不同指针也能比较，是什么编译器啊

user: user-2
content: 你确定这个能正确执行， 编译就过不了，不能这样用。

user: user-0
content: /* This example installs a signal handler routine for SIGFPE, catches an integer overflow condition, makes an adjustment to AX register, and returns. This example program MAY cause your computer to crash, and will produce runtime errors depending on which memory model is used. */ #pragma inline #include <stdio.h> #include <signal.h> void Catcher(int sig, int type, int *reglist) { printf("Caught it!\n"); *(reglist + 8) = 3; /* make return AX = 3 */ } int main(void) { signal(SIGFPE, Catcher); asm mov ax,07FFFH /* AX = 32767 */ asm inc ax /* cause overflow */ asm into /* activate handler */ /* The handler set AX to 3 on return. If that hadn't happened, there would have been another exception when the next 'into' was executed after the 'dec' instruction. */ asm dec ax /* no overflow now */ asm into /* doesn't activate */ return 0; } 还有这里Catcher函数有3个参数，signal也能执行？ 是不是void(*handle)(int)只看成指针，传地址就行？形参并不进行检查？

user: user-2
content: 这才是c语言， 可以很无耻的这样转。这样转换就是把0，-1,1看做了地址。 signal的返回值本意是返回上次设置的signal处理函数，用于备份和恢复。
user-0 提问: 请教C语言一个小问题

回复:
user: user-0
content: 引用 4 楼 cainiao_2015 的回复:[quote=引用 2 楼 zhangxiangDavaid 的回复:] 使用scanf(); 空白字符(空格、回车、制表符)可区分数据 使用gets(); 一般回车才可区分数据 gets() The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.  你好，可我是分开用gets读入三人的名字的啊，我还是不理解你的意思，麻烦再解释一下，谢谢[/quote]  明白了，题目没看清啊。。。谢谢了

user: user-0
content: 引用 2 楼 zhangxiangDavaid 的回复:使用scanf(); 空白字符(空格、回车、制表符)可区分数据 使用gets(); 一般回车才可区分数据 gets() The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.  你好，可我是分开用gets读入三人的名字的啊，我还是不理解你的意思，麻烦再解释一下，谢谢

user: user-0
content: 引用 1 楼 user-2 的回复:scanf的%s是读取到空格、回车、制表符，而gets只会读取到回车。 你用gets的话，三个人的名字会存成一个名字。  你好，可我是分开用gets读入三人的名字的啊，我还是不理解你的意思，麻烦再解释一下，谢谢

user: user-1
content: 使用scanf(); 空白字符(空格、回车、制表符)可区分数据 使用gets(); 一般回车才可区分数据 gets() The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.

user: user-2
content: scanf的%s是读取到空格、回车、制表符，而gets只会读取到回车。 你用gets的话，三个人的名字会存成一个名字。
user-0 提问: 数据结构树：只知道中序后序求树

回复:
user: user-0
content: 引用 5 楼 wangzuxi 的回复:[quote=引用 3 楼 pjw694438869c 的回复:] 其实我知道右边，我是分析不出左边 左边也是一个道理啊。 后序I L K J G D B E H F C A，分析完A的右子树（E H F C A）之后，接下来后序最后一个就是B，那B自然就是A的左孩子节点了，B之前是D，所以D肯定是B的孩子，在中序中D在B左边，所以D是B的左孩子节点，后序中D前面是G，中序G又在D右边，所以G是D的右孩子节点，后序中G前面是J，中序中J在G右边，所以J是G的右孩子，中序中I在G左边，所以I是G的左孩子节点，后序中J前面是K，中序中K在J右边，所以K是J的右孩子节点，后序中K前面是L，中序中L在K左边，所以L是K的左孩子节点。[/quote] 看了 终于会了

user: user-0
content: 引用 4 楼 fly_dragon_fly 的回复:struct btree{     btree * left, *right;     char c; };  btree *build(const char *post,const char *lastpost,              const char *in,  const char *lastin) {     assert(lastpost-post==lastin-in);     if(post==lastpost) return NULL;     btree *rt =(btree *)malloc(sizeof(*rt));     rt->c =lastpost[-1];     const char *p=strchr(in,rt->c);     const char *mid =p-in+post;     rt->left =build(post,mid,in,p);     rt->right=build(mid,lastpost-1,p+1,lastin);     return rt; }  int main() {     const char *in    ="DIGJLKBAECHF";     const char *post  ="ILKJGDBEHFCA";     int len=strlen(post);     btree *root =build(post,post+len,in,in+len);      return 0; } 谢谢

user: user-1
content: struct btree{     btree * left, *right;     char c; };  btree *build(const char *post,const char *lastpost,              const char *in,  const char *lastin) {     assert(lastpost-post==lastin-in);     if(post==lastpost) return NULL;     btree *rt =(btree *)malloc(sizeof(*rt));     rt->c =lastpost[-1];     const char *p=strchr(in,rt->c);     const char *mid =p-in+post;     rt->left =build(post,mid,in,p);     rt->right=build(mid,lastpost-1,p+1,lastin);     return rt; }  int main() {     const char *in    ="DIGJLKBAECHF";     const char *post  ="ILKJGDBEHFCA";     int len=strlen(post);     btree *root =build(post,post+len,in,in+len);      return 0; }

user: user-0
content: 其实我知道右边，我是分析不出左边

user: user-2
content: 引用 3 楼 pjw694438869c 的回复:其实我知道右边，我是分析不出左边 左边也是一个道理啊。 后序I L K J G D B E H F C A，分析完A的右子树（E H F C A）之后，接下来后序最后一个就是B，那B自然就是A的左孩子节点了，B之前是D，所以D肯定是B的孩子，在中序中D在B左边，所以D是B的左孩子节点，后序中D前面是G，中序G又在D右边，所以G是D的右孩子节点，后序中G前面是J，中序中J在G右边，所以J是G的右孩子，中序中I在G左边，所以I是G的左孩子节点，后序中J前面是K，中序中K在J右边，所以K是J的右孩子节点，后序中K前面是L，中序中L在K左边，所以L是K的左孩子节点。

user: user-2
content: 后序最后是A，所以A是根，在中序中以A为界分成两半，后半部分是ECHF，在后序中A之前是C，所以A的右子树以C为根，而中序是ECHF，所以C的左子树只有一个节点E，后序中C前面是F，所以C的右子树以F为根，中序为HF，所以H是F的左孩子节点。中序中A的前半部分也是同样道理分析即可。

user: user-3
content: http://www.baidu.com/s?wd=中序，后序，%20求树&ie=utf-8
user-0 提问: 关于Huffman压缩中的编码与写入读取二进制文件的问题

回复:
user: user-0
content: 如何将字符串转化为二进制的0x99呢，是要先将串"10011001"转化为整型对应的153然后写入文件？还是说有什么办法能够将串直接转变为int的0x形式？  引用 1 楼 xiaohuh421 的回复:但是字符串每个0与1都必须要一个8位ASCII码(二进制)存储  需要把你的字符串转换为二进制数据, 再保存到文件中. 比如 "10011001"要转换成 0x99保存到文件中.  如何找到编码表与正文的分界线。 保存数据的时候, 就写入一个标识符作为分界.  比如0x123456 0x123456

user: user-1
content: 但是字符串每个0与1都必须要一个8位ASCII码(二进制)存储  需要把你的字符串转换为二进制数据, 再保存到文件中. 比如 "10011001"要转换成 0x99保存到文件中.  如何找到编码表与正文的分界线。 保存数据的时候, 就写入一个标识符作为分界.  比如0x123456 0x123456

user: user-2
content: 仅供参考：//有一个二进制文件，要求每隔50bits，删除后面的12bits。 #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *fi,*fo; char buf[31]; char obf[31]; int bn,n; void filter() {//对buf中前n个字节中的位，每隔50bits，忽略12bits，结果放在obf中,且将bn设置为obf中的字节数。     char bit[249];     char obt[249];     char b8[33];     char b88[33];     int i,j;     char *e;      for (i=0;i<n;i++) {         _itoa(buf[i],b8,2);         sprintf(b88,"%032s",b8);         sprintf(bit+i*8,"%s",b88+24);     }      j=0;     for (i=0;i<n*8;i++) {         if (i%62<50) {             obt[j]=bit[i];             j++;         }     }     if (j%8) {         bn=(j/8+1)*8;     } else {         bn=j;     }     for (i=j;i<bn;i++) obt[i]='0';     obt[bn]=0;     bn=bn/8;     for (i=0;i<bn;i++) {         strncpy(b8,obt+i*8,8);b8[8]=0;         obf[i]=(char)strtol(b8,&e,2);     } } int main() {     fi=fopen("in.bin","rb");     if (NULL==fi) {         printf("Can not open file in.bin!\n");         return 1;     }     fo=fopen("out.bin","wb");     if (NULL==fo) {         fclose(fi);         printf("Can not open file out.bin!\n");         return 2;     }     while (1) {         n=fread(buf,1,31,fi);         if (0==n) break;         filter();         fwrite(obf,1,bn,fo);     }     fclose(fo);     fclose(fi);     return 0; }

user: user-1
content: 按bit置位啊. 每次取你的二进制串中的8位. 比如"10011001" 然后使用一个BYTE来保存其数据. char buf[9] = "10011001"; BYTE data = 0; if(buf[0] == '1') {     data |= 0x80;  //0x80  == 10000000B } if(buf[1] == '0') {     data |= 0x40;  //0x40 == 01000000B } ..... 经过8次后, data == 0x99 == 10011001B   .....后面你自己发挥了. 可把前面的过程写成循环, 也可以每8位直接写成上面的代码.
user-0 提问: fread函数怎么用，想读取一个BIN文件

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

user: user-2
content: 1.bin  0 1

user: user-2
content: 如下测试：  int main(void) { 	FILE *fp; 	fp = fopen("1.bin", "rb"); 	unsigned char buf[20]; 	fread(buf, sizeof(unsigned char), 20, fp); 	fclose(fp); 	int n1, n2; 	sscanf(buf, "%d%d", &n1, &n2); 	printf("n1=%d,n2=%d\n", n1, n2); 	return 0; } //n1=0,n2=2

user: user-3
content: 参考http://www.cplusplus.com/reference/cstdio/fread/
user-0 提问: 读取把bin文件，显示为矩阵然后显示出一个灰度值图像

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

user: user-0
content: 是bin文件，fp=("c:\\001.bin","rb");,这应该没什么问题，但是用fream读出来不对

user: user-2
content: fopen("test.txt", "r+b");  有没有加这个"b"， 表示以二进制方式读取文件。
user-0 提问: 超时了，求大神指点更好的解题思路

回复:
user: user-1
content: 我又看了看题目…原来那个样例只要输出最后的中位数呀！那你就按照指令模拟，最后再按我第一个回复的找一次中位数就好了

user: user-0
content: 引用 8 楼 jensenjiang 的回复:我错了，我以为只是求中位数，那这样N*K肯定超时。 那就应该要用线段数区间修改了  本人菜鸟，求指教什么是线段区间修改？谢谢

user: user-1
content: 我错了，我以为只是求中位数，那这样N*K肯定超时。 那就应该要用线段数区间修改了

user: user-1
content: 1、偷懒，用C++ STL 自带的nthelement 效率是O(N)的 2、自己实现nthelement，方法类似于快速排序，快速排序每次都找一个正确位置的元素，因此每一次找到那个正确位置的元素后，判断中点在它的左区间还是右区间，递归解决即可

user: user-0
content: 引用 4 楼 zhangxiangDavaid 的回复:偷个懒，试下快速排序：  int T, N, K, A, B; int i, j; int straw[1000000]; int cmp(int *a, int *b) { 	return *a < *b; } int main() { 	scanf("%d", &T); 	while (T--) 	{ 		scanf("%d%d", &N, &K); 		memset(straw, 0, sizeof(int) * 1000000); 		while (K--) 		{ 			scanf("%d%d", &A, &B); 			for (i = A; i <= B; i++) straw[i]++; 		} 		qsort(straw, N, sizeof(int), cmp); 		printf("%d\n", straw[N / 2]); 	} 	return 0; }   用了快排结果还是超时，还有改进的方法吗？ #include<stdio.h> #include<stdlib.h>  int a[1000000];  int cmp(const void*a,const void*b) { return *(int*)a-*(int*)b; }  int main() {     int T,n,k,i,t,x,y,temp;      scanf("%d",&T);      while(T--)     {         scanf("%d%d",&n,&k);          for(i=0; i<n; i++)             a[i]=0;          for(i=1; i<=k; i++)         {             scanf("%d%d",&x,&y);             for(t=x-1; t<=y-1; t++)                 a[t]++;         }          qsort(a,n,sizeof(int),cmp);          printf("%d\n",a[n/2]);      }      return 0; }

user: user-2
content: 这个题目用循环，排序肯定都会超时。K个指令，每条指令都是区间更新，这个很明显使用线段树会比较合适。但不知道怎么在线段树中找到中位数。

user: user-3
content: 偷个懒，试下快速排序：  int T, N, K, A, B; int i, j; int straw[1000000]; int cmp(int *a, int *b) { 	return *a < *b; } int main() { 	scanf("%d", &T); 	while (T--) 	{ 		scanf("%d%d", &N, &K); 		memset(straw, 0, sizeof(int) * 1000000); 		while (K--) 		{ 			scanf("%d%d", &A, &B); 			for (i = A; i <= B; i++) straw[i]++; 		} 		qsort(straw, N, sizeof(int), cmp); 		printf("%d\n", straw[N / 2]); 	} 	return 0; }

user: user-3
content: 寻找中位数，堆排序？

user: user-4
content: 从一个数组中寻找第K大的数，是不需要排序的，这题考的就是快速寻找中位数。

user: user-5
content: 运行正常。 我用的是Dev-C++，超时可能和你的编译工具有关。 把while的条件改成T-->0，应该就可以了。
user-0 提问: 关于printf的奇怪问题

回复:
user: user-1
content: fflush(stdout);

user: user-2
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309
user-0 提问: 关于huffman树如何压缩的问题

回复:
user: user-1
content: 如要压缩的字符串为abc，a的编码为0,b为10,c为11。 char c = 0; char tmp = 0; c = c|(tmp<<7); tmp = 2; c = c|(tmp<<5); tmp = 3; c = c|(tmp<<3); 这时c的二进制就是01011000，fwrite把c写到文件中。 解析时还有问题，如上面原来是abc，解析后就会解析成abcaaa。

user: user-0
content: 引用 1 楼 user-1 的回复:肯定是要按位进行写和读取比对。否则的话，怎么能到达压缩的目的呢。比如字符'A'原来是一个字节，编码后为101不按位进行写操作。就用了三个字节。看GNUZip的源码。 那按位写又如何操作..fwrite不是一次至少要写入1一个字节8位吗，我怎么才能一次一位一位往里面写

user: user-1
content: 肯定是要按位进行写和读取比对。否则的话，怎么能到达压缩的目的呢。比如字符'A'原来是一个字节，编码后为101不按位进行写操作。就用了三个字节。看GNUZip的源码。
user-0 提问: Google了一个晚上没找到C11，谁提供一下，谢谢～～

回复:
user: user-0
content: 谢谢楼上各位。。 如果有朋友能提供C11正式版更好～～～

user: user-1
content: 手里也就一个 “C语言标准1x草案 n1494” 已经足够用了。如果不是做编译器，根本没必要强求正式版。基本上没有实质差异的。

user: user-2
content: 其实C11的正式版本和N1570差不太多，修正了N1570的一些错误，编号也有所改变。即使是修正了N1570的错误（比如_Alignof的语法，这个运算符不适用于表达式，正式版已修正），但仍有很多错误和遗露的地方。可以上网查相关的DR。

user: user-3
content: 引用 2 楼 sholber 的回复:[quote=引用 1 楼 user-3 的回复:] https://www.iso.org/obp/ui/#iso:std:57853:en 你自己都没看过，就急急忙忙推荐。那是要买的，你以为ISO会免费公布（即使是以网页的形式）。[/quote]  好吧...........我就是随便搜了下 还以为能用～～

user: user-2
content: 引用 1 楼 user-3 的回复:https://www.iso.org/obp/ui/#iso:std:57853:en 你自己都没看过，就急急忙忙推荐。那是要买的，你以为ISO会免费公布（即使是以网页的形式）。

user: user-3
content: https://www.iso.org/obp/ui/#iso:std:57853:en
user-0 提问: 请问windows中的HANDLE和PVOID是怎么维护数据的

回复:
user: user-0
content: HBITMAP bm; PVOID data; bm=(HBITMAP) data; 这样可以么，数据会否在后边的操作被修改？

user: user-1
content: 这个属于你不应该关心的实现细节。你不应该用官方API之外的方式操纵这些内核对象。这种操作的结果可以是任何事件，包括格式化你的硬盘。

user: user-0
content: 哦，原来HANDLE 和 PVOID是一样的，都是void*
user-0 提问: 内存对齐问题

回复:
user: user-1
content: 网搜“内存对齐”，不要太纠结……

user: user-2
content: 引用 4 楼 u012578046 的回复:[quote=引用 1 楼 sholber 的回复:] 对齐这件事，和编译器有关。实际上，说起来影响到对齐的因素太多了…… 不对，你这是结构的大小，不是对齐啊。结构的大小同样和编译器有关，影响结构大小的因素太多了……哈哈[/quote]  嘎嘎~

user: user-2
content: 引用 6 楼 my_live_123 的回复:gcc可指定对齐方式：__attribute__((aligned(4)))  嘎哈用它。嘎哈不用_Alignas

user: user-3
content: 就是union变量占用内存字节数不同，union变量是以大的为准 恩，差了四字节，我也觉得是union变量的对齐方式的问题，不过楼主还要去查查资料，我也吃不准 还有就是，楼主，现在我们高级语言，其实不太在乎这点字节数，如果不是特别重要，可以不纠结这个的

user: user-3
content: 引用 1 楼 sholber 的回复:对齐这件事，和编译器有关。实际上，说起来影响到对齐的因素太多了…… 不对，你这是结构的大小，不是对齐啊。结构的大小同样和编译器有关，影响结构大小的因素太多了……哈哈

user: user-4
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("\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("\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("\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("\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("\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("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-5
content: gcc可指定对齐方式：__attribute__((aligned(4)))

user: user-6
content: VC 项目属性可以设置对齐的是4字节，还是8字节的

user: user-2
content: 对齐这件事，和编译器有关。实际上，说起来影响到对齐的因素太多了…… 不对，你这是结构的大小，不是对齐啊。结构的大小同样和编译器有关，影响结构大小的因素太多了……
user-0 提问: 【求助】C语言关于pow函数问题

回复:
user: user-1
content: 这个在vs下没有问题：99999999

user: user-2
content: 什么编译器？？

user: user-3
content: 改成这样试试 fenmu=fenmu+9*(int)(pow(10,i) + 0.5);

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

user: user-5
content: C  中的 double 与 int 的转换问题 比为安全点的做法就类似 2楼 那样。+0.5 再(int)  这问题比较坑人........  #include <stdio.h> #include <math.h>  int main(int argc, char *argv[]) { 	int i;  	double a; 	int b; 	int c; 	int d;  	printf("\n%-20s%-20s%-20s%s\n", "double:a", "implicit(int):b", "explicit(int):c", "implicit(int):d"); 	printf("-----------------------------------------------------------------------------------------\n");  	for (i=0; i<8; ++i) { 		a = pow(10, i);		 		b = pow(10, i);		// 隐式 double --> int 		c = (int)a;			// 显式 double --> int 		d = a;				// 这个也是隐式  		printf("%-20lf", a); 		printf("%-20d",  b); 		printf("%-20d",  c); 		printf("%d\n",   d); 	}  	return 0; }  结果会令人有些费解 :  double:a            implicit(int):b     explicit(int):c     implicit(int):d ----------------------------------------------------------------------------------------- 1.000000            1                   1                   1 10.000000           10                  10                  10 100.000000          99                  100                 100 1000.000000         1000                1000                1000 10000.000000        9999                10000               10000 100000.000000       100000              100000              100000 1000000.000000      1000000             1000000             1000000 10000000.000000     9999999             10000000            10000000

user: user-6
content: 理论上不应该是99999999？
user-0 提问: 无法将HttpWebRequest转换为HttpWebRequest这怎么回事啊？哪位大哥指定下

回复:
user: user-0
content: 是啊我也纳闷啊一样的还提示要转换啥原因啊C#的

user: user-1
content: 你题目是啥。。。他们都是一样的还要转啥。。 要转换，那就强制转换 PS：你这个是java吧。
user-0 提问: gethostbyname获得的IP地址不能用来访问，403Forbidden

回复:
user: user-0
content: 引用需要定义Host字段 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html  我的http请求中有Host字段，无论写成IP地址还是域名形式都不行。而且返回的是403Forbidden。 不过看了你给的网址，在GET方法后我用绝对路径请求资源（根据文档，此时Host字段会被忽略），似乎可以访问了。但返回响应时我只能接收到一部分数据。 我把read()函数放在while循环里，直到read()返回-1或0退出循环。我想问下，read()返回0，是表示传输层的数据报或报文段读取完毕了，还是整个http响应都读取完了？谢谢。

user: user-1
content: 引用 3 楼 hh794362661 的回复:引用需要定义Host字段 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html  我的http请求中有Host字段，无论写成IP地址还是域名形式都不行。而且返回的是403Forbidden。 不过看了你给的网址，在GET方法后我用绝对路径请求资源（根据文档，此时Host字段会被忽略），似乎可以访问了。但返回响应时我只能接收到一部分数据。 我把read()函数放在while循环里，直到read()返回-1或0退出循环。我想问下，read()返回0，是表示传输层的数据报或报文段读取完毕了，还是整个http响应都读取完了？谢谢。  你需要按照http协议接受数据，具体接受方法也看http数据传输类型。 http://blog.csdn.net/zhangboyj/article/details/6236780

user: user-2
content: 楼上正解，如果你用IP访问，需要在HTTP协议头部加上Host字段行就可以了

user: user-1
content: 需要定义Host字段 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html  引用14.23 Host  The Host request-header field specifies the Internet host and port number of the resource being requested, as obtained from the original URI given by the user or referring resource (generally an HTTP URL,  as described in section 3.2.2). The Host field value MUST represent the naming authority of the origin server or gateway given by the original URL. This allows the origin server or gateway to differentiate between internally-ambiguous URLs, such as the root "/" URL of a server for multiple host names on a single IP address.         Host = "Host" ":" host [ ":" port ] ; Section 3.2.2  A "host" without any trailing port information implies the default port for the service requested (e.g., "80" for an HTTP URL). For example, a request on the origin server for <http://www.w3.org/pub/WWW/> would properly include:         GET /pub/WWW/ HTTP/1.1        Host: www.w3.org  A client MUST include a Host header field in all HTTP/1.1 request messages . If the requested URI does not include an Internet host name for the service being requested, then the Host header field MUST be given with an empty value. An HTTP/1.1 proxy MUST ensure that any request message it forwards does contain an appropriate Host header field that identifies the service being requested by the proxy. All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message which lacks a Host header field.  See sections 5.2 and 19.6.1.1 for other requirements relating to Host.
user-0 提问: 初学c，不是很理解，希望帮忙注释下

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

user: user-2
content: 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一

user: user-3
content: 计算机各种语言都差不多，C, VB ,C++ ,JAVA ,PYTHON , 我都知道一点，精华在算法上，算法很重要，自己曾写过一个HASH算未法，动态查找速度真的太快了！。别人写的代码给翻译出算法描述了，这个很难。单步执行，再自己画图吧。肯定能搞出来 。

user: user-4
content: 约瑟夫环是个老问题，把思路理清楚，做出来并不难。

user: user-5
content: 上次还在CSDN和别人讨论约瑟夫环，但这次又忘记什么叫约瑟夫环了。老了，真的是不行了。

user: user-6
content: 楼主，我认为学c需要自己多看书。先按照别人写在熟悉一下。慢慢地理解就知道自己下次该怎么做了。个人观点

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

user: user-8
content: 楼主先熟悉爱它的数据结构吧

user: user-9
content: 未出现在出局列表中的即是最后留下来的人

user: user-9
content: 输入总人数：21 输入共有数：7

user: user-9
content: 注释如下：  #include <stdlib.h> #include <stdio.h> struct node{ 	int out; 	struct node *next; }node, *list, *p, *r; void YUESEFU(int a, int b) { 	int i, j; 	list = NULL; 	//这个for循环构建链表 	for (i = 1; i <= a; i++) 	{ 		p = (struct node*)malloc(sizeof(node)); 		p->out = i;  //每个人的编号：1,2,……,a 		if (list == NULL) 			list = p; 		else 			r->next = p; 		r = p; 	} 	p->next = list;   //首尾相连，构成一个环 	p = list; 	for (i = 1; i <= a; i++)   //打印链表 	{ 		printf("%d  ", p->out); 		p = p->next; 	} 	printf("\n"); 	p = list;    //加一句，让p重新指向链表开头 	for (i = 1; i<a; i++) 	{ 		for (j = 1; j<b; j++)  //从1数到b 		{ 			r = p;    //r记录出局人的前驱 			p = p->next; 		} 		printf("出局人:%d\n", p->out); 		r->next = p->next;   //出局，链表中删除节点的操作 		p = p->next;  //从出局人的下一个人开始数 	} } void main() { 	int z1, z2; 	printf("请输入总人数:"); 	scanf("%d", &z1); 	printf("请输入共有数:"); 	scanf("%d", &z2); 	YUESEFU(z1, z2); } //请输入总人数:请输入共有数:1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21 //出局人 : 7 //出局人 : 14 //出局人 : 21 //出局人 : 8 //出局人 : 16 //出局人 : 3 //出局人 : 12 //出局人 : 1 //出局人 : 11 //出局人 : 2 //出局人 : 15 //出局人 : 6 //出局人 : 20 //出局人 : 18 //出局人 : 17 //出局人 : 19 //出局人 : 5 //出局人 : 13 //出局人 : 4 //出局人 : 9