Question: C语言—— 菜鸟求助！！！！！！！！！！！！！！

已经解决了问题，嘿嘿

引用 20 楼 u011488256 的回复:同学！ 如果你想知道你错哪了 首先你应该把你程序最基本的错误改过来，实在太多，改过来在运行看还有没有错误，你这些基本的错误也许就为导致你上面的错误，下面我再你程序里面注释中给你提出来，然后你自己改改#include<stdio.h> main() { int pass=0,fail=0; int n,i,term,score;     //首先这个地方的term 你一定要给一个初值，你后面再用时系统都不知道他的初值 term=0； printf("please enter the students number"); scanf("%/d",&n);    //这里应该是 scanf("%d",&n); 中间多个斜杠  printf("please enter the score"); for(i=0;i<n;i++) { scanf("%d",&score);     	if(score=-1)     //这里的判定条件因该是 score==-1！！ 两个等号，不然就是直接赋值了！ { break; }     term=term+score;      }       if(score>=60)     //按照你的题意，应该将if和else放在循环里面！  {  pass++;  }  else  {  fail++;  }  printf("%d,%d,%d",pass,fail,term/n); }  你先把这些改了 在运行试试 原来的代码 根本就不存在找你说的错误 因为基本很多东西都是乱的   照你的意思改了，还是不行。下面是我改后的代码：#include<stdio.h> main() { 	int pass=0,fail=0; 	int n,i,term=0,score;     	printf("please enter the students number"); 	scanf("%d",n); 	printf("please enter the score"); 	for(i=0;i<n;i++) 	{ 		scanf("%d",&score);     		if(score==-1)     		{ 			break; 		} 	term=term+score;    	 	if(score>=60)    	{  		pass++;  	}  	else  	{ 		fail++; 	} 	printf("%d,%d,%d",pass,fail,term/n);     } }

楼主的代码让人抓狂，建义不要写这样的格式成长。不然别人会找你要精神损失费的。要养成了的风格。

第七行：scanf("%/d",&n)；的%和d之间是不是多了一个/.

#include<stdio.h>  main()  {     int pass=0,fail=0;     int n=0,i,term=0,score=0;     printf("please enter the students number");     scanf("%d",&n);      \ERROR1:你这里多了一个反斜杠      printf("please enter the score");          for(i=0;i<n;i++)     {         scanf("%d",&score);               if(score==-1)   \ERROR2:你这里少了一个等号              {              break;              }                            if(score>=60)              {                pass++;              }         else             {                 fail++;             }                              term=term+score;     }            printf("pass:%d\n,fail:%d\n,averge:%d\n",pass,fail,term/n);                     while (1);  }

引用 17 楼 u012848622 的回复:[quote=引用 16 楼 niu91 的回复:] [quote=引用 13 楼 u012848622 的回复:] [quote=引用 5 楼 niu91 的回复:] #include<stdio.h> void main() { 	int pass=0,fail=0; 	int n,i,term=0,score;  	printf("please enter the students number"); 	scanf("%d",&n);								//here  	 	for(i=0;i<n;i++) 	{ 		printf("please enter the score");		//提示输出 		scanf("%d",&score);     	if(-1 == score)							//这个错误很典型，最好改成 -1 == score 		{ 			break; 		}else{										//这里加上else会更好些  		term=term+score;							//term没有赋处值！ 		}  		//下面的语句要在for()里才能访问到每个输入时的score 		if(score>=60) 		{ 			 pass++; 		 } 		 else 		 { 			fail++; 		 } 	}  			  	  	 printf("通过人数 %d,未及格人数%d,平均分（取整）%d\n",pass,fail,term/n); }    嗯嗯，这个程序可以运行，但是结果有点问题。这个问题不是结果不对，而是有点不尽如人意，如果把第18行的printf放到循环之外会好很多！先谢谢你帮我解答，而且答案也很好，可是我还是很想知道我的代码问题出在哪了。麻烦你再看一下我的菜鸟级程序，好不好？？[/quote] 我把你的程序直接粘贴在我的编译器里，是可以编译成功的，编译没有问题。是不是你其他地方弄错了[/quote]  编译器的问题还是数据库的问题？可是它提示的是语法错误。[/quote] 先写一个比较小的程序（当然要保证正确），运行一下，看看行不行。

楼主，我贴中代码以验证过！错误也指出来了

引用 楼主 u012848622 的回复:#include<stdio.h> main() { 	int pass=0,fail=0; 	int n,i,term,score; 	printf("please enter the students number"); 	scanf("%/d",&n); 	printf("please enter the score"); 	for(i=0;i<n;i++) 	{ 		scanf("%d",&score);     	if(score=-1) 		{ 			break; 		}     term=term+score;      }       if(score>=60) 	 { 		 pass++; 	 } 	 else 	 { 		 fail++; 	 } 	 printf("%d,%d,%d",pass,fail,term/n); } 编译的时候不问题，运行的时候出现“error C2059: syntax error : '}' 执行 cl.exe 时出错. syntax error 为语法错误，编译竟然没有找出来，可以通过设置断点打印，锁定出错地点。

引用 16 楼 niu91 的回复:[quote=引用 13 楼 u012848622 的回复:] [quote=引用 5 楼 niu91 的回复:] #include<stdio.h> void main() { 	int pass=0,fail=0; 	int n,i,term=0,score;  	printf("please enter the students number"); 	scanf("%d",&n);								//here  	 	for(i=0;i<n;i++) 	{ 		printf("please enter the score");		//提示输出 		scanf("%d",&score);     	if(-1 == score)							//这个错误很典型，最好改成 -1 == score 		{ 			break; 		}else{										//这里加上else会更好些  		term=term+score;							//term没有赋处值！ 		}  		//下面的语句要在for()里才能访问到每个输入时的score 		if(score>=60) 		{ 			 pass++; 		 } 		 else 		 { 			fail++; 		 } 	}  			  	  	 printf("通过人数 %d,未及格人数%d,平均分（取整）%d\n",pass,fail,term/n); }    嗯嗯，这个程序可以运行，但是结果有点问题。这个问题不是结果不对，而是有点不尽如人意，如果把第18行的printf放到循环之外会好很多！先谢谢你帮我解答，而且答案也很好，可是我还是很想知道我的代码问题出在哪了。麻烦你再看一下我的菜鸟级程序，好不好？？[/quote] 我把你的程序直接粘贴在我的编译器里，是可以编译成功的，编译没有问题。是不是你其他地方弄错了[/quote]  编译器的问题还是数据库的问题？可是它提示的是语法错误。

引用 13 楼 u012848622 的回复:[quote=引用 5 楼 niu91 的回复:] #include<stdio.h> void main() { 	int pass=0,fail=0; 	int n,i,term=0,score;  	printf("please enter the students number"); 	scanf("%d",&n);								//here  	 	for(i=0;i<n;i++) 	{ 		printf("please enter the score");		//提示输出 		scanf("%d",&score);     	if(-1 == score)							//这个错误很典型，最好改成 -1 == score 		{ 			break; 		}else{										//这里加上else会更好些  		term=term+score;							//term没有赋处值！ 		}  		//下面的语句要在for()里才能访问到每个输入时的score 		if(score>=60) 		{ 			 pass++; 		 } 		 else 		 { 			fail++; 		 } 	}  			  	  	 printf("通过人数 %d,未及格人数%d,平均分（取整）%d\n",pass,fail,term/n); }    嗯嗯，这个程序可以运行，但是结果有点问题。这个问题不是结果不对，而是有点不尽如人意，如果把第18行的printf放到循环之外会好很多！先谢谢你帮我解答，而且答案也很好，可是我还是很想知道我的代码问题出在哪了。麻烦你再看一下我的菜鸟级程序，好不好？？[/quote] 我把你的程序直接粘贴在我的编译器里，是可以编译成功的，编译没有问题。是不是你其他地方弄错了

问题到底出在哪。

这改了么 ··改了又把新错误改出来了main() { int pass=0,fail=0; int n,i,term=0,score;     printf("please enter the students number"); scanf("%d",n);       //原来你这里都是&n  改了 你就把&吃了，怎么运行的了！ printf("please enter the score"); for(i=0;i<n;i++) { scanf("%d",&score);     if(score==-1)     { break; } term=term+score;     if(score>=60)    {  pass++;  }  else  { fail++; } printf("%d,%d,%d",pass,fail,term/n);    //你这个输出应该总的一个输出吧？ 应该放在循环外，按照题意，  看来不美怎么把循环弄懂还是怎么的兄弟，这个放在循环外，再试试     } }

引用 12 楼 u011488256 的回复:LZ 解决问题了么   没全解决！！！！我还想知道我自己写的代码问题出在哪了！ 求大神不吝赐教！ 小弟不甚感激！！

引用 5 楼 niu91 的回复:#include<stdio.h> void main() { 	int pass=0,fail=0; 	int n,i,term=0,score;  	printf("please enter the students number"); 	scanf("%d",&n);								//here  	 	for(i=0;i<n;i++) 	{ 		printf("please enter the score");		//提示输出 		scanf("%d",&score);     	if(-1 == score)							//这个错误很典型，最好改成 -1 == score 		{ 			break; 		}else{										//这里加上else会更好些  		term=term+score;							//term没有赋处值！ 		}  		//下面的语句要在for()里才能访问到每个输入时的score 		if(score>=60) 		{ 			 pass++; 		 } 		 else 		 { 			fail++; 		 } 	}  			  	  	 printf("通过人数 %d,未及格人数%d,平均分（取整）%d\n",pass,fail,term/n); }    嗯嗯，这个程序可以运行，但是结果有点问题。这个问题不是结果不对，而是有点不尽如人意，如果把第18行的printf放到循环之外会好很多！先谢谢你帮我解答，而且答案也很好，可是我还是很想知道我的代码问题出在哪了。麻烦你再看一下我的菜鸟级程序，好不好？？

LZ 解决问题了么

引用 10 楼 maoshuoqiong 的回复:也许你想要的效果是这样的 #include <stdlib.h> #include <stdio.h> #include <string> #include <vector> #include <iostream> using namespace std;  int main() { 	int pass=0,fail=0; 	int n,i,term,score; 	term = 0; //初始化 	printf("please enter the students number:\n"); 	scanf("%d",&n); 	printf("Students[%d]\n",n); 	for(i=0;i<n;i++) 	{ 		printf("please enter the score:\n"); 		fflush(stdin); //清空输入流 		scanf("%d",&score); 		if( score == -1 ) //如果怕写错可以写成if(-1 == score) 		{ 			break; 		} 		term=term+score; 		if(score>=60) 		{ 			pass++; 		} 		else 		{ 			fail++; 		} 	}  	printf("pass[%d],fail[%d],avg[%d]\n",pass,fail,term/n); 	system("pause"); 	return 0; }  老兄我现在还只在学C，C++还没学。不过真的很谢谢你的帮忙！！！！！！！！！

#include <stdlib.h> #include <stdio.h> #include <string> #include <vector> #include <iostream> using namespace std;   int main() { 	int pass=0,fail=0; 	int n,i,term,score; 	term = 0; //初始化 	printf("please enter the students number:\n"); 	scanf("%d",&n); 	for(i=0;i<n;i++) 	{ 		printf("please enter the score:\n"); 		scanf("%d",&score); 		if( score == -1 ) //如果怕写错可以写成if(-1 == score) 		{ 			break; 		} 		term=term+score; 		if(score>=60) 		{ 			pass++; 		} 		else 		{ 			fail++; 		} 		printf("%d,%d,%d",pass,fail,term/n); 	}  	 	system("pause"); 	return 0; }  可以编译运行


Question: c 与语言静态数组

引用 13 楼 lin5161678 的回复:[quote=引用 6 楼 mujiok2003 的回复:] static int a[10] =  {1, 2, 3, 4, 5, 6, 7, 8, 9};  这个没有运行的计算，直接从image读入内存。前提：你不需要运行时计算。对于C来说 用于static 初始化的 只能的编译期常量  所以你的前提 是不存在的 写一个运行时计算 是Error[/quote]  不需要运行时计算的初始化的情况是存在的，比如:ascii table

引用 6 楼 mujiok2003 的回复:static int a[10] =  {1, 2, 3, 4, 5, 6, 7, 8, 9};  这个没有运行的计算，直接从image读入内存。前提：你不需要运行时计算。对于C来说 用于static 初始化的 只能的编译期常量  所以你的前提 是不存在的 写一个运行时计算 是Error

1.静态区的生命周期在程序结束时才能被系统释放，如果想自己手动释放，不应该在静态区声明，而应该在堆区声明数组变量。 2.关于初始化，如果想初始化指定的值，必须通过循环赋值。如果只是初始化，随意值都可以，系统会自动给静态区的未初始化值自动赋0。

引用 1 楼 turingo 的回复:函数内的static int num[100],内存如何手动释放。 何谓高效的初始化？初始化一般不涉及到效率的问题。  [quote=引用 楼主 makezwl 的回复:] 函数内的static int num[100],内存如何手动释放？ static int *num[100]，如何高效的初始化？[/quote]+1

1. 无需释放 2。 无需初始化（自动全0）

函数内的static变量等同于全局变量，无法手动释放的。还有它们都是在分配空间时就初始化了，如果你想初始化为0的话就不需要多余的操作了。 如果要初始化为其他的值，都会写内存，应该不存在效率高低的问题。。

引用 3 楼 JiMoKuangXiangQu 的回复:这些是操作系统进程管理以及编译器的事情，就不要自己操心了。 引用 4 楼 baichi4141 的回复:第一，数组内存不能手动释放。 第二，要简写的话，memset一条语句就可以，至于效率，不管你怎么写都基本一样。+1

位于静态区无需释放。

这些是操作系统进程管理以及编译器的事情，就不要自己操心了。

静态数组存在全局数据区,无法手动释放. 想手动释放用动态内存: int *p = malloc (100 * siezof(int));  static一般初始化为0.不需要你显示地初始化.

函数内的static int num[100],内存如何手动释放。 何谓高效的初始化？初始化一般不涉及到效率的问题。  引用 楼主 makezwl 的回复:函数内的static int num[100],内存如何手动释放？ static int *num[100]，如何高效的初始化？


Question: 这句宏的意义是什么 ? #define UNUSED(x) ((x)=(x))

避免一些编译器的警告。 对于未使用的变量，很多编译器都会警告“未使用的变量x”。


Question: invalid conversion from ‘unsigned char*’ to ‘const char*’

木有错  是日志打印格式的问题，

unsigned char ascii[10] = {0}; 	//... 	char szBuf[128] = {0}; 	memcpy(szBuf,ascii,10);  这样不一了百了...

我是想做个 普通字符转换为%ASCII码的格式  char ascii[],可以但是输出不对，   第一钟还是同样的问题， C语言可以通过编译 改成.CPP就报错了，晕死，求指点，，，，

引用 3 楼 hanzhaoshuai 的回复:[quote=引用 2 楼 mujiok2003 的回复:] 1.  char const* t = reinterpret_cast<char*>(static_cast<unsigned char*>(ascii)); strncpy(result,t,sizeof(ascii));  2.  //unsigned char ascii[10];  char ascii[10];  没用呀，，[/quote] 同样的问题？别的问题？

unsigned char ascii[10];  。。。。。。 sprintf(ascii,"%%%X",*start); strncpy(result,ascii,strlen(ascii));

引用 2 楼 mujiok2003 的回复:1.  char const* t = reinterpret_cast<char*>(static_cast<unsigned char*>(ascii)); strncpy(result,t,sizeof(ascii));  2.  //unsigned char ascii[10];  char ascii[10];  没用呀，，

参数类型不匹配


Question: 初学C关于指针数组参数

我把改好的例子也发下 有同样疑问的同志可快速参考下 void a_init(int *len,int **a) { 	*a=(int*)malloc(2*sizeof(int)); 	(*a)[0]=1; 	(*a)[1]=2; 	*len=2; }  int main(int arg) { 	 	int *a; 	int len; 	a_init(&len,&a); 	printf("len=%d\n",len); 	for(int i=0;i<len;i++){ 		printf("a[%d]=%d\n",i,a[i]); 	} 	free(a);     return 0;   }

首先说明下我的代码本来是用char**的 为了发例子简单临时改了下 1楼发现了问题 但这不是我想要的结果，还有就是本来2楼应该是全额分的 但是我作为一个新人刚才刷帖子没有3楼的时候 看到2楼的结果还是没开窍 我想这样的结贴结果应该说得过去吧 谢谢各位

参考一下： #include <cstdlib> #include <cstdio>  void a_init(int *len,int **a) { 	*a=(int*)std::malloc(2*sizeof(int)); 	(*a)[0]=1; 	(*a)[1]=2; 	*len=2; }  int main(int arg) {  	int *a; 	int len; 	a_init(&len,&a); 	for(int i=0;i<len;i++){ 		printf("%d-->%d\n",len,a[i]); 	} 	free(a);  	return 0;   }  函数a_init()中: *a[0]=1; *a[1]=2; 修改为： (*a)[0]=1; (*a)[1]=2;  函数main()中： printf("%d-->%s\n",len,a[i]);修改为： printf("%d-->%d\n",len,a[i]);  增加头文件包含： #include <cstdlib> #include <cstdio>  函数 int main(int arg)最好修改为： int main(int argc, char *argv[])

printf("%d-->%s\n",len,a[i]);   int 型数据 你干嘛要用%s呢？


Question: 运算符的优先级，新手。。。谢谢

/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数∧ 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);  (*iop)--;break;         case  8: x=cos(x);  (*iop)--;break;         case  9: x=tan(x);  (*iop)--;break;         case 10: x=sqrt(x); (*iop)--;break;         case 11: x=asin(x); (*iop)--;break;         case 12: x=acos(x); (*iop)--;break;         case 13: x=atan(x); (*iop)--;break;         case 14: x=log10(x);(*iop)--;break;         case 15: x=log(x);  (*iop)--;break;         case 16: x=exp(x);  (*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }

如果栈不理解，那么就该去学数据结构了， 优先级是栈的典型应用。

我之前写过一个计算器程序，不过是php实现的，很好理解： http://blog.csdn.net/wusuopubupt/article/details/12107793

分析各个字符的问题。对运算符，括号逐个判断以及匹配。

计算表达式然让用户以字符串的形式输出 然后开始解析字符串 将{}[]()等也要考虑进去 然后根据*和/操作优先于 + 和 - 依次解析字符串  最后计算出来结果 当然  这是比较麻烦的方法了 但是思路很简单


Question: void(*x(int,void(*y)(int)))(int);是个什么东西。。

x是函数x的参数很好理解就是一个int，一个函数指针，不好理解的可能呢void（*x）（int），这里用来声明其中x的返回类型，就是参数里的函数指针，两者必须一致

4楼写的很清楚啦，是个函数来的，lz的没有函数体就是一个函数声明，指针的话应该是void(*（*x）(int,void(*y)(int)))(int)。到底不是给人看的，还是typedef简化吧，不然死晕...

引用 11 楼 dengxu11 的回复:[quote=引用 8 楼 nadleeh123 的回复:] [quote=引用 楼主 u012846723 的回复:] void(*x(int,void(*y)(int)))(int); void(*x(int,void(*y)(int)))(int) = 0;  编译器是报的err[/quote] x显然是一个函数[/quote]  我的意思是x是指针的话，编译器应该报的是警告，报err就不是指针了

引用 楼主 u012846723 的回复:void(*x(int,void(*y)(int)))(int); 首先里面是一个y类型的函数指针，把它作为参数传递给x类型的函数指针！ 两个函数指针的参数都是int类型，返回值为void

void(*x(int,void(*y)(int)))(int); 	//x为函数指针，该指针指向的函数有两个参数，参数1 为int，参数2是另个函数指针（参数为int，返回void）

当然 NULL后面少了分号

void(*x(int,void(*y)(int)))(int) {return NULL}

引用 8 楼 nadleeh123 的回复:[quote=引用 楼主 u012846723 的回复:] void(*x(int,void(*y)(int)))(int); void(*x(int,void(*y)(int)))(int) = 0;  编译器是报的err[/quote] x显然是一个函数

引用 9 楼 whizer 的回复:函数指针 void(*x(int,void(*y)(int)))(int);  void(*y)(int) ----> typedef void(*y)(int) funcy;  void(*x(int,void(*y)(int)))(int) ---> funcy(*x(int,funcy));  funcy是一个函数指针, 第一个参数是int,返回值是void. x是函数指针,第一个参数是int, 第二个参数是funcy,返回值是funcy. typedef void(*funcy)(int);

引用 楼主 u012846723 的回复:void(*x(int,void(*y)(int)))(int); void(*x(int,void(*y)(int)))(int) = 0;  编译器是报的err

嗯typedef一下，不然会晕...

x是函数指针，该函数返回值是个函数指针，指向void(*y)(int)) 这种函数的指针 参数是（int，void(*y)(int))）

#include <stdio.h>   typedef void (*func_t)(int);  void func(int i) { 	printf("%d\n", i); }  void ( * x(int i, void(*y)(int)) ) (int) //func_t x(int i, func_t y) { 	y(i); 	return y; }  int main(void) { 	x(5, func);  	getch(); 	return 0; }  不好意思，写错一行。 typedef void (*func_t)(void);修改为： typedef void (*func_t)(int);

函数x。 参考如下代码： #include <stdio.h>   typedef void (*func_t)(void);  void func(int i) { 	printf("%d\n", i); }  void ( * x(int i, void(*y)(int)) ) (int) //func_t x(int i, func_t y) { 	y(i); 	return y; }  int main(void) { 	x(5, func);  	getch(); 	return 0; }

搜索:c++ 左右法则

引用 1 楼 szy202436 的回复:函数指针吧~  求详细一点

函数指针吧~


Question: 自己写的C语言简易版扫雷。但是有一个小BUG....

引用 5 楼 qq695181966 的回复:[quote=引用 3 楼 bdyz1016 的回复:] for(i=0;i<N;i++) { for(j=0;j<M;j++) { if(a[j][i]=='*') { printf("%c",a[j][i]); continue;//采用continue函数实现雷的输出与周围雷存在的个数的输出// } printf("%d",b[j][i]); } printf("\n"); } continue使循环跳到递增循环变量的部分，也就是不判断j<M而直接j++。同学，还没学函数吗。 你把我的代码拷进VC6.0实现一下 只有几种情况有问题 而不是所有情况都出现越界问题。 如果按你这么说，运行出来的结果不能有对的呀~[/quote]你没发现只有在最后一个是*的时候不正确吗，你都没考虑过为什么越界的会输出出来吗

还有~~输出的结果和扫雷游戏的规则是一样的。雷旁边的数字表示有效监测范围内存在雷的个数。 若有对规则不明白的可以再问问。我尽量说清楚~~

第二个图为有效输出~忘记注明了~本人才大一 学习了1个月C语言，跟着老师一步一步走，发现自己可以超前的课程，所以就自己研究了这个。之前没有任何计算机语言的基础，所以这个错误找起来实在费劲TAT 找了一个早上了~找不懂了才来求助~~大神赐教啊！

引用 4 楼 user-2 的回复:以下代码中有数组下标越界的问题:            b[j][i+1]++;           b[j][i-1]++;           b[j][i]++;           b[j+1][i]++;           b[j+1][i+1]++;           b[j+1][i-1]++;           b[j-1][i]++;           b[j-1][i-1]++;           b[j-1][i+1]++; 要改为:            if ((i + 1) < N) b[j][i+1]++; //b[j][i+1]++;           if (i > 0) b[j][i-1]++; //b[j][i-1]++;           b[j][i]++;           if ((j + 1) < M) b[j+1][i]++; //b[j+1][i]++;           if ((j + 1) < M && (i + 1) < N) b[j+1][i+1]++; //b[j+1][i+1]++;           if ((j + 1) < M && i > 0) b[j+1][i-1]++; //b[j+1][i-1]++;           if (j > 0) b[j-1][i]++; //b[j-1][i]++;           if (j > 0 && i > 0) b[j-1][i-1]++; b[j-1][i-1]++;           if (j > 0 && (i + 1) < N) b[j-1][i+1]++; //b[j-1][i+1]++;对了！ 谢谢您啊！ 这论坛真管用~咔咔咔！

引用 3 楼 bdyz1016 的回复:for(i=0;i<N;i++) { for(j=0;j<M;j++) { if(a[j][i]=='*') { printf("%c",a[j][i]); continue;//采用continue函数实现雷的输出与周围雷存在的个数的输出// } printf("%d",b[j][i]); } printf("\n"); } continue使循环跳到递增循环变量的部分，也就是不判断j<M而直接j++。同学，还没学函数吗。 你把我的代码拷进VC6.0实现一下 只有几种情况有问题 而不是所有情况都出现越界问题。 如果按你这么说，运行出来的结果不能有对的呀~


Question: PROC动态执行SQL，多次执行报错...

楼主，我也遇到了跟你差不多的问题 ，按照你说的把ROLLBACK 去掉，但是还是有错！ http://bbs.csdn.net/topics/390672352 帮忙看一下，谢谢！

由于连接数据库的代码相对比较简单，所以就没有贴，动态执行select的代码中有些是对select语句的处理，大家不必关心。。。

问题解决 由于之前代码中存在EXEC SQL COMMIT/ROLLBACK RELEASE;本来是想到这种语句导致了数据库断开连接的，后来注释掉了，可是问题还是存在，刚才把这种代码删除了之后，问题解决。真是个奇怪啊 好吧，没人参与问题，结贴了

gdb调试跟踪到EXEC SQL PREPARE s_sql FROM :sql;处开始出错了，实在不知是什么原因引起的了，哪位高手帮忙啊？？


Question: 为什么运行不出结果，是因为数据太大了吗

引用 2 楼 gqjjqg 的回复:7 的结果是 61479419904000， 用long long 不够的。 不是这个问题，答案是100多亿，我的够的啊

引用 1 楼 user-2 的回复:下个断点调试有助你解决问题.  程序员遇到执行结果跟自己想的不同, 那么调试就是最好的做法, 而不是去阅读代码,或者让别个帮你阅读代码来找错. 嗯，我调了的，但是到dfs里出不来。。关键有几千万种，不知道哪里出错了。。

7 的结果是 61479419904000， 用long long 不够的。

引用 4 楼 zwfars 的回复:[quote=引用 2 楼 gqjjqg 的回复:] 7 的结果是 61479419904000， 用long long 不够的。 不是这个问题，答案是100多亿，我的够的啊[/quote]  参考资料： http://oeis.org/A002860  n阶拉丁方 数量 没有公式， 极大可能是你的搜索效率太低，需要等比较长的时间。


Question: 关于指针函数的问题

最后还有就是你的标题，嘻嘻！你的程序里面并没有指针函数，指针函数的形式是这样子滴：返回值 （*函数名）（形参表）；上面所写的函数只不过是返回指针类型的函数而已。

我觉得吧！首先你需要看一下你的第一个函数shuru（），在for循环里面返回，意思是需要返回10次吗？，还有就是在这个函数中其实传进来是数组的话，数组名就是首地址，是按地址传递的，并不需要返回，按地址传递的参数属于传入传出参数。我想你理解了这两点之后，应该就可以做出来了

引用 4 楼 user-3 的回复:[quote=引用 3 楼 N_sev7 的回复:]  #include "stdafx.h"  int *shuru(int *p) { int i; for (i = 0; i < 10; i++) { scanf ("%d,",&p[i]); return (p);       ///////////看下是不是return 的位置写错了  这样写就只能指向一个数据 } }  int *chuli (int a[10]) { int min, max, k, j, n; for (k = 0, j = 0, n = 0; n < 10; n++)           ///你这又循环10次，肯定出错 { if (a[k] < a[n]) k = n; if (a[j] > a[n]) j = n; } max = a[k]; a[k] = a[9]; a[9] = max; min = a[j]; a[j] = a[0]; a[0] = min; return (a); }  void shuchu(int *p) { int j; for (j = 0; j < 10; j++) { printf ("%d",p[j]); } } void main() { int a[10], *q; q = a; shuru(q); printf ("eee\n"); printf ("%d\n",*q); //	q = a; chuli(a); printf ("eee\n"); printf ("%d\n",*q); //	q = a; shuchu(q); }  格式也调下嘛！亲[/quote] 直接Ctrl C  +  Ctrl V过来的

引用 3 楼 N_sev7 的回复: #include "stdafx.h"  int *shuru(int *p) { int i; for (i = 0; i < 10; i++) { scanf ("%d,",&p[i]); return (p);       ///////////看下是不是return 的位置写错了  这样写就只能指向一个数据 } }  int *chuli (int a[10]) { int min, max, k, j, n; for (k = 0, j = 0, n = 0; n < 10; n++)           ///你这又循环10次，肯定出错 { if (a[k] < a[n]) k = n; if (a[j] > a[n]) j = n; } max = a[k]; a[k] = a[9]; a[9] = max; min = a[j]; a[j] = a[0]; a[0] = min; return (a); }  void shuchu(int *p) { int j; for (j = 0; j < 10; j++) { printf ("%d",p[j]); } } void main() { int a[10], *q; q = a; shuru(q); printf ("eee\n"); printf ("%d\n",*q); //	q = a; chuli(a); printf ("eee\n"); printf ("%d\n",*q); //	q = a; shuchu(q); }  格式也调下嘛！亲


Question: C语言新手问题（十位数计算器，不考虑优先）

#include<stdio.h> #include<stdlib.h>  #define    N    1024 #define    M    1024  char a[N]; int b[M];    int main (void)  { 	int i, j, k; 	char c[100]; 	char d[100];    //存放运算符  	scanf ("%s", a); 	for (i = 0, j = 0, k = 0; i < N; i++)     { 		if (a[i] > 47 && a[i] < 58) 		{ 			c[j] = a[i]; 			j++; 		}       else 		{ 			d[k] = a[i]; 			c[j] = '\0'; 			j = 0; 			b[k] = atoi (c); 			k++; 			if (a[i] == '\0') 	   			 break; 		} 	}    	int result = b[0]; 	for (i = 0; i < k; i++)     { 		switch (d[i]) 		{ 			case '+': 	  		result = result + b[i + 1]; 			break;	  			case '-': 	  			result = result - b[i + 1]; 			break;  			case '*': 	  			result = result * b[i + 1]; 			break; 	 			case '/': 	  			result = result / b[i + 1]; 			break; 		} 	}    	printf ("%d\n", result);    	return 0; } 简单的修改了一下你的程序，不过不知道你是如何测试的。

for(i=0;i<k;i++) {     switch(d[i])     {     case '+':             result = result + b[i+1];            break;     case '-': result = result - b[i+1];            break;     case '*': result = result * b[i+1];            break;     case '/': result = result / b[i+1];            break;     default:  }

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。


Question: 如何使用宏定义替代一个不定函数？

__VAR_ARGS__打错了， 应该是__VA_ARGS__。  c++也支持__VA_ARGS__。

如果是C++有什么办法没有呢？

#define DEBUG(fmt, ...) RecordLog(__FUNCTION__, fmt, __VA_ARGS__) 这个编译过了。 = =,打错了吧

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vclang/html/1cc5f70a-a225-469c-aed0-fe766238e23f.htm Predefined Macros  See Also  Send Feedback     Names the predefined ANSI C and Microsoft C++ implementation macros.  The compiler recognizes predefined ANSI C macros and the Microsoft C++ implementation provides several more. These macros take no arguments and cannot be redefined. Some of the predefined macros listed below are defined with multiple values. See the following tables for more information.  Macro  Description   __DATE__  The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H.    __FILE__  The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks. To ensure that the full path to the file is displayed, use /FC (Full Path of Source Code File in Diagnostics).  You can create your own wide string version of __FILE__ as follows:    Copy Code  #include <stdio.h> #define WIDEN2(x) L ## x #define WIDEN(x) WIDEN2(x) #define __WFILE__ WIDEN(__FILE__) wchar_t *pwsz = __WFILE__;  int main() {}     __LINE__  The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive.    __STDC__  Indicates full conformance with the ANSI C standard. Defined as the integer constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined.    __TIME__  The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss.    __TIMESTAMP__  The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31.   Macro  Description   _ATL_VER  Defines the ATL version.   _CHAR_UNSIGNED  Default char type is unsigned. Defined when /J is specified.    __CLR_VER  Defines the version of the common language runtime used when the application was compiled. The value returned will be in the following format:  Mmmbbbbb  where,  M is the major version of the runtime.  mm is the minor version of the runtime.  bbbbb is the build number.    Copy Code  // clr_ver.cpp // compile with: /clr using namespace System; int main() {    Console::WriteLine(__CLR_VER); }     __cplusplus_cli  Defined when compiling with /clr, /clr:pure, or /clr:safe. Value of __cplusplus_cli is 200406. __cplusplus_cli is in effect throughout the translation unit.     Copy Code  // cplusplus_cli.cpp // compile with: /clr #include "stdio.h" int main() {    #ifdef __cplusplus_cli       printf("%d\n", __cplusplus_cli);    #else       printf("not defined\n");    #endif }     __COUNTER__  Expands to an integer starting with 0 and incrementing by 1 every time it is used in a compiland. __COUNTER__ remembers its state when using precompiled headers. If the last __COUNTER__ value was 4 after building a precompiled header (PCH), it will start with 5 on each PCH use.  __COUNTER__ lets you generate unique variable names. You can use token pasting with a prefix to make a unique name. For example:    Copy Code  // pre_mac_counter.cpp #include <stdio.h> #define FUNC2(x,y) x##y #define FUNC1(x,y) FUNC2(x,y) #define FUNC(x) FUNC1(x,__COUNTER__)  int FUNC(my_unique_prefix); int FUNC(my_unique_prefix);  int main() {    my_unique_prefix0 = 0;    printf_s("\n%d",my_unique_prefix0);    my_unique_prefix0++;    printf_s("\n%d",my_unique_prefix0); }     __cplusplus  Defined for C++ programs only.   _CPPLIB_VER  Defined if you include any of the C++ Standard Library headers; reports which version of the Dinkumware header files are present.   _CPPRTTI  Defined for code compiled with /GR (Enable Run-Time Type Information).   _CPPUNWIND  Defined for code compiled with /GX (Enable Exception Handling).   _DEBUG  Defined when compiling with /LDd, /MDd, and /MTd.   _DLL  Defined when /MD or /MDd (Multithread DLL) is specified.   __FUNCDNAME__  Valid only within a function and returns the decorated name of the enclosing function (as a string). __FUNCDNAME__ is not expanded if you use the /EP or /P compiler option.   __FUNCSIG__  Valid only within a function and returns the signature of the enclosing function (as a string). __FUNCSIG__ is not expanded if you use the /EP or /P compiler option.  On a 64-bit operating system, the calling convention is __cdecl by default.   __FUNCTION__  Valid only within a function and returns the undecorated name of the enclosing function (as a string). __FUNCTION__ is not expanded if you use the /EP or /P compiler option.   _INTEGRAL_MAX_BITS  Reports the maximum size (in bits) for an integral type.    Copy Code  // integral_max_bits.cpp #include <stdio.h> int main() {    printf("%d\n", _INTEGRAL_MAX_BITS); }     _M_ALPHA  Defined for DEC ALPHA platforms (no longer supported).   _M_CEE  Defined for a compilation that uses any form of /clr (/clr:oldSyntax, /clr:safe, for example).   _M_CEE_PURE  Defined for a compilation that uses /clr:pure.   _M_CEE_SAFE  Defined for a compilation that uses /clr:safe.   _M_IX86  Defined for x86 processors. See Values for _M_IX86 for more details.   _M_IA64  Defined for Itanium Processor Family 64-bit processors.   _M_IX86_FP  Expands to a value indicating which /arch compiler option was used:  0 if /arch was not used.  1 if /arch:SSE was used.  2 if /arch:SSE2 was used.  See /arch (Minimum CPU Architecture) for more information.   _M_MPPC  Defined for Power Macintosh platforms (no longer supported).   _M_MRX000  Defined for MIPS platforms (no longer supported).   _M_PPC  Defined for PowerPC platforms (no longer supported).   _M_X64  Defined for x64 processors.   _MANAGED  Defined to be 1 when /clr is specified.   _MFC_VER  Defines the MFC version. For example, 0x0700 represents MFC version 7.   _MSC_EXTENSIONS  This macro is defined when compiling with the /Ze compiler option (the default). Its value, when defined, is 1.   _MSC_VER  Reports the major and minor versions of the compiler. For example, 1310 for Microsoft Visual C++ .NET 2003. 1310 represents version 13 and a 1.0 point release. The Visual C++ 2005 compiler version is 1400.  Type cl /? at the command line to see the major and minor versions of your compiler along with the build number.   __MSVC_RUNTIME_CHECKS  Defined when one of the /RTC compiler options is specified.   _MT  Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified.   _NATIVE_WCHAR_T_DEFINED  Defined when /Zc:wchar_t is used.   _OPENMP  Defined when compiling with /openmp, returns an integer representing the date of the OpenMP specification implemented by Visual C++.    Copy Code  // _OPENMP_dir.cpp // compile with: /openmp  #include <stdio.h>  int main() {    printf("%d\n", _OPENMP); }     _VC_NODEFAULTLIB  Defined when /Zl is used; see /Zl (Omit Default Library Name) for more information.   _WCHAR_T_DEFINED  Defined when /Zc:wchar_t is used or if wchar_t is defined in a system header file included in your project.   _WIN32  Defined for applications for Win32 and Win64. Always defined.    _WIN64  Defined for applications for Win64.   _Wp64  Defined when specifying /Wp64.    As shown in following table, the compiler generates a value for the preprocessor identifiers that reflect the processor option specified.  Option in Development Environment  Command-Line Option  Resulting Value   Blend  /GB  _M_IX86 = 600 (Default. Future compilers will emit a different value to reflect the dominant processor.)   Pentium  /G5  _M_IX86 = 500   Pentium Pro, Pentium II, and Pentium III  /G6  _M_IX86 = 600   80386  /G3  _M_IX86 = 300   80486  /G4  _M_IX86 = 400    See Also Concepts Macros (C/C++) Preprocessor Operators Preprocessor Directives Send feedback on this topic to Microsoft.

引用 5 楼 hgjyts65fg 的回复:__VAR_ARGS__是预编译处理的东西，没有头文件声明。 = =,那编译出问题是因为GCC的版本？ 因为我在网上看到不是所有的GCC都支持这个吧

我是用的gcc 4.4.4

引用 1 楼 JiMoKuangXiangQu 的回复:GCC: #define DEBUG(fmt, ...) RecordLog(__FUNCTION__, fmt, __VAR_ARGS__) __VAR_ARGS__是哪个头文件的？ 我gcc怎么编译没有声明？

引用 1 楼 JiMoKuangXiangQu 的回复:GCC: #define DEBUG(fmt, ...) RecordLog(__FUNCTION__, fmt, __VAR_ARGS__)  正解


Question: HID报告描述符具体问题，请高手来帮忙

来点人哈，

有人帮下忙不？


引用 2 楼 u012232386 的回复:难道我又进错地了？90分都没人回答？就这么多了，满意瞬结  这个只是一个预读参数而已！会预读出数据，来确定数据大小，合理分配缓存大小！ 数据还是在发送队列里的，后面你再次读取数据的时候也会读到这些数据的！所以只是一个预读功能！

难道我又进错地了？90分都没人回答？就这么多了，满意瞬结

up it by myself, thanks

查MSDN是Windows程序员必须掌握的技能之一。 mk:@MSITStore:C:\MSDN98\98VS\2052\kb.chm::/Source/winnt/q147714.htm  Windows Sockets 2 Service Provider Interface Limitations Last reviewed: October 15, 1997 Article ID: Q147714   The information in this article applies to:  Microsoft Windows NT Workstation versions 3.5, 3.51, and 4.0  Microsoft Windows NT Server versions 3.5, 3.51, and 4.0    SUMMARY The Windows Sockets 2 Service Provider Interface (Revision 2.1.0) provides specifications for transport network programming under Windows. This interface is the most comprehensive open transport API designed to date. However, few limitations exist. The purpose of this article is to list and describe the limitation items of the specifications and provide alternative solutions to work around the limitation items. The information below is contributed by the Windows Sockets Vendor Community.     MORE INFORMATION …… 12.Polling with recv(MSG_PEEK) to determine when a complete message has arrived.     Reason and Workaround not available. …… 24.Polling with ioctlsocket(FIONREAD) on a stream socket until a complete "message" appears.     Reason: A stream socket (TCP) does not preserve message boundaries     (please see item 18 above). An application that uses ioctlsocket()     FIONREAD or recv(MSG_PEEK) to wait for a complete "message" to arrive     may not succeed. One reason is due to the internal WinSock system     buffering. If the bytes in a "message" straddle a system buffer     boundary, the WinSock does not report bytes that exist in other     buffers.      Workaround: Do not use peek reads. Read data into your application     buffers and examine it there. ……

引用 13 楼 angel_su 的回复:2次GetSocket()确定一样吗，只调用一次用个变量记住试试...  是一样的，相同的套接字 ubunto我测试过了，正常 vc2010过不了，我怀疑会不会是 winsock这套，我做设置给搞坏了

2次GetSocket()确定一样吗，只调用一次用个变量记住试试...

char response[4096], *pstr = NULL; int readsize;  memset(response, 0, sizeof(response)); if((readsize = RECV(GetSocket(), response, sizeof(response)-4, MSG_PEEK)) <= 0) {     printf("readsize = %d <=0 !\n");     return -1; } if((pstr = strstr(response, "\r\n\r\n")) == NULL) {     printf("strstr(response, \"\\r\\n\\r\\n\")) == NULL !\n");     return -1; } printf("readsize = %d, PEEK response = [%s]\n\n\n", readsize, response);  memset(response, 0, sizeof(response)); if(RECV(GetSocket(), response, readsize, 0) != readsize) {     printf("RECV(GetSocket(), response, readsize, 0) != readsize\n");     return -1; } printf("READ response = [%s]\n\n\n", response);

引用 10 楼 zhao4zhong1 的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html  ......测过了，用的ubuntu没问题，vc2010就不行

引用 8 楼 user-4 的回复:[quote=引用 7 楼 user-4 的回复:] if((readsize = RECV(GetSocket(), response, sizeof(response)-4, MSG_PEEK)) < 0) return -1; if((pstr = strstr(response, "\r\n\r\n")) == NULL) return -1;  strstr之前你至少将你的http请求当前读到的部分封一个\0结尾吧。  楼主的用意就是先peek看看有有\r\b\r\n不，有了再把header+body的4字节读进来，目前看来只有strstr这里会有问题，。  噢噢，不是读body，是读\r\n\r\n。[/quote]  对，就是查看有没有\r\n\r\n， 有的话 把header+\r\n\r\n 拿出来，不要动body内容

引用 7 楼 user-4 的回复:if((readsize = RECV(GetSocket(), response, sizeof(response)-4, MSG_PEEK)) < 0) return -1; if((pstr = strstr(response, "\r\n\r\n")) == NULL) return -1;  strstr之前你至少将你的http请求当前读到的部分封一个\0结尾吧。  楼主的用意就是先peek看看有有\r\b\r\n不，有了再把header+body的4字节读进来，目前看来只有strstr这里会有问题，。  噢噢，不是读body，是读\r\n\r\n。

引用 5 楼 max_min_ 的回复:[quote=引用 4 楼 u012232386 的回复:] [quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 u012232386 的回复:] 难道我又进错地了？90分都没人回答？就这么多了，满意瞬结  这个只是一个预读参数而已！会预读出数据，来确定数据大小，合理分配缓存大小！ 数据还是在发送队列里的，后面你再次读取数据的时候也会读到这些数据的！所以只是一个预读功能！ [/quote] 我知道是预读的功能，但是我预读玩了之后，再读取的时候，前面预读的那些数据确实是没了，不再底层接收缓冲区中了[/quote] 不会吧？是不是那里代码处理出了问题？重新读取数据的时候，不是预读的数据？[/quote]  我也是怀疑会不会是代码哪里没处理好，但是查了一上午也没找出什么不对的地

引用 4 楼 u012232386 的回复:[quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 u012232386 的回复:] 难道我又进错地了？90分都没人回答？就这么多了，满意瞬结  这个只是一个预读参数而已！会预读出数据，来确定数据大小，合理分配缓存大小！ 数据还是在发送队列里的，后面你再次读取数据的时候也会读到这些数据的！所以只是一个预读功能！ [/quote] 我知道是预读的功能，但是我预读玩了之后，再读取的时候，前面预读的那些数据确实是没了，不再底层接收缓冲区中了[/quote] 不会吧？是不是那里代码处理出了问题？重新读取数据的时候，不是预读的数据？

引用 3 楼 max_min_ 的回复:[quote=引用 2 楼 u012232386 的回复:] 难道我又进错地了？90分都没人回答？就这么多了，满意瞬结  这个只是一个预读参数而已！会预读出数据，来确定数据大小，合理分配缓存大小！ 数据还是在发送队列里的，后面你再次读取数据的时候也会读到这些数据的！所以只是一个预读功能！ [/quote] 我知道是预读的功能，但是我预读玩了之后，再读取的时候，前面预读的那些数据确实是没了，不再底层接收缓冲区中了


Question: c语言问题-分解单链表

也就是说a=a->next;语句必须在insert()函数之前，仔细分析insert()函数， 你传入的第二个参数p,在insert函数中修改了p的next指针， 在resolve函数中，如果a=a->next放在里面，也就是insert()函数前面，就会被你在insert()中修改，返回时就找不到原来的链表，所以会陷入死循环。  http://www.onestraw.net

嗯嗯，谢谢，我昨天也想明白了，你这样做效率更高（是不是？我学了时间复杂度，从这个角度来讲还想没有提高，从别的方面呢）

引用 楼主 xd2ss 的回复:新手求助课堂作业 已知由具有头结点的单链表表示的线性表中，含有三类字符的数据元素（字母、数字和其他字符），试编写算法构造三个以循环链表表示的线性表，使每个表中只含有同一类的字符，且利用原表中的结点空间，头结点可另辟空间。  我写的代码如下：  #include<stdio.h> #include<malloc.h> typedef char datatype; typedef struct node {     datatype data;     struct node *next; } linklist; void create(linklist*&); void resolve(linklist*,linklist*,linklist*,linklist*); void insert(linklist*,linklist*); void print1(linklist*); void print2(linklist*); int main() {     linklist *head,*letter,*digit,*other;     create(head);     print1(head);     letter=(linklist*)malloc(sizeof(linklist));//建立3个空循环链表     letter->next=letter;     digit=(linklist*)malloc(sizeof(linklist));     digit->next=digit;     other=(linklist*)malloc(sizeof(linklist));     other->next=other;     resolve(head,letter,digit,other);//调用分解单链表的函数     print2(letter);//输出循环链表     print2(digit);     print2(other); }  //建立单链表 void create(linklist*&head) {     datatype x;     linklist *s,*r;     head=new linklist;     r=head;     while((x=getchar())!='\n')     {         s=(linklist*)malloc(sizeof(linklist));         s->data=x;         r->next=s;         r=s;     }     r->next=NULL; }  //在循环链表中插入 void insert(linklist*h,linklist*p) {     linklist *q=h;     while(q->next!=h) q=q->next;     q->next=p;     p->next=h; }  //输出单链表 void print1(linklist*head) {     linklist *p=head->next;     while(p!=NULL)     {         printf("%c",p->data);         p=p->next;     }     printf("\n"); }  //输出循环链表 void print2(linklist*head) {     linklist *p=head->next;     while(p!=head)     {         printf("%c",p->data);         p=p->next;     }     printf("\n"); }  //添加按字母、数字、其它字符分解单链表算法 void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other) {     linklist *a,*temp;     a=head->next;     while(a!=NULL)     {         if(a->data>=65&&a->data<=90||a->data>=97&&a->data<=122)         {             temp=a;             a=a->next;              //*这句话不能放到选择外面             insert(letter,temp);         }         else if(a->data>=48&&a->data<=57)         {             temp=a;             a=a->next;             insert(digit,temp);         }         else         {             temp=a;             a=a->next;             insert(other,temp);         }         //a=a->next;     } }   Question： 最后一个resolve函数里面的'a=a->next'这句为什么不能放到选择外面？放到外面后进入Insert函数后就陷入了死循环，不断重复insert(other,temp)。 可以的 这样做  //添加按字母、数字、其它字符分解单链表算法 void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other) {     linklist *a,*temp;     a=head->next;     linklist * insLst;     while(a!=NULL)     {         if(a->data>=65&&a->data<=90||a->data>=97&&a->data<=122)         {    insLst = letter; }         else if(a->data>=48&&a->data<=57)         {    insLst =digit;  }         else   { insLst = other;}         temp = a;         a = a->next;              //*这句话能放到选择外面         insert( insLst,temp);    //因为这句话，所以你的做法，不能放到外面     } }


Question: c语言代码问题-分解单链表


Question: 再次求人传道授业解惑！！

操作p指向的内存块越界了，即你分配了10个int，操作的p的时候出现了p[10],p[11]的类似状况。

引用 5 楼 loveice582 的回复:万分感谢 不过我之前写的是int *p=(int *)malloc(10）也报错 改成你这样就不报错了：int *p=malloc(10*sizeof(int))  请问这2句不是一个意思么？  [quote=引用 4 楼 JiMoKuangXiangQu 的回复:] int *p=malloc(10),i;修改为 int *p=malloc(10*sizeof(int)),i; 引用 2 楼 zhou19891113 的回复:int *p=malloc(10) 这句话有问题，你的意思是要分配10个int大小的空间，但是malloc(10)只能分配10个Byte，所以后面的代码肯定有段错误。 改成：int *p = malloc(sizeof(int) * n);   建议你的全局变量换个定义方式： int a[]={5,4,2,1,53,5,3,5,54,7}; const int n = sizeof(a) / sizeof(a[0]);[/quote]  malloc()的参数是字节数。 现在你的目的是分配是个整形的空间，需要字节数为：10 * sizeof(int)； 而当形式 malloc(10) 调用，只向堆上申请了 10 个字节，而不是10个int需要的空间 10 * sizeof(int)。

万分感谢 不过我之前写的是int *p=(int *)malloc(10）也报错 改成你这样就不报错了：int *p=malloc(10*sizeof(int))  请问这2句不是一个意思么？  引用 4 楼 JiMoKuangXiangQu 的回复:int *p=malloc(10),i;修改为 int *p=malloc(10*sizeof(int)),i; 引用 2 楼 zhou19891113 的回复:int *p=malloc(10) 这句话有问题，你的意思是要分配10个int大小的空间，但是malloc(10)只能分配10个Byte，所以后面的代码肯定有段错误。 改成：int *p = malloc(sizeof(int) * n);   建议你的全局变量换个定义方式： int a[]={5,4,2,1,53,5,3,5,54,7}; const int n = sizeof(a) / sizeof(a[0]);

在 free 前检查 p 的值是否与 malloc 的返回值一致


Question: 关于使用循环读写文件问题，不懂，求大神解答。。。

引用 3 楼 lm_whales 的回复:[quote=引用 楼主 zaixiankaifa 的回复:]  问题： 标注为红色的代码中： if(read(rfd,&c,1)!=1) 			return 1; 		write(wfd,&c,1); 一旦 if(read(rfd,&c,1)!=1) return 1; 那么就不可能去写：write(wfd,&c,1);(因为前面都已经return 1了）。这样还能循环从前一个文件读取字符，然后写入到下一个文件里面吗？  这个代码是不是有问题？ 没有任何问题。 read(rfd,&c,1)==1 表示读到数据。可以写文件。 read(rfd,&c,1)!=1 表示没有读到数据，所以不用写。  而且，一旦read(rfd,&c,1)!=1  就是文件读出错了，或者读到文件结束了。  所以写文件也可以结束了。 [/quote]  那read(rfd,&c,1)==1读到数据的时候，也要把“读”这个操作写上去才行呀？  不然，只把读不到的情况写上去，那么读的到数据的情况不写，如何读到哦？

引用 楼主 zaixiankaifa 的回复:问题： 标注为红色的代码中： if(read(rfd,&c,1)!=1) 			return 1; 		write(wfd,&c,1); 一旦 if(read(rfd,&c,1)!=1) return 1; 那么就不可能去写：write(wfd,&c,1);(因为前面都已经return 1了）。这样还能循环从前一个文件读取字符，然后写入到下一个文件里面吗？  这个代码是不是有问题？ 没有任何问题。 read(rfd,&c,1)==1 表示读到数据。可以写文件。 read(rfd,&c,1)!=1 表示没有读到数据，所以不用写。  而且，一旦read(rfd,&c,1)!=1  就是文件读出错了，或者读到文件结束了。  所以写文件也可以结束了。

我明白了，没有问题的，谢谢大神指点

就这3行代码来看，应该没什么问题的。。。

补充一下，感觉fork子进程，没有必要。还有就是没有close两个文件

ssize_t read(int filedes, void *buf, size_t nbytes);   Returns: number of bytes read, 0 if end of file, -1 on error  When reading from a regular file, if the end of file is reached before the requested number of bytes has been read. For example, if 30 bytes remain until the end of file and we try to read 100 bytes, read returns 30. The next time we call read, it will return 0 (end of file).  When reading from a terminal device. Normally, up to one line is read at a time. (We'll see how to change this in Chapter 18.)  When reading from a network. Buffering within the network may cause less than the requested amount to be returned.  When reading from a pipe or FIFO. If the pipe contains fewer bytes than requested, read will return only what is available.  When reading from a record-oriented device. Some record-oriented devices, such as magnetic tape, can return up to a single record at a time.

代码是应该有问题的！ 而且中间的fork函数你没有处理父子进程呢！


Question: 某大公司的笔试题，单单是看代码可以得出结果，但是写代码验证的时候老是通不过编译，细细一看，感觉题目有错，请指教。

这是MFC里的CString类型的方法. 之前还真没看到过。。。哎~~查了MSDN才知道的

面试题不要纠结于能不能编译过，只要能说出结果就可以了。

而且没见过 c++ string 类有大写字母开头的成员函数(Left,Mid,GetLength)。

有问题啊，string是c++类，c++中main()可以没有返回值的吗？

没关return的事的。。

谢谢大家。。可能我太执着要验证，我也查过CString，没用过。Left,Mid,GetLength貌似也在MFC中使用，要联合CString一起用，可能是编译环境问题造成错误。

看这函数的调用，应该是MFC的CString才对，没想到还有大公司笔试MFC的…… 不太记得了，帮你搜了一下，看看应该有帮助： http://hi.baidu.com/drunkdream/item/d6c2fb0c5ea84ccf75cd3cd9

这个编译不过，就是表达一下语意

C++环境下编译我也试过了。。。。。

C语言中没有string类 在C++中才有


Question: 外部函数 与 include的区别

楼主，其实这是编译器干的事情。 我简单随性点说吧：  #include “A.h” 这个宏告诉编译器，这个文件要把A.h 中的内容全部复制过来。  extern int fun 告诉编译器： 有这个函数，你在这个文件里可以使用这个函数，但是这个函数是在另外一个文件中定义的。

#include 可以看做是接口的组织方式。

各有优劣，适用于不同的场合。就extern而言，因为C++支持分离式编译，声明和定义可分开进行，声明只是使得名字为程序所知，就像知道有这么个人而且他是美国人就可以了，一个文件如果想使用别处定义则必须包含对那个名字的声明，就像我们需要一个美国外教，他不一定非得呆在我们学校，而定义是创建了这样一个实体。定义出现在他该出现的地方，但别处需要时需要只需要声明，像个客座教授，在别的学校只挂了名，人家有需求要去时才去，平日就呆自己学校。

extern 用多了，会造成整个程序的架构的混乱，include就比较清晰了。建议少用extern

函数默认链接属性是 extern。  这里显示的使用 extern 关键字，是因为该函数是非 c 的，需要链接器进行特别的处理。   如；汇编或其他编译器生成的函数。   头文件其实就是交叉引用表。也就是说，你需要在两个以上的文件中使用该表格，才能起到交叉引用的作用。 否则，你是不需要这份表格的。 #include

因为include方便管理, extern一般只是用于在某个头文件中声明其对应cpp中定义的变量, 方便被其它头文件包含而不会重定义.  extern一般写在头文件中, 要用extern声明的变量的时候, 包含头文件即可.  你说的include会重现重定义, 是因为你把 变量的定义 或者 函数的实现写在了头文件中, 而这些变量一般应该写在.cpp中, 除非你自己能保证这个头文件不会出现重复包含.  不过, 在头文件中也有解决变量重定义的问题.  __declspec(selectany) int g_val = 0;

工程大文件多，你就会乖乖#include...

extern是外部的意思。 这是一个储存类型~但是如果函数定义前加上extern或缺省，表示该函数可以被其它源文件的函数所调用（但在那个源文件中必须对该函数先进行声明，进行作用域扩展），叫外部函数。

一个头文件可以包含很多（函数原型和类型）声明. 推荐使用#include 头文件，不要总是使用前显示声明：避免重复代码， 也避免风险。

如果只是用函数的话，一般情况下是不用include的，因为函数的实现在.c文件中，如果你要include的话还得把函数的声明写到.h文件中，使用extern效果一样。使用include的话一般是为了使用这个.h文件的结构体或者宏定义，因为宏没法extern。

函数原型声明的extern 可以省略。 因为函数的存储类型，缺省是extern 。 头文件里的函数，一般不写extern 。 外部变量声明，一般不能省略extern。

引用 1 楼 N_sev7 的回复:extern只是告诉编译器有这个函数，用就行了 但是当连接的时候，如果在不同的工程里面 若不包含定义此函数的头文件则会报错  详细解析可以参考如下 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 这篇文章介绍挺详细的，谢谢

引用 2 楼 max_min_ 的回复:#include 和外部函数完全不同的东西，那里有什么可比性啊！ 如果有N个函数，N个结构体 ，你一个一个extern么？  如果有N个函数，N个结构体 在 M 个 c 文件中，你能保证每处都 extern 的一样吗？

引用 2 楼 max_min_ 的回复:#include 和外部函数完全不同的东西，那里有什么可比性啊！ 如果有N个函数，N个结构体 ，你一个一个extern么？ 今天在gcc下试的不用extern，直接调用外部函数也可以，而在windows下却不可以，难道是编译器的不同造成的？


Question: fread函数读出来是乱码，求破。。。

#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; }

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

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

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

没有初始化额~

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

程序又做了如下修改： #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函数却没有出现乱码。。。囧

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);

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

用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;

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

写进去数据的时候，是不是也是以二进制的方式写进去的呢？


Question: 什么是 block hashes

楼上正解，应该是大数据分块计算hash。

假如有消息长n个字节，现在把它分成k个小块，标记为n1, n2, ..., nk. 然后执行下面的hash过程：  先计算n1的hash值，这个值连同n2会作为第二步hash函数的输入；依次类推，数学函数是  hash(hash(n[i-1]), ni) for i∈[2, k]   当然，第一个块需要特殊处理下。


Question: 各位朋友能不能进来帮忙看一下我的这个程序哪里有问题？

格式以下： LinkList In_LinkList(LinkList A,LinkList B) {   LinkList C;   LNode *p,*q,*m,*r,*s;   C = (LinkList)malloc(sizeof(LNode));   C->next = NULL;   m = C;   s = p = A->next;   r = q = B->next;       while(s && r ){        q = r; //找到相同数据,B链表从相同数据后,开始查找            //否则从头查找         while(p && q){        if(p->data == q->data)       {          //m->next = p; //这是错误的，求交集不会破坏源链表，所以要创建新节点。            m->next = (LinkList)malloc(sizeof(LNode));//创建新节点。            m->next->data = p->data;//复制数据。            m = m->next;            //新节点作为当前节点。            m->next = NULL;         //新节点是尾节点，所以 next 为 NULL。            p = p->next;            r = q = q->next;       //找到相同数据,B链表从此后开始查找                          }       else         q = q->next;       }      //p = p->next; 这里有点问题，修改如下：       if(s == p)           p = s = s->next;//没有找到相同数据，更新A 链表的下一个节点。      else s = p; //已经找到若干节点数据相同，节点已经更新，直接用p作为，A 链表的下一个节点。      }   return C; }

LinkList In_LinkList(LinkList A,LinkList B) 这个函数写的有问题  LinkList In_LinkList(LinkList A,LinkList B) {   LinkList C;   LNode *p,*q,*m,*r;   C = (LinkList)malloc(sizeof(LNode));   C->next = NULL;   m = C;   p = A->next;   r = q = B->next;      while(p && r ){        q = r;     while(p && q){        if(p->data == q->data)       {          //m->next = p; //这是错误的，求交集不会破坏源链表，所以要创建新节点。            m->next = (LinkList)malloc(sizeof(LNode));//创建新节点。            m->next->data = p->data;//复制数据。            m = m->next;            //新节点作为当前节点。            m->next = NULL;         //新节点是尾节点，所以 next 为 NULL。            p = p->next;            q = q->next;            r = q;        }       else         q = q->next;       }      p = p->next;    }   return C; }  PS :    你可能没有理顺，求交集的逻辑，所以代码得不到，你想要的结果。

我懂了，谢谢楼上大神。。

试了各种方法，楼上大神们说的我也调过了，但是结果还是没有出来。。C就是显示不了

void main()  {    LinkList A = NULL;   LinkList B = NULL;   LinkList C = NULL;  //这里直接置空就好了，    //2楼说的不行吧，不能malloc，因为你后面会返回malloc的地址，这里malloc的话导致内存泄露的！

++  引用 2 楼 N_sev7 的回复: #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define NULL 0  typedef struct node {   int data;   struct node *next; }LNode,*LinkList;  LinkList create_LinkList() {   int x;   LinkList L;   LNode *r;   L=(LinkList)malloc(sizeof(LNode));   L->next=NULL;   r=L;   printf("input the value x:\n");   scanf("%d",&x);   while(x)   {     r->next=(LNode *)malloc(sizeof(LNode));     r->next->data=x;     r=r->next;     scanf("%d",&x);   }   r->next=NULL;   return L; }  LinkList In_LinkList(LinkList A,LinkList B) {   LinkList C;   LNode *p,*q,*m;   C=(LinkList)malloc(sizeof(LNode));   C->next=NULL;   m=C;   p=A->next;   q=B->next;   while(p&&q)   {     if(p->data==q->data)     {       m->next=p;       m=p;       m->next=NULL;       p=p->next;       q=q->next;     }     else       q=q->next;    }   return C; }  void Print_LinkList(LinkList p) {   LNode *q=p->next;   while(q)   {     printf("%3d",q->data);     q=q->next;   }   printf("\n"); }  void main() {   LinkList A,B,C;   //这里你定义了C  C的类型是指针  但是你都没有给他申请空间   C->next=NULL;     ///而这里你就直接开始用next了 C都没有空间你怎么给next赋值  显然不行的    //C =  (LinkList)malloc(sizeof(LNode));   ////加上这句     A=create_LinkList();   B=create_LinkList();   C=In_LinkList(A,B);   printf("A: ");   Print_LinkList(A);   printf("\nB: ");   Print_LinkList(B);   printf("\nC: ");   Print_LinkList(C);   getch(); }

这种问题，要自己学会设置断点，逐步调试，看哪里出了问题，这是程序员必须会的


Question: C中printf("^\b");中的\b怎么回退不了啊

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

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

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

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

应该是printf("^\b");  引用 楼主 zch_1027452269 的回复:#include<stdio.h> #include<string.h>  int main(int argc,char *argv[]) { 	printf("\^\b"); 	puts(""); }


Question: 线程池中的一个互斥锁问题

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

那要看你是不是需要其他线程也看到这个变量值了。还有，就是你的这个work值会不会影响其他线程，要看你的逻辑是如何设计和要做成什么结果。


Question: 怎么选择椭圆曲线？a，b怎么确定

引用 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 那一章。这本书网上有电子版，四处都能找得到~~

引用 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还有什么限定条件，导致有时候不合理。

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

都x的立方了，这还是椭圆曲线吗？


Question: 0x5470B49C (msvcr110d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0xCCCCCCCC 时发生访问冲突。

如何调试到正常运行？

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

改了还是不对的。

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

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

不懂，可以就我这个问题说得明白点么？

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


Question: 如何在二叉树上加上中序遍历线索~~~~

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

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

#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; }  供参考。


Question: 无需定义与输入输出，求指教！

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

//程序入口 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; }

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

还是无法通过啊

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

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++;     }


Question: 指针和数组名作为重载函数的参数时遇到的问题

真的没办法吗，有没有谁能想到只需要1个形参就能实现重载的办法

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; }

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

当数组当参数在函数传递的时候，指针和数组是一样的！

数组到形参那会弱化成指针的，所以这俩个没有区别。。。


Question: 相同目录下定义在一个头文件的变量可以在另一个头文件直接用吗

引用 2 楼 max_min_ 的回复:正常情况如果没有包含头文件的话，是应该报错的！  贴代码看看，是不是那里没注意到！  #ifndef X264_SET_H #define X264_SET_H 只有这个

你能确定一定没有引入那个头文件吗？ 可能是引入了其他头文件，其他有文件又引入了那个需要的头文件，你最好找找看，一般是会报错的。

无法理解！  引用 楼主 u010950654 的回复:看到一个几个文件，在一个头文件中定义了一个结构体，在另一个头文件中声明一个函数，参数类型是那个结构体，但是这个头文件没有包含定义结构体的头文件，运行的时候却没有错，请问这个是可以通过编译器设置做到的吗？

肯定是有地方引用了这个头文件的.  你全工程搜索那个头文件的文件名, 应该就能找到.  比如stdafx.h中.

x264的09版的   #ifndef X264_SET_H #define X264_SET_H   enum profile_e {     PROFILE_BASELINE = 66,     PROFILE_MAIN     = 77,     PROFILE_EXTENDED = 88,     PROFILE_HIGH    = 100,     PROFILE_HIGH10  = 110,     PROFILE_HIGH422 = 122,     PROFILE_HIGH444 = 144,     PROFILE_HIGH444_PREDICTIVE = 244, };  enum cqm4_e {     CQM_4IY = 0,     CQM_4PY = 1,     CQM_4IC = 2,     CQM_4PC = 3 }; enum cqm8_e {     CQM_8IY = 0,     CQM_8PY = 1 };  typedef struct {     int i_id;      int i_profile_idc;     int i_level_idc;      int b_constraint_set0;     int b_constraint_set1;     int b_constraint_set2;      int i_log2_max_frame_num;      int i_poc_type;     /* poc 0 */     int i_log2_max_poc_lsb;     /* poc 1 */     int b_delta_pic_order_always_zero;     int i_offset_for_non_ref_pic;     int i_offset_for_top_to_bottom_field;     int i_num_ref_frames_in_poc_cycle;     int i_offset_for_ref_frame[256];      int i_num_ref_frames;     int b_gaps_in_frame_num_value_allowed;     int i_mb_width;     int i_mb_height;     int b_frame_mbs_only;     int b_mb_adaptive_frame_field;     int b_direct8x8_inference;      int b_crop;     struct     {         int i_left;         int i_right;         int i_top;         int i_bottom;     } crop;      int b_vui;     struct     {         int b_aspect_ratio_info_present;         int i_sar_width;         int i_sar_height;          int b_overscan_info_present;         int b_overscan_info;          int b_signal_type_present;         int i_vidformat;         int b_fullrange;         int b_color_description_present;         int i_colorprim;         int i_transfer;         int i_colmatrix;          int b_chroma_loc_info_present;         int i_chroma_loc_top;         int i_chroma_loc_bottom;          int b_timing_info_present;         int i_num_units_in_tick;         int i_time_scale;         int b_fixed_frame_rate;          int b_bitstream_restriction;         int b_motion_vectors_over_pic_boundaries;         int i_max_bytes_per_pic_denom;         int i_max_bits_per_mb_denom;         int i_log2_max_mv_length_horizontal;         int i_log2_max_mv_length_vertical;         int i_num_reorder_frames;         int i_max_dec_frame_buffering;          /* FIXME to complete */     } vui;      int b_qpprime_y_zero_transform_bypass;  } x264_sps_t;  typedef struct {     int i_id;     int i_sps_id;      int b_cabac;      int b_pic_order;     int i_num_slice_groups;      int i_num_ref_idx_l0_active;     int i_num_ref_idx_l1_active;      int b_weighted_pred;     int b_weighted_bipred;      int i_pic_init_qp;     int i_pic_init_qs;      int i_chroma_qp_index_offset;      int b_deblocking_filter_control;     int b_constrained_intra_pred;     int b_redundant_pic_cnt;      int b_transform_8x8_mode;      int i_cqm_preset;     const uint8_t *scaling_list[6]; /* could be 8, but we don't allow separate Cb/Cr lists */  } x264_pps_t;  /* default quant matrices */ static const uint8_t x264_cqm_jvt4i[16] = {       6,13,20,28,      13,20,28,32,      20,28,32,37,      28,32,37,42 }; static const uint8_t x264_cqm_jvt4p[16] = {     10,14,20,24,     14,20,24,27,     20,24,27,30,     24,27,30,34 }; static const uint8_t x264_cqm_jvt8i[64] = {      6,10,13,16,18,23,25,27,     10,11,16,18,23,25,27,29,     13,16,18,23,25,27,29,31,     16,18,23,25,27,29,31,33,     18,23,25,27,29,31,33,36,     23,25,27,29,31,33,36,38,     25,27,29,31,33,36,38,40,     27,29,31,33,36,38,40,42 }; static const uint8_t x264_cqm_jvt8p[64] = {      9,13,15,17,19,21,22,24,     13,13,17,19,21,22,24,25,     15,17,19,21,22,24,25,27,     17,19,21,22,24,25,27,28,     19,21,22,24,25,27,28,30,     21,22,24,25,27,28,30,32,     22,24,25,27,28,30,32,33,     24,25,27,28,30,32,33,35 }; static const uint8_t x264_cqm_flat16[64] = {     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16,     16,16,16,16,16,16,16,16 }; static const uint8_t * const x264_cqm_jvt[6] = {     x264_cqm_jvt4i, x264_cqm_jvt4p,     x264_cqm_jvt4i, x264_cqm_jvt4p,     x264_cqm_jvt8i, x264_cqm_jvt8p };  int  x264_cqm_init( x264_t *h ); void x264_cqm_delete( x264_t *h ); int  x264_cqm_parse_file( x264_t *h, const char *filename );  #endif 我在调用的时候int  x264_cqm_init( x264_t *h );这个是报错的，x264_t未定义，但是原作者的程序却畅通无阻


Question: 求助，如何实现EXCEL表的拆分

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

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

用VBA吧。

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

将Excel文件另存为.csv格式，然后就随便搞了


Question: 求助，调用c编译的lib，库函数不识别自己定义的结构体

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

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

自己在 set.h 里面加上呢？

引用 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++目录，包含目录，该加的都加进去了

全部加进去了

看看库的搜索路径是否配置好。  引用 楼主 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也是库里定义的啊

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

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


Question: 最小值的计算

引用 19 楼 zhaocanxing 的回复:[quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的   }else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);  这段不是很懂，m = LINE的时候不是应该往右走的吗？应该return Array[m][n] + min(m, n+1);才对的吧？[/quote] 呵呵，左右没分清，对的，向右走。m==LINE对于数组是越界了，所以我没用到这个数，你看下。

蛮有意思的，先记下了

引用 5 楼 shangyu0801 的回复: #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的   }else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);  这段不是很懂，m = LINE的时候不是应该往右走的吗？应该return Array[m][n] + min(m, n+1);才对的吧？

引用 17 楼 tengerye 的回复:[quote=引用 16 楼 Adol1111 的回复:] [quote=引用 14 楼 tengerye 的回复:] 。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？ 用尾递归就好了，效率、空间上比递归要好多了（编译器开优化），而且还能保持递归的直观性。[/quote] 好像java编译器不能支持尾递归。其实我的意思也不是不能用，因为养成了“洁癖”，每次对复杂度特别关注，所以我是坚决不用的。还有就是怕大家吃了我同学的亏，好像的提醒一下。[/quote] ....完全没必要吧，递归有递归的优点，也有自己的缺陷。任何东西都是一样的，只要自己掌握好尺度就可以了。 至于语言不支持那我也没办法了。

引用 16 楼 Adol1111 的回复:[quote=引用 14 楼 tengerye 的回复:] 。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？ 用尾递归就好了，效率、空间上比递归要好多了（编译器开优化），而且还能保持递归的直观性。[/quote] 好像java编译器不能支持尾递归。其实我的意思也不是不能用，因为养成了“洁癖”，每次对复杂度特别关注，所以我是坚决不用的。还有就是怕大家吃了我同学的亏，好像的提醒一下。

引用 10 楼 tengerye 的回复:[quote=引用 9 楼 shangyu0801 的回复:] [quote=引用 7 楼 tengerye 的回复:] [quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。[/quote] 求更快的方案。。。[/quote] 更快的我已经说了阿，兄台。[/quote] 这个算法我也想到了，这个递归是没有任何剪枝的遍历，可以说是最大的复杂度，。不过对这些优秀的算法都不熟，不怎么会分析，大虾能以此为例给我普及下动态规划么？不胜感激。

学习。。。。。。。

引用 14 楼 tengerye 的回复:。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？ 用尾递归就好了，效率、空间上比递归要好多了（编译器开优化），而且还能保持递归的直观性。

动态规划在算分导论里已经说的比较清楚，如果没有这本书的话，可以上维基百科，里面有这个词条。祝好运了。

引用 7 楼 tengerye 的回复:[quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。[/quote] 求更快的方案。。。

节点上的数值范围确定的话，就用A-star  范围不定或者浮动变化很大就用dijkstra吧。都是比较简单的算法，网上也多，我就不码代码了。

引用 9 楼 shangyu0801 的回复:[quote=引用 7 楼 tengerye 的回复:] [quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。[/quote] 求更快的方案。。。[/quote] 更快的我已经说了阿，兄台。

奉劝各位兄台一句，用递归容易溢出。所有递归都可以转化为非递归的。

引用 5 楼 shangyu0801 的回复: #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。

这个题为什么最近这么火，两次看到了！

楼主，你得说清楚啊，“每一个a[][]赋值”，这些值里面有没有负数？如果有那就可能没有最小只有更小了。如果都是正数，那动态规划就可以了。总共的移动步子是固定的，数目是2*(n-1). Greedy Algorithm应该是不行的。 动态规划楼主应该会吧？

A star？似乎比a star简单

这题目挺好玩。mark，有空看下。


Question: 算法导论中的拓扑排序问题

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


Question: 万年历问题

引用 2 楼 turingo 的回复:看的头晕就多在纸上画画，手眼结合比较好。 画了的啊，亲

看的头晕就多在纸上画画，手眼结合比较好。

帮忙一下啦。。。

引用 4 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。  #include <stdio.h>  int main(void) {     int a, i, j, n, k, t, w, x, y, z;     static int d[13][80];   //d[1..12][]对应12个月，d[月][10..17第一行，20..27第二行，……，60..67第六行共六行本月日期]     int m[14] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};     char wst[] = " Sun Mon Tue Wed Thu Fri Sat   ";     printf("Please enter the year: ");     scanf("%d", &y);      if(y%4==0 && y%100!=0 || y%400==0)  /*闰年的二月为29天*/         m[2] = 29;     w = (y+(y-1)/4-(y-1)/100+(y-1)/400)%7; /*计算y年元旦为星期w*/     for(i=1; i<=12; i++)   //月份     {         a = 1;     //记录日期         for(j=1; j<=6; j++)       //第一行到第六行         {             for(k=0; k<=6; k++)   //星期日～星期六             {                 while(k<w) k=w; //例如2013年元 旦为星期2，即w=2                 d[i][j*10+w] = a;    //填写a到对应本月本行对应星期位置                 a++;                 w++;                 if(w==7) w=0;                 if(a>m[i]) break;             }             if(a>m[i]) break;         }     }     printf("input (1,2,3,4,6): "); //输入分几排显示月历     scanf("%d", &x);     for(k=1; k<=16*x-3; k++)         printf(" ");     printf("=====%d=====\n", y);   /*打印年号*/     for(n=1; n<=12/x; n++)     {         t = x*(n-1)+1;       //每排开始的月数         printf("\n    ");         for(z=1; z<=x; z++)         {             for(k=1; k<=15; k++)     //调整格式                 printf(" ");             printf("%2d", t+z-1);   /*打印月号*/             for(k=1; k<=14; k++)     //调整格式                 printf(" ");         }         printf("\n      ");         for(z=1; z<=x; z++)      /*按一横排x个月格式打印*/             printf("%s", wst);   /*打印星期标题*/         for(j=1; j<=6; j++)       //同上         {             printf("\n  ");             for(i=t; i<=t+x-1; i++)             {                 printf("   ");                 for(k=0; k<=6; k++)                     if(d[i][j*10+k]==0) /*空缺日期位置打印空格*/                         printf("    ");                     else                         printf("%4d", d[i][j*10+k]);/*打印日期*/             }         }     }      return 0; } 恩，谢谢，今后我一定会做到的，真的感谢


Question: 对指针进行解引用的错误

引用 19 楼 angel_su 的回复:换个低版本vc试试... 恩，用VS2012 没有出这个警告 对编译器完全不懂啊， VS2012 和 VS2013 编译器的变化还挺大？

换个低版本vc试试...

顶起来！！！！

引用 20 楼 dong50059 的回复:[quote=引用 19 楼 angel_su 的回复:] 换个低版本vc试试... 恩，用VS2012 没有出这个警告 对编译器完全不懂啊， VS2012 和 VS2013 编译器的变化还挺大？[/quote] 变化不大，基本上没什么变化，只是占用资源更大了。

有懂编译的人能给讲解下吗？

引用 3 楼 user-4 的回复: for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }   我是想在 pa->pb 这个指针所指向的内存上进行赋值运算等，而不是想在 pa 所指向的内存上运算， 这样写应该没有问题吧？ 用指针的加法来移动指针的话 （PB pt = (pa+i)->pb） ， 却没有警告， 换成数组形式的话，警告就出来了，它们本质上不是 一致的吗？ 有什么区别呢， 我的基础不太好，可能有不知道的地方，请指教

引用 5 楼 u012232386 的回复:[quote=引用 3 楼 user-4 的回复:]  for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }  正解，楼主 你应该写成： PB pt = (pa+i)->pb吧 至于你说的语法相通....看看运算符优先级吧[/quote]   PB pt = &pa->pb[i]; 和 PB pt = pa->pb +i ; 是相等的吧？  而PB pt = &pa->pb[i]; 和 PB pt = (pa+i)->pb 是不相等的， 我是这样认为的，如果有不对的地方，请指正

引用 3 楼 user-4 的回复: for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }  正解，楼主 你应该写成： PB pt = (pa+i)->pb吧 至于你说的语法相通....看看运算符优先级吧

我很想知道原因是为什么，语法上相同，为什么编译结果去不同

引用 15 楼 angel_su 的回复:说说用啥编译器，既然你对此有意见... 哈哈，我没啥意见，就是发现个问题想搞清楚而已 我是用 VS2013 编译的

引用 2 楼 worldy 的回复:pa->pb[i];和pa->pb+i;等价 但是和&pa->pb[i] 就不等价了 pa->pb[i];和pa->pb+i;不等价，应该是 pa->pb[i];和*(pa->pb+i);等价才对？

说说用啥编译器，既然你对此有意见...

引用 2 楼 worldy 的回复:pa->pb[i];和pa->pb+i;等价 但是和&pa->pb[i] 就不等价了 同意，这绝对不是等价的

没有人能给出解释吗？

引用 11 楼 dong50059 的回复:[quote=引用 10 楼 u012232386 的回复:] [quote=引用 9 楼 dong50059 的回复:] [quote=引用 8 楼 u012232386 的回复:] 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？[/quote]  嗯，应该是你写的，我给漏了，不好意思[/quote] 这样的话，PB pt = &pa->pb[i];  =====  PB pt = pa->pb +i ; 是正确的， 但分别使用它们两个，编译结果是不同的，不是很奇怪吗[/quote]  我也不知道为什么一个报一个不报，编译器给搞的，但是有一点： pa = (PA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 10 * sizeof(A));  if (pa == NULL){  return -1; } pa->pb = (PB)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);  if (pa->pb == NULL) {  return -1; } 你确定10个pa， 1个pb? 不是1个pa, 10个pb?  有个词 叫 越界！！

引用 10 楼 u012232386 的回复:[quote=引用 9 楼 dong50059 的回复:] [quote=引用 8 楼 u012232386 的回复:] 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？[/quote]  嗯，应该是你写的，我给漏了，不好意思[/quote] 这样的话，PB pt = &pa->pb[i];  =====  PB pt = pa->pb +i ; 是正确的， 但分别使用它们两个，编译结果是不同的，不是很奇怪吗

引用 9 楼 dong50059 的回复:[quote=引用 8 楼 u012232386 的回复:] 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？[/quote]  嗯，应该是你写的，我给漏了，不好意思

引用 8 楼 u012232386 的回复:这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？


Question: C语言中结构体成员的动态内存分配问题 [

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

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

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

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结构体变量，也可以说叫做这个结构体变量的定义，已经分配好内存了，你就可以操控内存了对里面的成员进行申请空间或者赋值等等。。。

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

动态分配内存是在运行期作的事情，编译期不会做！


Question: Jungle Roads 出问题，求解！

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

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

紧急 求回复!


Question: 如何将结构体转换为字符串？

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

引用 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]的。转换是肯定能转换的。只是我不知道我哪里出错了。

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)); 结果不对。求大神解答。

引用 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的值不对。而且下面输出的也不对。

我且问撸主,什么是字符串?????????

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

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

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

结构体是结构体，字符串是字符串怎么能这么转换？


Question: 为什么要内存对齐？

效率只是一个方面，有些甚至影响正确性。  在某些处理器上，只能采用自然对齐的访问，否则产生硬件异常，如原来Nokia的一些芯片。

引用 10 楼 wangdahu888 的回复:无量天尊,看在你一片求知若渴之心,贫道就把这篇珍藏多年的文章送与你,细读之,必大悟!!! http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html 这篇文章很好，学了很多东西

受益了

内存对齐关系到结构体孔洞、追加等无效数据，还涉及到总线利用率和指令执行速度。

因为数据传输总线是32位4个字节的。。。。这样可以保证数据传输速度。跨边界的数据会增加cpu分析数据的时间。。。

目前新的更X的CPU对这个有什么别的用处不是很清楚，但早期的CPU之所以要求（或prefer)内存对齐是因为地址总线的条数之类的问题吧。 比如16位地址总线只能访问65536个字节的内存，但如果地址单位是4字节的话，就可以访问4位的内存大小。  拿x86来说， x86是32位寄存器，所以一次一般读取4个字节，并且读取只能从4字节边界开始。如果你访问单个字节内存，CPU会把其它3个字节扔掉。 如果你要读取两个字节，但位于4字节边界两侧，CPU需要先读前边4字节，然后扔掉三个字节，再读取后边4字节，然后再扔掉其中的三个字节，然后把两次读取的结果拼成一个双字节。 所以双字节最好对齐到双字节边界，以保证CPU一次就可以读取。 而4字节值对齐到4字节边界也是一个道理。  这也是x86牛X，直接支持非对齐读取（虽然慢点），有些CPU是不支持这种跨边界读取的，所以C语言编译器有时要生成额外代码以处理跨界读取，其效率更慢。

一句话，提高内存地址的访问效率！

引用 10 楼 wangdahu888 的回复:无量天尊,看在你一片求知若渴之心,贫道就把这篇珍藏多年的文章送与你,细读之,必大悟!!! http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html 图解最好了，谢啦！看到了想看到的东西！

引用 7 楼 u011416173 的回复:[quote=引用 6 楼 caozhy 的回复:] 道理很简单，现代的处理器是超标量乱序执行的。 如果操作的数据没有对齐，那么就不能并行地写，即使它们没有相互依赖关系，但是他们位于同一个块上。你的意思是cpu只能对不同的块进行并行读写是吧。可是内存对齐有统一的标准么？偏移量不是要根据数据的类型么？那这样的块大小是固定的么？ 谢了！[/quote] 应该说，只有没有关联的块并行读写才不会出现同步问题。这个道理很简单。 假设2个步骤，步骤2依赖步骤1的结果，那么必须等步骤1执行完了才能执行步骤2。

引用 6 楼 caozhy 的回复:道理很简单，现代的处理器是超标量乱序执行的。 如果操作的数据没有对齐，那么就不能并行地写，即使它们没有相互依赖关系，但是他们位于同一个块上。你们都很厉害，愿意抽空回答菜鸟。真心很感激。

引用 6 楼 caozhy 的回复:道理很简单，现代的处理器是超标量乱序执行的。 如果操作的数据没有对齐，那么就不能并行地写，即使它们没有相互依赖关系，但是他们位于同一个块上。你的意思是cpu只能对不同的块进行并行读写是吧。可是内存对齐有统一的标准么？偏移量不是要根据数据的类型么？那这样的块大小是固定的么？ 谢了！

引用 2 楼 user-10 的回复:处事之道在于平衡，效率和空间不可兼得就是想了解下为什么这样会获得更高的访问效率。谢了。

引用 1 楼 wangdahu888 的回复:普通程序员心目中的内存印象，由一个个的字节组成，而CPU并不是这么看待的。CPU把内存当成是一块一块的，块的大小可以是2，4，8，16字节大小，因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity（粒度） 本人把它翻译为“内存读取粒度” 。默认的读取粒度是4字节大小。 这个粒度可以通过#pragma pack()来调整 那么编译器是按照什么样的原则进行对齐的? １:数据成员对齐规则：结构(struct)(或联合(union))的数据成员，第一个数据成员放在offset为0的地方，以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小（只要该成员有子成员，比如说是数组，结构体等）的整数倍开始(比如int在３２位机为４字节,则要从４的整数倍地址开始存储。  ２:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)  ３:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.麻烦您了。

引用 楼主 u011416173 的回复:能具体点说么。可以用11**1111这样的形式图解。*代表空出来的内存。这个机制我了解，但是不太清楚具体的原因。您能解释下这样访问内存效率为什么会更高么？

处事之道在于平衡，效率和空间不可兼得


Question: c语言标准库函数名括号问题

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

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

_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 看得那一版

不是必须的 完全可以不加这个括号

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

waiting big cow！

抱着好奇的态度和楼主一起等答案

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

没有啊，你看的那里的“山寨”库函数？

请具体给出string.h文件的全路径。


Question: 求大神帮忙啊！！

int getday(linklist *p) {   int day;   day=30*(p->month);   return day; }把day初始化一下试试


Question: 有个随机算法请教下

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

随机的吧，lz有没有结果啊？

说了是随机，那就只能随机了


Question: 关于char*判断长度的问题,急求~~~~

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

好吧,看来只能这样了..唉

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

要么定长 要么提前告知长度

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

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


Question: C语言读取目录下的指定类型的文件,把所有文件的内容写入到一个txt文件中

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

引用 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位数，有可能是四位数）的行呢。

type *.txt >log.log

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

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文件的情况 希望懂的朋友解答下，非常感谢！！！


Question: c语言新手问题，谢谢

#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

引用 楼主 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);

char test[10] = "0123456789"; test[0] = 0; test[1] = 1; ..

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

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

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


Question: 怎么控制CPU的使用率呢

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

吃饱了撑的！

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

你要确保你的电脑只有你的程序在运行


Question: wireshark中包含的头文件不存在，是怎么回事？

根据网上的教程，在VS下编译成功wireshark后，确实生成了这个文件，多谢了

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

引用 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 查看是否有外部工具对该文件进行处理。

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

那么dtd_grammar.h就是在搜索路径中。  引用 楼主 phis4 的回复:wireshark 的源代码dtd_parse.c文件中有一行头文件包含语句#include "dtd_grammar.h"，但在整个源代码的目录下都没有dtd_grammar.h这个文件，而编译却可以通过，请问高手是怎么回事？


Question: 写文件，往里面写入100M随机数据，然后删除，重写，一直写。

多谢改正。  引用 10 楼 zhao4zhong1 的回复:将楼上略改：#include <stdlib.h> #include <stdio.h> #include <assert.h> #include <time.h>  int main() {     // 目标文件     const char * file = "xxx.tmp";      // 单次写入大小     size_t once_bytes = 1024 * 1024;     // 写入次数 （times * once_bytes = 100M）     size_t times = 100;      // 总写入文件次数     size_t total_times = 2000000;      FILE * f = fopen(file, "wb");     assert(f);      void * buffer = malloc(once_bytes);     assert(buffer);      time_t now;     char   time_buffer[64];      for (size_t k = 0; k < total_times; ++k)     {         fseek(f, 0, SEEK_SET);         for (size_t i = 0; i < times; ++i)         {             if (fwrite(buffer, once_bytes, 1, f) != 1)             {                 free(buffer);                 fclose(f);                  printf("write error!");                  return -1;             }         }         fflush(f);          time(&now);         strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%d %H:%M:%S", localtime(&now));          printf("%07u : %s\n", k, time_buffer);     }      free(buffer);     fclose(f);      return 0; }

没测，试一下：   #include <stdlib.h> #include <stdio.h> #include <assert.h> #include <time.h>  int main() { 	// 目标文件  	const char * file = "xxx.tmp"; 	 	// 单次写入大小  	size_t once_bytes = 1024 * 1024; 	// 写入次数 （times * once_bytes = 100M）  	size_t times = 100; 	 	// 总写入文件次数  	size_t total_times = 2000000; 	 	FILE * f = fopen(file, "w"); 	assert(f); 	 	void * buffer = malloc(once_bytes); 	assert(buffer);	 	 	time_t now; 	char   time_buffer[64] = {0}; 		 	for (size_t k = 0; k < total_times; ++k) 	{ 		fseek(f, 0, SEEK_SET); 		for (size_t i = 0; i < times; ++i) 		{ 			if (fwrite(buffer, once_bytes, 1, f) != 1) 			{ 				free(buffer); 				fclose(f); 				 				printf("write error!"); 				 				return -1; 			} 		}	 		fflush(f); 		 		time(&now); 		strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%d %H:%M:%S", localtime(&now)); 		 		printf("%04u : %s\n", k, time_buffer); 	} 	 	free(buffer); 	fclose(f); 	 	return 0;	 }

每次成功擦出都打印哈当前时间

写完1M后掉个 fprintf写日志

引用 3 楼 Adol1111 的回复:引用 楼主 u012805870 的回复:测试用，往一文件里面写入大量随便什么数据，100M，然后fseek开头,重写，一直写，为了知道是否一直在写数据，文件最后显示时间。求大神。谢谢一直写...然后最后显示时间？那你什么时候读？一边写一边读，判断是否在写？还是写完了再读，最后验证下时间？ 不需要读，就是写数据，随便什么数据，保存文件。一直写，满了100M，擦除，再写，重复。测试写SD卡。

引用 2 楼 N_sev7 的回复:[quote=引用 楼主 u012805870 的回复:] 测试用，往一文件里面写入大量随便什么数据，100M，然后fseek开头,重写，一直写，为了知道是否一直在写数据，文件最后显示时间。求大神。谢谢 写够100M之后再写一个日志文件 将当前时间保存进去 看日志文件就知道了[/quote]谢谢，能否给个链接参考！

引用 1 楼 max_min_ 的回复:测试什么呢？还有你要问什么？测试往sd卡写大量数据，系统挂死问题。简单模拟测试下。怎么随机产生大量数据，然后写入文件。搞个标识能鉴别，一直重复的在写数据。

引用 楼主 u012805870 的回复:测试用，往一文件里面写入大量随便什么数据，100M，然后fseek开头,重写，一直写，为了知道是否一直在写数据，文件最后显示时间。求大神。谢谢 写够100M之后再写一个日志文件 将当前时间保存进去 看日志文件就知道了

测试什么呢？还有你要问什么？

不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

#include <stdio.h> #include <time.h> #include <string.h>  int main() { 	char* filename = "tmp.txt"; 	char buf[512]; 	for(int i=0;i<512;++i) 		buf[i] = i%128;  	FILE* pf = fopen(filename, "w"); 	int count = 200000; 	while(1) 	{ 		rewind(pf); 		for(int i=0;i<1;++i)		//程序运行时可看出一直在写 	//	for(int i=0;i<count;++i)	//大量重复写 		{ 			fwrite(buf, 1, 512, pf); 		} 		time_t rawtime; 		struct tm* timeinfo; 		time(&rawtime); 		timeinfo = localtime(&rawtime); 		char* s_time = asctime(timeinfo); 		fwrite(s_time, strlen(s_time), 1, pf); 	} 	fclose(pf); 	return 0; }  按照楼主要求改了下。

#include <stdio.h> #include <time.h> #include <string.h>  int main() { 	char* filename = "tmp.txt"; 	char buf[512]; 	for(int i=0;i<512;++i) 		buf[i] = i%128;  	FILE* pf = fopen(filename, "w"); 	int count = 200000; 	for(int i=0;i<count;++i) 	{ 		fwrite(buf, 1, 512, pf); 	} 	time_t rawtime; 	struct tm* timeinfo; 	time(&rawtime); 	timeinfo = localtime(&rawtime); 	char* s_time = asctime(timeinfo); 	fwrite(s_time, strlen(s_time), 1, pf);  	fclose(pf); 	return 0; }  将近100M 记事本都打不开 直接卡死


Question: 系统题目，无需定义与输出，请帮忙差错，谢谢！

引用 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++;我没跑，大概是这个意思吧。楼主可以参考下。呵呵。

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;    } }

十分感谢，运行通过了


Question: 彩虹表规约函数问题

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

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

求个大神回答 小弟跪谢

也没有人回答啊 自己顶一下


Question: 关于二叉树的一个问题

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

参考一下： #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; }

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


Question: 如何将一个补码提取出来

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

/** 算法已经没什么可以精简的了，只是冗余代码太多，这样就好了 */ 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;  结果正确，但是想请教各位大虾有没有更好的做法。

RTO和ROT不是一回事！ INT16 RTO=(INT16)(((UNIT16)((((UINT32)(pCh->WordInfo[1]))>>6)&0x0000FFC0))>>6);