Question: 求C语言大神，帮忙把这改成能在WINDOWS下编译运行的

引用 楼主 zjx493517410 的回复:/*************************************************************************    > File Name: Client.c   ************************************************************************/    #include<netinet/in.h>  // sockaddr_in  #include<sys/types.h>  // socket  #include<sys/socket.h>  // socket  #include<stdio.h>    // printf  #include<stdlib.h>    // exit  #include<string.h>    // bzero     #define SERVER_PORT 8000  #define BUFFER_SIZE 1024  #define FILE_NAME_MAX_SIZE 512     int main()  {    // 声明并初始化一个客户端的socket地址结构    struct sockaddr_in client_addr;    bzero(&client_addr, sizeof(client_addr));    client_addr.sin_family = AF_INET;    client_addr.sin_addr.s_addr = htons(INADDR_ANY);    client_addr.sin_port = htons(0);       // 创建socket，若成功，返回socket描述符    int client_socket_fd = socket(AF_INET, SOCK_STREAM, 0);    if(client_socket_fd < 0)    {      perror("Create Socket Failed:");      exit(1);    }       // 绑定客户端的socket和客户端的socket地址结构 非必需    if(-1 == (bind(client_socket_fd, (struct sockaddr*)&client_addr, sizeof(client_addr))))    {      perror("Client Bind Failed:");      exit(1);    }       // 声明一个服务器端的socket地址结构，并用服务器那边的IP地址及端口对其进行初始化，用于后面的连接    struct sockaddr_in server_addr;    bzero(&server_addr, sizeof(server_addr));    server_addr.sin_family = AF_INET;    if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) == 0)    {      perror("Server IP Address Error:");      exit(1);    }    server_addr.sin_port = htons(SERVER_PORT);    socklen_t server_addr_length = sizeof(server_addr);       // 向服务器发起连接，连接成功后client_socket_fd代表了客户端和服务器的一个socket连接    if(connect(client_socket_fd, (struct sockaddr*)&server_addr, server_addr_length) < 0)    {      perror("Can Not Connect To Server IP:");      exit(0);    }       // 输入文件名 并放到缓冲区buffer中等待发送    char file_name[FILE_NAME_MAX_SIZE+1];    bzero(file_name, FILE_NAME_MAX_SIZE+1);    printf("File Name-zjx.txt On Server:\t");    scanf("%s",file_name);       char buffer[BUFFER_SIZE];    bzero(buffer, BUFFER_SIZE);    strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));         // 向服务器发送buffer中的数据    if(send(client_socket_fd, buffer, BUFFER_SIZE, 0) < 0)    {      perror("Send File Name Failed:");      exit(1);    }       // 打开文件，准备写入    FILE *fp = fopen(file_name, "w");    if(NULL == fp)    {      printf("File:\t%s Can Not Open To Write\n", file_name);      exit(1);    }       // 从服务器接收数据到buffer中    // 每接收一段数据，便将其写入文件中，循环直到文件接收完并写完为止    bzero(buffer, BUFFER_SIZE);    int length = 0;    while((length = recv(client_socket_fd, buffer, BUFFER_SIZE, 0)) > 0)    {      if(fwrite(buffer, sizeof(char), length, fp) < length)      {        printf("File:\t%s Write Failed\n", file_name);        break;      }      bzero(buffer, BUFFER_SIZE);    }       // 接收成功后，关闭文件，关闭socket    printf("Receive File:\t%s From Server IP Successful!\n", file_name);    close(fp);    close(client_socket_fd);    return 0;  }     #pragma warning( disable : 4996) #include <winsock2.h> #include <mswsock.h> #include <WS2tcpip.h> #include<stdio.h>    // printf  #include<stdlib.h>    // exit  #include<string.h>    // bzero   #pragma comment(lib,"ws2_32.lib") #define SERVER_PORT 8000  #define BUFFER_SIZE 1024  #define FILE_NAME_MAX_SIZE 512  int main() { 	// 声明并初始化一个客户端的socket地址结构  	struct sockaddr_in client_addr; 	memset(&client_addr, 0,sizeof(client_addr)); 	client_addr.sin_family = AF_INET; 	client_addr.sin_addr.s_addr = htons(INADDR_ANY); 	client_addr.sin_port = htons(0);  	// 创建socket，若成功，返回socket描述符  	int client_socket_fd = socket(AF_INET, SOCK_STREAM, 0); 	if (client_socket_fd < 0) 	{ 		perror("Create Socket Failed:"); 		exit(1); 	}  	// 绑定客户端的socket和客户端的socket地址结构 非必需  	if (-1 == (bind(client_socket_fd, (struct sockaddr*)&client_addr, sizeof(client_addr)))) 	{ 		perror("Client Bind Failed:"); 		exit(1); 	}  	// 声明一个服务器端的socket地址结构，并用服务器那边的IP地址及端口对其进行初始化，用于后面的连接  	struct sockaddr_in server_addr; 	memset(&server_addr,0, sizeof(server_addr)); 	server_addr.sin_family = AF_INET; 	if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) == 0) 	{ 		perror("Server IP Address Error:"); 		exit(1); 	} 	server_addr.sin_port = htons(SERVER_PORT); 	 	// 向服务器发起连接，连接成功后client_socket_fd代表了客户端和服务器的一个socket连接  	if (connect(client_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) 	{ 		perror("Can Not Connect To Server IP:"); 		exit(0); 	}  	// 输入文件名 并放到缓冲区buffer中等待发送  	char file_name[FILE_NAME_MAX_SIZE + 1]; 	memset(file_name,0, FILE_NAME_MAX_SIZE + 1); 	printf("File Name-zjx.txt On Server:\t"); 	scanf("%s", file_name);  	char buffer[BUFFER_SIZE]; 	memset(buffer,0, BUFFER_SIZE); 	strncpy_s(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name));  	// 向服务器发送buffer中的数据  	if (send(client_socket_fd, buffer, BUFFER_SIZE, 0) < 0) 	{ 		perror("Send File Name Failed:"); 		exit(1); 	}  	// 打开文件，准备写入  	FILE *fp = fopen(file_name, "w"); 	if (NULL == fp) 	{ 		printf("File:\t%s Can Not Open To Write\n", file_name); 		exit(1); 	}  	// 从服务器接收数据到buffer中  	// 每接收一段数据，便将其写入文件中，循环直到文件接收完并写完为止  	memset(buffer,0, BUFFER_SIZE); 	int length = 0; 	while ((length = recv(client_socket_fd, buffer, BUFFER_SIZE, 0)) > 0) 	{ 		if (fwrite(buffer, sizeof(char), length, fp) < length) 		{ 			printf("File:\t%s Write Failed\n", file_name); 			break; 		} 		memset(buffer,0, BUFFER_SIZE); 	}  	// 接收成功后，关闭文件，关闭socket  	printf("Receive File:\t%s From Server IP Successful!\n", file_name); 	fclose(fp); 	closesocket(client_socket_fd); 	return 0; }

不如开源跨平台的库，直接搞定

这个并不难啊, winsock1就是从BSD的一个版本移植过去的, 至今也保持兼容. 换个头文件,应该是winsock.h,好像还要使用库,你自己搜一下, 改成WSAsocket也不难,API的参数差异很小,看看MSDN就OK了


Question: 结构体数组函数调用赋值问题

参数出入必须是引用，也就是指针。 否则是值赋值，这个值在函数内部赋值，是传递不出来的。 外面的结构就好像没有赋值一样。

@user-2 那我那个是哪错了？能详细说明一下么？

void input(struct student *s){ 	scanf("%d %s %f %f %f",&s->num, s->name, &s->score[0], &s->score[1], &s->score[2]); } int _tmain(int argc, _TCHAR* argv[]) {	struct student s[3]; 	for(int i=0; i<3; i++){ 		input(&s[i]); 	} 	for(int j=0; j<3; j++){ 		print(s[j]); 	} 	system("pause"); 	return 0; }


Question: 菜鸟问个getch的问题，大牛帮帮忙看看，不胜感激！

特殊字符都会出现这样的情况，有没有试过把特殊字符特殊处理呢？

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

getch只读入，不显示字符


Question: 关于c 字符串截取

static char t[50+1]; strncpy(t,s+123,50);t[50]=0;

原型：char *strtok(char *s, char *delim);  功能：分解字符串为一组字符串。s为要分解的字符串，delim为分隔符字符串。  说明：首次调用时，s指向要分解的字符串，之后再次调用要把s设成NULL。            strtok在s中查找包含在delim中的字符并用NULL('/0')来替换，直到找遍整个字符串。  返回值：从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。            所有delim中包含的字符都会被滤掉，并将被滤掉的地方设为一处分割的节点。 例如 xxxxxxxx,eg：mm@.comxxxxxxxxxxxxxxxxxxxxxx. 需要你找出收发件人的地址开始的共同特征. 比如所有的地址前都是eg:  1. 可以用一次strtok, eg: 得到 xxxxxxxx,eg 和 mm@.comxxxxxxxxxxxxxxxxxxxxx 2. 再用一次strtok, com . 得到mm@.com 和 xxxxxxxxxxxxxxxxxxxxx


Question: 编程题，指针请教~在字符串中找出连续最长的数字串，并把这个串的长度返回

咨询了下，同学不是指针的错误~前面的表达有欠妥当，把源码粘出来  #include <stdlib.h> #include"string" using namespace std; #include "oj.h"   /* 功能：在字符串中找出连续最长的数字串，并把这个串的长度返回 函数原型：    unsigned int Continumax(char** pOutputstr,  char* intputstr) 输入参数：    char* intputstr  输入字符串 输出参数：    char** pOutputstr: 连续最长的数字串，如果连续最长的数字串的长度为0，应该返回空字符串    pOutputstr 指向的内存应该在函数内用malloc函数申请，由调用处负责释放  返回值：   连续最长的数字串的长度   */ unsigned int Continumax(char** pOutputstr,  char* intputstr) { 	int Len=strlen(intputstr); 	if (*intputstr==NULL || Len==0) 	{ 		*pOutputstr=""; 		return 0; 	}  	int MaxLen=0; 	int wordLen=0; 	int i,j,begin=0; 	int flag[200]; 	for (i=0;intputstr[i]!='\0';i++)           //判断字符是否为数字 	{ 		if (intputstr[i]>='0' && intputstr[i]<='9') 			flag[i]=1; 		else flag[i]=0; 	}	 	for	(i=0;intputstr[i]!='\0';) 	{ 		if (flag[i]==1) 		{ 			for(j=i;flag[j]==1 && intputstr[j]!='\0';j++)   //获得数字串的长度wordLen 				wordLen++; 			if (wordLen>=MaxLen) 			{ 				MaxLen=wordLen; 				begin=i; 			} 			i=i+wordLen; 		} 		else  			i++; 		wordLen=0; 	}      char *temp = (char*)malloc((MaxLen+1)* sizeof(char));  	for (i=0;i<MaxLen;i++)       {           temp[i]=intputstr[i+begin];  //不改变outputstr地址         }   	temp[MaxLen]='\0'; 	//Ptr=Ptr-maxLen;          	*pOutputstr=temp; 	return MaxLen; }

错误应该在这部分  char *temp = (char*)malloc((MaxLen+1)* sizeof(char));  for (i=0;i<MaxLen;i++)       {           temp[i]=intputstr[begin+i];  //不改变outputstr地址         }   temp[MaxLen]='\0'; //Ptr=Ptr-maxLen;          *pOutputstr=temp; return MaxLen; }

自己顶一下~ Maxlen结果正确，但是赋值不对~

unsigned int Continumax(char** ppout,  char* src) {     char *last=NULL;     int ans=0;     for(;*src;++src){         if(isdigit(*src)){             if(!last) last =src;         }else{             if(last&&src-last>ans){                 *ppout =last;                 ans =src-last;                 last =NULL;             }         }     }     if(last && src-last>ans)     {         *ppout =last;         ans =src-last;     }     return ans; }


Question: C 初学动态内存分配引发的错误

保存"now is the time"需要16个字节： #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h>  #define CHLEN 16  void strcatf(char **, char *);  int main() {     char * s = (char *)malloc(CHLEN);      strcpy(s,"now is the time");     char * t = "now is the time";      strcatf(&s, t);      printf("%s\n", s);     printf("%s\n", t);      free(s);      return 0; }  /*  将指向的数据拼接到s指向的数据的结尾    */ void strcatf(char ** s, char * t) {     int slen = 0;     while (**s++)     {         *s++;         slen++;     }      int tlen = 0;     while (*t++)     {         tlen++;     }      if (slen + tlen > CHLEN)     {         *s = (char *)realloc(*s, slen + tlen + 1);     }      while (**s++ = *t++); }

现在报错的地方是44行*s = (char *)realloc(*s, slen + tlen);报的错误时“无效的旧尺寸”。

\0就是代表0，0在while就是false。最后的代码是将t指向的数据逐个逐个加到s指向的数据后面

看不太懂 判断结尾不是=='\ 0’么，while() 判断的是什么不懂 最后   两个指针都指向结尾了，为什么还要再赋值

我将s = "now is the time";  这句代码改了后，这里是不报错了。但strcatf函数里报错了，能看下strcatf函数里有什么错误吗。

s = "now is the time";       改成  strcpy()或者memcpy赋值

。。。。。 char * s = (char *)malloc(CHLEN);／／申请一块内存     s = "now is the time";          ／／指针指向常字符串“now is the time”（上面指针没有释放，已经内存泄漏）     char * t = "now is the time";  strcatf(&s, t);  ／／想把字符串 拷贝到  常字符串“now is the time”  的内存处，出错   printf("%s\n", s);     printf("%s\n", t);       free(s);／／释放常量字符串   出错

在unbuntu中用gcc编译运行后提示核心已转存错误，请各位指教

非常感谢

引用 11 楼 h576514515 的回复:引用 9 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。这个我没看懂什么意思，有更详细的文档吗 我的意思就是你malloc了10个字节，非要往里放16个字节，操作系统不一定会报错。 你10楼的代码应改为： #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h>  #define CHLEN 20  void strcatf(char **, char *);  int main() {     char * s = (char *)malloc(CHLEN);      if (s==NULL) return 1;     strncpy(s, "now is the time",CHLEN-1);s[CHLEN-1]=0;     char * t = "now is the time";      strcatf(&s, t);      printf("%s\n", s);     printf("%s\n", t);      free(s);      return 0; }  /*  将t志向的数据拼接到s指向的数据的结尾    */ void strcatf(char ** s, char * t) {     char * j = *s;     int slen = 0;     while (*j++)     {         slen++;     }      char * i = t;      int tlen = 0;     while (*i++)     {         tlen++;     }      if (slen + tlen > CHLEN)     {         char *p=(char *)realloc(*s, slen + tlen + 1);         if (p==NULL) exit(1);         *s = p;     }      while (*((*s) + (slen++)) = *t++); }  小心驶得万年船！

终于弄好了，这是最后我想要都的不报错的代码 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h>  #define CHLEN 20  void strcatf(char **, char *);  int main() { 	char * s = (char *)malloc(CHLEN);  	strcpy(s, "now is the time"); 	char * t = "now is the time";  	strcatf(&s, t);  	printf("%s\n", s); 	printf("%s\n", t);  	free(s);  	return 0; }  /*	将t志向的数据拼接到s指向的数据的结尾	*/ void strcatf(char ** s, char * t) { 	char * j = *s; 	int slen = 0; 	while (*j++) 	{ 		slen++; 	}  	char * i = t;  	int tlen = 0; 	while (*i++) 	{ 		tlen++; 	}  	if (slen + tlen > CHLEN) 	{ 		*s = (char *)realloc(*s, slen + tlen + 1); 	}  	while (*((*s) + (slen++)) = *t++); }


Question: 想问问关于汇编和C一起学习，以及一个代码问题

反汇编不用学精，有那个时间把C学精比什么都强。

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

看Debug版。

其实我想说不要舍本求末，楼主说都学精，那就用c跟汇编都自己写一个学生成绩管理系统吧。。。当年汇编考试的最后一题我至今记忆犹新。。。

《The Intel 64 and IA-32 Architectures Software Developer's Manual》

printf可能或没有用了esi，建议将其覆写为nop然后看执行结果

1:     你写一个C程序练习, 得DEBUG吧, C表面看不出问题, 你得看汇编吧, 所以你学习时看到的绝大多数都会是DEBUG; RELEASE局部变量更少, 更容易读.           所谓的二者都要学精, 简单, 到一定程度去做crackme,  简单的, 难的别搞, 那涉及更多的PE, 中断等 2:     release就是发布版, 发布的软件当然是发布版.    不只是发布版, 运气好还会混淆版 以及更高级的反调试反反汇编版 3:      除非你要做反汇编软件,  不用记, 见多了自然记住, 比如: 0x90 表 nop等 4:      向下翻翻, 应该有使用到esi的地方, 比如: mov [456789], esi

问题一，如果像我这样汇编和C一起学习的，反汇编的版本是看DEBUG还是RELEASE呢？我的目的是想把C和汇编两者都学精。  先谈谈你的目的，如果C和汇编都是你的目标，个人建议先把C学好，因为C只是比汇编‘高’那么一点点层次（C是汇编的浅封装），然后学点汇编的知识，就很好了；这样要用到汇编时，看看对应的汇编码，就能解决相当一部分问题了。说老实话，没见过专业用汇编的，当然特定领域除外。  再来说DEBUG和RELEASE，如果C学好了，那么你就会知道它们两个的差别不过是一组编译器选项不一样而已。 拿gcc举例子，所谓的DEBUG，一般指编译时不优化或者较少优化，保留符号，这样在调试（debug）时比较容易跟踪代码的逻辑（因为有符号，且较少优化，汇编指令一般和C代码是对应的）；而RELEASE一般是没有保留符号，且对代码进行了大量的优化。 表现在编译器选项上，DEBUG一般会带-g选项，表示要生成调试信息，一般不带-O选项，表示不做任何优化；而对RELEASE，一般不带-g选项，同时一般有-O3这样的选项，表示对代码做优化。 理解了DEBUG和RELEASE不过一组编译器选项（即一组配置）之后，那么RLEASE带-g也就不难理解了。     问题二，我们平时常用的软件，假设看不到源文件，那我们用OD那些反汇编出来的，都是RELEASE版本的吗？  是RELEASE版本，但是该RELEASE配置具体怎样，还得看开发软件的人是怎么设置的，见问题1的回答。     问题三，再学习汇编和C的时候，机器码有必要刻意去记忆一些吗？  没必要，甚至汇编都没有必要去刻意记，见问题1的回答。     问题四，刚才看到一段代码的反汇编，都基本都能理解，除了一句  这里我也无法给出准确的答案，但极有可能就是printf中要用ESI（或者不用ESI）；这也是为什么在问题1的答案中推荐先学好C， 比如你汇编学好了，难道你用汇编来写函数？汇编学好了可能对优化有一定的帮助，但是这真的是你的目标？要知道即使在特定的领域，比如单片机，早就开始用C甚至C++来写代码了


Question: char c=128

char c; /* 如果没有特殊编译选项 char 就是 signed char */ c = 0x80;  printf("%d",c); 相当于 printf("%d",(int)c);  printf("%u",c); 相当于 printf("%u",(unsigned int)(int)c);  (int)c = 0xFFFFFF80;    /* 整数提升 c 有符号，且为负值 */  如果楼主想让 printf("%u",c); 输出128 需要这样 printf("%u", (unsigned char)c);

http://bbs.csdn.net/topics/390069778 http://blog.csdn.net/jinbi/article/details/6779713

vs下查看内存

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

char c=128从十六进制来看是0x80, 扩展32位时值为0xffffff80


Question: 急！！C语言通过socket与服务端PHP通信的问题

你逗我们么，不就是2楼说的原因？

S_addr.sin_addr.s_addr = inet_addr("10.206.6.8");  ->   S_addr.sin_addr.s_addr = inet_addr("127.0.0.1");


Question: 新手请教，父子进程socket连接问题

进程关闭时,会关闭其所有打开的文件描述符,  子进程读写socket描述符失败

父进程与子进程分别定期向对方发送固定格式的心跳包，若一段时间内监测不到心跳包了，就说明对方死掉了

能不能不停的给127.0.0.1发消息，查询什么的


Question: 请教下一个简单的while反汇编

这是n--造成的 其实差不多是这样(仅演示) mov n0, n sub n,1 cmp n0, 0 jle xxxx

这里的[ebp-0C8h]是用来保存n>0的结果的，这个while就相当于  for(;;) {     [ebp-0C4h]=n;     n=n-1;     [ebp-0C8h]=[ebp-0C4h]>0;     if([ebp-0C8h])break;     // ... }

引用 3 楼 user-4 的回复:...局部变量[ebp-0C8h], 在n > 0 时置1, n <= 0 时置0, 然后[ebp-0C8h] 与0比较, 为0时跳出, 不然继续 你这是DUBUG未加优化版本的, 用release版本优化后, 应该就没这么麻烦了我就是看了半天没看懂这个和0比较到底有什么用，能再麻烦解释下么，这个置0和置1，有没有这个步骤，都可以跳转啊，那么这个存在的意义是什么呢

引用 2 楼 onlykikyo 的回复:[quote=引用 1 楼 user-4 的回复:] 很简单, 你是太累了没仔细看   011913D0  push        ebp   011913D1  mov         ebp,esp   011913D3  sub         esp,0C8h   011913D9  push        ebx   011913DA  push        esi   011913DB  push        edi   011913DC  lea         edi,[ebp-0C8h]   011913E2  mov         ecx,32h   011913E7  mov         eax,0CCCCCCCCh   011913EC  rep stos    dword ptr es:[edi]   	while(n-->0)                                         // 先比较,后减 011913EE  mov         eax,dword ptr [n]   011913F1  mov         dword ptr [ebp-0C4h],eax   011913F7  mov         ecx,dword ptr [n]   011913FA  sub         ecx,1   011913FD  mov         dword ptr [n],ecx   01191400  cmp         dword ptr [ebp-0C4h],0              //   比较 01191407  jle         pound+45h (01191415h)   01191409  mov         dword ptr [ebp-0C8h],1               //   > 0 置1 01191413  jmp         pound+4Fh (0119141Fh)             //  跳到下面 01191415  mov         dword ptr [ebp-0C8h],0                 // <= 0; 跳到这 置0 0119141F  cmp         dword ptr [ebp-0C8h],0                 //  > 0 跳到这 01191426  je          pound+71h (01191441h)                 // 为0, 则<=0, 跳出  我是确实没理解到,为什么要置0呢，把[ebp-0C8H]置0了，有什么意义吗[/quote] ...局部变量[ebp-0C8h], 在n > 0 时置1, n <= 0 时置0, 然后[ebp-0C8h] 与0比较, 为0时跳出, 不然继续 你这是DUBUG未加优化版本的, 用release版本优化后, 应该就没这么麻烦了

引用 1 楼 user-4 的回复:很简单, 你是太累了没仔细看   011913D0  push        ebp   011913D1  mov         ebp,esp   011913D3  sub         esp,0C8h   011913D9  push        ebx   011913DA  push        esi   011913DB  push        edi   011913DC  lea         edi,[ebp-0C8h]   011913E2  mov         ecx,32h   011913E7  mov         eax,0CCCCCCCCh   011913EC  rep stos    dword ptr es:[edi]   	while(n-->0)                                         // 先比较,后减 011913EE  mov         eax,dword ptr [n]   011913F1  mov         dword ptr [ebp-0C4h],eax   011913F7  mov         ecx,dword ptr [n]   011913FA  sub         ecx,1   011913FD  mov         dword ptr [n],ecx   01191400  cmp         dword ptr [ebp-0C4h],0              //   比较 01191407  jle         pound+45h (01191415h)   01191409  mov         dword ptr [ebp-0C8h],1               //   > 0 置1 01191413  jmp         pound+4Fh (0119141Fh)             //  跳到下面 01191415  mov         dword ptr [ebp-0C8h],0                 // <= 0; 跳到这 置0 0119141F  cmp         dword ptr [ebp-0C8h],0                 //  > 0 跳到这 01191426  je          pound+71h (01191441h)                 // 为0, 则<=0, 跳出 		printf("#"); 01191428  mov         esi,esp   0119142A  push        1195858h   0119142F  call        dword ptr ds:[11992BCh]   01191435  add         esp,4   01191438  cmp         esi,esp   0119143A  call        __RTC_CheckEsp (01191140h)   0119143F  jmp         pound+1Eh (011913EEh)  我是确实没理解到,为什么要置0呢，把[ebp-0C8H]置0了，有什么意义吗


Question: C/VC怎样让打开着的txt文件 实时刷新 写入的数据信息

FindFirstChangeNotification The FindFirstChangeNotification function creates a change notification handle and sets up initial change notification filter conditions. A wait on a notification handle succeeds when a change matching the filter conditions occurs in the specified directory or subtree.   HANDLE FindFirstChangeNotification(   LPCTSTR lpPathName,    // pointer to name of directory to watch   BOOL bWatchSubtree,    // flag for monitoring directory or                           // directory tree   DWORD dwNotifyFilter   // filter conditions to watch for );   Parameters lpPathName  Pointer to a null-terminated string that specifies the path of the directory to watch.  bWatchSubtree  Specifies whether the function will monitor the directory or the directory tree. If this parameter is TRUE, the function monitors the directory tree rooted at the specified directory; if it is FALSE, it monitors only the specified directory.  dwNotifyFilter  Specifies the filter conditions that satisfy a change notification wait. This parameter can be one or more of the following values: Value Meaning  FILE_NOTIFY_CHANGE_FILE_NAME   Any filename change in the watched directory or subtree causes a change notification wait operation to return. Changes include renaming, creating, or deleting a filename.  FILE_NOTIFY_CHANGE_DIR_NAME   Any directory-name change in the watched directory or subtree causes a change notification wait operation to return. Changes include creating or deleting a directory.  FILE_NOTIFY_CHANGE_ATTRIBUTES   Any attribute change in the watched directory or subtree causes a change notification wait operation to return.  FILE_NOTIFY_CHANGE_SIZE   Any file-size change in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change in file size only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.  FILE_NOTIFY_CHANGE_LAST_WRITE   Any change to the last write-time of files in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change to the last write-time only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.  FILE_NOTIFY_CHANGE_SECURITY   Any security-descriptor change in the watched directory or subtree causes a change notification wait operation to return.    Return Values If the function succeeds, the return value is a handle to a find change notification object.  If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.   Remarks The wait functions can monitor the specified directory or subtree by using the handle returned by the FindFirstChangeNotification function. A wait is satisfied when one of the filter conditions occurs in the monitored directory or subtree.   After the wait has been satisfied, the application can respond to this condition and continue monitoring the directory by calling the FindNextChangeNotification function and the appropriate wait function. When the handle is no longer needed, it can be closed by using the FindCloseChangeNotification function.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Unsupported.   Header: Declared in winbase.h.   Import Library: Use kernel32.lib.   Unicode: Implemented as Unicode and ANSI versions on Windows NT.  See Also File I/O Overview, File Functions, FindCloseChangeNotification, FindNextChangeNotification


Question: 求编三个c语言编程题（很简单的）

/* 3.从键盘输入一个字符串，将其中的小写字母全部转换为大写字母，然后输出到一个磁盘文件中保存， 输入的字符串以字符 “@”结束，文件名是自己姓名的汉语拼音首字母。 */ int main(void) { 	FILE *f; 	f = fopen("xxxx.txt", "w"); 	char s[100]; 	scanf("%100[^@]s", s); 	int i, n; 	n = strlen(s); 	for (i = 0; i < n; i++) s[i] &= 223; 	fprintf(f, "%s", s); 	fclose(f); 	return 0; }

/* 2.在主函数中输入5个不等长的字符串。用另一函数对它们按照从小到大排序。 然后在主函数中输出这5个已经排序好的字符串。（限用指针） */ #include <stdio.h> #include <string.h> int i, j; char s[5][100]; void sort_string() { 	char buf[100]; 	for (i = 1; i < 5; i++) 		for (j = 0; j < 5 - i; j++) 		{ 			if (strlen(s[j]) > strlen(s[j+1]))  //按长度排序？ 			{ 				strcpy(buf, s[j]); 				strcpy(s[j], s[j + 1]); 				strcpy(s[j + 1], buf); 			} 		} } int main(void) { 	for (i = 0; i < 5; i++) scanf("%100s", s + i);  //读入 	printf("\n"); 	sort_string(); 	for (i = 0; i < 5; i++) printf("%s\n", s + i);  //打印 	return 0; }

/* 1.新建一个文件，以自己学号为文件名。从键盘输入一串字符，把这一串字符写入到该文件中去， 并同时在屏幕上显示该字符串。（字符串以#为结束标志。） */ int main(void) { 	FILE *f; 	f = fopen("00000.txt", "w"); 	char s[100]; 	scanf("%100[^#]s", s); 	fprintf(f, "%s", s); 	fclose(f); 	return 0; }


Question: 用C语言编

引用 2 楼 zhangxiangDavaid 的回复:指针处理：  void sort_int(int *a, int n) { 	int *p; 	int i, j; 	for (i = 1; i < n; i++) 		for (j = 0; j < n - i; j++) 		{ 			if (*(a + j) > *(a + j + 1)) 			{ 				int t; 				t = *(a + j); 				*(a + j) = *(a + j + 1); 				*(a + j + 1) = t; 			} 		} } void print(int *a, int n) { 	int i; 	for (i = 0; i < n; i++) printf("%d ", a[i]); 	printf("\n"); } int main(void) { 	int a[10]; 	int i; 	for (i = 0; i < 10; i++)scanf("%d", a + i); 	sort_int(a, 10); 	print(a, 10); 	return 0; }  +1

没看出1和2有什么区别。


Question: Linux 上使用multimap，执行插入操作，当插入最后一个数据时报Segmentation fault

下面贴上自己的代码， 请各位帮忙分析一下：   int MakeContrastTable(const vector<RoadRec>& RoadList, multimap<int, ContrastRec>& ContrastTable)  {          int RoadCnt = RoadList.size();          cout<<"RoadCnt:"<<RoadCnt<<endl;          int loop = 0;          for (int i = 0;i < /*RoadCnt - 1*/10;++i) // RoadCnt - 2 because id begin 1          {                  cout<<i<<endl;                  const RoadRec& stRoadRec = RoadList.at(i);                  for (int j = i + 1;j < /*RoadCnt*/11;++j)                  {                                                    const RoadRec& tmp = RoadList.at(j);                          cout<<"j:"<<j<<endl;                          //用点到线段的距离 过滤掉一部分比较不靠谱的数据                          if (!filterByGeom(stRoadRec, tmp))                                  continue;                          //在根据斜率的关系进一步过滤一部分不靠谱的数据                          double slope = 0;                          int startpoint = 0;                          //如果两条Link是同侧路 则跳过                          if (IsOneSideOfRoad(stRoadRec, tmp))                                  continue;                                                    ContrastRec stcontreastrec;                          stcontreastrec.gid_S = stRoadRec.src_id;                          stcontreastrec.gid_L = tmp.src_id;                          stcontreastrec.slopediff = (int)(slope*1000);                          cout<<"here"<<endl;                           ContrastTable.insert(make_pair(stcontreastrec.slopediff, stcontreastrec)); ///如果注释掉这句，就不会出现错误                  }          }                return 0;  }


Question: 求大神解答数据结构程序题

老师布置的题目可能搜得出来哦

程序题变成填空题是最无聊的事

让你自己做，你竟然来找答案。同学，你挂了。

你在给我们安排作业啊！


Question: 【c语言求助】文件的打开

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

引用 1 楼 弓长羊羽的回复:修改如下：  #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #include<conio.h> void main() { 	int i, n = 0, m = 0, k, j; 	char c[101], a[101]; 	int paiming(int x); 	srand((unsigned)time(NULL)); 	j = 0; 	k = 0; 	for (i = 0; i<100; i++) 	{ 		a[i] = 97 + rand() % 25; 		printf("%c ", a[i]); 	}/*利用时间函数，随机生成100个小写字母*/ 	printf("\n"); 	gets(c); 	for (i = 0; (i<100) && (a[i] != '\0') && (c[i] != '\0'); i++) 	{ 		k = a[i] - c[i]; 		if (k == 0) n++; 	}/*获取输入字符，判断正误*/ 	j = paiming(n); 	m = 100 - n; 	printf("输入正确字母%d个，未输入正确%d个，您的成绩为%d，您的排名为%d\n", n, m, n, j); } int paiming(int x) { 	int s[100] = { -1 }, i, j, l = 0, t, k; 	FILE *fp; 	if ((fp = fopen("D:\\4\\1.dat", "w+")) == NULL) 	{ 		printf("无法打开排名数据文件\n"); 		return 0; 	}/*打开存放成绩的文件*/ 	fseek(fp, 0, SEEK_END);    //移动到最后   zx 	fprintf(fp, "%d ", x);/*将本次所得成绩记录进文件*/ 	//fclose(fp);/*关闭文件*/ 	//if ((fp = fopen("D:\\4\\1.dat", "r")) == NULL) 	//{ 	//	printf("无法打开排名数据文件\n"); 	//	return 0; 	//}/*打开存放成绩的文件*/ 	rewind(fp); 	l = 0; 	while (1) 	{ 		if (-1 != fscanf(fp, "%d", s + l)) break; 		l++; 	} 	for (i = 0; i<100; i++) 	{ 		if (s[i] != -1) 		{ 			fscanf(fp, "%d", s[i]); 			l++; 		}/*读取排名文件中所有成绩，存入数组中*/ 	} 	fclose(fp);/*关闭文件*/ 	for (j = 0; j < l; j++) 		for (i = j; i < l; i++) 			if (s[i]>s[i + 1]) 			{ 				t = s[i]; 				s[i] = s[i + 1]; 				s[i + 1] = t; 			}/*使用冒泡法对所有成绩进行排名*/ 	for (i = 0; i <= l; i++) 		if (s[i] == x) 			return i;    //k = i; 	return -1;/*给出本次成绩排名*/ }  谢谢，可以运行了，但是排名出来有问题，我第一次运行，结果出来排名99

不要沉……

引用 4 楼 leee7338的回复:[quote=引用 3 楼 oyoy111 的回复:] ……我怎么……没看懂你在说什么  难道不是文件访问失败么？[/quote] 我也不知道了，电脑一运行就报错，自动关闭

引用 3 楼 oyoy111 的回复:……我怎么……没看懂你在说什么  难道不是文件访问失败么？

引用 2 楼 leee7338的回复:文件路径或者文件权限导致的访问错误。 还有，建议打印的错误信息要清晰。 例： printf("错误_1\n"); printf("错误_2\n"); ……我怎么……没看懂你在说什么


Question: C语言递归分鱼问题

这其实是枚举法,假如当前鱼是A, 分后的鱼为(A-1)/5*4 , 也就是说下一个人看到鱼的数量是4的倍数. 这问题直接循环就好了, 用递归不直观

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

5人分鱼5次，由第二次开始每次分的鱼的总数是上一次的四分之一，最后一次分鱼平分后还多出一条。


Question: 用除留余数法构造哈希表

void HashTable::Hashname(DataInfo *dataInfo)//以名字为关键字建立哈希表 {//利用除留取余法建立以名字为关键字建立的哈希函数，在发生冲突时调用Random函数处理冲突 	int i = 0;	 	int key = 0;          for (int t=0; dataInfo->name[t]!='\0'; t++)    	{		 		key = key + dataInfo->name[t]; 	} 	key = key % 42; 	while(value[key]->sign == '1')//有冲突 	{ 		key = Random(key, i++);//处理冲突 	} 	if(key == -1) exit(1);//无冲突 	length++;//当前数据个数加 	value[key]->name = dataInfo->name; 	value[key]->address = dataInfo->address; 	value[key]->phone = dataInfo->phone; 	value[key]->sign = '1';//表示该位置有值 	//cout << value[key]->name << "  " << value[key]->phone << "  "  << value[key]->address << endl; }


Question: 链表删除节点的问题，求破！！

困扰我这么多天的疑惑终于解开了


Question: 玩转vim的神人能进来吗？

IDE中的所谓“工程文件”有两个作用，一是你说的组织文件，哪些是项目，哪些不是，关于这点，vim应该是没有直接的对等物 二是编译相关，其实就是Linux下的Makefile了  如果对vim感兴趣，可以读vim的manual，:help即可 以下是部分目录截取，应该对你组织工程有帮助。  Getting Started usr_01.txt  About the manuals usr_02.txt  The first steps in Vim usr_03.txt  Moving around usr_04.txt  Making small changes usr_05.txt  Set your settings usr_06.txt  Using syntax highlighting usr_07.txt  Editing more than one file usr_08.txt  Splitting windows usr_09.txt  Using the GUI usr_10.txt  Making big changes usr_11.txt  Recovering from a crash usr_12.txt  Clever tricks  Editing Effectively usr_20.txt  Typing command-line commands quickly usr_21.txt  Go away and come back usr_22.txt  Finding the file to edit usr_23.txt  Editing other files usr_24.txt  Inserting quickly usr_25.txt  Editing formatted text usr_26.txt  Repeating usr_27.txt  Search commands and patterns usr_28.txt  Folding usr_29.txt  Moving through programs usr_30.txt  Editing programs usr_31.txt  Exploiting the GUI usr_32.txt  The undo tree

引用 2 楼 user-1 的回复::set path+='/path_to_snmp_include_dir' ??  果然牛X，搞定了，   我一直以为是要去环境变量里添加，难怪gf跳不过去！！！    最后向前辈讨教一个问题    假设程序有很多个cpp  .c .h ， 用过可视化的编程工具的人都知道，必须接建立一个工程文件来进行管理。  vim 如何建立工程文件，由于我装了WinManager 了，所以以当前目录浏览该目录下的文件，  但这毕竟不是工程文件！！！！！！！！！！！！！！！！！！！！11   有了工程文件才方便管理你的工程该有哪些文件，不该有哪些文件，是不是？   那么如何建立呢？  很多文章只交人如何配置vim， 丝毫没有提到过，如何建立一个工程？  如何保存一个工程？  我觉得这对开发来说，很重要！！！  不吝赐教

帮忙解答 3L问题  4L 附一个新问题：         是关于  mkession！          命令的问题。  由于mksession!   之前，我用了winmanager ，特意打wm ，然后再 mksession！这样的话，方便我以后打开工程。  关闭vim后，启动vm -S 后，  发现 第一个画面的内容是：  "[File List]" [New File] "test.cpp" 16L, 185C Press ENTER or type command to continue   请问这是什么原因？ 谁见过，这是我配置错误的原因，还是？   我于是按了回车，然后看到：  左侧的wm和左下侧的file list(也就是我们的taglist),右侧是我们的代码文件。   问题来了：  左上册侧的 wm是空的！！！！ 为此，我在wm中按了f5刷新， 没有任何效果。   只好强制用wm这2个组合键，用开启winmanager！！！！ 这个时候，才正确开启了winmanager!!  请问我的正常吗？ 注意winmanager按照网上的做法，映射为wm了. 。所以只需要用wm来开启。    配置为：  -- WinManager setting --     let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件     "let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了，退出vim     nmap wm :WMToggle<cr>

大神何在？


Question: 关于五子棋算法以及搜索的一些问题

AI 可以做得分制AI 给每一个可以下子的点一个评分.  评分最高的为落子点.   有多个最高 需要指定策略落子.

搜索下载研究开源五子棋源代码。


Question: 用VS2013编程进行windows程序设计时出现的问题

问题已经解决了

无法解析的外部符号 _main... 这句话 复制 然后上网搜索 就能找到解决方法

补充说明一下，这里建的是一个空项目


Question: 指针的指向问题，什么时候是地址，什么时候是值

int * p;  指针本身也是个变量，只是不同于大多数变量，指针存储的是一个地址，该地址所在的内存空间存储的才是实际的值（内容），而大多数变量存储的就是实际的数据内容（值）  如上  p是指针，p存储的是一个地址，如果你访问该地址通过p就可以了，如果你想访问该地址所存储的值那就需要通过*p来获取的。  如： int  a = 10; 这里a是个普通变量，a所存储的就是数据值10，而如果你想访问a的地址那么需要通过 &a

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

我们来玩一个简单的：  #include <stdio.h> #include <stdlib.h> #define MAX 100 int *shas(int *a, int n1, int *b, int n2) { 	int *c = NULL; 	int c_size = 0; 	int i, j; 	i = j = 0; 	while (i < n1 && j < n2){ 		if (a[i] == b[j]){ 			c = (int*)realloc(c, ++c_size*sizeof(int)); 			c[c_size - 1] = a[i]; 			i++, j++; 		} 		else if (a[i] < b[j]) { 			i++; 		} 		else { 			j++; 		} 	} 	c = (int*)realloc(c, ++c_size*sizeof(int)); 	c[c_size - 1] = MAX;    //最后一个元素是结束标记 	return c; } int main() { 	int a[] = { 1,2,3,4,5,6,7 }; 	int b[] = { 2,3,5,7,8,9,11 }; 	int *c = shas(a, sizeof(a) / sizeof(a[0]), b, sizeof(b) / sizeof(b[0])); 	int i = 0; 	while (c[i] != MAX) { 		printf("%d ", c[i]); 		i++; 	} 	free(c); 	return 0; } //2 3 5 7

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

只是一个merge, 保证dst足够大就行 int merge(int *dst,int *a,int la,int *b,int lb){     int *ea=a+la,*eb=b+lb;     int *p =dst;     while(a<ea||b<eb){         if(b>=eb||(a<ea&&*a<=*b)) *p++ =*a++;         else *p++ =*b++;     }     return p-dst; }

另外你的函数部分也有些冗余，我是这么写的，相互学习 for(indexc=0;indexc<100&&(*a)!=NULL&&(*b)!=NULL;)    { 		if(*a>=*b) 		{ 			if(*a==*b++) 				c[indexc++]=*a++; 		} 		else  		{ 			a++; 		}

如果实在享用指针的话可以用这种形式 int main(){     int a[]={1,2,3,4,5,6,7,NULL};     int b[]={2,3,5,7,8,9,11,NULL}; 	int *c=shas(a,b); 	while(*c!=NULL) 	{ 		printf("%d==asad\n",*c); 		c++; 	}     system("pause");     return 1; }

《C与指针》可以好好研读就明白了

数组请以数组个数为准, 而不要以空结束为准,  不要返回局部变量指针. 随手改的,   #include <stdio.h> #include <stdlib.h>  //     返回c写入的实际个数 int shas(int *a, int aSize, int *b, int bSize, int* c, int cSize){     //int *indexa=a;     //int *indexb=b;    // int c[100];     int indexA = 0;     int indexB = 0;     int indexC=0;     while(true){         if(indexA   >= aSize || indexB >= bSize || indexC >= CSIze){         break;         }         if( a[indexA] == b[indexB]){         c[indexC] = a[indexA];         indexA++;         indexB++;         indexC++;         }         if(a[indexA] > b[indexB]){         indexB++;         }         if(a[indexA] < b[indexB]){         indexA++;         }         }      return indexC; } int main(){     int a[]={1,2,3,4,5,6,7};     int b[]={2,3,5,7,8,9,11};     int c[100]; int cSize =    shas(a, 7, b, 7, c, 100);  for(int cIndex = 0; cIndex < cSize, cIndex++){ printf("%d==asad\n", c[cIndex]); //c++; }     system("pause");     return 1; }


Question: C语言 成语接龙  已知开始和结尾的成语  怎么查询中间的成语

双向链表可以吗?double-linked list

广度双向搜索算法


Question: Error c2181没有匹配if的非法else！

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

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

弱弱的问一下，自己发出的帖子可以编辑吗？？

#include<stdio.h>  int main ( ) { 	float score=0;  	 	printf ("请输入你的考试分数：\n");  	scanf("%f",&score);  	if(score>100) 	{ 		printf("输入错误\n"); 	} 	else if (score>80) 	{ 		printf("优秀！\n"); 	} 	else if(score>60) 	{ 		printf("及格！\n"); 	} 	else if(score>=0) 	{ 		printf("不及格！\n"); 	} 	else  		printf("输入错误\n"); 	 	return(0); }  这回倒是scanf报警了！！

#include<stdio.h>  int main ( ) { 	float score=0;  	 	printf ("请输入你的考试分数：\n");  	scanf("%f",&score);  	if（score>100） 	{ 		printf("输入错误\n"); 	} 	else if (score>80) 	{ 		printf("优秀！\n"); 	} 	else if（score>60） 	{ 		printf("及格！\n"); 	} 	else if（score>=0） 	{ 		printf("不及格！\n"); 	} 	else  		printf("输入错误\n"); 	 	return(0); }               //这样是否好些？

这段代码里的括号有好几个都是中文的，左右半边的都有，楼主自己找出来改成英文的应该就好了。仔细看，字体还是有区别的。 中文括号（） 英文括号()

#include<stdio.h>  int main ( ) { 	float score=0;  	 	printf ("请输入你的考试分数：\n");  	scanf("%f",&score);  	if（score>100） 	{ 		printf("输入错误\n"); 	} 	else if (score<=100 && score>80) 	{ 		printf("优秀！\n"); 	} 	else if（score<=80 && score>60） 	{ 		printf("及格！\n"); 	} 	else if（score<=60 && score>=0） 	{ 		printf("不及格！\n"); 	} 	else  		printf("输入错误\n"); 	 	return(0);

if (score > 100) ... else if (score <= 100 && score > 80)  // 这里的score <= 100可以去掉，因为前一个if的作用，执行到这里的前提就是score<=100，所以没必要再判断一次。score<=80的也一样。  最后一个score<=60，应该改成score>=0

目测看不出错误，建议楼主仔细检查一下括号之类的有没有中文符号，或者把代码原样复制过来看看。

没看出问题在哪


Question: 一个makefile的奇怪用法

up up up

引用 2 楼 user-1 的回复:首先看all为目标， 它提到会生成3个 .o文件。   眼睛花了吧， all: $(TARGETS) TARGETS=example-demon snmpdemoapp asyncapp 哪里有三个.o文件？  依赖中出现Makefile说明如果Makefile更新，目标也要更新。  LZ首先得知道.so是个什么东西  以上是我说的make的解析和执行规则，  下面下是 我的问题：  makefile的作者是希望，可以把应用程序的名字作为参数传入，它提供了3个名字。  于是我们可以make name 1,  make nam2, make name3这样的方式调用即可。  好了，但也意味着代码里，必须有3次类似的以下代码：  1.o     gcc  -c ... -o   1.o 2.o ..... 3.o  似乎作者是为了方便，于是用了个so文件的写法来替代3次的写法。

引用 2 楼 user-1 的回复:首先看all为目标， 它提到会生成3个 .o文件。   眼睛花了吧， all: $(TARGETS) TARGETS=example-demon snmpdemoapp asyncapp 哪里有三个.o文件？  依赖中出现Makefile说明如果Makefile更新，目标也要更新。  LZ首先得知道.so是个什么东西  我确实看错了   这个makefile为了生可执行文件的， 应该 和so 文件无关。  按照makefile 的解析规则  1. 应用程序，需要.o文件  2. .o文件需要知道.c 文件  最后是 clean 这个伪目标， 一步步的从顶层到低端的进行拆解解释。   而make 后的执行的执行流程是：  则是反过来，  先生出.o ，然后到 可执行文件或者.so文件。

up 起来，有高手吗？


Question: union中输出数值的问题

浮点数在内存的储存与整数是有区别的，你搜索一下浮点数 内存储存就知道了。

求解 a={65};

浮点数在机内用指数型式表示，分解为：数符，尾数，指数符，指数四部分。 数符占1位二进制，表示数的正负。 指数符占1位二进制，表示指数的正负。 尾数表示浮点数有效数字，0.xxxxxxx,但不存开头的0和点 指数存指数的有效数字。  指数占多少位，尾数占多少位，由计算机系统决定。 可能是数符加尾数占24位，指数符加指数占8位 -- float.


Question: C语言做字符倒置时，为什么定义了变量编译器会说我没定义呢

gcc 5.1的C编译器默认使用-std=gnu11而不是-std=gnu89了

循环里应该min++max--

引用 1 楼 user-3 的回复:试试把他们的定义移到函数最开始。传统的c就是这么要求的。大多数现代的编译器没这么严格了，但也有这样的好的，我试了，果然是这样，谢谢你 哈


Question: 如何用C语言获取到全部的内存数据？

肯定要写内核的驱动，不然无法访问全部的物理内存。

你要看物理内存的话可以写驱动进内核调用执行体API  可以看本人以前写的blog： 忙里偷闲中写的一个系统物理/虚拟地址内容查看器 http://blog.csdn.net/mydo/article/details/5166255  好久没搞内核了，还真是怀念呢

引用 2 楼 mydo 的回复:类似ReadRemoteProcessMemory之类的API  你好 这样不是只能获取一个进程的内存数据吗 如果我想获取全部物理内存中的数据呢？

类似ReadRemoteProcessMemory之类的API

windos核心编程里不是有讲如何读取其他进程的内存空间和内存属性的例子吗？我N年没翻了都记得


Question: Windows与linux下函数差别

建议楼主在linux下学c和c++  windows是microsoft的标准  和c++不完全一样  比如 A & a = A(); 就可以在windows编译通过，但在linux下是不行的，因为不符合c++语言的标准   总之linux永远是紧跟c++最新标准的  而微软是自己有一套   建议你在linux下学c/c++

对于c/c++标准，不同编译器，不同版本都支持程度不同，又各自有自己的扩展(非标准)。  多使用下主流的MSVC，GCC比较下两个平台

目测lz是用vs的IDE

这个是 Visual Studio 报的，微软搞的，跟 Windows 没关系。

vs编译器对库所做的警告

#pragma warning(disable:4996) ...

_s系列函数是VS的产物, 通常也就是加一个buf size防止溢出, linux用的是_n_系列, 例如 strncpy strncat等.  fopen_s把流指针用参数的方式返回, 不明白怎么个增强安全性方法, 另外学C语言最好用linux,别用VS

这并不是平台的差别，只要是C标准，到哪里都一样（同一个版本）。 fopen_s只是vc下的产物。 本质上源代码是怎样的，并不重要，它的汇编是什么才重要。

编译器自己的警告 这是编程早期  效率优先 和  安全优先 的两种思路表现 现在计算机的性能高了，自然建议 使用安全版本 fopen()是c标准库内的函数，linux和windows都知道 fopen_s()  我不知道是不是标准库的还是哪个库的，只在windows平台用过

Bounds checking


Question: C语言如何按行读取UNICODE文件？

磁盘上都是字节流，内存才会存在字符流。 使用fgetws fgetws reads the wide-character argument str as a multibyte-character string or a wide-character string according to whether stream is opened in text mode or binary mode, respectively. For more information about using text and binary modes in Unicode and multibyte stream-I/O, see Text and Binary Mode File I/O and Unicode Stream I/O in Text and Binary Modes.

试试下面方法 http://zhidao.baidu.com/question/455981816.html


Question: 怎么给c字符串赋动态值

引用 1 楼 q3733353520 的回复:1、定义一个char类型的数组 2、int i = 1,char[48]={0};       如a[0] = 'i'; //取字符i        a[0] = i;  //取ASCII码为i的字符 是这样。 我晕我怎么问了个这么傻叉的问题，自己都觉得害臊，看来通宵确实影响智力，头晕晕沉沉的，这本来知道的东西竟突然忘记了。

一个计算数字数组概览的算法

blog.csdn.net/mydo


Question: 关于结构体所占字节的问题

对齐补齐，按字节最大的那个，int或*next都是4字节，数组是9,10,11,12个元素都是占20

4字节对齐,数数看

仅供参考： #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

测结构体大小，何须这么麻烦，直接sizeof(struct person)

同意2楼 Xcode  默认设置   输出 24

引用 2楼lusfire 的回复:有个参数可以设置对齐方式这里是刚好对齐，把字符数组长度12改为11结果还是20

有个参数可以设置对齐方式

这不是凑巧对齐了吗


Question: C指针问题

楼上的指引不错

另外补充一下，你提的这个问题说明你的基础知识不够牢固，还是把C语言相关的书籍多看几遍吧

我总结一下： 1、首先你定义了一个字符指针用来指向一个字符串，这是字符串的另一种表示形式 2、在你的printf函数中格式控制参数是%s即输出一个字符串 3、如果你想输出字符串的地址，格式控制参数应该是%d、%p等

你把格式化字符%s改成%p就是打印指针值了

printf见到%s就会打印该地址保存的字符串

*mesg确实是这个地址保存的内容，但是他只限于一个字符。如果要打印整个字符串，就得用%s printf("*mesg=%c\n",*mesg);  用%c可以输出第一个字符，也就是'D'

mesg确实是个地址，但是，注意这里用的是%s，printf见到%s就会打印该地址保存的字符串。 如果要打印地址，用%d、%x、%p之类的都可以。


Question: 求助大神，关于数组

如：共有100道题目，给10个人选择，每人选择其中10道题目，先选择的人所选的题目，后面的人不能选择；需要先选择的人取消掉选中的题目后，后面的人才能选择该题目 如何利用动态数组完成该程序！谢谢

对楼主的题目感到迷惑

楼主要的是什么？ 所有的组合？还是组合的个数？


Question: c语言的scanf输入有问题，找不到问题在哪里，请高手指教~

引用 2 楼 wang0635 的回复:"%d,%d" 第一个整数输入结束紧跟一个逗号。为什么？你自己写的程序这样要求的。 谢谢，问题解决了~~

引用 1 楼 qq_29467321 的回复:输入时，12和13中间加个“，”。试下   谢谢，问题解决了，的确是少个逗号，忘记了键入数据时要跟scanf双引号里的格式一样了。

又是输入格式的问题，把C语言的书好好看看吧

输入时，12和13中间加个“，”。试下


Question: 求大神解答问题~~~

仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

extern char *strupr(char *s); 将字符串s转换为大写形式,只转换s中出现的小写字母，不改变其它字符。返回指向s的指针。

strupr(); ??  参数可以为空的吗.. 编译都不能够通过, 能运行??


Question: 求大神 帮忙看看为什么无法绘制按钮图片

引用 1 楼 user-1 的回复:(WPARAM)IMAGE_BITMAP 果然可以了 为什么不能是BS_BITMAP呢?  是不是我加载的时候定义成IMAGE_BITMAP 了?


Question: 对话框显示不正常,不能拖动,什么原因,请高手指教!

有木有高手帮忙指点下呀??

我知道可以自动生成,但是那就不知道怎么实现的,所以才想要用API的方式来实现.

我猜是下边这个函数最后一个参数没设置对,但是要设置多少呢? MSDN上说,最后这个参数是初始化时,要发送给对话框处理函数的消息参数,没有例子, DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_AboutBox), hwnd, (DLGPROC)AboutDlgProc,NULL) ;

建议你用visual studio 2013建一个win32程序，他自动生成的代码就有显示关于对话框的。

高手请进来帮忙解决下呀!!


Question: 给指针赋值出错了

指针的地址和指针指向的地址是不一样的。 float* p1是指针，float（*p2）[4]是数组指针。 单独拿出来做赋值是不行的。 p1是float*型的指针，p2是指向数组的指针，数组元素都是指针 所以p1和p2[1],p2[2],p2[3],p2[4]是等价的。

float *search(float pointer[4],int n) {     float *pt;     pt=pointer+n;        //error     return pt; }

指针和指针能一样吗

pointer有个*和[], 可以当做二维数组,pt只有一个*, 当做一维的, 改成这样 pt=pointer[n];

看c数组本质：http://blog.csdn.net/zhangxiangdavaid/article/details/38111983

float **pt;     pt=pointer+n;        //error    return *pt;  float *pt;     pt=pointer[n];        //error     return pt;

pt和pointer的类型不一样。


Question: C语言正则表达式问题

仅供参考：//摘自《代码之美》 // 字符     含义 // .        匹配任意的单个字符 // ^        匹配输入字符串的开头 // $        匹配输入字符串的结尾 // *        匹配前一个字符的零个或者多个出现 #include <stdio.h> int matchhere(char *regexp, char *text);  int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text    do {// a * matches zero or more instances        if (matchhere(regexp, text)) return 1;    } while (*text != '\0' && (*text++ == c || c == '.'));    return 0; } int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text    if (regexp[0] == '\0') return 1;    if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);    if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';    if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);    return 0; }  int match(char *regexp, char *text) {// match: search for regexp anywhere in text     if (regexp[0] == '^') return matchhere(regexp+1, text);     do {// must look even if string is empty         if (matchhere(regexp, text)) return 1;     } while (*text++ != '\0');     return 0; } void main() {     printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));     printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));     printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));     printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));     printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));     printf("-------------------\n");     printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));     printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));     printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));     printf("%d==match(a..c,abc)\n",match("a..c","abc"));     printf("%d==match(a.*d,abc)\n",match("a.*d","abc")); } //1==match(abc ,abc) //1==match(^a  ,abc) //1==match(c$  ,abc) //1==match(a.c ,abc) //1==match(a.*c,abc) //------------------- //0==match(ABC ,abc) //0==match(^B  ,abc) //0==match(A$  ,abc) //0==match(a..c,abc) //0==match(a.*d,abc)

我靠，楼主是想自己写一个正则库？

如果位数固定了直接取就行了，这样速度最快，如果位数不固定，用正则的话楼上已经写了。如果不能满足要求，再将后面的加上

看起来用不上正则, 试试吧 [a-z]+\\d{8}(\\d\\d)

额       原串是   abc20150703551111.012txt   规律应该是     abcYYYYMMDD??1111.012txt 目的要通过传给程序一个正则表达式     把原串里面的??两位数字取出来

原始串是什么样？你要截取的子串“abc20150703551111.012txt”有何规律？例如：长度固定，格式固定。 把要求列清楚才能写对应的匹配表达式，至于你说的提取55，如果子串有规律，直接group就出来了。 所以前提是你要把原始串和提取串规律描述清楚。


Question: int *p[4] 与 int (*p)[4] 有何区别

这个简单，类型识别的依据是C语言的运算符优先级，括号优先级最高，其次是[]和.和->  int *p[4]，先定位标志符p，然后根据运算符优先级确定p的结合顺序。 1）p的左边是*（指针），右边是[4]，显然[]优先级较高，p与[4]结合，p[4]，意思是p是长度为4的数组。 2）把p[4]看作一个整体，那么它的右边没东西了，然后看左边，*（指针），*(p[4])，数组元素的类型是指针。 3）把*(p[4])看作一个整体，右边没有，继续看左边，int，int (*(p[4]))，指针的类型是int。 结论：p是长度为4的数组，数组的每个元素的类型是指针，指针指向int类型。  int (*p)[4]，先定位标志符p。 1）先看p的右边，括号的优先级最高，括号内为*p，即p是指针。 2）*p看作一个整体，再往右边看，(*p)[4]，指针指向长度为4的数组。 3）把(*p)[4]看作一个整体，往右看，没东西了，那就往左看，int，数组元素的类型是int。 结论：p是指针，指向长度为4的数组，数组的元素类型是int。

20分钟就结贴，够快吧

两者对应的是指针数组与数组指针 指针数组：数组的元素是指针变量 数组指针：指向数组的指针变量

int *p[4]  ,, p 是4个元素的数组,每个元素类型为int *  int (*p)[4] , p 是指针, 对应类型为int [4]


Question: 求大神指点迷津  图片上的两个例子为什么编译不了

把 #include int main(void) { 改成： #include stdio.h int main() {


Question: 栈

1. 在InitStack返回之前加一行S.top = S.base; 2. pop的第二个参数改成引用，SElemType &e


Question: 字符串能不能转成枚举常量？或者给一个方法。谢谢

引用 20 楼 Charce1989 的回复:我觉得 你不要定义enum  定义个字符串数组，和你的函数指针数组 对应，每次解析命令之后在字符串数组里找到，然后返回下标，利用这个下标再去函数指针数组找对应的function  。 弄个结构体  直接初始化进去命令和函数。哎估计只能这样了。谢谢你

引用 18 楼 zhao4zhong1 的回复:仅供参考：//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //  我感觉这样不太好，因为我还要判断函数是否执行成功return SUCCESS。而且这样我感觉这个函数有点大，因为要判断50多次我有50多个命令。我还是改了吧。哎大改特改，以后写代码要先构思好。还是谢谢赵四老师了

引用 17 楼 zhangxiangDavaid 的回复:[quote=引用 6 楼 leee7338 的回复:] [quote=引用 5 楼 fly_dragon_fly 的回复:] 这种命令通常不会太长,直接查找命令试试看 typedef void (*EXEC)(char *); void helloAbc(char *){} struct disp{     char *cmd;     EXEC fun; } Disp[]={     { "ABC", helloAbc } }; 引用 5 楼 fly_dragon_fly 的回复:就是把命令和函数都放到一个结构体里面，定义一个结构体数组么？ 大概是这样：  typedef void(*EXEC)(char *, char *); void fun1(char *s1, char *s2) {} void fun2(char *s1, char *s2) {} void fun3(char *s1, char *s2) {} struct disp { 	char *cmd; 	EXEC fun; } Disp[] = { 	{"C_ABC", fun1}, 	{"C_DEF", fun2}, 	{"C_GHI", fun3}, }; int main(void) { 	int i; 	char *cmd = "C_ABC"; 	for (i = 0; i < 3; i++) 	{ 		if (0 == strcmp(Disp[i].cmd, cmd)) 			Disp[i].fun();    //这里还需传入合适的参数 	} 	return 0; } [/quote] 估计只能这样了。

命令是字符串，枚举是int型，估计只能比较。

引用 12 楼 mewiteor 的回复:[quote=引用 10 楼 leee7338 的回复:] [quote=引用 9 楼 mewiteor 的回复:] 串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树 能说的稍微明白点  或者举个例子么[/quote] 你能否把命令简化为单个字符，比如：A、B、C、…… 如果可以的话，以字符为下标，调用：func['A'](...); 这样就比较方便。  如果不能改串口发出的命令集，那你就百度一个Trie树的代码吧。[/quote] 也可以将命令集排好序放入一个数组中，比如：struct{char *code;int (*func)(char*,char*);} array[]={{"C_ABC",function1},{"C_DEF",function2},{"C_GHI",function3}}; 然后用bsearch二分搜索。

呵呵, 对上面补充下: 如果对字符串算法处理后, 其值于一小范围内, 如: 100015 - 100045; 此时就可以用数组了.

对命令字符串进行算法处理(如: C_ABC = "c" << 0 +  "B" << 8 + 'A' << 16 + 'C' << 24); 然后排序(树也可以);  查找时候先用算法处理, 再用二分法查找...

引用 10 楼 leee7338 的回复:[quote=引用 9 楼 mewiteor 的回复:] 串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树 能说的稍微明白点  或者举个例子么[/quote] 你能否把命令简化为单个字符，比如：A、B、C、…… 如果可以的话，以字符为下标，调用：func['A'](...); 这样就比较方便。  如果不能改串口发出的命令集，那你就百度一个Trie树的代码吧。

楼主要是不想改动大的话，也可以map(string,emnu)   一下， 不过这样做没有楼上几个个方法直接，有点冗余

引用 9 楼 mewiteor 的回复:串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树 能说的稍微明白点  或者举个例子么

请大家给一个好的方法。

std::map<std::string, std::function<int(char*,char*)>>

引用 5 楼 fly_dragon_fly 的回复:这种命令通常不会太长,直接查找命令试试看 typedef void (*EXEC)(char *); void helloAbc(char *){} struct disp{     char *cmd;     EXEC fun; } Disp[]={     { "ABC", helloAbc } };  [quote=引用 5 楼 fly_dragon_fly 的回复:] 就是把命令和函数都放到一个结构体里面，定义一个结构体数组么？

引用 2 楼 jiqiang01234 的回复:把枚举值和对应的字符串做映射 请问怎么映射？

引用 1 楼 zhao4zhong1 的回复:enum { C_ABC, //0 C_DEF,//1 C_GHT,//2 .........},  我是想根据解析出来的字符串来确定要用哪个函数处理

把枚举值和对应的字符串做映射


Question: c语言

是一块地址的表现方法。

你确定这里C里的？

verilog or C?


Question: 求带  大神，看书自学时看到的一个问题

bool mine[11]; void high(int d) {     for(;d<=10;d++) mine[d]=1; } void low(int d){     for(;d>=1;d--) mine[d]=1; } int main() {     int n;     char ans[200];     while(scanf("%d",&n)==1 && n){         gets(ans);gets(ans);         if(!strcmp(ans,"too high")) high(n);         else if(!strcmp(ans,"too low")) low(n);         else{             printf("%s\n", mine[n] ? "yes" : "maybe");             memset(mine,0,sizeof mine);         }     }     return 0; }


Question: 求大神帮忙解答

给的测试用例，空格是不是太多了

3 4 5 1 1 0 2 0 2 6 2 7 1 4 2 3 1 0 0 后面两组分别是4人和5人分数吗,这怎么看


Question: 新手用printf的困惑，不知道你碰到没有

#include<stdio.h> int main() { 	int i, t; 	t = 1; 	i = 2; 	while (i <= 5) 	{ 		t = t * i; 		i = i + 1; 		printf("%d\n", t);  //把printf移动到循环内部 	} 	return 0; } //2 //6 //24 //120

你好好看看C语言的书吧，你这是要被别人喷的节奏

你第一个printf在while循环里，所以每运行一次循环输出一次；第二个printf在循环外，所以当循环运行完毕才会输出，所以只有一个输出

while的作用范围问题，你把第二个的while的大括号写到printf后面就会是你说的那种结果

while后面加{}，作用范围不同，第一个是printf()语句在while{}里面，每执行一次循环输出一次，而第二个printf()语句在while{}外面，执行完while{}之后再执行printf()语句

我擦，你是小学生?第一段循环一次打印一次，有错?第二段循环结束，打印结果有错?你先去理解while的含义


Question: 跪求大神指点

引用 7 楼 user-1 的回复:你这个extern回调函数是在cpp里声明的嘛，你把它放到头文件里就木有问题了，要不把你源码发上来看看 不是吧.. 我在头文件中自定义的函数  要在源文件中 extern  才能在源文件中调用这个函数. 我是把消息回调函数 写入头文件中 然后把源文件中调用! 源文件:(cs.c)  extern LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);  头文件:  LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) {    //......... }

引用 5 楼 user-1 的回复:你应该把  extern HWND CreateButton(char*,int,int,int,int,HWND,HMENU);//自绘风格按钮  放在头文件里，把  HWND CreateButton(char* text,int x,int y,int w,int h,HWND zwnd,HMENU ID)//创建 Button  返回窗口句柄 {     HWND Q = CreateWindow ("BUTTON",text,         WS_CHILD | WS_VISIBLE | BS_BITMAP | BS_ICON |WS_TABSTOP,//样式顺序 子窗口 可显示  自绘样式         x,y,w,h,//x y 宽高 客户区位置  大小         zwnd,ID,//子窗口ID         (HINSTANCE) GetWindowLong(zwnd, GWL_HINSTANCE),NULL);     return Q; }  放相应的源文件里 也就是说，全局函数的声明要放在头文件里，它的实现要放在源文件里，你把这两个放反了。  我现在又恢复,真是操蛋.... 不是你说的放反了 而是我把消息回调函数 独立放在另一个头文件中 就出现了这错误. 放回源文件 又神奇的好了 可以编译了 . 但是我想知道为什么 ? 我也引用了这个头文件 而且 也用 extern 声明的回调函数 居然报错在另一个文件  我一直用VC6.0 编写的

引用 2 楼 user-1 的回复:擦，不是#include"windows.h"的问题，你肯定已经包含了。你把b.c和a.h的内容换一下，extern的东西写在a.h头文件里，然后在b.c里#include"a.h"。这样就行了。你把这两个东西放反了。 我b.c里包含有 a.h . 你有空看下源码么? 是写界面的 我实在找不出来怎么回事了

引用 2 楼 user-1 的回复:擦，不是#include"windows.h"的问题，你肯定已经包含了。你把b.c和a.h的内容换一下，extern的东西写在a.h头文件里，然后在b.c里#include"a.h"。这样就行了。你把这两个东西放反了。 哥哥 你给我说晕了

你有没有#inlcude "windows.h"?


Question: 【求助】福利啊，发一个开源浏览器源码。编译器问题

像这么多的源码，我该如何把他们都编译，生成exe或者什么，该怎么改？

引用 1 楼 user-1 的回复:我是2013的，没atl库编译不了，要不你发来？ 源码我已经附上

我是2013的，没atl库编译不了，要不你发来？


Question: 求助C语言问题

指针p没有初始化

不光是那个问题，下面是修改的程序，你看看吧 #include <stdio.h>    float plus(int n,float *p);  int main() { 	int n; 	float a[]={0}; 	float *p=a; 	printf("请输入n:\n"); 	scanf("%d",&n); 	printf("%f\n",plus(n,p));  	return 0; }  float plus(int n,float *p) { 	float i; 	float k=0; 	if (n%2==0) 	{ 		for(i=1;i<=(n/2);i++) 		{ 			k+=1/(2*i);   	    }     }     else    {         for(i=1;i<=((n+1)/2);i++)         {            k+=1/(2*i-1);         }    } 	*p=k; 	return *p; }

这是作业题吧，来来来  #include <stdio.h>   float odd(int n) { 	double ret = 0; 	for (float i =1; i <= n; i += 2, ret += 1/i); 	return ret; } float event(int n) { 	double ret = 0; 	for (float i = 2; i <= n; i += 2, ret += 1/i); 	return ret; } float plus(int n) { 	float(*p)(int); 	if (n % 2)p = odd; 	else p = event; 	return p(n); } int _tmain(int argc, _TCHAR* argv[]) { 	int n; 	printf("请输入n\n"); 	scanf("%d", &n); 	printf("%f\n", plus(n)); 	return 0; }

这个好像是指针变量P没有分配空间 一定要用指针函数的话怎么解决这个问题？


Question: 求教关于define和条件编译的一个代码

举个例子 EXT_DO_C  int  fun()  编译时 #ifdef MODEINIT_DO_C #define EXT_DO_C              ／／这里变成   int  fun() #else #define EXT_DO_C extern      ／／这里变成  extern  int  fun() #endif

不接就是空，什么也没有

不接后缀（应该是替换的内容）  就是将EXT_DO_C   替换为空


Question: 关于比较运算中的自动类型转换的疑问

因为是无符号数的缘故

无符号的比较运算和有符号的是不一样的 （unsigned）-1>1                      true

引用 5 楼 jianwen0529 的回复:无符号数不可能为负数，当用一个负数赋值依旧是一个负数 跟LS说的一样  更正下 无符号数不可能为负数，当用一个负数赋值依旧是一个正数

无符号数不可能为负数，当用一个负数赋值依旧是一个负数 跟LS说的一样

同意一楼，打印m，n的数据看看

GetTickCount64()返回的值要上百年才会溢出,我才开机几天,没有溢出,我看过,改成下面这样就能正确运行,所以我认为是自动类型转换的问题  	ULONGLONG m = GetTickCount64(); 	ULONGLONG n = m + 2000; 	if (m>n+1000)  ///////////// 	{ 		printf("Error"); 	}

两个无符号类型的数相减，结果是无符号类型的，比如说m = 0，n = 2000。m - n = -2000，-2000用无符号类型表示就是一个很大的值，还知道补码是怎么回事么？

一种可能： m较大，致使m + 2000溢出，所以n会偏小，m-n=max-2000>2000


Question: ios 关于swrevealviewcontroller 的问题

自问自答：在需要进行跳转页面增加如下代码： ViewController* mainview = [[ViewController alloc]init];     UINavigationController* nav = [[UINavigationController alloc]initWithRootViewController:mainview];     self.viewController = nav;     [self.revelController setFrontViewController:self.viewController animated:YES];


Question: 为什么这段归并排序的代码通过编译后不能运行？

引用 4 楼 Richard_00 的回复:zhangxiangDavaid的代码：int *tmp = malloc(sizeof(int)*n);应该改成int *tmp = (int*)malloc(sizeof(int)*n); 哈哈，在vc下不需要这样

二位的代码很简洁，谢谢。

你这个程序有点凌乱，下面是我写的一个归并排序的程序，你可以参考一下，希望可以给你帮助，主要还是要理清算法的过程 #include<stdio.h>  #define max 5  void mergearray(int a[],int first,int mid,int last) { 	int i=first,j=mid+1; 	int m=mid,n=last; 	int k=0; 	int temp[max];  	while(i<=m&&j<=n) 	{ 		if(a[i]<=a[j]) 			temp[k++]=a[i++]; 		else  			temp[k++]=a[j++]; 	}  	while(i<=m) 		temp[k++]=a[i++];  	while(j<=n) 		temp[k++]=a[j++];  	for(i=0;i<k;i++) 		a[first+i]=temp[i]; }  void mergesort(int a[],int first,int last) { 	if(first<last) 	{ 		int mid=(first+last)/2; 		mergesort(a,first,mid); 		mergesort(a,mid+1,last); 		mergearray(a,first,mid,last); 	} }  int main() { 	int i; 	int a[max]={4,3,1,7,6}; 	mergesort(a,0,max-1); 	for(i=0;i<max;i++) 	printf("%2d",a[i]); 	return 0; }

换一个思路，比如下面这个：  void mergearray(int *a, int first, int mid, int last, int *tmp) { 	int i, j, k, r; 	k = r = 0; 	i = first, j = mid + 1; 	do 	{ 		if (a[i] <= a[j]) tmp[k++] = a[i++]; 		else tmp[k++] = a[j++]; 	} while (i <= mid && j <= last); 	while (i <= mid) tmp[k++] = a[i++]; 	while (j <= last) tmp[k++] = a[j++]; 	do 	{ 		a[first + r] = tmp[r]; 		r++; 	} while (r < k); } void mergesort(int *a, int first, int last, int *tmp) { 	if (first < last) 	{ 		int mid = first + ((last - first) >> 1); 		mergesort(a, first, mid, tmp); 		mergesort(a, mid + 1, last, tmp); 		mergearray(a, first, mid, last, tmp); 	} } void MergeSort(int *a, int n) { 	int *tmp = malloc(sizeof(int)*n); 	mergesort(a, 0, n - 1, tmp); 	free(tmp); } int main(void) { 	int arr[] = { 2,1,6,4,0,3,9,5,8,7 }; 	MergeSort(arr, 10); 	return 0; }


Question: onvif 测试工具搜索不到设备

引用 3 楼 user-2 的回复:[quote=引用 2 楼 qq_27115241 的回复:] 我们有一套是用gsoap库实现的，不过每次对接的时候别家的NVR时他们都会添加其他结构体成员，每次都要重新编译gsoap库，而且库太大了，我们就想自己再写一套onvif出来，不用gsoap库了。  现在搞得测试工具都搜索不到了 自己写一套onvif，工作量可不小。discovery只是第一步。我还是建议用过gsoap来做。不知道你们是怎么做的，我用gsoap的discovery插件的功能， 基本主流的nvr都可以识别。[/quote]  你说的这个使用discovery插件功能是必须要在使用gsoap库的基础上吗？  不使用gsoap库能用discovery插件功能不？

貌似Onvif Device Manager 不处理 <wsa5>标记

wireshark / tcpdump 抓包分下看看设备发现请求的区别 看看Onvif Device Manager 的设备发现请求有哪些  <XX:probe>？？

引用 2 楼 qq_27115241 的回复:我们有一套是用gsoap库实现的，不过每次对接的时候别家的NVR时他们都会添加其他结构体成员，每次都要重新编译gsoap库，而且库太大了，我们就想自己再写一套onvif出来，不用gsoap库了。  现在搞得测试工具都搜索不到了 自己写一套onvif，工作量可不小。discovery只是第一步。我还是建议用过gsoap来做。不知道你们是怎么做的，我用gsoap的discovery插件的功能， 基本主流的nvr都可以识别。

为何不用gsoap来实现server？ gsoap有onvif discovery的插件，很方便


Question: fastdfs storage日志错误信息

网络组网问题


Question: 【求助】关于浮点数运算的误差问题

引用 5 楼 hhhhhhhhhhkkkkkkkkkk 的回复:自己要做大数运算就只能把数据存成字符串了。。。。。。很麻烦，又慢。所以能用直接的就用直接的。 当然你空了可以自己实现一个新的数类，以后做一些小东西时就可以偷懒了。  恩恩，听你的吧，做新类还是有空再说。 3Q！

引用 1 楼 hhhhhhhhhhkkkkkkkkkk 的回复:不设计新类而减少误差，你应该注意以下几点： 1.避免两个相近的数相减 2.避免除数接近0. 所以，如果有： a0-b0+a1-b1+a2-b2...... 应该这样计算： tmp0=a0+a1+a2+...... tmp1=b0+b1+b2+...... ret=tmp0-tmp1. 这样可以避免减法误差。 如果有 a0/b0*a1/b1*a2/b2...... 其中b0,b1,b2.....接近于0 你应该先把b0,b1,b2......乘一个数以让它们远离0(这个数你看情况选，这里我假设b0,b1,b2......是10^(-5)级的小数。我选10^5作为这个数） 令r=10^5 原式=a0/(b0*r)/r  *a1/(b1*r)/r  *a1/(b1*r)/r   *......  谢谢大大回复，你提供的方法确实可行，因为模型改变后每次生成的代码都不同，每次都做代码处理工作量有点大才想有没有一劳永逸的办法。主要是想偷懒…… 接下来还有多输入多输出的模型要建，输入的数大小也不确定，要边考虑数字处理边对生成的算法做加工。好难…… 所以才想到建新类的，不过一想到系统资源……估计这懒是偷不得……

libgmp/mpfr/mpir

还有： 防止大数吃小数 避免大数做乘数。


Question: 关于C语言函数指针的问题

引用 9 楼 zhangxiangDavaid 的回复:这样可好：  static int val; int *a(void) { 	return &val; } void b(int*(*ptr)(void)) { 	(*(ptr()))++; } int main(void) { 	val = 0; 	b(a); 	printf("val=%d\n", val);   //val=1 	return 0; }  引用 9 楼 zhangxiangDavaid 的回复:这样可好：  static int val; int *a(void) { 	return &val; } void b(int*(*ptr)(void)) { 	(*(ptr()))++; } int main(void) { 	val = 0; 	b(a); 	printf("val=%d\n", val);   //val=1 	return 0; }   非常感谢！我把你们的方法都好好的琢磨琢磨，理解一下。再次感谢！

static int val; int* a(void) {         return &val; } void b(int* (*ptr)(void)) {         int* p = ptr(); //*p操作的就是 val } b(a);//注意 a 不能加()

引用 4 楼 lin5161678 的回复:[quote=引用 2 楼 user-3 的回复:]哦 还有一点忘记说了  更加题主的标签  这是C语言代码  那么 你的改法就是语法错误了  C语言没有引用[/quote]  我在下面做了一些说明，大神可以看看，如果想实现该如何破，提供个思路

static int val; int a(void) { 	val++; 	return val; } void b(int(*ptr)(void)) { 	ptr(); } //调用 b(a);

引用 2 楼 user-3 的回复:我擦，你那val都是静态的了，直接val++呗。 如果你是想通过a函数来操作的话，a函数应该返回val的引用，而不是值，如下  static int val; int &a(void)  {         return val;  } void b(int& (*ptr)(void)) {      ((*ptr)())++; }  这样就能实现val++了。这里的(*ptr)()就是val的引用。 首先感谢回答。我讲下我项目的问题吧，看看大神有没有什么合适的实现方法。  //工程中含有若干文件,都属于是嵌入式的界面文件，属于同一类型 f1.c  //含有static  int val1,  fun1() ,fun1()需要对val1进行操作。 f2.c  //同上面的结构 f3.c  //同上  因为 函数fun1,2,3功能一样，我就想把他们写成同一个函数。但是val1,2,3却不能由同一个全局来代替。所以我就想get到val123的值再操作。就搞的晕了

引用 2 楼 user-3 的回复:哦 还有一点忘记说了  更加题主的标签  这是C语言代码  那么 你的改法就是语法错误了  C语言没有引用

引用 2 楼 user-3 的回复:我擦，你那val都是静态的了，直接val++呗。 如果你是想通过a函数来操作的话，a函数应该返回val的引用，而不是值，如下  static int val; int &a(void)  {         return val;  } void b(int& (*ptr)(void)) {      ((*ptr)())++; }  这样就能实现val++了。这里的(*ptr)()就是val的引用。 1 这里的static 表示的不是静态  全局变量自带静态光环 这个static做的是其他文件看不到这个变量  2 直接 ptr() 就能获得 val的引用 你是 * 操作是多余的  不会错 但是难看

做不到


Question: 关于while循环对函数调用的影响

你加break，当result==0时就跳出了循环，返回的当然是sucess。 不加break就成了死循环，循环执行完第一遍后又执行第二遍、第三遍、子子孙孙无穷尽也。当函数返回值result!=0时，当然就会出现failed了。

目前，还看不出来

并不会  你试试 bool bRet = true; while( bRet ) { if( ) { bRet = false; } }

引用 2 楼 GKatHere 的回复:不会执行 printf("read block failed !\r\n"); 就是没有break的时候执行返回值是正确的，加上break返回值是错误的

不会执行 printf("read block failed !\r\n");

不知道你在说什么，这个不关while循环的事情吧


Question: 我编写的不能返回该位置值也不能返回该位置。题目是能查找数据在数组中的位置，并返回该位置值，如果该数据不在数组中则返回-1；

引用 4 楼 stephen_w__ 的回复:search 里的索引要从 0 开始,,传入数组的实际大小,main 里直接输出结果就可以 printf("%d\n",search(a,sizeof(a),n));  int search(int *p,int n,int c) {     int i = 0;     if(p)         for(;i<n;++i)             if (*(p+i)==c)                 return i + 1;   //显示从第一位算             return -1; }  数组大小应该是  sizeof(a)/sizeof(int) ,改下

要尽可能的简单：  #include <stdio.h> int search(int *p, int n, int c); int main(void) { 	int a[5] = { 0,1,2,3,4 }; 	int i; 	int b; 	int res; 	for (i = 0; i < 5; i++) 		printf("%d\n", a[i]); 	printf("please input the number to search:"); 	scanf("%d", &b); 	res = search(a, 6, b); 	if (-1 == res) printf("Can not find it!\n"); 	else printf("find it! It is in %d\n", res); 	return 0; } int search(int *p, int n, int c) { 	int i; 	int flag = 0; 	for (i = 0; i < n; i++) 		if (*(p + i) == c) 			return i; 	return -1; }

#include<stdio.h>  int search(int *p,int n,int c);  int main() {     int a[5]={0,1,2,3,4};     int i;     int b;     int res;     for(i=0;i<5;i++)         printf("%d\n",a[i]);     printf("please input the number to search:");     scanf ("%d",&b);     res=search(a,5,b);     if(res!=-1)         printf("%d\n",a[res]);     else  printf("-1\n");     return 0;  }   int search(int *p,int n,int c) {     int i;     int flag=0;     for(i=0;i<n;i++)         if (*(p+i)==c)          {              flag=1;              break;          }     if (flag)         return i;     else         return (-1); }

res=search(a,6,b);                //res=search(a,5,b);  int search(int *p,int n,int c) { int i; int flag=0; for(i=1;i<n;i++) // for(i=0;i<n;i++)  // { if (*(p+i)==c) { flag=1; break; } //} if (flag==1) { printf("%d\n",i); *p=i;  // printf("%d\n",*(p+i)); return (*p);  // return *(p+i) } else return (-1); }


Question: 急！用C语言编的一个学生籍贯信息记录簿出现问题

帮忙修改一下代码吧，上面那个是代码的链接

定义参数时给个初始值  参数未初始化引起的异常大数据

管理员删帖吧，问题已与他人联系解决


Question: 最后输出date.dat以文本打开有乱码，求更早

case 3: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新年龄>>"); 		scanf("%d",&p); 		Room[j].Client_list.Age=p; 		system("pause>nul"); 		system("cls"); 		break; 	case 4: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新身份证号>>"); 		for(t=0;t<20;t++) 			scanf("%s",&a[t]); 			for(t=0;t<20;t++) 				Room[j].Client_list.ID_Card[t]='0'; 		strcpy(Room[j].Client_list.ID_Card, a); 		system("pause>nul"); 		system("cls"); 		break; 	case 5: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新入住年>>"); 		scanf("%d",&p); 		Room[j].Client_list.year=p; 		system("pause>nul"); 		system("cls"); 		break; 	case 6: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新入住月>>"); 		scanf("%d",&p); 		Room[j].Client_list.month=p; 		system("pause>nul"); 		system("cls"); 		break; 	case 7: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入入住日>>"); 		scanf("%d",&p); 		Room[j].Client_list.data = p; 		system("pause>nul"); 		system("cls"); 		break; 	case 8: 		system("cls"); 		save(); 		return; 	} 	save(); 	return; } /*------------------------------------------------*/ void open_file() { 	void clean_date(); 	FILE *fp; 	int i; 	if((fp=fopen("date.dat","rb+"))==NULL) 	{ 		printf("Can not open file!\n"); 		exit(0); 	} 	for(i=0; i<NUM; i++ ) 	{ 		if(fread(&Room[i],sizeof(struct Hotel),1,fp) != 1) 		{ 			printf("\nRead error!!\n"); 			printf("Auto Clean\n"); 			clean_date(); 			exit(0); 		} 	} 	fclose(fp); }  /*------------------------------------------------*/  void clean_date() { 	FILE *fp; 	int i; 	if((fp=fopen("date.dat","wb+"))==NULL) 	{ 		printf("Can not open file!\n"); 	} 	for(i=0; i<NUM; i++) 	{ 		memset(&Room[i],0,sizeof(struct Hotel)); 		Room[i].Room_ID=i; 		if(fwrite(&Room[i], sizeof(struct Hotel),1,fp) != 1) 		{ 			printf("Clean error!!\n"); 			exit(0); 		} 	} 	fclose(fp);  	system("pause>nul"); 	system("cls"); }  /*------------------------------------------------*/  int display_hotel() { 	int g, count; 	count=0;      for(g=0;g<NUM;g++)  //通过循环输出未使用的房间数 	{ 		if(Room[g].Sign == 0)  			++count;  		else  			if(Room[g].Sign != 0) 				printf("正在使用的房间号:%d\n",g); 	} 	if(80 == count) 	{ 		printf("未有人员入住!!\n"); 		save(); 		return -1; 	}   	else 	{ 		printf("未使用的房间数:%d\n",count); 	} 	return 1; } /*------------------------------------------------*/

将fwrite，fread改为fprintf，fscanf

老师希望我改下源代码 就可以直接在date.dat打开后看见   能直接指导下吗

你没有搞清楚数据和字符的区别。 定义一个结构体  struct A {     int data; }; A output; output.data = 65;//即‘A’ 然后 fwrite(&output, 1, 1, fp); 现在你打开文本文件，看到的就是“A”。  而且你直接输出结构体，还要考虑内存对齐。

void open_file() {     void clean_date();     FILE *fp;     int i;     if((fp=fopen("date.dat","rb"))==NULL) {         printf("Can not open file!\n");         exit(0);     }     for(i=0; i<NUM; i++ ) {         if(fread(&Room[i],sizeof(struct Hotel),1,fp) != 1) {             printf("\nRead error!!\n");             printf("Auto Clean\n");             clean_date();             exit(0);         }     }     fclose(fp);      for(i=0; i<NUM; i++ ) {         printf("------------------%d------------------\n",i);         printf("\n标记(其中：1表示有人，0表示没人):%d",Room[i].Sign);         printf("\n姓名:%s",Room[i].Client_list.Name);         printf("\n性别(其中：1表示男，2表示女):%d",Room[i].Client_list.Sex);         printf("\n年龄:%d",Room[i].Client_list.Age);         printf("\n身份证号:%s",Room[i].Client_list.ID_Card);         printf("\n入住年份:%d",Room[i].Client_list.year);         printf(" 月:%d",Room[i].Client_list.month);         printf(" 日:%d",Room[i].Client_list.data);         printf("\n房间号:%d",Room[i].Room_ID);         printf("\n客房单价:%d",Room[i].Price);     } }

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了


Question: 递归求最小值，出问题了，请教大神！！！

修改如下：  int my_min(int *arr, int n) { 	if (1 == n) return arr[0]; 	int i = my_min(arr + 1, n - 1); 	return arr[0] <= i ? arr[0] : i; } int main(void) { 	int a[] = { 2,0,1,5,3,8,4,9,6,7 }; 	int n = sizeof(a) / sizeof(a[0]); 	printf("%d\n", my_min(a, n)); 	return 0; } //0

你的代码执行的是min(a,100)，但是你实际上需要的是min(a, 3) 另外，你的数组没有初始化，只有前三个赋值了，后面97个数里面有哪些值就不一定了。改成int a[100] = {0},i;这样的结果就会是0

改成printf("min:%d\n", min(a, i));

输出来是这样的！！！

用strlen获取有效字符串长度

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


Question: 字符串的修改

可是得不到jkds*^*(HKEEEklIejilg，而是jkds*^*(HKEEEklI蘣jil蘣。@zhao4zhong1

直接一个个拷一下就可以了 int ChangeString(char *s) {     if(!s) return -1;     char *d=s;     while(*s){         char ch=*s++;         if(islower(ch) && s[0]==ch && s[1]==ch)         {             ch = ch=='z' ? 'a' : ch+1;             s+=2;         }         *d++ =ch;     }     *d='\0';     return 0; }

显然，一次操作是不行的：因为修改过后，会引起副作用。 这样可好：  char *changString(char *s) { 	if (!s) return NULL; 	int i, j, flag, n; 	flag = 0; 	n = strlen(s); 	int count = 0; 	for (i = 0; i < n; i++) 	{ 		if (s[i] >= 'a' && s[i] <= 'z') 		{ 			if (0 == count) count++; 			else if (s[i] == s[i - 1]) 			{ 				if (3 == ++count) 				{ 					s[i - 2] = (s[i] == 'z' ? 'a' : s[i] + 1); 					memmove(s + i - 1, s + i + 1, strlen(s + i + 1) + 1); 					n = strlen(s + i - 1); 					i -= 2; 					flag = 1; 					count = 0; 				} 			} 			else count = 0; 		} 	} 	if (flag) changString(s); 	return s; } int main(void) { 	char s[] = "jkds*^*(HKEEEklIdddjilfff";   //"jkds*^*(HKEEEklIejilg" 	printf("%s\n", changString(s)); 	return 0; }

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A


Question: 大神看看这段简单代码为什么运行错误，帮忙纠正

。。。。。 printf中双引号里面的是要原样输出的。除了输出格式外。 楼上给出了printf用法。

#include<stdio.h> int main() { int a, b, c;  a = 4; b = a++; if (a < b) { printf("c = ％d\n ", c=a); } else { printf("c = %d\n", c=b); }  return 0; }    还有你这个肯定是a=b+1 啊啊啊啊;

b=a++  这是?

不知楼主，要干什么……

不知道你的目的是什么？姑且认为a小于b时，c等于a。  #include<stdio.h> int main() {     int a, b, c;      a = 4;     b = a++;     if (a < b) {         c = a;         printf("c = ％d\n ", a);     } else {         c = b;         printf("c = %d\n", b);     }  return 0; }

printf("c = %d\n", c);	输入字符的类型。


Question: C创建窗口失败，怎么调试

顶一下。。试过很多办法，比如判断设为==NULL什么的，修改window类的大小、风格参数等等，但是还是会创建失败。 逐步调试时，判断前，也就是createwindow前是这样   判断后是这样，hwnd就为NULL了。   什么地方不对

插入的地方是MessageBox 创建失败 的上一行。

引用 4 楼 user-1 的回复:GetLastError()提示什么？  我用这个 void ShowError(){ 	TCHAR *lpMsgBuf; 	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 		NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 		(LPTSTR)&lpMsgBuf, 		0, 		NULL); 	MessageBox(NULL, lpMsgBuf,TEXT(""), MB_ICONERROR); }  结果是这样

GetLastError()提示什么？

引用 2 楼 user-1 的回复:调试模式，看看断电停在哪里  没可添加的断点。其他都是正常的，就是不知道为什么CreateWindow会失败，然后返回NULL指针。我也不能在CreateWindow里面加断点吧。。话说能看到这个API的实现吗

调试模式，看看断电停在哪里

我运行时就一直都是创建失败


Question: 悬挂指针问题

一般编译器会 （1）尽量避免读写内存、磁盘等存储设备以减缓硬件的老化 （2）尽量避免不必要的操作以缩短时间。 所以编译器并没有真正与擦除这些地方的值（这会浪费很多时间）而只是直接改变指针的位置（如果你过汇编的话就很好理解了）。 知道为什么会有数据恢复这些软件吗？ 就是因为windows在彻底删除文件时并没有把文件的真正数据写成其他值（不仅会加快硬件老化，而且会浪费大把时间），连文件索引都没擦，只是把文件标记为删了而已。数据恢复软件就是把这些索引通过一定的算法重新恢复出来了。

淋雨不一定会感冒，但我们总是劝人们不要淋雨，对吗？

引用 2 楼 tianshuaiok 的回复:楼主你好，来听听小老弟给你讲讲吧！ 首先，你要搞清楚fun()的返回值代表几层含义。 返回函数指针跟数组的首地址，因为他们是同一个，这下明白了吧。你打印整形，当然是5。 你得再想想？

其实这里你用vs2013运行的话，编译器会警告你返回临时或局部变量地址。就像他们说的那样，C标准没有定义这种行为，所以编译器即不赞成也不阻止你运行。

未定义行为  销毁后地址值依然指向该内存  如果这块内存没有被其他程序占用也没有被程序所修改，其值可能是正确的

// 不是销毁了, 返回的局部变量的指针是指向栈内的指针,  FUN返回时, 栈指针(esp)会倒退几位, 当再压栈时, 原值会被修改. // 而此处没有被修改 // 试试 int *fun(){      int a[] = {5};            return a; } int *fun2(){      int a[] = {6};            return a; } int main(){      int *q;     q = fun();  fun2();                         // 将会修改栈内的值    printf("%d\n",q[0]);    // 6      system("pause");     return 0; }

输出结果未定义，也就是可能会输出正确的


Question: 求解释 C初学者

谢谢了，这是细节问题，让我看到了自己的不足。

编译器在读到空格时判定读取到EOF，所以你输入两个数，实际上他他只读取到空格之前的数并在下面输出。

scanf("%d ",&c); 上述语句中的%d后面你为什么还加一个“空格”呢？


Question: c的问题，谢谢

引用 2 楼 user-1 的回复:或者就简单在gets(s)前面加一行 scanf("%c", &s[0]);这样应该也行。总之要想法把缓冲区里留下的那个回车清掉。    谢谢，可以了。  方便留一下联系方式么？有什么问题可以直接问您的？每次遇到问题都得等好长时间才能解决，老师又经常见不到。

你输入15的时候，会敲一个回车，这个回车留在缓冲区里，被gets读到，于是s就是一个空串。 对于有些编译器，可以在gets前面加一个fflush(stdin); 就可以把缓冲区清空。但不是所有编译器都支持的。 自己手动解决也可以： printf("请输入一个英文句子："); do{ gets(s); } while (s[0] == '\0');  printf("您输入的英文句子是：


Question: 关于&&和||运算符优先级的问题

Short-circuit evaluation

优先级高表示 ++a || ++b && ++c 是 ++a || (++b && ++c) 而不是 (++a || ++b) && ++c  其次这些运算都是从左向右演算的。  举四则运算的例子： 1 + 2 * 3 *比+优先级高，表示上式为 1 + (2 * 3) 而不是 (1 + 2) * 3 但是它们都是从左向右演算的，即就+而言 它先演算1  就原问题而言，就||而言 先演算++a  其次就是||是短路的

引用 2 楼 user-3 的回复:对啊，｜｜ 符号不是先执行左边  成功了 就不看右边么？  可是优先级高的不先算吗？

对啊，｜｜ 符号不是先执行左边  成功了 就不看右边么？

VC6 、win2003


Question: if(p==NULL)和if(!*p)作用相同还是相反？求解释

引用 2 楼 user-4 的回复:前面写错了  if(p==NULL)   和 if(!p)   效果相反    早期的指针 空指针NULL的值是0 if(p==NULL)    相当于 if（p==0）  if(!p)  相当于 if(!（p!=0）)  就一个意思，通常我爱写成if(!p) NULL 的宏就是0， 另外新版编译器都支持推荐用nullptr 另外“ if(!p)  相当于 if(!（p!=0）” 这什么意思，不懂，if(!p) 就是p为零（即!p不为零）时候执行

if(p==NULL) ==> if(p==0) if(!*p) ==> if(*p==0)

根本就没有可比性：  char * p = NULL; if (p == NULL) // true if (!*p) // crash  char a = '\0'; char * p = &a; if (p == NULL) // false if (!*p) // true  char a = 'A'; char * p = &a; if (p == NULL) // false if (!*p) // false  当然，如果LZ问的是 if (p == NULL) 和 if (!p) 的话，两个条件是等价的，简单的判断方法就是使用真值表。

不同的东西 p==NULL   判断指针是不是空指针 !*p   是对p指针指向的char  进行取反操作 if(p==NULL)   和 if(!p)   效果相同，但与指针判空 建议使用前者


Question: c语言写的长整数加法

仅供参考：#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语言进程问题

引用 2 楼 whizer 的回复:弄一个10s定时器，处理函数中做＋1操作。帮忙看一下哪里错了吧，不提示错误，结果就是不显示长整型 #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<fcntl.h>  #include<sys/types.h>  #include<unistd.h>  #include<sys/wait.h>  int main()  {     pid_t pid;           int i,fd;           long int *n=0;           char *buf="This is a Daemon\n";           pid=fork();           if(pid<0)          {                  printf("Error fork\n");                  exit(1);           }           else if(pid>0)          {                 exit(0);           }           setsid();           chdir("/");           umask(0);           for(i=0;i<getdtablesize();i++)          {                   close(i);          }     while(1)         {                   if((fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)                   {                            printf("Open file error\n");                            exit(1);                     }                     write(fd,buf,strlen(buf)+1);            write(fd,n,*n++);                   close(fd);                    sleep(10);          }           exit(0);  }

弄一个10s定时器，处理函数中做＋1操作。

问错版块了，到“硬件、嵌入式”区


Question: 关于用C语言写的一个链表初始化函数的问题

《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

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

上下文要一齐改哦,看赵老师的正确答案 Node *p 只表示一个节点的指针 Node **p 才是整条链

#include <stdio.h> #include <stdlib.h> typedef struct node {     int number;     struct node *next; }Node;  void Link_initialize(Node **plist); int main(void) {      Node *plist = NULL;     Link_initialize(&plist);     //初始化链表     printf("hello");     free(plist);     return 0; }  void Link_initialize(Node **plist) {     *plist = (Node *)malloc(sizeof(Node));    (*plist)->next = NULL; }

引用 1 楼 FightForProgrammer 的回复:void Link_initialize(Node *plist)改 void Link_initialize(Node **plist) 用指针的指针 但是为什么改了之后第22行为什么会出现“错误：表达式必须包含指向结构或者联合的类型”？


Question: 怎样把这句话分成多条语句啊

实现成类成员函数赋值？

char *p[2]; p[0]="abc"; p[1]="def";

引用 4 楼 K8001 的回复:[quote=引用 2 楼 user-3 的回复:] 要什么样的多条语句  大致这样的:  char *p...........;   定义p变量  strcpy(p,"abd");      给p所指向的数组赋值,语句不一定正确,完成给数组赋值就行  [/quote] char *src[5]={"abc", "def"},char *p[5]; for(int i=0;i<5;i++) {     p[i] =new char[100];      strcpy(p[i],src[i]); }

引用 2 楼 user-3 的回复:要什么样的多条语句  大致这样的:  char *p...........;   定义p变量  strcpy(p,"abd");      给p所指向的数组赋值,语句不一定正确,完成给数组赋值就行

引用 1 楼 FightForProgrammer 的回复:实现成类成员函数赋值？  现在不考虑类,就拆成多条语句就行

要什么样的多条语句


Question: 求c语言 源代码


Question: 各位大神求解决！！！！！！

问题是什么呢

问题在楼主本机硬盘上的图片文件“/Users/MAC/Desktop/屏幕快照 2015-06-30 上午11.31.15.png”中。 等待楼下高级黑客黑掉楼主的电脑查看图片文件“/Users/MAC/Desktop/屏幕快照 2015-06-30 上午11.31.15.png”的内容以及楼主电脑磁盘中其它位置的艳照……后，再在此帖贴出问题的答案以及艳照……


Question: Windows 已在 new_to_C.exe 中触发一个断点。。。求助，实在找不出问题在哪里

main_peak_location1[i+1]，Bottom[j]这些你都需要看看是否越界了

subbottomlocation1[i]=j;///////在这里 就在这一行报错的

不知道怎么弄了

越界问题我看过了，么有越界

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

代码没上全。。。。


Question: NULL指针可以FREE多次吗 ?    为什么

什么都不会做的

见 free 源码

引用 1 楼 misskissC 的回复:见 free 源码 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\free.c /*** *free.c - free an entry in the heap * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Defines the following functions: *           free()     - free a memory block in the heap * *******************************************************************************/  #include <cruntime.h> #include <malloc.h> #include <winheap.h> #include <windows.h> #include <internal.h> #include <mtdll.h> #include <dbgint.h> #include <rtcsup.h>  /*** *void free(pblock) - free a block in the heap * *Purpose: *       Free a memory block in the heap. * *       Special ANSI Requirements: * *       (1) free(NULL) is benign. * *Entry: *       void *pblock - pointer to a memory block in the heap * *Return: *       <void> * *******************************************************************************/  void __cdecl _free_base (void * pBlock) {          int retval = 0;           if (pBlock == NULL)             return;          RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));          retval = HeapFree(_crtheap, 0, pBlock);         if (retval == 0)         {             errno = _get_errno_from_oserr(GetLastError());         } }

当然可以。  4.10.3.2 The free function   Synopsis           #include <stdlib.h>          void free(void *ptr);  Description     The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation.  If ptr is a null pointer, no action occurs.  Otherwise, if the argument does not match a pointer earlier returned by the calloc , malloc , or realloc function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.  Returns     The free function returns no value.

引用 1 楼 misskissC 的回复:见 free 源码+1


Question: 大神求助，c源程序编译时各种语法错误，该如何修改，弄了一早上，还是没搞定

引用 1 楼 jinzhijiban 的回复: 语法错误应该好改的。你说说是什么错误。也可以把运行结果截图，这里也能发图片。上面第6个按钮。

遇到编译不过去的问题，一般都用/*...*/注释可疑部分，再编译。

编译的问题就自己解决吧嗄。 毕竟。。你这么一发，看的不舒服

引用 4 楼 user-5 的回复:哈哈，发代码选一下格式再发，我去 其实这也不能全赖新人，CSDN论坛就不能判断回帖内容中有#include就自动用【code=c】【/code】括住吗？

哈哈，发代码选一下格式再发，我去

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。


Question: 这样电脑配置装LINUX可以吗？

有下载地址吗？给我..

引用 8 楼 aq159258 的回复:有下载地址吗？给我.. puppylinux.org

可以试试puppy linux,虽然我没用过

有两张内存条一张512的一张256的这样可以吗？

引用 4楼大熊猫侯佩 的回复:至少2gb内存这个电脑换内存哪些可以吗？我去问过他们说要换主板什么的相当换个主机了？

至少2gb内存

引用 2 楼 mydo 的回复:除非你装一台linux服务器，只装最低限度的组建，那是没问题。但你的目的是在上面coding，这个比较难。e！那我这个电脑不能了吗..那我换个内存可以吗？

内存太小，CPU凑活；装一个主流的linux会卡！例如ubuntu或fedora；而另外一些耗费性能大户比如open suse之类的就更不要想了。建议装一些小众的低配版本为好。


Question: char s[] 和 char *s 的区别（strtok应用中）

感谢大牛们的指点，原因很简单，只是当时脑子没反应过来！哎 被C搞的疲乏了

而char *s = "192.168.0.1";中的s指向了一个常量字符串，其所在的内存是不能被更改的 char s[] = "192.168.0.1";这里的s是用后面的常量字符串去初始化s所在的内存区域，这个区域是可以更改的 你可以通过调试来查看

strtok这个函数会更改第一个参数的内容

char *s = "192.168.0.1";  这句必须写成： char const *s = "192.168.0.1";  编译器不报错，是历史的原因。

仅供参考：#include <stdio.h> int main() {     int IP[4];     int i;     char c;      printf("请输入一个ip地址:");fflush(stdout);     while (1) {         rewind(stdin);         if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {             if (0<=IP[0] && IP[0]<=255              && 0<=IP[1] && IP[1]<=255              && 0<=IP[2] && IP[2]<=255              && 0<=IP[3] && IP[3]<=255              && '\n'==c) {                 break;             } else printf("输入的ip地址格式不对!\n请重新输入:\n");         } else printf("输入的ip地址格式不对!\n请重新输入:\n");     }     for (i=0;i<4;i++) {         printf("IP[%d]=%d\n",i,IP[i]);     }     return 0; }

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


Question: 电话订餐信息处理系统如何增加文件存储功能？？

直接存sqlite，必须的


Question: 基于单片机循迹小车的问题

提醒：小心空回误差！


Question: 大家能否帮忙看下这道ACM题目，关于背包问题的，

搜"背包九讲"。


Question: 嵌入式C代码指针运用解惑（急/在线等....）

好厉害的大神，虽然看得不太懂。。。另外楼主如果您觉得解决了问题，该结贴了吧。

多谢 上面两位的热心解答！

PIndex 是为保证地址范围在0~7 函数的用应该是每调用一次，保存一个数，做一次除8平均。

多谢！！！！ 明晰多了！！ 可是还有点不通的地方   还望说明啊！  for 循环 应该是 把 pAvgbuffer数组的值 赋值给 pOutVal 并加和   然后求平均。 可是前面只有一个InVal值给了这个pAvgbuffer【0】？ 怎么平均呢？ 然后PIndex 的作用是什么呢？

也可能 //*(pAvgBuffer + ((*pIndex) ++)) = InVal; //上面这句等价于     pIndex[0]++;     pAvgBuffer[pIndex[0]]=InVal;   到底    pIndex[0]++; 在前还是在后，楼主单步调试自己验证一下。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

typedef struct { uint8_t Index; int16_t AvgBuffer[8]; }AvgTypeDef;  void CalAvgValue(uint8_t *pIndex, int16_t *pAvgBuffer, int16_t InVal, int16_t *pOutVal) { uint8_t i;  //*(pAvgBuffer + ((*pIndex) ++)) = InVal; //上面这句等价于     pAvgBuffer[pIndex[0]]=InVal;     pIndex[0]++;   //  *pIndex &= 0x07; //上面这句等价于     pIndex[0]=pIndex[0] & 0x07;      *pOutVal = 0;     for(i = 0; i < 8; i ++)     { //      *pOutVal += *(pAvgBuffer + i);         //上面这句等价于         pOutVal[0]=pOutVal[0] + pAvgBuffer[i];     } //  *pOutVal >>= 3;     //上面这句等价于     pOutVal[0]=pOutVal[0] >> 3; }  A[B] *(A+B) *(B+A) B[A] //以上四行等价


Question: 内存泄露

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  仅供参考：//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>

代码是错的 char  *p = NULL;      ／／p指向NULL p = (char *)malloc(10);          //p指向刚申请的10个字节内存 p ="hello";                       ／／p指向一个常量字符串“hello”(此时已经内存泄漏) printf("%s\n", p);       ／／输出“hello” free(p);         //试图free常量字符串“hello”,应该出错 return 0;     你可以把p ="hello";      改为 strcpy() 或者 memcpy();

#include <stdlib.h> #include <stdio.h> int main() { char  *p = NULL; p = (char *)malloc(10);//在堆上申请10个字节的空间并将其首地址保存在p中 p ="hello";            //将p的值修改为字符串常量的起始地址"hello"，原来p的值没人管了 printf("%s\n", p); free(p);               //free的地址不是以前malloc返回的地址，出现异常错误，导致进程自动退出。 return 0;    }   free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  free <stdlib.h> and <malloc.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameter  memblock  Previously allocated memory block to be freed  Remarks  The free function deallocates a memory block (memblock) that was previously allocated by a call to calloc, malloc, or realloc. The number of freed bytes is equivalent to the number of bytes requested when the block was allocated (or reallocated, in the case of realloc). If memblock is NULL, the pointer is ignored and free immediately returns. Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.  After a memory block has been freed, _heapmin minimizes the amount of free memory on the heap by coalescing the unused regions and releasing them back to the operating system. Freed memory that is not released to the operating system is restored to the free pool and is available for allocation again.  When the application is linked with a debug version of the C run-time libraries, free resolves to _free_dbg. For more information about how the heap is managed during the debugging process, see Using C Run-Time Library Debugging Support.  Example  /* MALLOC.C: This program allocates memory with  * malloc, then frees the memory with free.  */  #include <stdlib.h>         /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h>  void main( void ) {    char *string;     /* Allocate space for a path name */    string = malloc( _MAX_PATH );    if( string == NULL )       printf( "Insufficient memory available\n" );    else    {       printf( "Memory space allocated for path name\n" );       free( string );       printf( "Memory freed\n" );    } }   Output  Memory space allocated for path name Memory freed   Memory Allocation Routines  See Also   _alloca, calloc, malloc, realloc, _free_dbg, _heapmin


Question: 获取新增进程（延迟4秒拍第二次快照，完了遍历，获取不到，求大神们指点一下代码段的问题）

是循环那里出了问题，不应该两个条件一起判断的。已经解决啦，谢谢老师

也许4秒那个进程早执行完退出了。我猜。


Question: 类型强转后（char *）输出结果的问题

引用 1 楼 user-3 的回复:估计是负数。-1=FFFFFFFF，-2=FFFFFFFE，-6=FFFFFFFA，-37=FFFFFFDB 引用 2 楼 zhao4zhong1 的回复:printf("%02X\n", *( (unsigned char *)&da + i ) ); 引用 3 楼 stephen_w__ 的回复:试下 unsighed char * printf  参数 x/X 的解释,将无符整形转为16进制 converts an unsigned integer into hexadecimal representation hhhh.  For the x conversion letters abcdef are used.  For the X conversion letters ABCDEF are used. Precision specifies the minimum number of digits to appear. The default precision is 1. If both the converted value and the precision are 0 the conversion results in no characters. In the alternative implementation 0x or 0X is prefixed to results if the converted value is nonzero.   参数 a/A 的解释,将浮点数转为16进制 converts floating-point number to the hexadecimal exponent notation.  For the a conversion style [-]0xh.hhhp±d is used.  For the A conversion style [-]0Xh.hhhP±d is used.  The first hexadecimal digit is 0 if the argument is not a normalized floating point value. If the value is 0, the exponent is also 0. Precision specifies the minimum number of digits to appear after the decimal point character. The default precision is sufficient for exact representation of the value. In the alternative implementation decimal point character is written even if no digits follow it. For infinity and not-a-number conversion style see notes.  3位的回答把问题命中了，对这个的概念不是那么深刻。


Question: 关于C# HttpWebRequest  https的问题

有人问我要解决方法了，我再回复下吧，仅供参考哦：  HttpWebRequest调用了系统相关设置，好像是跟IE有关  so，我换成  Libcurl  函数库替代了HttpWebRequest，顺利解决  好人做到底吧，Libcurl资源我是在这里下载的：  http://download.csdn.net/detail/vincent7326/5997773  至于怎么调用库函数，资源里也有，一两句说不清，实在不会还请自行度娘libcurl使用教程

没人回我啊啊啊 啊啊~~~~~ 我自己找到解决办法了


Question: linux设备驱动程序问题求解。

引用 1 楼 user-1 的回复:（1）linux驱动程序中： return -ENOMEM; 表示什么意思（返回的数字是多少）？ 如果返回ENOMEN表示没有memory了。查查你的系统中文件errno.h，一般是12. #define ENOMEM 12      （2）执行make命令报警告：      c:116:5: warning: initialization from incompatible pointer type [enabled by default]      .release = ram_release,      ^      c:116:5: warning: (near initialization for ‘ram_fops.release’) [enabled by default] 表示你定义的函数ram_release和release函数指针要求的不一样。查查参数的类型和顺序以及返回值的类型。 (1)路径: usr/src/linux-headers-3.13.0-32/include/linux/errno.h   文件的内容是 #define ERESTARTSYS	512 #define ERESTARTNOINTR	513 #define ERESTARTNOHAND	514	/* restart if no handler.. */ #define ENOIOCTLCMD	515	/* No ioctl command */ #define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */ #define EPROBE_DEFER	517	/* Driver requests probe retry */ #define EOPENSTALE	518	/* open found a stale dentry */  /* Defined for the NFSv3 protocol */ #define EBADHANDLE	521	/* Illegal NFS file handle */ #define ENOTSYNC	522	/* Update synchronization mismatch */ #define EBADCOOKIE	523	/* Cookie is stale */ #define ENOTSUPP	524	/* Operation is not supported */ #define ETOOSMALL	525	/* Buffer or request is too small */ #define ESERVERFAULT	526	/* An untranslatable error occurred */ #define EBADTYPE	527	/* Type not supported by server */ #define EJUKEBOX	528	/* Request initiated, but will not complete before timeout */ #define EIOCBQUEUED	529	/* iocb queued, will get completion event */文件里没有#define ENOMEM 12   。 （2）与问题相关的源代码：int ramhd_open(struct block_device *bdev, fmode_t mode)  //设备打开用到 {     return 0; } int  ramhd_release(struct gendisk *gd, fmode_t mode)   //设备关闭用到 {        return 0; } static struct block_device_operations ramhd_fops = {   .owner = THIS_MODULE,     .open = ramhd_open,     .release = ramhd_release,     .ioctl = ramhd_ioctl, };操作系统版本：Distributor ID: Ubuntu Description: Ubuntu 14.04.1 LTS Release: 14.04 刚刚接触linux设备驱动编程，网上找的代码来研究，懂得太少了，希望帮忙重点解决下第二个问题。。谢谢。


Question: 头文件中为什么要用了两个括号？

引用 1 楼 user-3 的回复:PROTO_LIST  有这个宏，表示这个代码很古老了。 这种写法是为了兼容 C 的新旧语法，很早的 C 语言的参数不是写在括号里的。 而是写在括号后面的。   这是AIX的stdio.h的片段。 # ifdef _NO_PROTO /* ... */ extern FILE *   fopen(); /* ... */ #else           /* use ANSI C required prototypes */ /* ... */ extern FILE *   fopen(const char *__restrict__, const char *__restrict__); /* ... */ #endif /* _NO_PROTO */   PROTO_LIST 就是为了达到类似上面个的效果   /* PROTO_LIST is defined depending on how PROTOTYPES is defined above. If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it   returns an empty list.  */ #if PROTOTYPES #define PROTO_LIST(list) list #else #define PROTO_LIST(list) () #endif

不看过相关代码， 猜测一下， 是不是因为前面那个大写的 是一个宏，参数加括号可以避免一些错误


Question: 浪花的帖子

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