Question: 哪位大神帮个忙！c语言

引用 11 楼 zhao4zhong1 的回复:仅供参考//将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> 非常感谢

格式化你的输入，晚上再帮你看一下。还有，每次回复的时候最后单击“引用”，就是右下角那个，这样对方就知道你回复他了。

还有你知道为什么,上述程序成功将信息写入了进去,同时也能成功显示出来,但是打开文件,你依然会看到一堆没有意义是字符吗? 因为你malloc出来的空间,里面的内容是未定义的,你的SIZE=30,比如char name[SIZE];然而你写入的name也许就5个字符,然后还有25个字符的位置是没有定义的(内存中未定义的字符),在你写入文件的时候,都写进去了,然后打开文件就会看到一堆乱起八糟的东西.

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  #define SIZE 30 #define INFORMATION printf("number  name  gender  home  title  school  \n")   typedef struct teacher  { 	long number ; 	char name[SIZE]; 	char gender[SIZE]; 	char home[SIZE]; 	char title[SIZE]; 	char school[SIZE]; } Teacher ; typedef struct node  { 	Teacher item ; 	struct node*next ; } Node ; typedef Node*List ;    void InitializeList(List*Head); int Menu(void); void Add(List*Head); void ShowAll(void); void SearchMenu(List*Head); Node*FileToMemory(List*Head); void EmptyTheList(List*Head);    int main(void) { 	List head ; 	InitializeList(&head);  	while(1) 	{ 		int getchoose ; 		getchoose=Menu(); 		switch(getchoose) 		{ 		case 1 : 			system("cls"); 			Add(&head); 			break ; 		case 2 : 			system("cls"); 			ShowAll(); 			break ; 		case 3 : 			system("cls"); 			SearchMenu(&head); 			break ; 		case 4 : 			exit(0); 			break ; 		} 	} 	return 0 ; } void InitializeList(List*Head) { 	*Head=NULL ; } int Menu(void) { 	int choose ; 	do  	{ 		system("cls"); 		printf("************************************\n"); 		printf("         教师信息管理系统           \n"); 		printf("         1)添加教师信息             \n"); 		printf("         2)显示教师信息             \n"); 		printf("         3)查询                     \n"); 		printf("         4)退出                     \n"); 		printf("************************************\n"); 		fflush(stdin); 		printf("请选择:\n"); 		scanf("%d",&choose); 		if(choose!=1&&choose!=2&&choose!=3&&choose!=4) 		{ 			printf("您的输入错误，请重新输入！\n"); 		} 	} 	while(choose!=1&&choose!=2&&choose!=3&&choose!=4); 	return choose ; } void Add(List*Head) { 	int size=0 ; 	FILE*tea ; 	Node*add ; 	add=FileToMemory(Head); 	//add函数你根本可以不打印出这些内容来.否则你的show用来干嘛呢?-----建议而已,每个函数各司其职,这样能不乱掉 	if(add!=NULL) 	{ 		printf("%d %s %s %s %s %s \n",add->item.number,add->item.name, 			add->item.gender,add->item.home,add->item.title,add->item.school); 		add=add->next ; 		size++; 	} 	printf("%d\n",size); 	if((tea=fopen("teachers.txt","a+"))==NULL) 		printf("!!打开失败！"); 	rewind(tea);						//你要是用这个函数呢? 	printf("请输入教师信息\n"); 	while(size<2) 	{ 		add=(Node*)malloc(sizeof(Node)); 		if(add==NULL) 			exit(2); 		fflush(stdin); 		scanf("%d %s %s %s %s %s",&add->item.number,add->item.name, 			add->item.gender,add->item.home,add->item.title,add->item.school); 		fwrite(add,sizeof(Node),1,tea); 		printf("请再次输入：\n"); 		//add=add->next ;				//请问add->next后面是什么呢?你的add都没有后面什么也没有,这里应该将add释放掉. 		free(add); 		size++; 	} 	EmptyTheList(Head); 	fclose(tea); 	printf("输入信息成功!\n"); 	printf("请按任意键返回主菜单！\n"); 	getch(); } void ShowAll(void) { 	FILE*tea ; 	Node*first ; 	int size=0 ; 	tea=fopen("teachers.txt","r");				 	if(tea==NULL) 		printf("打开失败！\n"); 	else  	{ 		rewind(tea); 		INFORMATION ; 		while(size<2) 		{ 			first=(Node*)malloc(sizeof(Node)); 			fread(first,sizeof(Node),1,tea); 			printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 				first->item.gender,first->item.home,first->item.title,first->item.school); 			first=first->next ; 			size++; 		} 		printf("%d\n",size); 		fclose(tea); 		printf("所有教师信息读取成功!\n"); 	} 	printf("请按任意键返回主菜单!\n"); 	getch(); } void SearchMenu(List*Head) { 	system("cls"); 	printf("***********************************\n"); 	printf("         查询方式：                \n"); 	printf("         1)按教师号查询            \n"); 	printf("         2)按院系查询              \n"); 	printf("         3)按职称查询              \n"); 	printf("***********************************\n"); 	int choose,id,count=0 ; 	Node*first ; 	fflush(stdin); 	printf("请选择：\n"); 	scanf("%d",&choose); 	first=FileToMemory(Head); 	if(choose==1) 	{ 		fflush(stdin); 		printf("请输入你要查找教师的教师号：\n"); 		scanf("%d",&id); 		while(first!=NULL) 		{ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION ; 			if(id==first->item.number) 			{ 				printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 					first->item.gender,first->item.home,first->item.title,first->item.school); 				count++; 			} 			first=first->next ; 		} 		if(count==0) 			printf("没有找到您需要的信息！\n"); 	} 	else if(choose==2) 	{ 		char name[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s",name); 		while(first!=NULL) 		{ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION ; 			if(strcmp(name,first->item.name)==0) 			{ 				printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 					first->item.gender,first->item.home,first->item.title,first->item.school); 				count++; 			} 			first=first->next ; 		} 		if(count==0) 			printf("没有找到您需要的信息！\n"); 	} 	else if(choose==3) 	{ 		char title[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s",title); 		while(first!=NULL) 		{ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION ; 			if(strcmp(title,first->item.title)==0) 			{ 				printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 					first->item.gender,first->item.home,first->item.title,first->item.school); 				count++; 			} 			first=first->next ; 		} 		if(count==0) 			printf("没有找到您需要的信息！\n"); 	} 	else  		printf("您的输入错误！\n"); 	printf("请按任意键返回主菜单!\n"); 	getch(); } Node* FileToMemory(List*Head) { 	FILE *tea; 	Node *first = *Head; 	Node *pnew; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败!\n"); 	else if (getc(tea) == EOF) 		return *Head; 	else  	{ 		while (!feof(tea)) 		{ 			pnew = (Node*)malloc(sizeof(Node)); 			if (pnew == NULL) 			{ 				printf("申请内存失败！\n"); 				exit(1); 			} 			fread(pnew, sizeof(Node), 1, tea); 			printf("%d %s %s %s %s %s\n", pnew->item.number, pnew->item.name, 				pnew->item.gender, pnew->item.home, pnew->item.title, pnew->item.school); 			pnew->next = NULL; 			if (first == NULL)//开始时头为空，则将文件中读到的第一个信息的地址给头 			{ 				*Head = pnew; 			} 			else 			{ 				while (first->next != NULL)//之后往后面移 					first = first->next; 				first->next = pnew; 			} 		} 	} 	fclose(tea) ; 	return *Head; } 	void EmptyTheList(List*Head) 	{ 		Node *pt ; 		while(*Head!=NULL) 		{ 			pt=(*Head)->next ; 			free(*Head); 			*Head=pt ; 		} 	}  主菜单的1和2都没问题了.查询教师信息的你自己弄出来吧.

Node *FileToMemory(List * Head) { 	FILE *tea; 	Node *first = *Head; 	Node *pnew; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败!\n"); 	else if (getc(tea) == EOF) 		return *Head; 	else  	{ 		while (!feof(tea)) 		{ 			pnew = (Node*)malloc(sizeof(Node)); 			if (pnew == NULL) 			{ 				printf("申请内存失败！\n"); 				exit(1); 			} 			fread(pnew, sizeof(Node), 1, tea); 			printf("%d %s %s %s %s %s\n", pnew->item.number, pnew->item.name, 				pnew->item.gender, pnew->item.home, pnew->item.title, pnew->item.school); 			pnew->next = NULL; 			if (first == NULL)//开始时头为空，则将文件中读到的第一个信息的地址给头 			{ 				*Head = pnew; 			} 			else 			{ 				while (first->next != NULL)//之后往后面移 					first = first->next; 				first->next = pnew; 			} 		} 	} 	fclose(tea) ; 	return *Head; } 大哥，改了一下，那些没用的信息没了，但现在是返回的*Head不是指向第一个节点，而且读取之后显示有问题，数字显示不对，字符串首字母没了。麻烦再帮我看看！多谢了！！！

还没仔细看，但是能有大神给我这个新手这么仔细看，感觉非常感谢。这对新手帮助太大了！！！！

给你该动了一个函数,但是这是治标的,控制台显示读取文件出错.虽然没有报错,也没有崩溃,出现的问题,我在后面给你说一下. Node* FileToMemory(List*Head) { 	FILE *tea ;				//不要起一些随便的变量名！ 	Node *first=*Head ; 	// Node *new ;			//不要使用C++特有的关键字作为你的变量名字！ 	Node  *newTest; 	//tea=fopen("teachers.txt","r");	//当你往文件中写入信息的时候，应该使用W模式，或者W+模式.比如当你添加教师信息的时候也会用到进入到该函数,此时该模式会导致崩溃. 	tea = fopen("teachers.txt","w+"); 	if(tea==NULL) 		printf("打开失败!\n"); 	else					//使用大括号将if-else部分扩起来，否则谁知道你的范围是什么 	{ 		while(!feof(tea)) 		{ 			newTest=(Node*)malloc(sizeof(Node)); 			if(newTest==NULL) 			{ 				printf("申请内存失败！\n"); 				exit(1); 			} 			fread(newTest,sizeof(Node),1,tea); 			newTest->next=NULL ; 			if(first==NULL) 			{ 				*Head=newTest ; 			} 			else  			{ 				while(first->next!=NULL) 					first=first->next ; 				first->next=newTest ; 			} 		} 	} 	fclose(tea); 	return*Head ; } 你跟踪一下你的代码,你会发现在你选择了1之后,程序会执行到这个函数里面,假如我文件中没有任何数据的话,程序按照你的写法还是会去读文件的,此时就会导致读取的都是一堆没有用的数据,这些信息最终会让你看到控制台显示一堆的: -842150451 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯  1 请输入教师信息 .因此你这个函数应该分成两部分写,当增加教师信息的时候,仅仅向文件中写信息.读的时候,使用另一套逻辑(另外一个负责读的函数).这是最基本的问题. 其他的问题就是我在上面注释掉的那些. 还有一个需要注意的地方是:再去看看文件的操纵吧,把文本文件和二进制文件以及他们的读写模式搞懂.

引用 5 楼 baijiaheizhiganmao 的回复:亲，格式化一下你的代码如何？我的vim编辑器无法自动调整格式。#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  #define SIZE 30 #define INFORMATION printf("number  name  gender  home  title  school  \n")   typedef struct teacher  {     long number ;     char name[SIZE];     char gender[SIZE];     char home[SIZE];     char title[SIZE];     char school[SIZE]; } Teacher ; typedef struct node  {     Teacher item ;     struct node*next ; } Node ; typedef Node*List ;    void InitializeList(List*Head); int Menu(void); void Add(List*Head); void ShowAll(void); void SearchMenu(List*Head); Node*FileToMemory(List*Head); void EmptyTheList(List*Head);    int main(void) {     List head ;     InitializeList(&head);          while(1)     {         int getchoose ;         getchoose=Menu();         switch(getchoose)         {             case 1 :             system("cls");             Add(&head);             break ;             case 2 :             system("cls");             ShowAll();             break ;             case 3 :             system("cls");             SearchMenu(&head);             break ;             case 4 :             exit(0);             break ;         }     }     return 0 ; } void InitializeList(List*Head) {     *Head=NULL ; } int Menu(void) {     int choose ;     do      {         system("cls");         printf("************************************\n");         printf("         教师信息管理系统           \n");         printf("         1)添加教师信息             \n");         printf("         2)显示教师信息             \n");         printf("         3)查询                     \n");         printf("         4)退出                     \n");         printf("************************************\n");         fflush(stdin);         printf("请选择:\n");         scanf("%d",&choose);         if(choose!=1&&choose!=2&&choose!=3&&choose!=4)         {             printf("您的输入错误，请重新输入！\n");         }     }     while(choose!=1&&choose!=2&&choose!=3&&choose!=4);     return choose ; } void Add(List*Head) {     int size=0 ;     FILE*tea ;     Node*add ;     add=FileToMemory(Head);     if(add!=NULL)     {         printf("%d %s %s %s %s %s \n",add->item.number,add->item.name,         add->item.gender,add->item.home,add->item.title,add->item.school);         add=add->next ;         size++;     }     printf("%d\n",size);     if((tea=fopen("teachers.txt","a+"))==NULL)     printf("!!打开失败！");     rewind(tea);     printf("请输入教师信息\n");     while(size<2)     {         add=(Node*)malloc(sizeof(Node));         if(add==NULL)         exit(2);         fflush(stdin);         scanf("%d %s %s %s %s %s",&add->item.number,add->item.name,         add->item.gender,add->item.home,add->item.title,add->item.school);         fwrite(add,sizeof(Node),1,tea);         printf("请再次输入：\n");         add=add->next ;         size++;     }     EmptyTheList(Head);     fclose(tea);     printf("输入信息成功!\n");     printf("请按任意键返回主菜单！\n");     getch(); } void ShowAll(void) {     FILE*tea ;     Node*first ;     int size=0 ;     tea=fopen("teachers.txt","r");     if(tea==NULL)     printf("打开失败！\n");     else      {         rewind(tea);         INFORMATION ;         while(size<2)         {             first=(Node*)malloc(sizeof(Node));             fread(first,sizeof(Node),1,tea);             printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,             first->item.gender,first->item.home,first->item.title,first->item.school);             first=first->next ;             size++;         }         printf("%d\n",size);         fclose(tea);         printf("所有教师信息读取成功!\n");     }     printf("请按任意键返回主菜单!\n");     getch(); } void SearchMenu(List*Head) {     system("cls");     printf("***********************************\n");     printf("         查询方式：                \n");     printf("         1)按教师号查询            \n");     printf("         2)按院系查询              \n");     printf("         3)按职称查询              \n");     printf("***********************************\n");     int choose,id,count=0 ;     Node*first ;     fflush(stdin);     printf("请选择：\n");     scanf("%d",&choose);     first=FileToMemory(Head);     if(choose==1)     {         fflush(stdin);         printf("请输入你要查找教师的教师号：\n");         scanf("%d",&id);         while(first!=NULL)         {             printf("下面是您要查找的教师信息：\n");             INFORMATION ;             if(id==first->item.number)             {                 printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,                 first->item.gender,first->item.home,first->item.title,first->item.school);                 count++;             }             first=first->next ;         }         if(count==0)         printf("没有找到您需要的信息！\n");     }     else if(choose==2)     {         char name[SIZE];         fflush(stdin);         printf("请输入你要查找教师的名字：\n");         scanf("%s",name);         while(first!=NULL)         {             printf("下面是您要查找的教师信息：\n");             INFORMATION ;             if(strcmp(name,first->item.name)==0)             {                 printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,                 first->item.gender,first->item.home,first->item.title,first->item.school);                 count++;             }             first=first->next ;         }         if(count==0)         printf("没有找到您需要的信息！\n");     }     else if(choose==3)     {         char title[SIZE];         fflush(stdin);         printf("请输入你要查找教师的名字：\n");         scanf("%s",title);         while(first!=NULL)         {             printf("下面是您要查找的教师信息：\n");             INFORMATION ;             if(strcmp(title,first->item.title)==0)             {                 printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,                 first->item.gender,first->item.home,first->item.title,first->item.school);                 count++;             }             first=first->next ;         }         if(count==0)         printf("没有找到您需要的信息！\n");     }     else      printf("您的输入错误！\n");     printf("请按任意键返回主菜单!\n");     getch(); } Node*FileToMemory(List*Head) {     FILE*tea ;     Node*first=*Head ;     Node*new ;     tea=fopen("teachers.txt","r");     if(tea==NULL)     printf("打开失败!\n");     else      while(!feof(tea))     {         new=(Node*)malloc(sizeof(Node));         if(new==NULL)         {             printf("申请内存失败！\n");             exit(1);         }         fread(new,sizeof(Node),1,tea);         new->next=NULL ;         if(first==NULL)         {             *Head=new ;         }         else          {             while(first->next!=NULL)             first=first->next ;             first->next=new ;         }     }     fclose(tea);     return*Head ; } void EmptyTheList(List*Head) {     Node*pt ;     while(*Head!=NULL)     {         pt=(*Head)->next ;         free(*Head);         *Head=pt ;     } }

亲，格式化一下你的代码如何？我的vim编辑器无法自动调整格式。

new是C++的。

格式有什么问题吗？还有new是C++的关键字，不是c的关键字啊

new 是 C 语言的关键字吗？ 我怎么不知道呀？

引用 楼主 yjaal 的回复:我学c语言不太好，对指针和文件这块弄不太懂，所以就想用链表编一个那种信息管理程序练练手。可是编出来总是出问题。程序可能有点长，问题也很多，看起来也挺麻烦的，可是我没有谁可以问。哪位大神能帮我看看？帮我这个菜鸟度过指针这个南关啊！！！程序如下： #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  #define SIZE 30 #define INFORMATION printf("number  name  gender  home  title  school  \n")   typedef struct teacher{ 	long number; 	char name[SIZE]; 	char gender[SIZE]; 	char home[SIZE]; 	char title[SIZE]; 	char school[SIZE]; }Teacher; typedef struct node{ 	Teacher item; 	struct node *next; }Node; typedef Node *List;    void InitializeList(List *Head); int Menu(void); void Add(List *Head); void ShowAll(void); void SearchMenu(List * Head); Node *FileToMemory(List * Head); void EmptyTheList(List *Head);    int main(void) { 	List head; 	InitializeList(&head);  	while (1){ 		int getchoose; 		getchoose = Menu(); 		switch (getchoose){ 		case 1: 			system("cls"); 			Add(&head); 			break; 		case 2: 			system("cls"); 			ShowAll(); 			break; 		case 3: 			system("cls"); 			SearchMenu(&head); 			break; 		case 4: 			exit(0); 			break; 		} 	} 	return 0; } void InitializeList(List *Head) { 	*Head = NULL; } int Menu(void) { 	int choose; 	do{ 		system("cls"); 		printf("************************************\n"); 		printf("         教师信息管理系统           \n"); 		printf("         1)添加教师信息             \n"); 		printf("         2)显示教师信息             \n"); 		printf("         3)查询                     \n"); 		printf("         4)退出                     \n"); 		printf("************************************\n"); 		fflush(stdin); 		printf("请选择:\n"); 		scanf("%d", &choose); 		if (choose != 1 && choose != 2 && choose != 3 && choose != 4){ 			printf("您的输入错误，请重新输入！\n"); 		} 	} while (choose != 1 && choose != 2 && choose != 3 && choose != 4); 	return choose; } void Add(List *Head) { 	int size = 0; 	FILE *tea; 	Node *add; 	add = FileToMemory(Head); 	if (add != NULL) 	{ 		printf("%d %s %s %s %s %s \n", add->item.number, add->item.name, 			add->item.gender, add->item.home, add->item.title, add->item.school); 		add = add->next; 		size++; 	} 	printf("%d\n", size); 	if ((tea = fopen("teachers.txt", "a+")) == NULL) 		printf("!!打开失败！"); 	rewind(tea); 	printf("请输入教师信息\n"); 	while (size<2){ 		add = (Node*)malloc(sizeof(Node)); 		if (add == NULL) 			exit(2); 		fflush(stdin); 		scanf("%d %s %s %s %s %s", &add->item.number, add->item.name, 			add->item.gender, add->item.home, add->item.title, add->item.school); 		fwrite(add, sizeof(Node), 1, tea); 		printf("请再次输入：\n"); 		add = add->next; 		size++; 	} 	EmptyTheList(Head); 	fclose(tea); 	printf("输入信息成功!\n"); 	printf("请按任意键返回主菜单！\n"); 	getch(); } void ShowAll(void) { 	FILE *tea; 	Node *first; 	int size = 0; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败！\n"); 	else{ 		rewind(tea); 		INFORMATION; 		while (size<2){ 			first = (Node*)malloc(sizeof(Node)); 			fread(first, sizeof(Node), 1, tea); 			printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 				first->item.gender, first->item.home, first->item.title, first->item.school); 			first = first->next; 			size++; 		} 		printf("%d\n", size); 		fclose(tea); 		printf("所有教师信息读取成功!\n"); 	} 	printf("请按任意键返回主菜单!\n"); 	getch(); } void SearchMenu(List * Head) { 	system("cls"); 	printf("***********************************\n"); 	printf("         查询方式：                \n"); 	printf("         1)按教师号查询            \n"); 	printf("         2)按院系查询              \n"); 	printf("         3)按职称查询              \n"); 	printf("***********************************\n"); 	int choose, id, count = 0; 	Node *first; 	fflush(stdin); 	printf("请选择：\n"); 	scanf("%d", &choose); 	first = FileToMemory(Head); 	if (choose == 1) 	{ 		fflush(stdin); 		printf("请输入你要查找教师的教师号：\n"); 		scanf("%d", &id); 		while (first != NULL){ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION; 			if (id == first->item.number){ 				printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 					first->item.gender, first->item.home, first->item.title, first->item.school); 				count++; 			} 			first = first->next; 		} 		if (count == 0) 			printf("没有找到您需要的信息！\n"); 	} 	else if (choose == 2) 	{ 		char name[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s", name); 		while (first != NULL){ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION; 			if (strcmp(name, first->item.name) == 0){ 				printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 					first->item.gender, first->item.home, first->item.title, first->item.school); 				count++; 			} 			first = first->next; 		} 		if (count == 0) 			printf("没有找到您需要的信息！\n"); 	} 	else if (choose == 3) 	{ 		char title[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s", title); 		while (first != NULL){ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION; 			if (strcmp(title, first->item.title) == 0){ 				printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 					first->item.gender, first->item.home, first->item.title, first->item.school); 				count++; 			} 			first = first->next; 		} 		if (count == 0) 			printf("没有找到您需要的信息！\n"); 	} 	else 		printf("您的输入错误！\n"); 	printf("请按任意键返回主菜单!\n"); 	getch(); } Node *FileToMemory(List * Head) { 	FILE *tea; 	Node *first = *Head; 	Node *new; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败!\n"); 	else 		while (!feof(tea)){ 		new = (Node*)malloc(sizeof(Node)); 		if (new == NULL){ 			printf("申请内存失败！\n"); 			exit(1); 		} 		fread(new, sizeof(Node), 1, tea); 		new->next = NULL; 		if (first == NULL) 		{ 			*Head = new; 		} 		else{ 			while (first->next != NULL) 				first = first->next; 			first->next = new; 		} 		} 	fclose(tea); 	return *Head; } void EmptyTheList(List *Head) { 	Node *pt; 	while (*Head != NULL) 	{ 		pt = (*Head)->next; 		free(*Head); 		*Head = pt; 	} }  1.首先 不要使用关键字作为变量 ，new是c语言的关键字所以你的改成其他的名字。然后就没问题了 2上传代码是要注意格式不然没人愿意看，太费事了。


Question: 用java 或 C 语言一个算法问题

QQ 452760135


Question: 求二值图像中不规则图形的重心！

你好，楼主问题有进展了吗？

http://blog.csdn.net/z397164725/article/details/8426109  求中心距。 平均的那种是中心，不一定是重心。

引用 1 楼 user-3 的回复:首先得把图形挖出来， 大概方法 1. 取到第一个黑点， 然后把和它联通的区域都找出来  然后把这些点的坐标 加起来 取平均， 多谢 ，抠出来不是问题，我已经做好了，黑色点的像素坐标我也得到了，主要就是不知道怎么计算重心，直接相加求平均就可以么？


Question: 有大神能帮忙吗，老师让作的实验，关于线性表！！！！

这个数据结构的教科书都有的，只是伪代码

引用 1 楼 user-6 的回复:绝不向伸手党妥协！ 第一次听说有这个党

这个还是自己想下, 这是最基本的动手能力, 大学一定要学这个, 不然以后肯定会后悔的

我c语言学的很不好  感觉是定义两个数组,然后根据条件, 自己求出a交b a并b 和a-b(感觉用a- a交b号点)  我就能想到这么多

这么简单的问题还用自己设计算法？STL有现成的： #include <algorithm> 将输入数据存到数组中 先将集合排序：sort(beg,end) 并集：set_union(beg1,end1,beg2,end2,destBeg) 交集：set_intersection(beg1,end1,beg2,end2,destBeg) 差集：set_difference(beg1,end1,beg2,end2,destBeg)

百度一下，大题思路是说了没用

绝不向伸手党妥协！


Question: 求助：ffmpeg mp4视频添加滤镜

LZ，请教一个问题，怎么实现FFMPEG给视频加滤镜呢？谢谢


Question: 如何删除一段文字特定区间内的文字

你是只要删除【你好】和【】？还是凡是带【】的都删除？

可是试一下正则表达式~！

/**  * @brief   如何删除一段文字特定区间内的文字  * http://bbs.csdn.net/topics/390923421  */  #include <stdio.h> #include <string.h>  char * strdel(char *str, const char *del) {     size_t dellen, movelen;     char *ptr;      ptr = strstr(str, del);     if (ptr != NULL) {         dellen = strlen(del);         movelen = strlen(ptr + dellen);         memmove(ptr, ptr + dellen, movelen + 1);     }      return str; }  int main(int argc, char *argv[]) {     char s[] = "你好啊【你好】论坛地力【】喜剧之王";      printf("%s\n", strdel(s, "【你好】"));     printf("%s\n", strdel(s, "【】"));      return 0; }  /* 输出为 你好啊论坛地力【】喜剧之王 你好啊论坛地力喜剧之王 */

需求不是特别明确，那如果遇到这样的情况怎么删除呢：  “你好【啊【你好】论坛地力【】喜】剧【之王”   这样 “【”和“】”不是完全匹配的时候，该怎么删呢？


Question: 面试题，外包公司让我去中兴的面试题，一共5题还记得2题！！求意见

别去外包，过来人忠告

算是自己理解的一个面试题。

引用 2 楼 xihu1364 的回复:错位了 a[0]没赋到值   a[5] = 4 越界了 引用 1 楼 user-3 的回复:原题中，当进行最后一次循环的时候，p++执行后，p就越界了。 这个题我会了，求指导第二个题http://bbs.csdn.net/topics/390923394

错位了 a[0]没赋到值   a[5] = 4 越界了

原题中，当进行最后一次循环的时候，p++执行后，p就越界了。


Question: 新人求教 学习C语言应该从什么开始呢？

引用 3 楼 u012421456 的回复:参考一下——http://blog.csdn.net/u012421456/article/details/40681247 一般来说看书比较好，对知识的掌握较好，但在入门时，如果觉得自己很难入门，可以看看基础性的视频，编译器，现在有些不错的，如code::blocks、c-free、devc++等，都可以的 刚刚看了这篇文章，感觉写的很好，谢谢哈

不知道怎么一一回复大家，只好在下面写评论了，谢谢大家的帮忙！

其实我大学的时候学过谭浩强那本书，自己对c语言的认识应该只是皮毛的，基本的语法还是认识的。但是现在呢，看视频感觉看不下去，有点啰嗦。看书感觉抓不住重点。。。

C语言入门，如楼上所说，用谭浩强的C语言程序教材 就可以了。网上有专门的学习网站：C语言中文网 效果不错。也可以在网上下载电子书和视频看。视频讲解比较生动易懂，但学习速度慢；电子书，比较枯燥，如果耐力比较好会学得快些。 建议你多找一些实例，敲敲代码。比如上面给你列出的那个网站，上面的实例就很不错。不过，要想学好C，靠那点实例代码是不够的。这就需要你有强大的动力和持久的毅力了！ 至于编译器，刚入门，建议你用Visual C++6.0，经典、入门快、效率高！这是在Windows操作系统下用的编译器。等你学牛X了，可以尝试学学Linux，Linux下的编译器我也没用过，好像是gcc. 我现在也在学C语言的过程中。愿我们一起努力，在软件开发这条路上能实现自己的梦想！ //记得给分哦！

看代码，多动手。。

从hello world开始。 用visual studio编译器。 看书，比如《C primer plus》，不要看视频。  多敲代码，少提问。

我虽然大学时候学了c, 但是只是知道点皮毛 这个要看你自己的情况, 你要是有其他语言的基础, 语法部分直接翻翻 过了,看下指针和数组,结构体 没有其他语言基础, 没接触过编程的, 还是慢慢看吧   这个自学的话 还是看书吧, 不会的直接百度, 书就用谭浩强的c语言就行 网上有pdf的能下载   这是我的个人感觉, 希望能帮到你

看视频没鸟用 看完就忘 看书吧 看c primer plus ，一边看书一边写程序， 动手才能学得快，记得住，看视频 就像看电影一样，看完就忘

我不喜欢看视频，感觉太墨迹了

The C Programming Language+gcc+vim/emacs+gdb

一个适合自己的编辑器 一个适合自己的编译器 一本适合自己的书  但在这之前，请学会搜索。

谭浩强C教材，从头到尾先看一遍，书上的例子、课后题都要实际上级实现 第一遍语法熟悉了就成，先入门再说 可以使用VC++6.0编译器

如果觉得自己理解力没什么问题，那么就The C Programming Language。不然，国内的大学教材

看书看视频都可以《c primer plus》

看书，理解<我认为比较重要>，写代码<也很重要，只理解不写还是不行>，看代码，在写代码。

k&R初学足够了。其他都是浮云！

共同努力吧，我现在也在学。


Question: 求救！linux 文件操作 read函数为什么总是读不出数据，哪里出错了

没错，头脑发昏，只写看成读写了，多谢版主

用 O_WRONLY会有什么问题吗

if((fd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR))<0){ ===> if((fd = open(filename, O_RDWR     | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR))<0){


Question: 在父子进程间使用共享内存(共享内容含指针)

《Windows核心编程》

引用 12 楼 u012889234 的回复:[quote=引用 10 楼 wangzuxi 的回复:] [quote=引用 9 楼 u012889234 的回复:] 如果我现在要创建8个子进程，每个子进程与父进程之间有一个共享区域。要做到它们相互隔离。这=这样会不会有问题？ 我推荐你还是在父进程mmap一块匿名共享内存，然后fork出子进程，这样子进程也可以共享父进程创建的共享内存，而且指针也一样，可以把共享内存中的指针保存到共享内存中。 [/quote] 我试了这种方法，，跟原来的效果是一样的。。我这个指向数据包的指针(tEthpkt *)是由驱动传上来的。  static int vsmart6_func(pid_t pid) {     int index, vindex;     for(index = 0; index < MAX_SHARED_CNT; index++)     {         if(PktQue[index] != NULL && PktQue[index]->pid == pid)         {             printf("pid: %d\n", PktQue[index]->pid);             vindex = index;             break;         }     } ////////////////////////////////////////////////////////////////////// //开始处理对应的数据包队列中的数据包     proc_pkt_out_vs(PktQue[vindex]);      return 0; }   int vsmart6_create() {     int index, sindex, pindex;     pid_t pid;     pid_t cpid;          if(cur_vsmart6_cnt >= MAX_VSMART6_CNT)     {         printf("\n******VSmart6 has reached its limit!\n");         return -1;     }      for(index = 0; index < MAX_SHARED_CNT; index++)     {         if(PktQue[index] == NULL)         {             sindex = index;             break;         }     }      PktQue[sindex] = (tPktQue *)mmap(NULL, sizeof(tPktQue), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); //初始化     pid = fork();     if(pid == 0)  //子进程     {         sleep(2);  //等待父进程对共享区域初始化完成         cpid = getpid();         vsmart6_func(cpid);     }     PktQue[sindex]->pid = pid;                        //init mutex      PktQue[sindex]->V6_out_mutex = (tMutex *)mutex_create();      PktQue[sindex]->V4_out_mutex = (tMutex *)mutex_create();      PktQue[sindex]->V4_in_mutex  = (tMutex *)mutex_create();      PktQue[sindex]->V6_in_mutex  = (tMutex *)mutex_create();             //init para      PktQue[sindex]->V6_out_curcnt = 0;      PktQue[sindex]->V6_out_head   = 0;      PktQue[sindex]->V6_out_tail   = 0;       PktQue[sindex]->V4_out_curcnt = 0;      PktQue[sindex]->V4_out_head   = 0;      PktQue[sindex]->V4_out_tail   = 0;       PktQue[sindex]->V4_in_curcnt  = 0;      PktQue[sindex]->V4_in_head    = 0;      PktQue[sindex]->V4_in_tail    = 0;       PktQue[sindex]->V6_in_curcnt  = 0;      PktQue[sindex]->V6_in_head    = 0;      PktQue[sindex]->V6_in_tail    = 0;       //init package     for(pindex = 0; pindex < MAX_QUE_SIZE; pindex++)     {          PktQue[sindex]->V6_out_queue[pindex] = NULL;          PktQue[sindex]->V4_out_queue[pindex] = NULL;          PktQue[sindex]->V4_in_queue[pindex]  = NULL;          PktQue[sindex]->V6_in_queue[pindex]  = NULL;     }  //////////////////////////////////////////////////////////////////////////// //在相应的MyVsmart6中更新配置   for test #if 1         char name[16] = "test";         memcpy(MyVsmart6[sindex].name, name, strlen(name));         MyVsmart6[sindex].pid = pid;         MyVsmart6[sindex].prefA_count = 1;         MyVsmart6[sindex].PrefA_Len[0] = 6; /*-48/8-*/         inet_pton(AF_INET6, "2001:da8:b001::", (char *)(MyVsmart6[sindex].prefA[0]));         MyVsmart6[sindex].prefA_nat_start = gn_htonl(inet_addr("10.8.10.132"));         MyVsmart6[sindex].prefA_nat_end   = gn_htonl(inet_addr("10.8.10.133"));         MyVsmart6[sindex].prefA_natipcnt = MyVsmart6[sindex].prefA_nat_end - MyVsmart6[sindex].prefA_nat_start + 1; #endif ////////////////////////////////////////////////////////////////////////////      return 0; }   void proc_pkt_out_vs(tPktQue * pPktQue) {     UINT4   head;     UINT4   tail;     tEthpkt *  pkthdr = NULL;      while(1)     {         mutex_lock(pPktQue->V6_out_mutex);         head = pPktQue->V6_out_head;         tail = pPktQue->V6_out_tail;         if(head == tail)         {             mutex_unlock(pPktQue->V6_out_mutex);             //printf("\n****V6_out_queue is Empty!\n");             continue;         }          printf("head: %d, tail: %d\n", head, tail);         pkthdr = pPktQue->V6_out_queue[head];          printf("after: %p\n", pkthdr); #if 0         printf("IP: %x:%x:%x:%x--------->%x:%x:%x:%x\n", \             gn_ntohl(pkthdr->pIpv6->src1[0]), gn_ntohl(pkthdr->pIpv6->src1[1]), \             gn_ntohl(pkthdr->pIpv6->src1[2]), gn_ntohl(pkthdr->pIpv6->src1[3]), \             gn_ntohl(pkthdr->pIpv6->dest1[0]), gn_ntohl(pkthdr->pIpv6->dest1[1]), \             gn_ntohl(pkthdr->pIpv6->dest1[2]), gn_ntohl(pkthdr->pIpv6->dest1[3])); #endif                     pPktQue->V6_out_head = (head + 1) % MAX_QUE_SIZE;         mutex_unlock(pPktQue->V6_out_mutex);         //usleep(100);         sleep(2);        }    }   /* before: 0x7f10fec8e060 head: 0, tail: 1 after: 0x7f10fec8e060  before: 0x7f10fec8e060 head: 1, tail: 2 after: 0x7f10fec8e060  before: 0x7f10fec8e060 head: 2, tail: 3 after: 0x7f10fec8e060  before: 0x7f10fec8e060 head: 3, tail: 4 after: 0x7f10fec8e060  */ [/quote] 你每次从队列中取出来的指针都一样，你的驱动收数据包入队列是在哪里做的，看看入队列是不是这样入的。而且这个指针(tEthpkt *)也要保证每个进程都一样并能访问，这样放到共享内存才有意义。

引用 10 楼 wangzuxi 的回复:[quote=引用 9 楼 u012889234 的回复:] 如果我现在要创建8个子进程，每个子进程与父进程之间有一个共享区域。要做到它们相互隔离。这=这样会不会有问题？ 我推荐你还是在父进程mmap一块匿名共享内存，然后fork出子进程，这样子进程也可以共享父进程创建的共享内存，而且指针也一样，可以把共享内存中的指针保存到共享内存中。 [/quote] 我试了这种方法，，跟原来的效果是一样的。。我这个指向数据包的指针(tEthpkt *)是由驱动传上来的。  static int vsmart6_func(pid_t pid) {     int index, vindex;     for(index = 0; index < MAX_SHARED_CNT; index++)     {         if(PktQue[index] != NULL && PktQue[index]->pid == pid)         {             printf("pid: %d\n", PktQue[index]->pid);             vindex = index;             break;         }     } ////////////////////////////////////////////////////////////////////// //开始处理对应的数据包队列中的数据包     proc_pkt_out_vs(PktQue[vindex]);      return 0; }   int vsmart6_create() {     int index, sindex, pindex;     pid_t pid;     pid_t cpid;          if(cur_vsmart6_cnt >= MAX_VSMART6_CNT)     {         printf("\n******VSmart6 has reached its limit!\n");         return -1;     }      for(index = 0; index < MAX_SHARED_CNT; index++)     {         if(PktQue[index] == NULL)         {             sindex = index;             break;         }     }      PktQue[sindex] = (tPktQue *)mmap(NULL, sizeof(tPktQue), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); //初始化     pid = fork();     if(pid == 0)  //子进程     {         sleep(2);  //等待父进程对共享区域初始化完成         cpid = getpid();         vsmart6_func(cpid);     }     PktQue[sindex]->pid = pid;                        //init mutex      PktQue[sindex]->V6_out_mutex = (tMutex *)mutex_create();      PktQue[sindex]->V4_out_mutex = (tMutex *)mutex_create();      PktQue[sindex]->V4_in_mutex  = (tMutex *)mutex_create();      PktQue[sindex]->V6_in_mutex  = (tMutex *)mutex_create();             //init para      PktQue[sindex]->V6_out_curcnt = 0;      PktQue[sindex]->V6_out_head   = 0;      PktQue[sindex]->V6_out_tail   = 0;       PktQue[sindex]->V4_out_curcnt = 0;      PktQue[sindex]->V4_out_head   = 0;      PktQue[sindex]->V4_out_tail   = 0;       PktQue[sindex]->V4_in_curcnt  = 0;      PktQue[sindex]->V4_in_head    = 0;      PktQue[sindex]->V4_in_tail    = 0;       PktQue[sindex]->V6_in_curcnt  = 0;      PktQue[sindex]->V6_in_head    = 0;      PktQue[sindex]->V6_in_tail    = 0;       //init package     for(pindex = 0; pindex < MAX_QUE_SIZE; pindex++)     {          PktQue[sindex]->V6_out_queue[pindex] = NULL;          PktQue[sindex]->V4_out_queue[pindex] = NULL;          PktQue[sindex]->V4_in_queue[pindex]  = NULL;          PktQue[sindex]->V6_in_queue[pindex]  = NULL;     }  //////////////////////////////////////////////////////////////////////////// //在相应的MyVsmart6中更新配置   for test #if 1         char name[16] = "test";         memcpy(MyVsmart6[sindex].name, name, strlen(name));         MyVsmart6[sindex].pid = pid;         MyVsmart6[sindex].prefA_count = 1;         MyVsmart6[sindex].PrefA_Len[0] = 6; /*-48/8-*/         inet_pton(AF_INET6, "2001:da8:b001::", (char *)(MyVsmart6[sindex].prefA[0]));         MyVsmart6[sindex].prefA_nat_start = gn_htonl(inet_addr("10.8.10.132"));         MyVsmart6[sindex].prefA_nat_end   = gn_htonl(inet_addr("10.8.10.133"));         MyVsmart6[sindex].prefA_natipcnt = MyVsmart6[sindex].prefA_nat_end - MyVsmart6[sindex].prefA_nat_start + 1; #endif ////////////////////////////////////////////////////////////////////////////      return 0; }   void proc_pkt_out_vs(tPktQue * pPktQue) {     UINT4   head;     UINT4   tail;     tEthpkt *  pkthdr = NULL;      while(1)     {         mutex_lock(pPktQue->V6_out_mutex);         head = pPktQue->V6_out_head;         tail = pPktQue->V6_out_tail;         if(head == tail)         {             mutex_unlock(pPktQue->V6_out_mutex);             //printf("\n****V6_out_queue is Empty!\n");             continue;         }          printf("head: %d, tail: %d\n", head, tail);         pkthdr = pPktQue->V6_out_queue[head];          printf("after: %p\n", pkthdr); #if 0         printf("IP: %x:%x:%x:%x--------->%x:%x:%x:%x\n", \             gn_ntohl(pkthdr->pIpv6->src1[0]), gn_ntohl(pkthdr->pIpv6->src1[1]), \             gn_ntohl(pkthdr->pIpv6->src1[2]), gn_ntohl(pkthdr->pIpv6->src1[3]), \             gn_ntohl(pkthdr->pIpv6->dest1[0]), gn_ntohl(pkthdr->pIpv6->dest1[1]), \             gn_ntohl(pkthdr->pIpv6->dest1[2]), gn_ntohl(pkthdr->pIpv6->dest1[3])); #endif                     pPktQue->V6_out_head = (head + 1) % MAX_QUE_SIZE;         mutex_unlock(pPktQue->V6_out_mutex);         //usleep(100);         sleep(2);        }    }   /* before: 0x7f10fec8e060 head: 0, tail: 1 after: 0x7f10fec8e060  before: 0x7f10fec8e060 head: 1, tail: 2 after: 0x7f10fec8e060  before: 0x7f10fec8e060 head: 2, tail: 3 after: 0x7f10fec8e060  before: 0x7f10fec8e060 head: 3, tail: 4 after: 0x7f10fec8e060  */

引用 10 楼 wangzuxi 的回复:[quote=引用 9 楼 u012889234 的回复:] 如果我现在要创建8个子进程，每个子进程与父进程之间有一个共享区域。要做到它们相互隔离。这=这样会不会有问题？ 我推荐你还是在父进程mmap一块匿名共享内存，然后fork出子进程，这样子进程也可以共享父进程创建的共享内存，而且指针也一样，可以把共享内存中的指针保存到共享内存中。 [/quote]  嗯，， 我都做下实验。

引用 9 楼 u012889234 的回复:如果我现在要创建8个子进程，每个子进程与父进程之间有一个共享区域。要做到它们相互隔离。这=这样会不会有问题？ 我推荐你还是在父进程mmap一块匿名共享内存，然后fork出子进程，这样子进程也可以共享父进程创建的共享内存，而且指针也一样，可以把共享内存中的指针保存到共享内存中。

CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES;  这些参数就指定共享地址空间。就不用共享了！！！

引用 6 楼 wangzuxi 的回复:[quote=引用 3 楼 u012889234 的回复:] [quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u012889234 的回复:] 比如有这样一个结构体   #define MAX_QUE_LEN 100  //定义数据包缓存队列 typedef struct _t_pkt_queue {     UINT4       V6_out_head;     UINT4       V6_out_tail;     UINT4       V6_out_curcnt;     tEthpkt *   V6_out_queue[MAX_QUE_LEN]; }tPktQue;  tEthpkt  *  是指向一个数据包的指针。 在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空，但是为什么不能对其进行操作？ Linux下在父进程用mmap创建匿名共享内存，共享内存的地址在父进程和子进程是一样的，父子进程都可以直接修改共享内存中的数据。 你说的子进程不能对其进行操作是什么意思？是取不到想要的数据还是修改了数据父进程看不见？ 你是怎么创建共享内存的？[/quote]    shmid = shmget(IPC_PRIVATE, sizeof(tPktQue), IPC_CREAT|0660);     if(shmid <= 0)     {         printf("\n***Create a shared memory Fail!\n");         return -1;     }     stacksize = getpagesize();     stack = malloc(stacksize);     if(stack == NULL)     {         printf("\n***Malloc For Child Process stack Failed!\n");         return -1;     }     childstack = stack + stacksize;     flags = CLONE_NEWPID|CLONE_NEWNS;     pid = clone(vdev_func, childstack, flags, (void *)shmid);     shmaddr = (char *)shmat(shmid, NULL, 0);     PktQue[i] = (tPktQue *)shmaddr;   //这里PktQue[i] 是一个指向tPktQue  的指针。   vdev_func子进程的调用函数。 在子进程中  shmaddr = (char *)shmat(shmid, NULL, 0); PktQue[i] = (tPktQue *)shmaddr;  比如对 PktQue[i] ->V6_out_queue[0]操作。操作不了。但其不为空。[/quote] 你都用clone了，可以不用shmget和shmat了。看一下我写的测试代码：  #define _GNU_SOURCE #include <sched.h>  #include <stdio.h> #include <stdlib.h> #include <unistd.h>  int data = 10; char *str = NULL;  int child_process(void *args) {     printf("Child process %d, data %d, str: %s\n", getpid(), data, str);     data = 20;     str = "child str";     printf("Child process %d, data %d, str: %s\n", getpid(), data, str);     while (1) {         sleep(1);     } }  int main(int argc, char *argv[]) {     void *stack = (void *)malloc(16384);     int clone_flag = CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES;     str = "parent str";          clone(child_process, stack+16384, clone_flag, NULL);     printf("Parent process %d, data %d, str: %s\n", getpid(), data, str);     sleep(1);     while (1) {         sleep(1);     }      return 0; }  运行后输出： Child process 4517, data 10, str: parent str Child process 4517, data 20, str: child str Parent process 4516, data 20, str: child str [/quote] 错了，sleep(1)是让子进程先运行再打印，应该在第29行printf之前：  #define _GNU_SOURCE #include <sched.h>   #include <stdio.h> #include <stdlib.h> #include <unistd.h>   int data = 10; char *str = NULL;   int child_process(void *args) {     printf("Child process %d, data %d, str: %s\n", getpid(), data, str);     data = 20;     str = "child str";     printf("Child process %d, data %d, str: %s\n", getpid(), data, str);     while (1) {         sleep(1);     } }   int main(int argc, char *argv[]) {     void *stack = (void *)malloc(16384);     int clone_flag = CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES;     str = "parent str";           clone(child_process, stack+16384, clone_flag, NULL);     sleep(1);     printf("Parent process %d, data %d, str: %s\n", getpid(), data, str);     while (1) {         sleep(1);     }       return 0; }

引用 3 楼 u012889234 的回复:[quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u012889234 的回复:] 比如有这样一个结构体   #define MAX_QUE_LEN 100  //定义数据包缓存队列 typedef struct _t_pkt_queue {     UINT4       V6_out_head;     UINT4       V6_out_tail;     UINT4       V6_out_curcnt;     tEthpkt *   V6_out_queue[MAX_QUE_LEN]; }tPktQue;  tEthpkt  *  是指向一个数据包的指针。 在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空，但是为什么不能对其进行操作？ Linux下在父进程用mmap创建匿名共享内存，共享内存的地址在父进程和子进程是一样的，父子进程都可以直接修改共享内存中的数据。 你说的子进程不能对其进行操作是什么意思？是取不到想要的数据还是修改了数据父进程看不见？ 你是怎么创建共享内存的？[/quote]    shmid = shmget(IPC_PRIVATE, sizeof(tPktQue), IPC_CREAT|0660);     if(shmid <= 0)     {         printf("\n***Create a shared memory Fail!\n");         return -1;     }     stacksize = getpagesize();     stack = malloc(stacksize);     if(stack == NULL)     {         printf("\n***Malloc For Child Process stack Failed!\n");         return -1;     }     childstack = stack + stacksize;     flags = CLONE_NEWPID|CLONE_NEWNS;     pid = clone(vdev_func, childstack, flags, (void *)shmid);     shmaddr = (char *)shmat(shmid, NULL, 0);     PktQue[i] = (tPktQue *)shmaddr;   //这里PktQue[i] 是一个指向tPktQue  的指针。   vdev_func子进程的调用函数。 在子进程中  shmaddr = (char *)shmat(shmid, NULL, 0); PktQue[i] = (tPktQue *)shmaddr;  比如对 PktQue[i] ->V6_out_queue[0]操作。操作不了。但其不为空。[/quote] 你都用clone了，可以不用shmget和shmat了。看一下我写的测试代码：  #define _GNU_SOURCE #include <sched.h>  #include <stdio.h> #include <stdlib.h> #include <unistd.h>  int data = 10; char *str = NULL;  int child_process(void *args) {     printf("Child process %d, data %d, str: %s\n", getpid(), data, str);     data = 20;     str = "child str";     printf("Child process %d, data %d, str: %s\n", getpid(), data, str);     while (1) {         sleep(1);     } }  int main(int argc, char *argv[]) {     void *stack = (void *)malloc(16384);     int clone_flag = CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES;     str = "parent str";          clone(child_process, stack+16384, clone_flag, NULL);     printf("Parent process %d, data %d, str: %s\n", getpid(), data, str);     sleep(1);     while (1) {         sleep(1);     }      return 0; }  运行后输出： Child process 4517, data 10, str: parent str Child process 4517, data 20, str: child str Parent process 4516, data 20, str: child str

我估计是 ： 只共享了指针，没有共享指针指向的内容。

引用 2 楼 lovesmiles 的回复:fork出来的子进程已经拥有自己独立的进程空间，这个指针指向的是子进程的变量空间，对它的操作并不会影响到父进程的变量。  因为它们已经是指向两个不同的东西了。 没有用fork，目的是让他们操作同一块内存区域。

引用 1 楼 wangzuxi 的回复:[quote=引用 楼主 u012889234 的回复:] 比如有这样一个结构体   #define MAX_QUE_LEN 100  //定义数据包缓存队列 typedef struct _t_pkt_queue {     UINT4       V6_out_head;     UINT4       V6_out_tail;     UINT4       V6_out_curcnt;     tEthpkt *   V6_out_queue[MAX_QUE_LEN]; }tPktQue;  tEthpkt  *  是指向一个数据包的指针。 在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空，但是为什么不能对其进行操作？ Linux下在父进程用mmap创建匿名共享内存，共享内存的地址在父进程和子进程是一样的，父子进程都可以直接修改共享内存中的数据。 你说的子进程不能对其进行操作是什么意思？是取不到想要的数据还是修改了数据父进程看不见？ 你是怎么创建共享内存的？[/quote]    shmid = shmget(IPC_PRIVATE, sizeof(tPktQue), IPC_CREAT|0660);     if(shmid <= 0)     {         printf("\n***Create a shared memory Fail!\n");         return -1;     }     stacksize = getpagesize();     stack = malloc(stacksize);     if(stack == NULL)     {         printf("\n***Malloc For Child Process stack Failed!\n");         return -1;     }     childstack = stack + stacksize;     flags = CLONE_NEWPID|CLONE_NEWNS;     pid = clone(vdev_func, childstack, flags, (void *)shmid);     shmaddr = (char *)shmat(shmid, NULL, 0);     PktQue[i] = (tPktQue *)shmaddr;   //这里PktQue[i] 是一个指向tPktQue  的指针。   vdev_func子进程的调用函数。 在子进程中  shmaddr = (char *)shmat(shmid, NULL, 0); PktQue[i] = (tPktQue *)shmaddr;  比如对 PktQue[i] ->V6_out_queue[0]操作。操作不了。但其不为空。

引用 楼主 u012889234 的回复:比如有这样一个结构体   #define MAX_QUE_LEN 100  //定义数据包缓存队列 typedef struct _t_pkt_queue {     UINT4       V6_out_head;     UINT4       V6_out_tail;     UINT4       V6_out_curcnt;     tEthpkt *   V6_out_queue[MAX_QUE_LEN]; }tPktQue;  tEthpkt  *  是指向一个数据包的指针。 在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空，但是为什么不能对其进行操作？ Linux下在父进程用mmap创建匿名共享内存，共享内存的地址在父进程和子进程是一样的，父子进程都可以直接修改共享内存中的数据。 你说的子进程不能对其进行操作是什么意思？是取不到想要的数据还是修改了数据父进程看不见？ 你是怎么创建共享内存的？


Question: 关于形参实参的问题（矩阵相乘）

怎么没人回我啊！

哎。别发我很多字的哇。。我刚自学 真看不懂。。抱歉了


Question: 快速排序，如何将每一步排序显示出来？

引用 7 楼 Naccery 的回复:实际上我看了第一感觉就是在return前面直接运行for循环打印整个数组,不知道可对   你试试看看？

引用 4 楼 zy1404 的回复:你是说每一轮快排的结果吗？比如 5 2 9 8 6 1 4 第一轮 4  2  1 5 6 8  9  这样的一轮一轮的输出吗？  可以在我的代码里面修改么？谢谢。

int KuaiSuPaiXu(int a[],int low,int high) { int key=a[low],low1=low,high1=high;/// while(low<high) { while(low<high && a[high]<key) high--; if(low<high) a[low++]=a[high]; while(low<high && a[low]>key) low++; if(low<high) a[high--]=a[low]; } a[low]=key; for(int kk=low1;kk<=high1;kk++)//// printf("%d  ",a[kk]);///// printf("\n");//// return low; }

int KuaiSuPaiXu(int a[],int low,int high) { int key=a[low],low1=low,high1=high;/// while(low<high) { while(low<high && a[high]<key) high--; if(low<high) a[low++]=a[high]; while(low<high && a[low]>key) low++; if(low<high) a[high--]=a[low]; } a[low]=key; for(int kk=low1;kk<=high1;kk++) printf("%d  ",a[kk]); printf("\n"); return low; }

设置几个全局变量标示整个数组，每一次排完之后全部打印出来就可以了。

没大神来解答？嗯哼？

沙发自己占！


Question: 万能的C版,我又来了,召唤大神!

哥，你用那个版本的SDK。。。。我用rtk_openwrtSDK_V2.1_20140314 固件还编译不过去。。。

召唤大神用什么咒语？

引用 楼主 nadleeh123 的回复:遇到个没怎么接触的玩意儿：  我创建了一个socket（PF_PACKET, SOCK_RAW, htons（ETH_P_IP）；在交换机的镜像口下捕获ipv4的帧。  当捕获的帧的内容符合我的要求的时候，我要自行构建eth头，ip头，tcp/udp头,data段，然后回给被镜像口。  那么问题来了，不是挖掘机技术哪家强  我找不到该用哪个函数把我构建好的buff传回去，因为sockt的函数好像不能穿透以太网，他会给我的数据加一层以太网头  大神接下来靠你了 用libpcap


Question: Unicode的汉字可以这样表达吗？L'汉'

你测试一下就知道了。


Question: 求助 c语言 好像是数据溢出

12 L 正解

这个都是最好都按照格式来写, 因为他们在内存中所占字节不同, 所以他们在读取或者输出的时候会按照%后面的格式输出

#include<stdio.h>  void main()  {  double f,g; scanf("%f,%f,",&f,&g);    printf("f=%.6f,g=%.12f\n",f,g);  }   scanf("%f,%f,",&f,&g);   其实需要的是变量的地址值 也许你这样没有加&值，这时候你知道值写到哪儿了吗？ 写到了地址值为f的地址中，然而f的值还是未知呢 这个是我的理解 csdn中： If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return EOF and set errno to EINVAL. The scanf function reads data from the standard input stream stdin and writes the data into the location given by argument. Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. If copying takes place between strings that overlap, the behavior is undefined.

printf 输出的话，"%f" 格式可以输出float和double scanf输入的话，"%f" 格式输入float, "%lf" 格式输入double,   printf   * An optional h specifying that a following d , i , o , u , x , or X    conversion specifier applies to a short int or unsigned short int    argument (the argument will have been promoted according to the    integral promotions, and its value shall be converted to short int or    unsigned short int before printing); an optional h specifying that a    following n conversion specifier applies to a pointer to a short int    argument; an optional l (ell) specifying that a following d , i , o ,    u , x , or X conversion specifier applies to a long int or unsigned    long int argument; an optional l specifying that a following n    conversion specifier applies to a pointer to a long int argument; or    an optional L specifying that a following e , E , f , g , or G    conversion specifier applies to a long double argument.  If an h , l ,    or L appears with any other conversion specifier, the behavior is    undefined.  f  The double argument is converted to decimal notation in the style    [-]ddd.ddd , where the number of digits after the decimal-point    character is equal to the precision specification.  If the precision    is missing, it is taken as 6; if the precision is explicitly zero, no  scanf  * An optional h , l (ell) or L indicating the size of the receiving    object.  The conversion specifiers d , i , and n shall be preceded by    h if the corresponding argument is a pointer to short int rather than    a pointer to int , or by l if it is a pointer to long int .    Similarly, the conversion specifiers o , u , and x shall be preceded    by h if the corresponding argument is a pointer to unsigned short int    rather than a pointer to unsigned int , or by l if it is a pointer to    unsigned long int .  Finally, the conversion specifiers e , f , and g    shall be preceded by l if the corresponding argument is a pointer to    double rather than a pointer to float , or by L if it is a pointer to    long double .  If an h , l , or L appears with any other conversion    specifier, the behavior is undefined.  e,f,g Matches an optionally signed floating-point number, whose format is    the same as expected for the subject string of the strtod function.    The corresponding argument shall be a pointer to floating.     decimal-point character appears.  If a decimal-point character    appears, at least one digit appears before it.  The value is rounded    to the appropriate number of digits.

double  f,g; sancf("%f %f",&f,&g); printf("%d%d",f,g); 就可以了。。

#include<stdio.h> void main() {  float e;  scanf("%f",&e); printf("e=%.12f\n",e);  }  输入3.14  为什么不是3.14000000000

没输入函数，那个只是输出函数。

double,Long double 对应lf float 对应f

Long double 类型什么输出呢

可以这样理解

这是一一对应的关系吗？

c语言中的float 类型的输入用scanf("%f",&i) 但是double类型的数据输入要 用scanf("%lf",&k); 你可以查查c语言double类型的输入

小白一个 不是很懂 求帮助 谢了

scanf("%f,%f,",&f,&g);   …掉了

这有输入吗。


Question: pclint error 974 和438怎么破？

在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

木有人会吗？我发错版块了吗？主要是 不知道这种栈使用过度，该从哪里入手调试？谁给点指点？

1. 不要定义大的局部变量，改成动态内存或者静态变量 2. 参数不要用传值方式传递大型数据结构，改成传引用或指针 3. 分块定义局部变量，例如 void foo() {     struct A a;     struct B b;     //对a访问的代码     //对b访问的代码 } 改成 void foo() {     {         struct A a;         //对a访问的代码     }     {         struct B b;         //对b访问的代码     } } 或者把这两端代码拆成2个子函数

引用 3 楼 truelance 的回复:974是一个Note项，它报告你的程序里使用的最大栈的大小。不管你程序是否有错都会报告。 如果你不想报告，可以把lint选项中的+stack去掉 我的问题是，怎样才能压缩栈的使用呢？

引用 3 楼 truelance 的回复:974是一个Note项，它报告你的程序里使用的最大栈的大小。不管你程序是否有错都会报告。 如果你不想报告，可以把lint选项中的+stack去掉 你好，终于有个人回答我了，谢谢。目前的情况是，我的程序是没错的，运行过很多次，目前还未发现问题。（嵌入硬件后也运行过多次了，没有问题）但因为是嵌入式的，所以需要符合MISRA标准，做到产品中。pclint报了个974错误。就说明我的程序有潜藏的错误。但我不知道这个错误的严重程度，会造成怎样的影响？如果改动，该从哪里入手？比较迷茫。

error 974: (Note -- Worst case function for stack usage: 'Control' is finite, requires 308 bytes total stack in calling 'Control_K'. ) 是因为我的Control_K太大了吗？可是我的Control_K必须的这么大呀，我已经尽量把他拆分成几个小函数了。可是拆了之后还是要在Control_K里调用呀


Question: 已知阵列前4行为3,13,1113,3113,132113 如何通过编程实现第n行输出？

//是一个找规律的题 //3 //13 //1113 //3113 //132113 // //        3: 1个3，即演变为13 //      13: 1个1，1个3，即演变为1113 //  1113: 3个1，1个3，即演变为3113 //  3113: 1个3，2个1，1个3，即演变为132113 //132113: 1个1，1个3，1个2，2个1,1个3，即演变为1113122113 //如何用做出生成第n行的算法？ #include <stdio.h> #include <string.h> char s[200]; char t[200]; int i; void nexts() {     int n,j,L;     char *p;     strcpy(t,s);     j=0;     n=1;     p=s;     while (1) {         if (t[j]==t[j+1]) {             n++;         } else {             L=sprintf(p,"%d%c",n,t[j]);             p+=L;             n=1;         }         j++;         if (0==t[j]) break;     } } int main() {     s[0]='3';s[1]=0;     printf("%2d %s\n",0,s);     for (i=1;i<17;i++) {         nexts();         printf("%2d %s\n",i,s);     }     return 0;           } // 0 3 // 1 13 // 2 1113 // 3 3113 // 4 132113 // 5 1113122113 // 6 311311222113 // 7 13211321322113 // 8 1113122113121113222113 // 9 31131122211311123113322113 //10 132113213221133112132123222113 //11 11131221131211132221232112111312111213322113 //12 31131122211311123113321112131221123113111231121123222113 //13 1321132132211331121321231231121113112221121321133112132112211213322113 //14 11131221131211132221232112111312111213111213211231132132211211131221232112111312212221121123222113 //15 3113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112211322112211213322113 //16 132113213221133112132123123112111311222112132113311213211231232112311311222112111312211311123113322112132113212231121113112221121321132122211322212221121123222113

引用 1 楼 zxhuser-2 的回复:能具体说明吗？没看懂lz意思 是一个找规律的题   3 13 1113 3113 132113            3: 1个3，即演变为13         13: 1个1，1个3，即演变为1113     1113: 3个1，1个3，即演变为3113     3113: 1个3，2个1，1个3，即演变为132113 132113: 1个1，1个3，1个2，2个1,1个3，即演变为1113122113 如何用做出生成第n行的算法？

能具体说明吗？没看懂lz意思


Question: C语言 子函数 返回值的问题

引用 6 楼 lm_whales 的回复:在 DOS ,Windows 中： a）在DOS时代，你可以访问任何地址（操作系统和计算机系统提供的内存，1M以上由于地址线需要打开，可以访问不到这个地址 但是访问依然没有问题，只是地址回绕会而已）， 尤其是读访问 b）在Windows 时代，某些地址是不可以读的，除此之外，你可以读访问任何地址。  c）编译器并不限制你访问某些地址，受到的限制是往往是，       操作系统给出的，而不是C，C++语言给出的 真正的问题是：          自动变量的生存周期，是函数退出，就结束了的，          此后，对它占用的，那块内存的，访问是未定义的。         但是这块内存不会凭空消失，这块内存的数据，         通常 编译器，操作系统，也不会耗费代码，         花费时间去清除（设置为0或者其他数据）                   编译器根据需要，安排那块已经不再用的内存的用途。          如果那块内存，恰巧没被改写，          那么，这个内存中的数据，是可以读到的，没有错误的数据          反之，读到的就是错误的数据。          但是显然，这么用这块内存，是错误的，          因为如何安排这块内存，不是程序员可以直接确定的。          你的代码，产生了莫名其妙的不确定性，          你控制不了代码运行，这个很可怕。  至于，问题1 ：原因是还没有被占用，或者虽然被占用，还没有被改写。  问题2 ：             第一printf 函数有参数，参数传递可能会占用那块内存。              第二printf 函数的实现（有自动变量），可能会用到那块内存。             这样，会改变占用内存中的数据，所以会造成输出错误。             其实，函数调用本身，通常也要占用堆栈上的内存，            用于保护现场，以便函数能够返会调用点。 多谢，回答很详细

上班了，没时间看，有一点，那是被调函数，不是子函数

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

不能返回局部对象的地址。所以fun和fun2两个函数都是有隐患的，所以后边的结果就无法预料了，出现正确的结果也不能说明这做法没有问题

函数的返回值不可以是数组。因为放回数组是要付出很带的代价的，需要复制数组里面的说有数据，所一当你返回一个数组的时候，被编译器优化为返回数组的地址，可是如果你返回的的数组是一个非静态的数组，那么就没有意义了额，因为函数执行完毕后就不再保证该栈上的数组完整，如果运气好，你的数据没有被破坏。如果你愿意在你的数组前面加一个static申明的话，那就另当别论了。

char * fun() {     char p[6]="hello";     printf("fun=%s \n",p);     return p;   } 你不知道char *pp =fun()，p的地址在函数返回后就不存在了？那么pp就是一个野指针，你能指望野指针给你输出什么？！！！

引用 楼主 laojiaqi 的回复:#include<stdio.h> char * fun(); int * fun2(); int main() {     char *pp=fun();     printf("%c %c %c %c %c\n",*pp,*(pp+1),*(pp+2),*(pp+3),*(pp+4));     printf("%s\n",pp);     int *aa=fun2();     printf("%d %d %d %d\n",*aa,*(aa+1),*(aa+5),*(aa+9)); } char * fun() {     char p[6]="hello";     printf("fun=%s \n",p);     return p;  } int * fun2() {     int a[10]={0,1,2,3,4,5,6,7,8,9};     return a; } ============================== 输出结果： fun=hello h e l l o " 0 1 5 9 ================================ 问题 1.在函数fun和fun2中分别创建了局部变量char p[6]和int a[10]，存放在栈空间，这两个变量的生存期在子函数运行完之后就没了，那么为什么可以在main中继续访问到它们的值？ 2.printf("%s\n",pp);就会产生乱码，而一个一个字符输出则没有乱码？ ================================== 望高手解答，谢谢。 你把第9行放到第6行下面输出就不一样了。 1和2的原因都是栈被重用了；

补充一下1的意思，简单地说就是：消亡是消亡了，局部变量失效，变量名外部不可用，这部分的内容标示为自由空间，但是机器不会刻意花功夫抹去那部分空间的内容（除非编译器真的这么实现了……），既清零，只是之后会覆盖而已。所以如果期间那块地址的内容没有被覆盖掉，那么地址引用的还会是那内容。不知道表述清楚了没有。

按我的理解是： 1、局部变量是会消亡，但是那也只是代表那个局部变量的变量名你在外部不能访问，但是不意味着局部变量的内容和地址会消亡； 2、你试着在字符串后面加个\0试一下，没有检测到0，打印%s就会出错了。

计算机组成原理→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

既然楼主知道不能这么写，就不要这么写吧


Question: 这是AVR 单片机DA输出的一个函数，不是很懂，求大神指点！

先看芯片文档和教程再看程序吧。


Question: 编写程序，查找c程序中的基本语法错误，如圆括号、方括号、花括号的不匹配；如单引号和双引号等。要求能够显示错误信息，并给出错误行数。注意尽可能的考虑软件的通用性

引用 1 楼 zhao4zhong1 的回复:参考Tiny C Compiler或gcc源代码中相关片断。+1，没事别写编译器功能的代码

看你的代码，我就想要弄死你

参考Tiny C Compiler或gcc源代码中相关片断。


Question: 以16进制发送一个0-65536之间的任一数。。。求解释

num*256就是左移8位的意思。 num*2 ==num<<1 num*4 ==num<<2 num*8 ==num<<3 num*16 ==num<<4 num*32 ==num<<5 num*64 ==num<<6 num*128 ==num<<7 num*256 ==num<<8  num=num*256+SBUF 就是高8位存num,低8位存SBUF

发送16位数据时 它是分成两个8位数据读取的 *256和<<8是一个意思


Question: C99变长数组形参？

初始化和赋值 傻傻分不清。

第二个问题：实现的方式  #include <stdio.h>  typedef struct int5{   int a;   int b;   int c;   int d;   int e; } int5;   void c(){   int c = 0;   printf("\nc的地址 %p",&c); }  void fun(int n){   c();   int b[n];   b[2] = 0;   printf("\nb的地址 %p",b);   c(); }  int main(){   int a = 9999;   for(int i = 0 ; i<20;i++)     {       printf("%d",i);       fun(i);       printf("\na的地址 %p\n\n",&a);     } }  运行之后 你应该能猜测的出他的实现方式

第一个问题 ：初始化  #include <stdio.h>  typedef struct int5{   int a;   int b;   int c;   int d;   int e; } int5;  void fun(int n){   int b[n] = {0,1,2,3,4,5};   b[2] = 0;   printf("\n%p",b); }  int main(){   int a = 9999;   for(int i = 0 ; i<20;i++)     {       printf("%d",i);       fun(i);       printf("\n%p\n\n",&a);     } }  bash-3.2$ clang t.c t.c:12:9: error: variable-sized object may not be initialized   int b[n] = {0,1,2,3,4,5};         ^ 1 error generated.

falcomavin： 引用bool init(int *array, int arrayLen, int index, int val)   {      if (array == null || index >= arrayLen)      return false;      array[index] = val;      return true;   }   怎么调用这个函数，给数组元素赋值？

各位： 23楼，谁说说呢？

falcomavin：    怎样调用这个函数，数组元素怎赋值？ 给个完整程序，说明下。

各位： 这个谁说说呢？

16楼：   数组初始化为：任何值，怎办？

引用 15 楼 Daffodiles 的回复: int n; scanf("%d",&n); int a[n];   数组a[n]，怎样初始化？  for (int i = 0; i < n; ++i) {   a[i] = i; }

原来有这么很多不明就里的人。  对于静态数组，通过数组指针很容传递数组大小信息。  void foo(char (*pa)[5]) {   printf("%u\n", sizeof(*pa)); //5 } char a[5]; foo(&a);  变长数组想要类似的效果，只能通脱变长数组参数。   void bar(int len,  char (*pa)[len]) {    printf("%u\n",sizeof(*pa)); } int n = 100; char a[n]; bar(n,&a); //100 bar(5, &a); //5,编译不会报错， 认为实参是一个指向5个元素数组的指针。

引用 17 楼 Daffodiles 的回复:16楼：   数组初始化为：任何值，怎办？  bool init(int *array, int arrayLen, int index, int val) {   if (array == null || index >= arrayLen)        return false;   array[index] = val;    return true; }

引用 8 楼 Daffodiles 的回复:[quote=引用] 只是允许使用变量定义数组大小，而已，胜于C99之前的只运行编译期常量定义数组，败于动态大小数组 数组作函数形参，编译器会忽略数组长度！ 变长数组形参，编译器，会忽略数组长度么？[/quote]  会，变成数组形参并没改变数组本质，别想的太神奇了，它只是允许编译器去实现用变量在运行时定义数组大小，而已

引用只是允许使用变量定义数组大小，而已，胜于C99之前的只运行编译期常量定义数组，败于动态大小数组 数组作函数形参，编译器会忽略数组长度！ 变长数组形参，编译器，会忽略数组长度么？

引用 4 楼 Daffodiles 的回复: void  M(int n, int a[n])  {    for(int i=0; i<n; i++)      printf("%d\n",a[i]);  } int main()   {     int a[ ]={1,2,3,4,5,6};     M(7,a); //这样调用，数组越界！   }   问题： 1.C99变长数组形参，跟其它数组参数没什么不同。 一样可能越界！ 到底有什么用？ 越界是程序员的问题； 它只是方便你写一个函数但是可以适用不同的形参，节省了编码的时间。

运行=允许。。。。。。。。

引用书上写的不行吗——http://book.51cto.com/art/201002/182919.htm 娘的，别人肯定不明才问了。照书COPY？！ 神经！

楼上正解。。。


Question: GCC编译器遇到繁体中文字符串解析错误

引用 14 楼 qq_22963489 的回复:我使用HEX工具查看对应文件引号中内容（繁體中文）的原始值为： e7 b9 81 e9 ab 94 e4 b8 ad e6 96 87   您所说的其他2个工具没用过，不大会用。也不只能否使用在我这个平台上，目前我这个使用的是ecos系统。 // UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89

我将 wcscpy(string_buffer,(U16*)"繁體中文"); 修改成 wcscpy(string_buffer,(U16*)L"繁體中文"); 的输出结果是 [7e41][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 也就是只能输出第一个字（繁）。经过我反复测试不管第一个字是什么字都是只输出第一个字。 请问是什么原因呢？有办法解决么~

#include <stdio.h> #include <string.h> #define U16 wchar_t U16 string_buffer[30]; int i; int main() {     memset(string_buffer,0,sizeof(U16)*30);     wcscpy(string_buffer,(U16*)L"繁體中文");     for (i=0;i<30;i++) {         printf("[%04hx]",string_buffer[i]);     }     return 0; } //[7e41][9ad4][4e2d][6587][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000]

VC6没问题。 使用gdb查看每句C对应的汇编代码。 使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

gcc是开源的，可以给其打个补丁。 或者让你的源代码使用UTF8编码保存汉字。

为何一定要用繁体字？

我写了个测试小程序 //////////////////////////////////////////////// 	memset(string_buffer,0,sizeof(U16)*30); 	wcscpy(string_buffer,(U16*)"繁體中文"); 	printf("\n"); 	for(i=0 ; i<30;i++) 	{ 		printf("[%x]",string_buffer[i]); 	} //////////////////////////////////////////////////// 当以ANSI编码时输出结果为 [b1b7][e5cc][d0d6][c4ce][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 当以UTF-8 无BOM格式编码时输出结果为 [b9e7][e981][94ab][b8e4][e6ad][8796][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 但是我所需的真实输出结果应该是 [7e41][9ad4][4e2d][6587][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 然道真的只是编码格式问题么？感觉是否还有其他错误啊？

utf保存就行了，写个小程序，岂不又多了一套代码？

或者自己编个小程序，将 "謀"替换为"\xd6\x5c" "齖"替换为"\xfd\x5c" "診"替换为"\xd4\x5c"

换Notepad再试试？

请问如何查看源码字符集呢？我使用Notepad++ 打开在格式中显示的是“ANSI格式编码” 然后将格式改成UTF-8保存后编译错误是一样的。

你的源码字符集是用的什么，UTF8、GB18030、Big-5还是其他？？  GCC默认是UTF8字符集，如果用的其他字符集，你需要指定 input charset

源码以utf-8保存。


Question: 这是蓝桥杯的题目，没有头绪，求解

不就是字符串编辑距离么。你把LCS搞懂，字符串编辑距离就是小改动。

#include<stdio.h>   #include<string.h>    char a[110];   char b[110];   int dp[110][110];     int main()   {      int i,j,t,n,m;      scanf("%d",&t);      while(t--)      {          scanf("%s%s",a,b);          n=strlen(a);          m=strlen(b);          //memset(dp,0,sizeof(dp));          for(i=0;i<=n;i++)             dp[i][0]=i;          for(i=0;i<=m;i++)              dp[0][i]=i;          for(i=1;i<=n;i++)              for(j=1;j<=m;j++)              {                  if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];                  else                   {                      dp[i][j]=dp[i-1][j]+1<dp[i][j-1]+1?dp[i-1][j]+1:dp[i][j-1]+1;                      dp[i][j]=dp[i][j]<dp[i-1][j-1]+1?dp[i][j]:dp[i-1][j-1]+1;                  }              }              printf("%d\n",dp[n][m]);      }      return 0;  }  我在网上搜的答案，那个dp二维数组有什么用？这是dp算法，但不知道他用那个二维数组怎么得到答案的？

dna，就是链  我们程序里面就是各种子串，找相同子串，以第一个串为基础，3种变化行为，第3种稍微特殊一点

我记得这个题在哈工大的OJ上有原题。LZ找下吧，很简单，就是个模拟题

没看懂题目意思。。。


Question: linux 下自编简易命令行字典

厉害！学以致用！

英汉汉英字典C源代码 支持模糊查询，支持生成生词本。 http://download.csdn.net/detail/zhao4zhong1/4140015

上面是dict.h因为一次发不完，我就分开了 接下来的是源文件dict.c #include"dict.h" int main(int argc,char *argv[]) {    //only one parameter    if(argc==1)    {             lookup(argv,argc);    }    else if(argc==2&&*argv[1]=='-')   //two parameter wtih the second one startt with '-'    {          if(!strcmp(argv[1],"-A"))         {             if(addword(0)) 	         printf("word add successfully!\n");         }         else if(!strcmp(argv[1],"-c"))         {              addword(2);         }         else if(!strcmp(argv[1],"--help"))         {              loadhelp();         }         else if(!strcmp(argv[1],"-s"))         {               printf("you must add at lest a word behind -s.\n");         }         else if(!strcmp(argv[1],"-a"))         {               printf("you must add at lest a word behind -a.\n");         }         else          {               printf("Parameter %s is not legle!for more  help please type\"dict --help\"\n",argv[1]); 	}    }    else     {         lookup(argv,argc);    }    return 0; } 帮助文件help #about the dict   version 1.0   	-s       Briefly display the meaning of the words you look up 	-a       Dispaly the meaning of the words you look up in detail 	-c       copy words and add them in the dictionary.the format is                   "word phonetic meaning" or "word  meaning"and every word                  should be estinguished by [Enter]         -A       add one word in the dictionary with directions         --help   statement of parameters. 源文件CreateDict.c  (我觉得可要可不要) #include"dicthelp.h" int main() {        if(CreateDict())     {        printf("successfully create file.\n");        return 0;     }     printf("error:failed to create file DictList or Meaning!\n");     return 1; }

#include"dicthelp.h" #include<stdlib.h> //add word to the dict //successfully excuted return the num of added words. //failed return 0 int addword(int mode) {    FILE *fp;    int   i;    List  list;    DictWord dw;    if(mode==0)    {        printf("please following the direction to add word\n");        printf("Word:");      scanf("%s",dw.word);         if(Travelsal(dw.word))         {             printf("Word %s is already in the dictionary.\n",dw.word);             return 0;        }        printf("Phonetic:");  scanf("%s",dw.phonetic);        printf("Meaning:");   scanf("%s",dw.meaning);        dw.node=count()+1;        printf("Node:%d\n",dw.node);        printf("dw.word=%s,dw.ph=%s,dw.meaning=%s\n",dw.word,dw.phonetic,dw.meaning);        for(i=0;i<36;i++)            list.word[i]=dw.word[i];        list.node=dw.node;        fp=fopen("DictList","ab");        if(fp==NULL) 	  return 0;        fwrite(&list,sizeof(list),1,fp);        fclose(fp);         fp=fopen("Meaning","ab");        if(fp==NULL)            return 0;        fwrite(&dw,sizeof(dw),1,fp);        fclose(fp);        return 1;    }    if(mode>1&&mode<4)    //copy mode    {           char *buffer,ch[BUFFER_SIZE];         int  size=10,test=0,point=0,p=0,add_num=0,added_num=0;        i=0;        printf("please copy the words you want to add,each group estinguished by [Enter]\n");        if(mode==2)             buffer=(char *)malloc((sizeof(DictWord)+1)*size);        else if(mode==3)        {     	    scanf("%d",&size);             buffer=(char *)malloc((sizeof(DictWord)+1)*size);        }        while(1)        {             *(buffer+i)=getchar();             if(*(buffer+i)=='\n')                  add_num++;             if(i>3)             {                 if(*(buffer+i-4)=='#'&&*(buffer+i-3)=='E'&&*(buffer+i-2)=='N'&&*(buffer+i-1)=='D'&&*(buffer+i)=='\n')                 {                      *(buffer+i-4)='\0';break;                 }             }             i++;        }        add_num--;        while(*(buffer+p)!='\0')        {              	  while(*(buffer+p)!='\0')                     // to fill the structrue!           {                 i=0;                 if(point==1)                      break;                 while(*(buffer+p)==' ')                //delete the space in the begginning                      p++;                 while(*(buffer+p)!='\n')                                {                        if(test==0)                                        {                         dw.word[i]=*(buffer+p);p++;                         if(*(buffer+p)==' '||*(buffer+p)=='\n')          //there is a space                         {                              dw.word[i+1]='\0';                              if(!Travelsal(dw.word))                    //word is not in the dict                              {                                  while(*(buffer+p)==' ')                                      p++;                                  if(*(buffer+p)!='\n')                                      test++;                                  else                                  {                                      p++;                                      printf("Word %s is in wrong format.for more help with \" --help\"\n",dw.word);                                   }                                  break;                              }                                        //word id already in the dict                              else                              {                                     printf("Word %s is already in the dictionnary.\n",dw.word);                                   while(*(buffer+p)!='\n')                                      p++;                                  p++;                                  break;                              }                         }                     }                     else if(test==1)                     {                         ch[i]=*(buffer+p);p++;                         if(*(buffer+p)==' '||*(buffer+p)=='\n')                         {                               ch[i+1]='\0';                               while(*(buffer+p)==' ')                                  p++;                             if(*(buffer+p)!='\n')                             {                                 for(i=0;i<strlen(ch);i++)                                      dw.phonetic[i]=ch[i];                                 dw.phonetic[i]='\0';                                 test++;                             }                             else                              {                                 ch[i+1]='\0';                                 dw.phonetic[0]='N';                                 dw.phonetic[1]='U';                                 dw.phonetic[2]='L';                                 dw.phonetic[3]='L';                                 dw.phonetic[4]='\0';                                 for(i=0;i<strlen(ch);i++)                                     dw.meaning[i]=ch[i];                                 dw.meaning[i]='\0';                                 test=0;                                 p++;                                 point=1;                             }                             break;                         }                      }                      else if(test==2)                      {                             dw.meaning[i]=*(buffer+p); p++;                             if(*(buffer+p)=='\n'||*(buffer+p)==' ')                             {                                  dw.meaning[i+1]='\0';                                while(*(buffer+p)==' ')                                     p++;                                if(*(buffer+p)!='\n')         //more than 3 strings                                {                                     printf("Word %s is in wrong format.for more help with \" --help\"\n",dw.word);                                    while(*(buffer+p)!='\n')                                         p++;                                   p++;                                   test=0;                                }                                else                                {                                   p++;                                   test=0;                                   point=1;                                }                                break;                            }                      }                      i++;                             }            }            if(point==1)            {               dw.node=count()+1;               list.node=dw.node;               for(i=0;i<strlen(dw.word);i++)                   list.word[i]=dw.word[i];               list.word[i]='\0';               fp=fopen("DictList","ab");               if(fp==NULL) 	          return 0;               fwrite(&list,sizeof(list),1,fp);               fclose(fp);                fp=fopen("Meaning","ab");               if(fp==NULL)                  return 0;               fwrite(&dw,sizeof(dw),1,fp);               fclose(fp);               point =0;               added_num++;               printf("Word %s is added in the dict successfully.\n",dw.word);           }       }       free(buffer);       printf("%d total	%d added	%d failed.\n",add_num,added_num,add_num-added_num);        return 1;    }    return 0;    }  //cat word //paramter argc=2 hand up to main to judge if - is exist int lookup(char *argv[],int argc) {    FILE *fp;    List list;    DictWord dw;      if(argc==1)          //list all the words in the Dictlist    {         int total=0;       fp=fopen("DictList","rb");       if(fp==NULL)           return -1;       while(!feof(fp))        {                        if(fread(&list,sizeof(list),1,fp)==1)          {                    printf("%s\n",list.word);               total++;          }        }        fclose(fp);        printf("%d Words total in the dictionary.\n",total);        return 1;           }    else   //the num of command is bigger than  3 or    {              int  test=0,i=1,m=1,num=0;           if(*argv[1]=='-')    //the word to cat start from the third one.        {            i=2; test=1;            if(!strcmp(argv[1],"-a"))                 m=2;        }        for(;i<argc;i++)     //this way cat one word need one file io, it can be esayer.        {             fp=fopen("DictList","rb");           if(fp==NULL)               return -1;           while(!feof(fp))           {               if(fread(&list,sizeof(list),1,fp)==1)                  if(strcmp(list.word,argv[i])==0)                  {      	             fclose(fp);                      fp= fopen("Meaning","rb");                      if(fp==NULL)                           return -1;                      while(!feof(fp))                      {                         if(fread(&dw,sizeof(dw),1,fp)==1)                            if(dw.node==list.node)                            {                                 if(m==1)   //list simply                                     printf("%s      %s\n",dw.word,dw.meaning);                               else     // list all                                     printf("%s      %s      %s\n",dw.word,dw.phonetic,dw.meaning);                               num++;                               test++;                               break;                            }                      }                      fclose(fp);   //close Meaning file  test==i                      break;                      }               }           if(test<i)           {    fclose(fp);                test++;                printf("Word %s is not found in the dictionary.\n",argv[i]);            }       }       return num;    }    return -1; }  //to delete a word in the dict int deleteword() {     return 1; }  //to update a word in the dict int update() {         return 0; }


Question: 为什么输入数据后，没办法运行，求大神解答。

谢谢。。很有用，，会给高分的

测试没有问题。 注意，用ctrl+f5运行程序可以看到结果，不会闪退 输入时，两个实数之间是有一个空格的。 不要输入0.否则会有除0异常。

你的scanf有问题，应该写成  scanf("%f,%f",&r,&h);      //输入r和h的值  两个%f之间至少应该有一个其他符号，否则不能区分出这两个数，如  234.23445.7。你能区分是哪两个数吗

没有问题，楼主什么编译器 PS：最上面最好用尖括号<> scanf中间最好加个括号 最好使用int main，后面return 0


Question: 我有曲线上数据点dat文件，想得到此曲线绕某一轴旋转一定角度后的数据点坐标，怎么编程？谢谢！

搜“二维坐标变换”或“三维坐标变换”

顶一下，吼吼吼


Question: 求助，哈夫曼树的C语言编程问题~~万分感谢！

代码太长了，


Question: 是唯一的二叉树么？

问题中画的第一个树的后序遍历应该是：IADEKFCJHBG

先根次序和后根次序不能确定唯一的二叉树。必须有中根才行。 http://blog.csdn.net/sgbfblog/article/details/7783935


Question: shift + tab 组合键的扫描码是什么？

//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }

shift + tab 的组合键没错的话应该是0xf00。

自己找到结果了，VC下输入下面一段程式，然后运行按下想要的组合键就ok了。  #include<bios.h> #include<stdio.h> #define ESC 0x11b void main(void) {     int key;     while(1)     {         key=bioskey(0);         printf("0x%x\n",key);         if(key==ESC)             break;     }     getch(); }


Question: 求达人帮忙看下 输出结果总是不对

'l'和'1'还是看清点啊

我是不是一眼就看出来了  那个scanf()里面用的不是l是1吧???? 这要是能对都奇怪了啊

请检查scanf的返回值。

scanf("%lf,%lf,%lf",&a,&b,&c);///L

#include<stdio.h> #include<math.h> #include<stdlib.h> int main() { double a,b,c,disc,x1,x2,realpart,imagpart; scanf("%lf%lf%lf",&a,&b,&c);？？？？ printf("The equation"); if(fabs(a)<=1e-6) printf("is not a quadratic\n"); else { disc=b*b-4*a*c; if(fabs(disc)<=1e-6) printf("has two equal roots:%8.4lf\n",-b/(2*a)); else if(disc>1e-6) { x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("has distinct real roots:%8.4lf and %8.4lf\n",x1,x2); } else {   realpart=-b/(2*a);   imagpart=sqrt(-disc)/(2*a);   printf("has complex roots:\n");   printf("%8.4lf+%8.4lfi\n",realpart,imagpart);  	  printf("%8.4lf-%8.4lfi\n",realpart,imagpart); }  }  return 0; }  请先去看看double和float在scanf中是怎么写的 同时也学学scanf输入的格式是什么 后面有问号的就是你错误的语句


Question: 用c语言if嵌套编写  简单点

隐式if else嵌套  #include<stdio.h> int main() {     int a;     scanf("%d",&a);     a < 10 ?  		printf("%d is under 10\n",a) :     a <99 ? 		printf("%d 10 to 99\n", a) :     a < 999 ? 		printf("%d is 100 to 999\n",a) : 		printf("%d is above 1000\n",a);      return 0; }

这个还能多复杂，就像一楼那样，这仅仅是if的正常的简单的用法，相信楼主只要是稍微的看看书，应该能写出来的，学编程要多多练习，不要因为简单就不去写啊

參考看看  //輸入一個整數，將其數值按小于10，10～99，100～999，和1000以上分類并顯示，例輸入256，顯示256  is  100  to  999 #include <stdio.h>  void main() { 	//輸入整數 	int IpInteger = 0; 	printf("請輸入一個整數\n"); 	scanf("%d", &IpInteger); 	 	//100～999分類 	if(IpInteger<1000 && IpInteger>=100 ) 		 		printf("%d is 100 to 999\n", IpInteger); 		//10～99分類 		else if(IpInteger>=10 && IpInteger<=99)  				printf("%d is 10 to 99\n", IpInteger); 				//小于10分類 				else if(IpInteger<10)  						printf("%d is under 10\n", IpInteger); 						//大於10分類 						else  						printf("%d is above 999\n", IpInteger); }

if....else if .....else

楼住还是多多看看书吧 /*************************************************************************     > File Name: ss.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月05日 星期三 21时43分52秒  ************************************************************************/  #include<stdio.h> int main() {     int a;     scanf("%d",&a);     if(a < 10) 	printf("%d is under 10\n",a);     else if(a <99 ) 	printf("%d 10 to 99\n", a);     else if(a < 999) 	printf("%d is 100 to 999\n",a);     else  	printf("%d is above 1000\n",a);      return 0; }


Question: 杭电2034题大神帮忙找下错

我错了，没看清楚题。。。

有一点错了，最后不能输出空格

测试用例 3 3 1 3 3 1 4 7 应该输出3，你的代码输出3 3

#include <iostream> using namespace std; int a[110],b[110]; int flag[110]; int res[110]; int main() { 	int n,m; 	int t=0; 	while(cin>>n>>m){ 		t=0; 		memset(flag,0,sizeof(flag)); 		if(n==0&&m==0) break; 		 		for(int i=0;i<n;i++) 			cin>>a[i]; 		for(int i=0;i<m;i++) 			cin>>b[i]; 		for(int i=0;i<n;i++) 		    for(int j=0;j<m;j++)     			if(a[i]==b[j])  flag[i]=1; 		for(int i=0;i<n;i++) 			if(flag[i]==0)  				res[t++]=a[i]; 			 		//sort 		for(int i=0;i<t;i++) 		   for(int j=i;j<t;j++)    			  if(res[i]>res[j]) swap(res[i],res[j]);    		 		 		if(t==0) cout<<"NULL"; 		else for(int i=0;i<t;i++)		 			cout<<res[i]<<" "; 		cout<<endl;		 	} 	return 0; }

0  3 1 2 3 这一组数据你试试。。。。

#include <algorithm> #include <iostream> #include <functional> #include <cstring> using namespace std; int main() {     char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;     char *Vowels   = "aeiou" ;     char *AlphaNum = "0123456789abcdef" ;     char result[45] ;     char *last ;      int lenA  = strlen(Alphabet) ;     int lenV  = strlen(Vowels  ) ;     int lenAN = strlen(AlphaNum) ;      cout << "Alphabet = " << Alphabet << endl ;     cout << "Vowels   = " << Vowels   << endl ;     cout << "AlphaNum = " << AlphaNum << endl ;      cout << "\nusing non-predicate versions" << endl ;      //non-predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //non-predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      cout << "\nusing predicate versions" << endl ;      //predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result  , less<char>()) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result  , less<char>()) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result  , less<char>()) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result  , less<char>()) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      return 0 ; }


Question: 求解为什么先输入不愿意，再输入愿意它就直接跳出来了，不能停住？一开始输入愿意就能停住

引用 6 楼 zhao4zhong1 的回复:fflush(stdin);好象在某些OS上不能用。是的

引用 楼主 u013318770 的回复:#include<stdio.h> int main(void) { 	char c[10]; 	char a[10]="愿意";	 	char b[10]="不愿意"; 	printf("请问您是否愿意让我永远保护您，请回答愿意或不愿意\n"); 	while(1) 	{ 		scanf("%s",c); 		if((strcmp(a,c)==0)||(strcmp(b,c)==0)) 		{ 			if(strcmp(a,c)==0) 			{ 				printf("祝福你们白头偕老！！！\n"); 				printf("我会永远保护你！！！\n"); 				break; 			} 			if(strcmp(b,c)==0) 			{ 				printf("对不起，您的回答我不太同意，请再考虑一下重新输入\n"); 			} 			else 			{ 				printf("您输入的格式不对，请输入愿意或不愿意\n"); 			} 		} 	//system("pause"); 	} }  只是一个小问题，逻辑出错了 if（） { } if（） {} else{} 这样写是表示愿意是一种情况，不愿意和其他是另一种情况 正确的写法是 if（） {} else if（） {} else {} 这样才是表示一种情况：愿意、不愿意和其他。 所以真确代码是： #include<stdio.h> #include <string.h> int main(void) { 	char c[10]; 	char a[10]="愿意";	 	char b[10]="不愿意"; 	printf("请问您是否愿意让我永远保护您，请回答愿意或不愿意\n"); 	while(1) 	{ 		scanf("%s",c); 		if((strcmp(a,c)==0)||(strcmp(b,c)==0)) 		{ 			if(strcmp(a,c)==0) 			{ 				printf("祝福你们白头偕老！！！\n"); 				printf("我会永远保护你！！！\n"); 				break; 			} 			else if(strcmp(b,c)==0) 			{ 				printf("对不起，您的回答我不太同意，请再考虑一下重新输入\n"); 			} 			else 			{ 				printf("您输入的格式不对，请输入愿意或不愿意\n"); 			} 		}	 	} } 就可以了！！！

不知道是什么问题 我这边是边写边读, 我不愿意还没打完呢 他就吧我的'buyuan给输出了' 我这边用的时xcode

fflush(stdin);好象在某些OS上不能用。

引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。不太懂你  引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。你说的我不太懂，我搜了一下，好像fflush(stdout);和rewind(stdin);都是清空读写缓冲区的，有什么区别吗？具体该什么时候用呢？

引用 1 楼 u012421456 的回复:楼主什么编译器？楼主的意思是第一种方式屏幕不能暂停？ 最好加上#include <string.h>恩  解决了  谢谢了~

lz这代码。。。


Question: 什么类型程序，用到socket？

网络编程socket

现在的程序不和网络打勾就太out了，和网络打勾都要用socket

用到网络的都要socket.不用网络的，进程通信的，也可能会用到socket.你问这样的问题只能说明你对socket编程还未入门。

当你发这个帖子的时候，你已经用到了socket

引用 3 楼 user-6 的回复:我汗，这个跟问题牛头不对马嘴好伐，要我说，凡是你想要把一个数据传输到另外一个机器上去的场景，都可以用socket通信，甚至本机的跨进程通信，也可以用socket。+1，网络类的

IOS后台开发，还有些什么？

其实就是用来交换数据用的 比如，你想把主机A上面的数据发给主机B，这个时候就要用到 例子嘛网上满天飞，自己百度下吧，无非就是需要有个server端和一个client端


Question: 求大神指教呀 使用richededit控件 编的记事本程序 打开TXT文件  只显示了第一行

设置那个控件的换行属性为ture了吗？原来我就是这样，然后输出的字符串只有一行

谢谢  谢谢

厉害  我知道了  搞了一天才发现这个问题

richededit控件的MultiLines属性设置为True？


Question: 关于图片格式转换（如png转icon）

引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 u013947751 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] Image Magick CXImage 谢谢 不是说用别人的不好，我无聊的时候就喜欢DIY一些小工具，弄懂原理比较好玩 谢谢您的回复！！[/quote] Image Magick是开源的，你先读读它的源代码收获应该更大。[/quote] 万分感谢您的建议，我会的

1楼正解，需要先搞明白各种格式的具体字段，然后你就可以随心所欲的转换了。

引用 4 楼 u013947751 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] Image Magick CXImage 谢谢 不是说用别人的不好，我无聊的时候就喜欢DIY一些小工具，弄懂原理比较好玩 谢谢您的回复！！[/quote] Image Magick是开源的，你先读读它的源代码收获应该更大。

引用 2 楼 zhao4zhong1 的回复:Image Magick CXImage 谢谢 不是说用别人的不好，我无聊的时候就喜欢DIY一些小工具，弄懂原理比较好玩 谢谢您的回复！！

引用 1 楼 lovesmiles 的回复:拒绝源码哈哈，基本上也没有多少人会给你源码。思路大要是这样： 1先学习png文件的格式协议。 2再学习icon文件的格式协议， 3搞清楚上面二个的文件头和数据内容是怎么存放的，然后就是建一个c++项目，用一般的文件操作，将png的文件头读上来，分析，然后将数据读上来。分析完之后，就将它转换成icon的文件头，数据也转成对应的数据，再保存到新的文件就可以了。  上面的内容看起来简单，但是分析一个文件格式要不少时间和功力的。你也可以找一些现成的读取png的源码看一下。  不过如果你只是头疼图标素材，网上应该有一个很好的png转icon的软件。你百度一下就能找到了。 你要实现这个软件，工作量不少，难度也不小，并不是适合练手的项目。 谢谢！！工作量和难度大，可以慢慢来，网上的那些软件谁都能很快学会用，但核心具有竞争力的东西还是要靠自己学，反正是课余弄的，我电脑上很多小工具软件都是自己慢慢完成的，过程很好玩

Image Magick CXImage


Question: 二叉查找树的中序遍历

/* Fig. 12.19: fig12_19.c    Create a binary tree and traverse it     preorder, inorder, and postorder */ #include <stdio.h> #include <stdlib.h> #include <time.h>  /* self-referential structure */ struct treeNode {     struct treeNode *leftPtr; /* pointer to left subtree */    int data; /* node value */    struct treeNode *rightPtr; /* pointer to right subtree */ }; /* end structure treeNode */  typedef struct treeNode TreeNode; /* synonym for struct treeNode */ typedef TreeNode *TreeNodePtr; /* synonym for TreeNode* */  /* prototypes */ void insertNode( TreeNodePtr *treePtr, int value ); void inOrder( TreeNodePtr treePtr ); void preOrder( TreeNodePtr treePtr ); void postOrder( TreeNodePtr treePtr );  /* function main begins program execution */ int main( void ) {     int i; /* counter to loop from 1-10 */    int item; /* variable to hold random values */    TreeNodePtr rootPtr = NULL; /* tree initially empty */     srand( time( NULL ) );     printf( "The numbers being placed in the tree are:\n" );     /* insert random values between 0 and 14 in the tree */    for ( i = 1; i <= 10; i++ ) {        item = rand() % 15;       printf( "%3d", item );       insertNode( &rootPtr, item );    } /* end for */     /* traverse the tree preOrder */    printf( "\n\nThe preOrder traversal is:\n" );    preOrder( rootPtr );     /* traverse the tree inOrder */    printf( "\n\nThe inOrder traversal is:\n" );    inOrder( rootPtr );     /* traverse the tree postOrder */    printf( "\n\nThe postOrder traversal is:\n" );    postOrder( rootPtr );    return 0; /* indicates successful termination */ } /* end main */  /* insert node into tree */ void insertNode( TreeNodePtr *treePtr, int value ) {     /* if tree is empty */    if ( *treePtr == NULL ) {          *treePtr = (TreeNodePtr)malloc( sizeof( TreeNode ) );        /* if memory was allocated then assign data */       if ( *treePtr != NULL ) {           ( *treePtr )->data = value;          ( *treePtr )->leftPtr = NULL;          ( *treePtr )->rightPtr = NULL;       } /* end if */       else {          printf( "%d not inserted. No memory available.\n", value );       } /* end else */    } /* end if */    else { /* tree is not empty */       /* data to insert is less than data in current node */       if ( value < ( *treePtr )->data ) {          insertNode( &( ( *treePtr )->leftPtr ), value );       } /* end if */        /* data to insert is greater than data in current node */       else if ( value > ( *treePtr )->data ) {          insertNode( &( ( *treePtr )->rightPtr ), value );       } /* end else if */       else { /* duplicate data value ignored */          printf( "dup" );       } /* end else */    } /* end else */ } /* end function insertNode */  /* begin inorder traversal of tree */ void inOrder( TreeNodePtr treePtr ) {     /* if tree is not empty then traverse */    if ( treePtr != NULL ) {        inOrder( treePtr->leftPtr );       printf( "%3d", treePtr->data );       inOrder( treePtr->rightPtr );    } /* end if */ } /* end function inOrder */  /* begin preorder traversal of tree */ void preOrder( TreeNodePtr treePtr ) {     /* if tree is not empty then traverse */    if ( treePtr != NULL ) {        printf( "%3d", treePtr->data );       preOrder( treePtr->leftPtr );       preOrder( treePtr->rightPtr );    } /* end if */ } /* end function preOrder */  /* begin postorder traversal of tree */ void postOrder( TreeNodePtr treePtr ) {     /* if tree is not empty then traverse */    if ( treePtr != NULL ) {        postOrder( treePtr->leftPtr );       postOrder( treePtr->rightPtr );       printf( "%3d", treePtr->data );    } /* end if */ } /* end function postOrder */    /**************************************************************************  * (C) Copyright 1992-2010 by Deitel & Associates, Inc. and               *  * Pearson Education, Inc. All Rights Reserved.                           *  *                                                                        *  * DISCLAIMER: The authors and publisher of this book have used their     *  * best efforts in preparing the book. These efforts include the          *  * development, research, and testing of the theories and programs        *  * to determine their effectiveness. The authors and publisher make       *  * no warranty of any kind, expressed or implied, with regard to these    *  * programs or to the documentation contained in these books. The authors *  * and publisher shall not be liable in any event for incidental or       *  * consequential damages in connection with, or arising out of, the       *  * furnishing, performance, or use of these programs.                     *  *************************************************************************/ 这是《C语言大学教程》第六版中第374页的关于二叉树遍历的程序（递归实现），可供参考。

引用 2 楼 my_live_123 的回复:可以递归写就消失一大段代码+1...

可以递归写就消失一大段代码

在代码中有一个break 可不可以优化代码使得break消失


Question: c++中，设计一个程序，可用于进行2,8,10,16进制的转换

引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉   谢谢老师分享！！！

晚上之前给你结果哈

你们函数或者数组学了吗

首先要明白，进制，只是计数进位的规则，进制的转化并不会影响数的实际值。  比如十进制16，转化为16进制就是0x10，不过这只是字面上的改变，实际上其内存中的值是没有任何改变的。  由此，你说的额转化，也只是对显示进行转化，那么有以下方式可以简单实现：  例如有： int n = 15; 现在要将其进行2、8、10、16进制的显示： #include <iostream> #include <bitset> using namespace std;  int main() {     int n = 15;      cout << bitset<4>(n) << endl;   // 二进制显示     cout << oct << n << endl;           // 8进制显示     cout << dec << n << endl;         // 10进制显示     cout << hex << n << endl;          // 16进制显示      return 0; }  值得注意的是二进制显示，bitset后面的尖括号表示二进制的位数，这个位数要给够，否则显示出来的数会被截断导致错误

http://download.csdn.net/my 供参考

你们学到哪里了呢


Question: 大一学生，排列组合问题！

这种题，如果作为ACM的题，应该有明确的输入和输出格式的。你这样的描述，并不是一个合适的计算机题目。

计算机是用穷举法计算问题的，要是你都已经把公式想好了。那就没计算机什么事了。  你把所有的球分配给5个人，然后将甲有a，乙有b之类的情况去掉。然后剩下的就是结果了。

楼主应该是程序新人吧？这里给你说下计算机程序的几个特点，你的问题也就迎刃而解了  1. “计算机是傻瓜”，计算机其实什么都不会，它会的所有东西都是人教他的，比如你的问题，要统计有多少情况，也需要你来教他，这个教他的过程，其实就是编程。换句话说，你会的，你“教给”计算机了它就会，你不会的它也不会。如果你会用排列组合来算，计算机业可以这么算；你会用枚举，计算机也可以枚举等等。  2. “程序尽量高效”，还是以你的问题为例，要统计情况，其实有很多方法都能实现，对于使用者，他们并不关心你怎么实现的，他们只关心结果对不对，因此，在设计程序的时候，要尽可能考虑高效的方法。例如，你的问题，至少有3种方法解决：1. 用排列组合计算；2. 用枚举法；3. 用排除法。 无疑，排列组合之需要几次算数运算，是最高效的；枚举法可以依次枚举所有的情况，再挨个判断是不是合理，然后统计合理的数量；排除法可以先把所有情况统计计数，然后排除不符合条件的，排除法和枚举法都相对低效。 因此这个问题，就用你的排列组合方法就是最好的。  比如你可以编写如下函数来计算“CXX”的值 int CountC (int x1, int x2); // 内部实现就你自己完成了  然后在后面直接调用CountC(4, 1) * CountC(3, 1) * CountC(2, 1) * CountC(2, 1);就能得到你要的结果了。


Question: C语言中关于内存分配以及数据结构相关的问题

引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！老师该如何观察求解  我用的是vs2013

引用 3 楼 lkshflasgla 的回复:弄清“传值调用”和“传址调用”两个概念之后，楼主应该就明白了那位啥那个销毁链表的时候不用传地址就可以释放内存就这点不是很理解

理解和讨论之前请先学会如何观察！

弄清“传值调用”和“传址调用”两个概念之后，楼主应该就明白了

#include<stdio.h> #include<malloc.h> int f(int**p) {     *p=(int *)malloc(sizeof(int)); } int main() {     int *p;     f(&p);     *p=5;     printf("%d",*p);        }   第一例用二级指针，记住指针也是变量

计算机组成原理→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


Question: 求一个c语言程序， vc编译的

有木有人啊啊啊，我要疯了

二楼的大师答案挺好，谢谢了！

//声明一个3*5的数组并初始化，具体数值可以可以是随意的，程序打印出数值，然后数值翻一番，接着再次打印出新数值， //编写一个函数来显示数组的内容，再编写一个数执行翻倍功能。数组名和数组行作为参数由程序传递给函数。 #include <stdio.h> int a[3][5]={     {1,2,3,4,5},     {5,4,3,2,1},     {1,2,3,2,1}, }; void show(int p[][5],int r) {     int y,x;      for (y=0;y<r;y++) {         for (x=0;x<5;x++) {             printf("%3d ",p[y][x]);         }         printf("\n");     } } void mul2(int p[][5],int r) {     int y,x;      for (y=0;y<r;y++) {         for (x=0;x<5;x++) {             p[y][x]*=2;         }     } } int main() {     show(a,3);     mul2(a,3);     printf("\n");     show(a,3);     return 0; } //  1   2   3   4   5 //  5   4   3   2   1 //  1   2   3   2   1 // //  2   4   6   8  10 // 10   8   6   4   2 //  2   4   6   4   2 //


Question: 各位大哥,学完C primer plus之后,应该再学些什么才能深造C呢?

我还是送你一个字吧:敲敲敲!!!!!!!

引用 6 楼 my_live_123 的回复:C陷阱与缺陷 C专家编程 K&R C99标准（参考手册） 大哥哥 你之前就是这么学的吗

先实现二叉树来看看

引用 1 楼 user-12 的回复:不写代码，基础扎实不了的 有写...每天都有写。

引用 5 楼 lovesmiles 的回复:C++必看书目  侯捷的　STL源码剖析 Effective c++ ,  more Effective c++ 《Effective STL》 《Essential C++ 中文版》 《More Exceptional C++ 中文版》 深度探索 C++ 对象模型 <<UNIX环境高级编程>> C++反汇编与逆向分析技术揭秘 这是C++的 我要的是C语言的...

引用 2 楼 FightForProgrammer 的回复:这种问题已经被问烂了。csdn一搜一大把。 最好的就是研究源码。自己下载nginx源码研究吧 即使被问烂了还是没有一个合适的答案

不写代码是不可能打好坚实的基础的。 可以写一些小程序，既锻炼C语言，又有成就感。  可以看一些开源项目。nginx就算了吧。楼主非计算机专业，很多计算机网络的知识应该都没有，很难看懂nginx的

下载研究eMule源代码 下载研究Quake3源代码

C陷阱与缺陷 C专家编程 K&R C99标准（参考手册）

请写一个类似于数据库的小型系统，至少能实现增、改、删，并使用链表和结构体，如果写不出来，那就重新再学C primer plus吧。

C primer plus才看完，处于入门阶段，要写一些代码练习吧，建议从实现一些数据结构和算法入手。。  不用先忙于看其他进阶的书了，看了也白看，你没写一些代码，不会有感觉~~

看开源代码 或者自己写个小软件 看看自己学的怎样

数据结构（C语言）

嗯，前三本能吃透，保证你C一点问题没有！C99标准只是一种手册，必要时候查阅一下了，比任何资料都权威和准确！

不写代码，基础扎实不了的


Question: 关于局部最大值的问题

把数组看成权重,建模成01背包问题，可以用动态规划解决, 比如a[5] f(x) = x0*a[0] + x1*a[1] + ...+ x4*a[4] MAX f(x) xi，i[0, 4]取值0和1，剩下的工作自己处理吧！

找到了，就是这个，谢谢

这是最大子序列和不？ 当，一个子序列和小于等于0 的时候就放弃。。。直到求出最大正数和 这个不是基本算法吗？ 要不要从书里抄一个。。。没有正数的时候，非正数中的最大值就是就是最大和了。

穷举的话，必须有三个循环呀。   坐等算法高手。

有数组A[n], (a[0], a[1], ... a[n - 1]) 求满足 0 <= i <=j <= n-1,  使得 a[i] + a[i + 1] + ... a[j] 值最大的i, j 值？

局部最大？？？

欢迎关注July的博客 http://blog.csdn.net/v_july_v/article/details/6444021


Question: 求解

使用屏幕取词技术或ReadProcessMemory

有什么何解的，这是因为别人根本没有做右键菜单。