Question: 我是大一学生，我不知道程序怎么了，改不对，求帮助（用的是c语言）

谢谢你们了，你们说的我会注意的，再次谢谢你们的帮助

看到楼主的代码，我也是醉了……我只习惯于写代码，不喜欢看别人的代码……

你的程序就是一处有问题，改动的地方给你添加注释了，我帮你测试了一遍，没有发现其他问题。 但细节上还是需要注意的：比如假如用户在一开始直接输入b，而此时你没有录入成绩的话会输出乱码，你应该处理这个情况。 #include<stdio.h> #include<stdlib.h>  #include<string.h>  #define M 2  #define N 5  struct student {  	char name[20];  	char No[10];  	float score[M];  	char course[M][20];  };  void input(student stu[N]){  	int i,j;  	for(i=0;i<M;i++) {  		printf("Please input course%d:",i+1);  		scanf("%s",stu[0].course[i]); }  	printf("Please import:\nname\tNo\t");  	for(i=0;i<M;i++)  		printf("%s\t",stu[0].course[i]); 	printf("\n");  	for(i=0;i<N;i++) {  		scanf("%s",stu[i].name);  		scanf("%s",stu[i].No);  		for(j=0;j<M;j++)  			scanf("%f",&stu[i].score[j]);  	}  	getchar(); } void show(student stu[N]) {  	int i,j; printf("姓名\t学号\t");  	for(i=0;i<M;i++)  		printf("%s\t",stu[0].course[i]);  	for(i=0;i<N;i++) {  		printf("\n");  		printf("%s\t",stu[i].name);  		printf("%s\t",stu[i].No);  		for(j=0;j<M;j++)  			printf("%.2f\t",stu[i].score[j]);  	}  	printf("\n");  	getchar(); }  void save(student stu[N]) {  	FILE *out;  	int i,j;  	if((out=fopen("course.txt","w"))==NULL) {  		printf("cannot open file\n");  		exit(0); }  	fprintf(out,"姓名\t学号\t");  	for(i=0;i<M;i++)  		fprintf(out,"%s\t",stu[0].course[i]);  	for(i=0;i<N;i++) {  		fprintf(out,"\n");  		fprintf(out,"%s\t%s\t",stu[i].name,stu[i].No);  		for(j=0;j<M;j++)  			fprintf(out,"%.2f\t",stu[i].score[j]); 	}  	//必须添加文件关闭语句，否则信息没办法写入文件 	fclose(out); 	getchar();  } void sort(student stu[N]) {  	int i,j,k;  	printf("Sorted by:");  	for(i=0;i<M;i++)  		printf("%d、%s\t",i+1,stu[0].course[i]);  	printf("\n");  	scanf("%d",&k);			//这里需呀添加判断语句（你怎么知道用户输入的一定是数字） 	/*可以这样写 	char input；				 	scanf("%c",&input); 	if(input != '1' || input != '2') 	{ 		printf(***********) 		return ； 	} 	*/ 	for(i=1;i<N;i++)  		for(j=0;j<i;j++)  			if(stu[i].score[k-1]>stu[j].score[k-1]) {  				char name[20];  				char No[10];  				float score[M];  				strcpy(name,stu[i].name);  				strcpy(stu[i].name,stu[j].name);  				strcpy(stu[j].name,name);  				strcpy(No,stu[i].No);  				strcpy(stu[i].No,stu[j].No);  				strcpy(stu[j].No,No);  				int p;  				for(p=0;p<M;p++) {  					score[p]=stu[i].score[p];  					stu[i].score[p]=stu[j].score[p];  					stu[j].score[p]=score[p];  				}  			}  			getchar(); }                                                                                void change(student stu[N]) {  	char key[20]={"woaini"}; 	char KEY[20]; 	printf("Please input key:");		//最好提示用户这个什么意思 	scanf("%s",KEY); 	if(strcmp(key,KEY)) 	{ 		printf("Error key!"); 		return; 	}  	printf("Which course?\n"); 	int i; 	int p,q; 	char No[10]; 	for(i=0;i<M;i++) 		printf("%d、%s\t",i,stu[0].course[i]); 	printf("\n"); 	scanf("%d",&p); 	printf("No:"); 	scanf("%s",No); 	for(i=0;i<N;i++) 		if(!strcmp(No,stu[i].No)) 		{ 			q=i; 			break; 		} 		if(i==N) 		{ 			printf("没有此学生!"); 			return; 		} 		printf("输入成绩：\n"); 		scanf("%f",&stu[q].score[p]); 		getchar(); } void statistics(student stu[N]) { 	int i,j,k; 	float Max,sum; 	float avg[M]; 	for(i=0;i<M;i++) 	{ 		k=0; 		Max=0; 		for(j=0;j<N;j++) 			if(Max<stu[j].score[i]) 			{ 				Max=stu[j].score[i]; 				k=j; 			} 			printf("%s成绩最高的学生信息:\n",stu[0].course[i]); 			printf("%s\t",stu[k].name); 			printf("%s\t",stu[k].No); 			for(j=0;j<M;j++) 				printf("%.2f\t",stu[k].score[j]); 			printf("\n"); 	} 	for(i=0;i<M;i++) 	{ 		sum=0; 		for(j=0;j<N;j++) 			sum+=stu[j].score[i]; 		printf("%s平均成绩为%.2f:\n",stu[0].course[i],sum/N); 		avg[i]=sum/N; 	} 	for(i=0;i<M;i++) 	{ 		int number=0; 		for(j=0;j<N;j++) 			if(avg[i]<=stu[j].score[i]) 				number++; 		printf("%s超过平均成绩的人数为%d\n",stu[0].course[i],number); 	} 	getchar(); } void main() { 	struct student stu[N]; 	while(1) 	{ 		printf("\na、成绩录入\nb、成绩显示\nc、成绩保存\nd、成绩排序\ne、成绩修改\nf、成绩统计\ng、退出程序\n"); 		char ch;  		scanf("%c",&ch); 		fflush(stdin);	//添加输入缓存刷新语句，否则可能导致无法继续输入。 		switch(ch) 		{ 		case 'a': 			input(stu); 			break; 		case 'b': 			show(stu); 			break; 		case 'c': 			save(stu); 			break; 		case 'd': 			sort(stu); 			break; 		case 'e': 			change(stu); 			break; 		case 'f': 			statistics(stu); 			break; 		case 'g': 			return; 		} 	} }

初次打交道，给你几个找几个bug吧。void input(student stu[N]) void show(student stu[N])等几个函数中，student 前面加 struct。结构体只有struct + 结构名称 才能当变量类型用。几个函数中都加了struct后，你的编译器报错就会减去一半以上。其他的，你自己找找吧

刚大一，就能写出这么长的代码，说明你挺不错的！前面的代码风格很好，到了后面，编程的风格很垃圾！如果是复制粘贴弄乱了你的风格，那么你应该在发帖时使用插入代码功能去粘贴你的代码  这么一大串代码，里面不可能到处都是bug吧？！与其你眉毛胡子一把全贴出来，吓到大家，完了没人给你帮助，你自己感叹世风日下，不如把出错的地方截取出来，把bug贴出来，然后简要地介绍一下。这样大家帮你也方便、有针对性！当然，你最后附上全部的代码，方便大家复制粘贴了去编译更好。但一开始，千万不要把大家吓跑了！ 再啰嗦一点吧，我在你的程序里没看到一处注释（//或/*开头的句子）。你希望人家帮你，你得先让人家知道你在做什么的过程中出现了麻烦，然后人家才能准确的帮到你。把几百行代码随便一贴，然后说自己是大一新生，这样就有人去帮你吗？你大一就很屌吗？ 说得有点重，不过，还是希望你好。毕竟，看你大一就能写出这么长的程序，很不错了！

在没有输入数据时，选择其他的选项出错；       （在选择其他选项的时候判断是否输入过数据，没有的话就提示输入数据然后在执行） 其他的没什么问题


Question: 用&取地址时，为什么可以对诸如"Hello"的字符串常量使用，却不能对#define PI 3.1415926的浮点型常量使用？

"Hello"占用了内存，所以有内存地址。而仅仅是一个值的话，是不占用内存的。没有占用内存，当然就没有内存地址可言。 如果是const double PI = 3.1415925；那么PI就是一个变量，需要占用内存，此时就有地址可言了。

编译期 运行期

#4一语道破

分配了实实在在的内存，才能取到地址， #define PI 3.14....   在预处理阶段PI就直接被替换成3.14..了，程序是看不到PI的，它所知道的就是3.14...这个常量数字 const double PI = 3.1415925，PI是一个变量，double型的，编译器为其分配了空间，只不过由于有const修饰这个空间只读 hello，字符串常量，编译器为其在文字常区分配空间，同样只可读 想要完全了解，写一个简单的，然后反汇编

&PI 经过编译预处理后变成了 &3.1415925 而"Hello"是在内存中连续存放的

因为 #define PI 3.1415926 不是常量，是宏定义 过了编译阶段，在程序运行阶段，是不存在的

引用 2 楼 zhouchongzxc 的回复:这个很简单的吧  	movl	$10, %edx  你知道 10 会放在哪里吗？ 小弟菜鸟请指教	movl	$10, %edx是什么意思。。。看不懂

这个很简单的吧  	movl	$10, %edx  你知道 10 会放在哪里吗？

经过试验发现 用#define 定义的PI 不能使用&符号取地址， 而用const double PI = 3.1415925；就可以。请问是为什么呢？


Question: 一道C语言田忌赛马的题目。

引用 4 楼 zhouchongzxc 的回复:如果 第一场 1 赢了 2 第二场 2 赢了 1  该怎么处理呢？  两场都不算？  如果 第一场 1 赢了 2 第二场 2 赢了 3 第三场 3 赢了 1    又该怎么办呢？  用“有向图”可以吗？不考虑这种情况，据说不会出现的

引用 2 楼 truelance 的回复:1. 构造一个N*N的矩阵A, 如果i胜过j, 则A(i,j) =1, 否则A(i, j) = 0 2. 计算B = A + A^2 + A^3 + ... + A*N 若B(i, j) > 0，说明i直接或间接胜过j, 即i应该排在j前面；若B(i,i)>0，说明i处在一个循环战胜中。  i的次序是可以确定, 当且仅当同时满足以下2个条件： 1) B(i,i) ==0 2) 满足B(i,j)>0的j个数为x(i),满足B(k,i)>0的k个数为y(i), x(i)+y(i) == N-1 能说说计算B的原因吗？我好像不是很理解你说的，为什么要建立N*N的矩阵？还有比赛结果是我输入的，矩阵要怎么读写进去？

没有人来回答下吗


Question: 我这种情况有没有必要把C编程环境转移到LINUX？

《Linux C编程一站式学习》

搜“跟我一起写makefile”

像往linux方向发展，怎么不使用linux呢，使用linux怎么能不是使用vim呢，所以楼主看着办吧

直接使用vim，然后学一下Makefile文件。

引用 4 楼 liutingxun 的回复:如果你是处于学习阶段，觉得配一个Linux环境很麻烦的话。可以建议你使用codeblocks + mingw.这是在windows下模拟Linux环境编程。直接生成的是EXE文件。或者eclipse + cygwin,也是类似的效果。但是因为毕竟是模拟的，所以像在Linux下的内核函数，比如Poll之类的函数，是没法实现的。  如果真要在Linux下编程，写小程序可以用VIM，再在网上找一下.vimrc的配置文件，可以配一个很炫酷的环境出来。如果要用IDE的话，可以建议使用codeblocks,这是一个跨平台的神器。KDE桌面环境的话，可以使用KDEVELOP。都是很好用的。Eclipse+ CDT感觉用起来很卡，很慢。很详细，谢谢。我用了KDEVELOP，挺好用的，就是如果有scanf()的程序，下面的运行框里就是正在启动：/home/yaoli/projects/c/build/c 不知道要从哪里进行输入呢？

很有必要 因为你要往linux发展， 那肯定不是写 与平台无关的 纯算法程序了。

有吧，嘿嘿！

引用 楼主 mosquitoh 的回复:现在在win7下用VS2013编C，觉得非常方便和人性化。但是我把我的方向定在往LINUX发展，不知道有没有必要把C编程环境转移到LINUX？IDE用ECLIPSE怎么样？ 都linux了，还eclipse啊，直接vim。


Question: 【新人求助帖】关于Linux C的链表问题

引用 3 楼 hsshuai4 的回复:[quote=引用 2 楼 q3733353520 的回复:] [quote=引用 1 楼 q3733353520 的回复:] 首先，链表实质上就是一个个的结构体对象连接在一起形成的 如果是单向链表的话，结构体中有： next指针， data  而data中就是存储的你说的数据  显然，你打印的这些信息都是存储在其中，所以无论是清空，还是什么操作都是对结构体对象data的操作  结构体对象中data成员的操作[/quote] 那我要怎么去清空这些data上的信息呢？[/quote]  那要看你data是什么数据类型，还有他实际上是怎么存储的，代码中肯定有

引用 3 楼 hsshuai4 的回复:[quote=引用 2 楼 q3733353520 的回复:] [quote=引用 1 楼 q3733353520 的回复:] 首先，链表实质上就是一个个的结构体对象连接在一起形成的 如果是单向链表的话，结构体中有： next指针， data  而data中就是存储的你说的数据  显然，你打印的这些信息都是存储在其中，所以无论是清空，还是什么操作都是对结构体对象data的操作  结构体对象中data成员的操作[/quote] 那我要怎么去清空这些data上的信息呢？[/quote] 这还不简单么？比如char data[100]; memset(data, 0, 100);

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。  Linux下用ls命令

chdir->opendir->readdir->printf->colsedir 完全用不到什么链表，这几个函数就够了  清除链表要看你链表的具体定义，如果链表中没有分配堆空间，直接=NULL，如果是意向链表，遍历链表释放空间，赋值为NULL

估计你的老师的意思是让你使用:在程序中使用fork,exec,find，ls实现一个最简单的bash

引用 1 楼 q3733353520 的回复:首先，链表实质上就是一个个的结构体对象连接在一起形成的 如果是单向链表的话，结构体中有： next指针， data  而data中就是存储的你说的数据  显然，你打印的这些信息都是存储在其中，所以无论是清空，还是什么操作都是对结构体对象data的操作  结构体对象中data成员的操作

引用 2 楼 q3733353520 的回复:[quote=引用 1 楼 q3733353520 的回复:] 首先，链表实质上就是一个个的结构体对象连接在一起形成的 如果是单向链表的话，结构体中有： next指针， data  而data中就是存储的你说的数据  显然，你打印的这些信息都是存储在其中，所以无论是清空，还是什么操作都是对结构体对象data的操作  结构体对象中data成员的操作[/quote] 那我要怎么去清空这些data上的信息呢？


Question: 能把一个指针数组转化为普通数组吗？

引用 2 楼 zhangqilussg 的回复:[quote=引用 1 楼 starytx 的回复:] 数组作为形参的话就退化成指针了，写成指针形式就可以了，再加一个数组长度参数就可以  我的递归函数是这样定义的 void qsort(int a[], int p, int r){} 调用它的时候是这样的 qsort(*a, 0, 9);  但是一运行就崩溃掉了，可能是指针的问题，那具体应该怎么改呢？[/quote]  首先 你要知道是哪里 崩溃的 是什么原因 （用printf各种打印 肯定能找到）

引用 1 楼 starytx 的回复:数组作为形参的话就退化成指针了，写成指针形式就可以了，再加一个数组长度参数就可以  我的递归函数是这样定义的 void qsort(int a[], int p, int r){} 调用它的时候是这样的 qsort(*a, 0, 9);  但是一运行就崩溃掉了，可能是指针的问题，那具体应该怎么改呢？

引用 2 楼 zhangqilussg 的回复:我的递归函数是这样定义的 void qsort(int a[], int p, int r){} 调用它的时候是这样的 qsort(*a, 0, 9);  但是一运行就崩溃掉了，可能是指针的问题，那具体应该怎么改呢？你这函数名起的和系统函数qsort一样啊。不太好。这里不是名字的问题。调用的话第一个参数就传int数组名就行了

本来就是普通数组，没有你所谓的指针数组， 声明为void qsort(int *a, int p, int r), 调用qsort(a, 0, 9)就可以了


Question: 结构体指针链表，编译报错，求指导！！

补充问题：这个问题不是编译报错，而是运行了中出错，本人是新学编程的，还不是很会使用Debug去检查出错位置，求各路大神给指点下那里出错了的。谢谢！


Question: 随机快速排序的问题，请问是哪里的错误？

引用 1 楼 user-1 的回复:宏定义错了，需要给表达式加括号保证求值顺序。  #define random(x) (rand()%(x))  ps. 尽量不要用宏，比如这里可以用 inline 函数。  是这样，问题已解决，太感谢了！


Question: 文件流读取txt文件，10w个数据可以读，100w个数据就崩溃掉了

引用 1 楼 user-1007 的回复:是不是把数组放在函数里边声明了，这样可能会暴栈，试试放在全局声明。  是这样，已经解决了，多谢！

是不是把数组放在函数里边声明了，这样可能会暴栈，试试放在全局声明。


Question: 怎么不用for循环在LCD点阵屏上显示汉字

引用 6 楼 u011337306 的回复: 多谢你的解答，分全都给你了

bin文件的字库，就是将文字的信息全部存储在一起，然后通过GB2312或者unicode索引bin文件，直接将对应的汉字显示出来

空间换取时间 空  间 空间换取时间

这个要看你用什么芯片了，有一些芯片支持dma2d，可以直接这样做，很快的。

引用 4 楼 u011337306 的回复:[quote=引用 3 楼 liaocao2010 的回复:] [quote=引用 2 楼 u011337306 的回复:] 自己整一个字库，可以快速加载 但是无论是汉字还是ASCII的字库每个元素都是表示给像素填不填色的含义，而我往DMA里面填入的数据都是颜色值，现在图片取模后的每个元素都是代表颜色值，所以图片能直接显示，汉字要是不用for循环的话怎么显示呢[/quote] 自己整一个字库，通过位操作来实现，速度很快的！[/quote] 我之前的就是位操作啊，是用每一位跟OX80比较之后，再移位么 这样还是不够快，对了，bin文件的字库是怎么回事啊

引用 3 楼 liaocao2010 的回复:[quote=引用 2 楼 u011337306 的回复:] 自己整一个字库，可以快速加载 但是无论是汉字还是ASCII的字库每个元素都是表示给像素填不填色的含义，而我往DMA里面填入的数据都是颜色值，现在图片取模后的每个元素都是代表颜色值，所以图片能直接显示，汉字要是不用for循环的话怎么显示呢[/quote] 自己整一个字库，通过位操作来实现，速度很快的！

引用 2 楼 u011337306 的回复:自己整一个字库，可以快速加载 但是无论是汉字还是ASCII的字库每个元素都是表示给像素填不填色的含义，而我往DMA里面填入的数据都是颜色值，现在图片取模后的每个元素都是代表颜色值，所以图片能直接显示，汉字要是不用for循环的话怎么显示呢

自己整一个字库，可以快速加载

因为今天休息么，论坛好冷淡！


Question: 这里del函数输入0后老是会有运行错误

问题好像在del函数输入0后，但是我都是按照书上写的。。。。。。不知道问题在哪里

这后面也显示不出表链内的所有数据和编号，只能正确的显示数量。

上面的图是浮点库链接错误的。     这个是删除编号后，再次删除就会出错，编号1后会出现一行没有加入的编号。


Question: 这问题好郁闷

嗯，  行了可以运行了，大神你真有一套

没有定义 f_average， 你看看 average_total=f_average(array,3); 这一行是不是 average_total=f_average_total(array,3);

这个程序是执行这个问题的代码哟 编写„个程序，提示用户输入3个数集，每个数集包括5个double值。程序应当实现下列所有功能：      a．把输入信息存储到一个3x5的数组中      b．计算出每个数集（包含5个数值）的平均值     c．计算所有数值的平均数      d．找出这15个数中的最大值．     e．打印出结果      每个任务需要用一个单独的函数来实现（使用传统C处理数组的方法）。对于任务b，需要编写计算并返回一维数组平均值的函数，循环3次调用该函数来实现任务b。对于其他任务，函数应当把整个数组做为参数，并且完成任务c和d的函数应该向它的调用函数返回答案


Question: 求教linux下C语言怎么访问webservice并调用其中函数下载数据

先拿到它的url地址，比如：http://www.baidu.com//HttpFileTrans?method=download&BufferSize=65536&FlushSize=65536  然后参考下面的代码试试，直接从工程里面拷贝出来的，肯定编译不通，参考方法就行。实在不行去查查MSDN关于InternetOpen的用法 HANDLE hInternet = NULL; 	HANDLE hConnect = NULL; 	HANDLE hRequest = NULL;  	hInternet = InternetOpen("ZyHttpGetAgent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,0,0); 			if (hInternet){ //打开Intenet成功 				hConnect = InternetConnect(hInternet,host,port,0,0,INTERNET_SERVICE_HTTP,0,0); 				if (hConnect) //连接成功 				{ 					hRequest = HttpOpenRequest(hConnect,"GET",url,NULL,NULL,NULL,INTERNET_FLAG_DONT_CACHE,0); 					if (hRequest){ //打开请求成功		 						if (HttpSendRequest(hRequest, NULL, 0, NULL, 0)){ //发送请求成功 							if (HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, buf, &dwBytesRead,0)){ //查询头信息 								if (ParseHttpHeader(buf,dwBytesRead,&nFileLength,&pException) && pException == NULL)  //正确找到URL 且 文件也正确找到 								{ 									dwBytesAllRead = 0; 									while (dwBytesAllRead < nFileLength) 									{ 										if (InternetReadFile(hRequest, buf, buffersize, &dwBytesRead)) 										{ 											dwBytesAllRead += dwBytesRead; 											if (!WriteFile(hFile,buf,dwBytesRead,&dwBytesWritten,0) || dwBytesRead != dwBytesWritten) 											{ 												dwBytesAllRead = WriteFileError; 												break; 											} 										} 										else 										{ 											dwBytesAllRead = ReadFileError; 											break; 										} 									} 									 								} 								else 								{ 									if (InternetReadFile(hRequest,buf,buffersize,&dwBytesRead)) 									{ 										buf[dwBytesRead] = 0; 										responsetext.Format("%s",buf); 									} 									else 									{ 										responsetext = "Read Exception From Server Failed"; 									} 								} 								 							} 						} 					} 				} 			} 		}

有几种办法你自己选吧： 1、自己写socket客户端，连接服务器的HTTP端口，构造HTTP请求发过去，服务器会返回你要的数据，自己再解析HTTP响应，难度很大； 2、用libcurl，这个库对HTTP做了很好的封装，调用相关接口就可以，但学习成本也比较大，难度较大； 3、改用python去访问这个人家给你提供的接口，下载后保存到文件，然后用C语言去解析文件，python的几个库像requests、pycurl、urllib、urllib2都可以完成HTTP的请求发送和响应接收，难度较小。 推荐你用办法3或者2吧，1有难度。


MSDN里就有详细说明，这就是里边的相关链接 http://msdn.microsoft.com/zh-cn/library/t3ayayh1(VS.80).aspx


Question: 用access数据库做的怎么查询一段时间的销售收入

SELECT sum(价格 * 数量) as result FROM tablename where 日期 >= #2014/3/2# and 日期 <= #2014/3/5# ;  查询2014年3月2日到2014年3月5日的销售收入


Question: C语言Scanf输入求解

man scanf

顶楼上  为什么 要在这里问呢？  在搜索引擎中搜索就有答案   比如 百度百科 360百科 。

楼主可以去下载一个帮助文档

2楼说的差不多

试一试，是不是： %d %l %lf %s

是不是答案都是同样的 scanf（“%d”，&i）； ？ 貌似我被骗了


Question: 模拟操作系统对内存与虚拟内存的页面置换算法

这是我写的，和你的需求差不多，你稍微改动一些应该就行了http://download.csdn.net/detail/qq_27856623/9697729

给你一些提示: 最简单的: 先申请一些内存,然后根据算法动态设计匹配,然后打印.

找人做作业是要付费的

参考Linux源代码中相关片断。


Question: 死循环问题

int main(int n)  你这是几个意思》？？ 在main函数内定义int n，把int main(int n)写成int main()就行了

你用的什么编译器？我运行了一下你的代码，可以输出max。。。

引用 2 楼 user-3 的回复:规范的写法如下,试试看.  int main (int argc , char* argv[]) //把你的int main(int n)替换成这个 {     int n;  //增加这个声明 }  我运行了一下他的代码，可以输出max。


Question: 为什么这个程序不能运行

引用 3 楼 jack_guanggong 的回复:scanf("%c",a[i]); 改为 scanf("%c",&a[i]); +1

scanf("%c",a[i]); 改为 scanf("%c",&a[i]);

还是不能运行的

内存越界了, a数组大小为20, 你用它装了100个数(i<100)  . #include <stdio.h>  int main (int argc,char *argv[])  {  int i,j=0,k=0,n=0,m=0;  char a[20];   //改成: char a[100];  printf("请输入选票结果：\n");  for (i=0;i<100;i++)  {  scanf("%c",a[i]);   }  for (i=0;i<100;i++)  {    if (a[i]=='A')  {  n++;  }  else if (a[i]=='B')  {  j++;  }  else if (a[i]=='C')  {  k++;  }  else  if(a[i]=='D')  {  m++;  }  }  printf("统计结果为：\n");  printf("A候选人得票为:%d\n",n);  printf("B候选人得票为:%d\n",j);  printf("C候选人得票为:%d\n",k);  printf("D候选人得票为:%d\n",m);  }


Question: C语言新手  数据逆序显示问题，不清楚思路

#include <iostream.h> #include <windows.h>  void main() { 	char in ; 	char data[200]; 	memset(data,0,200);//初始化数组，所有元素置零 	int count = 0; 	while(cin>>in) 	{ 		data[count] = in; 		count ++; 	}  	if ('0' != data[count - 1])//最后一位不为0，就所有输出 	{ 		for (int i = count - 1;i >= 0;i --) 		{ 			cout<<data[i]; 		} 		cout<<endl; 	} 	else//最后一位为0就从倒数第二个输出 	{ 		for (int i = count -2;i >= 0;i --) 		{ 			cout<<data[i]; 		} 		cout<<endl; 	} }  输入结束时，回车然后CTRL+Z

引用 5 楼 cyuyanxiaowangzi 的回复:第二种的答案真的是看不懂额，i与j大小的比较是为了什么？ 不一定要像他那样写。你可以先这样写 比如，你输入了21. 1、int i = 21/10( = 2------------------提取出了十位) 2、int j = 21%10(=1-----------------提取出了个位） 你再把i和j组合在一起j = j*10+i = 12(或者你直接先输出j,在输出i也可以。) 当然你仔细琢磨一下你贴出的代码，看看他怎么写的就更好了！

输入的用字符串存储，然后逆序过来跳过前面的0不要输出。

第二种的答案真的是看不懂额，i与j大小的比较是为了什么？

引用 2 楼 cyuyanxiaowangzi 的回复:int x,a,b,i,j=0; 	scanf("%d",&x); 	a=x; 	while(a>10) 	{ 		a/=10; 		j++; 	} 	j++; 	for(i=1;i<=j;i++) 	{ 		if(x%10==0) 		{ 			x=x/10; 			j--; 		} 	} 	for(i=1;i<=j;i++) 	{ 		b=x%10; 		printf("%d",b); 		x/=10;    答案是这样的，看起来不像第一种，也不像第二种，就是看不懂答案 你的答案是第二种！

第一种：将输入转化为char字符串，然后将字符串作为数组处理，从后往前输出 第二种：将输入分解成不同的位（个位十位百位。。。。。。）然后倒着输出每一位 。。。。。。

仅供参考 #include<stdio.h> #include<string.h> #include<stdlib.h>  int main() { 		char buffer[20]; 		int n,len; 		int state = 0; 		scanf("%d",&n); 		while( 0 == n%10) 		{ 				n = n / 10; 		} 		sprintf(buffer,"%d",n);  		len = strlen(buffer); 		for(int i = 1; i <= len; ++i) 			{ 					printf("%c",buffer[len -i]); 			} 		printf("\n"); 		exit(0); }z

引用 9 楼 jianwen0529 的回复:[quote=引用 3 楼 baijiaheizhiganmao 的回复:] 给你第一种答案： #include<stdio.h> #include <stdlib.h> #include<string.h> int main() { 	int input; 	char temp[32] = {'\0'}; 	printf("输入一个正整数："); 	scanf("%d",&input); 	itoa(input, temp, 10); 	int count = strlen(temp); 	for(int i = count -1;i>=0;i--) 	{ 		if(temp[i]!='0') 			printf("%c",temp[i]); 	} }  逻辑错了，应该是最后连续N位（如340的最后一位，3400最后的两位）不为‘0’则不显示，你的把中间0也忽略了！[/quote] 你是对的！没有考虑到这种情况！ #include<stdio.h> #include <stdlib.h> #include<string.h> int main() { 	int input; 	bool targ=false; 	char temp[32] = {'\0'}; 	printf("输入一个正整数："); 	scanf("%d",&input); 	itoa(input, temp, 10); 	int count = strlen(temp); 	for(int i = count -1;i>=0;i--) 	{ 		if(!targ) 		{ 			if(	temp[i]!='0') 			{ 				printf("%c",temp[i]); 				targ = true; 			} 		} 		else 			printf("%c",temp[i]); 	} 	return 0; } 这下没错了！

引用 3 楼 baijiaheizhiganmao 的回复:给你第一种答案： #include<stdio.h> #include <stdlib.h> #include<string.h> int main() { 	int input; 	char temp[32] = {'\0'}; 	printf("输入一个正整数："); 	scanf("%d",&input); 	itoa(input, temp, 10); 	int count = strlen(temp); 	for(int i = count -1;i>=0;i--) 	{ 		if(temp[i]!='0') 			printf("%c",temp[i]); 	} }  逻辑错了，应该是最后连续N位（如340的最后一位，3400最后的两位）不为‘0’则不显示，你的把中间0也忽略了！


Question: 用C语言实现将一个字符中所有出现的数字前后加上符号“*”，其他字符保持不变

跟着六楼走  bison   yacc  好像可以做的更多 （抱歉 我没有用过，听说过）

//纯C void    ChangeStr(char *str) {         char *A;         char *B; 		char C;         if(NULL==str) return;         A=str;         B=str;         while(*B)         {             if((*B<=0x39)&&(*B>=0x30))              {                  if(*A!='*') *A='*'; 				 B++;             } 			else  			{ 				if(*A=='*') A++; 				*A=*B; 				A++; 				B++; 			}         }         while(*A)         {             *A='\0';             A++;         } }  //应用举例 int main() {         char buf[30]="Jkdi234klowe90a3"        ChangeStr(buf)         puts(buf);           return 0; } //结果:Jkdi*klowe*a*

忘了贴这个函数了，也可以用系统的那个判断数字字符的函数 bool IsDigital(char c) { 	if ( c >= '0' && c <= '9')	 	{ 		return true; 	} 	return false; }

仅供参考 void InsertAsterisk(const char * str ,char *pNew ) { 	const char *pStr = str; 	char *pNewTmp = pNew; 	while (*pStr) 	{ 		if ((IsDigital(*pStr) && !IsDigital(*(pNewTmp-1))) || 			(!IsDigital(*pStr) && IsDigital(*(pNewTmp-1))))		// 状态改变时就插入'*'号 		{ 			*pNewTmp++ = '*'; 		} 		*pNewTmp++ = *pStr++; 	} 	if (IsDigital(*(pNewTmp-1)))		// 处理末尾是数字字符的情况 	{ 		*pNewTmp++ = '*'; 	} 	*pNewTmp = 0;		// 加上结束符 }  int main() { 	char str[20] = "fds43d435f"; 	char strNew[40] = {0};			// 新串长度要足够插入所有*号 	InsertAsterisk(str ,strNew); 	return 0; }

#10 按顺序进来字符 问 是数字吗？  不是，直接输出                                                          是，输出*和数字 ，继续循环问是数字吗？是输出，不是就输出*，回到开头。

分配一块新的内存，比原来字符中长度要大，然后一个一个拷贝进去，拷的过程中判断是否要加*

仅供参考！#include<stdio.h>  void insertmark(char* source,char* result){ 	char* p = source, *q = result; 	int num = 0;   //用来判断是否正在读取数字 	while (*p != '\0'){ 		if (num==0&&*p <= '9'&&*p >= '0'){ 			*(q++) = '*'; 			num = 1; 		} 		else if (num == 1 && (*p > '9' || *p < '0')){ 			*(q++) = '*'; 			num = 0; 		} 		*(q++) = *(p++); 	} 	if (num == 1) 		*(q++) = '*'; 	*q = '\0'; }  int main(){ 	char str[] = "12abcd321s2defg01fsd3"; 	char result[50]; 	insertmark(str, result); 	puts(result); }

#include<stdio.h> main() {   char a[100],*p;   scanf("%s",a);   p=a;   while(*p!='\0')     {       if(*p<=45 || *p>=57) 	 printf("%c",*p++);       else        { 	 printf("*%c",*p++); 	 while(*p>=48 && *p<=57) 	   printf("%c",*p++); 	   printf("*");        }     } }

#include<stdio.h> main() {    char a[100];    char *p;    scanf("%s",a);    p=a;     while(*p!='\0')      if(*p>=48 && *p<=57 )        { 	 printf("*%c",*p++); 	 while(*p>=48 && *p<=57) 	  { 	   printf("%c",*p++ ) ; 	  } 	printf("*");        }      else       { 	printf("%c",*p++);       } }

#6正解，顶

仅供参考 #include<stdio.h> #include<stdlib.h> #include<string.h>  void insertMark(char *buffer,char *target) { 		char *p; 		//1表示当前字符是数字，0则表示非数字 		int state = 0; 		int i; 		p = target; 		for(i = 0; *p != '\0'; ++p) 		{ 				//如果是一串数字的开始,则在串前面加* 				if(state == 0 && *p >= '0' && *p <= '9') 				{ 						//状态转移 						state = 1; 						buffer[i++] = '*'; 						buffer[i++] = *p; 				} 				//如果是是一串数字结尾,则在结尾处加*,例如11211d，则12211* 				else	if(state == 1 && (*p < '0' || *p > '9')) 				{ 						//状态转移 						state = 0; 						buffer[i++] = '*'; 						buffer[i++] = *p; 				} 				//如果是一串非数字,则直接写入buffer，例如12，则写入12 				else if(state == 0 && (*p < '0' || *p > '9')) 				{ 						buffer[i++] = *p; 				} 				//如果当前是一串数字，则写入buffer 				else if(state == 1 && *p >= '0' && *p <= '9') 				{ 						buffer[i++] = *p; 				} 		} 		buffer[i] = '\0'; }  int main() { 		char str[30]; 		char buffer[100]; 		fgets(str,sizeof(str),stdin); 		insertMark(buffer,str); 		puts(buffer);  		exit(0); }

1  申请一个2倍大的空间 2  把字符一个一个的比较看是否为数字，不是就直接拷贝，是就先来个*再拷贝（根据你上面的只是在数字两侧加*，可以设置一个bool变量来决定是否在前面加*）

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

引用 1 楼 starytx 的回复:是给每个数字字符前后加还是给连续的数字字符前后加，给个输入和输出样例看看。加字符这种操作比较危险，需要保证字符数组空间足够容纳要加入的新字符。  连续的数字字符前后加 输入：Jkdi234klowe90a3 输出：Jkdi*234*klowe*90*a*3*


Question: C语言新手，棋盘上的麦粒问题

哦，原来这样啊，谢谢啦

while(i<=n) a=pow(2,i-1); sum=sum+a; i++;  while(i<=n) {//大括号 a=pow(2,i-1); sum=sum+a; i++; }{//大括号


Question: C新手，，能帮我解释下b2怎么会是7而不是6

一步一步调试就看明白B是多少了

printf()大法，将程序运行过程中所有的变了全部打印出来。

# include <stdio.h>  int main(void) { int a=5, b=5, c=4;  a||(b=a+c)&&c;  printf("\na||()b=a+c&&c=%d",a||(b=a+c)&&c); printf("\na1=%d,b1=%d,c1=%d",a,b,c);         a&&(b=b+1)||(c=b+1);//这个运算完后b=6  printf("\na&&(b=b+1)||(c=b+1)=%d",a&&(b=b+1)||(c=b+1));//这里b又加了1，所以输出为7 printf("\na2=%d,b2=%d,c2=%d\n",a,b,c);  return 0; }

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

这个主要是运算规则和顺序的问题。 &&：从左到右看左边是真才检查右边是否为真；如果左边为假就不考虑左边，也就是说右边不管是什么式子，都不会得到执行 .||： 也是从左到右，左边是真就不检查右边；左边为假才检查右边。&&和||在一个式子中，&&的优先级比较高。 所以，a&&(b=b+1)||(c=b+1);只执行到a&&(b=b+1)这一段，而后面又执行这一段一次。因而b加了两次～


Question: C语言数组输入问题

引用 1 楼 user-1 的回复:在你的程序中，第一个scanf输入了字符串以后，按回车键，此时把一行字符连同换行符一起送入缓冲区，缓冲区检测到有换行符，就把一行字符送入系统内存，送给了x，而换行符'\n'还留在缓冲区里，换行符（line feed)ASCII码是10，你没清除缓冲区，又再用一个getchar时，getchar就会先检查缓冲区，发现里头有个换行符，就把换行符对应的ASCII码赋给了y，于是就有了你发现的问题。 你用debug单步调试，就会发现ch的值是10  需要在getchar前面加上flushall();或fflush(stdin);，就是冲掉了换行符。 恩，我尝试了下，用了fflush(stdin);感觉可以了。

引用 1 楼 user-1 的回复:在你的程序中，第一个scanf输入了字符串以后，按回车键，此时把一行字符连同换行符一起送入缓冲区，缓冲区检测到有换行符，就把一行字符送入系统内存，送给了x，而换行符'\n'还留在缓冲区里，换行符（line feed)ASCII码是10，你没清除缓冲区，又再用一个getchar时，getchar就会先检查缓冲区，发现里头有个换行符，就把换行符对应的ASCII码赋给了y，于是就有了你发现的问题。 你用debug单步调试，就会发现ch的值是10  需要在getchar前面加上flushall();或fflush(stdin);，就是冲掉了换行符。 哦，那用scanf（“”）%d在%后面加空格也是同样道理吧？你说的那两个怎么用？具体是哪里前面。


Question: 关于指针的一些疑惑

不知道你这个代码是自己写的还是复制的，引号乱七八糟，中文引号，反引号。还有，常量字符串是不允许修改的。如果代码真是你写的这样，我很好奇是怎么通过编译的。即使通过，他又是如何执行的。

#include <stdio.h>   main()  {  char *s="China  Beijing  2008  Olympic  Games";    char *p;   p=s;   printf(“%s\n”,s): while ((*p)!=“ ”)   p++;  p=‟\0‟;  printf(“%s\n”,s): //printf("%s\n",++p);  }   我想你学校的意思应该是这样的，看看while前后两次printf(“%s\n”,s):的变化

引用#include <stdio.h> void main()  { 	char s[64]="China  Beijing  2008  Olympic  Games";   	char *p;  	p=s;   	while ((*p)!=' ')   p++;  *p='\0';  	printf("%s\n",s); 	printf("%s\n",p);  } 不知道是否是您想要的结果。。

#include <stdio.h>   void main()  { 	char *s="China  Beijing  2008  Olympic  Games";   	char *p;  	p=s;   	while ((*p)!=' ')   p++;  p='\0';  	printf("%s\n",s); 	printf("%s\n",p);  }   楼主的程序字符用双引号是错误的 改了之后楼主的程序运行结果见下图：  不知楼主的程序想要什么样的结果？？ 若是 China  Beijing  2008  Olympic  Games  China  二楼的是对的~~

while 中，遇到空格，结束。所以p的打印只有，一个china，至于后面赋值，while没有括号，只能管前面一句。

引用 7 楼 zhouchongzxc 的回复:或许学校是想要告诉你 ： 有的时候学校是错的  你要靠的是自己。+1

或许学校是想要告诉你 ： 有的时候学校是错的  你要靠的是自己。

引用 10 楼 mumufan05 的回复:你出来的答案是什么？ 我没有敲，推测结果应该是 China  Beijing  2008  Olympic  Games Beijing  2008  Olympic  Games 不知道是不是你所出来的结果结果应该是这个，但是，楼主的程序。。。真心叫人迷惑！！

p=‟\0‟  改变了指针地址。。。程序在这一句之后，凡是用到指针P的地方，都将崩溃。。。。  应改为 *p='\0'； 但是，由于你前面定义的是  char *s="China  Beijing  2008  Olympic  Games";   char *p; p=s;  可以看到，S是常量，所以你在后面 *p='\0' ，编译器会报错，因为你试图修改常量的值  错误太多了，如果这是学校给的答案，我醉了，如果这是你自己写的答案，根本无法通过编译。。。

这个程序有问题吧  p=‟\0‟; p指针指向新的字符串  打印的时候又是输出++p地址里的东西  改成 p=‟123\0‟ 你会发现输出的是23

很明显，while条件写错了，while((*p) != ' ')

定义指针的时候最好是一起赋值成空指针，这样不容易造成莫名其妙的错误 例如: char *p = NULL;

估计你自己都不知道自己要干嘛。。。 这两个看哪个是你需要的吧，反正不是你写的那样！  #include <stdio.h>   #include <string.h> void main()  { 	char *s = "China  Beijing  2008  Olympic  Games"; 	char *p = new char [strlen(s)+1]; 	strcpy(p,s); 	int i = 0; 	while ((*(s+i)) != ' ') 	{ 		i++; 	} 	p[i] = '\0' ; 	printf("%s \n",s); 	printf("%s \n",p);   	delete [] p; }    #include <stdio.h>   void main()  { 	char s[100] = "China  Beijing  2008  Olympic  Games";   	char *p = s; 	printf("%s \n",s);  	int i = 0; 	while ((*(s+i)) != ' ') 	{ 		i++; 	} 	p[i] = '\0' ; 	printf("%s \n",p);  }

while的条件是什么？  遇到空格！


Question: 求助，输出一个1*4矩阵

一种思路：把0~15的十进制数转化成4位的二进制数不就遍历所有情况了？ Example 0 -- 0000 ...... 15 -- 1111 其他思路：直接用递推和递归也同样都可以解决问题

就是0x10的值

2的4次方种 排列组合问题

那个好像不行哦


刚才运行后又发现，数据是可以存储的，但是就是不能从中断里面跳出来……


Question: 一个简单问题：结构体数组变量如何插入到数据库？

这个问题我终于自己解决了，sprintf函数的第一个参数一定要声明一个字符数组，取数组名才行、

你这根数据库有嘛关系？参数不匹配。

引用 2 楼 user-2 的回复:貌似 v1,v2的格式串也不对哦 那个可以忽略，是我打错了，但是现在的错误还是一样呀  依然是error C2664: 'fprintf' : cannot convert parameter 1 from 'const char *' to 'struct _iobuf *'

谁知道结构体数组变量怎么传值到数据库的，来帮一下

fprintf(i_query, "INSERT INTO stock_data values(%.2f,%.2f,%.2f)",v1,v2,v3); 这样写会报错，用sprintf也不对啊，一样报错

貌似 v1,v2的格式串也不对哦

fprintf(i_query, "INSERT INTO stock_data values(''%s','%s',%.2f)",v1,v2,v3); ===> sprintf(i_query, "INSERT INTO stock_data values(''%s','%s',%.2f)",v1,v2,v3);


Question: 0x579DD6AC (msvcr120d.dll) (Project6.exe 中)处有未经处理的异常

补充下，我是使用opencv库时出现的错误。

我也出现这个错误了，将release模式改为debug模式，成功运行了。但是debug和release我都改过了，各种库都已经配置过了，以前好好的，突然出问题了，就出在读图片那句话。

引用 5 楼 krrmjssf 的回复:已经完美解决了，谢谢大家~ 所以到底咋个解决啊。

请问是怎么解决的@krrmjssf

怎么解决的？我也遇到

怎么解决的，我也遇到了

已经完美解决了，谢谢大家~

同，使用Opencv库的时候出现了这个错误，现在还未解决，有人说一下吗？

不发答案说个毛线啊。。。。

请问最后是怎么解决的？

我也是这个问题，请问LZ是怎么解决的


Question: c语言算法题目

引用 7 楼 ilikehigame 的回复:[quote=引用 6 楼 jbsb007sb3 的回复:] 麻烦帮忙看下如何高效查询ooxooxo字符串，还有往后移动查找呢？谢谢 应该是找OOX *******XO字符串吧？ 应该是从前往后找OOX找到第一个（x）后从后往前找XO（XO后只能跟X）位置a，如果找到了统计+1. 然后在往前找XO，找到后记住位置b，从b到a寻找ooX如果有统计+1；从b到X前找oox（c），从c往后找xo有了统计+1. 一次类推！ 类似于快速排序算法！！[/quote] 补充以下：你可以按照字符串的大小来查找ooX和XO 寻找彼OOX和XO大的字符串满足条件 不如OOXX、OOXO、XOX、等都满足 而OOO，XOO都不满足

引用 6 楼 jbsb007sb3 的回复:麻烦帮忙看下如何高效查询ooxooxo字符串，还有往后移动查找呢？谢谢 应该是找OOX *******XO字符串吧？ 应该是从前往后找OOX找到第一个（x）后从后往前找XO（XO后只能跟X）位置a，如果找到了统计+1. 然后在往前找XO，找到后记住位置b，从b到a寻找ooX如果有统计+1；从b到X前找oox（c），从c往后找xo有了统计+1. 一次类推！ 类似于快速排序算法！！

引用 8 楼 ilikehigame 的回复:[quote=引用 7 楼 ilikehigame 的回复:] [quote=引用 6 楼 jbsb007sb3 的回复:] 麻烦帮忙看下如何高效查询ooxooxo字符串，还有往后移动查找呢？谢谢 应该是找OOX *******XO字符串吧？ 应该是从前往后找OOX找到第一个（x）后从后往前找XO（XO后只能跟X）位置a，如果找到了统计+1. 然后在往前找XO，找到后记住位置b，从b到a寻找ooX如果有统计+1；从b到X前找oox（c），从c往后找xo有了统计+1. 一次类推！ 类似于快速排序算法！！[/quote] 补充以下：你可以按照字符串的大小来查找ooX和XO 寻找彼OOX和XO大的字符串满足条件 不如OOXX、OOXO、XOX、等都满足 而OOO，XOO都不满足[/quote]  不是这个意思，O的个数是固定的，X可以是大于等于1的任意个。是查找包含这种OOX..XOOX..XO 这个字符串的个数

麻烦帮忙看下如何高效查询ooxooxo字符串，还有往后移动查找呢？谢谢

大概写了下，如果要判断每次移动多少还略复杂，如果每次只移动一位就觉得太浪费了，没有技术含量，大侠能大概描述下具体的方法吗？

关键就是如何能快速匹配ooxooxo？因为这个字符串本身只有2个字母，相似度极高，怎么计算下一次移动的位置能最大的向后移动呢？

引用 2 楼 user-3 的回复:[quote=引用 1 楼 user-3 的回复:] 你的意思是匹配下面的正则表达式吗？ ox[ox]*xoox[ox]*xo 看错了，应该是这个，ox[x]*oox[x]*oo，方法很简单啊，先过滤一遍把所有重复的x全部剔除（只保留一个x），然后在新字符串上循环匹配oxooxo就行了。如果程序对内存要求高的话，不过滤也可以做的，只是稍微复杂一点罢了。[/quote]+1,赞一个

引用 1 楼 user-3 的回复:你的意思是匹配下面的正则表达式吗？ ox[ox]*xoox[ox]*xo 看错了，应该是这个，ox[x]*oox[x]*oo，方法很简单啊，先过滤一遍把所有重复的x全部剔除（只保留一个x），然后在新字符串上循环匹配oxooxo就行了。如果程序对内存要求高的话，不过滤也可以做的，只是稍微复杂一点罢了。

你的意思是匹配下面的正则表达式吗？ ox[ox]*xoox[ox]*xo


Question: C语言一个简单的小题，大神求解答

#include <string.h> #include <stdio.h> char a[100] = {0}; int l; void re(char *p); int main() {     int i;     gets(a);     l=strlen(a);     re(a);     puts(a);     return 0; } void re(char* p) {     int i; 	char a1[25] = {0}; 	char a2[25] = {0}; 	char a3[25] = {0}; 	char a4[25] = {0};     int q1=0,q2=0,q3=0,q4=0; 	char* tempP = p; 	if(p) 	{ 		for(int i=0; *p != '\0'; ++i) 		{ 			if(*p>='0'&&*p<='9')//数字  			{ 				a1[q1]=*p++; 				q1++; 			} 			else if(*p>='a'&&*p<='z')//小写字母 			{ 				a2[q2]=*p++; 				q2++; 			} 			else if(*p>='A'&&*p<='Z')//大写字母 			{ 				a3[q3]=*p++; 				q3++; 			} 			else //其他字符 			{ 				a4[q4]=*p++; 				q4++; 			} 		} 	}      for(i=0;i<q1;i++)         a[i]=a1[i];     for(i=q1;i<q1+q2;i++)         a[i]=a2[i-q1];     for(i=q1+q2;i<q1+q2+q3;i++)         a[i]=a3[i-q1-q2];     for(i=q1+q2+q3;i<q1+q2+q3+q4;i++)         a[i]=a4[i-q1-q2-q3]; }

可以使用qsort函数吗？不过这个对同类的字符好像会打乱原有次序，仅供参考 int cmp(const void *a ,const void *b) { 	char *pA = (char *)a; 	char *pB = (char *)b; 	if (*pA >= '0' && *pA <= '9') 	{ 		if (*pB >= '0' && *pB <= '9') 		{ 			return 0; 		} 		else 			return -1; 	} 	else if (*pA >= 'a' && *pA <= 'z') 	{ 		if (*pB >= '0' && *pB <= '9') 		{ 			return 1; 		} 		else if (*pB >= 'a' && *pB <= 'z') 		{ 			return 0; 		}  		else 		{ 			return -1; 		} 	}  	if (*pA >= 'A' && *pA <= 'Z') 	{ 		if (*pB >= '0' && *pB <= '9' || *pB >= 'a' && *pB <= 'z') 		{ 			return 1; 		} 		else if (*pB >= 'A' && *pB <= 'Z') 		{ 			return 0; 		} 		else 			return -1; 	} 	else 	{ 		if (*pB < '0' || (*pB > '9' && *pB <'A') || (*pB > 'Z' && *pB < 'a') ||*pB >'z') 		{ 			return 0; 		} 		else 			return 1; 	} } int main() { 	char str[50] = {0}; 	scanf_s("%s" ,str ,50); 	printf("%s\n" ,str); 	qsort(str ,50 ,sizeof(char) ,cmp); 	printf("%s\n" ,str); 	return 0; }  保持原有同类字符顺序的话可以这样，这个问题感觉不用排序还简单。直接开辟同样大小的临时字符数组，循环4次原串，依次取出数字，小写，大写，其他字符，写入临时数组中就行了。如果嫌循环次数太多，可以空间换效率，申请4个数组，循环一次，依次放入对应数组，然后拼接...


Question: C语言与数据结构的关系

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

数据结构告诉你，如何用数据来表示现实世界的某个关系、数量。至于语言，只是构造的工具，那种语言都可以。  如果把语言比作工具，如钳子、扳手、剪刀等，数据结构就是告诉你如何用这些工具做个盒子、打个眼、造个螺丝等最基本的零件。

楼上是大神~

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）


Question: C语言的方向之路，请支招

引用 9 楼 sholber 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… DOS命令？……我看还是先弄懂磁芯存储器的制造和工作原理。赵老湿大约的确是又醉了。[/quote] 你不知道我本科学的是计算机应用而不是计算机软件吧。

参考一下——http://blog.csdn.net/u012421456/article/details/40681247

引用 3 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… DOS命令？……我看还是先弄懂磁芯存储器的制造和工作原理。赵老湿大约的确是又醉了。

可以往嵌入式开发方向发展。

看你本科学校是什么，还有你学得怎么样？如果本科学校不好，自己学得也不好，那么可以选择考研，考个985。

还是想好以后干嘛吧，研究生毕业还是要就业的。。

C++感觉现在得搞游戏和驱动好些，推荐你去看JAVA，然后转安卓或网站开发。这是我今年找工作的感受。。。。。。。。。。。。

引用 3 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 。。。

本科是211以上的就别考了。把本事练好

有好的工作职位就先工作。 如果确定能考上清华，北大，上海交大，复旦，中科大，浙大等前十左右一流高校可考研，除此之外的高校不考也罢，当然如果你爹是李刚，随便拿个小硕学历就能去中央，这另说了。


Question: 初识C语言用GCC编程软件好还是Dev-C++好？两者有没有区别？

重点放在语言上，编译器挑一个自己喜欢的好用的就行

学好C语言，以后项目要求什么就是什么！！！

推荐code::blocks

那种简单用哪种，初学C语言，重点是放在语言上，不是编译器上。最好用微软的vs，图形化界面方便使用，先把语言学好，不要在学语言时还要学习编译器怎么用

GCC.......

Dev-C++ 和 Code::Blocks 都是采用 gcc 作为编译器的 IDE

引用 6 楼 zhao4zhong1 的回复:http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  就这样吧，初学者，别花太多时间在选择IDE上，找个世界上最好的IDE直接开始，以后有时间了，再回头去看其他的IDE就可以了，毕竟你要学的不是IDE,而是编程和语言

看看都有些什么意见

入门还是IDE好，当然要精通还是要GCC

都用用试试，觉得那个好用就用那个。

用一个就行啊，关键是把C学好。

引用 楼主 lingshi95zz 的回复:刚入手C语言，请教高手是用GCC好还是用Dev-C++编程软件好？在网上看了两部教程视频，一部推荐GCC，另一部是DEV-C++   都不知道是要用哪种编程软件好点，如果选择了Dev-C++的编程软件，那以后是不是就要学习用Dev-C++软件的视频教程？    “Dev-C++” = “GCC” + 其他

GCC是编译器套件，DEV-C++是一个小型IDE，两者定位不同没法比啊。再说了，DEV-C++里面自带GCC，第二个包含第一个，好比一个是厨房，一个是别墅。新手建议DEV-C++，毕竟入门还得靠IDE

引用 楼主 lingshi95zz 的回复:刚入手C语言，请教高手是用GCC好还是用Dev-C++编程软件好？在网上看了两部教程视频，一部推荐GCC，另一部是DEV-C++   都不知道是要用哪种编程软件好点，如果选择了Dev-C++的编程软件，那以后是不是就要学习用Dev-C++软件的视频教程？  推荐gcc， 这些东西大同小异，会了其中一个，另一个也能很快上手。


Question: 我的这个递归哪里错了

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

#include <stdio.h> #include <stdlib.h> int xp(char s[],int l,int y) { int i; if(l==0) return y; for(i=0;i<l/2;i++)     if(s[i]!=s[l-i-1])         return y; y+=1; xp(s,l/2,y); } int main() {     char s[]={"ABBA"};     int l;     l=strlen(s);     printf("%d",xp(s,l,0));     return 0; }

引用 13 楼 myzts 的回复:#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; }  return (t+dc(&s[length/2]));//这里添加取地址符  我这边修改后运行的结果为

引用 17 楼 myzts 的回复:[quote=引用 6 楼 u011337306 的回复:] [quote=引用 5 楼 u011337306 的回复:] [quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。[/quote]  太谢谢你了,这是我想要的结果,可是为什么要添加这个&[/quote] 因为你的dc函数，传递的是形参是地址

引用 6 楼 u011337306 的回复:[quote=引用 5 楼 u011337306 的回复:] [quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。[/quote]  太谢谢你了,这是我想要的结果,可是为什么要添加这个&

引用 13 楼 myzts 的回复:#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; }太谢谢你了,这是我想要的结果,可是为什么要添加这个&

引用 13 楼 myzts 的回复:#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; } 太谢谢你了,这是我想要的结果,可是为什么要添加这个&

引用 5 楼 u011337306 的回复:[quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。

引用 3 楼 myzts 的回复:[quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！

PS:我的意思是想验证字符串经过多少次对称变化 比如AB一次变为ABBA

引用 1 楼 u011337306 的回复:这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...

朋友你好，闲逛csdn发现你的帖子，待会回去听讲座，没太多时间看你的代码，但是我也大致看了一下，你可以在代码后面加上注释，这样，我们可以更快的看懂你的程序，听完讲座回来的时候，我再看一下你的程序。 希望我说的对你有帮助。

[code=c]#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	return 0; }[/code

引用 6 楼 u011337306 的回复:[quote=引用 5 楼 u011337306 的回复:] [quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。[/quote] 我把我的代码改了 #include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; } 可是Segmentation fault了

int xp(char s[l/2],int y); // 这个相当于一个空的函数声明 xp(char s[l/2],int y); // 这个是调用函数

#include <stdio.h> #include <stdlib.h> int xp(char s[],int y) { int i,l=strlen(s);//没有strlen()的头文件 if(l==0) return y; for(i=0;i<l/2;i++) { 	if(s[i]!=s[l-i-1]) 		return y; }  	y+=1; 	int xp(char s[l/2],int y);//函数调用前面不选要加返回类型，可能你是想写xp(s[l/2],y); } int main() { 	char s[]={"ABBA"};     printf("%d",xp((s),0));//(s)不需要这么写啊 	system("pause"); 	return 0; }

一步一步调试。。。。就可以知道了。。


Question: 请问怎么改错呢

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

仅供参考//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>

多谢    看不太懂哈    用到取读文件时就不太理解啦


Question: 输出*型三角形错在哪里了

引用 3 楼 czdxzy 的回复:1楼正确，可以看下面的错误提示 1>e:\zy\1119\1119\main.cpp(325) : error C2059: 语法错误 : “数字上的错误后缀” 1>e:\zy\1119\1119\main.cpp(325) : error C2146: 语法错误 : 缺少“;”(在标识符“i”的前面)谢谢   我自己翻译出来了 就是不理解什么意思 谢谢解答

引用 2 楼 u013163178 的回复:这都是错误提示啊，不要因为他是英文的就不愿意看他 D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(11) : error C2059: syntax error : 'bad suffix on number' D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(11) : error C2146: syntax error : missing ';' before identifier 'i' D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(11) : error C2146: syntax error : missing ')' before identifier 'k' D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(11) : warning C4552: '-' : operator has no effect; expected operator with side-effect D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(11) : error C2059: syntax error : ';' D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(11) : error C2059: syntax error : ')' D:\新建文件夹\Microsoft Visual Studio\MyProjects\qw\qw.cpp(12) : error C2146: syntax error : missing ';' before identifier 'printf' 也找了 没找到  谢谢教育  新手还请您指教

引用 1 楼 jacky_wang_123 的回复:如果你想乘的话，应该是2*i    ～ 谢谢   我是新手 容易犯这种错误

如果你想乘的话，应该是2*i    ～


Question: C语言代码写播放器

先让你们老师给个例子呗

就是用C语言写一个能播放MP3的播放器 我需要的是创建过程和相关的文件调用代码

我以为是要写一个搜狗音乐呢！

适用MCI！自己百度一下。

用MFC的mediapayer 控件


Question: 菜鸟的链表问题

榜样的力量很多时候是需要使用的。

引用 2 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  仅供参考//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //   struct student *paixu(struct student *head) { 	struct student *p,*min,*before; 	struct student *head2,*tail; 	head2=NULL; 	while(head!=NULL) 	{ 		for(p=min=before=head;p->next!=NULL;p=p->next) 			if(p->next->num<min->num) 			{ 				min=p->next; 				before=p; 			} 		if(head2==NULL) 			head=min; 		else tail->next=min;         tail=min; 		if(min==head) 			head=min->next; 		else 			before->next=min->next; 	} 	tail->next=NULL; 	head=head2; 	return head; }  我把排序部分重新写了一下。您看一下是否有误。还是崩溃

另外单步解调的时候。当进入paixu（）的时候会报错 0xc0000005


Question: 急求帮助，银行家算法，急，多谢大神

你自己都舍不得时间做，别人会舍得时间给你做????

不会没关系，只要会搜索，会改改就行了

网上早就有很多了  非要连半个数据都一样  谁会给你做  http://www.baidu.com/s?word=%E9%93%B6%E8%A1%8C%E5%AE%B6%E7%AE%97%E6%B3%95%E4%BB%A3%E7%A0%81c&tn=sitehao123&ie=utf-8


Question: c语言程序问题

a=(a--)+3;是不是这条语句执行之后，a才-1；同理：printf语句执行完，才会b-1;所以b是8.

输出函数一次不要搞的这么长。可以分开来弄

.参数从右到左依次入栈

http://blog.sina.com.cn/s/blog_56e8acf40100kaer.html 以后碰到这种题目，直接撕烂了砸在出题人的脸上吧，因为这会浪费楼主的脑细胞的！


Question: 多维数组名？

二维数组名a 等价于&a[0][0]，懂了没？int (*p)[3] ，这是定义一个指针数组

各位： 2楼问题，谁说说呢？

一维数组名是指向其第一个元素的指针？？？那你说，下面的代码是显示数组的大小呢，还是显示指针的大小：     int a [4];     printf("%d", sizeof (a));

user-3：  int (*p)[3] = a;  二维数组名：a， 是指针？ 还是，指针的指针？

用数组指针； int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; int (*p)[3] = a;


Question: 帮我改下，初学者实在不会

不知道你问的是什么

要先学会问问题！这样子谁给你解答嘛。。。

#include<stdio.h> #include<malloc.h> #include<iostream.h> #include<stdlib.h> #include<string.h> typedef struct { char *elem; int length; }Sqlist; int Initlist(Sqlist *L) { L->elem=(char *)malloc(100*sizeof(char)); if(!L->elem)  exit(-2);  L->length=0;  return 1; }  int Listlength(Sqlist *L) { return L->length; } //在顺序表L的第i个位置前插入元素e,i的合法值为1..L.length+1 int ListInsert(Sqlist *L,int i,char e) { if(i<1||i>L->length +1)  return 0; char *q=&L->elem[i-1];  for(char *p=&L->elem[(L->length)-1];p>=q;p--) { *(p+1)=*p; } *q=e; ++L->length ;  return 1; } //创建顺序表 int CreatList(Sqlist *L,char a[],int n) { int len=Listlength(L); for(int i=0;i<n;i++) { if(a[i]>='a'&&a[i]<='z') ListInsert(L,++len,a[i]); }  return 1; } //返回线性表中的元素 int Getelem(Sqlist *L,int i,char e) { if(i<=0||i>L->length )   return 0;  else e=L->elem[i-1]; return 1;  } int Delete(Sqlist *L,int i,char e) { char *q,*p; if(i<1||i>L->length) return 0;  q=&L->elem[i-1]; e=*q; p=&L->elem[(L->length)-1]; for(++q;q<=p;q++) { *(q-1)=*q; } L->length--;  return 1;  }  int equal(char e1,char e2) { if(e1==e2) return 1; else return 0; }  int LocateElem_Sq(Sqlist *L, char e,  int  (*compare)(char,char))//函数指针的实质是指针，*compare（compare）为指向返回为int，参数表为（char，char）的函数的指针； {     char *p=L->elem;   //p指向第一个元素     int i=1;          while(i<=L->length&&!(*compare)(*p++,e)) ++i;     if(i<=L->length)  return(i);     else  return 0; } void BingJi(Sqlist *La,Sqlist *Lb) { char e=0; int la_len=Listlength(La); int lb_len=Listlength(Lb); for(int i=1;i<lb_len;i++) { Getelem(Lb,i,e); if(LocateElem_Sq(La,e,equal)==0)  ListInsert(La,++la_len,e);  } } void Jiaoji(Sqlist *la,Sqlist *lb,Sqlist *lc) { int la_len=Listlength(la); int lb_len=Listlength(lb); int lc_len=Listlength(lc); for(int i=0;i<la_len;i++) for(int j=0;j<lb_len;j++) { if(la->elem[i]==lb->elem[j]) {  ListInsert(lc,++lc_len,la->elem[i]);  break; } else continue; }  } void Chaji(Sqlist *la,Sqlist *lb,Sqlist *lc) { char e,u,f=0; int la_len=Listlength(la); int lb_len=Listlength(lb);  Jiaoji(la,lb,lc); int lc_len=Listlength(lc);  for(int i=0;i<la_len;i++) e=Getelem(la,++i,e); for(int j=0;j<lc_len;j++) { u=Getelem(lc,++j,u); if(e==u) { Delete(la,i,f); }  } return ; } int main(void)//主函数实现 { char a1[100],a2[100]; char e=0,u=0,k=0; int c; printf("*************************************************************************\n"); printf("清选择操作：***1***运行程序\n"); printf("            ***2***退出程序"); printf("**************************************************************************\n"); printf("请输入："); scanf("%d",&c);  if(c==1) { printf("请输入集合一："); gets(a1); int n1=strlen(a1); printf("请输入集合二："); gets(a2); int n2=strlen(a2); Sqlist la,lb,lc,l1; Initlist(&la); Initlist(&lb); Initlist(&lc); Initlist(&l1); CreatList(&la,a1,n1); CreatList(&lb,a2,n2); printf("交集运算结果：\n"); Jiaoji(&la,&lb,&lc); for(int i=1;i<=(&lc)->length;i++) {  printf("%c",(&lc)->elem[i-1]); } printf("并集运算结果是：\n"); BingJi(&la,&lb); for(int p=1;p<=(&la)->length;p++) {  printf("%c",(&la)->elem[p-1]); } printf("差集运算结果是：\n"); Chaji(&la,&lb,&l1); for(int q=1;q<=(&la)->length;q++) {  printf("%c",(&la)->elem[q-1]); }  } else exit (0);  return 0; } 应该用这种形式


Question: 求大神帮忙写代码，运行出来了，给你寄好吃的好吗

引用 22 楼 u013163178 的回复:先说是什么好吃的再说是巧克力

引用 21 楼 super_admi 的回复:我是看到好吃的才进来的。吃货啊

引用 20 楼 skypresent 的回复:这么好的事啊  我现在才看到 还有吃的送么？？ 已经做出来啦 嘿嘿

先说是什么好吃的再说

我是看到好吃的才进来的。

这么好的事啊  我现在才看到 还有吃的送么？？

引用 18 楼 zgangz 的回复:很简单的题目，给我100分就够了求代码

很简单的题目，给我100分就够了

还有没有其他大神帮忙一下啊，14楼的那个不能成功运行 哎

引用 13 楼 syrchina 的回复:[quote=引用 5 楼 sunny_chennn 的回复:] [quote=引用 4 楼 luciferisnotsatan 的回复:] [quote=引用 2 楼 sunny_chennn 的回复:] 为了补充你的脑力 给你买一箱牛奶好吗？ 买箱牛奶给你同学不就行了。[/quote] 我们大四，这个大一学的，一部分大神都忘记了，一部分都忙着写毕业设计 哎[/quote]   貌似很简单的程序啊。。。你啥专业的？[/quote]我师本的

引用 14 楼 flyrack 的回复: #include <stdio.h>  int main() { freopen("D:\\xx\\wj1002.in","r",stdin); freopen("D:\\xx\\wj1002.out","w",stdout); char aa[5];aa[4]=0; while( scanf("%4s",aa)==1 ) { int a[4],i; for(i=0;i<4;i++)   { if(aa[i]<'0'||aa[i]>'9') {   printf("error!");return 1;     } a[i]=aa[i]-'0'; a[i]=(a[i]+5)%10;   } aa[0]=a[3]+'0'; aa[3]=a[0]+'0'; aa[1]=a[2]+'0'; aa[2]=a[1]+'0'; printf("%s",aa); }  return 0; }  楼主舍得的话买盒德芙巧克力给我吧 引用 14 楼 flyrack 的回复: #include <stdio.h>  int main() { freopen("D:\\xx\\wj1002.in","r",stdin); freopen("D:\\xx\\wj1002.out","w",stdout); char aa[5];aa[4]=0; while( scanf("%4s",aa)==1 ) { int a[4],i; for(i=0;i<4;i++)   { if(aa[i]<'0'||aa[i]>'9') {   printf("error!");return 1;     } a[i]=aa[i]-'0'; a[i]=(a[i]+5)%10;   } aa[0]=a[3]+'0'; aa[3]=a[0]+'0'; aa[1]=a[2]+'0'; aa[2]=a[1]+'0'; printf("%s",aa); }  return 0; }  楼主舍得的话买盒德芙巧克力给我吧 引用 14 楼 flyrack 的回复: #include <stdio.h>  int main() { freopen("D:\\xx\\wj1002.in","r",stdin); freopen("D:\\xx\\wj1002.out","w",stdout); char aa[5];aa[4]=0; while( scanf("%4s",aa)==1 ) { int a[4],i; for(i=0;i<4;i++)   { if(aa[i]<'0'||aa[i]>'9') {   printf("error!");return 1;     } a[i]=aa[i]-'0'; a[i]=(a[i]+5)%10;   } aa[0]=a[3]+'0'; aa[3]=a[0]+'0'; aa[1]=a[2]+'0'; aa[2]=a[1]+'0'; printf("%s",aa); }  return 0; }  楼主舍得的话买盒德芙巧克力给我吧 恩恩。没问题啊！谢谢大神。我先测试下哈

引用 5 楼 sunny_chennn 的回复:[quote=引用 4 楼 luciferisnotsatan 的回复:] [quote=引用 2 楼 sunny_chennn 的回复:] 为了补充你的脑力 给你买一箱牛奶好吗？ 买箱牛奶给你同学不就行了。[/quote] 我们大四，这个大一学的，一部分大神都忘记了，一部分都忙着写毕业设计 哎[/quote]   貌似很简单的程序啊。。。你啥专业的？

引用 8 楼 call_from_dream 的回复:你的情况，我很同情！不过那个工作需要花些时间。我帮不了你。 我给你个建议吧。需要用到哪些知识，你就再去学一遍。如果你想毕业后还做软件类的工作，你肯定还会去学那个的。与其找工作的时候辛苦和被人鄙视的时候感觉痛苦，不如趁早学好一点。出来混，早晚都是要还的！ 我不做软件类的工作啦，昨天突然通知说下周要答辩（不是毕业答辩啦），现在去学，对我来说好难。。

引用 7 楼 user-8 的回复:马克。。。。 谢谢

引用 6 楼 flyrack 的回复:作业倒是不费什么时间   问题是你寄的东西估计邮费不便宜吧这个可以网购的啊！京东啥的很多嘛！求大神指点啊

你的问题主要在于基础太弱了。其实，你的问题也并不复杂。如果你肯花点时间学C++基础，然后稍微学一下MFC,你的问题基本就解决了。以前，学多媒体技术。课程结束的时候，老师要求每个同学做一个有图片，有视频，有声音的网页出来，作为学科考试。我平时也没怎么学。第二天，就得交作业。我还记得，我当时感觉有多崩溃。熬到凌晨一两点钟还在摸索中……可是，没有外援的我当时没死心，咬着牙坚持着。找资料，拼代码……当凌晨3点多的时候，我又累又困，感觉我快坚持不下去的时候，我的作品也接近完成了。我还记得，快4点的时候，我自己独立做的网页完成了！我几乎是从零开始，完全靠自己花了一个晚上，搞定了一个网页！那种成就感和自信是无法用语言表达的！ 你也可以的！

马克。。。。

作业倒是不费什么时间   问题是你寄的东西估计邮费不便宜吧


Question: 求助一道实验题，想了好久完全没有头绪QAQ

仅供参考：//不带表头结点的循环双向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next;     struct NODE *prev; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的循环双向链表:",N);//创建N个节点的循环双向链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         q->prev=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             q->prev=p;             p=q;         }     }     p->next=head;     head->prev=p;      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      k=3;     v=5;     printf("将值为%d的结点插入到循环双向链表的第%d个结点前:",v,k);//将值为v的结点插入到循环双向链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             q->prev=head->prev;             head->prev->next=q;             head->prev=q;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 q->prev=p;                 p->next->prev=q;                 p->next=q;                 break;             }         }         p=p->next;         if (p==head) break;     }      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             head->prev=q->prev;             q->prev->next=head;             if (q==head) head=NULL;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 p->next=q->next;                 q->next->prev=p;                 free(q);                 break;             }         }         p=p->next;         if (p==head) break;     }      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      printf("从小到大排序:");//从小到大排序     for (p=head;p!=NULL;) {         p1=p->prev;         for (q=p->next,q1=p;q!=NULL;) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换prev和next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         head->prev=p1;                         p1->next=q;                         p->next=q->next;                         p->prev=q;                         q->next->prev=p;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         head->prev=p1;                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         p->next->prev=p;                         p->prev=q1;                         q->next->prev=p;                         q->next=p2;                         p2->prev=q;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         p->prev=q;                         q->next->prev=p;                         q->next=p;                         q->prev=p1;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         p->prev=q->prev;                         q->next->prev=p;                         q->next=p2;                         q->prev=p1;                         p2->prev=q;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个循环双向链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d(=)",s->data); //                  if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} //                  s=s->next; //                  if (s==head) { //                      printf(" Loop\n"); //                      break; //                  } //              } //              printf("head,p,q:%02d %02d %02d\n",head->data,p->data,q->data); //              getchar();             }             q1=q;q=q->next;             if (q==head) break;         }         p=p->next;         if (p->next==head) break;     }      //输出整个循环双向链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         n++;         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         while (1) {             q=p->prev;p->prev=p->next;p->next=q;             p=p->next;             if (p==head) break;         }     }      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      m=4;     n=6;     printf("将循环双向链表中前%d个结点和后%d个结点进行互换:",m,n);//将循环双向链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;             break;         }         p=p->next;         if (p==head) break;     }     head=q->next;      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;         if (p==head) {             break;         }     }      return 0; } //创建10个节点的循环双向链表:12(=)46(=)31(=)63(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //将值为5的结点插入到循环双向链表的第3个结点前:12(=)46(=)05(=)31(=)63(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //删除第5个节点:12(=)46(=)05(=)31(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //从小到大排序:02(=)05(=)12(=)25(=)31(=)39(=)46(=)68(=)91(=)92(=) Loop //将整个链表逆序:92(=)91(=)68(=)46(=)39(=)31(=)25(=)12(=)05(=)02(=) Loop //将循环双向链表中前4个结点和后6个结点进行互换:39(=)31(=)25(=)12(=)05(=)02(=)92(=)91(=)68(=)46(=) Loop //

巧了是我老师

你认识王迷迷吗?

void delelemk(cqueue &cq, int k, int &x)//算法功能删除队列cq第i个元素,其值由x返回 { 	int p, q; 	int i = 0; 	p = cq.front; 	while(i < k){ 		if(p + i > cq.rear){ 			*x = -1; 			return; 		} 		i = (i + 1) % m; 	} 	for (q = p + i; q < cq.rear; q=(q+1)%m){ 		cq.e[q] = cq.e[q + 1]; 	} 	cqq.rear = (cq.rear - 1) % m; 	return;	 }


Question: 遍历二维数组？

引用 8 楼 Daffodiles 的回复:各位： 这个谁说说呢？ 你知道a[2][3]的地址么？都没分配！程序里永远不要存在未定义的行为！！！

引用 3 楼 Daffodiles 的回复: int a[2][3]={{1,2,3},              {4,5,6}}; for(int *p=&a[0][0]; p<&a[2][3]; p++)   printf("%d ",*p);  为什么，上面程序是错？ 下标越界了！！

各位： 这个谁说说呢？

#include <stdio.h> #include <stdlib.h>  int main() { 	int a[2][3] = { { 1, 2, 3 }, 	{ 4, 5, 6 } }; 	int *p = NULL; 	for (p = &a[0][0]; p < &a[1][3]; p++) 		printf("%d ", *p); 	return 0; }

#include <stdio.h> #include <stdlib.h>  int main() { 	int i; 	int a[2][3] = { { 1, 2, 3 }, 	{ 4, 5, 6 } }; 	int (*p)[3]= NULL; 	   p = a ; 	   for (i = 0; i < sizeof(a) / (sizeof(int)* 3); ++i) 	   { 		   for (int j = 0; j < sizeof(a) / (sizeof(int)* 2); j++) 			   printf("%d  ,", *(*(p + i) + j)); 		   printf("\n");  	   } 	return 0; }

引用 3 楼 Daffodiles 的回复: int a[2][3]={{1,2,3},              {4,5,6}}; for(int *p=&a[0][0]; p<&a[2][3]; p++)   printf("%d ",*p);  为什么，上面程序是错？  数组名就可以当做指针（地址） int *p=a

u013163178：   程序错了！

完全不用下标，只用指针，可以么？

#include<stdio.h> int main() { int i; int a[2][3] = {{1,2,3},                {4,5,6}}; int *p = NULL; p = a; for(i=0;i <sizeof(a)/sizeof(int); ++i) printf("%d\t",p[i]); return 0; }


To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints. Click the Data tab of the Breakpoints dialog box. In the Expression text box, type the name of the variable. Click OK to set the breakpoint.

问题还是没有解决，感觉应该是初始化时出的问题。。换了一种方法，不知道为什么就解决了，唉

按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

引用 4 楼 cr945211 的回复:引用 2 楼 zhaowech 的回复:能上详细的代码，有没有执行OnCancel或者OnOk之类的函数？   其他代码也没什么，只是得到字符串的代码了   没有用到取消之类的函数 没有全部代码，不好判断

在列表的数据显示代码 void CServerDlg::OnDisSendList(CString str) { 	CString Pointx=str.Mid(6,4); 	CString Pointy=str.Mid(11,4); 	CString Theta=str.Mid(16,4); 	CString a1=str.Mid(21,4); 	CString v1=str.Mid(26,4);     m_ctlSendList.SetItemText(0,1,Pointx); 	m_ctlSendList.SetItemText(1,1,Pointy);     m_ctlSendList.SetItemText(2,1,Theta);     m_ctlSendList.SetItemText(3,1,a1);     m_ctlSendList.SetItemText(4,1,v1);  } 调试过程中的提示如图

还有别的方法吗？

用spy++看一下窗口是否存在

第一次的时候只是在CServerDlg类中，第二次开始就要CView类里得到字符串，然后在回到CServerDlg类中执行向m_ctlSendList写文本的操作。是因为这个原因所以窗口句柄出现问题了吗？怎么改

能上详细的代码，有没有执行OnCancel或者OnOk之类的函数？

补充一下，调试的时候发现，第一次需要向m_ctlSendList写文本的时候，m_hWnd还是正常的，第二次就变成了0000，第三次直接就中断了


Question: 求libcurl 32位和64的lib库，必须支持https

引用 楼主 pengfangxu8 的回复:如题：求libcurl 32位和64的lib库，必须支持https。 linux的我会编译，也能成功，就是windows的我编不成功。 伤心，我自己编不成功！我网上找了博客，我照着别人一步一步的来编都有问题，所以在这儿求助下，请各位帮帮忙，谢谢！ 我的邮箱是375088168@qq.com 这里面有libcurl.dll：http://pan.baidu.com/s/1c0D0iuk#path=%252F%25E5%25B1%258C%25E7%25A5%259E


Question: 并归排序的一个小问题

引用 1 楼 ZHANGJIXIN 的回复:#include <stdio.h> #include <stdlib.h> #define SIZE 10  void merge(int array[], int min, int max, int temp[]);	//递归 void mergesort(int array[], int min, int mid,int max, int temp[]); //合并交换排序  int main(void) { 	int array[SIZE] = { 43, 6, 3, 26, 2, 7, 2, 9, 5, 7 }; 	int temp[SIZE]; 	 	merge(array, 0,SIZE-1, temp); 	for (int n = 0; n < SIZE; n++)	//打印排序完后的临时数组 		printf("%d,", temp[n]); 	 	return 0; }  void mergesort(int array[], int min, int mid,int max, int temp[])  { 	int i = min; 	int left_begin = min;	 	int left_end = mid;		//前面的区间范围 	int right_begin = mid + 1;	 	int right_end = max;	//后面的区间范围 	while (left_begin <= left_end&&right_begin <=right_end)  	{	//判断比较大小，并赋给临时数组 		if (array[left_begin] <= array[right_begin]) 			temp[i++] = array[left_begin++]; 		else 			temp[i++] = array[right_begin++]; 	}  	while (left_begin <=left_end)	//把剩下的元素也都放到临时数组中 		temp[i++] = array[left_begin++]; 	while (right_begin <= right_end) 		temp[i++] = array[right_begin++];	//同上  	for(int k = min; k <= max; k++)   //将缓冲区中的数据元素复制回原序列中 		array[k] = temp[k]; }  void merge(int array[], int min, int max, int temp[])  { 	if (min < max) 	{ 		int mid = (min + max)/2; 		merge(array, min, mid, temp); 		merge(array, mid + 1, max, temp); 		mergesort(array, min, mid, max, temp); 	} }    哥，注意对比你的第三十六行和我的有什么不同 引用 2 楼 FightForProgrammer 的回复:while (left_begin <=left_end)    //把剩下的元素也都放到临时数组中             temp[i++] = array[left_begin++];         while (right_begin <= right_end)             temp[i++] = array[right_end++];    //同上  执行了这段代码你程序就结束了。但是array[]并没有改变。楼上的办法应该可以的 谢谢


Question: 谁有C语言能编出CF挂代码?求给

能用的不免费, 免费的不能用.

有啊 你给多少钱？

难度太大了，不会啊


Question: 求大神解释

缓冲区里面的回车怎么产生的

只要在scanf("%c",&a);之前把缓冲区里面的回车清除掉都可以~

#include<stdio.h> main() {      char s[12],a;      scanf("%s",&s);      printf("%s",s);      getchar();      scanf("%c",&a);      printf("%c",a); } 为什么这样改也对

在你的程序中，第一个scanf输入了字符串以后，按回车键，此时把一行字符连同换行符一起送入缓冲区，缓冲区检测到有换行符，就把一行字符送入系统内存，送给了s，而换行符'\n'还留在缓冲区里，换行符（line feed)ASCII码是10，你没清除缓冲区，又再用一个scanf输入a，a就会先检查缓冲区，发现里头有个换行符，就把换行符对应的ASCII码赋给了a 你用debug单步调试，就会发现ch的值是10  有三种方法 1:scanf（"%c",&ch);前面加flushall();或fflush(stdin); 2:scanf（"%c",&ch);改为scanf（" %c",&ch);%c前面加一个空格 3:scanf（"%c",&ch);改为scanf（"%s",&ch);  楼上这三种方法，就是冲掉了换行符。


Question: 为什么二维指针可以动态分配空间

这个是对一维指针开辟空间，看清楚了。 几维指针都可以动态分配空间

一维指针也可以动态分配空间

N维都可以啊。关键是它是指针

我想楼主的问题可能是为什么指针的指针能够当作出参吧

指针是指向某段内存的起始地址的，这个地址要么是已经分配好变量的地址首部，要么就是为指针手动分配的地址的首部


Question: 求大神指导。。二叉树的建立为什么用指针的指针

这和二叉树没什么关系  你要把指针作为参数，并且还要在函数里给指针申请空间，就要这么做。传指针的地址进去才行。或者用引用 BTNode *&p

因为你的指针要做输出参数

因为要让头节点指像后来产生的节点，这样就需要修改头节点的值，如果不用指针的指针的话，是无法修改头节点的。


gets_s需要两个参数，后一个限定字符的个数，例如gets_s(data, 80)

不管用就很有可能是缓冲区的问题，在它之前加个getchar()试试

scanf_s("%lf", e_pointer); 后面加上清空输入缓冲区


Question: 关于全局变量和extern的用法---请教！！！

额，是啊，小弟正在学习，感谢大家的帮助~~~

extern extern declarator      // used when variable or function has external linkage  extern string-literal declarator      // used when linkage conventions of another                           // language are being used for the declarator  extern string-literal { declarator-list }   // used when linkage conventions of another                          // language are being used for the declarators  The extern keyword declares a variable or function and specifies that it has external linkage (its name is visible from files other than the one in which it's defined). When modifying a variable, extern specifies that the variable has static duration (it is allocated when the program begins and deallocated when the program ends). The variable or function may be defined in another source file, or later in the same file. In C++, when used with a string, extern specifies that the linkage conventions of another language are being used for the declarator(s).  Declarations of variables and functions at file scope are external by default.  In C++, string-literal is the name of a language. The language specifier "C++" is the default. "C" is the only other language specifier currently supported by Microsoft C/C++. This allows you to use functions or variables defined in a C module.  All of the standard include files use the extern "C" syntax to allow the run-time library functions to be used in C++ programs.  For more information, see auto, register, static, const, and volatile.  Example  The following example declares the functions printf, getchar, and putchar with “C” linkage:  // Example of the extern keyword extern "C" int printf( const char *, ... );  extern "C" {    int getchar( void );    int putchar( int ); }   public C++ Specific —>  public: [member-list]  public base-class  When preceding a list of class members, the public keyword specifies that those members are accessible from any function. This applies to all members declared up to the next access specifier or the end of the class.  When preceding the name of a base class, the public keyword specifies that the public and protected members of the base class are public and protected members, respectively, of the derived class.  Default access of members in a class is private. Default access of members in a structure or union is public.  Default access of a base class is private for classes and public for structures. Unions cannot have base classes.  For more information, see private, protected, friend, and Table of Member Access Privileges.  END C++ Specific  Example  // Example of the public keyword class BaseClass { public:    int pubFunc(); };  class DerivedClass : public BaseClass { }; void main() {    BaseClass aBase;    DerivedClass aDerived;    aBase.pubFunc();       // pubFunc() is accessible                            //    from any function    aDerived.pubFunc();    // pubFunc() is still public in                            //    derived class }

引用 1 楼 u011337306 的回复:1.c文件要包含变量声明所在的头文件； 2.C文件引用另外一个C文件变量，可以直接在该C文件中对该变量进行声明；  另外，建议LZ搞清变量的作用域 感觉LZ还分不清什么是定义什么是声明！这些东西自己去领悟吧！

亲，确实如楼上所说，你把定义和声明的概念弄混淆了。  同一个程序中，一个全局变量，可以声明多次，但只能定义一次。因此，全局变量一般会放在.c or .cpp中，而声明会放在.h之中。

1)请参考 <<The C Programming Language >> 和 <<C99(ISO_IEC_9899_1999)>>,或者搜"c语言变量与作用域"  extern is used when a file needs to access a variable in another file that it may not have #included directly. Therefore, extern does not actually carve out space for a new variable, it just provides the compiler with sufficient information to access the remote variable.  2)对你的问题解释一下.其实记住一点就可以了:c语言中变量使用之前要声明, extern可以声明本作用域之外的变量.  1 我新建了一个new.uvproj  2 其中包括main.c  a.c  a.h  b.c  b.h 还有define.h(其中包括数据的申明和I/O口的定义） 3 我在define.h中定义了一个全局变量extern unsigned int Temperature_Temp;  4 这个变量在a.c中用到，所以在a.c中如下定义unsigned int Temperature_Temp;  5 在main.c中也要用到这个全局变量，那我还要在这个.c文件中再定义一次？我试过，这样keil报错，重复定义~~~ [注]:main.c 看不到 a.c中的定义,你可以把define.h, #include进来就可以了. 我的问题是：那我在a.c中使用extern定义，即extern unsigned int Temperature_Temp; 那按照我的理解：因为已经定义为全局变量了，那在main.c中就不需要定义了，这样理解对不对？？？ [注]:不对  实验结果：这样keil虽不报错，可是出现很多警告！！！为什么？？？ [注]:extern是声明,这样的话a.c中声明了,但没有地方定义这个变量   后来，我在a.c中将其定义为extern unsigned int Temperature_Temp; 在main.c中将其定义为unsigned int Temperature_Temp; 就可以了（没有警告，也没有错误），可是，我百思不得其解， [注]:这里的意思是这个变量有地方定义了(main.c),别的地方要用也声明了(a.c),所以符合了c语言的规范.


Question: linux下settimeofday函数调用失败，何故？

谢谢各位，我自己 已经找到问题了。  写出来 供 像我这样的初学者 参考：  是struct   timeval  结构中 time_t    的值为负导致的。  在struct   tm 结构中的tm_year必须超过1970年，否则为负数。因为linux是以1970年起计算秒数计时。早于这个时间，就导致是负数，报错了。 （在32位系统，这个数也不能超过2038年。）

检查下errno。

GETTIMEOFDAY Section: Linux Programmer's Manual (2) Updated: 2004-05-27  --------------------------------------------------------------------------------    NAME gettimeofday, settimeofday - get / set time    SYNOPSIS #include <sys/time.h>  int gettimeofday(struct timeval *tv, struct timezone *tz);  int settimeofday(const struct timeval *tv , const struct timezone *tz);     DESCRIPTION The functions gettimeofday and settimeofday can get and set the time as well as a timezone. The tv argument is a timeval struct, as specified in <sys/time.h>:   struct timeval { time_t          tv_sec;         /* seconds */ suseconds_t     tv_usec;        /* microseconds */ };  and gives the number of seconds and microseconds since the Epoch (see time(2)). The tz argument is a timezone :    struct timezone { int     tz_minuteswest; /* minutes W of Greenwich */ int     tz_dsttime;     /* type of dst correction */ };  The use of the timezone struct is obsolete; the tz_dsttime field has never been used under Linux - it has not been and will not be supported by libc or glibc. Each and every occurrence of this field in the kernel source (other than the declaration) is a bug. Thus, the following is purely of historic interest.   The field tz_dsttime contains a symbolic constant (values are given below) that indicates in which part of the year Daylight Saving Time is in force. (Note: its value is constant throughout the year - it does not indicate that DST is in force, it just selects an algorithm.) The daylight saving time algorithms defined are as follows :   DST_NONE     /* not on dst */  DST_USA     /* USA style dst */  DST_AUST    /* Australian style dst */  DST_WET     /* Western European dst */  DST_MET     /* Middle European dst */  DST_EET     /* Eastern European dst */  DST_CAN     /* Canada */  DST_GB      /* Great Britain and Eire */  DST_RUM     /* Rumania */  DST_TUR     /* Turkey */  DST_AUSTALT /* Australian style with shift in 1986 */   Of course it turned out that the period in which Daylight Saving Time is in force cannot be given by a simple algorithm, one per country; indeed, this period is determined by unpredictable political decisions. So this method of representing time zones has been abandoned. Under Linux, in a call to settimeofday the tz_dsttime field should be zero.   Under Linux there is some peculiar `warp clock' semantics associated to the settimeofday system call if on the very first call (after booting) that has a non-NULL tz argument, the tv argument is NULL and the tz_minuteswest field is nonzero. In such a case it is assumed that the CMOS clock is on local time, and that it has to be incremented by this amount to get UTC system time. No doubt it is a bad idea to use this feature.   The following macros are defined to operate on a struct timeval :    #define       timerisset(tvp)\          ((tvp)->tv_sec || (tvp)->tv_usec) #define       timercmp(tvp, uvp, cmp)\ ((tvp)->tv_sec cmp (uvp)->tv_sec ||\ (tvp)->tv_sec == (uvp)->tv_sec &&\ (tvp)->tv_usec cmp (uvp)->tv_usec) #define       timerclear(tvp)\          ((tvp)->tv_sec = (tvp)->tv_usec = 0)  If either tv or tz is null, the corresponding structure is not set or returned.   Only the super user may use settimeofday.     RETURN VALUE gettimeofday and settimeofday return 0 for success, or -1 for failure (in which case errno is set appropriately).    ERRORS EFAULT  One of tv or tz pointed outside the accessible address space.  EINVAL  Timezone (or something else) is invalid.  EPERM  The calling process has insufficient privilege to call settimeofday; under Linux the CAP_SYS_TIME capability is required.     NOTE The prototype for settimeofday and the defines for timercmp, timerisset, timerclear, timeradd, timersub are (since glibc2.2.2) only available if _BSD_SOURCE is defined (either explicitly, or implicitly, by not defining _POSIX_SOURCE or compiling with the -ansi flag).  Traditionally, the fields of struct timeval were longs.     CONFORMING TO SVr4, BSD 4.3. POSIX 1003.1-2001 describes gettimeofday() but not settimeofday().    SEE ALSO date(1), adjtimex(2), time(2), ctime(3), ftime(3), capabilities(7)  --------------------------------------------------------------------------------

单步调试看看 t_timet和rec的值。


Question: 这里的！==老是报告错误，是不是书上写错了？？

引用 13 楼 lovesmiles 的回复:引用 12 楼 filia2014 的回复:[quote=引用 10 楼 lovesmiles 的回复:] [quote=引用 8 楼 filia2014 的回复:] [quote=引用 6 楼 yln_sys 的回复:] 这本书叫什么名字啊？？？ 谭浩强 C程序设计第二版 不会吧？虽然谭浩强的书不算好，但也没有这么低级的错误吧？  只有"!="没有"!==". 你确定是你没有理解好书本的，还是书本真是这样写的？如果书本有!==这个东西，把书扔了。[/quote]goto end 这个是不是没有end关键词？retrun(null)是不是一样的[/quote] end不是关键字。goto后面通常接一个label。这个end在这里是一个自定义的label。 天啊，你的基础这么差，你看的是什么书。 不要书本没看完就急着搞代码[/quote]谭浩强 C程序设计第二版.我就是把书上的例子理解了就打一遍

珍惜生命，换本合格的教材。

自己细心检查吧 [code=c while((num != p1->num)&&(p1->next != NULL))  //对比一下你自己的 [/code]

如果书上是!==的话，这书可以丢了。

引用 12 楼 filia2014 的回复:引用 10 楼 lovesmiles 的回复:[quote=引用 8 楼 filia2014 的回复:] [quote=引用 6 楼 yln_sys 的回复:] 这本书叫什么名字啊？？？ 谭浩强 C程序设计第二版 不会吧？虽然谭浩强的书不算好，但也没有这么低级的错误吧？  只有"!="没有"!==". 你确定是你没有理解好书本的，还是书本真是这样写的？如果书本有!==这个东西，把书扔了。[/quote]goto end 这个是不是没有end关键词？retrun(null)是不是一样的[/quote] end不是关键字。goto后面通常接一个label。这个end在这里是一个自定义的label。 天啊，你的基础这么差，你看的是什么书。 不要书本没看完就急着搞代码

引用 10 楼 lovesmiles 的回复:引用 8 楼 filia2014 的回复:[quote=引用 6 楼 yln_sys 的回复:] 这本书叫什么名字啊？？？ 谭浩强 C程序设计第二版 不会吧？虽然谭浩强的书不算好，但也没有这么低级的错误吧？  只有"!="没有"!==". 你确定是你没有理解好书本的，还是书本真是这样写的？如果书本有!==这个东西，把书扔了。[/quote]goto end 这个是不是没有end关键词？retrun(null)是不是一样的

这本书叫什么名字啊？？？

while(num!-p1->num&&p1->nxet!==NULL) p1->nxet!==NULL num!-p1->num这也有问题

买一本<c primer plus>吧，这本书挺不错的

引用 8 楼 filia2014 的回复:引用 6 楼 yln_sys 的回复:这本书叫什么名字啊？？？ 谭浩强 C程序设计第二版 不会吧？虽然谭浩强的书不算好，但也没有这么低级的错误吧？  只有"!="没有"!==". 你确定是你没有理解好书本的，还是书本真是这样写的？如果书本有!==这个东西，把书扔了。

引用 8 楼 filia2014 的回复:引用 6 楼 yln_sys 的回复:这本书叫什么名字啊？？？ 谭浩强 C程序设计第二版 假货，赶紧丢了

不等于就是用!=，书上写错了吧

函数中没有 “end:” 标号 不等是 “!=”

nxet.....


Question: 关于C语言的学习

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

C在底层有前景！想精通C语言，学编译原理，看C99或者C11标准C文法！想熟练，看几本经典教材即可，比如K&R

我现在也在学习C语言，刚开始学就以计算机硬件和系统为基础这个不现实，并不是所有的C语言开发者都会工作在系统开发上面。而且上手也会比较慢，2楼赵4老师说的很对。

参考一下——http://blog.csdn.net/u012421456/article/details/40681247

引用 3 楼 u013163178 的回复:c语言比较"简单",不像别的语言,有一大堆的控件,丰富的函数库什么的,c语言都是自己造轮子,数字结构自己写,算法自己实现,内存自己管理,所以你要学好他,就必须对计算机理论体系比较熟悉. 不能同意你的说法：“不像别的语言，有一大堆的控件，丰富的函数库什么的” 如果说 C 语言什么都干不了，那我可以说 C++ 也什么都干不了。如果要说 C 什么都干不了，而 C++ 可以开发界面，完全是混淆概念。说 C 什么都干不了，指的是标准 C（ANSI C）、C 语法；说 C++ 可以开发界面，又说的是把各种建立在操作系统上的 API 封装起来的类库，语法和框架岂能相提并论。大堆控件和丰富的函数库归根结底还是由操作系统（平台）提供的，不管你用 C、C++ 都能搞。后半的“C 语言都是...“意思好像说除了 C 之外，别的语言都提供了这些一样，我觉得这样说比较妥当：不管是 C 还是 C++，学习只是学习一种思想，开发都是依赖于平台的，只是开发工具的开发商针对该语言提供了各种各样的库和框架。


Question: 【求源代码】spfdisk tool 的源代码

参考BC\TVISION\*.* http://download.csdn.net/source/2805028


A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified order.  3 2 1 2


Question: 求教、利用电脑怎么定位手机号码的位置啊？

你是说当前位置还是手机号归属地？如果是归属地的话网上有各个号码段的归属地，写成代码很简单。如果是当前位置的话，这个就不是编程的范畴了。


Question: 请问高手，关于c语言编写接口的问题

接口的范围太大了。

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

参考我的博文http://blog.csdn.net/turingo/article/details/8516327

哪种接口？不同的接口有不同的模型

哦，请问下，如果是接口是api是不是就编写成.dll文件，如果是com组件的话，用c如何实现网络和硬件编程的接口？？

不知道你说的接口指 API 还是 COM。 如果是 API 也就是普通的函数了，做成静态库或者动态库。 如果是 COM 的话，就很麻烦那了，用 C++ 实现起来比较方便一点。

感觉1#说的在理

就是一个结构体，里面都是函数指针。


Question: 关于结构体的一个问题

一个指向动态分配的内存空间(分配在堆上)，用完需要程序员自己用free释放; 一个指向栈上分配的内存空间，无需管释放问题，出了作用域自动释放

生命周期不同，自己分配要注意释放。 malloc和free

前者是堆中手动分配的内存，用完之后，需要自己手动的释放，否则内存泄露，后者是栈自动分配的内存，超出作用域后，会自动释放，无需自己手动控制……

引用 1 楼 user-5 的回复:stuct student *p; p=(struct student*)malloc（sizeof（struct student）） 这个是在堆栈上分配空间的 上面那个呢


Question: 大神来看看我这个函数，问题是jc（）是不是死循环？

jc(K)没有初值，当然死循环了！！

return 3 * jc(i--);   //在这里死了。。。。。 这里用i--，参数传入的值始终是i，要是对操作符不熟悉可以分两行写 i--; return 3*jc(i);

这么写会不会好一点 #include<stdio.h> #include<stdlib.h> int factorial(int n) { 	if(n == 1) 	{ 		return n; 	}	 	else 		return n * factorial(n-1); }  int main() { 	int n; 	int result; 	scanf("%d",&n); 	result = factorial(n); 	printf("%d\n",result); 	exit(0); }

你的递归调用时参数没有变小啊 改成 --i  试试

代码乱的都不像看了

我该怎么说呢。。。 #include <stdio.h>  int jc(int i) { 	if(!i)return 1; 	return jc(i-1)*i; }  int main(void) {     int i,sum=0 ;     //printf("请输入想求的阶乘\n");     //scanf("%d",&i);     sum=jc(5);     printf("%d\n",sum);     return 0 ; }


Question: 这个程序怎么运行不了了，程序应该没有写错，可能是哪儿设置错了。

就是说你在第7行使用的scanf已经不安全, 要使用安全版本的函数 scanf_s

在代码最开头加一行： #pragma warning(disable:4996)

编译器提示你: "scanf不安全, 要使用安全版本的函数 scanf_s".  用linux环境,然后使用gcc编译一下看看.

关键是下面的错误提示不理解。


Question: 使用第三方库文件时dll放置问题

引用 2 楼 xiaoxiangyue_lib 的回复:回复于： 2014-11-25 18:50:28 相互依赖吧！  什么意思？  就说，A.dll依赖于B.dll， 而B.dll又依赖于C.dll。一路下去。所有你加入了20多个dll也不奇怪。

a库需要b库。相互调用关系。

回复于： 2014-11-25 18:50:28 相互依赖吧！  什么意思？

VC或者VS缺省掉一些动态库，老老实实加载缺失的dll吧

相互依赖吧！


Question: 求大神指点linux下的C语言学习路线

引用 13 楼 ForestDB 的回复:看TCPL，学习C语言 看鸟哥，学Linux的使用 看APUE，学系统的API 看Linux Kernel Internals，学习内核的知识 看The Art Of Unix Programming，Linux Philosophie，了解一些UNIX的哲学感谢！

引用 12 楼 williamhong 的回复:学好英语，别上有中国字的技术网站好的，谢谢你！

引用 12 楼 williamhong 的回复:学好英语，别上有中国字的技术网站 逼格真高 学好英语是真的 别上有中国字的技术网站 说得自己多叼的一样

学好英语，别上有中国字的技术网站

引用 9 楼 whizer 的回复:装一个linux虚拟机---> 敲一敲c语言程序----->边看边调 Unix高级环境编程--->内核设计与实现 --->自己增加一个module试试 ---->找一个实际项目做一做  一步一步来,不要仅仅看过书就说自己已经精通了, 尝试构造core dump, 调试gdb, 调试内存越界, 慢慢地就会通了, 再以后就靠自己了....(顺便说一句,真实运行的code和书本上的都是有区别的,只有真实的code才是最好的注释)谢谢！

引用 8 楼 turingo 的回复:看完了就跟着实践啊。  引用 6 楼 u013138790 的回复:引用 5 楼 turingo 的回复:《鸟哥的Linux私房菜》非常好啊！  引用 2 楼 u013138790 的回复:能推荐几本书吗？除了鸟哥的Linux私房菜。。。我看完了啊。。。。而且我C语言的C PRIMER也看完了。。。用一年了。。。

说那么多，先安装一个linux版本，然后用一年再说

谢谢你们了！

《Linux C编程一站式学习》

能推荐几本书吗？除了鸟哥的Linux私房菜。。。

Unix高级环境编程，linux程序设计，unix网络编程！工具，鸟哥私房菜！再深入，精通驱动开发，内核设计与实现，深入linux内核架构


Question: c语言解码程序的问题

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 输油管道的问题思考

@user-1   我知道如果方向确定为x轴，只需要找中位数，但是如果方向不确定呢？  ps：我考虑的一个问题是，把所有的点放在一个圆中，这些点到圆心的距离比到平面其他点的距离都要小。。。。不知道这个结论对不对。。。。。。。。。

东西向的油管，和x轴平行的方向啊              #1             #2             |                  |                #3             |                  |                 |   主管  |                  |                | ===========================================                    |                           |                      #4                        |                                               #5 只是这样一个位置关系而已 方向是确定的

思路肯定还是中位数，但是这里的中位数计算怎嘛解决，原来的是y轴上的中位数，现在方向并不确定，就没有距离的参考标准了


Question: sizeof()？

二维数组是不是也是一维数组呢   ？我想是的

同意楼上的用变量记。 你如果用sizeof来计算。。。。你确定这代码提交上去不扣工资？

sizeof(a[0]) / sizeof( a[0][0])

行: sizeof(a) / sizeof(*a); 列: sizeof(*a);

各位： 这个谁说说呢？

sizeof *a / sizeof **a

不要算，用变量记住。

int row = sizeof(a) / sizeof(*a); int col = sizeof(a) / row;


Question: c语言求助

for(;input != 'y' || 'n';) //语法错了  input != 'y' && input!='n'

到时什么问题啊

汗啊

学c语言之前应该先学语文

什么问题？楼主倒是说一下啊！！！


Question: c语言——贪吃蛇写着玩

console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

vs2010编译完显示乱码  不过我看你这个代码彩色背景倒挺好玩的

仅供参考#include <windows.h> #include <stdio.h>  void ConPrint(char *CharBuffer, int len); void ConPrintAt(int x, int y, char *CharBuffer, int len); void gotoXY(int x, int y); void ClearConsole(void); void ClearConsoleToColors(int ForgC, int BackC); void SetColorAndBackground(int ForgC, int BackC); void SetColor(int ForgC); void HideTheCursor(void); void ShowTheCursor(void);  int main(int argc, char* argv[]) {    HideTheCursor();    ClearConsoleToColors(15, 1);    ClearConsole();    gotoXY(1, 1);    SetColor(14);    printf("This is a test...\n");    Sleep(5000);    ShowTheCursor();    SetColorAndBackground(15, 12);    ConPrint("This is also a test...\n", 23);    SetColorAndBackground(1, 7);    ConPrintAt(22, 15, "This is also a test...\n", 23);    gotoXY(0, 24);    SetColorAndBackground(7, 1);    return 0; }  //This will clear the console while setting the forground and //background colors. void ClearConsoleToColors(int ForgC, int BackC) {    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //not used but we need to capture this since it will be    //written anyway (passing NULL causes an access violation).    DWORD count;     //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    SetConsoleTextAttribute(hStdOut, wColor);    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);        FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  //This will clear the console. void ClearConsole() {    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //   not used but we need to capture this since it will be    //   written anyway (passing NULL causes an access violation).    DWORD count;    //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  //This will set the position of the cursor void gotoXY(int x, int y) {    //Initialize the coordinates    COORD coord = {x, y};    //Set the position    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }  //This will set the forground color for printing in a console window. void SetColor(int ForgC) {    WORD wColor;    //We will need this handle to get the current background attribute    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    CONSOLE_SCREEN_BUFFER_INFO csbi;     //We use csbi for the wAttributes word.    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //Mask out all but the background attribute, and add in the forgournd color       wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);       SetConsoleTextAttribute(hStdOut, wColor);    } }  //This will set the forground and background color for printing in a console window. void SetColorAndBackground(int ForgC, int BackC) {    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); }  //Direct console output void ConPrint(char *CharBuffer, int len) {    DWORD count;    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL); }  //Direct Console output at a particular coordinate. void ConPrintAt(int x, int y, char *CharBuffer, int len) {    DWORD count;    COORD coord = {x, y};    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorPosition(hStdOut, coord);    WriteConsole(hStdOut, CharBuffer, len, &count, NULL); }  //Hides the console cursor void HideTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = FALSE; 	  SetConsoleCursorInfo(hStdOut, &cciCursor);    } }  //Shows the console cursor void ShowTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = TRUE; 	  SetConsoleCursorInfo(hStdOut, &cciCursor);    } }


Question: 如何设计一个定时读取文件数据的程序？

引用 15 楼 zhao4zhong1 的回复:码农卖萌宝典：我驾驭不了超过100行的源代码！  笑新手 显能耐吗

码农卖萌宝典：我驾驭不了超过100行的源代码！

搜索出来的代码太长了，我看不懂！

四体不勤，五谷不丰。

引用 3 楼 zhao4zhong1 的回复:ReadDirectoryChangesW  参考 MSDN98\SAMPLES\VC98\SDK\WINBASE\IO\FWATCH\*.* 或 Microsoft SDK\samples\winbase\IO\fWatch\*.* 兄台的提示对我很有帮助，我上网搜了一下，发现ReadDirectoryChangesW实时监控文件变化情况能够满足我的需求，可是，我不知道怎么在我的项目里使用他，我想请你或者别的见到此信息的朋友帮我实现一下好吗？ 帮助不是白帮，一点小意思肯定是有的。

引用 6 楼 zhao4zhong1 的回复:[quote=引用 4 楼 alibaren 的回复:] 谢谢你，可是我没有MSDN 不会自己搜索下载MSDN98或SDK6吗？[/quote] 自顶

引用 楼主 alibaren 的回复:我现在有一个文件夹，下面有9个文件，是某软件数据缓存，大约一分钟更新一次，也就是说，每分钟增加一个数据块在每个文件中。我现在就是想设计一个程序去读取这些文件并把结果实时传到数据库，请问我改如何去实现呢？ 目前，读取文件的程序部分我已实现，现在就是实时这一步。也就是说每分钟给数据库传一条新增的数据记录。例如9：30分传一条记录，9:31分再传第二条.........过一分钟就传一次  请大家给你个简洁靠谱的方案好吗？ tail -f [path]

亲，你可以使用MFC创建向导，先创建一个窗口或者CMD程序，然后弄个OnTimer事件就行了。如果是窗体程序，直接把OnTImer拖进去就行了，然后设置一下该控件的属性，双击它编写代码。

其实，我只要想每隔分钟执行一下程序中的函数，有人帮忙写个范例吗

引用 4 楼 alibaren 的回复:谢谢你，可是我没有MSDN 不会自己搜索下载MSDN98或SDK6吗？

引用 楼主 alibaren 的回复:我现在有一个文件夹，下面有9个文件，是某软件数据缓存，大约一分钟更新一次，也就是说，每分钟增加一个数据块在每个文件中。我现在就是想设计一个程序去读取这些文件并把结果实时传到数据库，请问我改如何去实现呢？ 目前，读取文件的程序部分我已实现，现在就是实时这一步。也就是说每分钟给数据库传一条新增的数据记录。例如9：30分传一条记录，9:31分再传第二条.........过一分钟就传一次  请大家给你个简洁靠谱的方案好吗？ 搜索“可等待计时器“

谢谢你，可是我没有MSDN

引用 1 楼 yangyangsnr 的回复:创建个任务计划第分钟执行一次 新手，不知道如何创建

创建个任务计划第分钟执行一次


Question: netinet/in.h是什么头文件？

android源代码包

引用 1 楼 zhao4zhong1 的回复:C:\Android\Mydroid\bionic\libc\include\netinet\in.h  VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 感谢，还一个问题在哪里能下载到netinet\in.h文件啊？就是LZ77的压缩头文件


Question: 参数辨识   曲线拟合程序已给出    如何减少计算量 ？？？  求大神帮助！！！

自己动手，丰衣足食。

您能帮我改一下吗？程序已给出，谢谢。100分给您了。

如果怕循环内没有printf无法区分死循环还是正在干活，可以每隔比如10000次printf一次。

提醒：在循环内避免使用printf输出到屏幕（屏幕上卷一行很慢的），可以使用fprintf输出到文件（快得多）

掌握一个大的原则： 再循环内多用几个临时变量保存外层循环已经计算出的中间值，避免或减少在循环内重复计算。

您好，谢谢您回答我的问题。。。这个帖子的内容是 我们老师  布置的 作业   。要求就是减少计算量。

一般情况下没必要减小计算量。


Question: 工作调动新书贱卖

好书很多啊，买

我也欠了好多书债

楼主要去什么城市呀?

顶起，支持。

引用 26 楼 sholber 的回复:赵四老师？ 乡村爱情里的赵四？

给楼主顶一顶

上面已经有很多书被卖了，如果有需要，请移步新帖子 http://bbs.csdn.net/topics/390944085

楼主真土豪， 这么多书

赵四老师？ 乡村爱情里的赵四？

引用 24 楼 zhousitiaoda 的回复:看了下没有目前想要的，C++方面的大部分都有了，其他方面的暂时没太大兴趣,还是留给更需要的人吧，不想买来垫桌子 好吧，看需要了。

引用 18 楼 gigglesun 的回复:楼主在南山科技园附近？ 在宝安坪洲地铁口，离科技园20分钟

引用 21 楼 zhousitiaoda 的回复:看到的晚了点，昨晚刚买了本C++ template 70多  额，我都是半价。书基本全新。 兄弟可以看看其他的。。。 比如，还有 tcp/ip详解 3卷 tcp/ip协议族第4版 java语言程序设计 java编程思想

看到的晚了点，昨晚刚买了本C++ template 70多

引用 19 楼 baiwei12 的回复:怎么加啊？？？ 加QQ啊，上面有QQ号

怎么加啊？？？

楼主在南山科技园附近？

up up一下

up up up


Question: 枚举类型的新手问题？？

enum color i;    ===> int i;

#include<stdio.h> void main() {     enum color{red,yellow,blue,white,black};     int i;     for(i=red;i<=black;i++)     {         switch(i)         {case red: printf("red  ");break;         case yellow: printf("yellow  ");break;         case blue: printf("blue  ");break;         case white: printf("white  ");break;         case black: printf("black  ");break;         default: break;}         printf("/n");     } }


Question: 为什么第二个字符串输入后依旧是等待输入的状态？

你设个断点调试下，看看 get_next(T, next); int i = Index_KMP(S, T, next, 0);能不能执行过去？

你说的等待输入状态有两种情况：1、确实需要输入，2、程序在运行，未退出。 你可以继续输入看看有没有显示你键入的字符，没有的话就是一楼所说的了额，要不就是输入的问题，用cin、cout之类

代码不完整吧 应该不是输入等待的问题 将int next[STRING_MAX_SIZE];//next数组           get_next(T, next);     int i = Index_KMP(S, T, next, 0);           printf("匹配得到的位置为%d", i);注释了，没发现输入等待

可能你实现的算法有问题，进入死循环了

在每个scanf语句后去随便打印一些打印信息，就知道程序是停在哪里了


Question: 一个简单的问题：像这样的16进制数如何转换得到？

我哪里高高在上了？我自己写的例子就是用的 unsigned long long 你都没看见，然后又问用什么存储比较好。转成 float 是否可行我不敢确认，但如果第一个位是 F 的话，你确定能放得下？还不如用 long long。float 占 8 个字节，unsigned long long 也是 8 个字节，float 还要用来保存你根本用不着的小数位 0，小数存储也不如整数效率高。

引用 8 楼 SXJIAKE 的回复:方法很簡單，可是你連函數都不會獨立出來。基礎都不會，實在無語。 用 unsigned long long，如果你用 VS 也可以用 unsigned __int64。  什么函数不会独立出来？ 好像这个我还是会的，还有数据类型问题，我自己也弄清了，其实强转成实数(float)就可以了。不用什么long long了、这样就不怕溢出装不下了。  还是要感谢你的回帖，但是不要高高在上，谁都不是天生都是高手，菜鸟变身需要时间！

long long型可以，32位取值范围4294967296  先取出N=0X1212BE72>>8 然后取出其余的M=（0X1212BE72<<1）>>1

unsigned int a = 0X1212BE72; unsigned int b = ( a & 0xF0000000 ) >> 7; int c [100]; memset( c, 0, sizeof(c) ); int i = b; unsigned int d = a & 0x0FFFFFFF; while( d%10 > 0 ) {    c[b] = d%10;    d = d/10;   b++; } for( int i=b-1; i>0; i-- )     printf( "%d", c[i] );

引用 2 楼 user-5 的回复:移位啊  #include <stdio.h>  unsigned int conv(unsigned int x) {     unsigned int i, a, m, n;      a = x & 0x0FFFFFFF;     n = x >> 28;      m = 1;     for (i = 0; i < n; i++)     {         m = m * 10;     }      printf("0X%08X===>0X%08X*%u\n", x, a, m);      return (a * m); }  int main(int argc, char *argv[]) {     unsigned int x;      x = 0X1212BE72;     conv(x);     x = 0X2312BE8D;     conv(x);     x = 0X3511DDEC;;     conv(x);      return 0; }  你的程序是我想要的，可是还有一点，如果这个数这么转换后超过了unsigned int的范围了怎么输出呢？

#include <stdio.h> #include <stdlib.h> #include <math.h>  #ifndef _countof #define _countof(a) (sizeof(a)/sizeof(*(a))) #endif  int main(int argc, char *argv[]) {     unsigned long ularr[] = {         0x1212BE72,         0X2312BE8D,         0X3511DDEC     };     for (int i = 0; i < _countof(ularr); i++) {         unsigned long a = ularr[i] & 0x0FFFFFFFULL;         unsigned long n = pow(10, (ularr[i] >> 28) & 0xF);         unsigned long long ull = (unsigned long long)a * n;         printf("0x%08X => 0x%08X * %u (0x%016llX)\n", ularr[i], a, n, ull);     }     return 0; }


Question: 迷宫问题

这是我们高中时的计算机竞赛题。

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


Question: 如何自学C/c++

多看多练，没有什么捷径

看书的话可以看c++ primer。多动手敲代码，书上的例子和习题别看它简单，都要自己敲一遍。觉得看书无聊的话，可以用MFC做点小东西，培养自己的兴趣。

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

静下心来，踏踏实实动手、学习！！！

首先看自己是不是真的聪明，如果真的聪明直接看《C++程序设计语言（特别版）》

引用 5 楼 u012372684 的回复:眼过千遍不如手过一遍！ 书看千行不如手敲一行！  其实我还是很想知道赵四老师说的多用小脑是什么意思，和大脑有什么区别吗？  共勉，加油~！ 我感觉上OJ去AC题目也很不错啊~！ 小脑管动作，大脑管思维。

楼主现在这里问问题，就已经是在自学了

从<c primer plus>开始 眼过千遍不如手过一遍！ 书看千行不如手敲一行！

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

我不是成功人士 坐等成功人士的看法

我在看c primer plus英文版，第五版，推荐

共勉，现在在看c++ primer plus。

同为菜鸟，与君共勉。。。。 最怕的是问题无法解决，分数快用完了。。。