Question: poj上一题，崩溃的青蛙约会问题

太多了  没看

#include <iostream> #include <math.h> using namespace std;  int gcd(int a,int b) {	 	int temp; 	while(b) 	{ 		temp = a % b; 		a = b; 		b = temp; 	} 	return a; } void main() { 	int x,y,m,n,L,a=1,b=0,temp; 	cout<<"输入x,y,m,n,L,中间以空格隔开"<<endl; 	cin>>x>>y>>m>>n>>L; 	long long gcm;  	gcm = gcd(L,abs(n-m)); 	gcm = L/gcm*(abs(n-m)); 	do 	{ 		temp = ((n-m)*a+y-x)%L; 		a++; 	} 	while(temp!=0&&a<gcm); 	 	if(a == gcm ) 		cout<<"无法相遇"<<endl; 	else 	{ 		a--; 		cout<<"最少跳跃次数为:"<<a<<endl; 	} 	 }

算法的力量。用扩展欧几里得，一个数组一个链表都不用，几个变量折腾一下答案就出来了。


Question: 结构体程序代码出发一个断点

不好意思，写错了，把0改成i

printf("%d",pHorse[0]->age);//在此句触发断点  看了你的代码不知道你想干嘛


Question: 10的ASC码如何计算

ASC码数字部分是0~9，没有10

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

你这样说得不清不楚的，在stackoverflow早就删帖了。 stackoverflow有名的原因就是通过删帖保证论坛质量。 CSDN再这样和稀泥，没希望的。

如果你是这个意思 printf("%d\n",10); 如果你是这个意思 printf("%d %d\n",'1','0');

字符串"10"的ASC码才是'1'的ASCII码加上'0'的ASC码. 如果10本身就是一个数值类型, 比如int类型.  那么就没有ASC码一说了.

引用 楼主 u013145766 的回复:大神们帮帮我吧,10的asc码值是不是1的ASC码连接上0的ASC码 是的。 就和AB，是A的ASCII码链接上B的ASCII码，一样的。

字符才有ASC码。10不是字符，没有ASC码。


Question: 自己实现的free()函数疑问

代码： /*  * 链表综合应用  */ #include <stdio.h> #include <stdlib.h> #include <malloc.h>  struct node { 	int num; 	struct node *next; };  struct node *crfun(int n) { 	struct node *head,*p1,*p2; 	p1=p2=head=(struct node *)malloc(sizeof(struct node)); 	scanf("%d",&head->num); 	n--; 	while(n) 	{ 		p2=p1; 		p1=(struct node *)malloc(sizeof(struct node)); 		scanf("%d",&p1->num); 		p2->next=p1; 		n--; 	} 	p1->next=NULL; 	return head; }  struct node *hbfun(struct node *p1,struct node *p2) { 	 struct node *head,*p; 	 if(p1->num<p2->num)head=p1; 	 else head=p2; 	 p=NULL; 	 while(p1!=NULL&&p2!=NULL) 	 { 		 if(p1->num<p2->num) 		 { 			 p->next=p1; 			 p=p1; 			 p1=p1->next; 		 } 		 else 		 { 			 p->next=p2; 			 p=p2; 			 p2=p2->next; 		 } 	 } 	 //以下两句作用是把多余的部分连接起来 	 if(p1!=NULL)p->next=p1; 	 if(p2!=NULL)p->next=p2; 	 return head; }  struct node *delfun(struct node *head,int m) { 	struct node *p1,*p2; 	p1=p2=head; 	if(m==head->num) 	{ 		head=head->next; 		return head; 	} 	while(p2!=NULL&&p2->num!=m) 	{ 		p1=p2; 		p2=p2->next; 	} 	if(p2->num==m) 	{ 		p1->next=p2->next; 	} 	return head; }  struct node *insfun(struct node *head,int m) { 	struct node *p1,*p2,*p; 	p=p2=head; 	p1=(struct node *)malloc(sizeof(struct node)); 	p1->num=m; 	if(m<=head->num){p1->next=head;head=p1;return head;} 	while(m>=p2->num&&p2!=NULL) 	{ 		p=p2; 		p2=p2->next; 	} 		p->next=p1; 		p1->next=p2; 	return head; }  struct node *sortfun(struct node *head) { 	struct node *p; 	p=head->next; 	head->next=NULL; 	while(p!=NULL) 	{ 		head=insfun(head,p->num); 		p=p->next; 	} 	return head; }  void putfun(struct node *head) { 	while(head!=NULL) 	{ 		printf("%3d",head->num); 		head=head->next; 	} 	printf("\n"); }  void freefun(struct node* head) { 	struct node* temp; 	while(head!=NULL) 	{ 		temp=head->next; 		free(head); 		head=temp; 	} }  int main() { 	 struct node *head; 	 struct node *p1; 	 struct node *p2; 	 int m; 	 p1=crfun(5);			//创建链表 	 p2=crfun(5);			//创建链表 	 head=hbfun(p1,p2);	//合并链表(二路合并法) 	 scanf("%d",&m); 	 head=delfun(p1,m);	//删除节点 	 scanf("%d",&m); 	 head=insfun(p1,m);	//插入节点 	 head=sortfun(p1);		//排序链表 	 putfun(head);			//输出链表 	 freefun(head)//在实际应用中链表使用完后要记得释放 	 return 0; }

引用 8 楼 zxh707wk 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 试试在每次调用free后，输出整个占用内存块链和空闲内存块链的内容辅助调试。 参考这个代码的做法： //假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //  能把 创建、插入、删除、排序、输出、释放链表都写成函数形式不？ 虽然这样写的运行效率比用函数写要快一些[/quote] 那就麻烦你在这段代码的基础上修改，编译、链接、调试无误后帖上来给大家共享了 。我还是比较懒的。

malloc出来的内存并不仅仅是你设定的sizeof的大小，malloc里面还包含了各种信息结构，所以free这个也要涉及到malloc的实现，实际上malloc就是一个双向链表

引用 1 楼 zhao4zhong1 的回复:试试在每次调用free后，输出整个占用内存块链和空闲内存块链的内容辅助调试。 参考这个代码的做法： //假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //  能把 创建、插入、删除、排序、输出、释放链表都写成函数形式不？ 虽然这样写的运行效率比用函数写要快一些

引用 6 楼 u012061345 的回复:你说的有道理。我要看看全文再考虑一下。 《程序员的自我修养》13.1.2堆的实现，第418页，清单13-2 malloc.c 看出了结果请回复我

引用 5 楼 haoren026 的回复:假设用free释放的内存块首地址是10，前一块内存首地址是0，后一块内存是20，后一块的后一块内存是30。以下用首地址代表内存块 第二种情况下：内存块10的长度+=内存块20的长度，10的next指向30，但30的prev还指向20，这就是我说的问题。如果以后访问30的prev，那么跳转到20，而20已经不是一个header了，而是普通内存数据。所以应该把30的prev指向10  你说的有道理。我要看看全文再考虑一下。

引用 4 楼 u012061345 的回复:完全没有必要。因为第一种情况下逻辑上删除了原header指向的块。而第二种情况下逻辑上删除了header->next的块，既然该块已经删除了，当然不再需要设置header->next->prev。 画个指针的指向图，仔细看看。这个逻辑上就是一个双向链表。  假设用free释放的内存块首地址是10，前一块内存首地址是0，后一块内存是20，后一块的后一块内存是30。以下用首地址代表内存块 第二种情况下：内存块10的长度+=内存块20的长度，10的next指向30，但30的prev还指向20，这就是我说的问题。如果以后访问30的prev，那么跳转到20，而20已经不是一个header了，而是普通内存数据。所以应该把30的prev指向10

你再看看源代码,这个好像不是简单的双链表结构


Question: 伪代码解释gdb命令

为什么要用伪代码呢？gdb是开源的啊。

这个问题比较多，一般都是通过修改代码指令实现的 这里有个codeproject中的文档，介绍的很详细，关于调试器的，不过不是GDB http://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger

server 用过没理解里面的东西   这个有文档介绍么？


Question: C语言【下载网站图片】最后一步了.

system("curl ..."); 坐等楼下curl达人补充。

大神帮忙写个下载指定链接语句


Question: 如何将一句话的每一个字，分别存入不同的变量之中呢？

void  StrToInt(char *buf,unsigned short *x) {     unsigned char  *p=(unsigned char  *)buf; 	unsigned short *q=x; 	unsigned short  m;      while(*p)     { 		if(*p<0xa0) 			m=*p&0xff; 		else 		{ 			if(*(p+1)<0xa0) 				m=*p&0xFF; 			else 			{ 				m=*p&0xFF; 				m<<=8; 				p++; 				m|=*p&0xFF; 			} 		} 		*q=m; 		p++; 		q++;              	} }   举例 void main()  { 	char *str="你abcd好!欢迎光efg临！"; 	unsigned short pp[240]={0};  	StrToInt(str,pp);  	printf("%04X\n%04X\n%04X\n%04X\n%04X\n%04X\n",pp[0],pp[1],pp[2],pp[3],pp[4],pp[5]); }

这个要用c++的宽字符

问题是如果有英文的标点怎么办

引用 4 楼 zhou007jie 的回复:[quote=引用 2 楼 zxh707wk 的回复:] 英文可以这样做 汉字不行吗？ 每一个变量之中，只存储一个字符 多余的字符，存储到另外的变量中去[/quote] 英文每个字母占用一个字节，但是汉字每个占用两个字节。  不过，我觉得可以讲它读入一个字符串，然后对字符串进行分解

引用 2 楼 zxh707wk 的回复:英文可以这样做 汉字不行吗？ 每一个变量之中，只存储一个字符 多余的字符，存储到另外的变量中去

引用 1 楼 cfjtaishan 的回复:汉字占用的字节数和英文字母是不一样的，在定义变量时，应该注意这个地方吧！ 要怎么样将每一个字符，存入不同的变量之中呢？ 而不是所有的字符，都存入到一个变量中去了？

英文可以这样做

汉字占用的字节数和英文字母是不一样的，在定义变量时，应该注意这个地方吧！


Question: C语言面向对象的内容

可以不需要，但是你下面函数的实现也要与之对应就可以，这里的fun2是一个函数指针。    将函数赋值给函数指针，一定要满足参数个数，顺序，类型都相同，且返回值的类型要一样，除了void型。

引用 12 楼 yangyuyu77584 的回复:不明白你说的，1.构造函数是没有返回值。2.你结构体并没有自己定义虚函数。  struct son { struct parent p; int b; void(*func2)(struct son* _this); }; 就是 void(*func2)(这里的第一个参数，必须是struct son*类型嘛？)

不明白你说的，1.构造函数是没有返回值。2.你结构体并没有自己定义虚函数。

原来面向对象是这个意思

引用 5 楼 yangyuyu77584 的回复:因为son中声明parent是类变量，不是类指针变量。所以这里当你去new son时，系统随机给parent分配一块内存，但是这块内存是不能操作。所以当你运行时就会报内存访问出错。修改方案： 方案1.将son中parent修改从指针变量，然后在new_son函数中，对p进行new parent操作。  方案2.在struct son * b = new_son();后加入b->p = p;就是对son中的parent变量赋值。 方案3.修改son和parent的构造函数，你现在都是用默认的构造函数。  谢谢你的回答~~还有一个问题想想问~~ struct son { struct parent p; int b; void(*func2)(struct son* _this); }; 这里的虚函数里面的参数类型，是必须要定义一个指向自身的一个指针类型嘛？如果是，请问为什么呢？或者这么定义除了能指向自身之外，还有什么用处呢？ 我一直有点纳闷，构造函数不是可以返回一个指向这个结构的一个指针啊？但是，我看很多的定义都是将这个虚函数的第一参数定义为指向自己的指针？

struct son * b = (struct son*)malloc(sizeof(struct parent)); 这里应该是struct son 吧

不明觉厉，这算舍近求远吗？

哎呦 不错哦

((struct parent*) b)->func1(b);//请问这一句有什么错误 你没有初始化内部的p，能调成功才见鬼了阿 这种转化在C中不推荐。和C++不一样的。C面向对象至多采用内嵌函数指针实现面对向的成员方法

引用 3 楼 yangyuyu77584 的回复:修改成((struct parent*) b)->func1((struct parent*)b) 首先，感谢你的回答。但是，我一开始就这么调试的，语法没的错~~只是，在运行的时候要异常停止，而且，没有成功调用func1这个函数~~另外，我自己有一个地方写错了    “struct son * b = (struct son*)malloc(sizeof(struct parent));   //对于C中的子类，这里的父类该怎么初始化呢？或者需不需要初始化呢？”最后那里 的parent应该改成son，改了还是不对？你看是还有什么问题嘛？

((struct parent*) b)->func1(b); 因为func1的函数的参数是parent*，而不是son*，所以不能将son*的b，转化成parent*。

或者请大家帮帮谢谢 new_son这个函数？谢谢罗


Question: 波特率的问题

引用 1 楼 bigwatercar 的回复:http://wenku.baidu.com/link?url=lEZvfvC3KbTscRa9XsqLzo7Ty-eNYGeoBRGkAt8-L6WoeNyP113giMZpGy6d81TwVUiCaTiV0bMjI5VkenCAs1zhJ_nYbonxmoWCo51Ck8W  这里有篇论文，可以参考。  这个内容不错。

引用 2 楼 truelance 的回复:只要接收端速率大于等于发送端速率, 就可以自适应了.  接收设备的波特率不确定，有可能会小于发送的波特率。

引用 2 楼 truelance 的回复:只要接收端速率大于等于发送端速率, 就可以自适应了.  也有一个效率问题，快速准确，一次判断出，用算法还是有些延迟。 如果码元定时测量能准确，那就好了。

只要接收端速率大于等于发送端速率, 就可以自适应了.


Question: 大数加法的程序不知道错在哪里求大神帮忙看看吧

仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110


Question: C语言如何将一个字符串数组  写入txt 文件中 第2个“//”之前是将16进制转换为了字符串存储

fwrite(string[0],5,1,fp);//将string[0]所指内存的前5个字节写入文件d:\\MYFILE.txt中

引用 3 楼 beiye90 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] fp=fopen("d:\\MYFILE.txt","wb"); fwrite(string,5,1,fp);//将string的前5个字节写入文件d:\\MYFILE.txt中 fclose(fp);   推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了天天都能看到你！[/quote] 生命的意义不就是追求一个存在感吗？

字符串的 数组 还是不明白怎么存储 不过 把所有的字符串串在一起 存储 中间加上了 换行和空格之类的  功能还是实现啦

#include<stdio.h> #include<stdlib.h> #include<string.h>  unsigned char shuzi[64]= {0xa,0xb,0x00,0x00,0x70,0x00,0x40,0x00,0x90,0x00,0x00,0x00,0x00,0x80,0x01,0x80, 0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80, 0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80, 0x01,0x80,0x03,0xC0,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned int N16_32[32];   void main() { int i,j,sum; FILE *fp; int i_1,j_1;    char *string[32]={"","","","",""};   char strinn[4];   char stringn[288]={"\0"};   char strin1[4];  //char stringm[6]={'1','2','3','a','b','\0'}; char stringm[6]={"sdfgh"};   for(i_1=0,j_1=0;i_1<64,j_1<32;i_1++,j_1++) {        	N16_32[j_1] =(shuzi[i_1]<<8)|shuzi[++i_1];       //  printf("\n%x : %x;\n",j_1,N16_32[j_1]); }  for(i=0;i<32;i++) {        itoa(N16_32[i], strinn, 16);        itoa(i, strin1, 16);      if(i==0) 	{         strcpy(stringn,strin1);          strcat(stringn," : "); 		strcat(stringn,strinn);         strcat(stringn,"\n");         	} 	else 	{        strcat(stringn,strin1);         strcat(stringn," : "); 	   strcat(stringn,strinn);        strcat(stringn,"\n");            }  if(i==31)   printf("%s",stringn); }   // printf("%s",stringn);  fp=fopen("d:\\MYFILE.txt","w");        if(fwrite(stringn,sizeof(char),288,fp)!=1)                    printf("写入错误\n");  fclose(fp);  }

额 自己都有点晕啦  就是想把   几个字符串  写到一个文件里面

引用 1 楼 zhao4zhong1 的回复:fp=fopen("d:\\MYFILE.txt","wb"); fwrite(string,5,1,fp);//将string的前5个字节写入文件d:\\MYFILE.txt中 fclose(fp);   推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了天天都能看到你！

引用 1 楼 zhao4zhong1 的回复:fp=fopen("d:\\MYFILE.txt","wb"); fwrite(string,5,1,fp);//将string的前5个字节写入文件d:\\MYFILE.txt中 fclose(fp);   推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 赞同，原来写的一个程序在文本框不能换行，后来发现是文件打开方式的问题


Question: gSOAP不能正确解析服务器返回的消息，是不是命名空间问题？

太感谢了，我也遇到同样的这问题，返回为4

太感谢了，我也遇到同样的这问题.

楼主v5~赞一下楼主的分享精神

wenxy1  版主您好，我也遇到了和您一样的问题，解决不了，能告诉我您是怎么修改soap_in_tt_Capabilities()这个函数的吗？不胜感激

按照wenxy1版主的方法进行程序修改，未能达到如期效果，但是wenxy1版主的解决方法给了一定启发，具体程序修改方法和原因进行下述整理，本人就是按照这种修改方法得到正确解析结果，仅供参考： 问题一、 soap_call___tds__GetCapabilities函数调用返回错误值是4，但是从网络上接收到的流和正确解析的流是一模一样的，也就是 说网络流没问题，但是解析错误，为此看了一下错误的地方，是在tt:Extension中的tt:DHCPv6中，也就是在tt:Extension中， 暂时用不到extension中的东西，就注释掉了几个调用的地方，就正常得到Capabilities，当然extension中是没有数据的。 1、soap_in_tt__NetworkCapabilitiesExtension函数  			//if (soap_flag_Extension && soap->error == SOAP_TAG_MISMATCH) 			//	if (soap_in_PointerTott__NetworkCapabilitiesExtension2(soap, "tt:Extension", &a->Extension, "tt:NetworkCapabilitiesExtension2")) 			//	{	soap_flag_Extension--; 			//		continue; 			//	} 			 			//if (soap->error == SOAP_TAG_MISMATCH && !soap_peek_element(soap)) 			//{	if (a->__any == NULL) 			//	{	if (soap_blist___any == NULL) 			//			soap_blist___any = soap_new_block(soap); 			//		a->__any = (char *)soap_push_block(soap, soap_blist___any, sizeof(char)); 			//		if (a->__any == NULL) 			//			return NULL; 			//		soap_default_byte(soap, a->__any); 			//	} 			//	if (soap_in_byte(soap, "-any", a->__any, "xsd:byte")) 			//	{	a->__size++; 			//		a->__any = NULL; 			//		continue; 			//	} 			//} 			 2、soap_in_tt__Capabilities函数             //if (soap_flag_Extension && soap->error == SOAP_TAG_MISMATCH) 			//	if (soap_in_PointerTott__CapabilitiesExtension(soap, "tt:Extension", &a->Extension, "tt:CapabilitiesExtension")) 			//	{	soap_flag_Extension--; 			//		continue; 			//	}

/* file: soapC.c */ SOAP_FMAC3 struct tt__Capabilities * SOAP_FMAC4 soap_in_tt__Capabilities(struct soap *soap, const char *tag, struct tt__Capabilities *a, const char *type) { 	size_t soap_flag_Analytics = 1; 	size_t soap_flag_Device = 1; 	size_t soap_flag_Events = 1; 	size_t soap_flag_Imaging = 1; 	size_t soap_flag_Media = 1; 	size_t soap_flag_PTZ = 1; 	size_t soap_flag_Extension = 1; 	if (soap_element_begin_in(soap, tag, 0, type)) 		return NULL; 	a = (struct tt__Capabilities *)soap_id_enter(soap, soap->id, a, SOAP_TYPE_tt__Capabilities, sizeof(struct tt__Capabilities), 0, NULL, NULL, NULL); 	if (!a) 		return NULL; 	soap_default_tt__Capabilities(soap, a); 	if (soap_s2string(soap, soap_attr_value(soap, "-anyAttribute", 0), &a->__anyAttribute, 0, -1)) 		return NULL; 	if (soap->body && !*soap->href) 	{ 		for (;;) 		{	soap->error = SOAP_TAG_MISMATCH; 			if (soap_flag_Analytics && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__AnalyticsCapabilities(soap, "tt:Analytics", &a->Analytics, "tt:AnalyticsCapabilities")) 				{	soap_flag_Analytics--; 					continue; 				} 			if (soap_flag_Device && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__DeviceCapabilities(soap, "tt:Device", &a->Device, "tt:DeviceCapabilities")) 				{	soap_flag_Device--; 					continue; 				} 			if (soap_flag_Events && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__EventCapabilities(soap, "tt:Events", &a->Events, "tt:EventCapabilities")) 				{	soap_flag_Events--; 					continue; 				} 			if (soap_flag_Imaging && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__ImagingCapabilities(soap, "tt:Imaging", &a->Imaging, "tt:ImagingCapabilities")) 				{	soap_flag_Imaging--; 					continue; 				} 			if (soap_flag_Media && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__MediaCapabilities(soap, "tt:Media", &a->Media, "tt:MediaCapabilities")) 				{	soap_flag_Media--; 					continue; 				} 			if (soap_flag_PTZ && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__PTZCapabilities(soap, "tt:PTZ", &a->PTZ, "tt:PTZCapabilities")) 				{	soap_flag_PTZ--; 					continue; 				} 			/* wenxy comment */ 			/* 			if (soap_flag_Extension && soap->error == SOAP_TAG_MISMATCH) 				if (soap_in_PointerTott__CapabilitiesExtension(soap, "tt:Extension", &a->Extension, "tt:CapabilitiesExtension")) 				{	soap_flag_Extension--; 					continue; 				} 			*/ 			if (soap->error == SOAP_TAG_MISMATCH) 				soap->error = soap_ignore_element(soap); 			if (soap->error == SOAP_NO_TAG) 				break; 			if (soap->error) 				return NULL; 		} 		if (soap_element_end_in(soap, tag)) 			return NULL; 	} 	else 	{	a = (struct tt__Capabilities *)soap_id_forward(soap, soap->href, (void*)a, 0, SOAP_TYPE_tt__Capabilities, 0, sizeof(struct tt__Capabilities), 0, NULL); 		if (soap->body && soap_element_end_in(soap, tag)) 			return NULL; 	} 	return a; }

应该是带了html头的缘故吧。

楼主，你的soap_in_tt_Capabilities()是如何修改的，能说说么？

I fix the issue: modify soap_in_tt__Capabilities() in soapC.c.  Over, :-).

引用 4 楼 zxycele 的回复:楼主可不可以贴出完整的工程文件啊，我也在学习 抱歉，不行。

楼主可不可以贴出完整的工程文件啊，我也在学习

192.168.1.37的应答xml消息：  <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope  xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"  xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"  xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xop="http://www.w3.org/2004/08/xop/include"  xmlns:wsbf2="http://docs.oasis-open.org/wsrf/bf-2"  xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"  xmlns:wsa5="http://www.w3.org/2005/08/addressing"  xmlns:tt="http://www.onvif.org/ver10/schema"  xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"  xmlns:wsr2="http://docs.oasis-open.org/wsrf/r-2"  xmlns:daae="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding"  xmlns:dare="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding"  xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl"  xmlns:decpp="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding"  xmlns:dee="http://www.onvif.org/ver10/events/wsdl/EventBinding"  xmlns:denc="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding"  xmlns:denf="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding"  xmlns:depp="http://www.onvif.org/ver10/events/wsdl/PullPointBinding"  xmlns:depps="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding"  xmlns:tev="http://www.onvif.org/ver10/events/wsdl"  xmlns:depsm="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBinding"  xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"  xmlns:desm="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding"  xmlns:dndl="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding"  xmlns:dnrd="http://www.onvif.org/ver10/network/wsdl/RemoteDiscoveryBinding"  xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"  xmlns:dn="http://www.onvif.org/ver10/network/wsdl"  xmlns:tad="http://www.onvif.org/ver10/analyticsdevice/wsdl"  xmlns:tae="http://www.onvif.org/ver10/actionengine/wsdl"  xmlns:tds="http://www.onvif.org/ver10/device/wsdl"  xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"  xmlns:tls="http://www.onvif.org/ver10/display/wsdl"  xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl"  xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"  xmlns:trc="http://www.onvif.org/ver10/recording/wsdl"  xmlns:trp="http://www.onvif.org/ver10/replay/wsdl"  xmlns:trt="http://www.onvif.org/ver10/media/wsdl"  xmlns:trv="http://www.onvif.org/ver10/receiver/wsdl"  xmlns:tse="http://www.onvif.org/ver10/search/wsdl"  xmlns:tns1="http://www.onvif.org/ver10/topics"  xmlns:tnsn="http://www.eventextension.com/2012/event/topics"  xmlns:ter="http://www.onvif.org/ver10/error"  xmlns:xmime5="http://www.w3.org/2005/05/xmlmime"  xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl"  xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema"> <SOAP-ENV:Body> <tds:GetCapabilitiesResponse> <tds:Capabilities> 	<tt:Media> 		<tt:XAddr>http://192.168.1.37:80/onvif/services</tt:XAddr> 		<tt:StreamingCapabilities> 			<tt:RTPMulticast>false</tt:RTPMulticast> 			<tt:RTP_TCP>true</tt:RTP_TCP> 			<tt:RTP_RTSP_TCP>true</tt:RTP_RTSP_TCP> 		</tt:StreamingCapabilities> 	</tt:Media> </tds:Capabilities> </tds:GetCapabilitiesResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

192.168.1.39.cap的应答xml消息  <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope  xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"  xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:wsa5="http://www.w3.org/2005/08/addressing"  xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"  xmlns:xmime5="http://www.w3.org/2005/05/xmlmime"  xmlns:xmime="http://tempuri.org/xmime.xsd"  xmlns:xop="http://www.w3.org/2004/08/xop/include"  xmlns:ns1="http://www.placeholder.org/ver10/tmp/schema"  xmlns:scdl="http://www.placeholder.org/ver10/scdl/schema"  xmlns:tt="http://www.onvif.org/ver10/schema"  xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2"  xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"  xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2"  xmlns:scws="http://www.placeholder.org/ver10/scdl/wsdl"  xmlns:ns2="http://www.placeholder.org/ver10/tmp/wsdl"  xmlns:tae="http://www.onvif.org/ver10/actionengine/wsdl"  xmlns:tan0="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding"  xmlns:tan1="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding"  xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl"  xmlns:tds="http://www.onvif.org/ver10/device/wsdl"  xmlns:tev0="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding"  xmlns:tev1="http://www.onvif.org/ver10/events/wsdl/EventBinding"  xmlns:tev="http://www.onvif.org/ver10/events/wsdl"  xmlns:tev2="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding"  xmlns:tev3="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding"  xmlns:tev4="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding"  xmlns:tev5="http://www.onvif.org/ver10/events/wsdl/PullPointBinding"  xmlns:tev6="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding"  xmlns:ter="http://www.onvif.org/ver10/error"  xmlns:tns1="http://www.onvif.org/ver10/topics"  xmlns:tev7="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBinding"  xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"  xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"  xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl"  xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"  xmlns:trt="http://www.onvif.org/ver10/media/wsdl"> <SOAP-ENV:Body> <tds:GetCapabilitiesResponse> <tds:Capabilities> 	<tt:Media> 	<tt:XAddr>http://192.168.1.39/onvif/media_service</tt:XAddr> 	<tt:StreamingCapabilities> 	<tt:RTPMulticast>true</tt:RTPMulticast> 	<tt:RTP_TCP>true</tt:RTP_TCP> 	<tt:RTP_RTSP_TCP>true</tt:RTP_RTSP_TCP> 	</tt:StreamingCapabilities> 	<tt:Extension> 	<tt:ProfileCapabilities><tt:MaximumNumberOfProfiles>4</tt:MaximumNumberOfProfiles></tt:ProfileCapabilities> 	</tt:Extension> 	</tt:Media> <tt:Extension><tt:DeviceIO><tt:XAddr>http://192.168.1.39/onvif/deviceIO_service</tt:XAddr><tt:VideoSources>1</tt:VideoSources><tt:VideoOutputs>0</tt:VideoOutputs><tt:AudioSources>0</tt:AudioSources><tt:AudioOutputs>0</tt:AudioOutputs><tt:RelayOutputs>0</tt:RelayOutputs></tt:DeviceIO><tt:Extensions><tt:TelexCapabilities><tt:XAddr>http://192.168.1.39/onvif/scdl_service</tt:XAddr><tt:TimeOSDSupport>true</tt:TimeOSDSupport><tt:TitleOSDSupport>true</tt:TitleOSDSupport><tt:PTZ3DZoomSupport>true</tt:PTZ3DZoomSupport><tt:PTZAuxSwitchSupport>true</tt:PTZAuxSwitchSupport><tt:MotionDetectorSupport>true</tt:MotionDetectorSupport><tt:TamperDetectorSupport>true</tt:TamperDetectorSupport></tt:TelexCapabilities><tt:ScdlCapabilities><tt:XAddr>http://192.168.1.39/onvif/scdl_service</tt:XAddr><tt:MaximumNumberOfOSDs>4</tt:MaximumNumberOfOSDs><tt:PTZ3DZoomSupport>true</tt:PTZ3DZoomSupport><tt:TamperDetectorSupport>true</tt:TamperDetectorSupport></tt:ScdlCapabilities></tt:Extensions> </tt:Extension> </tds:Capabilities> </tds:GetCapabilitiesResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

/* function onvif_get_capabilities source code as below: */ static int onvif_get_capabilities(struct soap *soap, char *soap_endpoint, char *soap_action) { 	int ret = 0; 	struct _tds__GetCapabilities getCapReq; 	struct _tds__GetCapabilitiesResponse getCapResponse; 	enum tt__CapabilityCategory  temp_category;  	pr_debug("Debug: into %s, %s\n", __FILE__, __FUNCTION__); /* wenxy debug */ 	if (soap == NULL || soap_endpoint == NULL || soap_endpoint == soap_action) 	{ 		return -EINVAL; 	} 	 	memset(&getCapReq, 0, sizeof(struct _tds__GetCapabilities)); 	memset(&getCapResponse, 0, sizeof(struct _tds__GetCapabilitiesResponse)); 	/*getCapReq.__sizeCategory = 1;*/ /* wenxy test ok */ 	/*temp_category = tt__CapabilityCategory__Media;*/ /* wenxy test ok */  	#if 1 	//getCapReq.__sizeCategory = 0; 	//temp_category = tt__CapabilityCategory__All; 	 	getCapReq.__sizeCategory = 1; 	temp_category = tt__CapabilityCategory__Media;	 	getCapReq.Category = &temp_category; 	#endif  	ret = soap_call___tds__GetCapabilities(soap, soap_endpoint, soap_action,  		&getCapReq, &getCapResponse); 	if (ret == -1) 	{ 		printf("ONVIF error: soap error: %d, %s, %s\n",  			soap->error, *soap_faultcode(soap), *soap_faultstring(soap)); 		ret = soap->error;     	} 	else 	{        		if (getCapResponse.Capabilities == NULL) 		{ 			printf("ONVIF error: GetCapabilities failed: %d, %s, %s, %s, %s\n",  				soap->error, *soap_faultcode(soap), *soap_faultsubcode(soap),  				*soap_faultstring(soap), *soap_faultdetail(soap));  		} 		else 		{ 			if (getCapResponse.Capabilities->Media) 			{ 				pr_debug("ONVIF: Media->XAddr=%s\n", getCapResponse.Capabilities->Media->XAddr); 				memset(media_service_addr_buf, 0, sizeof(media_service_addr_buf)); 				strcpy(media_service_addr_buf, getCapResponse.Capabilities->Media->XAddr); 			} 			if (getCapResponse.Capabilities->PTZ) 			{ 				pr_debug("ONVIF: PTZ->XAddr=%s\n", getCapResponse.Capabilities->PTZ->XAddr); 				memset(ptz_service_addr_buf, 0, sizeof(ptz_service_addr_buf)); 				strcpy(ptz_service_addr_buf, getCapResponse.Capabilities->PTZ->XAddr); 			} 			ret = 0; 		} 	}  	return ret; }  /* gSOAP namesapce */ SOAP_NMAC struct Namespace namespaces[] = { 	{"SOAP-ENV", "http://www.w3.org/2003/05/soap-envelope", "http://schemas.xmlsoap.org/soap/envelope/", NULL}, 	{"SOAP-ENC", "http://www.w3.org/2003/05/soap-encoding", "http://schemas.xmlsoap.org/soap/encoding/", NULL}, 	{"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL}, 	{"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL}, 	{"wsa", "http://schemas.xmlsoap.org/ws/2004/08/addressing", NULL, NULL}, 	{"wsdd", "http://schemas.xmlsoap.org/ws/2005/04/discovery", NULL, NULL}, 	{"chan", "http://schemas.microsoft.com/ws/2005/02/duplex", NULL, NULL}, 	{"wsa5", "http://www.w3.org/2005/08/addressing", "http://schemas.xmlsoap.org/ws/2004/08/addressing", NULL}, 	{"xmime", "http://tempuri.org/xmime.xsd", NULL, NULL}, 	{"xop", "http://www.w3.org/2004/08/xop/include", NULL, NULL}, 	{"wsrfbf", "http://docs.oasis-open.org/wsrf/bf-2", NULL, NULL}, 	{"wstop", "http://docs.oasis-open.org/wsn/t-1", NULL, NULL}, 	{"tt", "http://www.onvif.org/ver10/schema", NULL, NULL}, 	{"wsrfr", "http://docs.oasis-open.org/wsrf/r-2", NULL, NULL}, 	{"tad", "http://www.onvif.org/ver10/analyticsdevice/wsdl", NULL, NULL}, 	{"tan", "http://www.onvif.org/ver20/analytics/wsdl", NULL, NULL}, 	{"tdn", "http://www.onvif.org/ver10/network/wsdl", NULL, NULL}, 	{"tds", "http://www.onvif.org/ver10/device/wsdl", NULL, NULL}, 	{"tev", "http://www.onvif.org/ver10/events/wsdl", NULL, NULL}, 	{"wsnt", "http://docs.oasis-open.org/wsn/b-2", NULL, NULL}, 	{"timg", "http://www.onvif.org/ver20/imaging/wsdl", NULL, NULL}, 	{"tls", "http://www.onvif.org/ver10/display/wsdl", NULL, NULL}, 	{"tmd", "http://www.onvif.org/ver10/deviceIO/wsdl", NULL, NULL}, 	{"tptz", "http://www.onvif.org/ver20/ptz/wsdl", NULL, NULL}, 	{"trc", "http://www.onvif.org/ver10/recording/wsdl", NULL, NULL}, 	{"trp", "http://www.onvif.org/ver10/replay/wsdl", NULL, NULL}, 	{"trt", "http://www.onvif.org/ver10/media/wsdl", NULL, NULL}, 	{"trv", "http://www.onvif.org/ver10/receiver/wsdl", NULL, NULL}, 	{"tse", "http://www.onvif.org/ver10/search/wsdl", NULL, NULL}, 	{NULL, NULL, NULL, NULL} };


Question: warning: assignment from incompatible pointer type问题

把代码单独拎出来编译又没问题了，奇怪 2楼的用法好像也见过

ww是指针变量   函数名是个函数指针常量，  常量和变量类型不兼容。

mm.aa = &qq;  函数指针和函数名效果一行，但编译器认的不一样。

没看出什么问题，猜测楼主编译的时候aa定义为ww *aa;，或者ww定义为typedef  uint16 *(*ww)(uint8 *gg, int32 hh);，这2种情况下都会出现上述编译告警。 建议将贴出来的部分代码单独编译一下试试。


Question: 学C到现在，出了个群里没人解决的问题，来论坛里找前辈。

看着那些宏定义，有种想查找替换的感觉。。。

这个代码真的是正确的么，          if (p->leftChild)         {             Push(&S, p->rightChild);         }         if (p->rightChild)         {             Push(&S, p->leftChild);         }  我觉得应该改为          if (p->rightChild)         {             Push(&S, p->rightChild);         }         if (p->leftChild)         {             Push(&S, p->leftChild);         }  这里的判断只是用来确认要压栈的指针非空而已吧

/* 示例： a b c d  e 单支左子树a-b-d-e 和右子树a-c，显然不平衡哈 下面是你核心代码： */ Push(&S, T);//树根a压栈     while (!StackEmpty(S))//栈非空     {         Pop(&S, &p);//弹出a         if (!Visit(p->data))//访问a         {             return ERROR;         }         if (p->leftChild)         {             Push(&S, p->rightChild);//b压栈         }         if (p->rightChild)         {             Push(&S, p->leftChild);//c压栈         }     }  //第2次循环体执行      while (!StackEmpty(S))//栈：bc非空     {         Pop(&S, &p);//弹出c         if (!Visit(p->data))//访问c         {             return ERROR;         }         if (p->leftChild)//c无左右孩子，下面不执行         {             Push(&S, p->rightChild);         }         if (p->rightChild)         {             Push(&S, p->leftChild);         }     }  //第3次循环体执行      while (!StackEmpty(S))//栈：b；非空     {         Pop(&S, &p);//弹出b         if (!Visit(p->data))//访问b         {             return ERROR;         }         if (p->leftChild)         {             Push(&S, p->rightChild);//d压栈         }         if (p->rightChild)//无R孩子         {             Push(&S, p->leftChild);         }     }  //第4次循环体执行      while (!StackEmpty(S))//栈：d；非空     {         Pop(&S, &p);//弹出d         if (!Visit(p->data))//访问d         {             return ERROR;         }         if (p->leftChild)         {             Push(&S, p->rightChild);//e压栈         }         if (p->rightChild)//d无R孩子         {             Push(&S, p->leftChild);         }     }  //第5次循环体执行      while (!StackEmpty(S))//栈：e；非空     {         Pop(&S, &p);//弹出e         if (!Visit(p->data))//访问e         {             return ERROR;         }  //e无左右孩子，下面不执行         if (p->leftChild)         {             Push(&S, p->rightChild);         }         if (p->rightChild)         {             Push(&S, p->leftChild);         }     }  //第6此检测循环条件，栈空，退出循环。over //这里无非是“根，右孩子，左孩子”先顺序访问的。有点不常用，常用的是“根，左孩子，右孩子”不过没有差别 //中间if语句调整以下就变换过来了  你滴明白？

自己试着用非递归实现二叉树的遍历你就能想通了

二叉树的非递归算法,是对递归算法的模拟  二叉树遍历中,前序遍历的非递归算法做法是  1)处理当前(根)节点, 最先处理根节点,所以是前序遍历 2)然后处理左右子树         2.1)有左右子树,右子入栈.            接着左子成为新的当前(根)节点,        2.2)无左子,右子成为新的当前(根)结点        2.3)每当处理到无左右子的时候.              弹出压栈的节点,----某子树的右节点 .....逐级处理.直到栈空.  因为左子直接处理,所以不用压栈. 无左子且无右子,则为叶子节点,不用继续遍历了. 于是处理栈中存放的数据----被压入栈中的某个右子树.  不论是否平衡二叉树,都可以完成遍历

引用 6 楼 zhao4zhong1 的回复:《算法精解（C语言实现）》 《算法精解C语言实现》例子代码\examples_pc\include\bitree.h 《算法精解C语言实现》例子代码\examples_pc\examples\bistree\ex-1.c 前辈不好意思，我水平菜，实在消化不了您说的这些高深的。 就我问的那些您给解答一下呗。

提示你在调试类似树、图这类复杂数据结构的代码时，随时显示其可视化的内容。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h>  struct node {     char *word;     struct node *left, *right; };  struct node *tree;  void showTree(struct node *aTree) {     if (aTree == NULL) return;     printf(" @%p: %s \t/%p\t\t\\%p\n", aTree, aTree->word, aTree->left, aTree->right);     showTree(aTree->left);     showTree(aTree->right); }  这是咋回事？不明白你的意思

等人来解答。

仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h>  struct node {     char *word;     struct node *left, *right; };  struct node *tree;  void showTree(struct node *aTree) {     if (aTree == NULL) return;     printf(" @%p: %s \t/%p\t\t\\%p\n", aTree, aTree->word, aTree->left, aTree->right);     showTree(aTree->left);     showTree(aTree->right); }  struct node *nodeWith(char *aWord) {     struct node *node;     node = (struct node *)calloc(1,sizeof(struct node));     node->word = aWord;     return (node); }  // Pretty much as Rubin started it on the board and others refined struct node *findOrInsert(struct node *aTree, char *aWord) {     int cmp;     printf("findOrInsert(...%s\n", aWord);     if ((cmp = strcmp(aWord, aTree->word)) == 0) return(aTree);     if (cmp < 0) {         if (aTree->left) return (findOrInsert(aTree->left, aWord));         aTree->left = nodeWith(aWord);         return (aTree->left);     } else {         if (aTree->right) return (findOrInsert(aTree->right, aWord));         aTree->right = nodeWith(aWord);         return (aTree->right);     } }  int main() {     tree = (struct node *)calloc(1,sizeof(struct node));     tree->word = "root";     showTree(tree);     findOrInsert(tree, "leave");     showTree(tree);     findOrInsert(tree, "house");     showTree(tree);     findOrInsert(tree, "mouse");     showTree(tree);     findOrInsert(tree, "house");     showTree(tree);     return 0; } // @00411900: root        /00000000               \00000000 //findOrInsert(...leave // @00411900: root        /00411870               \00000000 // @00411870: leave       /00000000               \00000000 //findOrInsert(...house //findOrInsert(...house // @00411900: root        /00411870               \00000000 // @00411870: leave       /00411830               \00000000 // @00411830: house       /00000000               \00000000 //findOrInsert(...mouse //findOrInsert(...mouse // @00411900: root        /00411870               \00000000 // @00411870: leave       /00411830               \004117F0 // @00411830: house       /00000000               \00000000 // @004117F0: mouse       /00000000               \00000000 //findOrInsert(...house //findOrInsert(...house //findOrInsert(...house // @00411900: root        /00411870               \00000000 // @00411870: leave       /00411830               \004117F0 // @00411830: house       /00000000               \00000000 // @004117F0: mouse       /00000000               \00000000 //

也就是因为无右子树，左子树也没法进栈了。  还有个问题，是关于栈操作的。 Status GetTop(SqStack S,SElemType *e){     if(S.top == S.base)     {         return FALSE;     }     else     {         *e = *(S.top-1);         return OK;     } 以及 Status Pop(SqStack *S,SElemType *e){     if(S->top==S->base)     {         return ERROR;     }     *e = *(--S->top);     return OK; } 请帮忙解释下*e = *(S.top-1);和  *e = *(--S->top);各是什么意思。因为中序非递归遍历其实我也有点看不明白。 顺便（算法博大精深，层序遍历已经看的我醉了。）


Question: swu 为什么16行的j变为了《5？17 18行printf两次？

介系双重循环

已改 问题：为什么16行的j要《5？而i不用？想不通。

你不在"%d"后面加空格"%d "，怎么区别 1,0,1 10,1 101 ?


Question: 请教一个select的问题

引用 4 楼 flt1119 的回复:[quote=引用 3 楼 mujiok2003 的回复:] void pulse_recv() {     printf("pulse_recv() Called!\n\n"); }  当socket可读的时候，你要把数据取走，要不然，你下次select的时候，肯定还是可读的状态，所以引用select就会疯狂的调用pulse_recv函数。 万分感激！！！不过我好像只有20多分了[/quote] 分无所谓， 最重要是问题解决了。

引用 3 楼 mujiok2003 的回复:void pulse_recv() {     printf("pulse_recv() Called!\n\n"); }  当socket可读的时候，你要把数据取走，要不然，你下次select的时候，肯定还是可读的状态，所以引用select就会疯狂的调用pulse_recv函数。 万分感激！！！不过我好像只有20多分了

代码每次循环开始都会调用下面两句，试过使用FD_CLR也不行。         FD_ZERO(&fd_read);         FD_SET(sock_bind, &fd_read);

操作完成后应该重置select处理的套接字描述符


Question: 这道poj的题目是个什么意思？没看懂

google啊...

不懂英文没关系,  连接搜索都不愿意去做, 那就是你的不对了.  百度一下, 一大堆在线翻译.


Question: 有n个人围成一圈，顺序排号。从第一个人开始报数，凡报到3的人退出圈子，问最后留下的是几号？

#include <stdio.h> int main() { 	int a[100]; 	int n; 	int i; 	int count; 	int j=0; 	int index=0; 	scanf("%d",&n); 	 	for(i=0;i<n;i++) 		a[i]=i+1; 	for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++) 	{ 		if(count%3==0) 		{ 			for(j=i;j<n-index;j++) 				a[j]=a[j+1]; 			count++;		//判断是否是3（被3整除） 			index++;		//index记录淘汰了几个数 		} 	}	 		 	printf("%d\n",a[0]); 	return 0; }

引用 1 楼 halfword1982 的回复:m等于n-1时，圈内只有1个人了，while循环不用再执行了。如果while循环条件改为m<n，while循环退出后，数组num的元素全部被置0，无法输出最后一个出圈人的编号。 我看懂了，谢谢你。因为之前没有想明白，然后自己在草稿纸上计算时也弄错了。

同上。。。。


Question: 求3*3矩阵对角线元素和

1、scanf 没有加取地址符“&”  =====》scanf("%d",&a[i][j]); 2、如果是自己练习学习，想看到明显结果，可以再后面加一句getchar()； 这样程序运行后会等待你输入字符今后结束。  #include <stdio.h> int main() {     int i, j, a[3][3], s = 0;     printf("请输入任意9个数字:  ");     for (i = 0; i<3; i++)     {         for (j = 0; j<3; j++)             scanf("%d", &a[i][j]); // 修改的地方     }       for (i = 0; i<3; i++)     {         for (j = 0; j<3; j++)         if (i == j)         {                s += a[i][j] + a[i][2 - j];         }     }     printf("%d\n", s);      getchar();//修改的地方     return 0; }

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

scanf没有取地址scanf("%d",&a[i][j]);

#include <stdio.h> int main() { int i,j,a[3][3],s=0; printf("请输入任意9个数字:  "); for(i=0;i<3;i++) {for(j=0;j<3;j++)         scanf("%d",&a[i][j]); }     for(i=0;i<3;i++) {   //printf("%d%d",i,j); 	j=i; s+=a[i][j];  }	 printf("%d\n",s);  return 0;     }

#include <stdio.h> int main() { 	int i, j, a[3][3], s = 0; 	printf("请输入任意9个数字:  "); 	for (i = 0; i<3; i++) 	{ 		for (j = 0; j<3; j++) 			scanf("%d", &a[i][j]); //scanf("%d", a[i][j]); 	}  	for (i = 0; i<3; i++) 	{ 		for (j = 0; j<3; j++) 		if (i == j) 		{   //printf("%d%d",i,j); 			s += a[i][j] + a[i][2 - j]; 		}  	} 	printf("%d\n", s);  	return 0; }


Question: Apache Lucy使用C 语言编写，提供 Perl 语言的绑定，c++能调用吗？

C++将待加工的数据写到文本文件a.txt中,启动Perl Perl从文件a.txt中读取数据，调用Apache Lucy，将结果写到文本文件b.txt中，写完后将b.txt改名为c.txt,退出。 C++从c.txt文件中读出结果。  以上C++通过纯文本文件间接调用了Apache Lucy（使用C 语言编写，提供 Perl 语言的绑定）

引用 1 楼 zhao4zhong1 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 你说的能具体点吗？c++怎么调用Lucy？


Question: 如何用C编写 把文本中的网址提取出来！

撸主加油，字符串解析啥的最能提高编程水平了

用C来干这活就是蛋疼，用perl或python吧。

引用 23 楼 WizardOz 的回复:快使用正则式  哼哼哈嘿

快使用正则式

引用 31 楼 derekrose 的回复:赵老师闲的蛋疼赵老师？

赵老师闲的蛋疼

这是本网址的图片链接

引用 17 楼 gz_qmc 的回复:纯C void  GetImageAddress(char *FileName) { 	FILE   *fp; 	char   sflag[11]="<img src=\"";        //特征码 	char   dflag[11]={0}; 	bool   same=false; 	char   buf[1024]; 	char   ch; 	int    i;   	fp=fopen(FileName,"rb"); 	if(NULL==fp) return; 	while(1) 	{ 		dflag[9]=fgetc(fp); 		if(feof(fp)) break; 		same=true; 		for(i=0;i<10;i++) 			same&=(sflag[i]==dflag[i]); 		same&=(sflag[9]==dflag[9]); 		if(same)  		{ 			memset(dflag,0,10); 			memset(buf,0,1024); 			i=0; 			while(1) 			{ 				ch=fgetc(fp); 				if(feof(fp)) 				{ 					fclose(fp); 					return; 				} 				if(ch=='\"') break; 				buf[i]=ch; 				i++; 			} 			printf("%s\n",buf); 		} 		else 		{ 			for(i=0;i<9;i++) 			dflag[i]=dflag[i+1]; 		} 	} 	fclose(fp); } 应用举例 int main() { 	GetImageAddress("E:\\A.HTM"); 	return 0; }恩，我把你的代码加以改进！现在已经能查询出图片的网址，但是现在差最后一步如何下载指定链接的图片！

引用 26 楼 clever101 的回复:用C来干这活就是蛋疼，用perl或python吧。 试对比5楼代码和perl或python对一个包含长度大于1000000000000000000000个字节的url的提取效果。

引用 5 楼 zhao4zhong1 的回复:纠正楼上代码： #incldue <stdio.h> #incldue <string.h> FILE *f; char ln[10000]; char url[4096]; char *p; int r,n; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     while (1) {         if (NULL==fgets(ln,10000,f)) break;         p=ln;         while (1) {             r=sscanf(p,"\"http://%4095[^\"]\"%n",url,&n);             if (1==r) {                 p+=n;                 printf("http://%s\n",url);             } else (0==r) {                 p++;             } else break;         }     }     fclose(f);     return 0; } 但是我的文本文件时网站的源码，里面有很多的网址，我只想把<img>图片网址提取出来，你这种方法只是简单的sscanf操作吧！

没实际编译链接调试，不保证对。仅供参考： #incldue <stdio.h> #incldue <string.h> FILE *f; char ln[10000]; char url[4096]; char *p; int r,n; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     while (1) {         if (NULL==fgets(ln,10000,f)) break;         p=ln;         r=sscanf(p,"\"http://%[^\"]\"%n",url,&n);         if (1==r) {             p+=n;             printf("http://%s\n",url);         } else (0==r) {             p++;         } else break;     }     fclose(f);     return 0; }

lairena

在线等！

引用 21 楼 zhou3391817 的回复:[quote=引用 20 楼 zhao4zhong1 的回复:] [quote=引用 15 楼 qq120848369 的回复:] 正则最通用哈，你有dom解析库也可以哈。 提醒：在string parse问题域中，正则表达式不是万能的；而有限状态自动机是万能的。[/quote] 有限状态自动机 是什么 ？[/quote] 参考《编译原理》中的词法分析和有限状态自动机。

引用 20 楼 zhao4zhong1 的回复:[quote=引用 15 楼 qq120848369 的回复:] 正则最通用哈，你有dom解析库也可以哈。 提醒：在string parse问题域中，正则表达式不是万能的；而有限状态自动机是万能的。[/quote] 有限状态自动机 是什么 ？

引用 15 楼 qq120848369 的回复:正则最通用哈，你有dom解析库也可以哈。 提醒：在string parse问题域中，正则表达式不是万能的；而有限状态自动机是万能的。

至于重复的，自己想办法吧过滤吧


Question: 关于指针数组初始化

引用 2 楼 u010470077 的回复:不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？

引用 7 楼 u010470077 的回复:[quote=引用 5 楼 sholber 的回复:] [quote=引用 4 楼 u010470077 的回复:] [quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。[/quote]  首先，用编译器来验证串字面值的类型本身就是不对的，更何况你用的是VS2010之类的编译器。如果能用编译器来说明问题，那么，对于以下代码，我用gcc和clang得到的结果和你的不同，你又如何解释： printf("%d, %d\n", sizeof (const char *), sizeof "hello!"); 另外，你这个const也不知从何而来。建议你在gcc上试试这个： "hello!"[0] = 1; 尽管它是未定义的，但毕竟它不会告诉你"hello!"[0]是只读对象。 其它用语不严谨的问题就不说了。串字面值到底是什么，还得看标准。[/quote]  好吧，既然如此，我只能拿出经典来证明了，在《C++ Primer》第4章4.3节C风格字符串中明确提到：”字符串字面值的类型就是const char 类型的数组" 还有你这样公开地说楼主大哈瓜，是不是太不考虑别人感受了？[/quote]  用编译器解释不了，就用教材来解释？《C++ Primer》没看过，不知道是不是经典，但很多人认为谭浩强的C也很经典，是不是可以用谭浩强的书来解释呢？ 言归正传，你至少承认串字面值是数组了。不过，这个const，C和C++是不一样的。你需要明确地解释，串字面值的类型到底是不是const限定的。不要再用《C++ Primer》，那是C++，而且不是所有人都承认它是经典。 最好的办法是引用C标准文档中的条文来解释，而不是用别的书或者编译器，那都是靠不住的。  PS：我认为楼主的确是大哈瓜。

引用 5 楼 sholber 的回复:[quote=引用 4 楼 u010470077 的回复:] [quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。[/quote]  首先，用编译器来验证串字面值的类型本身就是不对的，更何况你用的是VS2010之类的编译器。如果能用编译器来说明问题，那么，对于以下代码，我用gcc和clang得到的结果和你的不同，你又如何解释： printf("%d, %d\n", sizeof (const char *), sizeof "hello!"); 另外，你这个const也不知从何而来。建议你在gcc上试试这个： "hello!"[0] = 1; 尽管它是未定义的，但毕竟它不会告诉你"hello!"[0]是只读对象。 其它用语不严谨的问题就不说了。串字面值到底是什么，还得看标准。[/quote]  好吧，既然如此，我只能拿出经典来证明了，在《C++ Primer》第4章4.3节C风格字符串中明确提到：”字符串字面值的类型就是const char 类型的数组" 还有你这样公开地说楼主大哈瓜，是不是太不考虑别人感受了？

楼主这个大哈瓜，问题没搞清楚就结帖了，还把分给了回答错误的人，无语鸟。

引用 4 楼 u010470077 的回复:[quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。[/quote]  首先，用编译器来验证串字面值的类型本身就是不对的，更何况你用的是VS2010之类的编译器。如果能用编译器来说明问题，那么，对于以下代码，我用gcc和clang得到的结果和你的不同，你又如何解释： printf("%d, %d\n", sizeof (const char *), sizeof "hello!"); 另外，你这个const也不知从何而来。建议你在gcc上试试这个： "hello!"[0] = 1; 尽管它是未定义的，但毕竟它不会告诉你"hello!"[0]是只读对象。 其它用语不严谨的问题就不说了。串字面值到底是什么，还得看标准。

引用 3 楼 sholber 的回复:[quote=引用 2 楼 u010470077 的回复:] 不可以。指针的初始化或赋值可以使用0值常亮表达式和类型匹配的对象的地址。 如上，字符串字面值常量类型为const char *，与指针类型匹配，可赋值。但整形字面值常量并不是int类型，故而不可赋给int *类型指针 你有什么证据证明串字面值的类型是const char *？ 你有什么证据证明整型常量1、2、3、4、5不是int类型？[/quote]  不好意思，昨晚太匆忙，以致出现回答错误。十分抱歉 首先楼主问题的正确解释应该为以下内容： 1、字符串字面值常量赋给指针时，会隐含地将此字符串内存单元首地址赋给指针。 2、字符串字面值常量的类型也确实为const char *类型，例如在VS2010中编写以下代码时，编译器报错时会提示字符串字面值常量为const char *，也符合类型匹配原则。 int *names[] = {"abxd", "sefh"}; 3、整形字面值常量可以为int, long等类型，详见《C++ Primer》第二章2.2节。但给指针赋值应该是地址，即&i，VS2010下编译错误也会提示：不可将int 类型赋给int *类型。 最后也感谢3楼的提醒与质疑。

不可以


Question: VC输出字体，如图

高手快来帮帮忙啊，急

引用 2 楼 zhao4zhong1 的回复:#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(12,0,900,900,0,0,0,0,0,0,0,0,0,"宋体");     SelectObject(hdc,hfont);     TextOutW(hdc,100,200,L"臭氧总量相对差别∕％",10);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     return 0; }   好强大！


Question: Cstring 字符串截取

非常感谢Mr.zhang的例子，已收藏，我使用以下的方法搞定了，因为要要找很多“T19#。。。。。。#”使用Tokenize+token+for循环 CArray<CString> V; 	TCHAR *token; 	TCHAR seps[]   = L"#"; 	TCHAR *data=szData.GetBuffer(); 	token = _tcstok( data, seps );  	while( token != NULL ) 	{  		V.Add(token);  		token = _tcstok( NULL, seps );  	}  	int size=V.GetSize(); 	size=V.GetSize();  	for(int i=0;i<size;i++) 	{ 		if(V.GetAt(i).Find(L"0")!=-1) 		{ 		int uPos1 = 0; 		CString sn= V.GetAt(i).Tokenize(L",",uPos1).Trim(); 		CString result= V.GetAt(i).Tokenize(L",",uPos1).Trim(); 	}

引用 1 楼 user-2 的回复:CString好像有Find方法，查找"T19#"再结合Mid方法就可以取出需要的字串了 CString::Find  int Find( TCHAR ch ) const;  int Find( LPCTSTR lpszSub ) const;  int Find( TCHAR ch, int nStart ) const;  int Find( LPCTSTR pstr, int nStart ) const;  Return Value  The zero-based index of the first character in this CString object that matches the requested substring or characters; -1 if the substring or character is not found.  Parameters  ch  A single character to search for.  lpszSub  A substring to search for.  nStart  The index of the character in the string to begin the search with, or 0 to start from the beginning. The character at nStart is excluded from the search if nStart is not equal to 0.  pstr  A pointer to a string to search for.  Remarks  Searches this string for the first match of a substring. The function is overloaded to accept both single characters (similar to the run-time function strchr) and strings (similar to strstr).  Example  // First example demonstrating  // CString::Find ( TCHAR ch ) CString s( "abcdef" ); ASSERT( s.Find( 'c' ) == 2 ); ASSERT( s.Find( "de" ) == 3 );  // Second example demonstrating  // CString::Find( TCHAR ch, int nStart ) CString str("The stars are aligned"); int n = str.Find('e', 5); ASSERT(n == 12);  CString Overview |  Class Members |  Hierarchy Chart  See Also   CString::ReverseFind, CString::FindOneOf   CString::Mid  CString Mid( int nFirst ) const; throw( CMemoryException );  CString Mid( int nFirst, int nCount ) const; throw( CMemoryException );  Return Value  A CString object that contains a copy of the specified range of characters. Note that the returned CString object may be empty.   Parameters  nFirst  The zero-based index of the first character in this CString object that is to be included in the extracted substring.  nCount  The number of characters to extract from this CString object. If this parameter is not supplied, then the remainder of the string is extracted.  Remarks  Extracts a substring of length nCount characters from this CString object, starting at position nFirst (zero-based). The function returns a copy of the extracted substring. Mid is similar to the Basic MID$ function (except that indexes are zero-based).  For multibyte character sets (MBCS), nCount refers to each 8-bit character; that is, a lead and trail byte in one multibyte character are counted as two characters.  Example  The following example demonstrates the use of CString::Mid.  // example for CString::Mid CString s( _T("abcdef") ); ASSERT( s.Mid( 2, 3 ) == _T("cde") );  CString Overview |  Class Members |  Hierarchy Chart  See Also   CString::Left, CString::Right


Question: 实现strpbrk出现段错误

8             if(str1==str2) ----> if(*str1==*str2)


Question: 关于tc的图形初始化问题，高手请给个指点呗

没定义　　　声明一下就可以了

你的TC是安装版还是解压拷贝版？设置里面关于directory的看一下，如include、lib等目录要与TC所在的目录一致。 TC在Windows下使用不方便（除非Win98），你也可以看一下http://www.easyx.cn，可以在VC里面使用TC的绘图函数，差不多完全兼容，看个示例就明白了。

那怎样设置呢？

没设置链接graphic的库？


Question: c语言文件问题求帮助

fwrite(head,sizeof(head),1,fp); fread(pnew,sizeof(head),1,fp); 这两句的sizeof都不正确。head是一个指针，sizeof得到的大小是指针类型的大小，也就是4。 而代码的愿意是把整个结构体写入文件，再读出来。所以这两句都要改成sizeof(struct sale)

对,sizeof(head)得到的是指针占用空间大小有时和int占用同样大小.所以读int是这样用可能能得到正确结果,而读字符串是就不行了.因为字符串占了10个字节,肯定大于这个值.


Question: 数据转换

通过位操作很难得到1,2,3这样的值吧，得到的应该是0,1,2,4这样的

虽然你不希望用一个特定函数来做 但是看你初学的份上,就不屌你了  int    BinToDec(char *b,BOOL type) {        char ch;        int     r;        if(type) ch='1';        else  ch='0';        for(r=0;r<4;r++)        if(*(b+r)==ch) break;        r=4-r;        return r; }  type=false时转换串一类型 type=true时转换串二类型

位操作都是 2*n   |可以

第一串 char  *x="1110"; int       y; for(y=0;y<4;y++)    if(*(x+y)=='0') break; y=4-y; y就是转换的结果 第二串 char  *x="0010"; int       z; for(z=0;z<4;z++)    if(*(x+z)=='1') break; z=4-z; z就是转换的结果

只看描述，要求用一个函数进行转换是不合理的。

若只想得到结果，与、或、取反、异或、左移、右移组合使用肯定可以，但是好像没什么意思


Question: OpenGL如何设置鼠标位置？

鼠标位置设置和OPENGL绘图有关系？

引用 3 楼 vshoot99 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] C标准库和OpenGL都不应该负责在什么位置显示鼠标吧。     那么应该怎么指定鼠标位置呢？有什么思路或者解决办法吗？[/quote] SetCursorPos（）是需要windows支持的。

找OpenGL的API啊，去官网找它的手册，这都是开放的东西

SetCursorPos The SetCursorPos function moves the cursor to the specified screen coordinates. If the new coordinates are not within the screen rectangle set by the most recent ClipCursor function, the system automatically adjusts the coordinates so that the cursor stays within the rectangle.   BOOL SetCursorPos(   int X,  // horizontal position   int Y   // vertical position );   Parameters X  Specifies the new x-coordinate, in screen coordinates, of the cursor.  Y  Specifies the new y-coordinate, in screen coordinates, of the cursor.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, callGetLastError.   Remarks The cursor is a shared resource. A window should move the cursor only when the cursor is in its client area.   The calling process must have WINSTA_WRITEATTRIBUTES access to the window station.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Unsupported.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Cursors Overview, Cursor Functions, ClipCursor, GetCursorPos, SetCaretPos, SetCursor, ShowCursor

引用 1 楼 zhao4zhong1 的回复:C标准库和OpenGL都不应该负责在什么位置显示鼠标吧。     那么应该怎么指定鼠标位置呢？有什么思路或者解决办法吗？

搜网络教程“学OpenGL编3D游戏”？

C标准库和OpenGL都不应该负责在什么位置显示鼠标吧。


Question: 正则表达式 在线等

^D/[a-zA-Z0-9\(\)\.\:\ \-\,\/]+  自己解决了


Question: 0x1L在c语言中是什么意思

0x1L long型整数。

C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  integer-constant :  decimal-constant integer-suffixopt octal-constant integer-suffixopt hexadecimal-constant integer-suffixopt 'c-char-sequence'  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffixopt long-suffix unsigned-suffixopt  unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal  To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit  To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the “x” does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i  To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value

整形常量的后缀表示其类型，包括如下后缀，其中U和L的大小写通用 后缀        类型 L           long int LL         long long int U          unsigned int UL        unsigned long int ULL      unsigned long long int

字面值，后缀L表示是一个long型。0x1说它是一个十六进制数。

没见过东西   好像不是asic码吧


Question: C语言子程序定义了返回类型，未return，为何能返回值

读了函数名指向内存

在你没找到编译器明确遵循的ABI前只能当成是运气。 不管怎么说从C的角度上这样写就是错的。

不要盲目相信编译器 因为编译器也是人写的

EAX被默认为存储着返回值的Register.

只是声明了void   只好还是看编译器


Question: openGL旋转时变形！

引用 3 楼 zhao4zhong1 的回复:改用平行投影？  没试过平行投影    能给点提示吗？谢谢

改用平行投影？

引用 1 楼 zhao4zhong1 的回复:透视投影的话，不拉伸才不正常吧。我猜。 是啊    旋转的时候肯定会造成拉伸，我想要在旋转的时候图像不拉伸，应该如何修改呢

http://blog.csdn.net/pizi0475  搜网络教程“学OpenGL编3D游戏”。

透视投影的话，不拉伸才不正常吧。我猜。


Question: 超越前辈没有？九九乘法表新写法

引用 21 楼 aqtata 的回复:[quote=引用 7 楼 u012997273 的回复:] 楼主，前辈没那么容易超越的，这里有很多厉害的人的 顺便卖弄一下自己写的一个，不好的地方请多多指正  void Get9x9() { 	char msg[1024] = {0}; 	__asm 	{ 		mov ax, 0 		lea edx, msg loopbegin1: 		cmp ah, 9 		jnb loopend 		inc ah 		mov al, 0 loopbegin2: 		cmp al, ah 		jnb loopend2 		inc al 		mov ch, '0' 		add ch, al 		mov [edx], ch 		inc edx 		mov [edx], 'x' 		inc edx 		mov ch, '0' 		add ch, ah 		mov [edx], ch 		inc edx 		mov [edx], '=' 		inc edx 		push ax 		mov bl, ah 		mul bl 		mov bh, 10 		div bh 		mov ch, al 		add ch, '0' 		mov [edx], ch 		inc edx 		mov ch, ah 		add ch, '0' 		mov[edx], ch 		inc edx 		pop ax 		mov [edx], 32 		inc edx 		jmp loopbegin2	 loopend2: 		mov [edx], 10 		inc edx 		jmp loopbegin1 loopend: 		mov [edx], 10 	} 	printf(msg); }   不支持x64，负分！[/quote] 支持x64的方法也有，呵呵 vc x64不支持__asm，可以交叉编译啊， 就是看你愿意不愿意深追究了

引用 32 楼 TBWood 的回复:[quote=引用 29 楼 u012997273 的回复:] 其实我也只是表达一个意思，对于不完全了解的，别说绝对， 因为很容易误导人而已，也没别的，如果你认为不对，当我没说好了  不要紧张，没事，大家都在学习嘛，结果都是讨论出来的～～～ BitBlt是WINAPI哦，跟3D关系不大，OpenGL，DX是3D绘图，讲的怎么在3D范畴里快速的绘图，大部分都是对内存向量数据的操作。 BitBlt是画布绘图，2D。 [/quote] 恩，那个是直接操作硬件(通过一组接口)， 比gdi快，我也没有紧张啦，呵呵， 你心态也蛮好的，我还以为只有我心态好呢，呵呵

引用 29 楼 u012997273 的回复:其实我也只是表达一个意思，对于不完全了解的，别说绝对， 因为很容易误导人而已，也没别的，如果你认为不对，当我没说好了  不要紧张，没事，大家都在学习嘛，结果都是讨论出来的～～～ BitBlt是WINAPI哦，跟3D关系不大，OpenGL，DX是3D绘图，讲的怎么在3D范畴里快速的绘图，大部分都是对内存向量数据的操作。 BitBlt是画布绘图，2D。

引用 30 楼 wangting627 的回复:难道还有比bitblt快的方式？那为什么双缓冲时候就只采用bitblt了呢 我讨厌你头像，具体说，是讨厌韦德

难道还有比bitblt快的方式？那为什么双缓冲时候就只采用bitblt了呢

引用 26 楼 TBWood 的回复:[quote=引用 25 楼 u012997273 的回复:] [quote=引用 24 楼 TBWood 的回复:] 怎么感觉是要solo啊，是要拉分支写代码决斗么，bitblt和 3D有关系？ 那个到不至于， 你说的最最快的，就是bitblt输出到屏幕画布。。。 这个，不能瞎说的，容易误导人嘛，呵呵[/quote]  恩，我就随便举个说笑的例子，不要那么当真，楼主的算法肯定是有价值的。 关于bitblt输出到CMD屏幕画布，虽是戏言，但也没错，bitblt是WINAPI提供的直接绘制内存图案到窗体的最快方式，CMD窗体最终显示也是一个画布。输出流输出到屏幕的过程，也必然是在CMD窗体画布上绘图的结果。  [/quote] 呵呵，可能咱们说的不一样， 如果仅仅是输出到屏幕，你那个不是最快的， 我不懂游戏开发，不熟悉directX的一套开发， 但是应该比你那个快多了 你认为游戏，播放器之类的输出到屏幕，屏幕切换，会不会比bitblt快多了？

# include <stdio.h> # include <stdlib.h>  void f(int i) {     for(int g=(int){1};g<=i;printf("%d*%d=%d\t", i,g++, i*g)); } # define i int main(void){ # define love for(int h=(int){1};h<=9;f(h++),printf("\n")); # define you }  i love you

引用 25 楼 u012997273 的回复:[quote=引用 24 楼 TBWood 的回复:] 怎么感觉是要solo啊，是要拉分支写代码决斗么，bitblt和 3D有关系？ 那个到不至于， 你说的最最快的，就是bitblt输出到屏幕画布。。。 这个，不能瞎说的，容易误导人嘛，呵呵[/quote]  恩，我就随便举个说笑的例子，不要那么当真，楼主的算法肯定是有价值的。 关于bitblt输出到CMD屏幕画布，虽是戏言，但也没错，bitblt是WINAPI提供的直接绘制内存图案到窗体的最快方式，CMD窗体最终显示也是一个画布。输出流输出到屏幕的过程，也必然是在CMD窗体画布上绘图的结果。

引用 24 楼 TBWood 的回复:怎么感觉是要solo啊，是要拉分支写代码决斗么，bitblt和 3D有关系？ 那个到不至于， 你说的最最快的，就是bitblt输出到屏幕画布。。。 这个，不能瞎说的，容易误导人嘛，呵呵

引用 19 楼 u012997273 的回复:[quote=引用 14 楼 TBWood 的回复:] [quote=引用 13 楼 lin5161678 的回复:] [quote=引用 9 楼 TBWood 的回复:] 精神可嘉。。。不过不要觉得 使用 __下划线很帅。可读性极差。  如果一定要比的话，我想没有比下面的代码更快的了。  #include <stdio.h> void main() { char * str= "1x1=1 \n1x2=2 2x2=4\n1x3=3 2x3=6 3x3=9\n1x4=4 2x4=8 3x4=12 4x4=16\n1x5=5 2x5=10 3x5=15 4x5=20 5x5=25\n1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36\n1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49\n1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64\n1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81"; printf(str); }   #include <stdio.h> void main() {puts("1x1=1 \n1x2=2 2x2=4\n1x3=3 2x3=6 3x3=9\n1x4=4 2x4=8 3x4=12 4x4=16\n1x5=5 2x5=10 3x5=15 4x5=20 5x5=25\n1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36\n1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49\n1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64\n1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81");} 比你的做法快 妥妥的[/quote] 汗～～ 到这一步就没意思了。。。 最最快就是bitblt输出到屏幕画布。。。[/quote] 话说，楼主了解屏幕画布么，了解3D么，呵呵，话不能说的太绝对了，自己不知道，并不代表别人也不知道[/quote]  怎么感觉是要solo啊，是要拉分支写代码决斗么，bitblt和 3D有关系？

引用 22 楼 aqtata 的回复:[quote=引用 20 楼 mujiok2003 的回复:] [quote=引用 4 楼 xql2008 的回复:] l楼主你的代码可读性不怎么好啊！ 可读性很重要，呵呵。 [/quote] 这种帖子就别讨论什么可读性了，我还说你搞个9x9乘法表干啥呢？工作中也能用到吗？[/quote] 我认为：除非你写的一次性代码，否则只要有读者（读者可能是你自己哦），就要把可读性放在首位。

引用 20 楼 mujiok2003 的回复:[quote=引用 4 楼 xql2008 的回复:] l楼主你的代码可读性不怎么好啊！ 可读性很重要，呵呵。 [/quote] 这种帖子就别讨论什么可读性了，我还说你搞个9x9乘法表干啥呢？工作中也能用到吗？

引用 7 楼 u012997273 的回复:楼主，前辈没那么容易超越的，这里有很多厉害的人的 顺便卖弄一下自己写的一个，不好的地方请多多指正  void Get9x9() { 	char msg[1024] = {0}; 	__asm 	{ 		mov ax, 0 		lea edx, msg loopbegin1: 		cmp ah, 9 		jnb loopend 		inc ah 		mov al, 0 loopbegin2: 		cmp al, ah 		jnb loopend2 		inc al 		mov ch, '0' 		add ch, al 		mov [edx], ch 		inc edx 		mov [edx], 'x' 		inc edx 		mov ch, '0' 		add ch, ah 		mov [edx], ch 		inc edx 		mov [edx], '=' 		inc edx 		push ax 		mov bl, ah 		mul bl 		mov bh, 10 		div bh 		mov ch, al 		add ch, '0' 		mov [edx], ch 		inc edx 		mov ch, ah 		add ch, '0' 		mov[edx], ch 		inc edx 		pop ax 		mov [edx], 32 		inc edx 		jmp loopbegin2	 loopend2: 		mov [edx], 10 		inc edx 		jmp loopbegin1 loopend: 		mov [edx], 10 	} 	printf(msg); }   不支持x64，负分！

引用 4 楼 xql2008 的回复:l楼主你的代码可读性不怎么好啊！ 可读性很重要，呵呵。

引用 14 楼 TBWood 的回复:[quote=引用 13 楼 lin5161678 的回复:] [quote=引用 9 楼 TBWood 的回复:] 精神可嘉。。。不过不要觉得 使用 __下划线很帅。可读性极差。  如果一定要比的话，我想没有比下面的代码更快的了。  #include <stdio.h> void main() { char * str= "1x1=1 \n1x2=2 2x2=4\n1x3=3 2x3=6 3x3=9\n1x4=4 2x4=8 3x4=12 4x4=16\n1x5=5 2x5=10 3x5=15 4x5=20 5x5=25\n1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36\n1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49\n1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64\n1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81"; printf(str); }   #include <stdio.h> void main() {puts("1x1=1 \n1x2=2 2x2=4\n1x3=3 2x3=6 3x3=9\n1x4=4 2x4=8 3x4=12 4x4=16\n1x5=5 2x5=10 3x5=15 4x5=20 5x5=25\n1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36\n1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49\n1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64\n1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81");} 比你的做法快 妥妥的[/quote] 汗～～ 到这一步就没意思了。。。 最最快就是bitblt输出到屏幕画布。。。[/quote] 话说，楼主了解屏幕画布么，了解3D么，呵呵，话不能说的太绝对了，自己不知道，并不代表别人也不知道

引用 7 楼 u012997273 的回复:楼主，前辈没那么容易超越的，这里有很多厉害的人的 顺便卖弄一下自己写的一个，不好的地方请多多指正  void Get9x9() { 	char msg[1024] = {0}; 	__asm 	{ 		mov ax, 0 		lea edx, msg loopbegin1: 		cmp ah, 9 		jnb loopend 		inc ah 		mov al, 0 loopbegin2: 		cmp al, ah 		jnb loopend2 		inc al 		mov ch, '0' 		add ch, al 		mov [edx], ch 		inc edx 		mov [edx], 'x' 		inc edx 		mov ch, '0' 		add ch, ah 		mov [edx], ch 		inc edx 		mov [edx], '=' 		inc edx 		push ax 		mov bl, ah 		mul bl 		mov bh, 10 		div bh 		mov ch, al 		add ch, '0' 		mov [edx], ch 		inc edx 		mov ch, ah 		add ch, '0' 		mov[edx], ch 		inc edx 		pop ax 		mov [edx], 32 		inc edx 		jmp loopbegin2	 loopend2: 		mov [edx], 10 		inc edx 		jmp loopbegin1 loopend: 		mov [edx], 10 	} 	printf(msg); } 汇编都出来了。

给楼主赞一个~

你这个弱爆了，你去看C混乱比赛的代码，绝对天书

还是双重循环看着舒服些，不想给脑子增加负担0.0


Question: C程序调试

找个wintc  快得很啊

用printf调试吧

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

请大神们帮个忙

//领域自适应交叉 void cross() { 	double pc1=0.9,pc2=0.6,pc; 	double favg,fmax,temp,p; 	int i,j,t,start,end,point; 	srand((unsigned)time(NULL)); 	for(i=0;i<10;i++){                 //求适应值 		for(j=0;j<10;j++) 		{ 		  TSP[i][j].Distance=0; 		  for(t=1;t<=CITY_NUM;t++) 		 { 			start=TSP[i][j].colony[t-1];end=TSP[i][j].colony[t]; 			 TSP[i][j].Distance= TSP[i][j].Distance+CityDistance[start][end]; 		 } 		TSP[i][j].fitness=1/(TSP[i][j].Distance); 		printf("TSP[%d][%d].fitness=%f,i,j,TSP[i][j].fitness\n"); 		} 	}    Agent sBest=TSP[0][0];           //找出最大适应值 	for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 			if(sBest.fitness<TSP[i][j].fitness) 			{ 				sBest.fitness=TSP[i][j].fitness; 			} 		} 	}   fmax=sBest.fitness;    double sum=0;                      //找出平均适应值    for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 		  sum+=TSP[i][j].fitness; 		} 	}    favg=sum/POPSIZE;    for(i=0;i<10;i++)    { 	   for(j=0;j<10;j++) 	   { 	      if(TSP[i][j].fitness>=favg)   //自适应交叉概率 		       pc=pc1-(pc1-pc2)*(TSP[i][j].fitness-favg)/(fmax-favg); 	      else 		       pc=pc1; 	      p=rand()%1000/1000.0; 	      if(p<pc)   //单点交叉 	     { 		    point=rand()%9+1; 		    for (t=point;t<CITY_NUM;t++) 				{                 temp=TSP[i][j].colony[t];                 TSP[i][j].colony[t]=maxagent.colony[t];                 maxagent.colony[t]=temp 				} 			} 	   }    } }      //自适应变异 void cross() {     double pm1=0.1,pm2=0.001,pm; 	double favg,fmax,temp,p; 	int i,j,t,start,end,point1,point2; 	srand((unsigned)time(NULL)); 	for(i=0;i<10;i++){                 //求适应值 		for(j=0;j<10;j++) 		{ 		  TSP[i][j].Distance=0; 		  for(t=1;t<=CITY_NUM;t++) 		 { 			start=TSP[i][j].colony[t-1];end=TSP[i][j].colony[t]; 			 TSP[i][j].Distance= TSP[i][j].Distance+CityDistance[start][end]; 		 } 		TSP[i][j].fitness=1/(TSP[i][j].Distance); 		printf("TSP[%d][%d].fitness=%f,i,j,TSP[i][j].fitness\n"); 		} 	}    Agent sBest=TSP[0][0];           //找出最大适应值 	for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 			if(sBest.fitness<TSP[i][j].fitness) 			{ 				sBest.fitness=TSP[i][j].fitness; 			} 		} 	}   fmax=sBest.fitness;    double sum=0;                      //找出平均适应值    for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 		  sum+=TSP[i][j].fitness; 		} 	}    favg=sum/POPSIZE;     for(i=0;i<10;i++)    { 	   for(j=0;j<10;j++) 	   { 	      if(TSP[i][j].fitness>=favg)   //自适应变异概率 		       pm=pm1-(pm1-pm2)*(fmax-TSP[i][j].fitness)/(fmax-favg); 		  else 			  pm=pm1; 		   p=rand()%1000/1000.0; 		   if(p<pm)   //对换变异 	      { 	        point1=rand()%10+1; 	        srand((unsigned)time(NULL)); 	        point2=rand()%10+1; 			temp=TSP[i][j].colony[point1]; 			TSP[i][j].colony[point1]=TSP[i][j].colony[point2]; 			TSP[i][j].colony[point2]=temp; 		   } 	   } 	} }      //找出最优智能体 Agent findbest() { 	int i,j,start,end,t; 	for(i=0;i<10;i++){                 //求适应值 		for(j=0;j<10;j++) 		{ 		  TSP[i][j].Distance=0; 		  for(t=1;t<=CITY_NUM;t++) 		 { 			start=TSP[i][j].colony[t-1];end=TSP[i][j].colony[t]; 			 TSP[i][j].Distance= TSP[i][j].Distance+CityDistance[start][end]; 		 } 		TSP[i][j].fitness=1/(TSP[i][j].Distance); 		printf("TSP[%d][%d].fitness=%f,i,j,TSP[i][j].fitness\n"); 		} 	}    Agent sBest=TSP[0][0];           //找出最大适应值 	for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 			if(sBest.fitness<TSP[i][j].fitness) 			{ 				sBest.fitness=TSP[i][j].fitness; 			} 		} 	}   return sBest;  }     //自学习初始种群 void sinitpopulation() { 	int i,j,m,n,t,p; 	Agent spop[9];     srand((unsigned)time(NULL)); 	n=(rand()%5+8)/10; 	for(i=0;i<3;i++) 	{ 	 spop[i].colony[0]=0;      spop[i].colony[10]=0; 	}    Agent  findbest();    spop[5]=findbest();    	for(i=4;i>=0;i--) 	{ 		for(j=1;j<CITY_NUM;j++) 		{          	t=sBest.colony[j]*n; 			if(t<0) 			   spop[i].colony[j]=0; 		    else if(t>9) 			   spop[i].colony[j]=9; 			else 				spop[i].colony[j]=(int)t;            printf(" spop[%d].colony[%d]=%d \n",i,j,spop[i].colony[j]);  		} 	} 	for(m=6;m<9;m++) 	{ 		for(p=1;p<CITY_NUM;p++) 		{           	t=sBest.colony[p]*n; 			if(t<0) 			   spop[m].colony[p]=0; 		    else if(t>9) 			   spop[m].colony[p]=9; 			else 				spop[m].colony[p]=(int)t;            printf(" spop[%d].colony[%d]=%d \n",m,p,spop[m].colony[p]);  		} 	} }    //自学习网格初始化 void sinit() {   int j,k;   for(j=0;j<3;j++)   { 	for(k=0;k<3;k++) 	{	 		tsp[j][k]=spop[j*3+k];         printf("tsp[%d][%d]=%d\n",j,k,tsp[j][k]); 	}   } }   	  //找出自学习种群中最优智能体 Agent  sfindbest() {  	int i,j,start,end,t; 	for(i=0;i<3;i++){                 //求适应值 		for(j=0;j<3;j++) 		{ 		  tsp[i][j].Distance=0; 		  for(t=1;t<=CITY_NUM;t++) 		 { 			start=tsp[i][j].colony[t-1];end=tsp[i][j].colony[t]; 			 tsp[i][j].Distance=tsp[i][j].Distance+CityDistance[start][end]; 		 } 		tsp[i][j].fitness=1/(tsp[i][j].Distance); 		printf("tsp[%d][%d].fitness=%f,i,j,tsp[i][j].fitness\n"); 		} 	}    Agent sBest=tsp[0][0];           //找出最大适应值 	for(i=0;i<3;i++) 	{ 		for(j=0;j<3;j++) 		{ 			if(sBest.fitness<tsp[i][j].fitness) 			{ 				sBest.fitness=tsp[i][j].fitness; 			} 		} 	}   return sBest; }     //自学习           void slearn() {    srand((unsigned)time(NULL));    struct agent  sBest, CBest;    int  r=0,sGen=10;    double sPm=0.05;    sinitpopulation();    sinit();     sBest=sfindbest();    while(r<sGen) 	{ 	 		r++;         scomplete();         smutation();         scaluateenergy();          CBest.energy=sfindbest(); 	}  if(CBest.energy>sBest.energy) 	 sBest=CBest; }    //自学习邻域竞争 [b]void scomplete() { 	int i,j,point1,point2,t; 	double p,po=0.15; 	Agent maxagent;     srand((unsigned)time(NULL)); 	point1=rand()%8+2; 	srand((unsigned)time(NULL)); 	point2=rand()%8+2; 	if(point1>point2) 	{ 		t=point1; 		point1=point2; 		point2=t; 	} 	p=rand()%1000/1000.0;     for(i=0;i<3;i++) 	{ 		for(j=0;j<3;j++) 		{           maxagent=smaxnb(i,j); 			              if(tsp[i][j].fitness<maxagent.fitness) 			 { 				 if(p<po) 				 { 					t=maxagent.colony[point1]; 					maxagent.colony[point1]=maxagent.colony[point2]; 					maxagent.colony[point2]=t; 					tsp[i][j]=maxagent; 				 } 				 else 				 { 					 for(i=point1,j=point2;i<j;i++,j--) 					 { 						 t=maxagent.colony[i]; 					     maxagent.colony[i]=maxagent.colony[j]; 					     maxagent.colony[j]=t; 					 } 					 tsp[i][j]=maxagent; 				 }  	}      Agent smaxnb(int i,int j) {     Agent maxagent;     if(i==0&&j==0) 		maxagent=max(tsp[i][j+1],tsp[i+1][j],tsp[i+2][j],tsp[i][j+2]);      else if(i==0&&j==2) 	    maxagent=max(tsp[i][j-1],tsp[i+1][j],tsp[i][j-2],tsp[i+2][j]);  	else if(i==2&&j==0) 		maxagent=max(tsp[i-1][j],tsp[i][j+1],tsp[i-2][j],tsp[i][j+2]);     	else if(i==2&&j==2)     	maxagent=max(tsp[i][j-1],tsp[i-1][j],tsp[i][j-2],tsp[i-2][j]);      else  if(i==2&&j==1)         maxagent=max(tsp[i][j+1],tsp[i][j-1],tsp[i-1][j],tsp[i-2][j]);      else  if(i==0&&j==1)         maxagent=max(tsp[i][j-1],tsp[i][j+1],tsp[i+1][j],tsp[i+2][j]);      else  if(j==0&&i==1) 	    maxagent=max(tsp[i-1][j],tsp[i+1][j],tsp[i][j+1],tsp[i][j+2]);      else  if(j==2&&i==1) 	   maxagent=max(tsp[i-1][j],tsp[i+1][j],tsp[i][j-1],tsp[i][j-2]);      else 		maxagent=max(tsp[i-1][j],tsp[i+1][j],tsp[i][j-1],tsp[i][j+1]);  	return maxagent; }     //自学习变异  void smutation() {   int i,j,point1,point2,temp;   double p;   for(i=0;i<3;i++)    { 	   for(j=0;j<3;j++) 	   { 		   p=rand()%1000/1000.0; 		   if(p<sPm)   //对换变异 	      { 	        point1=rand()%10+1; 	        srand((unsigned)time(NULL)); 	        point2=rand()%10+1; 			temp=tsp[i][j].colony[point1]; 			tsp[i][j].colony[point1]=tsp[i][j].colony[point2]; 			tsp[i][j].colony[point2]=temp; 		   } 	   } 	} }    //输出 void OutPut(Agent city )    { 	int i,j;  	printf("The population is:\n"); 	for(i=0;i<POPSIZE;i++) 	{ 		for(j=0;j<=CITY_NUM;j++) 		{ 			printf("%5d",TSP[i].colony[j]); 		} 		printf("    %f\n",TSP[i].Distance); 	}  	 	printf("The best rooting is:\n"); 	for(i=0;i<=CITY_NUM;i++) 		printf("%5d",city.BestRooting[i]);  	printf("\nIt's cost value is %f\n",(city.BestValue));  	printf("\n\n\n\n");  }


Question: 求大神帮我把这个C代码换成C++代码！！

泡面吧的？ 引用 楼主 u014650107 的回复:求矩阵的逆矩阵 #include <stdlib.h> #include <math.h> #include <stdio.h>  double *inv(double *a,int n) {  int *is,*js,i,j,k,l,u,v;     double d,p;     is=(int*)malloc(n*sizeof(int));     js=(int*)malloc(n*sizeof(int));     for (k=0; k<=n-1; k++)       { d=0.0;         for (i=k; i<=n-1; i++)         for (j=k; j<=n-1; j++)           { l=i*n+j; p=fabs(a[l]);             if (p>d) { d=p; is[k]=i; js[k]=j;}           }         if (d+1.0==1.0)           { free(is); free(js); printf("err**not inv\n");             return NULL;           }         if (is[k]!=k)           for (j=0; j<=n-1; j++)             { u=k*n+j; v=is[k]*n+j;               p=a[u]; a[u]=a[v]; a[v]=p;             }         if (js[k]!=k)           for (i=0; i<=n-1; i++)             { u=i*n+k; v=i*n+js[k];               p=a[u]; a[u]=a[v]; a[v]=p;             }         l=k*n+k;         a[l]=1.0/a[l];         for (j=0; j<=n-1; j++)           if (j!=k)             { u=k*n+j; a[u]=a[u]*a[l];}         for (i=0; i<=n-1; i++)           if (i!=k)             for (j=0; j<=n-1; j++)               if (j!=k)                 { u=i*n+j;                   a[u]=a[u]-a[i*n+k]*a[k*n+j];                 }         for (i=0; i<=n-1; i++)           if (i!=k)             { u=i*n+k; a[u]=-a[u]*a[l];}       }     for (k=n-1; k>=0; k--)       { if (js[k]!=k)           for (j=0; j<=n-1; j++)             { u=k*n+j; v=js[k]*n+j;               p=a[u]; a[u]=a[v]; a[v]=p;             }         if (is[k]!=k)           for (i=0; i<=n-1; i++)             { u=i*n+k; v=i*n+is[k];               p=a[u]; a[u]=a[v]; a[v]=p;             }       }     free(is); free(js);     return a; }   void display(double M[],int n) /*显示结果*/ {   int i,j; double *result=NULL,*A=NULL;  /*显示原矩阵*/ printf("\n\nThe OriginalMatrix is:\n");      for(i=0;i<n;i++) {    for(j=0;j<n;j++)    {        printf("%10.4f\t", M[i*n+j]);         }       printf("\n"); }        A=(double*)malloc(n*n*sizeof(double)); for(i=0;i<n*n;i++) A[i]=M[i]; result=inv(A,n); if(result!=NULL) {    printf("\n\nThe InverseMatrix is:\n");    for(i=0;i<n;i++)    {    for(j=0;j<n;j++)    {        printf("%10.4f\t", result[i*n+j]);         }       printf("\n");    } } else {    printf("The Matrix is singular ! Can't be inverse!\n"); } free(A); }   #include <conio.h> /* Test */ void main() { double matrix[3][3]={{1,-5,-2},{-1,3,1},{3,-4,-1}}; double matrix1[3][3]={{0,0,0},{-1,3,1},{3,-4,-1}}; double matrix2[4][4]={{3,2,1,1},{2,3,5,9},{-1,2,5,-2},{1,0,-1,3}}; display(matrix[0],3); display(matrix1[0],3); display(matrix2[0],4); printf("push any key to be end ."); getch(); } 求编译好用

C++直接调呗， extern "C"

求逆矩阵？ 高斯消元法吧， 网上很多现成代码,搜索gaussj

引用 1 楼 user-5 的回复:引用赵老师的话，1000行以内的代码不要用C++写。  记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写！”  不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

这只是一部分。。 求帮忙！

引用赵老师的话，1000行以内的代码不要用C++写。


Question: 封装一个winsocket的通信协议的Dll

就用想你的那样map或者hash table

大神求助啊，给个思路就可以了。


Question: 广义表问题求解

((c))的 tail 不是 (c)么？？难道一个元素的表尾为空表？？ 不过却是不懂这东西。 写个lisp 程序验证一下

UPUP..我认为第二个Tail得到的是(((c)))。。。

第二个Tail得到(((c)))才对吧？外面还有一个括号。。  比如C=(a,(b,c,d)) Tail(c)=((b,c,d))

结果为空。 第一个Head得到((a,b),((c))) 第二个Tail得到((c)) 第三个Tail得到空。


Question: C语言的直方图图像化代码问题

呃，我自己看懂了，谢谢。。。


Question: lua与 C交互问题，请教各位

sql2zy大大，问题，解决了吗？ 我遇到同样的问题。 能告诉我你的解决方法吗？我的邮箱 39514004@qq.com


Question: gsoap 客户端程序如何获取返回的字符串

那这样在server端进行申请空间不释放，不会造成内存泄露吗

没有回应啊,我找到原因了，是客户端调用的方法不对。  客户端接收参数应用如下形式 char *t; soap_call_ns2__getstr(&soap,server,"",argv[2],&t);

再明确一下问题： 如何返回字符串类型？  How to return string from GSOAP method?


Question: 我装了一个vc++6.0，但是运行遇到了很多问题，求助！！

VC6，如果按计算机纪元，相当于中世纪的东西，除非你打算穿越到宋朝，否则不要用。

那我应该下一个什么版本的啊？？？要学c语言。。。      求下载地址，不要试用期的那种

引用 10 楼 u014403258 的回复:那我应该下一个什么版本的啊？？？要学c语言。。。      求下载地址，不要试用期的那种 可以使用C-Free，http://download.csdn.net/detail/u012421456/7374337

兼容性问题。可以去找绿色版下载。

http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

楼主，现在已经是2014年了。编程不是搞考古，用个新点的版本吧。

起码也得用个VS2008吧。

这个好像不用管啊！我的也有，不过不提醒，平时好像也不耽误使用啊！还有VC6.0已经很老了，存在一些问题，如果非要使用，建议在装一个新一点儿的编译器

楼上赵老师正解，这个问题微软给出了解决方案，但这个问题的根源好像是来自office2007，不是操作系统。

以XP兼容模式运行 以管理员身份运行  FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn


Question: C语言中的宏定义

请亲自阅读  引用 2 楼 zyaiwx 的回复:int范围是-2^32 -- 2 ^32 - 1。 你没超过这个范围，自然不用做转换。 而且，如果加了UL，前面最好变为unsigned long s = SECONDS_PER_YEAR; 否则容易溢出 请给出 int范围是-2^32 -- 2 ^32 - 1 的证据。 60*60*24*365 为啥容易溢出 ？？

请亲自阅读include\limits.h的内容。

60*60*24*365 =31536000； 2**32 -1 =4294967295; 没有超过int


Question: 求高数解答二叉树的递归建立问题

static void CoorDinate(Node root)         {             int deepth = Deepth(root, 0);             List<Node> listNode = new List<Node>();             listChild(root, listNode);             listNode[listNode.Count - 1].X = 800;             listNode[listNode.Count - 1].Y = 600;             for (int i = listNode.Count - 1; i >= 1; i--)             {                 if (listNode[i - 1].Symbol.Length == 1)                 {                     listNode[i - 1].X = listNode[i].X - listNode[i - 1].Symbol.Length * 20 - 20;                 }                 else                 {                     listNode[i - 1].X = listNode[i].X - listNode[i - 1].Symbol.Length * 10 - 10;                 }                 listNode[i - 1].Y = listNode[i].Y - (listNode[i].Deepth - listNode[i - 1].Deepth) * 50;             }             CoorDinateHelp(root);         }         static void CoorDinateHelp(Node root)         {             if (root.NodeList == null)             {             }             else             {                 for (int i = 0; i < root.NodeList.Count; i++)                 {                     CoorDinateHelp(root.NodeList[i]);                 }                 location(root);             }   } static void location(Node node)         {             int x = 0;             if (node.NodeList.Count == 1)             {                 node.X = node.NodeList[0].X;             }             else             {                 x = (node.NodeList[node.NodeList.Count - 1].X - node.NodeList[0].X) / 2;                 node.X = node.NodeList[0].X + x;             }             node.Y = node.NodeList[0].Y - 50;        }

函数CreateBinTree被递归调用的过程中，遇到连续3个“#”或1个“;”均会return到上一级调用处，输入序列ABC##DE#G##F###;和ABC##DE#G##F#########;均在红色标记的#处结束整个递归过程，剩余的输入部分根本就不会处理。

我是说  ABC##DE#G##F### 当输入最后一个"#"的时候, 它是A的右节点  ,  整个递归过程都已经结束了.分号';'是从哪个递归的分支读入的?

全文就一个scanf，还能哪里读入……


Question: 求懂C编程也懂一点虚拟化libvirt相关技术的人解答小问题

这个是因为链接的时候没有链上动态库，所以在编译的时候把libvirt的so文件链上就行了 就是楼上说的：gcc -lvirt

编译的时候加上 -lvirt gcc -lvirt

引用 1 楼 user-3 的回复:-L -l指定库路径哈。 大哥能不能详细点，我centos 刚入门，解决问题了满分奉上！跪求

-L -l指定库路径哈。


Question: 求牛人来解答个tcp问题？

seq 用于表示你已经发送了多少数据， ack 用于表示你已经接收确认了多少数据。

学会使用抓包软件比如wireshark。

引用三次握手期间是否也可以传输数据呢？ 不可以。   引用建立连接后，seq 和ack序列号怎么变化 ？是seq  ack 就确定了吗 还是和三次握手一样，每次都有确认新的ack+1 变化呢？    引用其次如果数据太大，一个包无法传输完毕， TCP没有包的概念，TCP是流， 需要自行粘包。

楼主下个软件Ethereal，然后监听一下，看TCP/IP详解就什么都明白了。

握手期间不传数据。序号的变化需要阅读TCP的书或者规范，有个滑动窗口协议，还有点小复杂。


Question: c链表指针问题

引用 8 楼 shlvshe00 的回复:因为malloc只管分配空间，但是并不会初始化，而new是分配并初始化的  但这不能解释之前的一部分正确，但超过一定范围就错误的情况啊， 并且每次malloc 我都将pDaItem的指针和pDaItem->Next打印出来，都申请到了空间，但传入AddIterm函数后，某一次pDaItem->Next就变为野指针了

引用 7 楼 chongchuanbing 的回复:void AddItem(LogRecord& mLogRecord,DataItem* pDataItem){     mLogRecord.num++;     printf("pDataItem:%d\n",pDataItem);     printf("pDataItem->Next:%d\n",pDataItem->Next);      if(mLogRecord.head == NULL){         mLogRecord.head = (DataItem *)malloc(sizeof(DataItem));         mLogRecord.head->Next = NULL;     }      DataItem* iter = mLogRecord.head;     printf("test3\n");     while(iter->Next != NULL){         printf("iter->Next:\t%d\t",iter->Next);         iter = iter->Next;         printf("%d\n",iter->Next);     }     printf("test4\n");      iter->Next = pDataItem;   iter->Next->Next = NULL;     mLogRecord.size += sizeof(pDataItem->type)+sizeof(pDataItem->len)+pDataItem->len; }  难道不是这样么、、、  在调用AddIterm（）函数前，我已经将传入的pDataItem->Next = NULL

因为malloc只管分配空间，但是并不会初始化，而new是分配并初始化的

仅供参考//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

重写 你的思想是：先初始一个n元素的链表，不够的时候追加？是这意思嘛？

引用 9 楼 HCacm 的回复:[quote=引用 7 楼 chongchuanbing 的回复:] void AddItem(LogRecord& mLogRecord,DataItem* pDataItem){     mLogRecord.num++;     printf("pDataItem:%d\n",pDataItem);     printf("pDataItem->Next:%d\n",pDataItem->Next);           if(mLogRecord.head == NULL){         mLogRecord.head = (DataItem *)malloc(sizeof(DataItem));         mLogRecord.head->Next = NULL;     }       DataItem* iter = mLogRecord.head;     printf("test3\n");     while(iter->Next != NULL){         printf("iter->Next:\t%d\t",iter->Next);         iter = iter->Next;         printf("%d\n",iter->Next);     }     printf("test4\n");           iter->Next = pDataItem;   iter->Next->Next = NULL;     mLogRecord.size += sizeof(pDataItem->type)+sizeof(pDataItem->len)+pDataItem->len; }  难道不是这样么、、、  在调用AddIterm（）函数前，我已经将传入的pDataItem->Next = NULL  [/quote]  你添加完结点后还不是要再将链表的最后一个结点的next指向NULL，你这步不是没做么、、、

原地打转看不出所以然的，前面已经说了，要你看看节点申请的部分，也就是mDataItem初始化的地方出示代码...

上代码看看，可能申请空间的大小搞错了...

引用 1 楼 user-5 的回复:看看节点申请的部分，可能第8个节点不在有效空间内所以被改写了... 是malloc的问题，这是为什么呢

问题解决了，将malloc 改为new就可以了。但是这是为什么呢？

看看节点申请的部分，可能第8个节点不在有效空间内所以被改写了...

引用 4 楼 user-5 的回复:上代码看看，可能申请空间的大小搞错了... 涉及到的代码已经在上面了，具体的申请语句是 mLogRecord.head = (DataItem *)malloc(sizeof(DataItem));


Question: 很简单的一个程序，但是总是出错不知道是为什么？

#include<stdio.h> void main() {double i,j,k;        //j为买的天数，i为买的苹果个数，k为总价。 double v; k=0; j=0;   for(i=2;i<=100;i*=2)  {    k=k+i*0.8;        ++j; } i=i/2;    //上面循环的时候会让i多循环一轮，这样产生的i=128的时候跳出循环，最后j的值正常是6，但是i不正常是128所以除以二  v=k/j; printf("%f\n%f\n%f\n",i,j,v); }  这是我参考各位的回复最后的程序。

恩，还真是呢。这些小问题可不能忽视呀，不然编译不通过甚是没撤。虽然都是不起眼的小问题，可是不杜绝的活。要是写个稍微大些的程序可是要纠结死的啦，楼主你说是吧？ 慢慢来，会一步步的走起来的。

问话费？得去找移动。 小问题不少 首先，v不是int的 其次，i*=2 然后，j赋值错了，因为j++的位置 最后，printf里斜杠打反了。

问题有两个。 一是for循环中 i=*2,应该写作 i*=2 第二个，k的类型应该为float，不应该是int k = 0; k = k + i * 0.8

既然自己搞不对，就不要认为它很简单

#include <stdio.h> void main() { 	double i,j,k,v;        //j为买的天数，i为买的苹果个数，k为总价。 	k=0; 	j=1; 	for(i=2;i<=100;i*=2) 	{ 		k=k+i*0.8; 		j++; 	} 	j--; 	v=k/j; 	printf("%f %f",j,v); }

i=*2，这个应该是i*=2吧，就是i=i*2; 还有，既然你k=k+i*0.8，那你k就需要定义为float型，你这里k为int类型，又没有强转，精度会下降的

j=1; //这里J初始值应该是0，不然的话在第一天买2个苹果的时候，J就增长到2了 for(i=2;i<=100;i=*2)  //应该是i*=2，而不是i=*2  {    k=k+i*0.8;    j++; }

引用 3 楼 a515360208 的回复:是不是这里的问题for(i=2;i<=100;i*=2)注意是i*=2还有一个问题，j的初始值应该是0,不是1

用不用考虑购买的天数呢？第七天是128，超过100，所以你的算法只能算前六天的平均花费 个人见解，不喜忽略

参考 #include<stdio.h> int main() { 	int sum=0; 	int day; 	int day_num=2; 	for(day=1;day_num<=100;day++) 	{ 		sum+=day_num; 		day_num*=2; 	} 	day--; 	printf("%3d %3d %.3f",day,sum,sum*1.0/day); 	return 0; }


Question: 第一次在poj上做题，被accepted了

poj 是神马？有链接吗？

引用 1 楼 u012061345 的回复:最好打印换行符。不拘小节，你也写过poj的题目吗，多少题了啊

引用 3 楼 fetag 的回复:poj 是神马？有链接吗？http://poj.org/

poj里我还有个题至今还是top（

最好打印换行符。


Question: 关于return返回局部变量指针问题

字符数组str。数组名str代表的是这个str[0]即第一个字符的地址，也就是说，如果你使用*str 那么它的值是一个字符的地址。如果你使用%s的话，那么就会出问题。 而显式的定义字符指针char * str 那么str指向的是一个字符串的首地址。若使用%s来输出那么可以得到正确结果。

不要返回局部变量的地址或引用

引用 9 楼 u013163178 的回复:#include <stdio.h> char (& arry1())[12]; char * arry2(); int main(void) { 	char *ch1,*ch2; 	ch1 =arry1(); 	ch2 =arry2(); 	printf("%s\n",ch1); 	printf("%s\n",ch2); 	 	return 0; } char (& arry1())[12] { 	static char s[12]="Hello Word!"; 	return s; } char *arry2() { 	char *s="Hello Word!"; 	return s; } ------------------------------------------------------------------------------------------------------------------------------------------- #include <stdio.h> char * arry1(); char * arry2(); int main(void) { 	char *ch1,*ch2; 	ch1 =arry1(); 	ch2 =arry2(); 	printf("%s\n",ch1); 	printf("%s\n",ch2); 	 	return 0; } char *arry1() { 	static char s[12]="Hello Word!"; 	return s; } char *arry2() { 	char *s="Hello Word!"; 	return s; }  bingo!!!~~加static不释放局部变量

我就不重复了，给你找了个帖子，你注重区分一下，栈区和静态数据段区的不同！ http://blog.csdn.net/daiyutage/article/details/8605580

char * a ="helo"; char *b ="helo"; a==b char c []="helo"; a!=c;

刚刚又查了下相关资料，建议LZ去看看数据的存储方式 http://blog.sina.com.cn/u/2218913762

返回的地址不一样，一个是常量字符串的存储地址，一个是局部变量的存储地址。 常量字符串的存储地址，读取是没有问题的，不可写； 局部非静态变量的存储地址，读写都很有问题。因为函数已经结束运行了。 那部分地址另有安排了。

引用 1 楼 a515360208 的回复:2、str2指向的是一个常量字符串，return str2返回的是指向常量字符串的地址，是一直存在的 但这种做法不太好，一般是先动态分配一块内存，用完后free掉 直接return字符串字面量 在C语言里面 没什么不好

引用 2 楼 y_gemini 的回复:ls说的对 array1中返回的字符数组为局部变量，函数结束后数组中数据内存被收回。  array2中str是指针， str被撤销，但是其指向的地址数据未改变，返回的地址中数据依然存在。3Q

引用 1 楼 a515360208 的回复:这个你要弄清楚常量和变量的概念，char str1[] = "hello"; char *str2 = "hello"; 1、return str1 返回的是一个临时变量的地址 2、str2指向的是一个常量字符串，return str2返回的是指向常量字符串的地址，是一直存在的 但这种做法不太好，一般是先动态分配一块内存，用完后free掉谢谢，现在大概有些了解了~

引用 5 楼 user-10 的回复:楼主这是啥开发环境，好奇特啊,跟我们的不一样我用的Qt

楼主这是啥开发环境，好奇特啊,跟我们的不一样


Question: 关于buf是什么意思

64字节的缓冲区？

long static int const long volatile unsigned x;     printf("%d",sizeof x);

无符号的整形数组，buf是指向数组的指针

你没说清楚，我猜UINT8 buf[64]只是一个保存数据的缓冲区


Question: 查找一个指定字符在给定字符串中的出现的位置(和个数)

//返回字符在字符串中出现的位置，如果没找到返回NULL int* findchar(char* str, char c, int& count) { 	if( str == NULL ) 		return NULL; 	count = 0; 	for(int i(0);str[i]!='\0';i++) 	{ 		if( str[i] == c ) 			count++; 	} 	if( count<1 ) 		return NULL; 	int* pos = new int[count]; 	int index = 0; 	for(int i(0);str[i]!='\0';i++) 	{ 		if( str[i] == c ) 		{ 			pos[index] = i; 			index++; 		} 	} 	return pos; }  int main() { 	int count; 	char _str[100]; 	char c; 	cout<<"请输入字符串:"<<endl; 	cin>>_str; 	cout<<"请输入待查找的字符:"<<endl; 	cin>>c; 	int* pos = findchar(_str,c,count); 	if( pos ) 	{ 		cout<<"个数为:"<<count<<endl; 		cout<<"对应字符串的位置:"; 		for(int i(0);i<count;i++) 			cout<<pos[i]<<"  "; 		cout<<endl; 	} 	else 		cout<<"没有找到对应字符"<<endl; 应该ok的，你试试吧

int num(char *p, char *p2, int *n) { 	 	char *temp;    //临时指针用来做判断 	int k = strlen(p);//算出字符串Str的长度;也就是strinp的长度； 	while (p2 != '\0')   //如果到了那个比较长的字符串的末尾跳出循环 	{ 		temp =strstr(p2, p); 		if(temp!= NULL)  //判断字符串STROUT。里面是否存在str  没有存放的话就等于null下面就直接跳出循环 		{ 			(*n)++;     //调入进来的n++; 			p2 = p2 + strlen(p);  			continue; 		} 		else          		{ 			break;   		} 	}  }  int main() { 	char strinp[] = "crazyspopcorn";  //定义一个字符型数组变量 	char strout[] = "crazyspopcornzuishuaiqilecrazyspopcornzuipiaole"; 	int n = 0; 	num(strinp, strout, &n); 	printf("%d",n); 	system("pause");   }   头文件的话。楼主自家加哦~~这是调用函数的。楼主可以自己改写成一个函数的。希望能帮助到你;谢谢里面都有注释的。

写个伪代码: for(每个字符位置){     如果(发现 字符 ch)     {          计数加一;输出数据位置;    }    否则/** 没发现,**/            什么也不做; } 输出计数;


Question: 不理解C Primer Plus上高级数据表示那一章

“实际参数有的是movies，有的却是&movies” 是不是前者形参是引用，后者形参是指针？

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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

引用 2 楼 shimachao 的回复:我猜指针的指针是必须的。如果要改变一个指针变量的值，那就传指针的地址，那么函数形参就是指针的指针，实参就是取指针变量的地址。如果只是改变指针指向的变量。那就直接传指针就行，那么函数形参就是指针类型，实参也直接传入指针变量就行。但是函数的原型里形参都是指针的指针

引用 3 楼 sholber 的回复:movies是啥子撒？没看过这本书。movies是一个指向链表的指针变量

movies是啥子撒？没看过这本书。

上机实验，就知道哪个对了


Question: 在for loop内没寻找到某值的提示？

Thank you so much.

bool b=false; for(i=1;i<=10000;i++) {   x=sqrt(i+60);   y=sqrt(i+252);   if(x*x==i+60&&y*y==i+252）   {     printf("i is a complete number and is:%ld\n",i);     b = true;   } } if(false == b)   printf("complete number not found\n");