Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 简单问题求解

回复:
user: user-1
content: 引用 1 楼 user-4 的回复:#include <stdio.h> #include <string.h>  void tx(char a[20][10], int n) { 	int i, j, k; 	char c[30], d[30];  	for (i = 0; i < n-1; i++) 	{ 		for (j = i+1; j <= n-1; j++) 		{ 			for (k = 0; k < 30; k++) 			{ 				c[k] = '\0'; 				d[k] = '\0'; 			} 			strcat(c, a[i]); 			strcat(c, a[j]); 			strcat(d, a[j]); 			strcat(d, a[i]); 			if (strcmp(c, d) < 0) { 				strcpy(c, a[i]); 				strcpy(a[i], a[j]); 				strcpy(a[j], c); 			} 		} 	} }  int main(void) { 	FILE *f1, *f2; 	int i, j, n; 	char a[20][10];  	f1 = fopen("1.txt", "r"); 	f2 = fopen("2.txt", "w");  	fscanf(f1, "%d", &n); 	for (i = 0; i < n; i++) 		fscanf(f1, "%s", &a[i]); 	tx(a, n); 	for (i = 0; i < n; i++) 		fprintf(f2, "%s", a[i]);  	fclose(f1); 	fclose(f2);  	return 0; } 将函数tx()里面的循环语句 for (k = 0; k <= 30; k++) 修改为： for (k = 0; k < 30; k++)  输入文件 1.txt 3 13 312 343  运行程序，输出结果文件 2.txt 34331213 ++

user: user-2
content: 很明显，数组越界了。30的大小，下标是0-29，其中的for(k=0;k<=30;k++)，却到下标30

user: user-3
content: 将函数tx()里面的循环语句

user: user-4
content: #include <stdio.h> #include <string.h>  void tx(char a[20][10], int n) { 	int i, j, k; 	char c[30], d[30];  	for (i = 0; i < n-1; i++) 	{ 		for (j = i+1; j <= n-1; j++) 		{ 			for (k = 0; k < 30; k++) 			{ 				c[k] = '\0'; 				d[k] = '\0'; 			} 			strcat(c, a[i]); 			strcat(c, a[j]); 			strcat(d, a[j]); 			strcat(d, a[i]); 			if (strcmp(c, d) < 0) { 				strcpy(c, a[i]); 				strcpy(a[i], a[j]); 				strcpy(a[j], c); 			} 		} 	} }  int main(void) { 	FILE *f1, *f2; 	int i, j, n; 	char a[20][10];  	f1 = fopen("1.txt", "r"); 	f2 = fopen("2.txt", "w");  	fscanf(f1, "%d", &n); 	for (i = 0; i < n; i++) 		fscanf(f1, "%s", &a[i]); 	tx(a, n); 	for (i = 0; i < n; i++) 		fprintf(f2, "%s", a[i]);  	fclose(f1); 	fclose(f2);  	return 0; } 将函数tx()里面的循环语句 for (k = 0; k <= 30; k++) 修改为： for (k = 0; k < 30; k++)  输入文件 1.txt 3 13 312 343  运行程序，输出结果文件 2.txt 34331213
user-0 提问: 新手求指教

回复:
user: user-1
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-0
content: 本人QQ：345703370

user: user-0
content: 各位大神能留个QQ号不，以后有问题在直接请教了

user: user-2
content: 搞个Ubuntu吧，装虚拟机或者双系统都可以，GNU工具集太强大了。  看书的话，c和指针，c缺陷和陷阱，c专家编程，数据结构与算法分析-c语言描述

user: user-3
content: 引用 楼主 u012691264 的回复:本人中专计算机应用毕业，现在想自学C语言，英语数学水平基本还给老师了，请问各位大神要买什么书跟哪个软件好点，最好能告诉下在什么地方能买到这些。在这谢谢了！还想问下没有文凭的学这个会找的到工作吗？ 一定要多写代码。一个一个敲，不要copy。

user: user-4
content: 文凭只是敲门用的，可能找工作比别人困难点，只要技术学好了，找工作还是很容易的！  可以先看看 c primer plus 入门基础 再看看 c语言程序设计，c和指针这些基础书籍 ！ 书上的例程多敲敲！ 新手推荐环境用 c-free吧，比较适合新手，后期可以考虑用vs或者g++！
user-0 提问: strtok多次调用，会出现之前数据重复赋值问提

回复:
user: user-1
content: struct log_form{//定义结构体变量 		char year[5]; 		char month[3]; 		char day[3]; 		char hour[3]; 		char minute[3]; 		char second[3]; 	};	 /* define struct log_form a */

user: user-2
content: 结构里定义的数组不够大越界操作NULL被覆盖掉，每个数组起码加大1容纳NULL结尾
user-0 提问: 循环打印文件出的不同方式出现疑问

回复:
user: user-1
content: 数据量大于LEN，一次读不完，所以要while

user: user-2
content: 不是一定要用循环的！两者都是可以的！ 至于你说的ctrl+d在windows下相当于文件结束符EOF了  至于fgets判断返回值而已了
user-0 提问: 关于C的FILE结构体

回复:
user: user-1
content: To break when the value at a specified memory address changes   From the Edit menu, click Breakpoints.   Click the Data tab of the Breakpoints dialog box.   In the Expression text box, type the memory address for the byte.  For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.)  In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords.    Click OK to set the breakpoint.

user: user-2
content: char   *_ptr;                  //文件输入的下一个位置   你既然知道这个结构体的具体意思, 怎么就不仔细看呢?  明明说了是"下一个位置", 那肯定是看不到你才写入的东西的.  但是, 如果你打开一个已经写入了很多东西的文件, 这个指针应该是有文件内容的.  fopen是一个库函数, 并不是API fopen封装了API, 并且_ptr指向的是一个文件缓冲区而不是一个字符串,虽然是char*类型, 只是为了按1字节计算,定义成char*.  所以这个指针指向的内容并不一定有\0结尾, 但调试的时候,调试器中显示是把char*看作串的给你显示, 所以就会看到乱码了. 就跟你自己申请的一个char数组, 但是不给它放\0结尾, 效果是一样的.

user: user-3
content: 别直接操作FILE结构体，请使用API。

user: user-3
content: 屯  tún  聚集，储存：屯粮。屯积。屯聚。  驻军防守：屯兵。屯垦。屯田（驻军开垦田地）。  村庄：皇姑屯。屯子（村庄）。

user: user-0
content: 引用 1 楼 user-4 的回复:屯屯屯。。一般都是未初始化的缘故，还有那个啥烫烫烫烫烫烫。。。。  struct   _iobuf   {           char   *_ptr;                  //文件输入的下一个位置           int       _cnt;                //当前缓冲区的相对位置           char   *_base;                 //指基础位置(应该是文件的其始位置)           int       _flag;               //文件标志           int       _file;              //文件的有效性验证           int       _charbuf;           //检查缓冲区状况,如果无缓冲区则不读取           int       _bufsiz;            //文件的大小           char   *_tmpfname;            //临时文件名  };  typedef   struct   _iobuf   FILE;  这写我都知道，百度一下就出来了，关键是每个变量被赋予值时所代表的含义。 还有就是什么叫做未初始化，文本文件没有初始化是什么含义？并且虽然出现了屯屯屯屯，但我的文件读写还是成功了。

user: user-4
content: 屯屯屯。。一般都是未初始化的缘故，还有那个啥烫烫烫烫烫烫。。。。  struct   _iobuf   {           char   *_ptr;                  //文件输入的下一个位置           int       _cnt;                //当前缓冲区的相对位置           char   *_base;                 //指基础位置(应该是文件的其始位置)           int       _flag;               //文件标志           int       _file;              //文件的有效性验证           int       _charbuf;           //检查缓冲区状况,如果无缓冲区则不读取           int       _bufsiz;            //文件的大小           char   *_tmpfname;            //临时文件名  };  typedef   struct   _iobuf   FILE;
user-0 提问: 请教个问题啊！

回复:
user: user-1
content: 引用 5 楼 u012207185 的回复:[quote=引用 4 楼 jerry_dqh 的回复:] [quote=引用 3 楼 u012207185 的回复:] 只说了结果，怎么操作，没有说！  if(count++ % 3==0) putc(ch,out);  这个就是算法啊，每隔几个取一个字符，就是一个简单的示例，不是真正的算法[/quote] 这个程序怎么运行啊？怎么运行后把So even Eddy came oven ready压缩成Send money？[/quote]  你不是写了吗，命令行直接运行，reducto eddy

user: user-0
content: 我是先把reducto.exe文件拖入命令行，再把eddy.txt再拖入命令行，再执行reducto eddy！结果错了！

user: user-0
content: 引用 8 楼 user-2 的回复:执行这个命令的方法：./reducto eddy 这个程序的意思就是把eddy文件的内容压缩，然后再保存在eddy.red文件中。 在linux里面不是用后缀名来区分文件的，所以eddy就是一个字符文件而已，类似于windows里面的eddy.txt。 这些都是基础，楼主需要好好去学习下基础。 我开始是用记事本写了eddy，在命令行执行了这个命令，不成功啊！生成了一个eddy.txt.red文件，里面是空的，没有Send money！

user: user-2
content: 执行这个命令的方法：./reducto eddy 这个程序的意思就是把eddy文件的内容压缩，然后再保存在eddy.red文件中。 在linux里面不是用后缀名来区分文件的，所以eddy就是一个字符文件而已，类似于windows里面的eddy.txt。 这些都是基础，楼主需要好好去学习下基础。

user: user-0
content: 引用 6 楼 jerry_dqh 的回复:[quote=引用 5 楼 u012207185 的回复:] [quote=引用 4 楼 jerry_dqh 的回复:] [quote=引用 3 楼 u012207185 的回复:] 只说了结果，怎么操作，没有说！  if(count++ % 3==0) putc(ch,out);  这个就是算法啊，每隔几个取一个字符，就是一个简单的示例，不是真正的算法[/quote] 这个程序怎么运行啊？怎么运行后把So even Eddy came oven ready压缩成Send money？[/quote]  你不是写了吗，命令行直接运行，reducto eddy[/quote] 我是刚接触这个命令行！一些基本的东西我还不知道怎么弄！比如说eddy怎么产生的，是个什么文件类型，应该存储在什么地方。。。 执行这个操作才有用！

user: user-0
content: 引用 4 楼 jerry_dqh 的回复:[quote=引用 3 楼 u012207185 的回复:] 只说了结果，怎么操作，没有说！  if(count++ % 3==0) putc(ch,out);  这个就是算法啊，每隔几个取一个字符，就是一个简单的示例，不是真正的算法[/quote] 这个程序怎么运行啊？怎么运行后把So even Eddy came oven ready压缩成Send money？

user: user-1
content: 引用 3 楼 u012207185 的回复:只说了结果，怎么操作，没有说！  if(count++ % 3==0) putc(ch,out);  这个就是算法啊，每隔几个取一个字符，就是一个简单的示例，不是真正的算法

user: user-0
content: 只说了结果，怎么操作，没有说！

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:send money是压缩合的结果吧？ 是的！

user: user-1
content: send money是压缩合的结果吧？
user-0 提问: 求好心的大神带

回复:
user: user-1
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-0
content: 自己做项目？做什么项目？大神们给点具体实用性的建议呀、、

user: user-2
content: 看了一遍基础，可以自己去做个开源项目。

user: user-3
content: 引用 楼主 u012688976 的回复:我像学习c语言   但不知怎么学   从何学起   因此想求大神带入门   再次跪谢 这个要靠自己的，任何人带不如自己做项目，先看一下C和指针

user: user-0
content: c语言程序设计  谭浩强         第三版

user: user-4
content: 引用 2 楼 u012688976 的回复:我现在就在看那本书，看到第四章了，感觉还是什么都不会呀   求大神指导指导  哪本书？读C语言程序设计 要有一定的基础

user: user-5
content: 引用 2 楼 u012688976 的回复:我现在就在看那本书，看到第四章了，感觉还是什么都不会呀   求大神指导指导 没事的啦，慢慢来了，不要急于求成了，上面的代码，自己下个环境都敲敲

user: user-0
content: 我现在就在看那本书，看到第四章了，感觉还是什么都不会呀   求大神指导指导

user: user-5
content: C语言程序设计，可以读读！ c primer plus 基础入门，
user-0 提问: 将两个递增链表中B链表插入A中，保持增序，但不改变B,请大师帮看下对么？

回复:
user: user-1
content: 你没有结构体啊，大致看了一下，有点乱，我还是给你写了一个，供参考。  struct node  { 	int data; 	struct node *next; };  void Great_link(struct node *ha,struct node *hb) { 	struct node  *p,*q, *s; 	struct node *temp;  	p = ha->next; 	q = hb->next;  	while(q) 	{ 		if (p->data < q->data) 		{ 			p = p->next; 			continue; 		} 		 		//无论插入到哪里，不改变b那么就要新建结点 		temp = (struct node *)malloc(sizeof(struct node)); 		temp->data = q->data;  		//将temp插入到p之后 		temp->next = p->next; 		p->next = temp;  		//如果p->data = q->data不做处理，如果p->data > q->data，把数据交换一下即可 		if (p->data > q->data) 		{ 			temp->data = p->data; 			p->data = q->data; 		}  		p = temp;//p下移 		if (q) 		{ 			q = q->next; 		} 		else 			break;//链表b处理完毕 		 		if (p->next == NULL) 		{ 			s = p;//为下一个while提供服务 		} 		 	} 	 	while(q)//到a末尾，b未处理完毕 	{ 		temp = (struct node *)malloc(sizeof(struct node)); 		temp->data = q->data;  		temp->next = s->next;//实际上就是NULL 		s->next = temp; 		s = temp; 		q = q->next; 	} }
user-0 提问: 链表打印 ，循环出现 segmentation fault ,急急急

回复:
user: user-1
content: 以上代码中对函数int2GE略有修改，以避免输入为0时出现异常和输入为负数时输出2个负号。

user: user-1
content: 当输入为0时，因函数int2GE返回NULL，在执行affiche10时有异常。 当输入不为0时，没有发现异常。 LZ在输入什么数据时遇到segmentation fault？  以下是我在VS2010运行的lz代码： #include <stdio.h> /*下面两个是我定义的结构*/ struct element {     int n; /*le n de base B*/   int c; /*le c de GE*/   struct element *g_next; };  struct GrandEntier {   int B; /*Base de GE*/   int L; /*length de GE*/   int signe;   struct element *premier; };  typedef struct element element; typedef struct GrandEntier GE;    GE *Init_GE() {       GE *ge;   ge=(GE*)malloc(sizeof(GE));        ge->B=10;   ge->L=0;   ge->signe=1;      ge->premier=NULL;       return ge; }   GE *int2GE(int n) {   GE *ge;   element *p,*q;   /*删   if(n==0)   {     return NULL;   }*/   ge=Init_GE();   //ge->signe=(n>0)? 1:-1; 改为以下语句以免输出两个负号   if (n >0 ) ge->signe = 1;   else   {     ge->signe = -1;     n = -n;   }    while(n!=0)   {     if(ge->L==0)     {       q=(element*)malloc(sizeof(element));       q->c=n%ge->B;       q->n=ge->L;       q->g_next=NULL;       ge->premier=q;       ge->L++;       n=n/ge->B;      }     else     {       p=(element*)malloc(sizeof(element));       p->c=n%ge->B;       p->n=ge->L;       p->g_next=NULL;       q->g_next=p;       q=p;        n=n/ge->B;       ge->L++;      }    }   return ge; }  /*打印函数，逐个显示ge x的值*/ void affiche10(GE *X) {   element *a;   a=X->premier;   if(a)   {     printf("\nAffiche en base 10 le GE X sur stdout.\n");     for(;a;a=a->g_next)     {       printf("%c%d*%d^%d",(X->signe>0)? '+':'-',a->c,X->B,a->n);     }   } }  void main() {   int a,b;   GE *X,*Y,*Z;   printf("insere deux entier:");   scanf("%d%d",&a,&b);   printf("%d,%d\n",a,b);   X=int2GE(a);   Y=int2GE(b);   affiche10(X);   affiche10(Y); }

user: user-0
content: 我知道原因了，删掉free(a);就可以了。 谢谢各位的帮助。

user: user-0
content: 你好，我输入的是123和456。     我改了一下main()，写了两遍打印：	         affiche10(X); 	affiche10(Y);	 	affiche10(X); 	affiche10(Y);   结果是： Affiche en base 10 le GE X sur stdout:  3*10^0+2*10^1+1*10^2 Affiche en base 10 le GE X sur stdout:  6*10^0+5*10^1+4*10^2 Affiche en base 10 le GE X sur stdout:  3*10^0+2*10^1+-572662307*10^-572662307Press any key to continue

user: user-2
content: 检查越界问题，或者初始化失败，内存非法访问会出现段错误提示！

user: user-3
content: segmentation fault 非法读写内存，多由指针未初始化和数组越界导致

user: user-0
content: 我单独打印Y->premier->c是有值的,然后继续g_next->c也是有值。  代码如下：   GE *Init_GE() {     	GE *ge; 	ge=(GE*)malloc(sizeof(GE));      	ge->B=10; 	ge->L=0; 	ge->signe=1;    	ge->premier=NULL;     	return ge; }   GE *int2GE(int n) { 	GE *ge; 	element *p,*q; 	if(n==0) 	{ 		return NULL; 		} 	ge=Init_GE(); 	ge->signe=(n>0)? 1:-1; 	while(n!=0) 	{ 		if(ge->L==0) 		{ 			q=(element*)malloc(sizeof(element)); 			q->c=n%ge->B; 			q->n=ge->L; 			q->g_next=NULL; 			ge->premier=q; 			ge->L++; 			n=n/ge->B; 			 		} 		else 		{ 			p=(element*)malloc(sizeof(element)); 			p->c=n%ge->B; 			p->n=ge->L; 			p->g_next=NULL; 			q->g_next=p; 			q=p; 			 			n=n/ge->B; 			ge->L++; 		 		}  	} 	return ge; }

user: user-4
content: X=int2GE(a)； Y=int2GE(b);确认下函数调用是否成功！ Y分配地址是否成功！

user: user-5
content: 可能 Y=int2GE(b); 没有初始化好
user-0 提问: 我建立二叉树有什么问题啊

回复:
user: user-0
content: 其实，这个问题我已经解决啦，还有别的问题，不过，很开心是自己一个人给完成了，不过还是谢谢大家啦！

user: user-1
content: 只是一个回车符在缓冲区里， getchar或者多一次scanf吃掉都是可以的！

user: user-2

user: user-0
content: 恩恩，这个我知道啦，问题我已解决，谢谢啦

user: user-3
content: do     {         cout << "Please input three character to discribe children-node:\n";         scanf("%s",charray);         QElementType e;         e.myself = charray[0];         e.parent = charray[1];         e.side = charray[2];         EnQueue(Q,e);         if(e.parent == '#')         B->mydata = e.myself;         else{             cout <<"cdskcvsd";             PreTree(B,e);         }         cout << "Do you want to continue your input?\n";         scanf("%c",&ch);     }while(ch == 'Y');  嗯，曾经有过这样的问题，原因是scanf函数遇到空白符（回车、tab、空格）即停止本次读输入的操作，但是空白符仍会留在输入流中，所以你上面scanf("%s",charray);之后的操作scanf("%c",&ch);，ch会读到一个空白符，不等于'Y'，所以do{}while循环即停止了 解决方法：scanf(" %s",charray); scanf(" %c",&ch);，注意这里百分号前有一个空格！作用是跳过输入流前面的空白符，具体还请lz自己去查一下scanf的用法
user-0 提问: 一道题目

回复:
user: user-0
content: 楼上的，我用的gcc里面对NULL竟然没定义，所以我自己定义了，下面那部分内容太烦了就没仔细看。 结贴的时候没发现你的帖子，对不住了

user: user-1
content: 引用 楼主 u012453424 的回复:#define NULL (void *)0//我这里是不是有错误？ char *find_char(char const *source,char const *chars) { 	if(source==NULL||chars==NULL|| 	*source=='\0'||*chars=='\0') 		return NULL; 	while(*chars!='\0') 	{ 		while(*source!='\0') 			if(*chars==*source) 				return source;//12行就是这一行 			else 				source++; 		chars++; 	} 	return NULL; } gcc编译时显示如下错误： 61.c:12:5: 警告： return discards ‘const’ qualifier from pointer target type [默认启用] 运行程序时显示： 段错误 (核心已转储) 当然最主要的文件就是上述内容，错误肯定在这里面  （1）#define NULL (void *)0//我这里是不是有错误？ 这个是没错的，但是lz不必自己定义NULL这个宏变量，C标准中已经有这个定义了 （2）看lz的代码，意图好像是在source之中找到第一个存在于chars之中的字符，并返回这个字符在source中的指针，c++中string::find_first_of()即可以实现这一目标。目标字符不多的时候可以用如下的两重循环：  char* find_first_of(char* src, const char* target) {     char c;     const char* p;     for(; c = *src; ++src){         for(p = target; *p; ++p){             if(*p == c) return src;         }     }     return NULL; }  目标字符比较多的时候，用hash可能会更好些：  char* find_first_of(char* src, const char* target) {     char ascii[127] = {0};     for(; *target; ++target) ascii[*target] = 1;     for(; *src; ++src){         if(ascii[*src]) return src;     }     return NULL; }  但是lz的C代码中，实现的并不是这样的目的，例如 *source = "babbc", *chars = "abc"，则按lz的代码，得到的结果是&source[1]，即source中字符a对应的指针，对lz的需求表示不懂

user: user-2
content: 算法是错滴。不过，就单从你的代码来看，应该这样写：   char *find_char(char const *source,char const *chars) {     if(source==NULL||chars==NULL||     *source=='\0'||*chars=='\0')         return NULL;      while(*chars!='\0')     { char* s = source;         while(*s!='\0')             if(*chars==*s)                 return s;//12行就是这一行             else                 s++;         chars++;     }     return NULL; }

user: user-0
content: 引用 1 楼 user-4 的回复:函数原型是返回char*, 而source是const char* 从const char* 强制转换成char* 当然要警告老，const的意义就是让编译器帮你检查，防止误操作修改了变量的值 这个问题解决了，还有第二个子问题怎么办？注意看我问题

user: user-3
content: char *find_char(char const *source,char const *chars) {     if(source==NULL||chars==NULL||     *source=='\0'||*chars=='\0')         return NULL;     while(*chars!='\0')     {         while(*source!='\0')             if(*chars==*source)                 return source;//12行就是这一行             else                source++;         chars++;     }     return NULL; }

user: user-4
content: 函数原型是返回char*, 而source是const char* 从const char* 强制转换成char* 当然要警告老，const的意义就是让编译器帮你检查，防止误操作修改了变量的值
user-0 提问: 无操作系统嵌入式环境下实现web页面

回复:
user: user-1
content: nginx

user: user-2
content: 你这个相当于做一个IIS服务器

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:用TCP模拟HTTP 抓HTTP包，用TCP模拟实现之。 加我qq：能加qq深入探讨下吗。。加我：2051418146。。深入请教下

user: user-0
content: 能详细探讨下吗

user: user-3
content: 用TCP模拟HTTP 抓HTTP包，用TCP模拟实现之。

user: user-4
content: LZ所谓的“嵌入式装置（没有操作系统、网络、文件系统都不完整）”不会是单片机系统吧？ 否则的话最简单的方式就是移植开源的web服务器即可。
user-0 提问: C语言如何判断非文本文件的结尾

回复:
user: user-1
content: 图像数据是放在最后也是.bmp文件中占控空间最大的 读完了不是到最后了吗  仅供参考

user: user-0
content: 引用 5 楼 yulitingfeng 的回复:按bmp数据格式来读取，查一下bmp的数据结构。 其中有bmp数据的起始位置，颜色深度，长和宽。以此为依据算出数据结束的偏移量。 有很多bmp读写的例子，可以看下嗯，我看过bmp的数据结构，其实我要读取的就是图像数据，其它的都不要。

user: user-2
content: 按bmp数据格式来读取，查一下bmp的数据结构。 其中有bmp数据的起始位置，颜色深度，长和宽。以此为依据算出数据结束的偏移量。 有很多bmp读写的例子，可以看下

user: user-3
content: int getc ( FILE * stream );   13.1 这样的代码有什么问题？ char c; while((c = getchar()) != EOF) ... 第一, 保存 getchar 的返回值的变量必须是 int 型。getchar() 可能返回任何字符 值, 包括 EOF。如果把 getchar 的返回值截为 char 型, 则正常的字符可能会被错误 的解释为 EOF, 或者 EOF 可能会被修改 (尤其是 char 型为无符号的时候), 从而永不出现。

user: user-4
content: http://blog.csdn.net/jennal/article/details/2219817

user: user-0
content: 还有一个问题请教，我这个程序的目的就是讲bmp文件的数据写入到bin文件里面： 那么我同时批量的将一个目录下的所有bmp文件数据写入到bin文件中。 为了方便操作，不考虑要逐个的输入bmp的文件名，只需要执行exe文件就将数据全部写入到bin文件 求知道的朋友，告诉一下思路，非常感谢！！

user: user-0
content: 数据没有读完就跳出While（）了显然是没有判断对文件的结尾。 现在我用获取文件长度的方法解决了这个问题 请问还有什么其它的方法吗

user: user-5
content: 不用着急知道文件结尾，2进制一般用fread按格式多次读取，分析获得的数据申请合适大小的缓存继续读入，检测返回值有问题，或者无法分析就该停止读取做特殊处理。你的方式即使能知道结尾，一口读到尾那也是塞内存做白工而已...

user: user-6
content: 引用 8 楼 user-8 的回复:int ch; 而不是 char ch; 否则无法区分是读到了字节0xFF还是读到了文件尾EOF即-1

user: user-7
content: bmp数据是固定格式的 BITMAPFILEHEADER 中的bfOffBits 表示位图数据----包括BITMAPINFOHEADER和颜色表在内的数据----的起始位置。 第一 文件头，BITMAPFILEHEADER，是固定大小的； 第二位图信息头，BITMAPINFOHEADER，是固定大小的（不同版本不一样） 第三颜色表，和位图的位数有关，每种位图都是固定大小，有些位图，无颜色表。  最后的图像数据，无压缩格式大小，可以直接计算。就是 高的绝对值* 每行字节数。 压缩格式，BITMAPINFOHEADER，有个biSizeImage，表示图像的数据大小。

user: user-8
content: int ch; 而不是 char ch;
user-0 提问: 跪求指导

回复:
user: user-1
content: 《算法导论》

user: user-2
content: 看看算法导论。这本书就差不多了。系统的学一遍，以后做项目用到什么算法再看吧。没有必要花费很长时间去研究各种算法。除非是搞这方面研究的。就算学了很多算法，项目中也不一定能用上。

user: user-3
content: 先看 严蔚敏的 c语言 数据结构！ 再看算法导论吧！

user: user-4
content: 最经典的书籍《算法导论》  http://download.csdn.net/detail/wangyudong211/6466521

user: user-5
content: 好空荡啊，我抢个沙发，http://tieba.baidu.com/p/1144136835
user-0 提问: 怎么学好递归

回复:
user: user-1
content: 说实话，我对递归也是一知半解，尤其复杂的递归，直接把自己绕晕了。

user: user-2
content: 理解递归的前提是你理解每一句程序，程序如果都看不懂，就别提理解递归了，然后就是自己慢慢体会这种思想了，你可以debug一步步来

user: user-3
content: 引用 4 楼 max_min_ 的回复:递归也是函数调用的啊！只不过调用的是自己本身而已！ 递归最重要的是 退出条件！防止无限递归下去直中要害！

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

user: user-5
content: 1, 要理解递归是怎么回事. 2. 再编写程序, 并跟踪执行的每一步.  最重要的是你要理解,函数的调用与参数压栈

user: user-6
content: 引用 8 楼 Vurteon 的回复:其实递归我个人感觉有点像数学中的归纳法，知道第一步正确，随便中间一步正确，就可以得出最后的答案，递归多了的是结束条件，递归一般是和分治联系起来的，为什么递归在二叉树或者韩罗塔问题上面显得这么强大简洁，就是每一个小问题都具有和大问题相同的性质，这样的问题使用递归比较合适。所以，我觉得，学好递归，先理解问题，在通过问题看本质，最后看代码，明白底层机制。以后写递归就按数学中的归纳法，不要过于转入细节，不然，递归如果复杂了，就不好理解了。由于，最近我们在上数据结构，对递归也一知半解，薄言见谅。 ++

user: user-7
content: 多编一些小的递归程序，理解递归的定义。注意问题的划分，和结束的条件。

user: user-8
content: 递归是要看状态的

user: user-9
content: 其实递归我个人感觉有点像数学中的归纳法，知道第一步正确，随便中间一步正确，就可以得出最后的答案，递归多了的是结束条件，递归一般是和分治联系起来的，为什么递归在二叉树或者韩罗塔问题上面显得这么强大简洁，就是每一个小问题都具有和大问题相同的性质，这样的问题使用递归比较合适。所以，我觉得，学好递归，先理解问题，在通过问题看本质，最后看代码，明白底层机制。以后写递归就按数学中的归纳法，不要过于转入细节，不然，递归如果复杂了，就不好理解了。由于，最近我们在上数据结构，对递归也一知半解，薄言见谅。

user: user-10
content: 按照数学知识中的递推关系来理解，可以参阅《组合数学》相关递归知识

user: user-6
content: 如果楼主领悟了以上三条，递归就会成为你最喜欢用的算法，因为它语意清晰，表达简洁！！！

user: user-6
content: 以下是我对递归的总结： 1.要从函数语意上来思考递归，理解递归，这样做有事半功倍的效果，从这个角度上来重新思考一下汉诺塔问题，必有收获，希望楼主能有所顿悟。  2.试着先把循环改成递归，体会一下，参数的作用。  3.递归要有一个出口点，要不然就无限执行下去了。

user: user-11
content: 递归也是函数调用的啊！只不过调用的是自己本身而已！ 递归最重要的是 退出条件！防止无限递归下去

user: user-12
content: 把递归程序单步调试一次，记录每个过程在一边，注意函数执行到那层

user: user-13
content: 主要体会递归这种思想，一般使用递归算法还是很好判断的，很有规律。 适用于重复性的情况。如二叉树的递归遍历。 适用于本次结果依赖于前一次结果的情况，将前一次的结果看成是已知的（虽然真实情况不是这样的），这样就很这一次结果就很好求解了，典型的是汉诺塔问题。

user: user-14
content: 关键是对状态的理解，lz可去将回溯法搜些资料进行学习
user-0 提问: VC分配内存问题，实际分配和计算值不符

回复:
user: user-1
content: patch_table[i].per_frame = &pe[5*i]; //类型不匹配 *(patch_table[i].fra_pos) = ...//未初始化便解用  认真研读文档，完全掌握里面定义的数据结构，不能胡猜的...

user: user-0
content: 引用 3 楼 u011896413 的回复:每个数组元素都进行一次动态分配，造成大量的内存碎片垃圾。 还有sizeof(Matching_block)应该是4+4个字节，不是4+1.每个指针占4字节 --------------------------------------------------------- 预防产生内存碎片：首先，尽量少使用动态内存。在大多数情况下，你可能使用静态或自动存储或者是STL容器。第二，尽量分配大块的内存而不是一次只分配少量内存。举个例子：一次分配一个数组实例所需的内存，而不是一次只分配一个数组元素的内存。  看了回复，豁然开朗。。。是不是我开始直接开辟个1920*1080*5(5是那个for里面一个指针和一个uchar的大小)的空间，然后再在把那个空间的地址再次分配给结构体里面的指针吗？ struct Matching_block	 { 	unsigned char *per_frame;	 	unsigned **fra_pos;		 }; int main() { 	 int he_wi = 1920*1080;      int i; 	 Matching_block	*patch_table = NULL; 	patch_table = (Matching_block *)calloc( he_wi,sizeof(Matching_block) ); 	unsigned char *pe;     //unsigned char *pi; 	pe = (unsigned char*)calloc( 1920*1080*5,sizeof(unsigned char) ); 	for (i = 0; i < 1920*1080; i++ )									 	{						 		patch_table[i].per_frame = &pe[5*i];		 		*(patch_table[i].fra_pos) = (unsigned*)&pe[1+5*i]; 	}     return 0;  }

user: user-2
content: 太多内存碎片了！不推荐这么玩！浪费资源！

user: user-3
content: 每个数组元素都进行一次动态分配，造成大量的内存碎片垃圾。 还有sizeof(Matching_block)应该是4+4个字节，不是4+1.每个指针占4字节 --------------------------------------------------------- 预防产生内存碎片：首先，尽量少使用动态内存。在大多数情况下，你可能使用静态或自动存储或者是STL容器。第二，尽量分配大块的内存而不是一次只分配少量内存。举个例子：一次分配一个数组实例所需的内存，而不是一次只分配一个数组元素的内存。

user: user-4
content: 引用 1 楼 user-5 的回复:130M少了。 你每次分配1字节，至少浪费8字节，有效空间太少。都用来记录，分配的内存了。  google 有关介绍内存动态分配的文章看看

user: user-5
content: 130M少了。 你每次分配1字节，至少浪费8字节，有效空间太少。都用来记录，分配的内存了。
user-0 提问: 多线程问题，过来瞧瞧

回复:
user: user-0
content: 引用 3 楼 lunat 的回复:有问题, 多核CPU下，多线程单纯读写字节都会造成未定义动作。 就算是单核CPU，因为你不能确定主线程执行if(!g_str[0])return;时，线程一是否正在对g_str进行操作，所以依据这个判断做出的任何假设都不具有有效性。 [quote=引用 楼主 wallwind 的回复:] 一个线程对一个char 字符数组更新数据，主线程会读取这个数组的数据，但是，读之前都会进判空， 比如char g_str[200]={'0'};  线程一 update g_str  主线程  if(!g_str[0]) return;  请问是否有问题？[/quote]  开启的线程单纯的写。主线程只去读。。。会有未定义行为么？

user: user-1
content: 加锁吧, 锁本身损耗不大, 竞争锁引起的等待代价比较高, 看大约有多少时间多少机会是会引发竞争.

user: user-0
content: 引用 13 楼 max_min_ 的回复:其实还是需要结合实际业务需求的！如果不想出现不必要的bug，还是建议加上锁吧！ 安全可靠点！  加锁的确是安全可靠。就是因为 上级觉得我不加锁，不行。把我一竿子否定。。。  加锁是最好的。我知道。谢谢了

user: user-2
content: 其实还是需要结合实际业务需求的！如果不想出现不必要的bug，还是建议加上锁吧！ 安全可靠点！

user: user-0
content: 引用 8 楼 lunat 的回复:因为你不知道你的编译器会生成什么样的汇编指令，所以你不能单纯的依赖C++代码，推测线程之间的同步关系。  编译器不知道你在多个线程之间有共享数据，它不知道你在一个线程中写的数据，另外一个线程会使用。写的线程可能只是把数据写到寄存器或者缓存中，而不产生写入内存的指令；读的线程也可能只是从寄存器或者缓存中读取，而不产生读取内存的指令。  不是说读写本身会导致未定义行为，是你使用这些数据时，特别是依赖于这些数据有效性的代码，可能导致未定义行为。多核CPU下的特殊性是多个CPU同时执行的指令（每个指令分为数个步骤）可能涉及同一个内存地址。如果两个线程同时写，那么最终结果什么值都有可能。仅分别读写，读到的数据可能是改之前的也可能是改之后的。 引用 7 楼 liquanhai 的回复:有可能是读的过程中，正在写数据，读时候判断的长度和内容，读的过程中另一个线程会改写，最好是加锁，这是习惯问题。看看这篇文章吧，http://www.doc88.com/p-330763974969.html  是，之前是想加锁来着，但是我觉得加锁解锁影响我的效率。 另外读线程，即使读到脏数据 ，主线程都没关系，

user: user-3
content: 看业务逻辑，如果主线程有其他活可干，循环检测是可以简单不上锁，确定要进一步读取再加锁。不过你直接return，看不出是啥逻辑...

user: user-4
content: 有问题  判空时候就算正确  读取的时候另一个线程正好修改了

user: user-5
content: 因为你不知道你的编译器会生成什么样的汇编指令，所以你不能单纯的依赖C++代码，推测线程之间的同步关系。  编译器不知道你在多个线程之间有共享数据，它不知道你在一个线程中写的数据，另外一个线程会使用。写的线程可能只是把数据写到寄存器或者缓存中，而不产生写入内存的指令；读的线程也可能只是从寄存器或者缓存中读取，而不产生读取内存的指令。  不是说读写本身会导致未定义行为，是你使用这些数据时，特别是依赖于这些数据有效性的代码，可能导致未定义行为。多核CPU下的特殊性是多个CPU同时执行的指令（每个指令分为数个步骤）可能涉及同一个内存地址。如果两个线程同时写，那么最终结果什么值都有可能。仅分别读写，读到的数据可能是改之前的也可能是改之后的。

user: user-6
content: 有可能是读的过程中，正在写数据，读时候判断的长度和内容，读的过程中另一个线程会改写，最好是加锁，这是习惯问题。看看这篇文章吧，http://www.doc88.com/p-330763974969.html

user: user-7
content: 读出来脏数据能正确处理的话那可以不锁

user: user-8
content: 共享资源应该加锁，除非你确定读写都是原子操作或不可被打断

user: user-5
content: 有问题, 多核CPU下，多线程单纯读写字节都会造成未定义动作。 就算是单核CPU，因为你不能确定主线程执行if(!g_str[0])return;时，线程一是否正在对g_str进行操作，所以依据这个判断做出的任何假设都不具有有效性。 引用 楼主 wallwind 的回复:一个线程对一个char 字符数组更新数据，主线程会读取这个数组的数据，但是，读之前都会进判空， 比如char g_str[200]={'0'};  线程一 update g_str  主线程  if(!g_str[0]) return;  请问是否有问题？

user: user-9
content: 一个线程写,一个线程读,难道不加锁

user: user-2
content: 没有问题！但是有点浪费！当数据没有发什么变法的时候，就不需要再进行主线程的判断！ 所以在线程一应该更新到一个局部变量，全局量来上一次更新的数据！
user-0 提问: 杭电1003

回复:
user: user-1
content: (1) 算法错.试以下输入: 1 1 1  (2) printf("case %d:\n",c+1)中c不是大写的C.  (3) 最后一行输出后面多了空行.

user: user-0
content: 你就是复制了一下啊。。。。。？

user: user-2
content: #include<stdio.h> int main(void) { int c,T,i,n,a[100000],j,k,sum; scanf("%d",&T); for(c = 0;c < T;c++) { sum = 0; for(i = 0;i < 100000;i++) a[i] = 0; scanf("%d",&n); for(i = 0;i < n;i++) scanf("%d",&a[i]); if(a[0] >= a[n-1]) { j = 1;k = n-1; } else { j = 2;k = n; } for(i = j-1;i < k;i++) sum = sum + a[i];  printf("case %d:\n",c+1); printf("%d %d %d\n\n",sum,j,k); } return 0; }
user-0 提问: 右键进入函数的定义，怎么退回写代码的窗口？

回复:
user: user-1
content: 首先你确定这是汇编？？ 其次，那只是打开了新窗口而已，你可以直接点右上角的X关掉，或者在窗口里，切换下就OK了。 当然也可以用快捷键，不过我不是很熟。ctrl+Tab？

user: user-2
content: Ctrl+Tab 或者Alt+左箭头

user: user-3
content: 编辑 |Bookmarks                       |Alt+F2                | 编辑 |BookmarkToggle                  |Ctrl+F2               |Toggles a bookmark for the current line on and off 编辑 |BookmarkClearAll                |Ctrl+Shift+F2         |Clears all bookmarks in the window 编辑 |BookmarkNext                    |F2                    |Moves to the line containing the next bookmark 编辑 |BookmarkPrev                    |Shift+F2              |Moves to the line containing the previous bookmark Visual Studio 6开发环境下的所有热键一览表 http://download.csdn.net/detail/zhao4zhong1/2196516

user: user-0
content: 引用 1 楼 lipoor1234 的回复: 视图->解决方案资源管理器 然后双击你的点c文件 嗯，虽然只是看到了vs2010的方法，但是我想vc++6.0也差不多。

user: user-4
content: 视图->解决方案资源管理器 然后双击你的点c文件
user-0 提问: 用Ｃ语言生成页面并送到客户端显示？？、

回复:
user: user-1
content: 简单的通信！ 可能组xml文件有点棘手，网上搜搜！应该有源码

user: user-2
content: TCP socket 80端口 send符合HTTP头＋HTML体的文本  用wireshark抓包软件抓一个显示最简单网页过程中的TCP包往来内容参考一下。
user-0 提问: ++*cp++

回复:
user: user-1
content: 引用 5 楼 u012453424 的回复:[quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 u012453424 的回复:] [quote=引用 2 楼 derekrose 的回复:] 优先级就自己去查嘛~ 这不单单是优先级[/quote]  还涉及到什么？？[/quote] 见2楼[/quote]  2楼是我啊？你说1楼？1楼和优先级有什么区别？

user: user-0
content: 引用 4 楼 derekrose 的回复:[quote=引用 3 楼 u012453424 的回复:] [quote=引用 2 楼 derekrose 的回复:] 优先级就自己去查嘛~ 这不单单是优先级[/quote]  还涉及到什么？？[/quote] 见2楼

user: user-1
content: 引用 3 楼 u012453424 的回复:[quote=引用 2 楼 derekrose 的回复:] 优先级就自己去查嘛~ 这不单单是优先级[/quote]  还涉及到什么？？

user: user-0
content: 引用 2 楼 derekrose 的回复:优先级就自己去查嘛~ 这不单单是优先级

user: user-1
content: 优先级就自己去查嘛~

user: user-2
content: ++(*(cp++)) =====================> ++*cp cp++
user-0 提问: 下面这个宏定义的错误在哪里

回复:
user: user-1
content: 续行符\后面不能有空格。  引用 楼主 a130098300 的回复:编译器VS2008，操作系统xp 这个宏这么写编译可以（把整个宏定义写在一行里）  #define compab_mask(val,shift) { value |= ((unsigned int)(*center - (val) - 1) & 0x80000000) >> (31-shift); }  但是我只是整理了一下格式，就不对了  #define compab_mask(val,shift)    \  {     \     value |= ((unsigned int)(*center - (val) - 1) & 0x80000000) >> (31-shift);    \  }  报的错误如下： error C2449: found '{' at file scope (missing function header?)（对于那个错误的宏的第2行） error C2017: illegal escape （对应错误的宏定义的第3行） error C2059: syntax error : '}'（对应错误宏定义的第4行） 请问原因何在
user-0 提问: 谁给发个glibc中文的手册CHM格式的给40分，发连接给20分

回复:
user: user-1
content: c++库函数中文手册.chm 里面有glibc中的函数

user: user-0
content: 多谢你的好意，不是C++， 我需要个glibc 库的文档。 引用 9 楼 zhao4zhong1 的回复:c++库函数中文手册.chm http://www.baidu.com/s?wd=c%2B%2B%E5%BA%93%E5%87%BD%E6%95%B0%E4%B8%AD%E6%96%87%E6%89%8B%E5%86%8C.chm&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_n=2&rsv_sug3=1&rsv_sug1=1&rsv_sug4=0&inputT=1656

user: user-1
content: c++库函数中文手册.chm http://www.baidu.com/s?wd=c%2B%2B%E5%BA%93%E5%87%BD%E6%95%B0%E4%B8%AD%E6%96%87%E6%89%8B%E5%86%8C.chm&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_n=2&rsv_sug3=1&rsv_sug1=1&rsv_sug4=0&inputT=1656

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 不知版主有何资料没？ 近期有个C语言的项目，熟悉下库就行，不能等到英文学好了再看，glibc没有用过，一直是搞C++的。  引用 4 楼 max_min_ 的回复:[quote=引用 2 楼 liyu1128 的回复:] 亲们，最好有中文的，英文的百度我也搜到了，有些函数不好理解。  试试看看英文的，不懂的再单个google查资料，看demo例程！[/quote]

user: user-0
content: 英文的也在看，就是有的地方不理解，也没个参考，要中文的目的就在这，对比下。 时间不等人啊，近期有个C语言的项目，熟悉下库就行，不能等到英文学好了再看，glibc没有用过，一直是搞C++的。  引用 3 楼 derekrose 的回复:其实倒不如好好学习一下英文，有的中文翻译过来更难理解

user: user-2
content: 引用 2 楼 liyu1128 的回复:亲们，最好有中文的，英文的百度我也搜到了，有些函数不好理解。  试试看看英文的，不懂的再单个google查资料，看demo例程！

user: user-3
content: 其实倒不如好好学习一下英文，有的中文翻译过来更难理解

user: user-0
content: 亲们，最好有中文的，英文的百度我也搜到了，有些函数不好理解。

user: user-4
content: http://www.gnu.org/software/libc/documentation.html  可能没有中文档
user-0 提问: 指针数组

回复:
user: user-1
content: 像个考试题

user: user-2
content: 先给num[i]分配空间  然后就像一维指针一样用num[i]

user: user-3
content: 1    楼正解

user: user-4
content: strcpy  buff里数100次1K

user: user-5
content: num[i] = buf + i * 1024

user: user-6
content: 这样不是更简单？  #include <stdio.h> #include <stdlib.h> int main() {   int i;   typedef char buffer[100][1024];   buffer* buf =(buffer*) malloc(sizeof(buffer));    //fread(buf,sizeof(buffer),1, fp);    for( i=0;i<100;i++)   {     printf("0x%p\n", buf[i]);   } }

user: user-7
content: 引用 7 楼 zhao4zhong1 的回复:char *buf; FILE *fp; fp=fopen... buf=(char *)malloc(1024*100); assert(buf);  int r=fread(buf,1024,100,fp); assert(r==100);  char *num[100];  for(int i=0;i<100;i++)  {  num[i]= buf + i * 1024;  } free(buf); fclose(fp);顶一个

user: user-5
content: 引用 7 楼 zhao4zhong1 的回复:char *buf; FILE *fp; fp=fopen... buf=(char *)malloc(1024*100); assert(buf);  int r=fread(buf,1024,100,fp); assert(r==100);  char *num[100];  for(int i=0;i<100;i++)  {  num[i]= buf + i * 1024;  } free(buf); fclose(fp); 还是赵哥写的好

user: user-8
content: char *buf; FILE *fp; fp=fopen... buf=(char *)malloc(1024*100); assert(buf);  int r=fread(buf,1024,100,fp); assert(r==100);  char *num[100];  for(int i=0;i<100;i++)  {  num[i]= buf + i * 1024;  } free(buf); fclose(fp);

user: user-9
content: char *buf; char *num[100];  这两个指针变量可都是野指针哦，在使用前需要给他们赋值或者让这些指针指向可控或者指定确定的地址区域。
user-0 提问: 分享Digital的Unix操作系统VAX 4.2源码

回复:
user: user-1
content: 引用 3 楼 wangliangffaflgh 的回复: 是的，Linux源码自己网上找，但这个不是谁都能随便找的到的，属于稀缺资源  可以上传到csdn上的资源上，方便大家下载可以

user: user-0
content: 是的，Linux源码自己网上找，但这个不是谁都能随便找的到的，属于稀缺资源

user: user-2
content: 直接linux源码不是更好？可以编译，也可以运行，参考资料也更多

user: user-0
content: http://www.pudn.com/downloads410/sourcecode/os/detail1745664.html http://www.pudn.com/downloads192/sourcecode/unix_linux/detail904423.html http://www.pudn.com/downloads410/sourcecode/os/detail1745672.html

user: user-0
content: OK，木的问题，这就在传了
user-0 提问: 二叉搜索树的一点问题

回复:
user: user-1
content: void forder(BTNode *root)  { 	if(root) 	{ 		forder(root->right); 		printf("%d",root->data); 		forder(root->left); 	}  } 问题出在forder函数，上面是我改过来的。

user: user-1
content: BTNode *knotNode(BTNode *root)，BTNode *leafNode(BTNode *root)这个两个函数也是，怎么返回整型

user: user-1
content: BTNode *deepthNode(BTNode *root)  {    if(!root)      return 0;    else   {      int l=0,r=0;      deepthNode(root->left);      deepthNode(root->right);      return l>=r?l+1:r+1;    }  }  这个函数返回的不是指针么， 怎么返回INT数据， 暂时找到这个错误

user: user-2
content: 是逻辑问题 还是代码语法问题阿？ 自己先调试下呗

user: user-3
content: 单步跟下代码，有疑问看看内存，就什么都明白了

user: user-4
content: 学用debugger。
user-0 提问: 在VS2008中能运行C语言写的程序吗？

回复:
user: user-1
content: MFC写c语言

user: user-2
content: 直接add .c文件到项目中 然后单个操作.c  选中.c，右击属性 c/c++ ->Precompiled Headers-> Not Using Precompiled Headers

user: user-3
content: 理论上是可以的, 但要注意环境, 比如说你把单片机的C程序拿到VS2008中就不定能运行了, 因为可能有跟系统API相关的代码.  从语法上来讲是可以的, 但从实际上来讲就不一定.

user: user-4
content: 改用Code::Blocks(http://www.codeblocks.org/)  引用 楼主 m184815041 的回复:按着教程上进行的，新建 MFC项目》带静态库MFC的规则》。。，然后怎样把C程序写进去？？

user: user-5
content: 不能选MFC, 选console

user: user-6
content: file->new->project->visual C++->win32->win32 console aplication->application setting->empty project

user: user-7
content: 新手，不推荐用vs
user-0 提问: c语言scanf输入问题

回复:
user: user-1
content: scanf("%lf",&x)

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: double类型用%lf  引用 楼主 u011700488 的回复:#include "stdafx.h" #include <stdio.h>  int main(int argc, char* argv[]) { 	double x,y; 	printf("请输入x的值："); 	scanf("%f",&x); 	if(x<1) 	{ 		y = x; 	} 	else if(x>=1&&x<10) 	{ 		y = 2*x-1; 	} 	else if(x>=10) 	{ 		y = 3*x-11; 	} 	printf("%f",y); 	return 0; }  请输入x的值：12 -925596046168487490000000000000000000000000000000000000000000000.000000Press any key to continue

user: user-4
content: MD,上面不支持内部着色  scanf("%f",&x);-》scanf("%lf",&x);

user: user-4
content: 两种修改方案： 1.  double x,y;->float x,y;  2.  scanf("%f",&x);->scanf("%lf",&x);

user: user-5
content: double x =0, y = 0; //scanf("%f",&x); if(1 == scanf("%lf",&x)) {   //okay } else { }
user-0 提问: c语言求平方和

回复:
user: user-1
content: 既然你不大于1000，就定义成  float a; 或者 int a;   或者  scanf("%lf", &a);

user: user-2
content: 输入float用%f，输入double用%lf 输出float、double都可以用%f

user: user-3
content: 楼上正确，或者把double型改为float型。

user: user-4
content: 引用 2 楼 turingo 的回复:double类型应该用%lf  [quote=引用 楼主 u011700488 的回复:] #include "stdafx.h" #include <stdio.h> #include <math.h> int main(int argc, char* argv[]) { 	double a; 	printf("请输入一个整数："); 	scanf("%f", &a); 	while(a>1000) 	{ 		fflush(stdin); 		printf("数值大于1000，请重新输入："); 		scanf("%f",&a); 	} 	double b; 	b = sqrt(a); 	if((int)b==b) 		printf("%f",b); 	else 		printf("%d",(int)b); 	return 0; } 代码的sqrt的值是  请输入一个整数：9 -1.#IND00Press any key to continue[/quote]++++

user: user-5
content: 1000*1000 =1M 16 Bits 表示不了，可用32Bits表示 TC等 long  VC6 以上 int,long 都可以

user: user-6
content: double类型应该用%lf  引用 楼主 u011700488 的回复:#include "stdafx.h" #include <stdio.h> #include <math.h> int main(int argc, char* argv[]) { 	double a; 	printf("请输入一个整数："); 	scanf("%f", &a); 	while(a>1000) 	{ 		fflush(stdin); 		printf("数值大于1000，请重新输入："); 		scanf("%f",&a); 	} 	double b; 	b = sqrt(a); 	if((int)b==b) 		printf("%f",b); 	else 		printf("%d",(int)b); 	return 0; } 代码的sqrt的值是  请输入一个整数：9 -1.#IND00Press any key to continue

user: user-7
content: #include <stdio.h> #include <math.h> int main(int argc, char* argv[]) { int a; printf("请输入一个整数："); scanf("%d", &a); while(a>1000) { printf("数值大于1000，请重新输入："); scanf("%d",&a); } double b; b = sqrt(a); printf("%d",(int)b); return 0; } 这是个平方根问题，我也是初学者，我大概了解的改了一下，你看是不是你想要的
user-0 提问: 【求助】为什么会丢失网络数据包？

回复:
user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-0
content: 引用 1 楼 yu_xiaofei 的回复:你可以ping下主机B，看是否发生丢包情况，或者可以用抓包工具Wireshark来具体的分析看到底是什么情况 抓包工具wireshark抓不全，丢的更多。ping是IP层的协议。这里没有涉及到ip层。发的是以太帧。

user: user-0
content: 引用 2 楼 hgjyts65fg 的回复:A和B上面都是你自己的程序吧, 那就在B程序里检查一下有没有丢包 A是自己的程序，B就只是执行ifconfig而已

user: user-2
content: A和B上面都是你自己的程序吧, 那就在B程序里检查一下有没有丢包

user: user-3
content: 你可以ping下主机B，看是否发生丢包情况，或者可以用抓包工具Wireshark来具体的分析看到底是什么情况

user: user-4
content: 发送过程，如果没有接收，就会重发。  同一批数据。 如果从来就没有重发，一直都成功接收。 实际发送的数据量，就达到最小。  如果老是重发，那么发送的数据量就非常大。 不知你显示的数据量，包不包括重发的数据！ PS： 网络实际状况，从来都是不确定的。

user: user-1
content: 统计数据不准吧。 总不至于上逻辑分析仪吧。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html 我这个跟TCP没有关系。100万个数据包，都是以太帧，不会合并的。而且每个都是1500个字节。不可以再合并了。
user-0 提问: signature.verify 总是返回false

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

user: user-2
content: 我也遇到类似的问题，你解决的吗
user-0 提问: write(1,".",1)求解此write用法详解

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

user: user-1
content: 其实他的含义是这样的 write(stdout,".", 1); 在"."字符串中，每次向标准输出写一个字节而已！ 只不过刚好在你当前的编译环境下，stdout常量为1而已

user: user-2
content: 第一个参数1是要往标准输出stdout上写，第二个参数是要写得字符串地址，第三个参数是字符串的长度  不懂就找man

user: user-3
content: 标准输出的描述符是 1（第一个），输出个'\n' 换行符呗，最后1是长度呗
user-0 提问: 数据结构

回复:
user: user-1
content: void ListInsert_L(LinkLinst *L,int i,ElemType e){  //在带头节点的单链表中第i个元素之前插入元素e // LinkLinst p; LinkLinst* p;  p=L; // int j; int j=0;  while(p&&j<i-1){p=p->next;++j;}//寻找第i-1个结点  if(!p||j>i-1) return ERROR;//i小于1或者大于表长加1  LinkLinst s; LinkLinst *s;  s=(LinkLinst)malloc(sizeof(Lnode));  s->date=e;s->next=p->next;  p->next=s;  return OK;  }

user: user-2
content: bug  int j;//没有初始化成0，在while循环中就是用了   此外  操作的是链表内部，没有必要传递*L，传递L即可 void ListInsert_L(LinkLinst *L,int i,ElemType e){ LinkLinst p;  p=L;//类型都不可能相互复制   最后 注意编写代码要结构清晰

user: user-3
content: 推荐回去 啃一下 算法精解c语言描述版  肖翔译的

user: user-4
content: 插入部分有错误,应该是函数指针的问题了，记住当前节点一定记录下一个节点的地址，不管是向左还是向右。 这样的代码我只有在编辑器下才看的进去，现在看不下~~
user-0 提问: 大婶们帮忙看看这个段错误，生成0到n之间的k个不重复随机数

回复:
user: user-0
content: 您说的对，我把它改成全局变量后就可以了，谢谢您

user: user-1
content: 引用 楼主 duqi_2009 的回复:/**  * 生成1000 0000个[100 0000, 999 9999]之间的不重复的数  * */ #include <stdio.h> #include <stdlib.h> #include <time.h>  unsigned bigrand(); unsigned randint(int l, int u); void     swap(int *a,int *b);  int main(int argc,char* argv[]) {     int num[10000000];     int i;     FILE *fp = fopen("rand_num_file.txt","a+");     if(fp == NULL)     {         printf("cannot open this file!\n");         exit(0);     }     srand((unsigned)time(NULL));          for(i=0; i<10000000; i++)         num[i] = i;     for(i=0; i<1000000; i++)     {         swap(&num[i],&num[randint(1000000,10000000-1)]);         fprintf(fp,"%d\n",num[i]);     }     fclose(fp);     return 0; }  /*   * 生成大随机数（30位）  **/ unsigned int bigrand() {     return rand()*RAND_MAX + rand(); }  /*   * 生成[l,m]之间的随机数  **/ unsigned int randint(int l, int u) {     return l + bigrand() % (u-l+1); }  //交换 void swap(int *a,int *b) {     int temp = *a;     *a = *b;     *b = temp; }  骚年，int num[10000000];这个数组就40M字节了，这样的局部变量定义在栈里，栈岂能吃得消，定义成全局的或静态的把
user-0 提问: C读取bmp图像将其转换为灰度图像，并将灰度图的像素值存入二维数组的C语言代码。

回复:
user: user-1
content: 引用 1 楼 user-3 的回复:目测不会结贴, 如果是微软的bmp格式文件,不压缩,不使用调色板,到是可以按照文件格式直接读文件,read就行.bgr按顺序读出,再转换色彩空间到yuv(?)然后就应该是有亮度的值了. 我反过来倒是试过. 压缩,或者调色板就没研究过了 资料wiki都能找到. 这个是可行的，不过不需要全部的只需要Y那部分就行了 大概如下： Y = 0.299 R + 0.587 G + 0.114

user: user-2
content: 用system函数调用命令行图片格式转换工具将bmp转为灰度并保存为无压缩bmp格式，然后fread读。

user: user-1
content: 灰度图像,一般是8Bits 图像。  和二维数组的差别是，图像每行数据，需要32Bits对齐。 二维数组不需要这个。  32，24，15，16Bits 图像转灰度比较简单，直接求亮度，按照亮度转换。 32， bgra 8:8:8:8; 24， bgr  8:8:8; 15,  RGB: 5:5:5;  16,  RGB: 5:6:5; 8Bits 图像转灰度读颜色表，得到亮度，直接按照亮度转换。 1，4，Bits 读颜色表，得到亮度，直接按照亮度转换。

user: user-3
content: 目测不会结贴, 如果是微软的bmp格式文件,不压缩,不使用调色板,到是可以按照文件格式直接读文件,read就行.bgr按顺序读出,再转换色彩空间到yuv(?)然后就应该是有亮度的值了. 我反过来倒是试过. 压缩,或者调色板就没研究过了 资料wiki都能找到.
user-0 提问: 在TC3.0中程序有一个报错：undefined symbol 'eax'应该怎么改？

回复:
user: user-1
content: 先要分清CPU的实模式、虚拟86模式、32位保护模式。

user: user-0
content: 引用 2 楼 zhaokai115 的回复:asm{       mov dx,port1       db  66h      /* 66h 是我瞎写的，查下x86汇编，看mov ax,1和mov eax,1前面差哪个机器码 */       mov ax,value        /*Undefined symbol 'eax'*/       db  66h      /* 同上 */       out dx,ax } 可是我这么改还是编译不过啊  mov ax,value  //invalid combination of opcode and operands

user: user-0
content: 引用 2 楼 zhaokai115 的回复:asm{       mov dx,port1       db  66h      /* 66h 是我瞎写的，查下x86汇编，看mov ax,1和mov eax,1前面差哪个机器码 */       mov ax,value        /*Undefined symbol 'eax'*/       db  66h      /* 同上 */       out dx,ax } 谢谢你，果然是用机器码搞定的。但是不是像您这么写的，分数给您啦，谢谢！

user: user-2
content: 引用 2 楼 zhaokai115 的回复:asm{       mov dx,port1       db  66h      /* 66h 是我瞎写的，查下x86汇编，看mov ax,1和mov eax,1前面差哪个机器码 */       mov ax,value        /*Undefined symbol 'eax'*/       db  66h      /* 同上 */       out dx,ax }  嘿嘿，刚查了下，66h是对的，过了10多年，居然没记错，开始佩服自己了。。。  //mov reg32, imm    0110 0110 1011 1rrr [imm32] //mov reg16, imm              1011 1rrr [imm16] //out port, ax                1110 0111 [port8] //out port, eax     0110 0110 1110 0111 [port8]

user: user-0
content: 引用 2 楼 zhaokai115 的回复:asm{       mov dx,port1       db  66h      /* 66h 是我瞎写的，查下x86汇编，看mov ax,1和mov eax,1前面差哪个机器码 */       mov ax,value        /*Undefined symbol 'eax'*/       db  66h      /* 同上 */       out dx,ax } 麻烦您能给出更为准确的代码么，小弟的汇编很差，望您能给出精确地答案。必给分，谢谢！

user: user-3
content: 1、在Windows下安装Virtualbox 2、在Virtualbox中安装DOS6.22虚拟机 3、在DOS下安装TC30 4、用TC编译和运行  引用 楼主 u012166029 的回复:#include<stdio.h> #include<dos.h> int main() {  void iowrite(short int port1,unsigned long int value);  unsigned long int ioread(short int port);  short int Config_Add=0xcf8;  short int Config_Dat=0xcfc;  int bus=00,dev=00,fun=00,offset=00;  unsigned long int dat;  iowrite(Config_Add,(0x80000000 |(bus<<16) |(dev<<11) |(fun<<8) |(offset<<2)));  dat=ioread(Config_Dat);  printf("%x",dat);  return 0;  }   void iowrite(short int port1,unsigned long int value)     {       asm{      mov dx,port1      mov eax,value        /*Undefined symbol 'eax'*/      out dx,eax 	 }      }  unsigned long int ioread(short int port)   {    asm{     mov dx,port     in eax,dx       }     return 0;     } 我是想编一个在dos下运行的读pci程序,这是个雏形，在TC3.0有如上所描述的一个错误，望各位高手指教如何修改。谢谢！

user: user-4
content: 至少支持32位的编译器。

user: user-0
content: 引用 4 楼 ForestDB 的回复:32位的汇编为什么会在TC上跑？ 那要在什么工具上跑呢？

user: user-4
content: 32位的汇编为什么会在TC上跑？

user: user-2
content: asm{       mov dx,port1       db  66h      /* 66h 是我瞎写的，查下x86汇编，看mov ax,1和mov eax,1前面差哪个机器码 */       mov ax,value        /*Undefined symbol 'eax'*/       db  66h      /* 同上 */       out dx,ax }

user: user-5
content: 目测是因为dos的时代是16位的，暂时还只有ax，eax是32位下的吧
user-0 提问: typedef unsigned char uint8_t

回复:
user: user-1
content: 引用 4 楼 turingo 的回复:unsigned用于限定后面的为无符号类型，如果后面不加什么的话，就默认为unsigned int。 unsigned long，unsigned short，unsigned char都是可以的。  [quote=引用 楼主 mousestuman 的回复:] 在vc2010中看到定义： typedef uint8_t                 u8; 鼠标停留在uint8_t上，显示 typedef unsigned char uint8_t   这里第二个typedef是在类库中定义的吗？因为我在编程人员写的代码中没有找到这个定义。还有这到底定义的什么呢，unsigned应该是无符号整型，char是字符型，这两个怎么放在一起呢？[/quote]++

user: user-2
content: 楼主，建议先看书。这样答案来的快。

user: user-3
content: char a; unsigned char b; short c; unsigned short d; int e; unsigned int f; 这些类型LZ都还见过？

user: user-4
content: unsigned用于限定后面的为无符号类型，如果后面不加什么的话，就默认为unsigned int。 unsigned long，unsigned short，unsigned char都是可以的。  引用 楼主 mousestuman 的回复:在vc2010中看到定义： typedef uint8_t                 u8; 鼠标停留在uint8_t上，显示 typedef unsigned char uint8_t   这里第二个typedef是在类库中定义的吗？因为我在编程人员写的代码中没有找到这个定义。还有这到底定义的什么呢，unsigned应该是无符号整型，char是字符型，这两个怎么放在一起呢？

user: user-5
content: char的范围 -128~127 unsigned char 范围 0~255

user: user-6
content: 引用 1 楼 xuechwtx 的回复:unsigned 无符号整形 unsigned int 无符号整形 unsigned char 无符号字符型 ++

user: user-7
content: unsigned 无符号整形 unsigned int 无符号整形 unsigned char 无符号字符型
user-0 提问: 求软件工程管理与实践作业  南航的

回复:
user: user-1
content: 直接请教你的导师。  引用 楼主 u011079974 的回复:1.	选用哪个例子，为何选择，主题，怎样体现软件工程思想 2.	做项目时使用的工具（开发工具+建模工具+项目管理+配置管理） 3.	怎么做需求分析 4.	开发计划 5.	系统设计考虑到的方面 6.	测试的过程，如何测试+用的工具

user: user-2
content: 这个算是伸手么？

user: user-0
user-0 提问: 双向链表赋值问题

回复:
user: user-1
content: 语法上没有问题。  引用 楼主 huabinsir 的回复://文件项 typedef struct tagFILE_ITEM { 	char*                 name; 	__u32                 attr_ext; 	__u64                 size;     	struct tagFILE_ITEM  *prev;	 	struct tagFILE_ITEM  *next;		 }FILE_ITEM_T;  typedef FILE_ITEM_T** FILE_ITEM_MAP_T;  //文件列表 typedef struct tagFILE_LIST { 	char                 Dir[MAX_PATH_LEN];         	__u32                TotalItem;                	FILE_ITEM_T         *ListHeader;               	FILE_ITEM_T         *CurItem;                	struct tagFILE_LIST *Parent;                    	struct tagFILE_LIST *Child;                }FILE_LIST_T;     FILE_LIST_T * pList = NULL, *p, *q, *s1, *s2, *s3, *s4, *s;  以下这样赋值可以，有正确的输出结果 s1->CurItem = s1->CurItem->next; eLIBs_printf(".............insert sort.2.........%s....\n", s1->CurItem->name);   以下这样赋值不行，为什么? s2->CurItem = s1->CurItem->next; eLIBs_printf(".............insert sort.2.........%s....\n", s2->CurItem->name);

user: user-0
content: FILE_LIST_T * pList = NULL, *p, *q, *s1, *s2, *s3, *s4, *s;  这些变量也要 new 一下， 分配内存?

user: user-2
content: 代码没贴，看不出为什么! 语法没问题，s1, s2,在帖子里看不出有没有初始化。

user: user-3
content: 如果你想的是把s1->CurItem->next的地址值赋值给s2->CurItem 的话！这样没有问题！ 如果是实际地址上的值的话，就不行！
user-0 提问: 下面两种寻找下num的一个质数的程序比较好

回复:
user: user-1
content: Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872&

user: user-2
content: 自己体会吧。你是要思路简单还是效率高？在不同场合就有不同取舍

user: user-0
content: 为了增加可读性，重新排版了下2）的程序并且附上1）的程序，其中2）的注释也删掉了，两个程序的思路是不一样的，2）考虑了很多东西，1）我感觉是对于编程的人来说是很简单直白的思路，但对电脑可能执行下来2）需要的时间会更少。  1） #include<stdio.h>  int main(int argc, const char * argv[]) {     int num,numb,i,j;     j=0;     num=-1;     numb=num;     do {numb++;         for (i=2;i<=numb;i++)         {           if (numb%i==0)           {               if(numb!=i)                   break;               else               {                   printf("the next prime number after %d is %d !",num,numb);                   j=1;               }           }         }          } while (j!=1);     return 0; }  2） #include <stdio.h> #include <stdbool.h>	 #include <math.h>	   int main(int argc, const char * argv[]) {       bool    isPrime;       int     startingPoint, candidate, last, i;       startingPoint = 235;       if ( startingPoint < 2 )          {             candidate = 2;         }        else if ( startingPoint == 2 )                {                    candidate = 3;               }               else                 {                      candidate = startingPoint;                      if ( candidate % 2 == 0 )                           candidate--;                      do                        {                                 isPrime = true;	                                  candidate += 2;	                                 last = sqrt( candidate );	                                 for ( i = 3; (i <= last) && isPrime; i += 2 )                                   {                                             if ( (candidate % i) == 0 )                                                 isPrime = false;                                    }                        } while ( ! isPrime );                }              printf( "The next prime after %d is %d. Happy?\n",startingPoint, candidate );            return 0; }

user: user-3
content: 明显后面的程序比较好。不过就是可读性较差，最好调整一下一些语句和排版。 你的程序做的无用循环太多了。检查一个数是否是素数，只要循环到它的平方根就足够了。比如147，只需要不到10%的循环，数越大，节省的时间越多。 对于大于2的数，明显偶数都不是素数。完全不用考虑。 这是一种剪枝思想，用的好的话，能极大改善程序效率。

user: user-4
content: LZ写得好
user-0 提问: 关于c语言中用队列模拟银行排队的问题。

回复:
user: user-1
content: 1）模拟算法，多线程实现。 2）实际计算，计算出多少秒，某窗口顾客数，排队时间。类似装箱。

user: user-2
content: 代码给我看看，我帮你改改

user: user-3
content: 引用 2 楼 piforange 的回复:好吧，我自己已经差不多搞出来了，不过请随便来个人回复下，我不想无满意结贴。。  可否展示下lz大作的部分代码？

user: user-0
content: 好吧，我自己已经差不多搞出来了，不过请随便来个人回复下，我不想无满意结贴。。

user: user-0
content: 怎么没人看啊，帮帮忙哦。
user-0 提问: makefile

回复:
user: user-0
content: object后面应该是“="

user: user-1
content: 5.o是怎么生成的呢？  make clean 下; make

user: user-2
content: 运行 make edit

user: user-0
content: 的确是tab啊

user: user-3
content: 提醒：makefile里面的Tab字符必须是真的Tab字符，不能用多个空格代替。
user-0 提问: 求教c语言里申明了一个带参数的函数，然后调用中忘了传参数进去

回复:
user: user-1
content: 过来学习的，顺便支持下楼上的

user: user-2
content: C缺省是cdecl 没有改变缺省调用约定，并且函数也没有调用约定，就是cdecl 如果编译通过，只有结果错误的问题，cdecl 是 调用方平衡堆栈，既然编译通过，那么堆栈也不会出错， 因为压入多少，清栈时就会堆栈指针，就会调整多少。   C++ 缺省是stdcall 被调者清栈，直接 ret N 指令这种方式，N和参数的总长度有关。  没有改变缺省调用约定，并且函数也没有调用约定，通常就是stdcall 编译一般，不可能通过，除非void fun();另外有定义（重载），或者有缺省参数。  C++ 类的非静态成员函数，所谓 thiscall 其实是传递了this指针的其他调用约定。 除了this指针，和命名方式外，其他可能还是stdcall，cdecl 等方式一致。

user: user-3
content: # include <stdio.h>  int main() {     foo();      return 0; }  void foo(int a) {     printf("%d\n", a); }  cc  -Wall   x.c   -o x x.c: In function ¡®main¡¯: x.c:5: warning: implicit declaration of function ¡®foo¡¯ x.c: At top level: x.c:11: warning: conflicting types for ¡®foo¡¯ x.c:5: warning: previous implicit declaration of ¡®foo¡¯ was here  善待warning。

user: user-4
content: 要先声明函数原型, 再调用，这是好习惯！！  #include <stdio.h>  //会输出随机值 //void foo(int a);  int main() {   foo();   return 0 ; }  void foo(int a) {   printf("%d\n", a); }

user: user-5
content: 引用 6 楼 pgb_1985 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 堆栈不平衡。  调用的函数没有传入参数是不是从堆栈里默认出栈  然后地址自动偏移，等另一个线程实际再去去这个堆栈的时候，是不是地址已经不对？[/quote]  要看编译器，有些会预留一些堆栈空间，如果够你用的话。。。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:堆栈不平衡。  调用的函数没有传入参数是不是从堆栈里默认出栈  然后地址自动偏移，等另一个线程实际再去去这个堆栈的时候，是不是地址已经不对？

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:堆栈不平衡。 应该是堆栈问题 堆栈混乱导致有个线程跑飞了。

user: user-6
content: 堆栈不平衡。

user: user-7
content: 编译器帮你优化了而已！实际语法错误！ 不会内存泄漏！ 内存泄漏是自己mallco/new了空间没有及时合理的释放！

user: user-8
content: 有些编译器当函数只有一个整型参数时，调用的时候为空不会报错，就参数传递而言，不会有内存泄露的危险。  引用 楼主 pgb_1985 的回复:在linux下编译  一个带参数的函数，然后调用中忘了传参数进去， void fun(int a); 调用的时候直接fun();编译居然通过了， 这种情况是否会引起内存泄露？有什么可能的后果

user: user-9
content: 这个应该是会报错的，除非C++缺省参数