Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: fread函数读出来是乱码，求破。。。

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <memory.h>   int main() { 	int fLen; 	char *data; 	FILE *fr = fopen("F:\\b.txt","r"); 	if(fr) 	{ 		fseek(fr,0L,SEEK_END); 		fLen = ftell(fr); 		fseek(fr,0L,SEEK_SET);	 		data = (char*)malloc(fLen); //动态申请空间 		memset(data,0,sizeof(char)*fLen); 		fread(data,fLen,1,fr); 		printf("%s\n\n", data); 	} 	else 		printf("Open file failed!\n");  	free(data); 	fclose(fr); 	 	return 0; }

user: user-0
content: 引用 11 楼 mcmay 的回复:楼主用了puts()，但在puts()的参数的位置上却放了个字符数组的数组名。可以加一行，给这个字符数组封个尾，让它成为字符串：     fread(s,i,count,fp); s[count] = '\0'; puts(s);  果然木有乱码咯

user: user-2
content: memset(s,0,100);初始化数组

user: user-3
content: 楼主用了puts()，但在puts()的参数的位置上却放了个字符数组的数组名。可以加一行，给这个字符数组封个尾，让它成为字符串：     fread(s,i,count,fp); s[count] = '\0'; puts(s);

user: user-0
content: 引用 9 楼 max_min_ 的回复:[quote=引用 7 楼 chenailun1990 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 写进去数据的时候，是不是也是以二进制的方式写进去的呢？ 要怎样写才是二进制呢？[/quote]   fp=fopen("d:\\abc.txt","wb+"); fwrite(a,sizeof(char),3,fp);[/quote]   。。。还是一样的乱码，求破啊斑竹。。。

user: user-4
content: 引用 7 楼 chenailun1990 的回复:[quote=引用 1 楼 max_min_ 的回复:] 写进去数据的时候，是不是也是以二进制的方式写进去的呢？ 要怎样写才是二进制呢？[/quote]   fp=fopen("d:\\abc.txt","wb+"); fwrite(a,sizeof(char),3,fp);

user: user-5
content: 没有初始化额~

user: user-0
content: 引用 1 楼 max_min_ 的回复:写进去数据的时候，是不是也是以二进制的方式写进去的呢？ 要怎样写才是二进制呢？

user: user-0
content: 程序又做了如下修改： #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; void main( ) {    	int i=1; 	int count=10; 	FILE *fp; 	char s[100]; 	fp=fopen("d:\\abc.txt","r"); 	fread(s,i,count,fp); 	puts(s); 	fclose(fp); 	system("pause"); } 文档内容是：  运行结果如下：    但是，我用fgets函数却没有出现乱码。。。囧

user: user-6
content: unsigned char a[3]; unsigned char b[3]; 最好初始化 unsigned char a[3] = ""; unsigned char b[3] = "";  fp=fopen("d:\\abc.txt","rb+"); 打开是否成功要判断  fread(a,sizeof(char),3,fp); fread(b,sizeof(char),3,fp); 第三个参数应该为1吧 fread(a,sizeof(char),1,fp); fread(b,sizeof(char),1,fp);

user: user-7
content: A fundamental problem with binary I/O is that it can be used to read only data that has been written on the same system. 1.The offset of a member within a structure can differ between compilers and systems, because of different alignment requirements 2.The binary formats used to store multibyte integers and floating-point values differ among machine architectures

user: user-8
content: 用u-edit32 先打开你的文件看看里面的内容编码对不对 改成下面样子看看 unsigned char a[256]; memset(a,0,sizeof(a)); unsigned char b[256]; memset(b,0,sizeof(b)); fp=fopen("d:\\abc.txt","rb+"); if(fp==-1) return;

user: user-9
content: 提问的时候把你的情况说清楚点，文件里面怎样，读出来显示怎样。打开文件看看是不是乱码，是乱码的话读出来也是啦。 你的字符数组可以开大一点嘛，也有可能是这个原因哦

user: user-4
content: 写进去数据的时候，是不是也是以二进制的方式写进去的呢？
user-0 提问: 什么是 block hashes

回复:
user: user-1
content: 楼上正解，应该是大数据分块计算hash。

user: user-2
content: 假如有消息长n个字节，现在把它分成k个小块，标记为n1, n2, ..., nk. 然后执行下面的hash过程：  先计算n1的hash值，这个值连同n2会作为第二步hash函数的输入；依次类推，数学函数是  hash(hash(n[i-1]), ni) for i∈[2, k]   当然，第一个块需要特殊处理下。
user-0 提问: C中printf("^\b");中的\b怎么回退不了啊

回复:
user: user-0
content: 亲，我是新手，您抽出时间给我回答，我丢砖不是故意的，因为我第一次发帖，不懂地。同时谢谢你们哈

user: user-1
content: \b只是当前光标往前退一格，并不会清除内容

user: user-0
content: 您好：我的问题是对于printf("^\b");中的异或符号被\b删除不掉啊？？

user: user-2
content: #include <stdio.h>  int main(void) {     fprintf(stdout, "hello!");     fprintf(stdout, "\b");     fprintf(stdout, "world!\n");     return 0; }  看一下这个测试程序，测试结果是删除了hello后面的“！”符号。

user: user-3
content: 应该是printf("^\b");  引用 楼主 zch_1027452269 的回复:#include<stdio.h> #include<string.h>  int main(int argc,char *argv[]) { 	printf("\^\b"); 	puts(""); }
user-0 提问: 线程池中的一个互斥锁问题

回复:
user: user-0
content: 引用 2 楼 guochanoo7 的回复:你的这个work是局部变量，既不是static，也不是const，外面怎么能看见呢，然后你这样是想试用队列模型一边插入一边读取，这样有个坏处，对于锁的争用是很明显的，并发是上不去的，你可以试用多队列模型，或者是双缓冲多队列模型，将两个锁分开，只能帮到你这里了 我百度了下，是这么解锁的“每个线程有各自的线程栈，维护所有函数参数以及局部变量” 原来如此 ，大神谢谢了

user: user-1
content: 你的这个work是局部变量，既不是static，也不是const，外面怎么能看见呢，然后你这样是想试用队列模型一边插入一边读取，这样有个坏处，对于锁的争用是很明显的，并发是上不去的，你可以试用多队列模型，或者是双缓冲多队列模型，将两个锁分开，只能帮到你这里了

user: user-2
content: 那要看你是不是需要其他线程也看到这个变量值了。还有，就是你的这个work值会不会影响其他线程，要看你的逻辑是如何设计和要做成什么结果。
user-0 提问: 怎么选择椭圆曲线？a，b怎么确定

回复:
user: user-1
content: 引用 4 楼 hepfei90 的回复:[quote=引用 3 楼 fetag 的回复:] Let p>3 be prime. The elliptic curve y^2=x^3+ax+b over Z/pZ is the set of solutions (x,y)∈Z/pZ * Z/pZ to the congruence y^2=x^3+ax+b (mod p), where a, b∈Z/pZ are constants such that 4a^3+27b^2≠0 (mod p), together with a special point O called the point at infinity.      ----- Cryptography Theory and Practice 3rd edition  椭圆曲线中通常a,b已知，但需要满足 4a^3+27b^2≠0 (mod p) 这个条件。已知了a,b以后，over到Z/pZ上，就能计算出这个曲线上有多少个点。然后根据定义的 椭圆曲线加 操作，能计算出来x, 2x, ..., (p-1)x 这些离散的点。此处的x是曲线上任意点  请问a，b只需要满足 4a^3+27b^2≠0 (mod p) 这个条件吗？我使用随机数产生a，然后找到满足条件的b，但是后来解密的时候有时出现了大数越界，感觉找到的a，b还有什么限定条件，导致有时候不合理。[/quote] ECC在加密的过程中，有大量的exponential modulo calculation，要是用内置的数据类型，必然会溢出！你需要用专门的for number theory的大数库才行，比如GMP，NTL这些。 关于详细的步骤和范例，你可以参照我上面说的那本书《Cryptography-Theory and Practice 3ed》, Elliptic Curves 那一章。这本书网上有电子版，四处都能找得到~~

user: user-0
content: 引用 3 楼 fetag 的回复:Let p>3 be prime. The elliptic curve y^2=x^3+ax+b over Z/pZ is the set of solutions (x,y)∈Z/pZ * Z/pZ to the congruence y^2=x^3+ax+b (mod p), where a, b∈Z/pZ are constants such that 4a^3+27b^2≠0 (mod p), together with a special point O called the point at infinity.      ----- Cryptography Theory and Practice 3rd edition  椭圆曲线中通常a,b已知，但需要满足 4a^3+27b^2≠0 (mod p) 这个条件。已知了a,b以后，over到Z/pZ上，就能计算出这个曲线上有多少个点。然后根据定义的 椭圆曲线加 操作，能计算出来x, 2x, ..., (p-1)x 这些离散的点。此处的x是曲线上任意点  请问a，b只需要满足 4a^3+27b^2≠0 (mod p) 这个条件吗？我使用随机数产生a，然后找到满足条件的b，但是后来解密的时候有时出现了大数越界，感觉找到的a，b还有什么限定条件，导致有时候不合理。

user: user-1
content: Let p>3 be prime. The elliptic curve y^2=x^3+ax+b over Z/pZ is the set of solutions (x,y)∈Z/pZ * Z/pZ to the congruence y^2=x^3+ax+b (mod p), where a, b∈Z/pZ are constants such that 4a^3+27b^2≠0 (mod p), together with a special point O called the point at infinity.      ----- Cryptography Theory and Practice 3rd edition  椭圆曲线中通常a,b已知，但需要满足 4a^3+27b^2≠0 (mod p) 这个条件。已知了a,b以后，over到Z/pZ上，就能计算出这个曲线上有多少个点。然后根据定义的 椭圆曲线加 操作，能计算出来x, 2x, ..., (p-1)x 这些离散的点。此处的x是曲线上任意点

user: user-0
content: 引用 楼主 hepfei90 的回复:怎么选择椭圆曲线？a，b怎么确定。（最好有代码，没有的话希望原理比较清晰，谢谢！） 曲线格式y2 = x3 + ax + b 崩溃了，椭圆曲线算法啊，平方还搞什么啊

user: user-2
content: 都x的立方了，这还是椭圆曲线吗？
user-0 提问: 0x5470B49C (msvcr110d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0xCCCCCCCC 时发生访问冲突。

回复:
user: user-0
content: 如何调试到正常运行？

user: user-1
content: 引用 4 楼 download_wg 的回复:[quote=引用 2 楼 baohuan_love 的回复:] 犹未初始化的指针变量，编译器默认将未初始化的指针初始化为0xcc,而0xcc是被保护的数据区，因此程序崩溃。 一致搞不懂为啥不默认0x0000[/quote] 这个不需要搞懂，编译器有自己的初始化规则，自然有它的道理，就算初始化为0x00,这块内存一样是受保护的。

user: user-0
content: 改了还是不对的。

user: user-2
content: 引用SeqList*L; L=(SeqList *)init_SeqList; printf("请输入初始线性表中的元素个数："); scanf("%d",L->last);   细节问题，应该这样初始化L =(SeqList *)init_SeqList(); 逻辑错误大家可以帮你解决，细节问题LZ还是看好了再问.....

user: user-3
content: 引用 2 楼 baohuan_love 的回复:犹未初始化的指针变量，编译器默认将未初始化的指针初始化为0xcc,而0xcc是被保护的数据区，因此程序崩溃。 一致搞不懂为啥不默认0x0000

user: user-0
content: 不懂，可以就我这个问题说得明白点么？

user: user-1
content: 犹未初始化的指针变量，编译器默认将未初始化的指针初始化为0xcc,而0xcc是被保护的数据区，因此程序崩溃。

user: user-4
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
user-0 提问: 如何在二叉树上加上中序遍历线索~~~~

回复:
user: user-1
content: 引用 2 楼 u012257679 的回复:[quote=引用 楼主 u012257679 的回复:] 如图所示二叉树：  怎么在树上加上中序遍历线索？？？？求详细解题步骤~~~~~  求帮忙~~~ 额···· 不是要代码··· 要的是线索化之后的图[/quote]  这个很简单啊，线索二叉树无非就是每个带空指针的节点，让其空指针指向前驱(lchild)或者后续节点(rchild)就可以了。  中序遍历的顺序为： DHBEAFCJIKG  在每个节点前面的就是其前驱，在每个节点后面的就是其后续。这样只要某个节点的左或者右孩子为空： 如果左孩子为空，就让其左孩子指向前驱节点，如果没有前驱节点就继续指向空； 如果右孩子为空，就让其右孩子指向后续节点，如果没有后续节点就继续指向空。  节点D，中序遍历是第一个节点，前驱为空，所以左孩子继续为空，后续节点指向H； 节点G，中序遍历是最后第一个节点，前驱为K，所以将其左孩子指向G，而其右孩子继续为空，因为没有后续节点A,B,C,I，左右孩子均齐全，不用处理； 节点EFHIJK，分别在孩子为空的填上对应前驱后继即可。

user: user-1

user: user-0
content: 引用 楼主 u012257679 的回复:如图所示二叉树：  怎么在树上加上中序遍历线索？？？？求详细解题步骤~~~~~  求帮忙~~~ 额···· 不是要代码··· 要的是线索化之后的图

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>   typedef struct threaded_binary_tree btthreaded_t; typedef void (*visitor_t)(btthreaded_t *); typedef char bt_elem_t;   struct threaded_binary_tree { 	btthreaded_t	*l, *r; 	int				ltag, rtag; /* tag=0: child; tag=1: threaded */ 	bt_elem_t		e; };   #define NIL_ELEM(e) ((e) == ' ')   void btthreaded_create(btthreaded_t** root, bt_elem_t** elems, int* elemnum) { 	if (*elemnum == 0) return; // no more elements  	if (NIL_ELEM(**elems)) { 		*root = NULL; 		(*elems)++; (*elemnum)--; 	} else { 		// m-node 		*root = (btthreaded_t*)malloc(sizeof(btthreaded_t)); 		(*root)->e = *(*elems)++; (*elemnum)--; 		(*root)->ltag = (*root)->rtag = 0; 		// (l, r)-nodes 		btthreaded_create(&((*root)->l), elems, elemnum); // l-tree 		btthreaded_create(&((*root)->r), elems, elemnum); // r-tree 	} }  void inorder_travel(btthreaded_t* root, visitor_t visitor) { 	if (root == NULL) return;  	inorder_travel(root->l, visitor); 	if (visitor) visitor(root); 	inorder_travel(root->r, visitor); }  static void do_thread(btthreaded_t* root, btthreaded_t** prev) { 	assert(prev);  	if (root) 	{ 		do_thread(root->l, prev); 		if (root->l == NULL) { // the previous 			root->ltag = 1; 			root->l = *prev; 		} 		if (*prev && (*prev)->r == NULL) { // the posterior 			(*prev)->rtag = 1; 			(*prev)->r = root; 		} 		*prev = root; 		do_thread(root->r, prev); 	} }  void inorder_thread(btthreaded_t* root) { 	btthreaded_t *prev;  	if (root == NULL) return;  	prev = NULL; 	do_thread(root, &prev); 	prev->r = NULL; 	prev->rtag = 1; }   void print_node(btthreaded_t *node) { 	if (node == NULL) return;  	putchar(node->e);  	//putchar(node ? node->e : ' '); }   int main(void) { 	btthreaded_t *root = NULL; 	/*      A 	 *     / \ 	 *    B   C 	 *   /   / \ 	 *  D   E   F 	 */ 	bt_elem_t *elems = "ABD   CE  F  "; 	size_t elemnum = strlen(elems); 	visitor_t visitor = print_node;  	btthreaded_create(&root, &elems, &elemnum); 	inorder_travel(root, print_node); 	inorder_thread(root);  	getch(); 	return 0; }  供参考。
user-0 提问: 无需定义与输入输出，求指教！

回复:
user: user-1
content: 小写字母就是把函数int get_letter_index(char ch) {     if(ch>='a'&&ch<='z')         return ch - 'a';     return -1; } 改成这样就好了

user: user-1
content: //程序入口 int main(int argc, char* argv[]) { 	char* s = "AbcijKaBcdEXyzuvwx"; 	int wc[26] = {0};  	return main2(s, wc); }  //问题来源：CSD论坛-C语言板块 //统计字符串中的单词出现次数（不区分大小写） int main2(char* s, int wc[]) { 	int index; 	while(*s != '\0') 	{ 		index = get_letter_index(*s++); 		if(index == -1) 			continue; 		++wc[index]; 	}  	return 0; } //获取字符在字母表中的位置(不分大小写），如果不是字母则返回-1 int get_letter_index(char ch) { 	if(ch>='A'&&ch<='Z') 		return ch - 'A'; 	if(ch>='a'&&ch<='z') 		return ch - 'a'; 	return -1; }

user: user-2
content: 上来先转换成小写，然后用当前字符值减去'a'作为数组s的下标索引，加一即可。一次循环就可以搞定！

user: user-0
content: 还是无法通过啊

user: user-3
content: 需要判断是大写的还是小写的，可以通过调用库函数：isupper（）;和islower();

user: user-3
content: i=0;     while(s[i]!='\0')     {         if (s[i]>='a'&& s[i]<='z')         c[s[i]-'a']++;         if (s[i]>='A' && s[i]<='z')         c[s[i]-'A']++;         i++;     }
user-0 提问: 指针和数组名作为重载函数的参数时遇到的问题

回复:
user: user-0
content: 真的没办法吗，有没有谁能想到只需要1个形参就能实现重载的办法

user: user-1
content: void print(const int *p) { cout << *p << endl; }  void print(const int ＊ia, int size) { for (size_t i = 0; i != size; ++i) { cout << ia[i] << "  "; } cout << endl; }

user: user-2
content: VC编译不通过 print函数体已经存在 地址名也是一个指针， 只不过是一个指针常量 所以这样不算重载

user: user-3
content: 当数组当参数在函数传递的时候，指针和数组是一样的！

user: user-4
content: 数组到形参那会弱化成指针的，所以这俩个没有区别。。。
user-0 提问: 求助，如何实现EXCEL表的拆分

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:将Excel文件另存为.csv格式，然后用C语言处理，结果也保存为.csv格式，在Excel里面读取。就是这个方法了

user: user-1
content: 用Excel的odbc驱动，直接用sql语句，操作数据库那样操作excel

user: user-2
content: 用VBA吧。

user: user-1
content: 在网上找找读写excel表的方法就可以直接写程序实现了吧

user: user-3
content: 将Excel文件另存为.csv格式，然后就随便搞了

user: user-4
content: 将Excel文件另存为.csv格式，然后用C语言处理，结果也保存为.csv格式，在Excel里面读取。
user-0 提问: 求助，调用c编译的lib，库函数不识别自己定义的结构体

回复:
user: user-0
content: 引用 9 楼 angel_su 的回复:你是要自己编译x264，还是调用编译好了的库。貌似后者只需x264.h知道接口即可，不会参照其他建库用的文件... 已解决，不过还存在个问题，输出文件是YUV颜色空间貌似，放出来的颜色确实和我模拟的一样，可以通过参数设置输出为RGB颜色空间吗？

user: user-0
content: 引用 4 楼 zhxianbin 的回复:自己在 set.h 里面加上呢？ 不行，还是未定义，我的意愿是不想改lib内的文件，毕竟有许多的代码我没有那么长时间去理解，像汇编，cpu，c的多线程，时间没那么充裕

user: user-1
content: 自己在 set.h 里面加上呢？

user: user-0
content: 引用 1 楼 turingo 的回复:看看库的搜索路径是否配置好。  [quote=引用 楼主 u010950654 的回复:] 调用了x264的lib，可是编译时，set.h里的结构体未定义，在common.h里定义的，可是原工程里set.h里并没有包含common.h,纠结了，我是用c++编写的主程序，然后调用自己c写的函数，函数调用了x264lib，结果，  1>f:\vs-2010-x264-snapshot-20091005-2245\common\set.h(223): error C2065: “x264_t”: 未声明的标识符 set.h可是库里的啊，x264_t也是库里定义的啊[/quote] 项目，属性，VC++目录，包含目录，该加的都加进去了

user: user-0
content: 全部加进去了

user: user-2
content: 看看库的搜索路径是否配置好。  引用 楼主 u010950654 的回复:调用了x264的lib，可是编译时，set.h里的结构体未定义，在common.h里定义的，可是原工程里set.h里并没有包含common.h,纠结了，我是用c++编写的主程序，然后调用自己c写的函数，函数调用了x264lib，结果，  1>f:\vs-2010-x264-snapshot-20091005-2245\common\set.h(223): error C2065: “x264_t”: 未声明的标识符 set.h可是库里的啊，x264_t也是库里定义的啊

user: user-3
content: 你是要自己编译x264，还是调用编译好了的库。貌似后者只需x264.h知道接口即可，不会参照其他建库用的文件...

user: user-4
content: 适当调整附加包含目录的顺序再试试。 VC6：工具、选择、目录、显示目录为：Include files,路径：选中要调整顺序的行，按右上角的↑↓  另：学会使用grep或findstr命令在多个文件中搜索指定字符串。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项 这个我包含了，路径也正确，我的问题是，调用的库运行的时候报错，里面的变量未定义，当然这个变量也是库里定义的，问题是，别人运行正确，我的却报了这样的错误

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

回复:
user: user-0
content: 引用 1 楼 N_sev7 的回复:用深度搜索算法计算每一个顶点最终需要查询的步数 当计算完每一个顶点的的步数之后，根据步数想开始建立链表 英语不好，只能翻译成这样 不过最好去看下中文版 看下怎么翻译的就知道了 是中文版的，只是在描述这个算法的时候作者是直接贴了原版的英语描述。 不是关于英语的问题，我只是不知到第二点是怎么实现的，感觉很难实现 很难对应到书上的那个图展示的结果。我看的是第二版的，算法在339页，338页 有对应结果的那张图。

user: user-1
content: 用深度搜索算法计算每一个顶点最终需要查询的步数 当计算完每一个顶点的的步数之后，根据步数想开始建立链表 英语不好，只能翻译成这样 不过最好去看下中文版 看下怎么翻译的就知道了
user-0 提问: C语言中结构体成员的动态内存分配问题 [

回复:
user: user-1
content: 引用 6 楼 jw903 的回复:[quote=引用 4 楼 lm_whales 的回复:] C++ 11 以前是不可以的。 C++ 11 已经可以了。  折其实是语言实现方面的问题。 早期的C++ 认为，成员变量，不可以在定义类型的时候初始化； 因为类型定义时，该类型的变量还没有定义。 所以，也就没有地址，所以不能初始化。  C++ 11认为，类的成员变量，可以和函数内部的变量一样初始化；相当于给他一个缺省值。 在类对象定义时，再实现初始化的代码！ 就像函数内部定义的变量一样，在函数运行时初始化。 所以可以初始化。 刚用了VS2012，运行了一下，还是有问题，即声明结构体时，成员还是不能初始化[/quote] 我刚刚下了一个  code ::block 12.11 自带 MinGw 编译器，经过测试是可以的。 我现在用xp 无法安装 VS2012，所以没有测试   VS2012

user: user-0
content: 引用 4 楼 lm_whales 的回复:C++ 11 以前是不可以的。 C++ 11 已经可以了。  折其实是语言实现方面的问题。 早期的C++ 认为，成员变量，不可以在定义类型的时候初始化； 因为类型定义时，该类型的变量还没有定义。 所以，也就没有地址，所以不能初始化。  C++ 11认为，类的成员变量，可以和函数内部的变量一样初始化；相当于给他一个缺省值。 在类对象定义时，再实现初始化的代码！ 就像函数内部定义的变量一样，在函数运行时初始化。 所以可以初始化。 刚用了VS2012，运行了一下，还是有问题，即声明结构体时，成员还是不能初始化

user: user-2
content: 可以为结构体做一个默认构造函数，在构造函数中进行动态分配内存，建议在析构中释放。 例如： struct XXX {     char * pSty;     XXX()     {         pStr = (char*)malloc(sizeof(char)*20);     }     ~XXX()     {         if(pStr)         {             free(pStr);             pStr = NULL;         }     } }

user: user-1
content: C++ 11 以前是不可以的。 C++ 11 已经可以了。  折其实是语言实现方面的问题。 早期的C++ 认为，成员变量，不可以在定义类型的时候初始化； 因为类型定义时，该类型的变量还没有定义。 所以，也就没有地址，所以不能初始化。  C++ 11认为，类的成员变量，可以和函数内部的变量一样初始化；相当于给他一个缺省值。 在类对象定义时，再实现初始化的代码！ 就像函数内部定义的变量一样，在函数运行时初始化。 所以可以初始化。

user: user-3
content: struct student {         char fristname[20];         char *lastname=(char*)malloc(sizeof(char)*20);/*这里为lastname动态分配内存空间，编译时出错*/         int score; }; 这个东西叫结构体的定义，括号里面是成员列表，不可以是表达式，更不可以是语句 struct student st1; st1.lastname=(char*)malloc(sizeof(char)*20);/*但是为结构体变量st1的成员st1.liastname动态分配内存却是可行的*/ scanf("%s",st1.name); 这个st1是叫做student结构体变量，也可以说叫做这个结构体变量的定义，已经分配好内存了，你就可以操控内存了对里面的成员进行申请空间或者赋值等等。。。

user: user-4
content: “声明”一个结构体时，并没有为他分配任何空间。在“定义”结构体类型的变量时，才为变量分配空间。  如果在“声明”结构体时就为其成员动态分配一块内存，那么这块内存的指针要保存在哪里？

user: user-5
content: 动态分配内存是在运行期作的事情，编译期不会做！
user-0 提问: Jungle Roads 出问题，求解！

回复:
user: user-0
content: 引用 2 楼 yuzengyuan 的回复:代码不插在C/C++的标记符之间，这样没法看  什么意思？我没有理解清楚，求详解。

user: user-1
content: 代码不插在C/C++的标记符之间，这样没法看

user: user-0
content: 紧急 求回复!
user-0 提问: 如何将结构体转换为字符串？

回复:
user: user-0
content: 引用 5 楼 wangdahu888 的回复:我且问撸主,什么是字符串?????????我不懂，求大神指明。

user: user-0
content: 引用 8 楼 turingo 的回复:memcpy(str,&stud,sizeof(stud));是没有意义的语句。  [quote=引用 楼主 Sealional 的回复:] 结构体定义如下： struct Person {     char name[20];     int age; };  struct Student {     int num;     struct Person pers; }; 我声明一个结构体变量struct Student stud; 然后对stud的各个成员赋值，例如: stud.num = 101; memcpy(stud.pers.name,"seal",sizeof("seal")); stud.pers.age = 20; 接下来就要将这个结构体转换为字符串, memcpy(str,&stud,sizeof(stud)); 结果不对。求大神解答。[/quote]str是声明为char str[100]的。转换是肯定能转换的。只是我不知道我哪里出错了。

user: user-1
content: memcpy(str,&stud,sizeof(stud));是没有意义的语句。  引用 楼主 Sealional 的回复:结构体定义如下： struct Person {     char name[20];     int age; };  struct Student {     int num;     struct Person pers; }; 我声明一个结构体变量struct Student stud; 然后对stud的各个成员赋值，例如: stud.num = 101; memcpy(stud.pers.name,"seal",sizeof("seal")); stud.pers.age = 20; 接下来就要将这个结构体转换为字符串, memcpy(str,&stud,sizeof(stud)); 结果不对。求大神解答。

user: user-0
content: 引用 4 楼 wangdahu888 的回复:[quote=引用 3 楼 Sealional 的回复:] 回复user-4：我能说你很逗么？为什么不能？ 无量天尊,是撸主你太逗了......[/quote]不可能不能啊！我再去看看  引用 6 楼 suzhouxiao 的回复:楼主啊，你的结果不对是什么意思？你是怎么验证的。 你看下面的代码， 把struct 拷贝到char* ，然后再把char* 转换到struct* ,再打印出来OK啊。 不知道你为什么这么做，不过这样做结果肯定是对的。  	struct Person 	{ 		char name[20]; 		int age; 	};  	struct Student 	{ 		int num; 		struct Person pers; 	};  	struct Student stud; 	stud.num = 101; 	memcpy(stud.pers.name, "seal", sizeof("seal")); 	stud.pers.age = 20; 	 	char str2[100] = { 0 };  	memcpy(str2, &stud, sizeof(stud));  	struct Student stud2 = *((struct Student*)str2); 	cout << stud2.num << endl; 	cout << stud2.pers.age << endl; 	cout << stud2.pers.name << endl; 就是你这段程序一样。但是在用memcpy(str2, &stud, sizeof(stud));之后观察str2的值不对。而且下面输出的也不对。

user: user-2
content: 楼主啊，你的结果不对是什么意思？你是怎么验证的。 你看下面的代码， 把struct 拷贝到char* ，然后再把char* 转换到struct* ,再打印出来OK啊。 不知道你为什么这么做，不过这样做结果肯定是对的。  	struct Person 	{ 		char name[20]; 		int age; 	};  	struct Student 	{ 		int num; 		struct Person pers; 	};  	struct Student stud; 	stud.num = 101; 	memcpy(stud.pers.name, "seal", sizeof("seal")); 	stud.pers.age = 20; 	 	char str2[100] = { 0 };  	memcpy(str2, &stud, sizeof(stud));  	struct Student stud2 = *((struct Student*)str2); 	cout << stud2.num << endl; 	cout << stud2.pers.age << endl; 	cout << stud2.pers.name << endl;

user: user-3
content: 我且问撸主,什么是字符串?????????

user: user-3
content: 引用 3 楼 Sealional 的回复:回复user-4：我能说你很逗么？为什么不能？ 无量天尊,是撸主你太逗了......

user: user-0
content: 回复user-4：我能说你很逗么？为什么不能？

user: user-0
content: 而且我编写了一个用例。可以得到结构体中的num，name和age的存储空间是连续的，这样的话想来用memcpy来copy到str的时候应该不会出错才对啊！莫非是memcpy还有遇到什么就停止copy的机制？

user: user-4
content: 结构体是结构体，字符串是字符串怎么能这么转换？
user-0 提问: c语言标准库函数名括号问题

回复:
user: user-0
content: 我看的《c标准库》这本书,昨天搜了下linux源码,发现确实没有括号,看来是这本书才有的. 我以为标准库是一个具体的库,应该只是一个规范吧.  多谢各位热心的回答

user: user-0
content: 引用 5 楼 lin5161678 的回复:不是必须的 完全可以不加这个括号  普通函数是可以,但是我是想这里是不是有什么特殊的地方.比如是不是有可能什么防止宏展开. 不应该没什么原因吧,因为《c标准库》这本书不是所有函数名都带括号,就算可有可无,也应该保持风格一致吧.

user: user-1
content: _Check_return_ size_t  __cdecl strlen(_In_z_ const char * _Str);  vs2010   #include <string.h> size-t strlen(conat char *a);  C Standard Library.pdf   size_t strlen(cs) return length of cs  The C programming Language  lz 看得那一版

user: user-2
content: 不是必须的 完全可以不加这个括号

user: user-2
content: 引用 3 楼 worldy 的回复:size_t (strlen)(const char *s) 严格的说这不是函数，而是函数指针，说白了，这是定义一个指针变量别闹 不是加了括号就是函数指针

user: user-3
content: size_t (strlen)(const char *s) 严格的说这不是函数，而是函数指针，说白了，这是定义一个指针变量

user: user-4
content: waiting big cow！

user: user-5
content: 抱着好奇的态度和楼主一起等答案

user: user-2
content: 引用 6 楼 dalinocp 的回复:普通函数是可以,但是我是想这里是不是有什么特殊的地方.比如是不是有可能什么防止宏展开. 不应该没什么原因吧,因为《c标准库》这本书不是所有函数名都带括号,就算可有可无,也应该保持风格一致吧. 那本书本来就写得怪怪的  像  return 表达式; 完全没有必要加 ()  里面经常加 实在多余

user: user-6
content: 没有啊，你看的那里的“山寨”库函数？

user: user-7
content: 请具体给出string.h文件的全路径。
user-0 提问: 有个随机算法请教下

回复:
user: user-0
content: 引用 2 楼 caozhy 的回复:参考： http://zh.wikipedia.org/zh-cn/%E7%94%9F%E6%97%A5%E5%95%8F%E9%A1%8C 没那么复杂，已经解决了，谢谢版主！

user: user-1
content: 随机的吧，lz有没有结果啊？

user: user-2
content: 参考： http://zh.wikipedia.org/zh-cn/%E7%94%9F%E6%97%A5%E5%95%8F%E9%A1%8C

user: user-3
content: 说了是随机，那就只能随机了
user-0 提问: 关于char*判断长度的问题,急求~~~~

回复:
user: user-1
content: void HexDump(char *buf,int len) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%04x -",i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }   不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-0
content: 好吧,看来只能这样了..唉

user: user-2
content: 如果交互协议是基于文本的, 不妨用换行, http smtp pop 等都这样的

user: user-2
content: 要么定长 要么提前告知长度

user: user-3
content: 引用 2 楼 fyssqzh555 的回复:[quote=引用 1 楼 user-3 的回复:] 定长消息头，先接消息头！消息头里赋值后面有效数据的长度！ 接收端通过消息头数据长度，再接收对应长度数据！  额,版主大大确定没有好的方法判断结束了呗?那我就只能按你说的换算法来接受数据了..[/quote]  如果结束符是有效数据呢？ 所以特别的字符作为结束符是不可靠的！所以还是定长比较靠谱的！

user: user-0
content: 引用 1 楼 user-3 的回复:定长消息头，先接消息头！消息头里赋值后面有效数据的长度！ 接收端通过消息头数据长度，再接收对应长度数据！  额,版主大大确定没有好的方法判断结束了呗?那我就只能按你说的换算法来接受数据了..

user: user-3
content: 定长消息头，先接消息头！消息头里赋值后面有效数据的长度！ 接收端通过消息头数据长度，再接收对应长度数据！
user-0 提问: C语言读取目录下的指定类型的文件,把所有文件的内容写入到一个txt文件中

回复:
user: user-1
content: FILE *f; char ln[80]; int n; while (1) {  if (NULL==fgets(ln,80,f)) break;  if (1==sscanf(ln,"#%d",&n)) {    //ln是以#数字开头  } }

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:system("cmd /c copy d:\\mydir\\*.txt d:\\all.txt");//将d:\mydir\*.txt的内容写入到d:\all.txt中。赵老师！谢谢你，这个问题解决了，还有一个问题就是我用 fgets（）读取每一行的数据。 用strstr（）识别这些行： #SFX  #SONG 那么怎么识别出 #001 #002 #003 .... .... 这些‘#’+数字（有可能是3位数，有可能是四位数）的行呢。

user: user-2
content: type *.txt >log.log

user: user-3
content: c语言的话！ 就逐个读文件，写到新的同一个文件中就好了！ 基本的文件操作  //google下这几个api的用法，自己动手写写 fopen();  fread(); fwrite(); fclose();

user: user-1
content: system("cmd /c copy d:\\mydir\\*.txt d:\\all.txt");//将d:\mydir\*.txt的内容写入到d:\all.txt中。

user: user-4
content: 1、先用findfirst/findnext搜索所有txt文件； 2、再用fopen/fclose/fread/fwrite逐个以二进制的方式读取txt文件的全部内容，依次写入新文件中。  引用 楼主 tanqiyingk 的回复:例如在目录下面有文件：1.txt 2.txt 3.txt 1.txt内容为： ----------------------- #BGP: #white #SONG    ML101 #001	short00	0	0	250 #SFX    SP00_C001_S1 ------------------------  2.txt内容为: ------------------------ #002	short01	0	0	250 #003	short02	0	0	250 #004	short03	0	0	250 ------------------------  3.txt内容为： ------------------------ #007	short06	0	0	250 #SFX    SP00_C003_S1 #END ------------------------  需要将这个目录下面这些txt文件的内容读取到一个txt文件中。注意考虑多个txt文件的情况 希望懂的朋友解答下，非常感谢！！！
user-0 提问: c语言新手问题，谢谢

回复:
user: user-1

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main(void) { 	char   arr[100] = "7+103-10"; 	char   tmp[10]; 	int    i, j; 	 	for (i = 0, j = 0; i < 100; i++) { 		if (arr[i] > 47 && arr[i] < 58) 			tmp[j++] = arr[i]; 		else { 			tmp[j] = '\0'; 			j = 0; 			printf("%d\n", atoi(tmp)); 			if (arr[i] == '\0') break; 		} 	} 	 	return 0; }  输出结果： 7 103 10

user: user-3
content: 引用 楼主 u012824563 的回复:我在用c语言编一个计算机的程序时，我首先把表达式放在字符数组里，然后一个一个拿出，但是如果数字字符是‘7’，我就可以用ascii转换成数字，但是如果是2位数的话，我就不知道了，想问下各位怎么把字符变成字符串，然后我就可以用atoi函数来转换了！！！谢谢  lz 的意思是字符数组中放了多个字符串？  	char *p;  	char s1[] = "The summer soldier, the sunshine patriot";   	p = strtok(s1, " "); 	printf(p); 	do{ 		p = strtok(NULL, ", "); //('\0', ", "); 		if (p) printf("%s\n", p); 	}while(p);

user: user-4
content: char test[10] = "0123456789"; test[0] = 0; test[1] = 1; ..

user: user-5
content: 引用 2 楼 sanjiewang 的回复:遍历时，存放字符串的变量，至下一个字符的 ascii 的码，非48  57之间，则用\0结束，将保存的临时变量使用atoi进行转换  修改错别字

user: user-5
content: 遍历时，存放字符串的遍历，至下一个字符的 ascii 的码，非48  57之间，则用\0结束，将保存的临时变量使用atoi进行转换

user: user-6
content: char str[10]; str[0] = '7'; str[1] = '2'; str[2] = '\0';  引用 楼主 u012824563 的回复:我在用c语言编一个计算机的程序时，我首先把表达式放在字符数组里，然后一个一个拿出，但是如果数字字符是‘7’，我就可以用ascii转换成数字，但是如果是2位数的话，我就不知道了，想问下各位怎么把字符变成字符串，然后我就可以用atoi函数来转换了！！！谢谢
user-0 提问: 怎么控制CPU的使用率呢

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:吃饱了撑的！ hehe!

user: user-1
content: 吃饱了撑的！

user: user-0
content: 引用 2 楼 Adol1111 的回复:你电脑是双核的吧，编程之美里介绍的是单核的系统，双核的话要让单核心保持100%，另一核心不进行其他操作。看看这里。 谢谢！Core i5四核，那是不是开两个死空循环的线程？

user: user-2
content: 你电脑是双核的吧，编程之美里介绍的是单核的系统，双核的话要让单核心保持100%，另一核心不进行其他操作。看看这里。

user: user-3
content: 你要确保你的电脑只有你的程序在运行
user-0 提问: wireshark中包含的头文件不存在，是怎么回事？

回复:
user: user-0
content: 根据网上的教程，在VS下编译成功wireshark后，确实生成了这个文件，多谢了

user: user-1
content: 引用 3 楼 phis4 的回复:包含是以 "" 引用， 而不是<>引用，应该是源码目录下吧，回头把整个硬盘搜一下， 看有没有这个文件。 楼上说的动态生成是怎么回事呢？ 源码目录下倒是有 dtd_grammar.lemon 的脚本，难道要学这个脚本语言先？ 看看里面的readme文件， 如果不是在当前代码目录下，可能就是动态生成的！需要执行某个脚本！

user: user-2
content: 引用 3 楼 phis4 的回复:包含是以 "" 引用， 而不是<>引用，应该是源码目录下吧，回头把整个硬盘搜一下， 看有没有这个文件。 楼上说的动态生成是怎么回事呢？ 源码目录下倒是有 dtd_grammar.lemon 的脚本，难道要学这个脚本语言先？  有可能是 Lex + Yacc(Linux) 或者 Flex + Bison 之类的工具，又或者编程者自己定义的工具将 dtd_grammar.lemon 转换成 dtd_grammar.h 文件。  有个建议： 如果你使用Linux或者MSys,MinGW的话，可以查找下Makefile之类的文件，看哪个地方有对 dtd_grammar.lemon 进行处理； 如果使用Windows的话，通常应该有VC工程，可查看工程配置： Properties -> Build Events -> ... 如果文件 dtd_grammar.lemon 被加到工程里的话，可以在VC Solution Explorer中选中该文件， 然后右键 Properties -> General -> Tool 查看是否有外部工具对该文件进行处理。

user: user-0
content: 包含是以 "" 引用， 而不是<>引用，应该是源码目录下吧，回头把整个硬盘搜一下， 看有没有这个文件。 楼上说的动态生成是怎么回事呢？ 源码目录下倒是有 dtd_grammar.lemon 的脚本，难道要学这个脚本语言先？

user: user-2
content: 不了解wireshark源代码。 除了楼上说的可能性，还有可能就是编译过程动态产生了 dtd_grammar.h 这个头文件，编译完成后又删除了该文件。

user: user-3
content: 那么dtd_grammar.h就是在搜索路径中。  引用 楼主 phis4 的回复:wireshark 的源代码dtd_parse.c文件中有一行头文件包含语句#include "dtd_grammar.h"，但在整个源代码的目录下都没有dtd_grammar.h这个文件，而编译却可以通过，请问高手是怎么回事？
user-0 提问: 系统题目，无需定义与输出，请帮忙差错，谢谢！

回复:
user: user-1
content: 引用 1 楼 shangyu0801 的回复: 1: if(a[i]<min){ min=a[i]; b=i; } //这里应该有{} 2: //逻辑不对吧。不知道楼主是不是理解了题目的意思 1)需要给a数组赋值，是连续的偶数 2)对于a数组连续求M个数的平均值放入b里。 1-->  for(i = 0; i < n; i++) {    a[i] = 2+i*2; } 2-->  int k =0,sum=0; for(i =0,j=1; i< n;i++) {   sum+=a[i];//累加前m个数   if(j == m)   {      b[k++] = sum/(float)m;      j=1;sum=0; ----->j++;    } }     //少了个j++;我没跑，大概是这个意思吧。楼主可以参考下。呵呵。

user: user-1
content: 1: if(a[i]<min){ min=a[i]; b=i; } //这里应该有{} 2: //逻辑不对吧。不知道楼主是不是理解了题目的意思 1)需要给a数组赋值，是连续的偶数 2)对于a数组连续求M个数的平均值放入b里。 1-->  for(i = 0; i < n; i++) {    a[i] = 2+i*2; } 2-->  int k =0,sum=0; for(i =0,j=1; i< n;i++) {   sum+=a[i];//累加前m个数   if(j == m)   {      b[k++] = sum/(float)m;      j=1;sum=0;    } }

user: user-0
content: 十分感谢，运行通过了
user-0 提问: 彩虹表规约函数问题

回复:
user: user-0
content: 密码书和网上没有这个R函数构造的中文资料啊 英文不好 头都大了 最后也没解决

user: user-1
content: 这都是需要特别专业的密码学知识了吧 估计坛子里面很少有这样的大神 不如自己再翻翻密码学的数据看有没有相关知识 或者更深入的了解一下彩虹表技术的内幕

user: user-0
content: 求个大神回答 小弟跪谢

user: user-0
content: 也没有人回答啊 自己顶一下
user-0 提问: 关于二叉树的一个问题

回复:
user: user-0
content: 引用 2 楼 N_sev7 的回复:你可以自己在纸上试着建一颗这样的数(根节点为1,1)， 建几层之后你会发现其实是有规律的，并不一定是要遍历按整棵树， 而且比如你输入41,1这数据，整棵树中有好些41,1的节点的 你可以试着写写 其实我想问的是，那个所谓的数学方法到底指的是什么？

user: user-1
content: 你可以自己在纸上试着建一颗这样的数(根节点为1,1)， 建几层之后你会发现其实是有规律的，并不一定是要遍历按整棵树， 而且比如你输入41,1这数据，整棵树中有好些41,1的节点的 你可以试着写写

user: user-2
content: http://baike.baidu.com/link?url=zoUIwykilfP1IkvGMPcJcmllWyYEWT441ZR2zLriH7M1xJv-uu8_ndXVSpNK2UYz

user: user-3
content: 参考一下： #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <string.h>   typedef struct binary_tree bitree_t; typedef char btelem_t; typedef void (*visitor_t)(bitree_t *);  struct binary_tree { 	bitree_t* l; 	bitree_t* r; 	btelem_t  e; };   #define NIL_ELEM(e) ((e) == ' ')   // create binary with in-order way. void create_bitree(bitree_t** root, const btelem_t** elems, int* elemnum) { 	if (*elemnum == 0) return; // no more elements  	if (NIL_ELEM(**elems)) { 		*root = NULL; 		(*elems)++; (*elemnum)--; 	} else { 		// m-node 		*root = (bitree_t*)malloc(sizeof(bitree_t)); 		(*root)->e = *(*elems)++; (*elemnum)--; 		// (l, r)-nodes 		create_bitree(&((*root)->l), elems, elemnum); // l-tree 		create_bitree(&((*root)->r), elems, elemnum); // r-tree 	} }  void preorder(bitree_t* root, visitor_t visitor) { 	if (root == NULL) { 		//if (visitor) visitor(root); 		return; 	}  	if (visitor) visitor(root); 	preorder(root->l, visitor); 	preorder(root->r, visitor); }  void inorder(bitree_t* root, visitor_t visitor) { 	if (root == NULL) return;  	inorder(root->l, visitor); 	if (visitor) visitor(root); 	inorder(root->r, visitor); }  void postorder(bitree_t* root, visitor_t visitor) { 	if (root == NULL) return;  	postorder(root->l, visitor); 	postorder(root->r, visitor); 	if (visitor) visitor(root); }    void print_node(bitree_t *node) { 	if (node == NULL) return;  	putchar(node->e);  	//putchar(node ? node->e : ' '); }    int main(void) { 	bitree_t *root = NULL; 	btelem_t *elems = "ABD   CE  F  "; 	size_t elemnum = strlen(elems); 	visitor_t visitor = print_node;  	create_bitree(&root, &elems, &elemnum);  	printf("pre-order: "); 	preorder(root, visitor); 	putchar('\n'); 	 	printf("in-order: "); 	inorder(root, visitor); 	putchar('\n');  	printf("post-order: "); 	postorder(root, visitor); 	putchar('\n');  	getch(); 	return 0; }

user: user-1
content: 引用 3 楼 piforange 的回复:[quote=引用 2 楼 N_sev7 的回复:] 你可以自己在纸上试着建一颗这样的数(根节点为1,1)， 建几层之后你会发现其实是有规律的，并不一定是要遍历按整棵树， 而且比如你输入41,1这数据，整棵树中有好些41,1的节点的 你可以试着写写 其实我想问的是，那个所谓的数学方法到底指的是什么？[/quote] 应该是类似树的生长公式吧 然后用公式就可以求出输入的节点的位置
user-0 提问: 如何将一个补码提取出来

回复:
user: user-0
content: 如果是负数的话，直接将一个16位的无符号数强制转换为有符号数，这样不会出错吗？

user: user-1
content: /** 算法已经没什么可以精简的了，只是冗余代码太多，这样就好了 */ INT16 RTO = (pCh->WordInfo[1] >> 6) & 0x0000FFC0; ROT >>= 6;  引用 楼主 laomig 的回复:我做的一个通信程序中，有一个32位（bit31~bit0）的字中，bit12至bit21是一个10位的补码，最高位为符号位。我需要将这个数据提取出来，并赋值给一个16位有符号整数。 我的程序大概这样 UINT32 WordInfo=pCh->WordInfo[1]; INT16 RTO=0; UINT16* pUINT16=NULL;  pUINT16=(UINT16*)&RTO; *pUINT16=(WordInfo>>6)&0x0000FFC0; ROT>>=6;  结果正确，但是想请教各位大虾有没有更好的做法。

user: user-2
content: RTO和ROT不是一回事！ INT16 RTO=(INT16)(((UNIT16)((((UINT32)(pCh->WordInfo[1]))>>6)&0x0000FFC0))>>6);
user-0 提问: 数据结构中的线性表程序

回复:
user: user-1
content: 个人觉得 除了主函数有些长， 其他都很好了 注释写多了也不是什么好事

user: user-2
content: main函数主要调用其他函数，然后把函数之间的结构写好，看着会比较舒服啊。

user: user-3
content: 1. 除了声明的地方一句注释都没有？这貌似不太好。个人觉得关键、复杂的语句注释一下比较好。还有在什么的时候不仅仅只解释这个函数干嘛的。我一般用下面这种方式，仅供参考： /****************************************** * 函数名称：  * 入口参数：  * 返 回 值：  * 全局变量：  * 调用函数： * 功能描述：  * 备    注： *******************************************/  2. 变量最好不要都是些i,p,e,l之类的，最好让别人一看就知道你这个变量是干嘛的。

user: user-4
content: main函数体不要搞这么长了！ 丢一个接口出来实现就好了！

user: user-5
content: 整体不错，主函数需要减负！  个人习惯是把main函数放到所有函数的最后

user: user-6
content: 引用 4 楼 N_sev7 的回复:个人觉得 除了主函数有些长， 其他都很好了 注释写多了也不是什么好事 我的建议是无用的注释多了不是好事，但是对于楼主现在的注释情况是太少了，每个函数最好都添加一些注释，在函数里关键点，不易理解的地方都可以添加一些注释。 写代码的人，多能体会以下看代码的人，这样的代码才比较人性化@
user-0 提问: 求助！！！有符号二进制转化成十进制

回复:
user: user-1
content: //将1-6字节不定长有符号二进制byte数组转为十进制数 #include <stdio.h> #include <stdlib.h> #include <time.h> unsigned char b[6]; int t,n,i,s; __int64 d; int main() {     srand(time(NULL));      for (t=0;t<20;t++) {         n=1+rand()%6;         d=0i64;         for (i=0;i<n;i++) {             b[i]=rand()%256;             if (i==0) {                 if (b[i]>127) s=1;                 else          s=0;             }             d=d*256i64+(__int64)b[i];             printf("%02X ",b[i]);         }         if (s) d=d-(1i64<<(n*8));         printf("=> %I64d\n",d);     }     return 0; } //A9 EC 7A 3C 63 96 => -94641848556650 //10 01 B3 => 1049011 //42 06 => 16902 //33 85 EF 7D => 864415613 //26 66 => 9830 //B3 8E B8 F7 31 0E => -84049406775026 //D1 FE => -11778 //C7 67 93 => -3709037 //DC => -36 //DB 94 28 22 46 14 => -40045601733100 //C0 => -64 //D2 0D 14 08 85 B3 => -50521364200013 //06 23 => 1571 //3C 5C A5 81 => 1012704641 //F8 0A E0 2D => -133504979 //9E => -98 //F1 C8 7C => -931716 //8F => -113 //52 51 C3 => 5394883 //64 9C 9B => 6593691 //

user: user-1
content: 引用 6 楼 my_live_123 的回复:分清大小端，取多少字节，你告知，从高位到低位循环遍历每一位，每次循环把上次的结果左移一位，即乘2.循环结束即搞定了！ 费那事儿！

user: user-2
content: 分清大小端，取多少字节，你告知，从高位到低位循环遍历每一位，每次循环把上次的结果左移一位，即乘2.循环结束即搞定了！

user: user-3
content: 比如10000000到底是128还是-1？

user: user-3
content: 不定长那么哪个是符号位呢？

user: user-4
content: int BinToDec( BYTE * p, int nCount ) {     int n = 0;     for( int i = 0; i < nCount; ++ i )     {          n = ( n * 2 ) + p[ i ];     }     return n; }

user: user-5
content: 大数运算用GMP库，参考http://blog.csdn.net/turingo/article/details/8249799  引用 楼主 u012815293 的回复:用C语言实现，将1-6字节不定长有符号二进制byte数组转为十进制数
user-0 提问: C语言快速的排序函数看不懂了

回复:
user: user-1
content: 快排的原理先看看吧，光看代码有多大用啊

user: user-2
content: 问题2：swap(int v[],int i,int j)这句意思是不是将数组v和整型i,j交换位置？如果是为什么要写这样一句啊？如果不是那是什么意思呢？ 答：这条语句的意思是将数组v的第i个和第j个变量交换位置。如果你连这句话都看不懂，那我建议你不要研究什么算法了，先把基础知识掌握好。

user: user-3
content: 快排，简单写就一递归而已。

user: user-4
content: 先把你传进来的函数每个参数的意思理解清楚吧， 网上再看看快排序的理论知识，自己画画！

user: user-5
content: 你应该先看懂快排是什么意思，然后再来看代码的部分。我觉得你连快排的原理还没搞懂。

user: user-0
content: 引用 2 楼 caozhy 的回复:这根本就不是一个合法的程序，连括号都不匹配。一个错误的程序不值得讨论。 程序没错误，就是不完整

user: user-0
content: 引用 3 楼 junlinfushi 的回复:话说，你理解一下快速排序算法，自己都可以写出来了。快速排序不难的 这是我在网上找的，不是我写的

user: user-6
content: 话说，你理解一下快速排序算法，自己都可以写出来了。快速排序不难的

user: user-7
content: 这根本就不是一个合法的程序，连括号都不匹配。一个错误的程序不值得讨论。

user: user-8
content: 话说我也看不懂
user-0 提问: 一个基于SDK32和程序, 想实现以下这样的功能, 请给一个思路.

回复:
user: user-1
content: 是手机开发吗?  没有开发过手机程序,  不过我猜想, 肯定有什么方法能拦截掉这个事件, 然后自己作处理, 不过, 这可能是启动器响应的多.

user: user-2
content: MFC更好一点吧 也可以在里面使用SDK
user-0 提问: 求〔C＋＋〕表达式分析的问题，输入“C＋＋表达式”，输出“语法树”...

回复:
user: user-1
content: 还是用LALR吧, 你上面列的几个操作符在 LALR 下都没有二义性.. 你只要不像cpp样把你的脚本也搞个无比无聊的GP的话基本上用 LALR 压力不大 . 随便找个现成的LALR parser 吧, bison 啥的 .. 或者像我一样写个预处理器, 直接在 C 代码里写 EBNF/RegExp 然后自动生成对应的 PDA/DFA .. 我无聊的写了一个支持UNICODE的DFA的生成器 ...  我打算在无聊的时候写一个可以运行在RTOS上的, 多线程的, 可选GC的, 可JIT运行也可以直接生成对应的C语言目标代码的一个脚本.. 脚本的解析器准备用脚本自己自举.. 运行环境用C写..

user: user-2
content: C,C++ 函数调用也是表达式，除非简化一下（不考虑函数），否则比较困难。 但是不考虑函数，构造函数，要不要考虑呢？ 至于同时可以看作，单目运算符和双目运算符的运算符； 如果缺少操作数 就是单目运算。 如果不缺少就是双目运算符，把他们当作两个运算符处理就是了。 如果单目运算符，有两个不同含义也当作两个运算符处理就是了。  如果处理 new  注意 placement new 和 一般的new 的不同。      new 和 new [] 的不同。      p = new A;     new (p) A;//placement new     p = new A[10];     new (p) A[10];//placement new       我不是大牛，只是提供点意见。可以吗？

user: user-0
content: 引用 18 楼 sinservice 的回复:用龙书前100页，写一个YACC程序。  如果觉得难，我可以给你我写的参考代码。  我写的这个YACC，对一个复杂到6000个状态的文法集，用40秒（在我原来破机器上）。  这位仁兄，请将你写的YACC和使用说明发到我邮箱好么？观摩学习..... sdhexu@hotmail.com

user: user-3
content: 引用 2 楼 sdhexu 的回复:对于大牛的疑惑............     论坛里真的有大牛么？我所看到的大牛，只是分多一些而已....对于简单的问题，大家都抢着去回答，都以大牛的姿态去指点人家.....对于复杂的问题，都视而不见.........    有木有！！！！！ 我的确会选择性回答，但并不是视而不见，只是不想误人子弟而已，因为我本身就不是大牛...论坛的话，主要还是讨论问题，没有说谁一定是对的。除了个别人会以大牛姿态来指点别人，坚持说自己一定是对的，一定要别人相信自己的方法，但这类人毕竟是少数。  你这个问题，用LR(1)、LALR应该都可以，但如果你的输入很复杂的话，还是会有问题的。我对编译原理不熟就不多说了。和楼上说的一样，建议参考下龙书的YACC。

user: user-4
content: 使用 Flex & Bison，可以解决你这些问题。。easy

user: user-5
content: 参考Tiny C相关源代码。

user: user-5
content: 参考gcc相关源代码。

user: user-5
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-6
content: 我说明一下：     我研究编译器理论N年了，但我一直否弃使用LALR，我写的YACC生成的表是 标准 LR（1）的。

user: user-6
content: 用龙书前100页，写一个YACC程序。  如果觉得难，我可以给你我写的参考代码。  我写的这个YACC，对一个复杂到6000个状态的文法集，用40秒（在我原来破机器上）。

user: user-0
content: 引用 15 楼 taodm 的回复:void f() #ifdef X ; #else {return;} #endif 这你准备怎么整？ 如果你想做一个完完全全的C++代码分析器，我的建议是放弃，没戏。 我就是要搞一个完完全全的C＋＋代码解释器。用于我的游戏引擎，作为脚本系统。  void f() 是一个语句。 #ifdef x 是预编译指令。这些都容易解析的。  我词法分析器已经搞定，语法分析就差表达式了。语义分析就是进行一些错误检查，然后就是目标代码了。我相信，能够实现的。

user: user-7
content: void f() #ifdef X ; #else {return;} #endif 这你准备怎么整？ 如果你想做一个完完全全的C++代码分析器，我的建议是放弃，没戏。

user: user-8
content: 先好好考虑一下，晚些时候再回复你

user: user-0
content: 引用 12 楼 uuuououlcz 的回复:class::static和namespace::fun的::，?:三目运算符，,逗号运算符，各种 operation= 运算符，还是比较复杂的  嗯嗯。是的。  所以递归下降啊，很麻烦。

user: user-8
content: class::static和namespace::fun的::，?:三目运算符，,逗号运算符，各种 operation= 运算符，还是比较复杂的

user: user-0
content: 引用 9 楼 sdhexu 的回复:[quote=引用 7 楼 uuuououlcz 的回复:] lz的表达式可包含sizeof()、new、delete还有各种cast？  是的，不过new 和 delete，我会把他们当作一个“语句”来处理。[/quote] 确切的说，delete做为语句来处理，new 还是一个表达式。new是一个单目运算符。不过它很容易识别，不像 +、－、*、&，既可以单目，也可以双目。

user: user-8
content: 如果还要具备检测语法错误的功能的话，貌似就有点难了

user: user-0
content: 引用 7 楼 uuuououlcz 的回复:lz的表达式可包含sizeof()、new、delete还有各种cast？  是的，不过new 和 delete，我会把他们当作一个“语句”来处理。

user: user-0
content: 引用 6 楼 taodm 的回复:你想太多了。  好吧。即便是我用递归下降分析，那么怎么区别一个运算符是单目的，还是双目的啊。请指点。谢谢啊。

user: user-8
content: lz的表达式可包含sizeof()、new、delete还有各种cast？
user-0 提问: 一个关于pipe的小问题

回复:
user: user-0
content: 谢谢各位的热心回帖

user: user-1
content: 引用 楼主 wanren13 的回复:如果在一个程序里pipe分别让子进程和父进程写读，父进程需要使用wait()函数吗？  例如：  int fd[2]; pipe[fd];  pid_t pid = fork();  if(pid == 0){ close(fd[0]); write(fd[1], "Hello", 5); }  else if(pid > 0){ wait(NULL); //这里需要用wait吗？ char buf[BUFSIZ]; close(fd[1]); read(fd[0], buf, BUFSIZ); }   个人感觉，如果用了read，进程就会被阻挡，直到子进程的write结束，所以不用wait子进程。 但是我不是很确定，不知道这里有没有其他的例外？  请版里的大侠指点一二，小弟不胜感激。 可以放心的，可以不加wait(NULL); read会阻塞直到写完的。

user: user-2
content: int main(void) {     pid_t   pid;     int     status;      if ((pid = fork()) < 0)         err_sys("fork error");     else if (pid == 0)              /* child */         exit(7);      if (wait(&status) != pid)       /* wait for child */         err_sys("wait error");     pr_exit(status);                /* and print its status */      if ((pid = fork()) < 0)         err_sys("fork error");     else if (pid == 0)              /* child */         abort();                    /* generates SIGABRT */      if (wait(&status) != pid)       /* wait for child */         err_sys("wait error");     pr_exit(status);                /* and print its status */      if ((pid = fork()) < 0)         err_sys("fork error");     else if (pid == 0)              /* child */         status /= 0;                /* divide by 0 generates SIGFPE */      if (wait(&status) != pid)       /* wait for child */         err_sys("wait error");     pr_exit(status);                /* and print its status */      exit(0); }

user: user-3
content: read函数默认是会阻塞，因此只要有内容写入我觉得可以读到内容的，wait的作用是阻塞等待某个子进程退出后做清理工作的，LZ不用调wait来让子进程退出后再让read函数读管道中的内容。 另外pipe是个函数，调用的时候用pipe(fd);

user: user-4
content: 嗯，需要的，不过不是在那个位置，而是在read之后的。

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 2 楼 wanren13 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 管道是单向的，若父进程向管道里写，子进程从管道里读，那么若父进程不写在进程就会阻塞着去读。即，如果管道里有数据那么就会告诉子进程去都，反之依然。  你好，谢谢你的回答。  在我提供的例子里，会不会父进程先进行，子进程还没有机会做任何事情，父进程就先结束了？[/quote] 父进程先执行或者子进程先执行都是可能的，若父进程先执行，但是子进程没有执行完，父进程是不会退出的，因为wait();没有执行。[/quote]  看来是我的问题不够清楚。。。  我就是想问在我提供的例子里，wait（）是必须的吗？

user: user-0
content: 引用 3 楼 user-5 的回复:没有例外哈，read循环读到0为止，再进入wait回收一下资源就可以了。  所以说不需要加wait是吗？

user: user-4
content: 引用 2 楼 wanren13 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 管道是单向的，若父进程向管道里写，子进程从管道里读，那么若父进程不写在进程就会阻塞着去读。即，如果管道里有数据那么就会告诉子进程去都，反之依然。  你好，谢谢你的回答。  在我提供的例子里，会不会父进程先进行，子进程还没有机会做任何事情，父进程就先结束了？[/quote] 父进程先执行或者子进程先执行都是可能的，若父进程先执行，但是子进程没有执行完，父进程是不会退出的，因为wait();没有执行。

user: user-5
content: 没有例外哈，read循环读到0为止，再进入wait回收一下资源就可以了。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:管道是单向的，若父进程向管道里写，子进程从管道里读，那么若父进程不写在进程就会阻塞着去读。即，如果管道里有数据那么就会告诉子进程去都，反之依然。  你好，谢谢你的回答。  在我提供的例子里，会不会父进程先进行，子进程还没有机会做任何事情，父进程就先结束了？

user: user-4
content: 管道是单向的，若父进程向管道里写，子进程从管道里读，那么若父进程不写在进程就会阻塞着去读。即，如果管道里有数据那么就会告诉子进程去都，反之依然。
user-0 提问: 关于const的实验

回复:
user: user-0
content: 引用 3 楼 max_min_ 的回复:http://blog.csdn.net/yby4769250/article/details/7359278 看看 NB

user: user-1
content: http://blog.csdn.net/yby4769250/article/details/7359278 看看

user: user-1
content: 常量折叠现象而已！很正常，没什么大惊小怪的

user: user-2
content: 编译通不过。改成 const int * b = &a可通过。
user-0 提问: C语言程序问题

回复:
user: user-1
content: char *p;  	char s1[] = "The summer soldier, the sunshine patriot";   	p = strtok(s1, " "); 	printf(p); 	do{ 		p = strtok(NULL, ", "); //('\0', ", "); 		if (p) printf("|%s\n", p); 	}while(p);

user: user-2
content: 引用 4 楼 zhao4zhong1 的回复:fgets(linestr,MAXLEN,stdin); ... #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-3
content: 引用 7 楼 max_min_ 的回复:google下 strtok函数！字符串操作 ++ 或者使用strsep函数，可以边解析边和已经解析出来的单词比较；  typedef strcut _tagWORD {     char *word;   //单词内容     int  cnt;     //单词出现的次数 }WORD_OBJ, *WORD_HANDLE; WORD_OBJ   word[64];  可以简单定义成这样的一个数据结构，仅供参考。

user: user-4
content: google下 strtok函数！字符串操作

user: user-0
content: 非常感谢各位大神！

user: user-5
content: 引用 2 楼 u012811542 的回复:状态机是什么？==那个比较高级了，状态机是编译原理的概念，如果学会的话很有好处。给你个简单的例子：#include <stdio.h>  int main() { 	char c[100]; 	int i=0,nword=0,flag; 	char *p=c; 	gets(c); 	flag = p[0]==' '?0:1;//是否在单词中 	for(;*p!=0;p++){ 		if(flag && *p==' '){//位于单词中，且遇到空格 			nword++; 			flag=0; 		} 		else if(!flag && *p != ' ')//不在单词中，遇到非空格 			flag=1; 	} 	printf("%d\n",nword); 	return 0; }

user: user-6
content: fgets(linestr,MAXLEN,stdin); ... #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-7
content: 可以参考编译原理中get token的概念。  引用 2 楼 u012811542 的回复:状态机是什么？==

user: user-0
content: 状态机是什么？==

user: user-7
content: 用状态机，一个字符一个字符的遍历。  引用 楼主 u012811542 的回复:各位大神，紧急求助啊！ 输入一行字符，统计其中单词的个数。各单词之间用空格分隔，空格数可以是多个。才学C,不会啊。求指点TAT!
user-0 提问: main函数里创建分离线程  

回复:
user: user-1
content: 试试在main最后调用pthread_exit(NULL);觉得lz的逻辑很奇特，既然在意main退出与否，又为何要创建分离线程...

user: user-0
content: 引用 3 楼 mymtom 的回复:创建分离线程之后调用在main里pause就行了啊 这个怎么调？什么是pause?

user: user-2
content: 貌似设置了分离线程的属性后就不能够再join了吧  一般采用如下这样的方式：  void *cli_thread_func(void *arg) { //主业务 finish=true;//结束标为true; } int main(int argc, char **argv) {     bool finish=false;//增加变量判断线程函数是否结束     pthread_t cli_thread;       ret = pthread_create(&cli_thread, NULL, cli_thread_func, NULL);       while(!finish)//等待线程函数结束     {        sleep(1);     } }

user: user-3
content: int main(int argc, char **argv) {     pthread_t cli_thread;      ret = pthread_create(&cli_thread, NULL, cli_thread_func, NULL);     if (ret != 0)       {            printf("create cli_thread_func failed\n");         exit(1);     }    //1   while(1)       sleep(5); //2      pthread_join(cli_thread, NULL); // 等待指定线程结束  }

user: user-4
content: 创建分离线程之后调用在main里pause就行了啊

user: user-5
content: 在主线程退出之前等待子线程退出。。。  waitpid

user: user-6
content: main函数最后面加死循环。  引用 楼主 baoyuan24 的回复:int main(int argc, char **argv) {     pthread_t cli_thread;       ret = pthread_create(&cli_thread, NULL, cli_thread_func, NULL); 	if (ret != 0)        {	         printf("create cli_thread_func failed\n"); 		exit(1); 	}  } main函数里创建分离线程，如何避免线程函数cli_thread_func没有执行就退出？
user-0 提问: 简单4向路径搜索问题，求算法实现，第二贴100分！！

回复:
user: user-0
content: upupup

user: user-0
content: 引用 4 楼 lunat 的回复:你这个不是什么路径搜索问题，不是靠移动棋子能完成的。看你例子应该是计算四联通区域子集的问题。  一针见血~~  引用 5 楼 lin5161678 的回复:俄罗斯方块 直接把方块编码写进去就好了嘛  这个所有都罗列确实可以做到，但是在这个搜索函数外边我还有一层递归，所以想找一个搜索效率高一点的实现。  引用 6 楼 lunat 的回复:最简单的方法，列出所有可能子集（假设所有点可通行且无边界），逐个匹配即可。 事先计算出来，然后哈希配对，相比5楼说的更具体，但和5楼的思想是一致的。

user: user-1
content: 最简单的方法，列出所有可能子集（假设所有点可通行且无边界），逐个匹配即可。

user: user-2
content: 俄罗斯方块 直接把方块编码写进去就好了嘛

user: user-1
content: 你这个不是什么路径搜索问题，不是靠移动棋子能完成的。看你例子应该是计算四联通区域子集的问题。

user: user-0
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 BreathOfDeath 的回复:] 沙发：第一帖链接 http://bbs.csdn.net/topics/390639059/close#  第一贴不是有答案了么？[/quote]  第一帖的答案不满足需求

user: user-3
content: 引用 1 楼 BreathOfDeath 的回复:沙发：第一帖链接 http://bbs.csdn.net/topics/390639059/close#  第一贴不是有答案了么？

user: user-0
content: 沙发：第一帖链接 http://bbs.csdn.net/topics/390639059/close#
user-0 提问: 《c程序设计语言》里的一个翻译问题

回复:
user: user-0
content: 引用 6 楼 Adol1111 的回复:引用 5 楼 u012345348 的回复:依然无解，只能自顶了。。。看下这里http://www.cnblogs.com/zj27sWizardTower/archive/2011/05/03/2035400.html 3q~因为刚学c，几乎没用过枚举变量，这段话几乎弄晕我了。

user: user-1
content: Enumerations provide a convenient way to associate constant values with names, an alternative to #define with the advantage that the values can be generated for you. Although variables of enum types may be declared, compilers need not check that what you store in such a variable is a valid value for the enumeration. Nevertheless, enumeration variables offer the chance of checking and so are often better than #defines. In addition, a debugger may be able to print values of enumeration variables in their symbolic form.  枚举类型提供一种便利的方式，将常量与名称联系起来。它能起到与#define相同的功能，但它还有一个优势，即能够为你自动产生数值。尽管enum类型的变量可以声明，但编译器并不需要检查你在这个变量中所存储的数值是否为一个合的法枚举类型数值。但枚举类型的变量却提供了机会，让用户可以检查变量中存储数值的合法性，因此它们通常优于#define。此外，一个debug程序能够以符号的形式打印出枚举类型变量的值。  也就是说，虽然编译器不做检查，但如果你想检查的话还是可以做到的，例如用循环加printf()。

user: user-2
content: 枚举提供一条可选的，相比于用#define定义一些值的，更优越的， 使用名字组织常量的方便的途径。 尽管可以声明枚举类型的变量，编译器并不需要检查，那个变量是（否）一个合法的枚举值。 然而，枚举变量提供了一个检测的机会，于是经常比#defines 要好。 顺便说一下，一个调试器，也许能够打印，他们符号表中的，枚举的变量的值（名字和整数值）。 PS： 简单翻译一下，不知合不合原文！

user: user-3
content: 引用 2 楼 cfjtaishan 的回复:使用google翻译试试~~~ +1

user: user-4
content: 英语也是程序员的技能之一

user: user-5
content: 不过这句话的理解的确有分歧，上下文也没有指名是checking什么，可以看下我刚刚发的那个网址中楼下的评论。当然C++的类型检查什么的比C要好多了。

user: user-5
content: 引用 5 楼 u012345348 的回复:依然无解，只能自顶了。。。看下这里http://www.cnblogs.com/zj27sWizardTower/archive/2011/05/03/2035400.html

user: user-0
content: 依然无解，只能自顶了。。。

user: user-0
content: is there anyone out there,who knows the exact answer? 或者说有人精通枚举变量么么？

user: user-6
content: 编译器不需要检查用枚举类型声明的变量的值是否有效，但是枚举变量提供检查的机会。我的理解是检不检查就跟编译器有关了，你编译器实现检查功能就检查，不实现也可以

user: user-7
content: 使用google翻译试试~~~

user: user-8
content: http://translate.google.cn/?hl=zh-cn&tab=wT#en/zh-CN/numerations%20provide%20a%20convenient%20way%20to%20associate%20constant%20values%20with%20names%2C%20an%20alternative%20to%20%23define%20with%20the%20advantage%20that%20the%20values%20can%20be%20generated%20for%20you.%20Although%20variables%20of%20enum%20types%20may%20be%20declared%2C%20compilers%20need%20not%20check%20that%20what%20you%20store%20in%20such%20a%20variable%20is%20a%20valid%20value%20for%20the%20enumeration.%20Nevertheless%2C%20enumeration%20variables%20offer%20the%20chance%20of%20checking%20and%20so%20are%20often%20better%20than%20%23defines.%20In%20addition%2C%20a%20debugger%20may%20be%20able%20to%20print%20values%20of%20enumeration%20variables%20in%20their%20symbolic%20form.
user-0 提问: 为什么我的这个书里的例子提示有错

回复:
user: user-1
content: 程序没错的。。

user: user-0
content: 嵌套要像3楼学嘛

user: user-2
content: 建议你的if嵌套不要这么写

user: user-0
content: 我运行的是装在u盘里的绿色版vc！有的时候是不是会有报错的情况！

user: user-0
content: 我解决了！不好意思

user: user-3
content: #include <studio.h>  int main(void)  {  char letter=0;  printf("enter an uppercase letter:");  scanf("%c",&letter);  if (letter >='A' && letter <='Z') //改成这样  {    letter=letter-'A'+'a';    printf ("you entered an uppercase %c\n",letter);  }  else  {    printf("try using the shirt key,bud i want a capital letter.\n"); }  return 0; }

user: user-4
content: if (letter >='A')    if (letter <='Z') 应该是if(letter>='A' && letter<='Z')

user: user-0
content: 运行不起来，vc总是提示有一行有错
user-0 提问: 谁来帮我看看这个学生成绩管理系统

回复:
user: user-1
content: 这是在读 保存的数据信息的时候 发生的错误么 ？还是？

user: user-2
content: 我初学者 ，怎么没有后文了，求解

user: user-3
content: static void li(const stulink head) { 	stulink mv_link = head; 	while(mv_link!=NULL) 	{ 		printf("%d %s %0.2lf %0.2lf %0.2lf\n",mv_link->studata.id,mv_link->studata.name,mv_link->studata.chin, 			mv_link->studata.math,mv_link->studata.eng); 		mv_link = mv_link->next; 		if(mv_link->next == NULL) 			break; 	} }

user: user-4
content: 用的那个编译器？