Question: 初学C语言，向各位大大求教

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

#include<stdio.h> #include<string.h> int main () { 	char a[]="123456";     char *s; 	s=a;     printf("%c\n",*(s+3));     *(s+3)='a'; 	printf("%c\n",*(s+3));     for(;*s!='\0';s++)         printf("*");     return 0; } 不知道楼主说的什么意思

因为你的指针所指的内容是在常量区的字符串，不能修改 如果需要修改，你需要在使用字符数组在栈上分配或者自己动态分配内存来存 比如：char s[]="123456"; 这样就是在栈上分配的，可以修改

楼上用的是数组 我用的是指针两者不太一样 数组名是右值而 指针是左值

#include <stdio.h> #include<string.h> int main () { 	int i=0; 	char s[]="123456"; 	printf("%c\n",*(s+3)); 	s[3] = 'a'; 	printf("%s\n",s); 	for(;*(s+i)!='\0';i++) 		printf("*"); 	printf("\n"); 	return 0; }  运行结果：   我在VS2010上试是查看和更改都可以的呀，楼主说的每次更改都会爆是什么意思？？？

#include<stdio.h> #include<string.h>  int main ()  {      int i=0;      char s[]="123456";      printf("%c\n",*(s+3));      s[3] = 'a';      for(;*(s+i)!='\0';i++)          printf("*");      return 0;  } 我改成这样就正常了，至于你那样怎么错的，我也不懂，我也是初学指针

那个报错不是数组越界吗

引用 4 楼 morangeouslian 的回复:楼上用的是数组 我用的是指针两者不太一样 数组名是右值而 指针是左值  哦，sorry，我弄错了。我粗心，看程序看成二楼的了。 五楼说得挺好，学习了~~~

这就是字符数组和字符串的区别。你用的那个是字符串，字符串实质上是一个指针指向了一个字符串，并且他们不是分配在同一个段里面，那个字符串被分配在了数据段，不能被修改；而指针被分配在了栈上。当你用字符数组去使用的时候，因为每一个字符都被单独分配了空间，所以用指针去解引用就不会报错。


Question: 新手求助，一个小的习题。希望大神解答。

如果是显示的问题 那就是 printf 打印几个字 如果是输入 米和分米 然后计算多少平方米 这个也好做 只要输入符合标准 然后字符串处理 字符串转成数字 然后计算~~~

你自己都描述不清自己的需求，输入分米长宽，输入米长宽，输出分长*分宽平方分米，米*宽平方米，另外1平米=100平分米。你这个程序真的很简单，如果你是打算学习C语言，那么从头开始慢慢学吧

最好能说明输入及期望输出

你要打印的格式是什么，是xx平方，还是xx㎡  printf("分米面积是：%.2lfd㎡  米的面积是：%.2lf㎡", mianji * 10, mianji); printf("分米面积是：%.2lf平方分米  米的面积是：%.2lf平方米", mianji * 10, mianji); 想要什么格式自己添加

用分米也米分别带入计算过程，希望实现  提示  请输入分米长多少  米长多少    宽也一样，然后结果显示成 xx㎡


你得调试进入程序那些符号才会有效，按F7开始。

Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

引用 2 楼 u010165006 的回复:可能在Dosbox下不支持。 忘了，watch功能应该在运行调式过程中的吧

可能在Dosbox下不支持。

。。。都2016年了再不济也用个VC6吧。。


Question: 思路与代码不符，望指点

引用 1 楼 yaojuntong77 的回复:楼主，你的疑问是什么？  #include <stdio.h>  int main(void) { 	int  m, n, i, j; 	int  a[100][700], b[100][700], c[100][700]; 	char x;  	scanf("%d%d%c", &m, &n, &x); 	for (i=0; i<m; i++) 		for (j=0; j<n; j++) 			scanf("%d", &a[i][j]); 	 	for (i=0; i<m; i++) 		for (j=0; j<n; j++) 			scanf("%d", &b[i][j]);  	if (x == '+') 	{ 		for (i=0; i<m; i++) 			for (j=0; j<n; j++) 				c[i][j] = a[i][j] + b[i][j]; 	}  	if (x == '-') 	{ 		for (i=0; i<m; i++) 			for (j=0; j<n; j++) 				c[i][j] = a[i][j] - b[i][j]; 	}  	for (i=0; i<m; i++) 		for (j=0; j<n-1; j++) 			printf("%d ", c[i][j]);  	printf("%d\n", c[i][n-1]);  	return 0; }  1、数组在定义的时候都已经固定了m和n的值，可是在程序中又出现由用户指定m和n的值，这是第一个与题意不符处； 2、LINE32-34，这一部分代码，逻辑不明晰，边界不知道要表达的是什么，有歧义； 3、输出一行以后，没有换行，导致多行连续在一行输出，一行输出满后自动换行，排版不规则；

#include <stdio.h>  int main(void) {         int m,n,i,j;         static int a[100][700],b[100][700],c[100][700];         char x;         scanf("%d%d %c",&m,&n,&x);         for(i=0;i<m;i++)                 for(j=0;j<n;j++)                         scanf("%d",&a[i][j]);          for(i=0;i<m;i++)                 for(j=0;j<n;j++)                         scanf("%d",&b[i][j]);          if(x=='+') {                 for(i=0;i<m;i++)                         for(j=0;j<n;j++)                                 c[i][j]=a[i][j]+b[i][j];         } else if(x=='-') {                 for(i=0;i<m;i++)                         for(j=0;j<n;j++)                                 c[i][j]=a[i][j]-b[i][j];         }          for(i=0; i<m; i++)                 for(j=0; j<n; j++)                         printf("%d%c", c[i][j], j+1==n ? '\n' : ' ');          return 0; }

楼主，你的疑问是什么？


Question: 单链表的创建和查找的问题

引用 1 楼 adusuccessfully 的回复:楼主的创建链表时，最后加了一段打印测试，这样循环完毕就将*L置为空了，所以在调用查找函数时，就会有指针异常（为空）错误。谢谢，当局者迷。真的是这！

引用 2 楼 yaojuntong77 的回复: #include ... // 需要的头文件  #define TRUE  1 #define FALSE 0 #define OK    1 #define ERROR 0 #define INFEASIBLE -1    typedef int KeyType; typedef int ElemType;  /*************单链表*************************/ typedef struct LNode{ 	ElemType       data; 	struct LNode  *next; } LNode, *LinkList;  int createLinkList(LinkList *L, int array[], int length) { 	int    i; 	LNode *p;   	*L = (LinkList) malloc(sizeof(LNode)); 	(*L)->next = NULL; 	 	// 9到1循环 	for (i=length; i>0; --i) 	{ 		// 生成新结点 		p = (LNode *) malloc(sizeof(LNode)); 		// 一一赋值  		p->data = array[i-1];   // array[8]到array[0]依次赋值  		//把p插入到表头，即从L后面第二个开始放入单链表  		p->next = (*L)->next;   // 先连起p的后指针next  		(*L)->next = p;         // 再把L->next赋值为p，也就是连起p的前指针       	} 	 	//打印测试（第一个结点没用到）  	*L = (*L)->next;  	while(*L) 	{ 		printf("elem test:%d\n",(*L)->data); 		*L = (*L)->next; 	} }  /************问题在这~***************/ int searchLinkList(LinkList L,KeyType key) { 	LNode  *searchP = L->next;          // 指向第二个结点 从这一句开始不能执行！ 	int  j = 1;                         // 计数器j 	while(searchP&&searchP->data!=key)  // 顺指针向后查找，直到p为空 	{ 		printf("遍历的当前结点的值为：%d",searchP->data); 		searchP = searchP->next; 		j++; 	} 	return j; }  int main(void) { 	ElemType  array[9] = {93, 23, 12, 66, 44, 11, 2, 102, 31}; 	int       findNum,  returnIndex; 	LinkList  LK;  	createLinkList(&LK, array, 9); 	printf("请输入要查找的值:"); 	scanf("%d",&findNum); 	returnIndex = searchLinkList(LK,findNum); 	printf("所查点的位置i为（表示没有）:%d\n", returnIndex); }   1、LINE34、35的赋值有问题； 2、LINE38-44导致链表指针指向了尾部空指针位置，返回时会获取到表尾而不是表头，故此时发现指向了NULL； 3、LINE50：为什么要从第二个开始？ 4、LINE51：计数的j为什么是从1开始？  首先谢谢你的回复。 1、        p->next = (*L)->next;   // 先连起p的后指针next          (*L)->next = p;         // 再把L->next赋值为p，也就是连起p的前指针 我自我感觉这里没错啊，后插法插入结点，只是表达上不一样。 函数参数是LinkList *，所以这里*L表示LinkList指针。因此这样调用(*L)->next; 而p在声明时是LNode *p（和LinkList p含义一样），所以是p->next； 这种写法是不是不太好让您误解了？ 2、这里确实是考虑欠周到，已改正，应该设一个新结点p遍历L单链表做打印； 3、因为第一个结点没用到。之前是把数组各个数依次作结点插入到第一个结点后面。所以在查询时也是从第二个结点开始； 我看书上也是空出了第一个结点，不太明白它的用意... 4、因为return回去的值是数字的序号，我希望是从1开始的所以这样写了，应该无大碍。  经过修正程序已经能够正确运行了，谢谢您还有大家。

（线性）动态链表的类型（借助标准库 malloc,free 进行内存管理），大致分两类 1）单向链表 简称单链表 ; 只有一个指向下一个节点的指针  next 2）双向链表 简称双链表  ;有前后两个方向的指针，prep,next分别指向前后两个节点。 每种链表，都可以有带 空头结点和不带空头节点的两种 每种链表，都可以实现循环链表 所以，可以有至少六种链表的实现。  带 空头结点 的链表，实现简单方便。  基本建表方法，有前插法，后插法 两种，前一种，最后的插入数据在最前，后一种按照插入顺序存放。


Question: 求助！！！改了N小时还是出了一些问题

引用 8 楼 Rhinedusk 的回复:引用 7楼user-1 的回复:[quote=引用 6 楼 Rhinedusk 的回复:] [quote=引用 4楼user-1 的回复:][quote=引用 2 楼 Rhinedusk 的回复:] [quote=引用 1楼user-1 的回复:]scanf("%d",student->StudentID  改成  scanf("%d",&student->StudentID   同理其他的一些也要改了谢谢！不过其他的函数还是会崩  发下你改好的代码，我帮你看一下[/quote]已发[/quote]  你的input函数里的p1没有初始化就在用了  另外  scanf("%s",&student->Name);  这句不用 &  ， Name本身是自符数组，Name本身已经算是地址了[/quote]要怎么改正呢[/quote]  这个要看你自己写程序的思路，我没细看你程序要做什么  while(p1->StudentID<student->StudentID&&p1->next!=NULL)  这一句中， p1没有初始化，也就是说他只是一个指针，你还没为他分配内存，就把他拿来用了

引用 7楼user-1 的回复:引用 6 楼 Rhinedusk 的回复:[quote=引用 4楼user-1 的回复:][quote=引用 2 楼 Rhinedusk 的回复:] [quote=引用 1楼user-1 的回复:]scanf("%d",student->StudentID  改成  scanf("%d",&student->StudentID   同理其他的一些也要改了谢谢！不过其他的函数还是会崩  发下你改好的代码，我帮你看一下[/quote]已发[/quote]  你的input函数里的p1没有初始化就在用了  另外  scanf("%s",&student->Name);  这句不用 &  ， Name本身是自符数组，Name本身已经算是地址了[/quote]要怎么改正呢

引用 6 楼 Rhinedusk 的回复:引用 4楼user-1 的回复:[quote=引用 2 楼 Rhinedusk 的回复:] [quote=引用 1楼user-1 的回复:]scanf("%d",student->StudentID  改成  scanf("%d",&student->StudentID   同理其他的一些也要改了谢谢！不过其他的函数还是会崩  发下你改好的代码，我帮你看一下[/quote]已发[/quote]  你的input函数里的p1没有初始化就在用了  另外  scanf("%s",&student->Name);  这句不用 &  ， Name本身是自符数组，Name本身已经算是地址了

引用 4楼user-1 的回复:引用 2 楼 Rhinedusk 的回复:[quote=引用 1楼user-1 的回复:]scanf("%d",student->StudentID  改成  scanf("%d",&student->StudentID   同理其他的一些也要改了谢谢！不过其他的函数还是会崩  发下你改好的代码，我帮你看一下[/quote]已发

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define LEN sizeof(Student) #include <time.h>   typedef struct SIS { //结构体的声明 	long StudentID;    //学号 	char Name[20];  //姓名 	char Sex[10];//性别 	int Age;//年龄 	char TOE[30] ;//Time of Enrollment入学日期 	float GPA;//（加权平均） 	char PhoneNo[100]; //电话号码 	char MailingAddress[100];//邮箱 	struct SIS *next;//指向下一个结构体的指针 } Student;  Student *head;   /////////////////////声明函数/////////////////////// void wellcome();//欢迎界面 void start();//开始界面 int menu();//菜单 int input();//输入/插入 int del();//删除 int search ();//查找 int ALL();//显示全部 ///////////////////////////////////////////////////  void wellcome() { //欢迎界面 	time_t rawtime; 	struct tm * timeinfo; 	time ( &rawtime ); 	timeinfo = localtime ( &rawtime );   	printf("*************************************************\n"); 	printf("*\t\t学生信息管理系统\t\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t\t\tLAB 8\t\t\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t            莱茵出品\t\t        *\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t\t\t\t2.33.ver\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*\t\t\t\t\t\t*\n"); 	printf("*************************************************\n"); 	printf("%s", asctime (timeinfo)); 	printf("Please Press Enter to continue……");  }   void start() { //开始界面 	int a=0; 	int b=0; 	int A=15080121; 	getchar(); 	system("cls"); 	printf("\n\n\n"); 	printf("\t\t学生信息管理系统\n\n\n"); 	printf("\t\t\t2.33.Ver\n\n\n"); 	getchar(); 	system("cls"); 	/*	printf("\t\t请输入用户名和密码，按下Enter继续\n\n\n"); 		printf("\tAdmin:"); 		scanf("%d",&a); 		printf("\n"); 		printf("\tPassword:"); 		scanf("%d",&b); 		if(a==A&&b==A) { 			getchar(); 			system("cls"); 		} else { 			printf("\t\t\t您没有足够的权限！！！！！\nPlease Press Enter to EXIT……"); 			getchar(); 			exit(0); 		}*/ }  int menu() {//菜单 	int shuru=0; 	printf("\n\n\n"); 	printf("\t\t （1）Create a student list\n"); 	printf("\t\t （2）Insert a student\n");//(to the sorted array or the sorted linked list ) 	printf("\t\t （3）Delete a student\n"); 	printf("\t\t （4）Search a student\n"); 	printf("\t\t （5）Display all students\n"); 	printf("\t\t （6）exit\n"); 	printf("\t\t请选择功能:"); 	scanf("%d",&shuru); 	return shuru;  }      int input() {//输入、插入 	Student *p1,*p2; 	Student *student; 	char a = 'y'; 	head = p2 = p1 ;  	system("cls");  	student = (Student*) malloc (LEN); 	printf("\t请按照要求输入\n"); 	while(a=='y'||a=='Y') { 		p2=p1=head; 		printf("\tStudentID："); 		scanf("%ld",&student->StudentID); 		printf("\t"); 		printf("Name："); 		scanf("%s",&student->Name); 		printf("\t"); 		printf("Sex："); 		scanf("%s",&student->Sex); 		printf("\t"); 		printf("Age："); 		scanf("%d",&student->Age); 		printf("\t"); 		printf("TOE："); 		scanf("%s",&student->TOE); 		printf("\t"); 		printf("GPA："); 		scanf("%f",&student->GPA); 		printf("\t"); 		printf("PhoneNo："); 		scanf("%s",&student->PhoneNo); 		printf("\t"); 		printf("MailingAddress："); 		scanf("%s",&student->MailingAddress); 		printf("\n\n\n\n"); 		student->next=NULL; 		fflush(stdin); 		if(head==NULL)head=student; 		else { 			while(p1->StudentID<student->StudentID&&p1->next!=NULL) { 				p2=p1; 				p1=p1->next; 			} 			if(p1->StudentID>student->StudentID) 				if(p1==head) { 					student->next=head; 					head=student; 				} else { 					p2->next=student; 					student->next=p1; 				} 			else p1->next=student; 		} 		student = (Student *) malloc (LEN); 		printf("是否继续添加,输入'y'或'Y'继续\n"); 		a=getchar(); 		fflush(stdin); 	} 	printf("\t\t\t录入成功!\n"); 	free(student); 	return 0; }    int del() {			//删除学生信息 	Student *p1,*p2; 	Student *student; 	int tage = 0; 	long StudentID;  	p1 = head; 	system("cls"); 	if (head == NULL) { 		printf("\t\t无学生信息！！！\nPlease Press Enter to Return……");  		return 0; 	} 	printf("\t\t请输入要删除的学生的学号: ");  	while(p1!=NULL) { 		if(p1->StudentID==StudentID) { 			tage=1; 			if(p1==head)head=head->next; 			else p2->next=p1->next; 			free(p1); 			break; 		} 		p1=p2; 		p2=p2->next; 	} 	if(tage==0) { 		printf("\t\t\t信息不存在!\n"); 	} 	tage=0; 	printf("\t\t\t成功删除息\n"); 	fflush(stdin);   	return 0; }  int search () {	  //查询 	Student *p1; 	Student *student; 	int tage = 0; 	long StudentID;  	system("cls"); 	printf("请输入要查询的学生学号："); 	scanf("%d",&StudentID); 	p1=head; 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} else 		while(p1!=NULL) 			if(p1->StudentID==StudentID) { 				tage=1; 				printf("你查找的学生信息如下:\n"); 				printf("\t\tStudentID：%ld\n",p1->StudentID); 				printf("\t\tName：%s\n",p1->Name); 				printf("\t\tSex：%s\n",p1->Sex); 				printf("\t\tAge：%d\n",p1->Age); 				printf("\t\tTOE：%s\n",p1->TOE); 				printf("\t\tGPA：%f\n",p1->GPA); 				printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 				printf("\t\tMailingAddress：%s\n\n\n",&p1->MailingAddress); 				break; 			}   			else  p1=p1->next; 	if(tage==0)printf("\t\t\t无该学生信息!\n"); 	tage=0; 	fflush(stdin);  	return 0; }  int ALL() { //显示全部信息 	Student *p1; 	p1 = head; 	system("cls"); 	if(head==NULL) { 		printf("无学生信息!\n"); 		return 0; 	} 	while(p1!=NULL) { 		printf("\t\tStudentID：%ld\n",p1->StudentID); 		printf("\t\tName：%s\n",p1->Name); 		printf("\t\tSex：%s\n",p1->Sex); 		printf("\t\tAge：%d\n",p1->Age); 		printf("\t\tTOE：%s\n",p1->TOE); 		printf("\t\tGPA：%f\n",p1->GPA); 		printf("\t\tPhonrNo：%s\n",p1->PhoneNo); 		printf("\t\tMailingAddress：%s\n\n",p1->MailingAddress); 		p1=p1->next; 	} 	return 0; }    main() { 	int choose; 	int x=1; 	head=NULL;  	wellcome(); 	start(); 	while(x) { 		choose=menu(); 		switch(choose) { 			case 1: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 2: { 				input(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 3: { 				del(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 4: { 				search(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 5: { 				ALL(); 				system("pause"); 				printf("Please Press Enter to Return……"); 				getchar(); 				system("cls"); 				break; 			}   			case 6: { 				exit(1); 			}   			default: { 				system("cls"); 				printf("\n\n\n\t\t\t无此功能\n\n\n\n"); 				break; 			} 		}  	} }

引用 2 楼 Rhinedusk 的回复:引用 1楼user-1 的回复:scanf("%d",student->StudentID  改成  scanf("%d",&student->StudentID   同理其他的一些也要改了谢谢！不过其他的函数还是会崩  发下你改好的代码，我帮你看一下

求助啊各位大大


Question: vc测试对了 但提交OJ却错了，请指教

结果已经超出int的范围了，你可以用long long，或者int64_t

int n,i,j,m,k; 改为： unsigned int n,i,j,m,k;试试。


Question: C语言插入排序

这个，写个，或者照书抄个插入排序 调试调试，理解理解，不难的

@@2优化后如下: 		for(j=c;j>0 && a[j-1]>x;a[j]=a[j-1],j--); 		pos = j;

@@1如下:          int a[15]; 	scanf("%d",&n); @@2如下: 		for(j=c,pos=0;j>0;j--) 		{ 			if(a[j-1]>x) 				a[j]=a[j-1]; 			else 			{ 				pos = j; 				break; 			} 		}  	@@3如下: for(i=0;i<n;i++) 		printf("%d ",a[i]);

我自己试了好一会儿，@@2处还不会填空……


Question: 怎么用c语言读取txt中数据

搞不懂楼主的问题点在哪里，你是不知道怎么去读取文本文件呢还是不知道怎么提取固定单词之后的数据呢？ 还有生成一个Word，是指Word文档吗？

先读取一行，然后分析这一行的数据，如下：

FILE *fp fp=fopen("指定txt地址","r"); 而创建word，建议看一下fput或者fprintf函数

我还没学到文件，不过利用输入输出重定向也可以操作文档。


Question: c语言调用函数和指针出问题了，求指点

引用 2 楼 user-3的回复:你的程序的问题很多 就问星号之间的那两段代码的问题，其余的问题我自己觉得还可以搞定，就我问的那个问题我搞不懂，别的地方也无心修改了

引用 4 楼 paschen 的回复:你先把其他的改好了才好帮你调试，比如char *str = (char *)calloc(100,sizeof(char)); #include<stdio.h> #include<stdlib.h> #include<ctype.h> char* str_tok(char *str, char *alpha_cut) {     int i;     int judge = 0;     for(i=0; str[i]; ++i)     {         if(str[i] != ' ' && str[i] != ',')         {             alpha_cut[i] = str[i];             str[i] = ' ';             judge = 1;         }         else if(judge == 1)         {             str[i] = ' ';             alpha_cut[i]='\0';             return alpha_cut;         }     }     return NULL; } int main() {     int i=0;     char alpha_cut[10];//存储分割后的单词     char **store = (char**)calloc(5,sizeof(char*));//存储分割后的字符串     char *ptr = NULL;     int count = 0;     char *str = (char*)calloc(100,sizeof(char));//输入字符串     fgets(str, 99, stdin);     while(1)     {     ptr = str_tok(str,alpha_cut);//分割字符串的函数     store[i] = calloc(10,sizeof(char));     store[i] = ptr; /**strcpy(store[i], ptr)用这种形式会给出两个警告，不知道为什么，求解答;**/     i++;     if(i%5 == 0)         store = (char**)realloc(store, 5*sizeof(char*));     if(ptr == NULL)         break;     }     count=i;     for(i=0; i<count; ++i)         puts(store[i]);     return 0; } 我就是想让这个函数达到和strtok函数类似的功能，只要能把逗号和空格识别并分割开就好了。 但是在这里用“trcpy(store[i], ptr)”就会给警告。也想不到该怎么弄了。而且每次调试提示 address out of bounds，也不会改。

引用 4 楼 paschen的回复:你先把其他的改好了才好帮你调试，比如char *str = (char *)calloc(100,sizeof(char)); 这个类型转换我书上说是默认的自动转换的，不需要添加上。

你的程序的问题很多

还有一个问题，在下边那两行星号之间，有一行代码是：strcpy(store[i], ptr);在这里编译器给了两个警告，如果写成：store[i]=ptr就不会有警告，这是为什么？求点。我书上有的地方的代码是“strcpy(store[i], ptr)”这种形式的，我也看着书敲到过电脑上，而且没警告，但是这次给警告了，不知道为什么，求指教！


Question: c语言 如何宏定义一个指数

printf("%f",N);  你应该用浮点数输出，否则会被截断，结果当然是0了    #include<stdio.h> #define N 1e5 void main() {   printf("%f",N); }

你可以查[u]看宏展开后的代码，确定宏定义有没有问题。 右键源文件——属性——预处理器——预处理到文件，然后重新编译远吗，可在同目录的debug下找到一个与源文件同名后缀是.i的文件，打开跳到main可以查看宏展开后的代码。  不过你的代码输出结果就是0，你可以试一下printf("%d",1e5); 这涉及到double的存储方式。 楼上的long en; en = 1e5; 是把1e5转换成long型，根据规则会舍弃掉小数位，而printf("%d",1e5);是把内存中的1e5以int型读取,这并没有涉及到类型转换，而是“张冠李戴”，比喻不太恰当，你理解即可。 而如果你一定要以%d输出一个double，那么可以指定转换: printf("%d",(int)1e5);

你再试试   #include<stdio.h> #define EN 1e5 void main() { 	long en; 	en=EN;  	printf("%d",en); }   你没定义变量哪. 你要在好好看看 #define, 它只是作了一个简单的替换.  VS指数类型即为double , 默认为8字节, 而%d 为4字节, 所以你用%d, 只返回 EN 的 临时变量 的低4字节, 所以这里为0了 正确指数形式如下. printf("%E", EN);


Question: 关于一个60M的文本全是乱码的问题

估计是编码格式的问题吧 你用一些工具软件打开 可以看到文本格式是Unicode 还是其他的

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。


Question: linux 下主线程如何通知通知子线程退出？

windows 都抄 pthread_cond_t  用 ConditionVariable 了， 谁还用 event 啊。   linux 也有 sleep啊。

有以下几种方式可以通知子线程 1. posix_kill/pthread_sigqueue 发送signal 2. pthread_cond_*，此方式要求子线程去wait这个事件 3. pipe/socket/file event，子线程里需要用epoll去wait  timer现在一般用POSIX per-process timer，或者用timerfd_create创建可被epoll等待的timer fd. 如果timer的数量非常多，比如几千个几万个，一般需要自己维护timer heap了。 要简单模拟，sleep就可以，sleep玩法就多了，有用select实现的，有用alarm实现的，也可以用clock_nanosleep


Question: 四个点怎么判断垂直

4 点 共6条线 一共最多需要判断5*4/2 =20次 有20对直线需要判断

引用 2 楼 qq_33478802 的回复:简单枚举 先枚举其中两个点，求出k1值（k1=(y1-y2)/(x1-x2)）                                    同理求出k2 如果 k1*k2=-1 则   yes 这样是可以的不过，应该考虑除数为零的情况。

如果是浮点数，那只能近似 如果是整型，或者定点数 可以精确求出是否垂直

同一平面上两个向量点积为0则互相垂直。


Question: 怎么我的switch直接跳过了

可能是语法或逻辑不对，贴出来代码看下。

把代码贴出来看看，不然怎么知道问题

无码无真相

楼主，源代码呢？

贴代码，贴代码出来


Question: 诚恳希望站在开发第一线的程序员能给自学者出点题

引用 1 楼 user-2 的回复:比如写个服务，根据电话区号获得天气预报数据，要求： 1. 从配置文件读取服务的配置信息，如数据更新频率，以及允许访问的客户端的IP地址范围 2. 提供基于HTTP的Restful API，可以在浏览器里通过URL访问，比如http://localhost:2080/weather/021就是上海天气预报信息 3. 根据配置文件，定时自动从天气网站获取天气数据，可以是API获取，也可以爬虫自己分析，任选 4. 支持10000个客户端同时访问，每秒能响应10000个以上请求 5. 自己写或者配置个模拟器，对服务进行压力测试 6. 统计服务质量，通过http://localhost:2080/stat，返回响应时间分布，以10%的请求数为单位递进 7. 如果单机性能不够时，如何扩展你的服务到集群？  这是现实项目中最小的模块了，很典型的微服务 谢谢你

好题目，看看


Question: 求助贴！！！思路是什么  一点头绪都没有

你说的不就是思路么？ 维护两个链表，一个是多项式链表，另一个是avail链表，当你多项式要添加node的时候，先去查看avail链表里面有没有分配过得node，有的话就把avail链表里的node摘下挂到多项式的链表中,没有的话再用new从堆上找块内存。当进入下一个运行环节了，老多项式不要了，需要销毁多项式链表，不把它用delete还给操作系统，把它摘下来挂到avail链表中。

没看清你要的是c，把我上面所说的new delete理解成malloc和free，一样的


Question: 求救求救！Dev-C++ 点击调试后不显示调试窗口

在第一行“视图”调出“项目管理”，打勾，在最左边拉出来

首先你得新建一个控制台项目，再把你的源文件加入进去，项目路径最好不要包含中文

你得先选中调试哪一行啊，视频中第13行不是有个红点么？先选中你要调试的行，再调试


Question: 结构体内部是否支持二维指针,一位10年c的老、、

二级指针要初始化（赋值）两次以上 一次对二级指针对象 一次对它指向的 内容(对象)， 如果是动态分配，要对分配的每个对象（一级指针） 初始化一次（可以是malloc 或者new 初始化）

引用 1 楼 sdghchj 的回复:不是人家不支持，还是你没弄懂二级指针。 HOME_SE *home = (HOME_SE *)malloc(sizeof(HOME_SE));  home->ser= (int **)malloc(sizeof(int*)*2);//先申请二级指针指向的内存，假设指向2个指针  home->ser[0] = (int *)malloc(sizeof(int)*2);  home->ser[1] = (int *)malloc(sizeof(int)*2);见笑了，，，

见笑了，见笑了。

结构体内部支持指针的指针的

二维指针是指一个指针指向的地址存储的内容也是一个指针，你的代码明显不是这个逻辑了


Question: switch里面的case,似乎不是一种if判断,而是很复杂的东东

其实switch case很低级的，case只能接int和char常量。select case比它强大得多，可以接各种类型的常量变量甚至表达式。就不知道select case和switch case哪个效率更高，求大佬科普

从上到下寻找对应的值 不匹配就找default 但是由于没有break停止  就又从上到下输出一次呀

switch 用在循环中，switch 内的 break 不能跳出循环， 和if 相比，这是不便之处

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

switch 是跳去执行标号对应的程序段。 case  是标号： break 是跳出这个程序段 default 大概是个 else 差不多的东西。  具体实现，当然要复杂些，因为 case 对应的常量情况比较复杂， 又连续的，有不连续的，而且也不必顺序写。  switch 一般用跳转表实现。 也可能是地址表 简单的，可以直接查表

default 不是最后匹配，而是缺省匹配。 而且 switch 和 if-else 不同。 switch 使用的一种类似查表得方式，根据参数直接找到 case 的入口。 如果和任何入口都不匹配，那么将使用 default 入口，不是一个一个去比较的。 至于他们的位置是无关的， case 和 default 仅仅是标号的，可以作为 goto 的参数的。 break 也仅仅是一个语法，甚至于你可以在 switch 和 循环混合使用 break 语法。（莫名其妙无穷）

case语句根据自己的程序逻辑来确定后面是否加break。 无论default 位置在前还是在后，都是先判断 各个case, 最后才进  default。  无论 进入某个 case 或  default，程序要 执行到 break，或开关的结束 才终止。  default:cout<<"default"<<endl;         case 2:cout<<"2"<<endl;         case 3:cout<<"3"<<endl;         case 4:cout<<"4"<<endl;         case 5:cout<<"5"<<endl; 你这段代码里面没有break语句，所以default后面的语句会继续执行的。

引用 1 楼 wxq714586001 的回复:首先，每个case下要根据情况加上break； （1）这是因为当n=6时不匹配2,3,4,5，所以从default开始执行。由于代码没有break，会依次执行之后的case语句； （2）switch...case...我好像记得编译器是将每个条件判断转换为一个偏移量； （3）可以用gcc或vs看一下汇编；  那么，在下面n=6的情况下:  int main() {     int n=6;     switch(n)     {         default:cout<<"default"<<endl;         case 2:cout<<"2"<<endl;         case 3:cout<<"3"<<endl;         case 4:cout<<"4"<<endl;         case 5:cout<<"5"<<endl;     }     return 0; }  岂不是: 进入switch以后，先case2，不符合，再case3，不合符，再case4，不合符，再case5，不符合，然后default 之后因为没有break，所以case2跳过判断直接执行，case3跳过判断直接执行，case4跳过判断直接执行，case5跳过判断直接执行。  换句话说，case 2其实被执行了两遍，第一遍是刚进入switch的时候，判断是否符合条件，第二遍是default执行完以后，不判断case的条件而直接执行cout<<"2"。 是这样的吗?

引用 7 楼 lm_whales 的回复:switch 在状况比较多， 要执行的代码比较复杂， 尤其是标号连续的时候， 要比if else 高效， 相比之下，很多的if else 嵌套，效率就低了。  n+1 分支的  if(e1)s1； else if(e2)s2; else s3; 的话  如果需要执行到最后两个分支， 需要比较n次。  switch 只对 情况作一次判断 ，含有 defualt 的最多两次，就可以跳入不同分支  从代码上看 switch 语句，代码也比  if(e1)s1； else if(e2)s2; else s3; 可读性好。 结构清晰。  多分支 尽可能，用switch  分支少  if(e1)s1； else if(e2)s2; else s3; 更好。 也就是查表法！ 多谢了！

switch 中 你case defualt 怎么排都不影响，编译器不是一条一条去比较，所以在多分支下效率会比if 高 switch中各选项会被重新排列到一个地址表（有序的）里，然后计算出跳转位置 case后没有break会一直往下掉 想具体了解可以看：《C++反汇编与逆向分析技术揭秘》

引用 1 楼 wxq714586001 的回复:首先，每个case下要根据情况加上break； （1）这是因为当n=6时不匹配2,3,4,5，所以从default开始执行。由于代码没有break，会依次执行之后的case语句； （2）switch...case...我好像记得编译器是将每个条件判断转换为一个偏移量； （3）可以用gcc或vs看一下汇编； 说得对

可能是如下结构, 但不一定是，要看case 值的分布与编译器的支持, 希望能帮到你：  //switch(n) Array[] = {0,label1,label2,label3}; if (n > 0 && n < sizeof(Array)-1) { 	goto Array[n]; } else { 	goto label_default; } //{ label_default: 	cout<<"default"<<endl; label1:					//case 1: 	cout<<1<<endl; 	goto label_end;		//break; label2:					//case 2: 	cout<<2<<endl; label3:					//case 3:	 	cout<<3<<endl;  label_end:	//}


Question: 问一句汇编代码的意思

引用 7 楼 lm_whales 的回复:不是，有虚函数表的通常也会有，运行时信息里面，存放typeinfo中的信息 无虚函数表的，只是直接编译出类型的typeinfo 谢谢解答！

将abcd *的偏移地址放到ecx寄存器中

引用 1 楼 user-2 的回复:将abcd *的偏移地址放到ecx寄存器中 谢谢回复，祝新年愉快！明天结贴。

引用 3 楼 wenpinglaoyao 的回复:[quote=引用 1 楼 user-2的回复:]将abcd *的偏移地址放到ecx寄存器中 abcd是我在程序中自定义的一个类类型，而这个abcd * 的偏移地址是什么意思？这个偏移地址里记录的是类似于的字符串信息吗？[/quote]  可能指向记录了RTTI（运行时类型信息）信息的一项，比如可能是虚表中记录RTTI的一项

引用 2 楼 lm_whales的回复:typeinfo指针和虚函数表指针，很多编译器是放到一起的，第一项是typeinfo指针 是不是程序编译时，所有程序员自定义的类类型，程序都会额外生成一些有关这些类类型的额外记录信息，比如这些类型的声明名称等

引用 1 楼 user-2的回复:将abcd *的偏移地址放到ecx寄存器中 abcd是我在程序中自定义的一个类类型，而这个abcd * 的偏移地址是什么意思？这个偏移地址里记录的是类似于的字符串信息吗？


Question: 菜鸟求教，请指点

谢谢哈 知道了

#include <stdio.h> #include <string.h> int main(void) { 	int n,i,j,k; 	char a[100001],b[100001],c[100001],d[100001]; 	scanf("%d",&n); 	for(k=1;k<=n;k++) 	{ 		printf("输入字符串a："); 		scanf("%s",a); 		printf("%s",a);  		printf("输入字符串b："); 		scanf("%s",b); 		printf("%s",b); 		for(i=0;a[i]!='\0',b[i]!='\0';i++) 		{ 			if(a[i]!=' ') 				c[i]=a[i]; 			if(b[i]!=' ') 				d[i]=b[i]; 		} 		c[i] = '\0'; 		d[i] = '\0';  		if(strcmp(c,d)==0) 			printf("equal\n"); 		else 			printf("not equal \n"); 	} 	return 0; }  把楼主的程序改了改~~~ 我还没搞明白为啥scanf可以，而getchar()不可以。


Question: 求帮我看一道非常简单的作业，看了好久我不知道出错在哪

#include <stdbool.h> #include <stdio.h> #include <stdlib.h>  #define STACK_SIZE 100  void make_empyt(void); bool is_empty(void); bool is_full(void); void push(char ch); int pop(void); void stack_overflow(void); void stack_underflow(void);  char contents[STACK_SIZE]; int top = 0;  int main(void){ 	char c; 	int count = 0; 	char sub; 	printf("Enter parenteses and/or braces: "); 	while((c = getchar()) != '\n'){ 		if (c == '(' || c == '{'){ 			push(c); 		}else{ 			sub = pop(); 			if(sub == '(' && c == ')'){ 				count++; 			}else if(sub == '{' && c == '}'){ 				count++; 			}else{ 				top++; 			} 		} 	} 	 	if (is_empty()){ 		printf("Parenteses/braces are nested properly"); 	}else{ 		printf("not"); 	} 	 	return 0; }  void make_empty(void){ 	top = 0; }  bool is_empty(void){ 	return top == 0; }  bool is_full(void){ 	return top == STACK_SIZE; }  void push(char ch){ 	if(is_full()) 		stack_overflow(); 	else 		contents[top++] = ch; }  int pop(void){ 	if (is_empty()) 		stack_underflow(); 	else 		return contents[--top]; }  void stack_overflow(void){ 	printf("Stack overflow"); 	exit(EXIT_SUCCESS); }  void stack_underflow(void){ 	printf("Stack underflow"); } 我也不太懂，抄书上的不知道make_empty怎么用


Question: C语言的自定义函数类型该怎么选择？

函数的返回值类型取决于函数的反馈信息，也就是函数执行完之后要不要告诉别人它执行的结果，这个结果用什么方式表达合适。

取决于数据类型的范围：Numeric limits

引用 2 楼 paschen 的回复:你的len是int类型，如果你返回char 、 short这些类型，数据就被截断了 就是说，比如你可以去试一下，字符串长度为500，用char返回，你就发现结果不对了！ 我刚才按照你说的试了，确实是那样的，谢谢。

恩，我刚才试了，确实是你说的那样。

应该根据是否需要返回值。如果需要返回值，根据返回值类型来定义函数的类型。


Question: C语言

告诉你一个办法，开一块缓冲区，若干行 能够容纳所有内容 先把所有数据输出到缓冲区 然后从缓冲区复制到屏幕上

我调试了 可以达到你的效果

int _tmain(int argc, _TCHAR* argv[]) { // 	Test *t = new Test; // 	t->alloc(5); //  // 	delete t; // err  	int i; 	printf("  0 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");  	int j =0; 	for(i=0;i<80;i++) 	{	 		if(i%16==0) 		{ 			printf("%2.2d ",j*10); 			j++; 		} 		printf(" %2.2d",ReadCmos(i));		 		if (i%16==15) 		{ 			printf("\n"); 		}			 	}  // 	for(i=0;i<0x80;i++) // 	{ //  // 		printf(" %2.2x",ReadCmos(i)); // 		if((i+1)%16==0) // 			printf("\n"); //  // 	} //	getch(); 	system("pause"); 	return 0; }


Question: scanf录入浮点数组的问题

最后贴出解决问题后的代码， 把fflush 改成了rewind解决了输入非数字死循环的问题 在判断中加入了对换行符的判断 if (c == 32 || c == 44 || c =='\n')，解决不能正确录入的问题 double f[2][3] = { 0.0 }; 	char c = 0; 	for (int i = 0; i < 2; i++) 	{ 		for (int j = 0, x = 0; j < 3; j++) 		{ 			if (scanf("%lf", &f[i][j]) == 1) 			{ 				c = getchar(); 				if (c == 32 || c == 44 || c =='\n')//本意是检测是否用空格或','间隔 					continue; 				else { printf("请用空格间隔两数：\n"); i = -1; rewind(stdin); break; } 			} 			else { printf("输入有误，请重新输入：\n"); i = -1; rewind(stdin);  break; } 			//如果未能读入一个double，则清空缓冲区，然后跳出，继续执行外部for 		} 	}

引用 5 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }  老师的代码我大概看懂了，是把输入的数据先存入一个字符串里，然后再从字符串读取数据，只是我发帖的原意是想解决错误。 不过老师的输入方式确实挺好，以后借鉴，十分感谢。

引用 1 楼 qq_29120981 的回复:第十三行输入的不是如果不是数字scanf尝试读取，然后读取失败并把那个字符留在缓冲区，所以你得在内层循环快结束时加个清空输入缓冲区。再者，用fflush清空输入缓冲区，它的行为是未定义的  谢谢，一直在vs下学习的c，现在才知道fflush(stdin)是msdn定义的  引用 2 楼 weixin_30460121 的回复:1、当输入最后一个数后，跟着输入的是回车‘\n’，所以c不等于空格或“，”，执行第一个else语句。 你说的这个问题在输入1 2 3 4 5 6的时候是不存在的，不知道为什么   引用 3 楼 paschen 的回复:猜想你说的循环可能是因为输入流被破坏了 循环的原因找到了，是因为使用了未定义的fflush(stdin)，导致没有成功清空输入缓冲区，换成rewind(stdin)就可以了

第二个问题，说错了，没有看到fflush……

猜想你说的循环可能是因为输入流被破坏了

1、当输入最后一个数后，跟着输入的是回车‘\n’，所以c不等于空格或“，”，执行第一个else语句。 2、当你输入一个字母时scanf读取失败，直接跳到第二个else语句，由于字母一直存在缓存里，所以scanf一直重复读取失败，重复之行第二个else语句

引用 5 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }   scanf("%lf", &f[i][j])的问题，这个地方~~~~ scanf 不可以区分逗号分割  但是可以区分空格 分割 所以只要有逗号，基本上有问题呢~~~


Question: C语言,请问我想将一个文件内的数据读到一个字符串指针,我该怎么给这个指针分配内存呢,就算一开始分配200个,可如果文件的数据多余200呢,我该怎么动态分配?

引用 5 楼 anzi5091104 的回复:用fread一块一块来读   我的天，这都12月份的。。

用fread一块一块来读

仅供参考：//将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

先获取文件长度

这个时候需要在堆上动态开辟内存吧


Question: 宏定义高级用法求解

谢谢，已经结贴。 帮我想起了曾经的用法，很久不用都不记得了，谢谢。

#error "__TEST_K_ is not defined"


Question: 正向驱动调用和反向驱动调用的区别

逆向 windows 驱动？

你是指Linux驱动还是电机驱动啊？请不要这么不服责任的问问题，浪费CSDN硬盘。


Question: 刚学了数据结构-动态数组 后写的，请各位大大指正

参考include\vector的内容。

vector大小是动态可增长的。你不必考虑自己手动分配或释放内存，也不必担心内存泄漏 使用起来比较方便

引用 2 楼 ruying1389279 的回复:引用 1 楼 qwer_boo 的回复:可以尝试实现vector的功能，自动扩展长度只要有数据输入，就自动扩展数组长度是吗？ 比如插入数据，当数组满了，则自动扩大数组长度，使插入可以继续。

可以尝试实现vector的功能，自动扩展长度

代码太长~~~不想看·~~ 没法编译·~~ 如果用C++不用这么长的代码~~~ 感觉~~~


Question: 求问关于c语言的作业出现错误问题

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

你要的是什么结果


Question: C语言和C++的关系就相当于javascript和Jquery的关系吗？

C++中兼容C的部分可以看作不是C++。

Jquery只是javascript的库啊  C 和C++是两种语言

jquery 就对javascript的一个扩展，封装，就是让javascript更好用，更简单。人家怎么说的来着，jquery就是要用更少的代码，漂亮的完成更多的功能。 c语句是面向结构的语言，c++是面向对象的语言，C++从根本上已经发生质飞跃，并对c进行丰富的扩展。

C 与 C++ 在基本语句上的差距也是挺多的。


Question: 小白求助!

楼上正解。楼主要注意像++这样的操作符，前置与后置是有很大区别的！

while (a--) 中 条件不满足时，a-- 为0 最后a就成 -1 了


Question: C语言代码，许多不足，望各位指教，谢谢

引用 4 楼 Lxl_12345 的回复:[quote=引用 3 楼 paschen 的回复:] 你要查找姓名，可以依次比较每个candidate中的name，如果有找到，则输出对应的那个candidate中的其他信息 请问要怎么查找呢？[/quote]  写个循环逐个比较，直到找到满足的

引用 3 楼 paschen 的回复:你要查找姓名，可以依次比较每个candidate中的name，如果有找到，则输出对应的那个candidate中的其他信息 请问要怎么查找呢？

有个字符串查找函数的

用手机上的，等我用电脑时再仔细看看，尽量为您解惑，特此留爪～～～


Question: [Error] cannot convert 'score*' to 'a    5位学生4门课学生成绩管理系统具体要求：

除了楼上说的，你的cal  min_    max_这几个函数都没有返回值

95行： float cal(struct student s[],struct  all []); 应改为 float cal(struct student s[],struct score all []);  216行： float cal (struct student students[],struct  all []){ 应改为 float cal (struct student students[],struct score all []){

引用 4 楼 学编程的老司机的回复:为什么我编译之后没有呢，还有你这个系统好像有漏洞啊 你的意思是你那没有错能运行。还是没有这个错有其他的了

为什么我编译之后没有呢，还有你这个系统好像有漏洞啊

引用 1 楼 user-4的回复:编译器提示在那一句? 抱歉回复不来，请看一下下一个回复

//调用求各科最高分的函数max()    max_(students); min_(students); cal(students,all);//       这里 提示cannot convert 'score*' to 'all*' for argument '2' to 'float cal(student*, all*)' sort(students);

编译器提示在那一句?


Question: malloc函数的疑问？

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

引用 7 楼 u010087712 的回复:[quote=引用 5 楼 paschen 的回复:] [quote=引用 4 楼 wenpinglaoyao 的回复:] [quote=引用 1 楼 paschen的回复:]你已经越界写了，把不属于你申请的空间给覆盖掉了，没问题只是运气好，如果没猜错，你free(p)的时候你程序就崩了 大牛能解释下为什么free时会崩溃吗？[/quote]  因为DEBUG下编译器可能会在free时检查是否越界了，你分配的内存头尾一定区间都会被特定字符填充[/quote]  你确定？我的理解是，内存在分配的时候一般是以4k为单位（一个内存页）来将虚拟内存映射到物理内存，不可能申请一个字节，就只分配一个字节，所以，你越界存储是没问题的，但是如果你存的数据超过4k(4*1024)个字节，必定段错误！ free的时候崩溃是因为你越界存储以后，破坏掉了堆（本质就是个链表）的内部维护结构（这个结构保存有当前块多大，下一个块在哪儿，上一个块在哪儿等信息），free的时候无法识别要释放的块多大等信息就崩溃了。还记得new了一个数组以后怎么delete么，delete[] p ,不需要像申请一样指定长度啊，因为从第一个地址，就能找到最后一个[/quote] 不好意思说错了，不是从第一个地址，就能找到最后一个 -> 内部维护有块的大小

引用 5 楼 paschen 的回复:[quote=引用 4 楼 wenpinglaoyao 的回复:] [quote=引用 1 楼 paschen的回复:]你已经越界写了，把不属于你申请的空间给覆盖掉了，没问题只是运气好，如果没猜错，你free(p)的时候你程序就崩了 大牛能解释下为什么free时会崩溃吗？[/quote]  因为DEBUG下编译器可能会在free时检查是否越界了，你分配的内存头尾一定区间都会被特定字符填充[/quote]  你确定？我的理解是，内存在分配的时候一般是以4k为单位（一个内存页）来将虚拟内存映射到物理内存，不可能申请一个字节，就只分配一个字节，所以，你越界存储是没问题的，但是如果你存的数据超过4k(4*1024)个字节，必定段错误！ free的时候崩溃是因为你越界存储以后，破坏掉了堆（本质就是个链表）的内部维护结构（这个结构保存有当前块多大，下一个块在哪儿，上一个块在哪儿等信息），free的时候无法识别要释放的块多大等信息就崩溃了。还记得new了一个数组以后怎么delete么，delete[] p ,不需要像申请一样指定长度啊，因为从第一个地址，就能找到最后一个

其实，release 也可能会出问题 因为大部分内存管理程序，都会在 分配的内存前后，设置某种数据结构。 这部分被用到的，没有分配给你的内存， 很有可能会用于做内存管理的记录， 越界写的话，很可能会，导致整个内存管理系统崩溃。

引用 4 楼 wenpinglaoyao 的回复:[quote=引用 1 楼 paschen的回复:]你已经越界写了，把不属于你申请的空间给覆盖掉了，没问题只是运气好，如果没猜错，你free(p)的时候你程序就崩了 大牛能解释下为什么free时会崩溃吗？[/quote]  因为DEBUG下编译器可能会在free时检查是否越界了，你分配的内存头尾一定区间都会被特定字符填充

引用 1 楼 paschen的回复:你已经越界写了，把不属于你申请的空间给覆盖掉了，没问题只是运气好，如果没猜错，你free(p)的时候你程序就崩了 大牛能解释下为什么free时会崩溃吗？

写代码时，每个程序员都是最致命的黑客

引用 1 楼 paschen 的回复:你已经越界写了，把不属于你申请的空间给覆盖掉了，没问题只是运气好，如果没猜错，你free(p)的时候你程序就崩了 多谢，free的时候果然奔溃了


Question: gcc多文件编译的问题？

C  默认函数原型为 int function(...);

引用 1 楼 user-2 的回复:巧合。运气。不要靠运气生活。 如果fun函数需要的参数、提供的返回值与调用者提供的参数、需要的返回值类型不同，好运就不会自动来了。谢谢，在自学，遇到很多问题和书上的不一致。所以多问问


Question: 各位大神帮忙解释下代码

不可以debug调试模式看看嘛？

这是什么单片机程序吧，速度传感器的？


Question: 请问怎么将后缀为FNC的文件还原成TXT文件？谢谢。

你要知道FNC文件的格式，然后按照这个格式去解析出来就行了


Question: 先学了python对学C有好处吗

C语言是比较难，但大学学的C语言内容比较少，就学一些基本语法，没什么好担心的！个人认为学Python对学C没什么帮助，如果是对Python感兴趣可以学学！

引用 4 楼 wenpinglaoyao 的回复:Python比c容易一些，但c语言更接近汇编，能让您更容易理解程序运行机制  那是无法通过学C得到的，得从《深入理解计算机系统》这样的砖头书开始学，特别适合非科班的人补充基础知识。

非科班的，建议学Java/Python，可以快速的结合本行做点东西，有需要了再学C

C学完之后会感觉python很简单，不过就像楼上说的，如果仅仅是想为了学好C而去学Python的话就没必要浪费时间了，直接C吧

如果只是想学c的时候好入门一点而学python的话，还是直接学c吧

Python比c容易一些，但c语言更接近汇编，能让您更容易理解程序运行机制

C比python难吧，个人意见

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

还是说先学C语言对学python有好处？零基础，想多学项技能


Question: 求解 在dos框画出一个树的图？的方法

用EasyX画图可以精确到像素点，而在文本模式下用字符画图，容易对不准不好控制。 EasyX自带有完整的手册，兼容Turbo C的BGI绘图接口函数。

可以用中序遍历，输出命令行tree的那种效果

是 树 不是数 抱歉

EasyX。很多年前用Turbo C画过，很简陋。

仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdio.h> #include <stdlib.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     TextOut(hdc,10,10,"地球人都知道！",14);     MoveToEx(hdc,5,5,NULL);     LineTo(hdc,300,  5);     LineTo(hdc,300, 60);     LineTo(hdc,  5, 60);     LineTo(hdc,  5,  5);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getchar();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

献上程序，希望对楼主有帮助。 #include<iostream> #include<string> #include<cstdlib> #define N 100 using namespace std;  string replace(string &s){     string ss;     for(int i=0;i<s.size();i++){         if(s[i]!='|')ss.append(".");         else ss.append("|");     }     return ss; }  class Node{ public:     int  value;     Node *left;     Node *right;     string s;//该节点对应的一行字符串     int   n;//0、1、2分别代表根节点、左孩子、右孩子      Node(int value=0,int n=0){         this->value=value;         this->n=n;         this->left=NULL;         this->right=NULL;         this->s.append(itoa(value,new char[10],10));     }     void addNode(int value=0){         //保证有孩子的节点对应的字符串末尾有"-|"         if('|'!=s[s.size()-1])s.append("-|");         string ss;         int index;         //判断新节点添加到那一边         if(value<=this->value){             //若没有左孩子,则添加为该节点的左孩子             if(NULL==this->left){                 left=new Node(value,1);                 //新节点是父节点的左孩子，这时如果父节点也是其上一层节点的左孩子，那么把前面的都换成点，否则只把前面的数字换成点                 if(1==this->n){                     ss=replace(s).substr(0,s.size()-1);                     index=ss.rfind("|");                     if(index!=string::npos)ss=ss.substr(0,index)+"."+ss.substr(index+1);                     ss.append("|-");                 }else{                     ss=replace(s)+"-";                 }                 left->s.insert(0,ss);             }else{                 this->left->addNode(value);             }         }else{             //此处同上             if(NULL==this->right){                 right=new Node(value,2);                 if(2==this->n){                     ss=replace(s).substr(0,s.size()-1);                     index=ss.rfind("|");                     if(index!=string::npos)ss=ss.substr(0,index)+"."+ss.substr(index+1);                     ss.append("|-");                 }else{                     ss=replace(s)+"-";                 }                 right->s.insert(0,ss);             }else{                 right->addNode(value);             }         }     }     void print(){         if(NULL!=this->right)this->right->print();          cout<<s<<endl;          if(NULL!=this->left)this->left->print();     } }; int main(){     int n[N],len=0;      freopen("data.in","r",stdin);     while(cin>>n[len++]);     len--;      Node node(n[0]);     for(int i=1;i<len;i++){         node.addNode(n[i]);     }     node.print();      return 0; }

请看图片，此程序读取输入的数字，将以第一个数字作为树根，后面的每一个数字按照比自己小的放在左边，比自己大的放在右边的规则，打印出树结构


Question: 求帮助改改我我运行的错误 5位学生4门课学生成绩管理系统

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


Question: 求教 为什么会出现乱码

引用 2 楼 apocalyps3 的回复:[quote=引用 1 楼 paschen 的回复:] 你把问题说清楚，你"c:\\1.txt","r" 文件内容是什么，要怎么输入会出现乱码，然后我帮你看一下  我想要把输入的学生信息存到文本里。可是我不太会链表，有错误。[/quote]  你还是没说重点，你"c:\\1.txt","r"这个文件里的内容是什么 你输出的这几个数都是来自文本，要你文本有内容  比如我测试的；  文本内容如下：   显示：

引用 1 楼 paschen 的回复:你把问题说清楚，你"c:\\1.txt","r" 文件内容是什么，要怎么输入会出现乱码，然后我帮你看一下  我想要把输入的学生信息存到文本里。可是我不太会链表，有错误。

请检查fscanf函数的返回值。

如果你文本文件里边能够输出结果，那么说明程序没问题，但是出现乱码就说明保存的数据有问题，检查一下是否保存的是想要保存的数值，有可能你是把变量地址搞错了


Question: 给指针赋值时应该是p=a还是p=&a

对于数组a，数组名其实就是地址了，不用取地址符，至于要不要加括号，看你想做什么了，如果想看第二个元素值，那是需要加括弧的。

#include <stdio.h> main() {     int a[10];     int i=0;     for(i=0;i<10;i++)     {         a[i]=i+1;     }     int *p;     p=a;     for(i=0;i<10;i++)     {         printf("%d\n",*(p+i));     }     return 0; }

p是int*指针，而数组名a相当于是int*常量，所以正规是p=a; 但是，任何类型指针的值都是一个地址值，在32位系统里就是一个32位整数，所以如果不考虑安全访问方面，任何类型指针间是可以相互间强制转换的。 而&a是取数组a的地址，相当于int (*) [10]类型的数组指针，所以p=&a也是可以的，只看编译器检查规则是否够严格了，即便很严格也可以p=(int*)&a强制转换。 而数组名a表示的是指向数组首地址的常量指针，与数组地址&a是一样的，所以p=a和p=&a效果是一样的。 *p+1加不加括号的问题得看你到底要干嘛，星号运算级高于加号。


Question: 菜鸟求助，关于C语言结构体赋值问题

在 arr[0].first = "li"; 这句话中，"li"是一片内存的首地址，也就是“char *”，而char first[10]是在结构体声明时，开辟的一片固定长度、固定地址的10个字节的空间。 两边划等号，是不对的。 可以使用sprintf或者memcpy等函数，向这10个字节的内存中填写内容。

另外错误提示的意思是数组名是个常量，你不能让他重新去指向一个字符串"li"

字符数组不能像你这样赋值，你需要使用strcpy复制进去

char first[10]; 这里的first是常量不能修改的。  你的代码可以改成这样 arr[0].first = "li"; strcpy(arr[0].first, "li");


Question: 求教

#include <stdio.h>  struct st  {  	int x, y; }; struct st data[2] ;  int main ( )  { 	scanf("%d%d", &data[0].x, &data[0].y); 	data[1] = data[0]; 	printf("%d %d\n", data[1].x, data[1].y); 	return 0;  }

#include <stdio.h> #include <string.h> struct A {  	int x,y; 	double ave;  };  int main() {  	struct A a[3]; 	int i; 	for (i=0;i<3;i++) 	{ 		scanf("%d%d",&a[i].x, &a[i].y); 		a[i].ave = (a[i].x + a[i].y) / 2.0;  	} 	for (i=0;i<3;i++) 	{ 		printf("%d %d %lf\n",a[i].x,a[i].y,a[i].ave);  	} 	return 0; }


Question: 求教


Question: c语言问题，不懂打代码，求解

用单项链表能练习到东西

这问题用链表还复杂了,不如直接用指针动态开辟数组

小朋友，手拉手，玩老鹰抓小鸡游戏，嘿嘿  在最前面挡住老鹰的第一个小朋友就是链表的表头，后面每一个小朋友（包括第一个）都是一个数据节点。  他们为了不被老鹰抓到，需要手拉手连接起来。。。  链表即为此。。。

引用 3 楼 whoozit 的回复:单向链表。。。。不知道单向链表是什么

也一个变量来接收用户输入的数据。 然后遍历查找，这都是最基础的

打酱油 。。。。

单向链表。。。。

引用 楼主 Lxl_12345 的回复:下面红色字体这一项代码怎么打？求解。谢谢……   有十个选手参加歌唱比赛，十个裁判对每个选手的演唱进行打分，去掉一个最高分，去掉一个最低分，剩下分数的平均值最为每位选手的最后成绩 要求：1、采用结构体定义每个选手的参赛编号，姓名以及十个裁判打出的分数；       2、从键盘输入每个选手的相关信息：参赛编号，姓名和十个得分；       3、计算每位选手的最后得分，并按分数由高到低排序；       4、查询功能：输入参赛选手的编号或姓名，便可输出该选手的得分以及排名； 以上功能采用菜单操作方式，即从键盘输入1到3这三个数，分别完成以上2到4的功能。 50元我帮你写

建议楼主先把基础打好了~


Question: 一个用C语言写的系统，出了点小问题

学号唯一并且升序存入文件 这个功能呢 就是考虑数据结构的问题 我觉得可以模拟std::MAP中的来实现 写个C版本的呗 std::MAP 底层用红黑树实现

鼠标右键点cmd窗口左上角图标，属性： 字体：新宋体，大小：12 布局、窗口大小、宽度：120，高度：50 确定。

学号升序的实现应该在insert函数里面实现吧，再插入时进行排序，将学生信息存入相应的位置，至于学号的唯一性也应该在插入时进行判断啊，在插入时查看之前的学生信息有没有和要插入的学号有重复。


第一个scanf改为 scanf("%d %d",&a,&b);

第一个scanf中，格式串中有逗号，输入时就必须有逗号，否则不但本次scanf输入不成功，还影响后面的所有输入


Question: 未定义标识符printf

#include <stdio.h> 你没有包含头文件吧

引用 1 楼 user-6 的回复:#include <stdio.h> printf 的头文件~~~

确实够新的 ，遇到这个问题先查一些C/C++手册包含所在函数的头文件吧

#include <stdio.h>

C语言： #include <stdio.h>  C++语言： #include <iostream> using namespace std;

#include <stdio.h>


Question: 关于不做处理的问题

if (n != 0)     .... else     break;


Question: 求解算法问题，资源分配！！跪！！

建楼

emmmmm，把这块田看做是一个二维数组 然后定义一个枚举 用来表示有矿 无矿那些，然后再按条件给数组赋值 打印

引用 19 楼 zhao4zhong1 的回复:不考虑矿，不中心对称，又必须分别包含中心的四块大小和形状都相同的可行的划分方案谁能想的出来？  您的算法也是在“中心对称”这个前提下做出的吧，所以要证明一下吧。

引用 4 楼 zhao4zhong1 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 和A四连通且占据9个方块且中心对称且不占B、C、D的划分方法可以靠楼主的人脑遍历出所有可能。 在所有这些可能中挑出恰好可让四个公司都包含煤矿铁矿各一个的哪些方案。 [/quote]  前面的思路，我和您的一样，但是我卡在要证明他是中心对称这个问题上了。 怎么证明啊？

这是个神奇的算法

我看到楼主的这个题，让我想起了当时我上初一时的一类数学题。  感觉这个题，完全可以静下心来，自己去遍历的推论、演算出来！  穷举法一直是一个非常棒的方法，但是对于一些次数较多的问题，穷举法就不适合了。这个还得去寻找其他的简便方法解决。

之前没看到，已推荐

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

解释一下程序吧。。我不太懂

引用 8 楼 zhao4zhong1 的回复:求版主推荐！Orz  没太看明白。。能不能解释一下

求版主推荐！Orz

//有一个6x6的矿区，分布有4处铁矿和4处煤矿，中心2x2已预先分配给4家公司经营。 //要求给出所有可能，将整个矿区划分为形状相同，内部连通，且恰好包含铁矿煤矿各一处的4块 //给这4家公司。 // 012345  012345  012345 //0...... 0.....M 0CCAAAA //1...... 1....I. 1CCABAA //2..AB.. 2...M.. 2CAABBB //3..CD.. 3..MMI. 3CCCDDB //4...... 4..I... 4DDCDBB //5...... 5....I. 5DDDDBB #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> char W[6][6]; char M[6][6]; int Y[9],X[9]; char S[1000][37]; char s[37]; int N=0; void divide(int y,int x,int L) {     int m,y1,x1;     int b,y2,x2;      Y[L]=y;X[L]=x;     W[  y][  x]='A';     W[  x][5-y]='B';     W[5-x][  y]='C';     W[5-y][5-x]='D';     if (L>=8) {         for (y1=0;y1<6;y1++) {             for (x1=0;x1<6;x1++) {                 s[y1*6+x1]=W[y1][x1];             }         }         s[36]=0;         for (m=0;m<N;m++) if (0==strcmp(s,S[m])) break;         if (m>=N) {             strcpy(S[N],s);             N++; //          printf("N%d:\n",N); //          for (m=0;m<6;m++) printf("%.6s\n",s+m*6); //          printf("\n"); //          getchar();             if (N>=1000) {                 printf("N>=1000!\n");                 exit(1);             }         }         W[  y][  x]='.';         W[  x][5-y]='.';         W[5-x][  y]='.';         W[5-y][5-x]='.';         return;     }     for (b=L;b>=0;b--) {         y2=Y[b];x2=X[b];         if ((y2>0 && W[y2-1][x2  ]=='.')          || (x2>0 && W[y2  ][x2-1]=='.')          || (y2<5 && W[y2+1][x2  ]=='.')          || (x2<5 && W[y2  ][x2+1]=='.')) {             for (m=0;m<4;m++) {                 switch (m) {                 case 0://上                     y1=y2-1;x1=x2;                     if (y1<0) continue;                 break;                 case 2://左                     y1=y2;x1=x2-1;                     if (x1<0) continue;                 break;                 case 1://下                     y1=y2+1;x1=x2;                     if (y1>5) continue;                 break;                 case 3://右                     y1=y2;x1=x2+1;                     if (x1>5) continue;                 break;                 }                 if (W[  y1][  x1]=='.'                  && W[  x1][5-y1]=='.'                  && W[5-x1][  y1]=='.'                  && W[5-y1][5-x1]=='.') {                     divide(y1,x1,L+1);                     W[  y1][  x1]='.';                     W[  x1][5-y1]='.';                     W[5-x1][  y1]='.';                     W[5-y1][5-x1]='.';                 }             }         }     } } int main() {     int i,n,a,b,t;     int d[36];     int y,x;     int Ic[4],Mc[4];      srand(time(NULL));     n=36;     for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */     for (i=n;i>0;i--) {/* 打乱0～n-1 */         a=i-1;b=rand()%i;         if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}     }     for (y=0;y<6;y++) for (x=0;x<6;x++) {         W[y][x]='.';M[y][x]='.';     }     for (i=0;i<4;i++) M[d[i]/6][d[i]%6]='I';//铁     for (i=4;i<8;i++) M[d[i]/6][d[i]%6]='M';//煤     for (y=0;y<6;y++) {         for (x=0;x<6;x++) {             printf("%c",M[y][x]);         }         printf("\n");     }     printf("\n");     divide(2,2,0);     n=0;     for (i=0;i<N;i++) {         for (t=0;t<4;t++) {Ic[t]=0;Mc[t]=0;}         for (y=0;y<6;y++) {             for (x=0;x<6;x++) {                 if (M[y][x]=='I') Ic[S[i][y*6+x]-'A']++;                 if (M[y][x]=='M') Mc[S[i][y*6+x]-'A']++;             }         }         if (Ic[0]==1 && Ic[1]==1 && Ic[2]==1 && Ic[3]==1          && Mc[0]==1 && Mc[1]==1 && Mc[2]==1 && Mc[3]==1) {             n++;             printf("%d:\n",n);             for (t=0;t<6;t++) printf("%.6s\n",S[i]+t*6);             printf("\n");         }     }     if (n==0) printf("Impossible.\n");     return 0; } //..M... //I.M..I //...... //...M.M //...I.. //....I. // //1: //CCCAAA //CAAABA //CCABBA //DCCDBB //DCDDDB //DDDBBB // //2: //CCCAAA //CCAAAA //CCABBA //DCCDBB //DDDDBB //DDDBBB // //

有谁做出来了吗   求源码！！！

楼上图案考虑不是很全，楼主脑补吧。

引用 1 楼 zhao4zhong1 的回复:和A四连通且占据9个方块且中心对称且不占B、C、D的划分方法可以靠楼主的人脑遍历出所有可能。 在所有这些可能中挑出恰好可让四个公司都包含煤矿铁矿各一个的哪些方案。

先确定总站的方案，四个位置各占一个 然后为每个公司确定煤和铁的方格 按照最短路径选出， 最后，分割剩余未分割的区域


Question: C语言指针问题

引用 3 楼 qq291582781 的回复:[quote=引用 1 楼 user-2 的回复:] 没有问题，什么错误 发帖的时候顺手删了一行代码 p=a;  为什么在12行中，f函数返回的数是 a，但并不用把a赋值给p[/quote]  f函数就没有返回值，调用函数时传递参数就是把a的值复制给实参p

引用 1 楼 user-2 的回复:没有问题，什么错误 发帖的时候顺手删了一行代码 p=a;  为什么在12行中，f函数返回的数是 a，但并不用把a赋值给p

可以运行，楼主说的“运行不了”是指什么

没有问题，什么错误


Question: 请问这个程序为什么运行不了，VC中，可以再函数名里面int 指针吗

// afxp.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include <stdlib.h> #include <stdio.h> void swap(int*a,int *b);   int _tmain(int argc, _TCHAR* argv[]) { 	int a=1; 	int b=2; 	swap(&a,&b); 	printf("a=%d,b=%d\n",a,b); 	system("pause"); 	return 0;     } void swap(int *a,int *b) { 	int t=0; 	t=*a; 	*a=*b; 	*b=t;  }

printf("a=%d,b=%d\n",a,b);   main函数中你的a和b不是指针，不能写成*a *b

printf("a=%d,b=%d\n",a,b);

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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: 字符加密

if then

std::string input, output; if (input == "2F541B503DB46CA0DF42968BB001D649") {     output = "824168136ty"; }

加密算法简单的情况下通过推测能推测出，楼主只给出这么点东西，谁能猜出算法？

这样谁能猜到加密方式？


Question: C语言急求 停车场管理

建议楼主先把基础打好，一步一步来

好多错误哦，怎么办？

main函数里面改了一下你看看

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <conio.h> #include <string.h> #define  MAXLEN1  12   //设置停车场最大长度 #define  MAXLEN2  3    //设置便道最大长度  typedef struct STOP_CAR//定义栈的结构体(停车场和临时停车场) { 	char   platename[8];    //车牌号码 	int    arr_time;        //停车时间 	int    lea_time;        //离开时间 	int    stoptime;        //停车时长 	int    flag;            //车辆状态信息 	float  charge;          //费用 	struct STOP_CAR *next;  //指针域 }S_car,*pS_car;  typedef struct PAVEMENT_CAR//定义队列的结构体(便道) { 	char    platename[8];        //车牌号码 	struct  PAVEMENT_CAR *next;      //指针域 }Q_car,*pQ_car;  struct PAVEMENT_LINK//设立队列指针节点(便道) { 	Q_car  *front;              //队首指针 	Q_car  *rear;               //队尾指针 }; typedef struct PAVEMENT_LINK Q_link;  Q_link lineset(Q_link link,int len)//设立空便道,形参类型是队头指针(地址)和长度(车位数目) { 	int i; 	for(i=1;i<=len;i++) 	{ 		if(link.front == NULL) 		{ 			link.front = (Q_car *)malloc(sizeof(Q_car)); 			if(link.front == NULL)//安全性 			{ 				printf("No enough memory to alloc!\n"); 				getch(); 				exit(0); 			} 			link.front->next = NULL; 			link.rear = link.front; 		} 		else 		{ 			link.rear->next = (Q_car *)malloc(sizeof(Q_car)); 			if(link.rear->next == NULL) 			{ 				printf("No enough memory to alloc!\n"); 				getch(); 				exit(0); 			} 			link.rear = link.rear->next; 			link.rear->next = NULL; 		} 	} 	return link; }  S_car * parkingset(S_car * top,int len)//设立空停车场,形参类型是栈顶指针(地址)和长度(车位数目) { 	int i; 	S_car *s = NULL; 	S_car *sr ; 	sr = top; 	for(i=1;i<=len;i++) 	{ 		s=(S_car *)malloc(sizeof(S_car));//为新节点申请动态内存空间 		if(s == NULL)//申请空间失败后,退出程序 		{ 			printf("No enough memory to alloc!\n"); 			getch(); 			exit(0); 		} 		if(top == NULL)//若栈顶为空,则将新建节点的指针变量地址传给栈顶 		{ 			top = s; 		} 		else          //若栈顶不为空,则将下一个新建变量的地址传给上一个刚连接的节点 		{ 			sr->next = s; 			sr = sr->next; 			sr->next=NULL; 		} 		sr=s; 	} 	return top;   //返回栈的头结点指针(地址) }  Q_link Inline(Q_link link,int *num,int len)//单辆车车入便道 { 	int i; 	Q_car * r = link.front; 	if(*num == 1)	//判断便道是否有车 		printf("便道没有车在等候。\n"); 	else 		printf("便道有车在等候。\n"); 	if(*num > len) 		printf("便道已满车,请等待车辆进入后再来。\n"); 	for(i=0;i<len;i++) 	{ 		if(*num-1 == i) 		{ 			printf("请输入车牌号码:"); 			scanf("%s", link.front->platename); 			printf("车牌号码为%s的车辆已在%d号便道位中等待。\n",link.front->platename,*num); 		} 	} 	(*num)++; 	return link; }  void Push_stack(Q_link link,S_car * top,int len1,int *num1,int *num2)//停车(入栈,具体是将队列里的节点的内容复制到栈的节点上,并记录入停车场的时间) { 	int i; 	int n = 1; 	char platename[8]; 	Q_car * start1 = link.front;//指向队头 	Q_car * trans = link.front;//便道向前移动一步 	S_car * start2 = top;//指向站头 	S_car * find = top;//该指针用于寻找元素  	if(strcmp(start1->platename,"")==0) 		printf("便道没有车,请让至少一辆车进入便道。\n"); 	else 	{ 		if(strcmp(start2->platename,"") == 0) 			printf("停车场已满,请等至少一辆车离开之后再进入。\n"); 		else 		{ 			for(i=1;i<=(*num2);i++) 				find = find->next; 			strcpy(find->platename,start1->platename); 			printf("车牌号码为%s的车辆已从1号便道车位转入%d号车位。\n",find->platename,*num2); 			(*num1)--; 			(*num2)++; 			find->flag = 1;//标记停车信息 			strcpy(link.front->platename,""); 			trans = start1; 		} 	} 	if(strcmp(trans->platename,"") == 0) 	{ 		for(i=1;i<=(*num1);i++) 		{ 			trans = trans->next; 			if(i==1) 			{ 				strcmp(platename,trans->platename); 				trans = start1; 				strcmp(start1->platename,platename); 				n++; 			} 			else 			{ 				strcmp(platename,trans->platename); 				trans = start1; 				for(i=1;i<(*num1);i++) 				{ 					trans = trans->next; 					if(i ==(*num1)-1) 						strcmp(trans->platename,platename); 				} 			} 			trans = start1; 		} 	} }  char * Pop_Stack(S_car * top1,S_car * top2,int *num3,int len1)//车离开 { 	int i; 	int j; 	int point; 	char platename[8]; 	S_car * start1 = top1; 	S_car * find1 = top1; 	S_car * start2 = top2; 	S_car * find2 = top2; 	do 	{ 		printf("请输入离开的停车场车位编号(1~%d):",len1); 		scanf("%d",&point); 		printf("Enput error!Please input again. \n"); 		system("cls"); 	} 	while(point<=1 || point>=len1); 	for(i=1;i<=point;i++) 	{ 		find1 = find1->next; 	} 	if(strcmp(find1->platename,"")==0) 	{ 		printf("该车位没有车辆,无法进行操作。\n"); 		find1 = start1; 	} 	else 	{ 		for(i=1;i<point;i++) 			find1 = find1->next; 		if(strcmp(find1->platename,"") == 0) 		{ 			find1 = find1->next;	 			strcpy(platename,find1->platename); 			printf("车牌号码为%s的车辆已从%d号停车位离开停车场。\n",platename,point); 			strcpy(find1->platename,""); 			find1 = start1; 		} 		else 		{ 			find1 = start1; 			for(i=1;;i++) 			{ 				if(strcmp(find1->platename,"") != 0) 				{ 					for(j=1;j<len1;j++) 					{ 						find2 = find2->next; 						if(j = (*num3)) 						{ 							strcpy(find2->platename,find1->platename); 							printf("车牌号码为%s的车辆已从%d号停车场车位转入%d号临时停车场车位。\n",find2->platename,point,(*num3)); 							(*num3)++; 						} 					} 				} 			} 		} 	} 	printf("车牌号码为%s的车辆已从%d停车位离开停车场。\n",platename,point); 	return platename; }  int Menu(int select)//选择菜单显示 { 	printf("本程序功能如下:\n"); 	printf("1、单个汽车进入便道(请输入1)\n"); 	printf("2、单个汽车进入停车场(请输入2)\n"); 	printf("3、单个汽车离开停车场(请输入3)\n"); 	printf("4、退出程序(请输入0)\n"); 	printf("请输入数字进行功能选择:(输入数字后,按回车结束)\n"); 	scanf("%d",&select); 	return select; }   int main()//主函数 { 	int len,len1;//len是便道车位数,len1是停车场位数      	printf("请规定便道车位位数(最大不超过%d):",MAXLEN2); 	scanf("%d",&len); 	printf("请规定停车场车位位数(最大不超过%d):",MAXLEN1); 	scanf("%d",&len1); 	int select,select0; 	select=0;///////////////////////////////////赋值       	int p = 1; 	int * num1 = &p;	//录入当前便道车辆数 	int q = len1; 	int * num2 = &q;	//录入当前停车场停车位号 	int r = len1; 	int * num3 = &r;	//录入当前临时停车场停车位位号 	char * leave = {NULL};  	Q_link link; 	S_car * top2 = NULL; 	S_car * top1 = NULL;//初始化停车场栈顶 	link.front = NULL;//初始化队首指针 	link.rear = NULL; //初始化队尾指针  	  	//建立便道部分 	link = lineset(link,len);     //将队列指针的地址赋值给头指针 	printf("便道初始化完成！\n");  	//停车场部分 	top1 = parkingset(top1,len1); 	printf("停车场初始化完成！\n");  	//临时停车场部分 	top2 = parkingset(top2,len1);  	do 	{ kaiguan: 		select = Menu(select); 		switch(select) 		{ 		case 1 : 			system("cls"); 			Inline(link,num1,len); 			break; 		case 2 : 			system("cls"); 			Push_stack(link,top1,len1,num1,num2); 			break; 		case 3 : 			system("cls"); 			leave = Pop_Stack(top1,top2,num3,len1); 			break; 		case 0 : 			system("cls"); 			printf("Thank you for your using!\n"); 			getch(); 			exit(0); 		default: 			printf("Input error!Please input again.\n"); 		} 		printf("Do you want to continue?\n");//询问是否继续操作 		printf("If yes,input 1.\n"); 		printf("Else,input 0.\n"); 		scanf("%d",&select0); 		system("cls"); 		if(select0 == 1) 			goto kaiguan; 	} 	while(select0 != 0 ); 	return 0; }

好多变量都没赋值你就开始用了


Question: C语言IO文本读写及操作

仅供参考：//文件1中的内容排序并去重,结果保存到文件2中 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; int c,n,hh,i,L; FILE *f; char ln[MAXCHARS]; int ignore_case=0; int icompare(const void *arg1,const void *arg2) {    return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) {    return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) {     if (argc<3) {         printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");         printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);         return 1;     }     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not find file %s!\n",argv[1]);         return 1;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(f);         printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 2;     }     n=0;     hh=0;     i=0;     while (1) {         if (NULL==fgets(ln,MAXCHARS,f)) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);             while (1) {                 c=fgetc(f);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             strcpy(buf+i,ln);i+=MAXCHARS;             n++;             if (n>=MAXLINES) {                 MAXLINES2=MAXLINES*2;                 if (MAXLINES2==1280000) MAXLINES2=2500000;                 buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);                 if (NULL==buf2) {                     printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     printf("WARNING: Lines >%d ignored.\n",MAXLINES);                     break;//                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(f);     if (n>1) {         if (ignore_case) qsort(buf,n,MAXCHARS,icompare);         else qsort(buf,n,MAXCHARS,compare);     }     f=fopen(argv[2],"w");     if (NULL==f) {         free(buf);         printf("Can not create file %s!\n",argv[2]);         return 2;     }     fprintf(f,"%s\n",buf);     if (n>1) {         if (ignore_case) {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if (stricmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         } else {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         }     }     fclose(f);     free(buf);     return 0; }


Question: 把一句打乱的话重组

要不你去 高性能 算法模块问问？

采用树结构 数据字典？ 这个算法不是很清楚~~~~

无非就是加密，获取字库文件加密就行了

引用 3 楼 zhao4zhong1 的回复:仅供参考：#include <time.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> char *family="王李张刘陈杨黄赵吴周徐孙马朱胡郭何高林罗郑梁谢宋唐许韩冯邓曹彭"              "曾肖田董袁潘于蒋蔡余杜叶程苏魏吕丁任沈姚卢姜崔钟谭陆汪范金石廖"              "贾夏韦傅方白邹孟熊秦邱江尹薛闫段雷侯龙史陶黎贺顾毛郝龚邵万钱严"              "覃武戴莫孔向汤"; char  *boyname="伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生"                "龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中"                "茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友"                "裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭"                "鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘"; char *girlname="秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳"                "素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦"                "晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊"                "薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育"                "滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽"; char  *mixname="澜华秋娣桂凤旭先丽娜朋政香致仁晨云雅柔泰宜宁善荷娅腾霭妍彬欢媛琼婉"                "青树淑浩露彩风红璧璐杰波萍全纨纯江义君健飞羽震春振凡薇龙才航豪德翔"                "胜思黛菁发爽园克昌茂艳军嘉影进珠辉朗炎环永姬婵丹瑾维世荔勇枫刚蓓毅"                "惠亨保士雄琬霄素友群哲强勤康芸峰筠元菊若厚鸣英志楠达东亚锦艺兰仪慧"                "山可广霞国娟信武清兴琰中庆聪成翰冠贵言婕馨心卿琛菲裕芝诚伊学榕固荣"                "晶博娴希梁雁妹松瑞苑燕邦策斌翠珊月飘河美姣育宁子力时民昭怡明辰蕊奇"                "功莎叶眉会栋冰新磊承轮瑶馥之伯彪建茜寒林坚敬安岩欣颖莺祥海茗良悦乐"                "启巧晓以亮盛有婷爱梅顺壮宏生竹谦倩莲玉钧思玲利真平滢韵佳珍琳琴洁福"                "娥静莉星超和凝家伟光梦文芳瑗融舒富岚天琦雪泽弘咏枝秀芬贞绍鹏蓉涛伦"                "行俊毓"; FILE *fp; char tmp[2000*(6+1)+1]; int make(char *filename , char *bgx , int bgxnum) {     int num,i,n,y,z;     while (1) {         puts("\n注意:一次最多能生成2000个.\n");         printf("你准备生成多少个姓名?：");         fflush(stdout);         rewind(stdin);         scanf("%d",&num);         if (1<=num && num<=2000) break;     }     fp=fopen(filename,"r");     if (fp!=NULL) {         int x;         fclose(fp);         printf("警告:准备生成的%s已经存在!\n",filename);         puts(" 1.追加文件内容");         puts(" 2.覆盖文件内容");         puts(" 0.取消本次操作");         printf("请做出选择：");         fflush(stdout);         rewind(stdin);         scanf("%d",&x);         switch (x) {         case 0:             puts("\n已经取消本次操作!");             getch();             return(0);         break;         case 1:             fp=fopen(filename,"a");             if (fp==NULL) {                 printf("追加%s文件内容失败!可能文件具有只读属性或者正被使用!",filename);                 getch();                 return(1);             }         break;         case 2:             fp=fopen(filename,"w");             if (fp==NULL) {                 printf("覆盖文件%s内容失败!可能文件具有只读属性或者正被使用!",filename);                 getch();                 return(1);             }         break;         default:             puts("你没有做出有效的选择,按任意键返回主菜单!");             getch();             return(0);         }     } else {         fp=fopen(filename,"w");         if (fp==NULL) {             puts("创建文件失败!!");             getch();             return(1);         }     }     y=0;z=1;     for (i=0;i<num;i++) {         n=rand()%100*2;         tmp[y]=family[n];         tmp[z]=family[n+1];         y+=2;         z+=2;         n=rand()%bgxnum*2;         tmp[y]=bgx[n];         tmp[z]=bgx[n+1];         y+=2;         z+=2;         if (rand()%2==1) {             n=rand()%bgxnum*2;             tmp[y]=bgx[n];             tmp[z]=bgx[n+1];             tmp[z+1]='\n';             y+=3;             z+=3;         } else {             tmp[y]='\n';             y++;             z++;         }     }     tmp[z-1]='\0';     fputs(tmp,fp);     fclose(fp);     printf("批量姓名已经输出到文件：%s",filename);     getch();     return(0); } int main() {     int slt;      srand(time(NULL));     while (1) {         puts("\n批量姓名生成器v1.0 By.morning----QQ:88072010\n");         puts(" 1.生成男子名");         puts(" 2.生成女子名");         puts(" 3.生成混合名");         puts(" 0.退出本程序");         puts("--------------------------------");         printf("请选择：");         fflush(stdout);         rewind(stdin);         scanf("%d",&slt);         switch (slt) {             case 1:make( "boyname.txt", boyname,150);break;             case 2:make("girlname.txt",girlname,149);break;             case 3:make( "mixname.txt", mixname,299);break;             case 0:return 0;             default: continue;         }     } }   谢谢您的耐心回答，我先试试，谢谢！

中文是博大精深的，同一句话打乱后可能重组成N种不同的意思，如果那么方便就实现，老外学中文语法就不用那么困难了，只要把想说的词拿来组合一下就生成了

仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }


Question: 字符串归类问题

引用 6 楼 qq_33553283 的回复:。。。好吧 原来 isStr 是自己定义的一个 bool类型  啊。。。那这个只能在 C++ 才能运行吗？我看 bool是 C++ 特有的  你要用int表示也行  另外如果回复请引用我内容，否则可能没看到你的回复

还有 isStr 这个函数 怎么来的 我看 一般的 字符串函数库 没有 isStr 这函数啊

bool isStr = false;  这一行的意思能不能解释一下 。。。。 谢谢

按你要求改的，加了个变量判断是否是在引号内的字符，不懂再回复   #include <stdio.h> #include <stdlib.h> #include <cstdlib> #include <iostream> #include <ctype.h>  void find_maohao(); void find_number();  int main() { 	char src[]="0 \"a3c5\" 2 1 4 \"b=5,c=4\""; 	int i,a; 	char *p; 	char *q; 	bool isStr = false; 	for(i=0;i<strlen(src);i++) 	{ 		if(src[i]=='"') 		{ 			isStr = !isStr; 			if(isStr) 				find_maohao(); 			continue; 		} 		if(!isStr && isdigit(src[i])) 		{ 			find_number(); 		} 	} 	printf("\n"); 	return 0; }  void find_maohao() { 	printf("A"); }  void find_number() { 	printf("B"); }

参考《编译原理》中的词法分析和有限状态自动机。 //有字符串 //1_22_333,,4444__55555,_666666 //需要解析为 //1 //22 //333 //_ //4444 //55555 //666666 #include <stdio.h> char s[]="1_22_333,,4444__55555,_666666"; char c,*p,*p1; int st; void main() {     st=0;     p=s;     while (1) {         c=*p;         if (0==c) {             switch (st) {             case 1:printf("_\n");    break;             case 2:printf("%s\n",p1);break;             }             break;//         }         switch (st) {         case 0:                  if ('_'==c) {                            st=0;}             else if (','==c) {                            st=1;}             else             {p1=p;                       st=2;}         break;         case 1:                  if ('_'==c) {                            st=1;}             else if (','==c) {printf("_\n");              st=1;}             else             {p1=p;                       st=2;}         break;         case 2:                  if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}             else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}             else             {                            st=2;}         break;         }         p++;     } } //1 //22 //333 //_ //4444 //55555 //666666

问题是 进入if（src[i]==‘“’）后 下一步该如何判断才能达到我想要的结果呢？ 吧 ”a3c5”“b=5,c=4“分别看成一个字串呢？ （请不要使用strtok 函数。。。这个 楼主试过了 在双引号中没有空格的情况下才能用。。。所以 请用这方法，，， 如何解？）


Question: c语言中可以直接输出数据类型范围的函数没？

Numeric limits

引用 1 楼 jiht594 的回复:INT_MAX 引用 2 楼 paschen 的回复:http://book.2cto.com/201401/38965.html 引用 4 楼 zhao4zhong1 的回复:打开这两个文件看看： include\limits.h include\float.h 引用 6 楼 qq_29120981 的回复:四楼正解！整型limits.h浮点型float.h 引用 5 楼 zhouxiaofeng1021 的回复:C语言中有宏定义 C++就是着这些宏定义上封装了一层  谢谢大家的回答，现在知道了。

四楼正解！整型limits.h浮点型float.h

C语言中有宏定义 C++就是着这些宏定义上封装了一层


Question: 指针的调用问题//基础问题

引用 2 楼 u010033882 的回复:函数声明里面的*a和*b没有定义类型!  #include <stdio.h> void swap(int*a,int *b); main() {     int a=1;     int b=2;     swap(&a,&b);     printf("a=%d,b=%d\n",*a,*b);     return 0; } void swap(int *a,int *b) {     int t=0;     t=*a;     *a=*b;     *b=t;   } 这就可以了

引用 4 楼 kimi013 的回复:调用时  swap(a, b);应该是&变量 取地址吧

调用时  swap(a, b);

定义了也不管用啊

函数声明没有类型！！！！！


Question: double和float的问题

浮点数格式 http://bbs.csdn.net/topics/390676437

引用 2 楼 u012033027 的回复:刚才笔误。  改成double之后 scanf中的"%f"应该改成"%lf" 嗯嗯精度不一样

跟float double 精度有关， float 精度低

这跟编译器有关 因为%lf没有直接进入标准

浮点运算误差。  浮点型转整型时不会四舍五入，而是直接截断。

浮点数只要在精度范围就对的, 跟整数不一样 c=floor(1000*a);

呃。。。楼上的关于lf和f的输入问题，当时敲代码的时候注意了。然后我想说的是关于其他的，因为这个数据的原因，我又写了一个代码。 #include"stdio.h" int main() {     float a;     double b;         for(a=10,b=10;a<20,b<20;a+=0.01,b+=0.01)         if(a!=b)         printf("%f   %lf\n",a*1000,b*1000); } 之后发现float和double显示的数不很一样，几位小数之后开始出现偏差。然后从0试到100，全都这样。 呃。。。求解

楼上正解！用%g让编译器自动选择

%g

浮点数造成精度不同的导致，很多十进制浮点数没办法在二进制下精确表示  如果要转int，应该用四舍五入，否则只会把小数部分截断  1.0000001 变成 1， 而0.99999999 将变成0

刚才笔误。  改成double之后 scanf中的"%f"应该改成"%lf"

改成double之后 scanf中的"%f"应该改成"%ld"


Question: 为什么found函数运行不了呢？大神求解答

BiTrNode* a=CreateBiTree();存在问题，并不是正确构建树 只是申请的内存，但是里面什么数据也没有存放，你把数据存放到了array里面了

我是想先创建一个空树，把数据先存数组，然后再构建二叉排序树

found中a里什么也没有， 你仅仅只是申请了一片空间，并没初始这片空间


Question: 关于交换函数……

赵老师的太深奥了，暂时还看不太懂

仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

void swap(int a,int b) {     int t=0;     t=a;     a=b;     b=t; } 这个函数中void swap(int a,int b)其中int a，int b是函数的形参，跟你的全局变量a,b不是一个变量，只是名字相同。 如果你的swap(int a,int b)的形参变量修改一下名称，你会明白为什么 void swap(int d,int e) { 	int t=0; 	t=d; 	d=e; 	e=t; }


Question: C语言 赋值问题

c语言和c++是不同的语言 vc6.0下可以正常编译，前提是c++工程

C++是另一种语言 学习C语言时，说源程序文件可以是cpp的 纯粹是误人子弟

首先要明白c和c++是两种不同的语言，不要认为两者语法完全一样，另外，本句中加了括号，逐个翻译并不会出问题

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

引用 5 楼 user-5 的回复:a=(a=b)=3*4; 这个语句等价于  (a=(a=b) )=3*4;  3*4仍是赋值给左值a 整个执行过程是： a = b;  a=a;  a=3*4;  说错，应该是 a = b; a = 3*4; a = a;

引用 3 楼 Emp_blood 的回复:书上说（a=b）不能作为左值，，，但是我在dvc中却能运行出结果 看一下，源程序文件名是 .cpp 吗？ C++中， (a = b) = 3*4;  是可以的。 即使在C++中，a =  (a = b) = 3*4;  也是未定义行为。 看书要看好一点的书。

书上说（a=b）不能作为左值，，，但是我在dvc中却能运行出结果


Question: 求教大神math头文件里究竟是怎样的算法？哪么变态

Compiler Intrinsics

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

移位开方算法： 把数按照2Bits一节分成若干节 逐次开方 每节对应开方结果的一位,根 r初始化为0 第一步，r左移一位 设置一个数表示余数remain,，先取第一节放在余数尾部 如果当前余数 >=2r+1  则r加一，remain减 2r+1否则不加 如此循环直到需要的精度为止。 步数总和- （原始数据的字位数+1）/2 是小数位数 如果余数为0 就可以终止了。然后计算下位数。平方根就求出来了 这样计算的平方根是精确的平方根。可以任意精度计算。也可以四舍五入（0舍1入）   引用 12 楼 lm_whales 的回复:有一种开方指令的实现。和手动开方相似  移位开方，可以对整数开方，应该也不慢 毕竟 80Bits 浮点数也只是64BIts尾数 先对指数部分开方只是个简单的除以2操作 64Bits 尾数，即便开方成64BIts 也只是64步而已，不能算慢 CPU内部硬件运算，比CPU对外的指令快多了， 即便用微码实现也比用 高级语言快。

有一种开方指令。和手动开方相似  移位开方，可以对整数开方，应该也不慢 毕竟 80Bits 浮点数也只是64BIts尾数 先对指数部分开方只是个简单的除以2操作 64Bits 尾数，即便开方成64BIts 也只是64步而已，不能算慢 CPU内部硬件运算，比CPU对外的指令快多了， 即便用微码实现也比用 高级语言快。

CPU硬件实现的浮点算法，应该都是比较快的，因为硬件可以并行计算 而且频率比外部要高

好多 CPU 已经有开平方指令了。

windows的计算器用的是泰勒展开, sqrt以前是牛顿迭代, 现在不知道有没有改了

引用 17 楼 醉花阴柳的回复:关于开方的有一个不可思议的代码段，楼主搜索 由sqrt引发的血案 这篇博文看看吧 http://m.blog.csdn.net/blog/dl0914791011/41241637

一般数学函数。 都是直接使用浮点运算器FPU对应的功能 （指令） 早期，有软件仿真FPU硬件,执行浮点寄存器指令的。 (例如TC,BC 就有，这是可选项。可以硬件执行，也可以选仿真执行) 如今应该没有了

一般来说就是fsqrt指令，或者用SSE的sqrtss、sqrtsd指令，二者性能大致相当，在较新的处理器上都是10几个时钟周期，不过fsqrt涉及到浮点load/store，比SSE的load/store要慢一些，但是它的精度是最好的。

引用 2 楼 paschen 的回复:直接看他的汇编不就知道了 看不懂汇编，咋学啊？

引用 8 楼 baidu_32238993 的回复:[quote=引用 2 楼 paschen 的回复:] 直接看他的汇编不就知道了 看不懂汇编，咋学啊？[/quote]  一般来说标准库提供的效率都相对较高，而且通用性强 math.h中很多算法都直接使用的汇编指令来写，所以效率会很高，但我具体也没研究

引用 4 楼 CharlesSimonyi 的回复:math.h的源代码是可见的，可以跟进去看看 我逐语句调试，然后直接就跳过去了...真的跳过去了

Fast inverse square root 虽然这不一定是math.h中的开方算法，但它真的很快。

《C标准库》一书可供参考

math.h的源代码是可见的，可以跟进去看看

无代码无真相啊

直接看他的汇编不就知道了

但是我发现我写的指数函数意外的竟然比math里的效率高。主要是开方，哪怕是泰勒展开的计算量也不止如此啊，math里是怎么开方的?


Question: 求助ＡＣＭ中的“runtime erro”

要多写几个测试用例 试试 比如边界值啊 条件覆盖等 可能存在一些问题 不能通过他的测试用例

附上改好的代码：#include"stdio.h" #include"stdlib.h" #define MAX 1001 float play() { 	float a[4]={0}; 	float S_f,t_x,t_y,tmp,total; 	S_f=0;t_x=0;t_y=0;tmp=0;total=0; 	scanf("%f %f %f %f",&a[0],&a[1],&a[2],&a[3]); 	if(a[0]<=a[1]){ 			return a[3]/a[0];	 			} 	S_f=a[1]*a[2]; 	t_x=a[3]/a[0]; 	t_y=(a[3]-S_f)/a[1]; 	 	while(t_x<t_y) 	{ 		tmp=S_f/(a[0]-a[1]); 		S_f+=tmp*a[1]; 		t_y=(a[3]-S_f)/a[1]; 		total+=tmp;  		} 	total+=t_x;  	return total; }  int main(){ 	//freopen("input.txt","r",stdin); 	int times=0; 	int i=0; 	float result[MAX]={0}; 	scanf("%d",×);	 	for (i=0;i<times;i++) 	{ 		result[i]=play(); 		} 	for(i=0;i<times;i++) 	{ 		printf("Case #%d: %.3f\n",i+1,result[i]); 	} 	return 0;	 }

确实是初始化ＭＡＸ的问题。题目要求中有Ｔ<=1000,因此将ＭＡＸ设置为１００１就ＯＫ了

引用 1 楼 user-2 的回复:1. 输入的times有可能大于MAX 2. 被除数可能为0，比如a[0]-a[1], a[0], a[1]等; 或者被除数太小导致除法结果溢出 请仔细阅读错误信息，应该可以看到原因。 谢谢，受教了，我改一改试试看。


Question: 程序加入freopen后输入不正确

检查下freopen函数的返回值

大概是没有真正打开那个文件。检查下文件位置

加头文件了吗？（都有小半年没做这个了，生疏了。）


Question: 关于cpu计算出错的问题

引用 15 楼 DelphiGuy 的回复:这个应该就是你用的power()、qrt()和库函数之间的误差造成的。 你可以使用如下函数直接FPU计算分的sin、cos值来保证精度： double sinm(double x) {   static const double K = 3.1415926535897932 / 10800;    __asm{     fld qword ptr x     fmul qword ptr K     fsin   } }  double cosm(double x) {   static const double K = 3.1415926535897932 / 10800;    __asm{     fld qword ptr x     fmul qword ptr K     fcos   } }我已经解决了这个问题了，代码写错了。

double qrt(double x) { double t=0,y=1; int i=0; t=y/2; while(i++<60000) { if(power(t)>x) {	y=t; t=t/2; } else if(power(t)==x) 	return t; else if(power(y)==x) 	return y; else if(power(t)<x) 	t=(t+y)/2; } return (t+y)/2; }

引用 14 楼 qq_30239507 的回复:我觉得是计算开方的代码有问题，你改进一下试试。 我也觉得可能是我的计算开方的代码有问题，但是我只计算1以内的开方啊，是有点一点bug，比如正好等于的时候。改进了一下还是有会出现这样的情况。

我觉得是计算开方的代码有问题，你改进一下试试。

引用 6 楼 paschen 的回复:首先浮点数是会有误差的，很多十进制小数都没办法用二进制精确表示  其次，double a = cos(5.0*3.14159265358979323846/180.0); 我这得到的是：0.9961946980917455510800分之5π弧度。是要做一个角度制三角函数表，主要是前面四项是完全一样的，为什么第五项就差了那么多

估计更多的还是你的计算有错误

引用 7 楼 DelphiGuy 的回复:引用 4 楼 baidu_32238993 的回复:[quote=引用 1 楼 DelphiGuy 的回复:] cos(5)不应该是0.99...啊单位是分，六十分之一度  这么说是cos(5.0 / 60)，不过如果不是你的参数中间计算步骤引入了误差，那就是你的电脑浮点部件有问题了，也许浮电优化的问题？ 我用一台intel i7、一台AMD A10电脑验证了一下：cos(5.0 / 60) = 0.996529786700559 可以用FPU cos指令验证，这个精度最高： double cos_asm(double x) {   __asm{     fld qword ptr x     fcos   } } [/quote]不是弧度..是角度，角分秒制

FPU内部是80Bits浮点数 C,C++中，VC 不能使用80Bits 浮点数。

引用 5 楼 fefe82 的回复:你的程序、编译器（版本号）、操作系统（版本号）、CPU型号 ..... 都是啥？ 编译器vs2010，系统win7 64位，cpu i7四代，源代码 #include <stdio.h> #include <float.h> #include <time.h> #include <math.h> double power(double x); double qrt(double x); int main (void) { double t=0,k=0,c=0,ka=0,ca=0,ta=0; int i=1; const double sin=0.000290888204563; int a=0,b=0; a=clock(); t=sin; ta=sin; k=qrt(1-power(sin)); printf("%0.15f ",k); ka=sqrt(1-power(sin)); printf("%0.15f ",ka); c=k; ca=ka; printf("sin%d=%0.9f,cos%d=%0.9f\n",i,t,i,k); while(i++<50) { 	t = t*k+c*sin;     c=qrt(1-power(t)); 	printf("%0.15f",1-power(t)); 	printf("sin%d=%0.9f,cos%d=%0.9f\n",i,t,i,c); 	ta=ta*ka+ca*sin;     ca=sqrt(1-pow(ta,2)); 	printf("sin%d=%0.9f,cos%d=%0.9f\n",i,ta,i,ca); } b=clock(); b=b-a; printf("time=%d",b); getchar(); getchar(); return 0; } double power(double x) { 	double t=0; 	t=x*x; return t; } double qrt(double x) { double t=0,y=1; int i=0; t=y/2; while(i++<60000) { if(power(t)>x)   {	y=t; t=t/2; } else  	t=(t+y)/2; } return (t+y)/2; }

浮点优化

引用 4 楼 baidu_32238993 的回复:引用 1 楼 DelphiGuy 的回复:cos(5)不应该是0.99...啊单位是分，六十分之一度  这么说是cos(5.0 / 60)，不过如果不是你的参数中间计算步骤引入了误差，那就是你的电脑浮点部件有问题了，也许浮电优化的问题？ 我用一台intel i7、一台AMD A10电脑验证了一下：cos(5.0 / 60) = 0.996529786700559 可以用FPU cos指令验证，这个精度最高： double cos_asm(double x) {   __asm{     fld qword ptr x     fcos   } }

但是前面好几项都一样啊

首先CPU计算不会出错，只可能无法表示足够精度。 计算结果不同的原因，一是算法不同，比如直接使用泰勒公式计算、还是先将参数平移到某一区间后再用泰勒公式，余项是不一样的，二是计算保留的精度问题，比如泰勒公式中各项的系数保留了多少位小数，float还是double有效数字位数是不一样的


Question: c语言编写字典密码程序 跪求帮助==

引用 1 楼 user-1 的回复:fp=fopen(filename,"w+"); 这句，filename是要打开的文件路径，你没初始化就直接用了  另外GetDicChar(ch[100],options,len); 要改成 GetDicChar(ch,options,len); 谢谢回复。那么程序思路是对的？ 还有·····一直没弄懂调用时函数内的实参怎么选··比如我定义时用的dic(char *a)调用时实参却不是指针？

引用 2 楼 redcobain 的回复:[quote=引用 1 楼 user-1 的回复:] fp=fopen(filename,"w+"); 这句，filename是要打开的文件路径，你没初始化就直接用了  另外GetDicChar(ch[100],options,len); 要改成 GetDicChar(ch,options,len); 谢谢回复。那么程序思路是对的？ 还有·····一直没弄懂调用时函数内的实参怎么选··比如我定义时用的dic(char *a)调用时实参却不是指针？[/quote]  如果传递的是数组，会退化为指针，数组名可退化为指针


Question: 新手：求大神解救 ，这道题提交都错了5遍了，错误提示wrong answer 50%

连分数，和分数比较，最好精确 能精确比较

浮点数相等不要用==, 应该是fabs(a-b)<eps这样的


Question: MYSQL的释放查询内存问题，请大神赐教！感激不尽。。。。

引用 1 楼 xiaoyuanyuan2009 的回复:你是不是释放了两次  感谢您的回复，好像也没有释放两次耶。。  这个释放内存是不是有什么其他要弄的

引用 2 楼 kangzq 的回复:感谢您的回复，好像也没有释放两次耶。。  这个释放内存是不是有什么其他要弄的 会不会获取结果集的时候就失败了，然后你释放个失败的指针

你是不是释放了两次

引用 3 楼 user-2 的回复:多贴点代码，应该是你自己的问题， mysql_free_result 都有问题就没法玩了， 编译完 Mysql Connector/C 跑测试程序没问题吧。 求大神给个联系方式，能帮帮我看下代码。。。。


Question: 求助！删除节点的问题！

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

然而这并不是删除节点

引用 1 楼 wxq714586001 的回复:输出写错了，改成这样： #include<stdio.h> struct ListNode{ int val; struct ListNode *next; };   void deleteNode(struct ListNode* node) {     if(!node||!node->next)return ;     else{     	node->val=node->next->val;     	node->next=node->next->next; } }  void main() { struct ListNode a,b,c,d; a.next=&b; b.next=&c; c.next=&d; d.next=NULL;     a.val=1; b.val=2; c.val=3; d.val=4; deleteNode(&c);     struct ListNode *iter = &a;     while(iter!=NULL) {         printf("%d\t", iter->val);         iter = iter->next;     }     printf("\n"); }   正解。楼主的最后输出结果没有考虑到节点的无效性。

这句 node->val=node->next->val;  让该节点的val等于下一个节点的val，也就是4


Question: cs大一水题目求大神指导

改了一个地方：sum+=d[i-1];  如果还有问题回复   #include<stdio.h> int main() {  	int year,month,day,i,sum=0,d[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 	while(scanf("%d/%d/%d",&year,&month,&day)!=EOF) 	{ 		sum=0; 		for(i=1;i<month;i++) 			sum+=d[i-1]; 		if((year%4==0&&year%100!=0)||year%400==0) 		{ 			if(month>2)  				sum=sum+day+1; 		} 		else 		{ 			sum=sum+day; 		} 		printf("%d\n",sum); 	} 	return 0; }

引用 1 楼 sinat_33196949的回复:C语言中d[12]的下标是0--11 并且，如果在oj上的话，year貌似也不足够大


Question: C#实现窗体之间的跳转，关于命名空间的问题.

去C#版块问


Question: 数组名称中，[]里面的数字是代表数组里面有几个值……

输出时只是引用指针，*(a+i*类型的长度)，并不会去判断是否越界，只是把指针指向的空间的数据输出

呵呵 说不定chh[4]也行~

chh[3] 的有效索引只是0-2 越界并不会导致编译错误，但会让你程序产生不确定行为，甚至崩溃

4已经越界，这就是c最难调试的地方。一旦访问越界，结果未知。


Question: 真诚提问：这个程序出什么问题了，在VC上运行总显示已停止运行？

SqList L; 长度没有初始化


Question: Win10如何用命令运行.c文件

系统是无法直接运行.c程序的，需要编译生成 .obj 和 .exe 文件，一般用集成开发环境运行 .c 程序，如果想要用命令行窗口运行 .c 程序的话，需要先保证系统已经安装了开发工具，一般是vc或者vs。我用的vs，配置一下环境，然后就可以了。可以参考http://www.cnblogs.com/Lin-chun/p/5361030.html#undefined，已测可用。PS：里面提到的vcvars32.bat文件需要进入文件夹看看具体是什么名称。

下载个编译器吧，比如gcc。然后编译运行

我是编辑好了程序，想用命令编译运行它，行不行？

.c文件其实即使文本文件，和.txt文件没区别。只是里面保存了C语言代码，改了个扩展名而已

这只是打开.c文件吧？？？不是运行

引用 2 楼 zhu_xxx 的回复:[quote=引用 1 楼 user-4 的回复:] notepad.exe  xxx.c 能具体点吗？？？ [/quote]  xxx.c 换成你文件路径

引用 1 楼 user-4 的回复:notepad.exe  xxx.c 能具体点吗？？？

notepad.exe  xxx.c


Question: 求大神帮我改成链表方法。。

链表不是很难，建议楼主看看书，学一学。总不能每个作业都要别人帮你写代码呀

好的谢谢 我想改成链表方法。。可是我链表一点都不会。。能帮我改改吗。。

void delete() 这里，delete是关键字，不能作为函数名，需要换一个名字


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

LZ是学生吧，都不愿意直接在上论坛来看看人家给的提示？ 这种态度还是放弃C/C++吧

你的代码不管怎么运行 都是抄袭

f函数总是返回1， 怎么判断结果呢？明显的错误修改了再说


Question: 这是引用函数出错了吗？

举个简单的例子: #include <stdio.h> #include <string.h> void pp(char *str) { printf("Str:%.2s\n",str); } int main(void) { pp("Hi"); return 0; }

引用 2 楼 DJYLSY 的回复:#include<stdio.h> int main() void sort(int people[]) { int i,j,people[5]; for(i=0;i<5;i++) scanf("%d",&people[i]); sort(people); return 0; } void sort(int people[]) { int k,j.i; int t; for(i=0;i<N-1;i++) { for(k=0,j=k+1;j<5;j++) { if(people[k]>people[j])             k=j;   if(people[k]<=people[j]) {  t=people[k];  people[k]=people[j];  people[j]=t; } } } for(i=0;i<N;i++) printf("%d",people[i]); } 大神，还是不行啊  main函数实现部分呢？ 你只写个int main() 什么意思

int main() 没有实现部分  int k,j.i;  应该是逗号吧  sort函数不需要返回值  建议楼主先把基础打好


Question: 为啥我输入的数据和我data；函数输出的有几个数据不一样？而且在输入函数里把%fs改成%d后输出的数据全部为0？

就是无法用函数输出我输入的数据

不知道你要问什么  浮点数与整数的内存存储方式是不同的


Question: [小白求助]关于动态链接库

排除方法： 1, 先将动态链接库的调用注释，重新编译，调试运行，看故障是否复现 1.1 不复现，大概与动态链接库的调用有关，检查dll文件是否在当前路径下。F5调试时，当前路径一般是工程目录；        检查动态链接库里面add等的符号等信息 1.2 复现，同样问题，非动态链接库问题

求助大神啊~~~


Question: C语言计算2^100，的问题？

完全超出了编译器的内存地址，你知道这是多大的一个数吗？需要多少个字节啊

引用 2 楼 paschen的回复:http://blog.csdn.net/juanjuan888/article/details/6672517 这种浮点表示法，我懂啊，就是8个字节64位分成三部分表示，，但是他都说了能表示10的1000多次方，我这2的100次方也不过10的30次方啊？？

引用 1 楼 Ahair的回复:你知道2的100次方能有多少位吗。。。。  远远超出预设的数据类型表示范围 是不是能表示和能计算不是一回事？？？？

引用 1 楼 Ahair的回复:你知道2的100次方能有多少位吗。。。。  远远超出预设的数据类型表示范围 2的100次方是二进制101位啊，就是1000000000000.......000000，（100个0）？十进制的话，是1.267*10^30次方，但是double能表示10的1000多次方啊？？  用dev c++计算2的100次方就崩溃了？显示不出来，

应该很快了，当128Bits操作系统，应用程序普及以后，2^100 就很容易表示了

2^100 ，101 个二进制位 。 double 仅有64 位，尾数只有52 位，加上隐藏位53位。 所以不能用二进制尾数，精确表示2^100 ； 只能，用指数表示，也就是2进制的科学记数法表示。 当然这个表示是精确的。  但是 2^100-1,2^100+1 就不能精确表示了 那么这个精确表示的2^100； 要怎么转化成10进制字符串表示，才能也依然精确？ 方法应该是有的，但是显然不是通用的。  有理数，实数，好比沙子。在某个范围内右无穷多个。 但是浮点数表示的二进制，只能表示有限个数的沙子。 很多沙子表示不了，只能以不精确的方式，被别的沙子代表。

#include <stdio.h> #define weishu 4000 int main() {   int cun[weishu];   int a, b;   int zhishu, dishu;   for (a = 0; a < weishu; a++)     cun[a] = 0 ;   cun[weishu - 1] = 1;   printf("输入底数:");   scanf("%d", &dishu);   printf("输入指数:");   scanf("%d", &zhishu);   for (b = 0; b < zhishu; b++) {       for (a = weishu - 1; a >= 0; a--)          cun[a] *= dishu;       for (a = weishu - 1; a >= 0; a--)         if (cun[a] >=10){           cun[a - 1] += cun[a] / 10;           cun[a] %= 10;         }     }     for (a = 0; a < weishu; a++)     if (cun[a] != 0)       break;   for (a; a < weishu; a++)     printf("%d", cun[a]); } /*可以计算2^100000,我曾经把这段代码改进到一百多行,运算速度是六秒钟出2^100000， 六秒钟，不过我没有打注释的习惯，自己慢慢看，你在十分钟之内找我，我可能是有回复的*/

引用 4 楼 jangqh 的回复:[quote=引用 2 楼 paschen的回复:]http://blog.csdn.net/juanjuan888/article/details/6672517 这种浮点表示法，我懂啊，就是8个字节64位分成三部分表示，，但是他都说了能表示10的1000多次方，我这2的100次方也不过10的30次方啊？？[/quote]  double p = pow(2.0, 100.0);

口算 2^100=0x1 00000 00000 00000 00000 00000

你知道2的100次方能有多少位吗。。。。  远远超出预设的数据类型表示范围


Question: c中怎么用数组赋值，为啥我这个飘红啊。。求各位大神

应该是char* KE_NAME[2]={"yidong","liantong"};吧 或者char KE_NAME[2]={'y','l'};

char* KE_NAME[2]={"yidong","liantong"}; 里面两个都是字符串，不是字符


Question: 求助【链表】：请各位看看这代码有没有内存泄露问题？

之前对链表为非空情况是有点错误，函数已经改正，我只是疑问针对create_link函数内部的malloc是否需要free，在何时何地free？ 附：改正代码 struct node* create_link(struct node *head) { 	struct node *p1,*p2; 	int length=0;  	printf("输入需要创建的链表长度:\n"); 	scanf("%d",&length);  	p1 = p2 = (struct node*)malloc(sizeof(struct node)); 	 	assert(p1 != NULL); 	if(p1 == NULL) 	{ 		printf("申请内存失败，程序退出！\n"); 		exit (1); 	}  	p1->next = NULL; 	p1->pre = NULL; 	printf("输入新增链表节点数值:"); 	scanf("%d",&p1->data); 	if(head == NULL) 	{ 		head = p1; 	} 	else 	{ 		head->next = p2; 		p2->pre = head; 		p2->next = NULL; 	}  	while(length != 0) 	{ 		length--; 		if(length == 0) 		{ 			break; 		}  		p1 = (struct node*)malloc(sizeof(struct node)); 		assert(p1 != NULL); 		if(p1 == NULL) 		{ 			printf("申请内存失败，程序退出！\n"); 			exit (-1); 		} 		p1->next = NULL; 		p1->pre = NULL; 		printf("输入新增链表节点数值:"); 		scanf("%d",&p1->data);  		p2->next = p1; 		p1->pre = p2; 		p1->next = NULL; 		p2 = p1; 	}  		//free (p1); 		return head; }

可以用VLD检测有没内存泄露： http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

while(length != 0)  	{  		if(head == NULL)  		{  			head = p1;  		}  		else  		{ 楼主这里head不是NULL，是不是想遍历链表  			p2->next = p1;  但是这时候p1跟p2是一样的  就变成了自己的next指向自己  			p1->pre = p2;  自己的前面还是自己 跟原来的链表没有关系，不符合楼主的原意。  			p1->next = NULL;  			p2 = p1;  		}  		length--;  		if(length == 0)  		{  			break;  		}  		p1 = (struct node*)malloc(sizeof(struct node));  		assert(p1 != NULL);  		if(p1 == NULL)  		{  			printf("申请内存失败，程序退出！\n");  			exit (-1);  		}    		p1->next = NULL;  		p1->pre = NULL;  		printf("输入新增链表节点数值:");  		scanf("%d",&p1->data);  	}  	//free (p1);  	return head;  } 手机打字不方便，不过希望楼主能看明白


Question: 重言式判别和二叉树有啥关系?由于刚学二叉树 对这个很困惑

这是把表达式，表示成一颗二叉树  非叶子节点是运算符 左右子树，分别是两个子表达式（操作数），子表达式递归，表示为 运算算符，子表达式（操作数） 叶子节点为操作数 注意括号和优先级


Question: C语言中文本文件和二进制文件的区别

其实没有什么区别 记事本是最常用的打开文本文件的工具,如果你将"abc"以二进制形式写入.dat文件中,用记事本就会出现乱码 在不需要查看内容的情况下,最好用二进制读写,简单,出错概率小

abc三个字符用文本方式与二进制方式均为3个字节，如果存的是字符，用二进制和文本存不同在于如果有\n，windows下用文本存会被换成\r\n，而二进制会保持原字符  如果存的是数字，就差别很远了，用文本存你要把数字先转换成字符串，这样可能就会产生一些误差了  如果文件不需要在文本方式下查看的话，都建议用二进制存

那么含有数据'abc'的二进制文件在磁盘中占多少个字节呢？如果存放成文本文件又应该占多少个字节呢

二进制文件包含非文本性的内容， 当然，如果你把二进制文件写成文本格式的文件，就是文本文件。

关键还得看你用什么权限写进去

字符串有区别也很小，主要区别是非字符串数据 例如 int double  这些类型，一般按照内存所占字节数原样存储 另外 二进制读写 fread fwrite 和 文本读写 fscanf fprintf 处理数据的方式是不同的 fwrite 把内存中的数据，按照所占字节数，直接写到文件中，会有字节序问题 fprintf 把数据，按照类型转换成字符（串）格式，写到文件中。 单字节字符串是不会有字节顺序问题的， 因为统一按照地址从低到高读写。 其他还有控制字符的转换问题

主要区别就是\r\n的处理，二进制文件不关心具体是什么，一切都是字节


Question: printf会改变if的判断？求助大神啊！

引用 17 楼 lm_whales 的回复:[quote=引用 16 楼 a615350236 的回复:] 感谢楼上各位，问题解决了。 问题出在多线程上，和printf以及printf缓冲区无关。 程序中有多个线程，因为使用了printf导致所在程序耗时过多，影响到其它线程赋值，printf所在线程耗时不同会造成不同结果。 之后用sleep验证，不同的sleep时间会有不同结果！ 真是搞死人了。。。以后验证数据正确性只能用相同的数量的printf 多线程输入输出需要同步，Sleep 是不管事的 你可以输出到文件（不同步的话，不同线程，输出到不同的文件），并记录时间 以此进行验证，[/quote] sleep在我这个程序中是有用的，这几个线程交互比较复杂，数据也是以数据流的形式输入，线程执行时间不同得到的结果也不同（针对每个线程内部）。 你说的那个方法学习了，但对这个程序意义不大

引用 16 楼 a615350236 的回复:感谢楼上各位，问题解决了。 问题出在多线程上，和printf以及printf缓冲区无关。 程序中有多个线程，因为使用了printf导致所在程序耗时过多，影响到其它线程赋值，printf所在线程耗时不同会造成不同结果。 之后用sleep验证，不同的sleep时间会有不同结果！ 真是搞死人了。。。以后验证数据正确性只能用相同的数量的printf 多线程输入输出需要同步，Sleep 是不管事的 你可以输出到文件（不同步的话，不同线程，输出到不同的文件），并记录时间 以此进行验证，

引用 14 楼 lm_whales 的回复:这和你的c这只指针指向的数据结构的意义相关 这应该是某种逻辑错误， 当然也可能是，某些地方疏忽，或者不严谨造成的，但是跟这个printf 关系不大，还是别处在找找吧 最新发现，stdout缓冲区改大的话，前面数据不会出错，至于后面数据是否出错未知

引用 5 楼 wang0635 的回复:加了一行代码，编译连接后，可能你预想的那些地址就不准了，if 中的条件就不满足了 （根据 c->addr 乱猜的） 引用 5 楼 wang0635 的回复:加了一行代码，编译连接后，可能你预想的那些地址就不准了，if 中的条件就不满足了 （根据 c->addr 乱猜的） 可加的那行代码，没有改变任何东西

引用 4 楼 user-3 的回复:[quote=引用 3 楼 a615350236 的回复:] [quote=引用 1 楼 user-3 的回复:] 不知你哪里是不是搞错了，单步调试看下 linux下怎样单步调试？程序有几万行GDB不顶用[/quote]  加断点然后运行，一般IDE都有这功能[/quote] 我用的vim，不行

引用 8 楼 lm_whales 的回复:c->addr == 267912？ 我要检测的就是这个数据

c->addr == 267912？

引用 12 楼 lm_whales 的回复:这个错误，和你的printf 应该没啥关系 那加了一行printf后，结果就变了，不知道哪里出问题

这个错误，和你的printf 应该没啥关系

引用 10 楼 lm_whales 的回复:不知道你这个数据是什么类型，你这个应用是什么平台的应用？ 如果是单片之上的应用，还真很难说 因为C,C++内存地址的分配，程序员很难控制。 如果是，PC一般不会有升么影响，除非你这个应用比较特殊。 PC上的应用，c是一个结构体，c->addr的类型是int64_t

引用 3 楼 a615350236 的回复:[quote=引用 1 楼 user-3 的回复:] 不知你哪里是不是搞错了，单步调试看下 linux下怎样单步调试？程序有几万行GDB不顶用[/quote]  加断点然后运行，一般IDE都有这功能

linux下怎样单步调试？程序有几万行GDB不顶用

引用 1 楼 user-3 的回复:不知你哪里是不是搞错了，单步调试看下 linux下怎样单步调试？程序有几万行GDB不顶用

不知你哪里是不是搞错了，单步调试看下


Question: 求助，这一段代码怎么在运行后的窗口中输入字符串，而不是直接在main（）中赋值？

scanf getchar gets

至于数组大小，设置个差不多的就是了，例如100，4096 等等 如果还觉得小了，动态分配内存，不够就扩大

输入字符串很容易啊 如果格式不对，你可以先判断，不对的不处理。

scanf不是支持从控制台读取输入吗


Question: 大家来找茬 脑袋已经晕了 求大牛指点

正常情况下调用函数只能有一个返回值，在你的代码里可以用两个指针来代替x1 x2 ,而且，在q大于零与小于零可以调用同一个函数，不用分开写。你还需判断当a=b=0时，x为任意值，x=0时的情况。

分类讨论 a=0 a!=0

函数a3要返回一个值啊


Question: 请问VS2015写C的时候，为什么调试不跳转到函数呢,比如到一个函数的地方就那一条函数语句,不跳到函数体,VS2013就到函数体继续执行，为什么呢?

除了楼上说的F10,F11的区别，还有Debug与Release的区别，Debug默认不会对程序做任何优化，而Release可能会把函数优化成内联的形式。

引用 1 楼 adusuccessfully 的回复:把断点打在 print(7);这一行，调试F11，就进入到 print函数体内。 楼主可以百度下调试程序时F10与F11的用法： F10,F11是调试时用的，俩者区别在于F10是逐过程调试，F11是逐语句调试。F11比F10细一些，但考虑到时间问题和部分代码需要快速跳过原因，2者结合用效果最佳。++

F10是逐过程调试,F11是逐语句调试, 你可以将断点设置在函数中 到那一句就会进入

分步入和步过的区别，步入才跟进函数，有时你不可能有精力去一直跟踪函数里每一条语句，所以应该根据不同情况采用不同方式


Question: 求问可以让EXE文件自动运行吗

很多病毒还有汇编做呢，比如当年的CIH病毒，可以把自身得到各个可执行文件中，这样可以自我恢复 如果要开机启动，直接改注册表就行，如果想在运行其他程序绑定着被运行那就比较高端的话题了，但这些操作如果你装了杀软都会被拦下来

应该有的病毒是会自动运行的，比如有的病毒Iexplores.exe，双击硬盘符就会运行。 下载杀毒软件查杀下就好了