Question: c语言判断素数问题

#include<stdio.h> main() { 	int a,i; 	scanf("%d",&a); 	for(i=2;i<a;i++) 	{ 		if(a%i==0) 		printf("no\n"); 		break; 	} 	if(i==a) 	printf("yes\n"); } 应该这样吧，你那样的话循环一次然后break跳出循环，没有办法继续判断，

对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

引用 11楼lmj_like_cpuls 的回复:break 的作用是跳出整个循环，而不是单步跳出； 比如你输入了一个4 ，i = 2 时符合if条件输出no然后执行break，跳出来之后就直接结束函数了，所以你的的输出语句只执行了一次，建议使用调试查看每个变量运行时的值得变化，这样能更直观的发现问题怎么调试呢 ， 不太会

引用 8楼oiq12 的回复:break跳出循环了。所以只有一次。蠢了

引用 7楼qq_34969907 的回复:因为你写了，break，在for循环里面，无论执行if后面的语句块，还是else，你后面都跟了break。蠢了

break跳出循环了。所以只有一次。

引用 2楼赵4老师 的回复:Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbersthx，but would you like to point out my mistakes？

引用 3楼LubinLew 的回复: #include <stdio.h>  int main(void) { 	int a, i; 	scanf("%d", &a); 	 	for (i=2; i< a; i++) { 	 	if (a%i == 0) { 	 		printf("no\n"); 	 		return 0; 	 	}  	}  	printf("yes\n");  	return 1;  } 所以我发的代码对吗

引用 1楼user-7 的回复: bool bFlag = true; for(i=2;i<=a/2;i++)  {       if(a%i==0)       {            bFlag = false;             break;        }  } if(bFlag)       printf("yes\n"); else       printf("no\n"); 所以我发的代码是错误的吗


Question: 这是系统问题还是程序问题么？

因为这是系统的缓冲机制，只有缓冲区满了或者接受到回车字符了，getchar()函数才能返回。 getchar()是从缓冲区中一个一个字符读取  楼上说的getch（）是windows下独有函数，它不使用缓冲机制，所以只要有字符输入函数就可以返回。

缓冲区的原因，你的程序运行过程大概是这样的  程序开始运行，然后遇到第一个ch = getchar();程序就暂停了，也就是不执行了，等着你输入  你从键盘敲如各种字符，比如“123空空空”这个时候程序还处于暂停状态，也就是你输入的这些东西还没有读入到程序中，所以你可以按backspace把你输入的字符删除，再从新输入  只有当你按下回车后，你输入的字符才会真正输入到程序中，程序继续执行，这样你前面输入的就删除不了了，也就是你在控制台无法删除上面一行的内容，因为他们已经被程序使用了，你删除了也没有用了  从你开始输入到按下回车之间输入的这些内容都存储在输入缓冲区中，所以无论你输入什么程序也不会理睬，只有你输入回车后程序才会继续执行，判断里面有没有特殊的符号（比如‘#’）之类的

这种输入模式是按行输入的, 可以用退格删除左侧的字符, 另一种是按字符输入, 好像是 getch(), 楼主试试吧.


Question: 【求】]高手来看看我哪出错了 ，UG二次开发的代码

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

main函数前面丢了一个右大括号


Question: error C2143   fatal error C1004

引用 1 楼 LubinLew的回复:case 2   后面的break后面用了冒号，应该是分号

引用 2 楼 paschen的回复:case 2: b();break: 改成 case 2: b();break;  你之前的不是分号 谢谢你了，对自己也是无语了

case 2   后面的break后面用了冒号，应该是分号

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


Question: C语言错误，求大神解决

好像并没有啥问题？

引用 3 楼 qq423399099 的回复:楼主是不是少贴了什么 array.c里第六行的ARR是什么？  谢谢，头文件帖错了 array.h  #pragma once #include <stdio.h> #include <stdlib.h> #include <malloc.h> //typedef struct ArrType //{ //	void(*init_arr)(PARR arr, int length); //} arrType; typedef struct Arr { 	int *pBase;//存储的是数组第一个元素的地址 	int len;//数组所能容纳的最大元素的个数 	int cnt;//当前数组有效元素的个数 	//struct ArrType *arrType; } *PARR, ARR;  extern void init_arr(PARR, int); extern bool append_arr(PARR, int); extern bool insert_arr(PARR, int, int); extern bool delete_arr(PARR, int, int*); extern int get(PARR, int); extern bool is_empty(PARR); extern bool is_full(PARR); extern void sort_arr(PARR); extern void show_arr(PARR); extern void inversion_arr(PARR);

楼主是不是少贴了什么 array.c里第六行的ARR是什么？

引用 1 楼 DishBirder 的回复:错误： error C2061: 语法错误: 标识符“delete_arr”	array.h error C2061: 语法错误: 标识符“delete_arr”	array.c  error C2059: 语法错误:“类型”	array.h error C2059: 语法错误:“类型”	array.c  全是这种类型的错误，上面代码组织的有什么问题吧？  这个板块没有人关注吗

引用 6 楼 qq423399099 的回复:好像并没有啥问题？   我给test.c改成cc后缀就行了，走c++的编译器就没有问题


Question: C#运行时显示无法获取“AxDrawingControl”控件的窗口句柄

在64位Windows下： 64位exe和dll在目录c:\windows\system32目录下； 32位exe和dll在目录c:\windows\syswow64目录下； 所以要注意：     在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。     且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll


Question: 怎么解决控制台，刷新闪烁问题

引用 5 楼 lishang6257 的回复:受教了，同楼上，想知道原理 调用 winapi，把光标位置设定到开始位置 0,0.  清除控制台的缓冲区，你看哪些注释的内容

引用 1 楼 paschen 的回复: bool cls() //编程方式实现清除屏幕 { 	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 	COORD coordScreen = {0, 0};    /* here's where we'll home the cursor */  	DWORD cCharsWritten; 	CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */  	DWORD dwConSize;                 /* number of character cells in the current buffer */   	/* get the number of character cells in the current buffer */  	if(!GetConsoleScreenBufferInfo( hConsole, &csbi )) 		return false; 	dwConSize = csbi.dwSize.X * csbi.dwSize.Y;  	/* fill the entire screen with blanks */  	if(!FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten )) 		return false;  	/* get the current text attribute */  	if(!GetConsoleScreenBufferInfo( hConsole, &csbi )) 		return false;  	/* now set the buffer's attributes accordingly */  	if(!FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )) 		return false;  	/* put the cursor at (0, 0) */  	if(!SetConsoleCursorPosition( hConsole, coordScreen )) 		return false; }  这个是什么原理呀

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


Question: socket新手问题!

我改成了1111还是返回-1 1024 1025好像connect不上。

建议先参考MSDN98中自带的socket例子代码。 MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C

servaddr.sin_port = htons(13); 改个大于1024的端口试试

msdn里的代码 跟linux网络编程里用的函数不是很相同，而且还比那书上的要难些。


Question: 请问C语言动态分配的内存空间如果没有释放，等到程序结束时，这段空间会怎么样?

引用 2 楼 Rewen 的回复:程序结束后对操作系统没有影响。 但是程序中如果一直运行的话，有可能会导致内存越来越多。   明白了，谢谢!

引用 1 楼 x20121223 的回复:进程结束时，所有空间，资源都会被操作系统回收。内存泄漏只是针对运行着的进程而言的，结束后所有分配的资源都被回收了。如果想深一步的了解相关内容，找本操作系统相关的书去看看吧。   明白了，谢谢


Question: C Primer Plus program list 8.8 main函数中的函数原型

可以直接删除了，建议函数声明写在main函数之外，这样便于查看main里的代码逻辑；

这是习惯吧，有些人习惯在函数内部声明 外部函数 不过这样做很啰嗦，每个函数中，每用到一个函数声明一次， 不如直截了当，在 所有函数前面声明一次。

确实没必要再出现

我习惯将函数实现直接写在调用它之前。不写函数原型。

多余了呗，删了试试


Question: 求大神帮我看一下这个词法分析器

状态转换图画的对吗？


Question: C语言通过socket传输文件

用socket就忘掉进制、中英文，所有的都是二进制流,，char *类型的

中文、英文，都以二进制传，有什么区别

引用 6 楼 renwotao2009 的回复:[quote=引用 4 楼 wsx199397 的回复:] [quote=引用 3 楼 renwotao2009 的回复:] 一楼的二进制方式应该没有问题 可以了。。C语言这种方式可以传送任何文件吗？比如word，图片视频文件等[/quote]可以[/quote] 那么像word这种直接打开文件读，然后创建个word文件再写就行了嘛，不用在程序逻辑中处理读的是word，txt还是其他类型的文件？

引用 4 楼 wsx199397 的回复:[quote=引用 3 楼 renwotao2009 的回复:] 一楼的二进制方式应该没有问题 可以了。。C语言这种方式可以传送任何文件吗？比如word，图片视频文件等[/quote]可以

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

引用 3 楼 renwotao2009 的回复:一楼的二进制方式应该没有问题 可以了。。C语言这种方式可以传送任何文件吗？比如word，图片视频文件等

一楼的二进制方式应该没有问题

ANSI应该也可以的，你在传输过程中发生了什么错误？？不过使用的是iso8859-1扩展了原ANSI

linux 下加不加b都行，这也得看发行版本，但是大部分linux都是这样的。 Windows下(VS)下必须加b，不加b只能操作ASCII。  无论什么(实体)文件都是由二进制数据构成，读写二进制可以传输各种类型的文件。 不需要判断什么文件类型的逻辑

引用 1 楼 lgbxyz 的回复:fopen("file", "rb");  fwrite("file", "wb"); 谢谢。还有个问题：要传输像word这种文件的话直接打开文件读，然后创建个word文件再写就行了嘛，不用在程序逻辑中处理读的是.doc .jpg. txt还是其他类型的文件？


Question: 链栈，不报错，运行就崩溃

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

初步改了一下，你看看吧，不懂再问  #include<stdio.h> #include<stdlib.h> struct StackNode { 	int data; 	struct StackNode *next; };  typedef struct StackNode *LinkStack; int IsEmpty(LinkStack top) { 	return top?1:0; } LinkStack Push(LinkStack top,int x) { 	LinkStack p; 	p=(LinkStack)malloc(sizeof(StackNode)); 	if(p) 	{ 		p->data=x; 		p->next=top->next; 		top->next=p; 	} 	else 	{ 		printf("No Room!\n"); 		exit(0); 	} } void Pop(LinkStack top,int elem) { 	LinkStack temp; 	if(IsEmpty(top)) 	{ 		printf("Null!\n"); 	} 	else 	{ 		temp=top; 		elem=top->data; 		top=top->next; 		free(temp); 	} } void Display(LinkStack top) { 	for(top=top->next;top!=NULL;top=top->next) 	{ 		printf("%d->",top->data); 	} 	printf("\b\b"); 	printf("\n"); } LinkStack InitStack(LinkStack head) { 	head->next=NULL; 	return head; } void DestoryStack(LinkStack top) { 	LinkStack p; 	while(!top) 	{ 		p=top; 		top=top->next; 		free(p); 	} } int main() { 	int i=2; 	LinkStack stack; 	struct StackNode sn; 	stack = &sn; 	InitStack(stack); 	for(i=1;i<10;i++) 	{ 		Push(stack,i*i); 	} 	Display(stack); }

#include<stdio.h> #include<stdlib.h>  typedef struct StackNode { 	int data; 	struct StackNode *next; }StackNode, *LinkStack;  int IsEmpty(LinkStack top) { 	return top?1:0; }  void Push(LinkStack *top, int x) { 	LinkStack p; 	p = (LinkStack)malloc(sizeof(StackNode)); 	if (p) { 		p->data = x; 		p->next = *top; 		*top = p; 	} else { 		printf("No Room!\n"); 		exit(0); 	} }  int Pop(LinkStack* top) { 	LinkStack temp = *top; 	int elem; 	 	if (IsEmpty(temp)) { 		printf("Null!\n"); 		return 0; 	} else { 		elem = temp->data; 		*top = temp->next; 		free(temp); 		return elem; 	} }  void Display(LinkStack top) { 	LinkStack temp = top; 	 	while (temp != NULL) { 		printf("%d ", temp->data); 		temp = temp->next; 	} 	printf("\n"); }   void DestoryStack(LinkStack top) { 	LinkStack temp = top; 	 	while (top != NULL) { 		temp = top; 		top = top->next; 		free(temp); 	} }  int main(void) { 	int i = 2; 	LinkStack stack = NULL; 	 	for (i = 1; i < 10; i++) { 		Push(&stack, i*i); 	} 	 	Display(stack); }


Question: 为什么一执行此函数时会出现debug error ?谁能帮我看看编程有啥错误？初来乍到多多包含，谢谢各位了

问题找到了 ，是因为第二个printf里面的数据类型和前面定义的不一致，n是全局变量，已经在前面定义过了。谢谢大家了

有可能是第二个printf中的结构体数组定义，使用的问题。 还有楼主这段代码中for循环中的n没有定义。

就像楼上三位说的，楼主单步调试，单步跟一下，就可以发现出现debug error在哪一行。 单单贴出来这一个函数的代码，不好看出来。有可能是第二个printf中的

void lookxinxi()  { system("CLS"); int i; printf("\t学号\t姓名\t性别\t出生年月\t专业\t课程名称\t学分\t成绩\n"); for(i=0;i<n;i++)    /*输出所有的学生信息*/    //哪来的n { printf("%10s\t%s\t%2s\t%s\t%s\t%s\t%d\t\t%6.1f\n",stu[i].num,stu[i].name, stu[i].sex,stu[i].age,stu[i].zhuanye,stu[i].course,stu[i].xuefen,stu[i].score); } printf("\n\n\n\t\t\t按任意键返回菜单"); getch(); }   把其他代码一并贴出来看看

出错时点中断，通过调用堆栈、变量窗口等观察分析原因


Question: 关于函数类型声明问题

1)定义也是声明 2)先声明，后使用  如果一个函数，全局变量，类型 定义在函数前面，那么可以直接使用，因为定义也是声明。 否则，必须先声明（前置声明），后使用。  类型定义---struct.union,class( 仅仅 C++) 等----， 因为涉及到该类型占用内存大小的原因，和变量声明，函数声明，有所不同  用类型 定义指针，引用，不需要 先定义类型，只需要先声明（前置声明）即可 用类型定义变量，（包括数组）需要类型先定义，然后才可以定义变量。  struct.union,class 等，也可以定义类型同时定义变量

因为你需要在主函数使用前对你自定义的函数进行定义，如果你希望在后边进行定义，那至少要有对其进行声明的操作。 如：  #include <stdio.h> //在主函数前对求和函数进行定义 int DoAdd(int x, int y) {     return x+y; }  //在主函数前对求二者较大数的函数进行声明，其实现/定义部分在后面进行 int MaxFunc(int x, int y);  int main() {     int x = 1;     int y = 2;     printf("The sum of x and y is %d.\n",DoAdd(x,y));     printf("The max between x and y is %d.\n",MaxFunc(x,y));     return 0; }  //对求二者中较大数函数的定义/实现 int MaxFunc(int x, int y) {     return x>y ? x : y; }

如果你要在A函数中调用B函数，那么你要把B函数放于A函数前，或者B函数放在后但在A函数前面加上声明

C/C++ 是按顺序执行编译 而且如果你使用的函数 在是使用的时候 没有函数声明就会报错，编译完，然后链接 如果没有定义就报link错误

函数在使用前要声明，第二此没有声明

如果是在 main 函数之后进行函数定义的，那么调用时就一定要在 main 函数之前进行声明。 如果在自定义函数在 main 函数之前定义的，就可以不需要进行声明，main 函数能够自动找到该函数。 即使没有前向声明有的编译器也支持，能通过编译。 所以最好都加上前向声明。


Question: 合并浮点数

引用 5 楼 tzg_dzq 的回复:unsigned short ush = 0X5F5F;  	unsigned char *puch = (unsigned char *)(&ush); 	unsigned char uch1 = puch[0]; 	unsigned char uch2 = puch[1];  	char chval[12] = {0}; 	sprintf_s(chval, sizeof(chval), "%d.%d", uch1, uch2);  	double fval = atof(chval); 最后结果： fval=95.950000000000003  也可以这样： int nval1 = puch[0]; 	int nval2 = puch[1]; 	double fval1 = nval1 + ((double)nval2 / 100.0); 	double fval2 = nval1 + ((double)nval2*1.0 / 100.0); 多谢多谢！！！！！！！可惜没有分给你了

引用 1 楼 user-2 的回复:1）通过对应的函数处理 库函数中有拆分浮点数的函数，合并的应该也有 2）自行处理 整数部分，简单直接化为浮点数 小数部分。要除以10的n次幂才可以 然后二者相加  多谢！！问题已经解决了，没有把十六进制转换为浮点数，所以两部分相加的时候没有合并成功。

引用 3 楼 pingdangjun 的回复:[quote=引用 1 楼 user-2 的回复:] 1）通过对应的函数处理 库函数中有拆分浮点数的函数，合并的应该也有 2）自行处理 整数部分，简单直接化为浮点数 小数部分。要除以10的n次幂才可以 然后二者相加  多谢！！问题已经解决了，没有把十六进制转换为浮点数，所以两部分相加的时候没有合并成功。[/quote] 恭喜，没看清楚是十六进制，抱歉

frexp 拆分 浮点数的函数 ldexp 可以处理，二进制指数和浮点数的积的问题 由于十进制 数和浮点数不是一一对应的 无论怎么转换，都有可能出现误差


Question: 这个用C语言怎么做

仅供参考  #include <stdio.h> #include <stdlib.h> #include <math.h>  #define MAX_SIZE (10)  void sort_desc(int *array, int print); void primer_number(int *array); void narcissistic(int *array); void gg(int *array);  int main(void) { 	int array[MAX_SIZE]; 	int i, options; 	 	// 1. get 10 number from stdin 	printf("Please input 10 intger:\n"); 	for (i = 0; i < MAX_SIZE; i++) { 		scanf("%d", &array[i]); 	} 	 	// 2. select 1~4 	while (1) { 		//screen prompt 		printf("----------------------------------\n"); 		printf("1:sort intgers in descending order\n"); 		printf("2:output prime number\n"); 		printf("3:output narcissistic number\n");		 		printf("4:output Pythagorean number\n");		 		printf("5:Quit\n");		 		printf("----------------------------------\n"); 		//get user selection 		printf("Please select a number:");  	while (scanf("%d", &options) != 1 || (options > 6) || (options < 0)) { 			printf("=== Input Error!\n"); 			printf("Please select again:");	 		} 		 		switch (options) { 		case 1: 			sort_desc(array, 1); 			break; 			 		case 2: 			primer_number(array); 			break; 			 		case 3: 			narcissistic(array); 			break; 			 		case 4: 			gg(array); 			break; 			 		case 5: 			exit(EXIT_SUCCESS); 			break; 			 		default: 			break; 		} 	} }  void sort_desc(int *array, int print) { 	int i, j, tmp; 	//sort 	for (i = 0; i < MAX_SIZE-1; i++) { 		 		for (j = i+1; j < MAX_SIZE; j++) { 			if (array[i] < array[j]) { 				tmp = array[i]; 				array[i] = array[j]; 				array[j] = tmp; 			} 		} 	} 	if (!print) { 		return; 	} 	//output 	for (i = 0; i < MAX_SIZE; i++) { 		printf("%d ", array[i]); 	} 	printf("\n"); }  void primer_number(int *array) { 	int i, j, k; 	 	for (i = 0; i < MAX_SIZE; i++) { 		k = sqrt(array[i]); 		for (j = 2; j < k; j++) { 			if (array[i] % j == 0) { 				break; 			} 		} 		if (array[i] % j == 0) { 			continue; 		} else { 			printf("%d ", array[i]); 		} 	} 	printf("\n"); }  void narcissistic(int *array) { 	int i; 	int tmp, shg, sum; 	 	for (i = 0; i < MAX_SIZE; i++) { 		sum = 0; 		tmp = array[i]; 		while (tmp != 0) { 			shg = tmp % 10; 			tmp = tmp / 10; 			sum += shg * shg * shg;  		} 		if (sum == array[i]) { 			printf("%d ", array[i]); 		} 	} 	printf("\n"); }  void gg(int *array) { 	int i, j, k; 	sort_desc(array, 0); 	 	for (i = 0; i < MAX_SIZE-2; i++) { 		for (j = i+1; j < MAX_SIZE-1; j++) { 			for (k = j+1; k < MAX_SIZE; k++) { 				if (array[i] * array[i] == array[j] * array[j] + array[k] * array[k]) { 					printf ("%d %d %d\n" , array[k], array[j], array[i]); 				} 			} 		} 	} }

自己做，有问题再来问吧


Question: 基于c语言下对verilog的描述

你问题描述的不够明确


Question: 柔性数组输出问题

炫技或装B有时也是刚需。

str->array[0]=1; str->array[1]=1; for(i=1;i<str->len;i++)//这句改为  for(i=2;i<str->len;i++) ///就可以了 因为 第 0，1元素，都已经初始化了， ///所以从第2个元素开始，初始化其余的数组元素，就可以了  printf("%d\n",str->array[-1]); 这个也没有必要啊， 既然成员 len;有自己的名字，不需要取 ,str->array[-1]);

不知道楼主的问题在哪？按照楼主的方式，a[1] = a[0] + a[-1];由于结构体中均为int型数据，导致a[-1]取到了len的值，也就是a[1] = 1 + 20 = 21，如果楼主希望是a[2] = a[1] + a[0];请在循环中将i初始化为2.下面是按照楼主的程序打印出的结果，可供楼主参考。

第一次循环，i = 1, str->array[i-2];不就是越界了。 还有，我记得这个特性(标记为空)属于HACK, C99要求标记长度为0，或者我记岔了


Question: 大神给看看这个哪里错了。初学c

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

你这个函数，写的有问题！ 而且，最后输出的应该是用“%f”，而不是“%d”

30 #include <stdio.h>  29            28 int sum(int x)  27 {          26     if(x==1)  25     |   return 1;  24     else if(x==2)  23     |   return 2;  22     else   21     |   return sum(x-1) + sum(x-2);   20 }          19            18 int main(void)  17 {          16     int i;  15     int numerator, demonminator;      14     double total = 0.0;  13            12     //numerator list  11     for (i = 0; i < 20; i++) {  10     |   printf("%d\t", sum(i+1));      9     }       8     putchar(10);   7     //denominator list   6     for (i = 0; i < 20; i++) {    //分子序列   5     |   printf("%d\t", sum(i+2));      4     }       3     putchar(10);   2             1     for (i = 0; i < 20; i++) {    //分母序列 31      |   demonminator = sum(i+1);                                                                                1     |   numerator = sum(i+2);   2             3     |   total +=  numerator*1.0 / demonminator;   4     }       5     printf("total = %lf\n", total);    6     /*      7     int  i=1, j=2, n;   8     double a=0, b=0, c, d=0;   9     for(n=1; n<=20; n++)  10     {      11     |   a = a+sum(n);  12     |   b = b+sum(n+1);  13     |   c = b/a;  14     |   d += c;  15     |   i++;  16     |   j++;  17     }      18     printf("%d",d);  19 */         20     return 0;  21 }   主要是找到分子，分母与相加个数的关系；递归算法没问题，我直接使用了； 这个问题主要是在找到规律，找到其中的算法，这个是重点；所以说，编程都是数学问题；

# include <stdio.h>  int sum(int x) {   if(x==1) return 1; else if(x==2) return 2;      else  return sum(x-1)+sum(x-2); } int main() { int  i=1, j=2, n; double a=0, b=0, c, d=0; for(n=1;n<=20;n++) {a=sum(n); b=sum(n+1); c=b/a; d+=c; } printf("%.4f",d); return 0; } 根据你的方法改的

你的程序中需要修改的：  int main() { int  i=1, j=2, n; double a=0, b=0, c, d=0; for(n=1;n<=20;n++) {a=a+sum(i);i++;   <==== a = sum(i); i++; b=b+sum(j);j++;    <==== b = sum(j); j++; c=b/a; d+=c;  } printf("%d",d);    <==== printf("%f",d); return 0; }

#include <stdio.h> #include <stdlib.h>  int main() {     double a = 1, b = 2, sum = 0, c;     int i;      for ( i=0; i<20; i++ )     {         sum += b / a;         c = b;         b += a;         a = c;     }     printf("%f ", sum);     return 0; }   哪有这么麻烦。

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

不知道你看过递归没有？看一下斐波那契数列会有帮助

感觉看你代码逻辑好复杂，我自己写了个。 double GetSum(float n1, float n2, int nCalTimes) { 	double sum = 0; 	if (nCalTimes-- <= 0) 	{ 		return sum; 	} 	sum += (n2 / n1); 	return sum += GetSum(n2, n1 + n2, nCalTimes); }  int main() { 	std::cout << GetSum(1, 2, 20) << std::endl; // 32.6603 	getchar(); 	return 0; }


Question: C语言的文件系统

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

fprintf(文件指针，格式字符创，输出列表） 例如 fprintf(f,"%f,%f,%f\n,%f,%f",a,b,c,d,e);

都不能，只能写入0或1，到底是浮点数还是字符，看你怎么解析

写入时要计算float 的字节数，sizeof(float)

文件分为文本文件与二进制文件，后者满足你的要求

写入字符或者字符串类型，可以用记事本打开查看。 二进制写入整数、浮点数，可以用16进制编辑器查看。

二进制读写 。

当然可以  可以指定写入的字节数


Question: 用getch()时如何清除输入缓冲

引用 6 楼 renwotao2009 的回复:[quote=引用 3 楼 zl_123_ads 的回复:] [quote=引用 1 楼 renwotao2009 的回复:] 调用flush强刷 试了，不行[/quote]stdio中的clear();方法[/quote] clear()是清除错误标记的吧。。

引用 7 楼 qq423399099 的回复:在Linux下清空stdin用两种方法： 1.通过读取剩余的字符并丢弃掉； char ch; while((ch=getchar())!='/n'&&ch!=EOF); 2.使用函数setbuf(stdin,NULL); 这两个方法都不行，

引用 8 楼 zhao4zhong1 的回复:int k; while (1) {  if (kbhit()) {   k=getch();   if (0==k || 0xE0==k) k=k<<8|getch();  } else break; }  可以了。谢谢。

引用 3 楼 zl_123_ads 的回复:[quote=引用 1 楼 renwotao2009 的回复:] 调用flush强刷 试了，不行[/quote]stdio中的clear();方法

#include <stdio.h>         int fflush(FILE *stream);

引用 1 楼 renwotao2009 的回复:调用flush强刷 试了，不行

引用 2 楼 lgbxyz 的回复:VS 可以用flush(stdin)清除不想要的回车等字符; linux 下不可以。 试了不行

调用flush强刷

查MSDN是Windows程序员必须掌握的技能之一。  _getch, _getche Get a character from the console without echo (_getch) or with echo (_getche).  int _getch( void );  int _getche( void );  Routine Required Header Compatibility  _getch <conio.h> Win 95, Win NT  _getche <conio.h> 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  Both _getch and _getche return the character read. There is no error return.  Remarks  The _getch function reads a single character from the console without echoing. _getche reads a single character from the console and echoes the character read. Neither function can be used to read CTRL+C. When reading a function key or an arrow key, _getch and _getche must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.  Example   /* GETCH.C: This program reads characters from  * the keyboard until it receives a 'Y' or 'y'.  */  #include <conio.h> #include <ctype.h>  void main( void ) {    int ch;     _cputs( "Type 'Y' when finished typing keys: " );    do    {       ch = _getch();       ch = toupper( ch );    } while( ch != 'Y' );     _putch( ch );    _putch( '\r' );    /* Carriage return */    _putch( '\n' );    /* Line feed       */ }   Output  Type 'Y' when finished typing keys: Y   Console and Port I/O Routines  See Also   _cgets, getc, _ungetch

引用 8 楼 zhao4zhong1 的回复:int k; while (1) {  if (kbhit()) {   k=getch();   if (0==k || 0xE0==k) k=k<<8|getch();  } else break; } 0xE0表示什么，请教赵老师？？？

引用 11 楼 zl_123_ads 的回复:[quote=引用 6 楼 renwotao2009 的回复:] [quote=引用 3 楼 zl_123_ads 的回复:] [quote=引用 1 楼 renwotao2009 的回复:] 调用flush强刷 试了，不行[/quote]stdio中的clear();方法[/quote] clear()是清除错误标记的吧。。[/quote]清除标记，还是C++的


Question: 关于socket通信的问题

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

引用 5 楼 renwotao2009 的回复:看看服务器端分配的内存够不够 请问是看一个发包的内存还是其它什么？ Gate *clt=(Gate *)calloc(1, sizeof(Gate)); 这条语句说明分配内存的大小，是正确的

看看服务器端分配的内存够不够

引用 2 楼 x20121223 的回复:如果你想认真搞网络编程的话买本unix网络编程看看吧。你这代码问题太多了，看了那本书基本上你就不会来问这种问题了。 好，我看看

引用 1 楼 lgbxyz 的回复:server死循环里没有accept ? 有，我没把socket通信建立连接的部分程序贴出来，那部分程序没有问题

server死循环里没有accept ?


Question: 大神们，求教一个问题

引用 5 楼 moyac 的回复:[quote=引用 4 楼 zhouxiaofeng1021 的回复:] F9 设置断点 F5 运行 调试 查看堆栈 查看 变量值 你就学会了 自己找问题了  程序猿必备 调试技能现在还不是很会这个呀，大神，求指教一下[/quote]  VS2008的话，就是你点击某一行，按F9 就可以设置断点 F5进入调试 最好DEBUG模式

我已经自己解答出来啦，原来是自己在input = (input - x) / 10;，这一步上面，没有处理好，还有就是忽略了，这个进制之间的转换

#include <stdio.h>  int main() { 	int input; 	int x, n; 	int num; 	int sum; 	int step; 	 	n = 0; 	sum = 0; 	step = 1; 	scanf("%d", &input); 	while ( input > 0 ) { 		x = input % 10;//整数的最后一位 		n++;//第n位 		if ( x%2==0 && n%2==0) { 			num = 1; 		} else if ( x%2!=0 && n%2!=0) { 			num = 1; 		} else { 			num = 0; 		} 		sum = sum + num * step; 		step *= 2; 		input = (input - x) / 10; 	} 	 	printf("%d", sum); 	 	return 0; }

引用 4 楼 zhouxiaofeng1021 的回复:F9 设置断点 F5 运行 调试 查看堆栈 查看 变量值 你就学会了 自己找问题了  程序猿必备 调试技能现在还不是很会这个呀，大神，求指教一下

嗯，求大神，解答一下，到底是为谁呢？比较困惑这一段代码呢

引用 1 楼 user-2 的回复:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 int main() {     int input;     int x, n;     int num;     int sum;           n = 0;     sum = 0;     scanf("%d", &input);     while ( input > 0 ) {         x = input % 10;//整数的最后一位         n++;//第n位         if ( x%2==0 && n%2==0) {             num = 1;         } else if ( x%2!=0 && x%2!=0) {             num = 1;         } else {             num = 0;         }         sum = sum + num * 2;         input = input - x;     }           printf("%d", sum);           return 0; }嗯，你的意思是？不是很理解呢？大神


Question: 请教两个C语言问题，多谢大家！

+i应该改成++吧

引用 6楼赵4老师 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。   Collapse AllExpand All      Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript   Visual Basic C# Visual C++ J# JScript Run-Time Library Reference  printf Type Field Characters  See Also  Send Feedback     The type character is the only required format field; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C, n, p, and S, and the behavior of c and s with printf functions, are Microsoft extensions and are not ANSI compatible.   Character  Type  Output format   c  int or wint_t  When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.   C  int or wint_t  When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character.   d  int  Signed decimal integer.   i  int  Signed decimal integer.   o  int  Unsigned octal integer.   u  int  Unsigned decimal integer.   x  int  Unsigned hexadecimal integer, using "abcdef."   X  int  Unsigned hexadecimal integer, using "ABCDEF."   e  double  Signed value having the form [ – ]d.dddd e [sign]dd[d] where d is a single decimal digit, dddd is one or more decimal digits, dd[d] is two or three decimal digits depending on the output format and size of the exponent, and sign is + or –.   E  double  Identical to the e format except that E rather than e introduces the exponent.   f  double  Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.   g  double  Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.   G  double  Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).   a  double  Signed hexadecimal double precision floating point value having the form [−]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.   A  double  Signed hexadecimal double precision floating point value having the form [−]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.   n  Pointer to integer   Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.   p  Pointer to void  Prints the argument as an address in hexadecimal digits.   s  String   When used with printf functions, specifies a single-byte–character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.   S  String  When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.    Note   If the argument corresponding to %s or %S is a null pointer, "(null)" will be printed.  Note   In all exponential formats, the default number of digits of exponent to display is three. Using the _set_output_format function, the number of digits displayed may be set to two, expanding to three if demanded by the size of exponent.  Security Note   The %n format is inherently insecure and is disabled by default; if %n is encountered in a format string, the invalid parameter handler is invoked as described in Parameter Validation. To enable %n support, see _set_printf_count_output.  See Also Concepts printf, _printf_l, wprintf, _wprintf_l Send feedback on this topic to Microsoft.可是我的第二个问题里面的代码中的printf里面没有%与后面的变量名对应，却也能够正确编译，这是什么原理？

引用 2楼小灸舞 的回复:输出地址用%p谢谢

引用 1楼user-4 的回复:第一问题是你就是输出字符串啊 printf("board: %d\n",board+i);  这就是输出子数组的地址  没有%控制符也可以在printf中加  ， 然后加变量名称，这是怎么回事？ 对于这个问题： 其实就是不定参数实现 你可以参考下： http://blog.sina.com.cn/s/blog_88534dff01010pb5.html多谢

谢谢各位大神

输出地址用%p


Question: 请问C语言可以使用另一个程序中的变量吗?比如我在程序1中使用指针分配了内存,现在我想打开程序2，输入程序1中这个指针的地址,然后在程序2中操作程序1中这个指针

ReadProcessMemory The ReadProcessMemory function reads memory in a specified process. The entire area to be read must be accessible, or the operation fails.   BOOL ReadProcessMemory(   HANDLE hProcess,  // handle to the process whose memory is read   LPCVOID lpBaseAddress,                     // address to start reading   LPVOID lpBuffer,  // address of buffer to place read data   DWORD nSize,      // number of bytes to read   LPDWORD lpNumberOfBytesRead                      // address of number of bytes read );

引用 10 楼 u014602230 的回复:进程通信问题  操作系统相关书籍有介绍 引用 8 楼 yyxgs 的回复:[quote=引用 3 楼 lm_whales 的回复:] 这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了  能完成这些的也只有机器指令之上，高级语言之下的汇编了吧?   [/quote] 不是啊，只是用一些API而已， 通过变量名操作，只有共享内存也许还可以 其他的，都是通过API。 甚至驱动 对特定内存进行操作 一个程序的内存，另一个程序是能够操作的， 只是不能很直接操作而已， 因为每个程序的虚拟空间是自成一体的 操作系统对进程的空间作了隔离处理 因此需要特殊手段，来操作另一个程序的内存空间  一般来说1） 需要暂停（挂起） 被操作的程序中，影响到某个内存的线程 这样，就不会因为程序运行。导致数据不停的变来变去 2）需要从外部定位，读写这个程序的内存， 操作系统提供了API来解决这个问题

引用 10 楼 u014602230 的回复:进程通信问题  操作系统相关书籍有介绍  多谢指点!

引用 13 楼 u010165006 的回复:[quote=引用 6 楼 yyxgs 的回复:] [quote=引用 2 楼 u010165006 的回复:] 楼主需要了解一下进程、虚拟地址空间的概念。   请问从哪里了解?[/quote]  百度一下就可以了解了，如果想系统学习，需要看《操作系统》书，操作系统是计算机专业的必修课。[/quote]   多谢指点!

引用 11 楼 lm_whales 的回复:[quote=引用 10 楼 u014602230 的回复:] 进程通信问题  操作系统相关书籍有介绍 引用 8 楼 yyxgs 的回复:[quote=引用 3 楼 lm_whales 的回复:] 这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了  能完成这些的也只有机器指令之上，高级语言之下的汇编了吧?   [/quote] 不是啊，只是用一些API而已， 通过变量名操作，只有共享内存也许还可以 其他的，都是通过API。 甚至驱动 对特定内存进行操作 一个程序的内存，另一个程序是能够操作的， 只是不能很直接操作而已， 因为每个程序的虚拟空间是自成一体的 操作系统对进程的空间作了隔离处理 因此需要特殊手段，来操作另一个程序的内存空间  一般来说1） 需要暂停（挂起） 被操作的程序中，影响到某个内存的线程 这样，就不会因为程序运行。导致数据不停的变来变去 2）需要从外部定位，读写这个程序的内存， 操作系统提供了API来解决这个问题 [/quote]   多谢指点!

引用 6 楼 yyxgs 的回复:[quote=引用 2 楼 u010165006 的回复:] 楼主需要了解一下进程、虚拟地址空间的概念。   请问从哪里了解?[/quote]  百度一下就可以了解了，如果想系统学习，需要看《操作系统》书，操作系统是计算机专业的必修课。

进程通信问题  操作系统相关书籍有介绍

引用 7 楼 Rewen 的回复:可以看看windows编程之类的书籍。   Windows编程一般是用API吧?

引用 3 楼 lm_whales 的回复:这分几种情况 1）共享内存。不分彼此都可以用 2）古老的DOS 实模式。可以直接用 指针操作 3）Window 及其他现在操作系统      Window 提供了远程内存读写函数，可以操作别的程序的内存 4）另外，几乎所有调试器，都可以读写所加载程序的内存。 也许还有更多 ，例如通过驱动程序，操作别的程序的内存 另外，远程控制系统，可以通过网络连接， 控制另一台计算机进行任何操作，读写内存更不在话下了  能完成这些的也只有机器指令之上，高级语言之下的汇编了吧?

可以看看windows编程之类的书籍。

引用 2 楼 u010165006 的回复:楼主需要了解一下进程、虚拟地址空间的概念。   请问从哪里了解?

引用 4 楼 qq423399099 的回复:打印出来的地址值是逻辑地址，它是相对于你当前进程数据段的地址，不和绝对物理地址相干。只有在Intel实模式下，逻辑地址才和物理地址相等（因为实模式没有分段或分页机制,Cpu不进行自动地址转换）  WriteProessMemory   那我想获取实地址只有用汇编了吗?

楼主需要了解一下进程、虚拟地址空间的概念。

我将程序1中分配的内存指针的地址%p格式输出后，并没有释放内存,getchar();停在了return 0;之前 然后我在程序2中也定义相同类型的指针,scanf("%p",&p);输入后,输出数据，程序停止运行，为什么呢?


Question: 赵老湿，我要去打羽毛球，录好你的视频，有空再看！

一般来说，写个exe ，才能调试DLL 你可以试试能不能在脚本环境，例如PHP环境直接调试 另外，windows 提供一个程序 Rundll32之类的。可以直接命令行调用 Dll中的函数 你也可以试试


Question: 感觉这个问题挺可爱的

这个的话，是因为b有没有初始化有关系。 当你把b放在循环里面，就会每次都被初始化为0； 当你把b放在循环外面的时候，就是一直累加，一直累加。 所以，如果说，你想要把这两个情况变得一样的话： 只需要把第一种情况下，在第一次循环后，对b初始化，就可以了； 这样子两种情况结果就一样了。

就是对b的初始化； 跟声明位置没关系；第一种情况，你只需第一次循环后对b初始化，第一种情况和第二种情况结果就一样了； 你不能把前一个数的求的和与后一个数的求的和放在一起；

这问题确实有点儿可爱啊，哈哈  放进循环里就是每次循环都会初始化为0，放在循环外面就是一直累加

就是你每次第一个循环开始时都会初始化b = 0。 而原来的是一直累加。第一次循环没有输出后面因为b值已经比较离谱了自然也没有输出了。


Question: 求解

你是不是在刷什么题啊，注意人家要求的输入，是要连续输入的，然后在依次输出，不是输入一个输出一个  还有你的minn也没有更新吧，其他地方是不是也有逻辑错误啊，不只是过来那两个例子就可以了  这种题最好建一个哈希表来减小时间复杂度，不要轻易使用O(n^2)的算法，还有提前生成一个质数表，不要每次都从头判断


Question: 请问我想用C语言编写一个对论坛指定关键字的标题自动回帖程序，但是我是初学者，没有什么头绪，请大神指导!

引用 7 楼 zhao4zhong1 的回复:http://www.autohotkey.com  我大脑中负责论坛自动回帖的那个程序对应的进程刚才被一个长腿美女后门给偷偷挂起了。 我刚才将头在厕所门上一秒内连撞三下，启动安全模式，手动将这个后门程序删除，并重启，终于修复了。   老赵黑客帝国看太多了

引用 7 楼 zhao4zhong1 的回复:http://www.autohotkey.com  我大脑中负责论坛自动回帖的那个程序对应的进程刚才被一个长腿美女后门给偷偷挂起了。 我刚才将头在厕所门上一秒内连撞三下，启动安全模式，手动将这个后门程序删除，并重启，终于修复了。    不知所云。。

老赵的论坛自动回帖程序失灵了？居然没有搜索到这个帖子

赵老师说他会，我信了。

引用 4 楼 u010165006 的回复:赵老师说他会，我信了。   你说赵老师会，我信了。

引用 1 楼 qq423399099 的回复: http://blog.csdn.net/xxxxxx91116/article/details/9225301  谢谢

想法比较好，但是实践起来不会容易；这是人工智能呢


Question: 关于资源ID和资源类型不是很理解！求路过大神点拨一句！

版本信息，这个资源比较特殊

https://msdn.microsoft.com/en-us/library/ms648009%28VS.85%29.aspx https://msdn.microsoft.com/en-us/library/aa381058.aspx

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。


Question: 为什么C语言运行需要堆栈，汇编不需要？

汇编中一般不初始化，也就是直接使用系统的堆栈而已，自己定义堆栈还是要初始化的。

不知道，刚开始学c语言

不需要初始化，就是使用现在的值而已。

首先，不需要堆栈，和不需要初始化堆栈是两回事呢。正确的说法是：C语言的函数调用要用到堆栈，而汇编却不需要初始化堆栈。为什么需要呢，首先你要了解堆栈的作用，总的来说，堆栈的作用就是：保存现场/上下文，传递参数。堆栈是必须的，不管是c还是汇编，都是一样的

赵老湿又开始讲操作系统了，这debug让没从dos开始的人来看，起点有点高啊。赵老湿行行好，从汇编的根基开始讲讲。

引用 30 楼 zhao4zhong1 的回复:[quote=引用 28 楼 zhang5476499 的回复:] 今晚有赵老师的课程，到时候你可以提问，csdn的首页有入口地址。赵老师讲解C语言的指针和汇编的地址的相关专题。还有，我汇编学的不深，大学学过一个学期。我清清楚楚记得，汇编也有堆栈的，汇编中，直接可以有指令和栈偏移指令指向栈的位置。 谢谢推荐。  知道Intel CPU上电后各寄存器的初始值是多少吗？ 如果哪台Intel CPU的PC机最早的初始化SS:SP对应的汇编指令不在BIOS中，说出来让俺也长长见识！[/quote] C:\>debug -u ffff:0 l4 FFFF:0000 EA5BE000F0    JMP     F000:E05B -u f000:e05b l3 F000:E05B E9E649        JMP     2A44 -u f000:2a44 F000:2A44 FA            CLI F000:2A45 FC            CLD F000:2A46 8CC8          MOV     AX,CS F000:2A48 8ED0          MOV     SS,AX F000:2A4A E9BC8E        JMP     B909 F000:2A4D E9411A        JMP     4491 F000:2A50 B08F          MOV     AL,8F F000:2A52 E670          OUT     70,AL F000:2A54 EB00          JMP     2A56 F000:2A56 EB00          JMP     2A58 F000:2A58 EB00          JMP     2A5A F000:2A5A EB00          JMP     2A5C F000:2A5C E471          IN      AL,71 F000:2A5E B400          MOV     AH,00 F000:2A60 8BF0          MOV     SI,AX F000:2A62 B08F          MOV     AL,8F -q  C:\>

引用 28 楼 zhang5476499 的回复:今晚有赵老师的课程，到时候你可以提问，csdn的首页有入口地址。赵老师讲解C语言的指针和汇编的地址的相关专题。还有，我汇编学的不深，大学学过一个学期。我清清楚楚记得，汇编也有堆栈的，汇编中，直接可以有指令和栈偏移指令指向栈的位置。 谢谢推荐。  知道Intel CPU上电后各寄存器的初始值是多少吗？ 如果哪台Intel CPU的PC机最早的初始化SS:SP对应的汇编指令不在BIOS中，说出来让俺也长长见识！

汇编写的程序运行时也需要栈，操作系统加载可执行文件后每个线程都有自己的局部栈。理论上完全不用栈也是可以的，只要有数据区用于保存临时数据就可以。

直接操作寄存器、

求解答！

引用 24 楼 u014444402 的回复:[quote=引用 20 楼 hgsdfghdfsd 的回复:] 。。。。。  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？ 一般来讲单片机或者ARM建立项目的时候都会有一个启动文件类似startup_xxxxx.s的汇编文件，就是用来初始化堆栈和全局变量的。这个启动文件开发环境会提供，你不满意你可以自己写。      [/quote] ++  一般C51，keil C 等嵌入式编译环境， 对于手工编写整个系统的方式，都是这么处理的。 你对这个启动代码，感觉不满意可以自行修改  当然，有时候，还提供某些实时操作系统框架

引用 20 楼 hgsdfghdfsd 的回复:[quote=引用 19 楼 lm_whales 的回复:] [quote=引用 18 楼 hgsdfghdfsd 的回复:] [quote=引用 17 楼 lm_whales 的回复:] 不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程[/quote]  虽然架构不一样的，现代CPU都是基于堆栈的，都是有中断的 ARM一样离不开堆栈 只是方式不同 ARM 也需要初始化堆栈 当然，现在开发ARM等嵌入式软件，可以基于实时操作系统  包括实时 linux 类型的，和μOS 等各种实时操作系统， 可用的实时操作系统有很多，名字记不住了，不少于4，5个。 这些操作系统，已经帮助你准备好堆栈了，你可能就不用自己初始化堆栈了  [/quote]  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？[/quote] 一般来讲单片机或者ARM建立项目的时候都会有一个启动文件类似startup_xxxxx.s的汇编文件，就是用来初始化堆栈和全局变量的。这个启动文件开发环境会提供，你不满意你可以自己写。

引用 22 楼 lm_whales 的回复:[quote=引用 20 楼 hgsdfghdfsd 的回复:] [quote=引用 19 楼 lm_whales 的回复:] 。。。。  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？[/quote] 差不多可以这样理解  从纯粹的 C的语法上来说，是没有办法初始化堆栈的。 例如 标准C 语言，就没有提供直接操作硬件的支持。  但是C允许嵌入 汇编。甚至直接嵌入二进制指令 有些编译器，例如Dos下的TC 有寄存器伪变量 都可以一定程度的在C中，直接操纵硬件 勉强用C初始化，也能凑乎。 （甚至C的编译选项中，也可以适当的影响堆栈的设置。)  但显然不如汇编更合适，受到的限制更小 编写代码更容易，也更清晰，甚至可读性也更好。  毕竟，这些关键代码， 其实只是程序中很小的一部分，虽然可能是最重要的一部分。 因此，虽然是汇编语言实现的，但是代码其实很短  其实，纯C 的初始化部分在编译器的库里，这部分很有可能就是汇编写成的 还有一些函数，如 exit,_exit 也可能是汇编写成的。 只是他们多半已经编译好了，随着编译器发布而已。 [/quote]  多谢，解决了我的问题。辛苦了

引用 20 楼 hgsdfghdfsd 的回复:[quote=引用 19 楼 lm_whales 的回复:] 。。。。  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？[/quote] 差不多可以这样理解  从纯粹的 C的语法上来说，是没有办法初始化堆栈的。 例如 标准C 语言，就没有提供直接操作硬件的支持。  但是C允许嵌入 汇编。甚至直接嵌入二进制指令 有些编译器，例如Dos下的TC 有寄存器伪变量 都可以一定程度的在C中，直接操纵硬件 勉强用C初始化，也能凑乎。 （甚至C的编译选项中，也可以适当的影响堆栈的设置。)  但显然不如汇编更合适，受到的限制更小 编写代码更容易，也更清晰，甚至可读性也更好。  毕竟，这些关键代码， 其实只是程序中很小的一部分，虽然可能是最重要的一部分。 因此，虽然是汇编语言实现的，但是代码其实很短  其实，纯C 的初始化部分在编译器的库里，这部分很有可能就是汇编写成的 还有一些函数，如 exit,_exit 也可能是汇编写成的。 只是他们多半已经编译好了，随着编译器发布而已。

楼主问题的深度是我等不能体会到的。。。

引用 19 楼 lm_whales 的回复:[quote=引用 18 楼 hgsdfghdfsd 的回复:] [quote=引用 17 楼 lm_whales 的回复:] 不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程[/quote]  虽然架构不一样的，现代CPU都是基于堆栈的，都是有中断的 ARM一样离不开堆栈 只是方式不同 ARM 也需要初始化堆栈 当然，现在开发ARM等嵌入式软件，可以基于实时操作系统  包括实时 linux 类型的，和μOS 等各种实时操作系统， 可用的实时操作系统有很多，名字记不住了，不少于4，5个。 这些操作系统，已经帮助你准备好堆栈了，你可能就不用自己初始化堆栈了  [/quote]  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？

引用 18 楼 hgsdfghdfsd 的回复:[quote=引用 17 楼 lm_whales 的回复:] 不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程[/quote]  虽然架构不一样的，现代CPU都是基于堆栈的，都是有中断的 ARM一样离不开堆栈 只是方式不同 ARM 也需要初始化堆栈 当然，现在开发ARM等嵌入式软件，可以基于实时操作系统  包括实时 linux 类型的，和μOS 等各种实时操作系统， 可用的实时操作系统有很多，名字记不住了，不少于4，5个。 这些操作系统，已经帮助你准备好堆栈了，你可能就不用自己初始化堆栈了

引用 17 楼 lm_whales 的回复:不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程


Question: 用C写一个计算题，求帮忙。谢谢啦

也就是这个

不一定对，仅供参考：// 已知： // f(k)=2*(k-1)+6*(100-k) // g(k)=-2*k+4*(99-k) // 求： //   99   j // ∑   ∏   f(k)/g(k) //   j=1  k=1 #include <stdio.h> int k,j; double f[100],g[100],p[100],s[100],m,t; int main() {     for (k=1;k<=99;k++) {         f[k]=2.0*(k-1)+6.0*(100-k);         g[k]=-2.0*k+4.0*(99-k);     }     m=1.0;     for (k=1;k<=99;k++) {         m*=f[k]/g[k];         p[k]=m;         printf("k:%2d,p[k]:%lg\n",k,p[k]);     }     t=0.0;     for (j=1;j<=99;j++) {         t+=p[j];         printf("j:%2d,t:%lg\n",j,t);     }     printf("\n%lg\n",t);     return 0; } //k: 1,p[k]:1.52308 //k: 2,p[k]:2.34014 //k: 3,p[k]:3.62784 //k: 4,p[k]:5.67582 //k: 5,p[k]:8.96345 //k: 6,p[k]:14.2917 //k: 7,p[k]:23.0121 //k: 8,p[k]:37.4277 //k: 9,p[k]:61.504 //k:10,p[k]:102.141 //k:11,p[k]:171.472 //k:12,p[k]:291.08 //k:13,p[k]:499.779 //k:14,p[k]:868.205 //k:15,p[k]:1526.45 //k:16,p[k]:2717.08 //k:17,p[k]:4898.15 //k:18,p[k]:8945.92 //k:19,p[k]:16559.5 //k:20,p[k]:31079 //k:21,p[k]:59165.2 //k:22,p[k]:114296 //k:23,p[k]:224163 //k:24,p[k]:446546 //k:25,p[k]:903984 //k:26,p[k]:1.8607e+006 //k:27,p[k]:3.89634e+006 //k:28,p[k]:8.30535e+006 //k:29,p[k]:1.80323e+007 //k:30,p[k]:3.99049e+007 //k:31,p[k]:9.00711e+007 //k:32,p[k]:2.07517e+008 //k:33,p[k]:4.88398e+008 //k:34,p[k]:1.17521e+009 //k:35,p[k]:2.89379e+009 //k:36,p[k]:7.29878e+009 //k:37,p[k]:1.88762e+010 //k:38,p[k]:5.01117e+010 //k:39,p[k]:1.36725e+011 //k:40,p[k]:3.83881e+011 //k:41,p[k]:1.11069e+012 //k:42,p[k]:3.31666e+012 //k:43,p[k]:1.02384e+013 //k:44,p[k]:3.27318e+013 //k:45,p[k]:1.08586e+014 //k:46,p[k]:3.74623e+014 //k:47,p[k]:1.34733e+015 //k:48,p[k]:5.06496e+015 //k:49,p[k]:1.99619e+016 //k:50,p[k]:8.27586e+016 //k:51,p[k]:3.62299e+017 //k:52,p[k]:1.6821e+018 //k:53,p[k]:8.32425e+018 //k:54,p[k]:4.41648e+019 //k:55,p[k]:2.52944e+020 //k:56,p[k]:1.57668e+021 //k:57,p[k]:1.08032e+022 //k:58,p[k]:8.23744e+022 //k:59,p[k]:7.09988e+023 //k:60,p[k]:7.06044e+024 //k:61,p[k]:8.33132e+025 //k:62,p[k]:1.21498e+027 //k:63,p[k]:2.33547e+028 //k:64,p[k]:6.65609e+029 //k:65,p[k]:3.7496e+031 //k:66,p[k]:1.#INF //k:67,p[k]:-1.#INF //k:68,p[k]:1.#INF //k:69,p[k]:-1.#INF //k:70,p[k]:1.#INF //k:71,p[k]:-1.#INF //k:72,p[k]:1.#INF //k:73,p[k]:-1.#INF //k:74,p[k]:1.#INF //k:75,p[k]:-1.#INF //k:76,p[k]:1.#INF //k:77,p[k]:-1.#INF //k:78,p[k]:1.#INF //k:79,p[k]:-1.#INF //k:80,p[k]:1.#INF //k:81,p[k]:-1.#INF //k:82,p[k]:1.#INF //k:83,p[k]:-1.#INF //k:84,p[k]:1.#INF //k:85,p[k]:-1.#INF //k:86,p[k]:1.#INF //k:87,p[k]:-1.#INF //k:88,p[k]:1.#INF //k:89,p[k]:-1.#INF //k:90,p[k]:1.#INF //k:91,p[k]:-1.#INF //k:92,p[k]:1.#INF //k:93,p[k]:-1.#INF //k:94,p[k]:1.#INF //k:95,p[k]:-1.#INF //k:96,p[k]:1.#INF //k:97,p[k]:-1.#INF //k:98,p[k]:1.#INF //k:99,p[k]:-1.#INF //j: 1,t:1.52308 //j: 2,t:3.86322 //j: 3,t:7.49106 //j: 4,t:13.1669 //j: 5,t:22.1303 //j: 6,t:36.4221 //j: 7,t:59.4342 //j: 8,t:96.8619 //j: 9,t:158.366 //j:10,t:260.507 //j:11,t:431.979 //j:12,t:723.059 //j:13,t:1222.84 //j:14,t:2091.04 //j:15,t:3617.49 //j:16,t:6334.58 //j:17,t:11232.7 //j:18,t:20178.6 //j:19,t:36738.1 //j:20,t:67817.1 //j:21,t:126982 //j:22,t:241279 //j:23,t:465441 //j:24,t:911988 //j:25,t:1.81597e+006 //j:26,t:3.67667e+006 //j:27,t:7.57301e+006 //j:28,t:1.58784e+007 //j:29,t:3.39107e+007 //j:30,t:7.38156e+007 //j:31,t:1.63887e+008 //j:32,t:3.71403e+008 //j:33,t:8.59801e+008 //j:34,t:2.03501e+009 //j:35,t:4.9288e+009 //j:36,t:1.22276e+010 //j:37,t:3.11037e+010 //j:38,t:8.12155e+010 //j:39,t:2.1794e+011 //j:40,t:6.01821e+011 //j:41,t:1.71251e+012 //j:42,t:5.02917e+012 //j:43,t:1.52675e+013 //j:44,t:4.79993e+013 //j:45,t:1.56586e+014 //j:46,t:5.31209e+014 //j:47,t:1.87854e+015 //j:48,t:6.94349e+015 //j:49,t:2.69054e+016 //j:50,t:1.09664e+017 //j:51,t:4.71963e+017 //j:52,t:2.15407e+018 //j:53,t:1.04783e+019 //j:54,t:5.46431e+019 //j:55,t:3.07587e+020 //j:56,t:1.88427e+021 //j:57,t:1.26875e+022 //j:58,t:9.50618e+022 //j:59,t:8.0505e+023 //j:60,t:7.86549e+024 //j:61,t:9.11787e+025 //j:62,t:1.30616e+027 //j:63,t:2.46609e+028 //j:64,t:6.9027e+029 //j:65,t:3.81862e+031 //j:66,t:1.#INF //j:67,t:-1.#IND //j:68,t:-1.#IND //j:69,t:-1.#IND //j:70,t:-1.#IND //j:71,t:-1.#IND //j:72,t:-1.#IND //j:73,t:-1.#IND //j:74,t:-1.#IND //j:75,t:-1.#IND //j:76,t:-1.#IND //j:77,t:-1.#IND //j:78,t:-1.#IND //j:79,t:-1.#IND //j:80,t:-1.#IND //j:81,t:-1.#IND //j:82,t:-1.#IND //j:83,t:-1.#IND //j:84,t:-1.#IND //j:85,t:-1.#IND //j:86,t:-1.#IND //j:87,t:-1.#IND //j:88,t:-1.#IND //j:89,t:-1.#IND //j:90,t:-1.#IND //j:91,t:-1.#IND //j:92,t:-1.#IND //j:93,t:-1.#IND //j:94,t:-1.#IND //j:95,t:-1.#IND //j:96,t:-1.#IND //j:97,t:-1.#IND //j:98,t:-1.#IND //j:99,t:-1.#IND // //-1.#IND //


Question: c编写简单的例子cgi 用lighttpd无法访问

《http权威指南》

引用 1 楼 zhao4zhong1 的回复:建议楼主先学会使用抓包软件比如wireshark ---------------------------------------------------------------------------- linux centos7+lighttpd+c+cgi 之前index.html都可以访问 后来发现不能访问是因为#注释没去掉 现在可以访问cgi文件 但是返回http 500错误

建议楼主先学会使用抓包软件比如wireshark


Question: 关于计算机浮点计算误差问题

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


Question: strtol

引用 3 楼 xiadun 的回复:[quote=引用 2 楼 wang0635 的回复:] #include<stdio.h>  int main() {     unsigned int   n1, n2, n3, n4;     char b[] = "c0a801bb";      sscanf(b, "%2x%2x%2x%2x", &n1, &n2, &n3, &n4);     printf("%1d.%1d.%1d.%1d\n", n1, n2, n3, n4);      return 0; }  转换成对应的整数呢？ sscanf之后，我再sprintf转换成192.168.1.187,然后再inet_aton去转换？[/quote] int main() {     char b[] = "c0a800bb";     unsigned int   l;      sscanf(b, "%8x", &l);     printf("%x\n", l);      return 0; }

引用 2 楼 wang0635 的回复:#include<stdio.h>  int main() {     unsigned int   n1, n2, n3, n4;     char b[] = "c0a801bb";      sscanf(b, "%2x%2x%2x%2x", &n1, &n2, &n3, &n4);     printf("%1d.%1d.%1d.%1d\n", n1, n2, n3, n4);      return 0; }  转换成对应的整数呢？ sscanf之后，我再sprintf转换成192.168.1.187,然后再inet_aton去转换？

char b[] = "c0a801bb"; 把这个转化成IP地址，怎么操作 ，最好是用系统函数

本来想事无巨细地准备一番，后来觉得还是故意不准备，全靠临场发挥更能有戏剧性。

赵老湿准备好了么，还在灌水.... 引用 5 楼 zhao4zhong1 的回复: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。


Question: [求助]一段代码求解

月经帖．

这程序的问题

呵呵，多加几个括号，明确一下优先级，就不会出现该类问题了吧

不同的编译器结果很可能不同，这是一个未定义的行为

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

i的结果多少？？？？？

没什么意义。。


Question: 关于三个数特殊的排序问题

引用 1 楼 user-4 的回复:用for循环啊，就像求n个数最大值一样，在里面加一个相等时的分支，相等就随机选 是这个意思啊。但是就是不太好写啊。。

引用 3 楼 braycep 的回复:printf("%d",(n0>n1? n0:n1)>n2?(n0>n1? n0:n1):n2); 这个没有选择出方向吧？而且好像在有相同值的时候不适用吧？

引用 2 楼 jiangzhiyuan123 的回复:int n[3]={1,2,3}; 	int max; 	max=n[0];        	int count=0;     //初始方向0； 	for(int i=0;i<2;i++) 	{ 		if(n[i]<=n[i+1]) 			max=n[i+1]; 		count=i+1; 	} 	printf("%d\n%d\n",max,count); 这个貌似不太行哦。比如n2=n3>n1，这时候我想要的是2和3两个方向中的任意一个，而不是固定的某一个。你这个代码好像只能选择一个，而且是最大的方向。我说的对吗？

引用 7 楼 zhao4zhong1 的回复:这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。 #include <stdio.h> #include <stdlib.h> #include <time.h> int n[3],m[3]; int i,j,k,t; int main() {     srand(time(NULL));     for (k=0;k<100;k++) {         for (i=0;i<3;i++) {             n[i]=rand()%4;             m[i]=i;         }         printf("%02d:%d %d %d ",k,n[0],n[1],n[2]);//第0..99次的三个数         for (i=0;i<2;i++) {             for (j=i+1;j<3;j++) {                 if (n[i]<n[j]) {                     t=n[i];n[i]=n[j];n[j]=t;                     t=m[i];m[i]=m[j];m[j]=t;                 }             }         }         if (n[0]==n[1] && n[1]==n[2]) {             i=rand()%3;//最大的三个都相等，随机选其中一个         } else if (n[0]==n[1]) {             i=rand()%2;//最大的两个都相等，随机选其中一个         } else i=0;         printf(" [%d] %d\n",m[i],n[i]);//选第[]个，值     }     return 0; } //00:1 1 3  [2] 3 //01:2 1 2  [0] 2 //02:1 2 2  [2] 2 //03:1 1 2  [2] 2 //04:3 3 2  [0] 3 //05:3 1 3  [2] 3 //06:2 0 2  [0] 2 //07:2 3 2  [1] 3 //08:0 2 1  [1] 2 //09:1 0 0  [0] 1 //10:1 1 3  [2] 3 //11:2 3 0  [1] 3 //12:3 2 2  [0] 3 //13:2 3 0  [1] 3 //14:0 1 3  [2] 3 //15:1 1 0  [0] 1 //16:1 0 3  [2] 3 //17:2 1 2  [0] 2 //18:3 3 0  [0] 3 //19:1 1 3  [2] 3 //20:2 3 0  [1] 3 //21:3 3 0  [0] 3 //22:0 3 1  [1] 3 //23:0 0 3  [2] 3 //24:0 0 0  [2] 0 //25:0 2 0  [1] 2 //26:2 3 1  [1] 3 //27:2 1 2  [2] 2 //28:2 2 0  [1] 2 //29:2 3 1  [1] 3 //30:2 2 0  [0] 2 //31:1 1 1  [2] 1 //32:2 2 0  [0] 2 //33:2 0 1  [0] 2 //34:3 0 2  [0] 3 //35:3 0 0  [0] 3 //36:1 2 1  [1] 2 //37:2 3 1  [1] 3 //38:0 0 0  [0] 0 //39:2 1 3  [2] 3 //40:3 3 0  [1] 3 //41:3 1 0  [0] 3 //42:3 1 1  [0] 3 //43:1 3 1  [1] 3 //44:3 3 0  [1] 3 //45:0 1 1  [1] 1 //46:0 1 3  [2] 3 //47:3 1 1  [0] 3 //48:2 0 0  [0] 2 //49:1 1 3  [2] 3 //50:2 0 3  [2] 3 //51:3 3 1  [1] 3 //52:2 2 3  [2] 3 //53:2 1 2  [0] 2 //54:3 1 3  [0] 3 //55:3 0 0  [0] 3 //56:2 1 0  [0] 2 //57:3 3 3  [0] 3 //58:1 3 3  [1] 3 //59:0 3 1  [1] 3 //60:1 2 1  [1] 2 //61:2 2 0  [0] 2 //62:0 1 3  [2] 3 //63:3 2 2  [0] 3 //64:1 0 3  [2] 3 //65:1 0 2  [2] 2 //66:2 1 2  [2] 2 //67:1 3 1  [1] 3 //68:1 2 3  [2] 3 //69:1 0 1  [2] 1 //70:2 0 3  [2] 3 //71:2 3 1  [1] 3 //72:3 2 3  [2] 3 //73:3 1 3  [2] 3 //74:1 0 0  [0] 1 //75:2 2 1  [1] 2 //76:2 2 3  [2] 3 //77:2 1 2  [0] 2 //78:2 3 3  [1] 3 //79:1 2 0  [1] 2 //80:1 0 3  [2] 3 //81:1 0 0  [0] 1 //82:0 0 1  [2] 1 //83:1 0 0  [0] 1 //84:2 1 0  [0] 2 //85:1 1 2  [2] 2 //86:0 0 0  [0] 0 //87:1 3 2  [1] 3 //88:1 0 2  [2] 2 //89:0 1 3  [2] 3 //90:3 0 2  [0] 3 //91:2 3 2  [1] 3 //92:1 1 2  [2] 2 //93:3 1 3  [0] 3 //94:2 2 2  [1] 2 //95:1 1 2  [2] 2 //96:1 1 1  [2] 1 //97:0 2 0  [1] 2 //98:3 3 1  [1] 3 //99:3 1 2  [0] 3 //  谢谢老师的委婉批评，程序简洁有效！

用for循环啊，就像求n个数最大值一样，在里面加一个相等时的分支，相等就随机选


Question: 在C语言的编程中，存在这么一种特殊情况，不知道各位是怎么处理的

这种互相包含不是好的编码风格，建议百度： impl

如果一个结构类型的声明具有如下形式 struct 标识符 而且后面不是分号“;”、“{”，则它声明的是一个不完整的结构类型，可以在后面补充声明为完整类型。 因此，这样做是正确的：  struct t f (void) {     /* ... ... */ }  struct t {/* ... ... */}

怎么保证类型的定义在使用该类型之前？

在上面的例子： #ifndef   _C_H #define  _C_H  #include A.h #include B.h  (函数声明)   #endif  修改一下： #ifndef   _C_H #define  _C_H  #include B.h #include A.h  (函数声明)   #endif 首先展开的是B.h,   B.h中包含了A.h与C.h，  由于已经#define _C_H， C.h不会被展开，因此首先展开A.h，然后才是B.h中的内容。由于在B.h中展开了A.h，因此在C.h中#include A.h就不展开了。 最后的结果是在A.h中的函数声明在前，而B.h中的类型定义在后。

由于使用了#ifndef     #define      #endif， 所以在.c文件中每个.h文件只会被展开一次,也就是说在.c文件中展开.h文件时类型的定义与函数声明只有一份。 那么在.c文件中展开.h文件后类型的定义与函数声明必然有先后关系，如果函数的声明在前，而类型的定义在后，这样难道不会报错吗？

引用 2 楼 user-6 的回复:A.h中也会有include B.h才对吧。  +10086

C++有 inline  函数，可能会出现这现象  C函数实现在 ,c 中，.h  只有宏定义 类型定义 函数原型  因此，解决方案有这么几种 1）头文件 #include头文件 2）类型定义集中在一个文件中 3）顺序包含头文件

在B.h中也用类似的。 #ifndef   _B_H #define  _B_H  括起来啊，头文件展开是不会报错的。 或者把#include B.h写在上面一句。

A.h中也会有include B.h才对吧。


Question: sscanf有没有办法提取两个字符串中间的字符串？

如果是"ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&name=asjkfhasjkfh&usession=undefined,我要截取第二次&name=后面的内容，要怎么做啊

如果要截取pass=后面的密码要怎么截取啊

引用 6 楼 zhao4zhong1 的回复:char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char *p; char t[40]; p=strstr(s,"&name="); if (p) if (1==sscanf(p+6,"%39[^&]",t)) printf("name=[%s]\n",t);  谢谢

用毛线正则表达式，直接strstr "&name="就行了

这样写无法做成通用的取=后面的值的函数  但如果这样写 if (1==sscanf(s,"%*name=%39[^&][^&]",t)) printf("[%s]\n",t); ，name=前面的字符串用什么表示？

引用 3 楼 old73 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char t[40]; if (1==sscanf(s,"ttt=%*[^&]&name=%39[^&]",t)) printf("[%s]\n",t);   %39是什么意思？  [/quote] 限定最多读入39个非&字符。因为t[40]，后面还要留一个字节给'\0'

引用 2 楼 zhao4zhong1 的回复:char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char t[40]; if (1==sscanf(s,"ttt=%*[^&]&name=%39[^&]",t)) printf("[%s]\n",t);   %39是什么意思？


Question: c语言菜鸟求助

变量不能是数字和一数字开头的组合～

变量名只能是字母(a-z A-Z)，数字(0-9)，下划线(_)的组合，并且之间不能包含空格，数字不能放在变量名首位

void searchtrain(Link 1)，函数定义，这样写，不行吧

void searchtrain(Link 1)，这个写错了，是void searchtrain(Link l)

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

你的void searchtrain(Link 1)里面的l写成了数字1


Question: 关于OPNET软件和VS进行联合仿真的程序问题

opnet中，如何实时接收到VS设置到接口的数据呢？？是通过中断还是什么呢？？

请问在opnet里如何获取VS里的变量呢？？？最后也在做这个方向

引用 3 楼 a648703125 的回复:请问楼主，你的DLL文件是通过VS生成的吗？是的话，生成过程有没有出现  error LNK2019: 无法解析的外部符号 __imp__Esa_Execute_Until，该符号在函数 _esa_main@8 中被引用 这样的错误？ 救救孩子吧 已解决

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


Question: 结构体包含结构体指针的问题

引用 5 楼 qq423399099 的回复:你这样写的话（PFIELD title[MAX_TLTLENUM];）定义出来的是一个指针数组 你需要为每一个元素（即指针）都分配空间，否则的话指针指向的是一块未知的区域，你尝试写入的话会报异常 弄好了！我在每一个引用context.title[count],分配一个空间就好了。谢谢前辈！！

引用 3 楼 qq423399099 的回复:你这个肯定是对NULL指针进行了操作导致的 可以单步看看是哪个地方的问题 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 我觉得可能是空指针问题的话，请问我要是想加上赋予空间的语句要怎么加？是每个指针都要写一个吗，还是可以一起写？

引用 1 楼 user-2 的回复:PFIELD title[MAX_TLTLENUM];指针数组titile初始化了没有？？？ 没有初始化直接调用context.title[count]->type = 1; 这是不是空指针的问题？我查了一些但是不知道该怎么初始化这种指针数组。


Question: （求助）谁能帮我看一下这段代码哪里出问题了，运行不了

我这里对接了一下又不知道哪出错了 /***************************************************************************** ** ** NX8_Open1.c ** ** Description: **     Contains Unigraphics entry points for the application. ** *****************************************************************************/  /* Include files */ #include <stdio.h> #include <uf.h> #include <uf_ui.h> #include"stdio.h" #include"math.h" #include"string.h"  #define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))  static int report_error( char *file, int line, char *call, int irc) {     if (irc)     {         char err[133],              msg[133];          sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",             irc, line, file);         UF_get_fail_message(irc, err);          UF_print_syslog(msg, FALSE);         UF_print_syslog(err, FALSE);         UF_print_syslog("\n", FALSE);         UF_print_syslog(call, FALSE);         UF_print_syslog(";\n", FALSE);          if (!UF_UI_open_listing_window())         {             UF_UI_write_listing_window(msg);             UF_UI_write_listing_window(err);             UF_UI_write_listing_window("\n");             UF_UI_write_listing_window(call);             UF_UI_write_listing_window(";\n");         }     }      return(irc); }   /***************************************************************************** **  Activation Methods *****************************************************************************/ /*  Unigraphics Startup **      This entry point activates the application at Unigraphics startup */ extern DllExport void ufsta( char *param, int *returnCode, int rlen ) {     /* Initialize the API environment */     if( UF_CALL(UF_initialize()) )      {         /* Failed to initialize */         return;     }          /* TODO: Add your application code here */  FILE*fp; int i,gcode; char fname[14],gvalue[65]; float xs[100],ys[100],zs[100],xe[100],ye[100],ze[100]; int scanline(); int outline(); void main() {     int n;     i=0;     scanline();     printf("Enter data file name:");     scanf("%s",fname);     fp=fopen(fname,"w");     fprintf(fp,"%d\n",i);     for(n=1;n<=i;n++)     {fprintf(fp,"%f,%f,%f\n",xs[n],ys[n],zs[n]);     fprintf(fp,"%f,%f,%f\n",xe[n],ye[n],ze[n]);     }     fclose(fp); } int scanline() {     printf("Enter DXF file name:");     scanf("%s",fname);     strcat(fname,".dxf");     fp=fopen(fname,"r");     do{fscanf(fp,"%d",&gcode);     fscanf(fp,"%s",gvalue);     }while(gcode!=2||strcmp(gvalue,"ENTITIES")!=0);     do{fscanf(fp,"%d",&gcode);     fscanf(fp,"%s",gvalue);     if(gcode==0&&strcmp(gvalue,"LINE")==0)outline();     }while(gcode!=0||strcmp(gvalue,"ENDSEC")!=0);     fclose(fp);     return 0; } int outline() {     do{fscanf(fp,"%d",&gcode);     if(gcode==10)     {         i=i+1;         fscanf(fp,"%f",&xs[i]);     }     else         fscanf(fp,"%s",gvalue);     }while(gcode!=10);     fscanf(fp,"%d",&gcode);     fscanf(fp,"%f",&ys[i]);     fscanf(fp,"%d",&gcode);     fscanf(fp,"%f",&zs[i]);     fscanf(fp,"%d",&gcode);     fscanf(fp,"%f",&xe[i]);     fscanf(fp,"%d",&gcode);     fscanf(fp,"%f",&ye[i]);     fscanf(fp,"%d",&gcode);     fscanf(fp,"%f",&ze[i]);     return 0; }     /* Terminate the API environment */     UF_CALL(UF_terminate()); }  /***************************************************************************** **  Utilities *****************************************************************************/  /* Unload Handler **     This function specifies when to unload your application from Unigraphics. **     If your application registers a callback (from a MenuScript item or a **     User Defined Object for example), this function MUST return **     "UF_UNLOAD_UG_TERMINATE". */ extern int ufusr_ask_unload( void ) {     return( UF_UNLOAD_UG_TERMINATE ); }

非常感谢，可以运行出来了~

函数要先声明才行  #include"stdio.h" #include"math.h" #include"string.h" FILE*fp; int i,gcode; char fname[14],gvalue[65]; float xs[100],ys[100],zs[100],xe[100],ye[100],ze[100]; int scanline(); int outline(); void main() { 	int n; 	i=0; 	scanline(); 	printf("Enter data file name:"); 	scanf("%s",fname); 	fp=fopen(fname,"w"); 	fprintf(fp,"%d\n",i); 	for(n=1;n<=i;n++) 	{fprintf(fp,"%f,%f,%f\n",xs[n],ys[n],zs[n]); 	fprintf(fp,"%f,%f,%f\n",xe[n],ye[n],ze[n]); 	} 	fclose(fp); } int scanline() { 	printf("Enter DXF file name:"); 	scanf("%s",fname); 	strcat(fname,".dxf"); 	fp=fopen(fname,"r"); 	do{fscanf(fp,"%d",&gcode); 	fscanf(fp,"%s",gvalue); 	}while(gcode!=2||strcmp(gvalue,"ENTITIES")!=0); 	do{fscanf(fp,"%d",&gcode); 	fscanf(fp,"%s",gvalue); 	if(gcode==0&&strcmp(gvalue,"LINE")==0)outline(); 	}while(gcode!=0||strcmp(gvalue,"ENDSEC")!=0); 	fclose(fp); 	return 0; } int outline() { 	do{fscanf(fp,"%d",&gcode); 	if(gcode==10) 	{ 		i=i+1; 		fscanf(fp,"%f",&xs[i]); 	} 	else 		fscanf(fp,"%s",gvalue); 	}while(gcode!=10); 	fscanf(fp,"%d",&gcode); 	fscanf(fp,"%f",&ys[i]); 	fscanf(fp,"%d",&gcode); 	fscanf(fp,"%f",&zs[i]); 	fscanf(fp,"%d",&gcode); 	fscanf(fp,"%f",&xe[i]); 	fscanf(fp,"%d",&gcode); 	fscanf(fp,"%f",&ye[i]); 	fscanf(fp,"%d",&gcode); 	fscanf(fp,"%f",&ze[i]); 	return 0; }


Question: 怎么去掉这个警告？warning: suggest parentheses around arithmetic in operand of '^'

二元的位运算符比加减运算符的优先级低 而有时我们想当然认为位运算优先级要高一些的 所以 b | c + d 其实是 b | (c + d) 而不是  (b | c) + d 有人就吵起来了 为了避免这种无谓的争吵 在有二元位运算符号（& | ^）和算术运算符号的表达式中 好一些的编译器就善意的提醒我们 要我们明确说明到底是怎么个结合法

((rtc_time->tm_year) ^ (rtc_time->tm_mday))报错信息提示楼主用括号将^操作符用括号括起来。

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

C/C++里的^是异或运算符，而不是表示几次方  要计算幂用pow函数


Question: 数据类型转换，8位有符号整型转化为16位无符号整型

我是那个随便来的人吗？

我搞懂了，随便来个人，结贴给分


Question: 如何将按键输入的数字放入数组中

#include <stdio.h> #include <stdlib.h>  #define ARR_MAX (10) #define END_NUM (0)  int main(void) { 	int i = 0; 	int arr[ARR_MAX]; 	 	while (i < ARR_MAX) { 		scanf("%d", &arr[i]); 		if (END_NUM == arr[i]) { 			break; 		} 		i++; 	} 	 	return 0; }

输入的数字个数不定的？有几个思路 1.提前设置好数组的大小，开的大一点 2.根据输入的长度动态更改，比如使用realloc


Question: C语言和DOTA

引用 45 楼 ksx_120999 的回复:是我的打开方式不对吗，就一个hello dota~  屏幕上只会打印hello dota。  如果你在linux下运行，所有的游戏细节都在日志里，log目录下的battle.log。  如果在windows下运行，看看你的工程目录下，是不是有battle.log。  谢谢你的支持。

是我的打开方式不对吗，就一个hello dota~

引用 43 楼 hordemark 的回复:==30276== Memcheck, a memory error detector ==30276== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==30276== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==30276== Command: ./fight ==30276==  hello, dota! ==30276==  ==30276== HEAP SUMMARY: ==30276==     in use at exit: 136 bytes in 1 blocks ==30276==   total heap usage: 955 allocs, 954 frees, 514,232 bytes allocated ==30276==  ==30276== 136 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==30276==    at 0x4C29C4F: malloc (vg_replace_malloc.c:299) ==30276==    by 0x40341B: find_enemy_area (dota_life.c:102) ==30276==    by 0x403009: es_c (dota_es.c:305) ==30276==    by 0x401B3F: default_skill (dota_operate.c:323) ==30276==    by 0x403192: es_policy (dota_es.c:373) ==30276==    by 0x4021E7: fsm_run (dota_fsm.c:103) ==30276==    by 0x402272: dota_schedule (dota_frame.c:68) ==30276==    by 0x4007C9: main (dota_battle.c:24) ==30276==  ==30276== LEAK SUMMARY: ==30276==    definitely lost: 136 bytes in 1 blocks ==30276==    indirectly lost: 0 bytes in 0 blocks ==30276==      possibly lost: 0 bytes in 0 blocks ==30276==    still reachable: 0 bytes in 0 blocks ==30276==         suppressed: 0 bytes in 0 blocks ==30276==  ==30276== For counts of detected and suppressed errors, rerun with: -v ==30276== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)  哈哈，非常感谢你。牛头大招技能找了一堆敌人之后，忘记了free，太大意了。  我已经改正提交了，自己也用valgrind跑了一下，OK了。  再次感谢。  ==3600== Memcheck, a memory error detector ==3600== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==3600== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==3600== Command: ./fight ==3600==  hello, dota! ==3600==  ==3600== HEAP SUMMARY: ==3600==     in use at exit: 0 bytes in 0 blocks ==3600==   total heap usage: 809 allocs, 809 frees, 268,932 bytes allocated ==3600==  ==3600== All heap blocks were freed -- no leaks are possible ==3600==  ==3600== For counts of detected and suppressed errors, rerun with: -v ==3600== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

感谢LZ分享~

感谢LZ分享~

mark 目测很屌的样子

Mark，回家看。

引用 34 楼 chenlei19970308 的回复:真棒！  Thanks，请多支持。

引用 38 楼 zhao4zhong1 的回复:推荐楼主一个软件SigZag：        _-~~~~-                                         _        -   @  @                /!_.-_|\                ||       '         \              `-/_'--'            __./__\                    |\      .. |             (_(o)\\\)          (_.(o)\\               , __  , \     ' . '\___/ ..             (||\\\\;_,          /__-`\\_             -/__\- |\_  /    -____--//              /  _-".----.          \,\-,           .__O  ,;  \ \/    .\\     \/            ./_-"  /o,--.o\         <_ -\           (___  ||   \    .'  \\     |           /      |o (  ) o|         | , \              |=|`    .   \  /'     |           !__,--.__\o `-'o/          | |  \          __/  \      \   |       .'           |_-__--__`----'           | |__J         /,-`   |   ,      _|  /-__-'/             __,/\_|\/\,                (     \           !    \  )\     |   \     ) )__         (   `/_'`X_;                |      \._      _(_(   _=;_/      \__/     |___/          `.____)____)               <_________\    <_<__-__;   哈哈，这个软件太搞笑了，后面可以考虑拿这个把日志打印成连环画。

引用 36 楼 xuzzzhen123 的回复:Mark，回家看。 引用 37 楼 superlazybug 的回复:mark 目测很屌的样子  多谢支持，谢谢。

引用 30 楼 zhouxiaofeng1021 的回复:可以写了 C语言 与外挂程序吗？  哈哈，我不会写外挂呀，sorry，还请多支持。

引用 31 楼 henuyx 的回复:[quote=引用 9 楼 mym_cocacola 的回复:] [quote=引用 6 楼 henuyx 的回复:] 大致浏览了一遍，很有意思，明早再运行一下程序看看效果。  对了，那个石头很多的名字，也很有意思...  谢谢你的支持，这对我来说很重要。  想了一会你说的石头很多的名字，你应该说的是杨石磊吧。他是我的大学好友之一，我的外号就是他取的。  这个程序运行后不会有华丽的效果，只有日志:-)，希望你能在这里找到乐趣，have fun。[/quote]  纯linux开发者，所以呢，对这个日志的模式还是很有兴趣的！ 编译的时候除了一点小报错。 bsc/dota_log.c  line 44 这个可以va_list arg_list=NULL吗? 我将这个去掉了，一般不是指针，不会赋值NULL的吧。  引用 9 楼 mym_cocacola 的回复:[quote=引用 6 楼 henuyx 的回复:] 大致浏览了一遍，很有意思，明早再运行一下程序看看效果。  对了，那个石头很多的名字，也很有意思...  谢谢你的支持，这对我来说很重要。  想了一会你说的石头很多的名字，你应该说的是杨石磊吧。他是我的大学好友之一，我的外号就是他取的。  这个程序运行后不会有华丽的效果，只有日志:-)，希望你能在这里找到乐趣，have fun。[/quote]  作为一格纯linux开发，对日志这种方式还是有特别浓厚的情结的。 不过编译的时候，出现一个小问题。 bsc/dota_log.c:44: error: invalid initializer va_list arg_list = NULL;  这个东西应该是个void* ，不知为何出这种编译错误。  可以加一些执行参数 将结果打印到终端 设置回合时间，可以看到每个回合英雄的释放技能或者普通攻击 这样可以看到三个英雄在互殴...[/quote]  报这个错可能跟linux的版本有关系吧，我这边是ubuntu 12.04，倒是不报这个错。 在2.4内核里va_list 好像是char *，书里有提到，去掉初始化也没关系，每个变量都初始化是华为的硬性规范，一时没改掉。  你这个想法很好啊，输出到屏幕很直观，结果呈现的话也能更好一些。  是两个英雄和一个野怪，半人马是野怪，哈哈。

引用 9 楼 mym_cocacola 的回复:[quote=引用 6 楼 henuyx 的回复:] 大致浏览了一遍，很有意思，明早再运行一下程序看看效果。  对了，那个石头很多的名字，也很有意思...  谢谢你的支持，这对我来说很重要。  想了一会你说的石头很多的名字，你应该说的是杨石磊吧。他是我的大学好友之一，我的外号就是他取的。  这个程序运行后不会有华丽的效果，只有日志:-)，希望你能在这里找到乐趣，have fun。[/quote]  纯linux开发者，所以呢，对这个日志的模式还是很有兴趣的！ 编译的时候除了一点小报错。 bsc/dota_log.c  line 44 这个可以va_list arg_list=NULL吗? 我将这个去掉了，一般不是指针，不会赋值NULL的吧。  引用 9 楼 mym_cocacola 的回复:[quote=引用 6 楼 henuyx 的回复:] 大致浏览了一遍，很有意思，明早再运行一下程序看看效果。  对了，那个石头很多的名字，也很有意思...  谢谢你的支持，这对我来说很重要。  想了一会你说的石头很多的名字，你应该说的是杨石磊吧。他是我的大学好友之一，我的外号就是他取的。  这个程序运行后不会有华丽的效果，只有日志:-)，希望你能在这里找到乐趣，have fun。[/quote]  作为一格纯linux开发，对日志这种方式还是有特别浓厚的情结的。 不过编译的时候，出现一个小问题。 bsc/dota_log.c:44: error: invalid initializer va_list arg_list = NULL;  这个东西应该是个void* ，不知为何出这种编译错误。  可以加一些执行参数 将结果打印到终端 设置回合时间，可以看到每个回合英雄的释放技能或者普通攻击 这样可以看到三个英雄在互殴...

可以写了 C语言 与外挂程序吗？

引用 27 楼 craboy1 的回复:已fuck，sorry!是fork.  哈哈，谢谢，请多支持。

真棒！

已fuck，sorry!是fork.

呵呵~很不错~


Question: C语言的问题。  大神

#include <stdlib.h> #include <stdio.h>  typedef struct node {         char a;         int count;         struct node *next; }Node;  Node* insert(Node *h, char key) {         if(NULL == h)         {                 Node *p = (Node *)malloc(sizeof(Node));                 p->a = key;                 p->count = 1;                 p->next = NULL;                 h = p;         }         else         {                 if(h->a == key)                 {                         h->count ++;                 }                 else                 {                         h->next = insert(h->next, key);                 }         }         return h; }  void print(Node *h) {         Node *p = h;         while(NULL != p)         {                 printf("%c, %d\n", p->a, p->count);                 p = p->next;         } }  int main(int argc, char *argv[]) {         char b[10] = "abacebaeba";         int i = 0;         Node *t = NULL;         for(i = 0; i < 10; i ++)         {                 t = insert(t, b[i]);         }         print(t);         return 0; }

引用 6 楼 zxhuser-3 的回复:fgetc是读取一个字节的,汉字是多个字节表示的  T T 我知道啊， 我现在连字符都搞不定呢，  所以我往txt文件里 输入的只有字母和数字阿，  不考虑汉字， 该如何撸码？？ 大神

阿啊啊啊啊啊 。  大神

fgetc是读取一个字节的,汉字是多个字节表示的

引用 2 楼 zxhuser-3 的回复:感觉数组方便些 但用数组的话， 如何匹配庞大的字符呢，  字母，汉字， 符号？  我感觉还是单链表好用吧T Tt

求大神解答~  大神~  谢谢啦

感觉数组方便些

大神求指导


Question: 请问consr char* s1是指针常量吧，那为什么程序还会报错。

不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

楼主两次s1\s2都使用的是赋值操作，而不是判断操作，判断操作请用==，const是不允许修改该变量的。

const char *p 是常量指针，所指对象*p不可修改 char *const p 是指针常量，p不可修改 作为函数形式参数 char *const p 作用不大，一般不写 如同 const int n 这样的参数，一般不会出现一样，char *const p 这样的参数也一般不会出现 如果参数是 int,double  类型，即便参数是常量表达式，也只是 int ,double就可以了，没人会写成 int const n 或者，const int n 如果参数是 char *类型，哪怕指针不会改变，甚至实参只会传递 char *const, 一般也不会有人写成 char *const p 因为这么写，对外界没有任何作用，只能约束函数内部，不去修改它。没有多少意义。  如果不是 == 误写为 = 就是你对 = 或者 const char *p的意义理解错了 = 是赋值运算符 == 是相等比较运算符 const char *p 的意义是 *p 这个对象，不能通过 *p这个表达式 修改。 这是常量指针，指针p指向的对象 *p，对于指针 p来说具有常量性（不可修改）。

少个 =

const char*表示的是指向的字符串的是个常量 char* const 是指针本身是常量，指向的位置不能修改


Question: c语言循环输入坐标然后画点输出在同一个界面上

F:\STAR1.DAT是一个星表，存在。同时rt我都不是很明白。

什么情况？ F:\STAR1.DAT是否存在，"rt"似乎应为"rb"二进制读，因为后面fread


Question: 请问c语言有“声明”函数的说法，而VB为什么没有？

没有银弹！

VB 中 变量声明  dim  public private   public private 也可用于函数  VB 一般不需要 include 指令，就可以直接用其中的函数，过程，常量，类型，全局变量了 这点跟C，C++不同

basic  函数和过程生命方式是  Declare Function....... Declare Sub.... VB 中，调用 DLL 也需要 声明其中的函数或者过程的

有啊，VB中 API 必须先声明，后引用

C : 执行效率  VB : 简单，易学

用起来方便的代价就是效率变低，如考虑汇编——C——C#


Question: 为什么全是0.。。

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

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

建议单步运行你的程序，然后跟踪原因

建议！你可以设置一个结构体数组～一个存值～一个存位置～然后利用sort函数对结构体数组排序～按照值的大小排序！最后输出存的位置就可以了


Question: 编程计算4*4矩阵中剩余数字

没必要这么复杂 #include <stdio.h> #include <conio.h> int hh[4];//行和 int lh[4];//列和 int zh,fh;//主（对角线）和，副（对角线）和 int jz[4][4];//={//矩阵 //  {22,15,28,65}, //  {49, 1,21,49}, //  {53,76,16,27}, //  {33, 1,79,27}, //};   int h,l,z;//行，列，值 int yl[4];//各行中已知值所在列 int wz[4][3]={//各行未知值所在列     {0,2,3}, 	{0,1,2}, 	{0,1,3}, 	{1,2,3} }; int cs() {//测试，通过返回1，通不过返回0     int y,x,s,i;       s=0;     for (i=0;i<4;i++) {         s+=jz[i][i];     }     if (s!=zh) return 0;     s=0;     for (i=0;i<4;i++) {         s+=jz[i][4-1-i];     }     if (s!=fh) return 0; //  for (y=0;y<4;y++) { //      s=0; //      for (x=0;x<4;x++) { //          s+=jz[y][x]; //      } //      if (s!=hh[y]) return 0; //  }     for (x=0;x<4;x++) {         s=0;         for (y=0;y<4;y++) {             s+=jz[y][x];         }         if (s!=lh[x]) return 0;     }     return 1; } void xs() {//显示     int y,x;       for (y=0;y<4;y++) {         for (x=0;x<4;x++) {             printf("%3d",jz[y][x]);         }         printf("\n");     }     printf("\n"); } int main() { 	printf("输入4个行元素之和\n");     for (h=0;h<4;h++)//输入4个行元素之和 		scanf("%d",&hh[h]);  	printf("输入副对角线元素之和\n");     scanf("%d",&fh);//输入副对角线元素之和 	printf("输入4个列元素之和\n");     for (l=0;l<4;l++)//输入4个列元素之和 		scanf("%d",&lh[l]);  	printf("输入主对角线元素之和\n"); 	scanf("%d",&zh);//输入主对角线元素之和     scanf("%*d"); 	//以下输入现有的4个数字的行列号及数字 	printf("输入现有的4个数字的行列号及数字\n");     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;yl[h]=l; //  if (cs()) { //      printf("OK\n"); //      xs(); //      return 1; //  } 	printf("开始计算\n");       for (jz[0][wz[0][0]]=0; jz[0][wz[0][0]]<hh[0]-jz[0][yl[0]]; jz[0][wz[0][0]]++) {     for (jz[0][wz[0][1]]=0; jz[0][wz[0][1]]<hh[0]-jz[0][yl[0]]-jz[0][wz[0][0]]; jz[0][wz[0][1]]++) {          jz[0][wz[0][2]]=hh[0]-jz[0][yl[0]]-jz[0][wz[0][0]]-jz[0][wz[0][1]];       for (jz[1][wz[1][0]]=0; jz[1][wz[1][0]]<hh[1]-jz[1][yl[1]]; jz[1][wz[1][0]]++) {     for (jz[1][wz[1][1]]=0; jz[1][wz[1][1]]<hh[1]-jz[1][yl[1]]-jz[1][wz[1][0]];jz[1][wz[1][1]]++) {          jz[1][wz[1][2]]=hh[1]-jz[1][yl[1]]-jz[1][wz[1][0]]-jz[1][wz[1][1]];       for (jz[2][wz[2][0]]=0; jz[2][wz[2][0]]<hh[2]-jz[2][yl[2]]; jz[2][wz[2][0]]++) {     for (jz[2][wz[2][1]]=0; jz[2][wz[2][1]]<hh[2]-jz[2][yl[2]]-jz[2][wz[2][0]]; jz[2][wz[2][1]]++) {          jz[2][wz[2][2]]=hh[2]-jz[2][yl[2]]-jz[2][wz[2][0]]-jz[2][wz[2][1]];       for (jz[3][wz[3][0]]=0; jz[3][wz[3][0]]<hh[3]-jz[3][yl[3]]; jz[3][wz[3][0]]++) {     for (jz[3][wz[3][1]]=0; jz[3][wz[3][1]]<hh[3]-jz[3][yl[3]]-jz[3][wz[3][0]]; jz[3][wz[3][1]]++) {          jz[3][wz[3][2]]=hh[3]-jz[3][yl[3]]-jz[3][wz[3][0]]-jz[3][wz[3][1]]; //      xs();getch(); //      if (kbhit()) {getch();xs();}         if (cs()) {             printf("OK\n");             xs();             return 1;         }     }} }} }} }}     printf("Can not find it!\n");     return 0; }

仅供参考：//http://bbs.csdn.net/topics/390693018 //输入             //4×4矩阵 // 130 120 172 140 //矩阵4行元素之和 // 195             //矩阵副对角线元素之和 // 157  93 144 168 //矩阵4列元素之和 // 66              //矩阵主对角线元素之和 // 195             //重复一遍，矩阵副对角线元素之和 // 0 1 15          //(0,1)处为15 // 1 3 49          //(1,3)处为49 // 2 2 16          //(2,2)处为16 // 3 0 33          //(3,0)处为33 //编程求矩阵 //输出 // 22 15 28 65 // 49  1 21 49 // 53 76 16 27 // 33  1 79 27 #include <stdio.h> #include <conio.h> int hh[4];//行和 int lh[4];//列和 int zh,fh;//主（对角线）和，副（对角线）和 int jz[4][4];//={//矩阵 //  {22,15,28,65}, //  {49, 1,21,49}, //  {53,76,16,27}, //  {33, 1,79,27}, //}; static int bz[4][4];//标志:0未知|1已知 int h,l,z;//行，列，值 int wz[4][3]={//当前行已知值在0,1,2,3列时对应的另三个未知列     {1,2,3},     {0,2,3},     {0,1,3},     {0,1,2}, }; int yl[4];//0,1,2,3行中已知值所在列 int cs() {//测试，通过返回1，通不过返回0     int y,x,s,i;      s=0;     for (i=0;i<4;i++) {         s+=jz[i][i];     }     if (s!=zh) return 0;     s=0;     for (i=0;i<4;i++) {         s+=jz[i][4-1-i];     }     if (s!=fh) return 0; //  for (y=0;y<4;y++) { //      s=0; //      for (x=0;x<4;x++) { //          s+=jz[y][x]; //      } //      if (s!=hh[y]) return 0; //  }     for (x=0;x<4;x++) {         s=0;         for (y=0;y<4;y++) {             s+=jz[y][x];         }         if (s!=lh[x]) return 0;     }     return 1; } void xs() {//显示     int y,x;      for (y=0;y<4;y++) {         for (x=0;x<4;x++) {             printf("%3d",jz[y][x]);         }         printf("\n");     }     printf("\n"); } int main() {     for (h=0;h<4;h++) scanf("%d",&hh[h]);     scanf("%d",&fh);     for (l=0;l<4;l++) scanf("%d",&lh[l]);     scanf("%d",&zh);     scanf("%*d");     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l;     scanf("%d%d%d",&h,&l,&z);jz[h][l]=z;bz[h][l]=1;yl[h]=l; //  if (cs()) { //      printf("OK\n"); //      xs(); //      return 1; //  }      for (jz[0][wz[yl[0]][0]]=0; jz[0][wz[yl[0]][0]]<hh[0]-jz[0][yl[0]]                                        ; jz[0][wz[yl[0]][0]]++) {     for (jz[0][wz[yl[0]][1]]=0; jz[0][wz[yl[0]][1]]<hh[0]-jz[0][yl[0]]-jz[0][wz[yl[0]][0]]                    ; jz[0][wz[yl[0]][1]]++) {          jz[0][wz[yl[0]][2]]=                       hh[0]-jz[0][yl[0]]-jz[0][wz[yl[0]][0]]-jz[0][wz[yl[0]][1]];      for (jz[1][wz[yl[1]][0]]=0; jz[1][wz[yl[1]][0]]<hh[1]-jz[1][yl[1]]                                        ; jz[1][wz[yl[1]][0]]++) {     for (jz[1][wz[yl[1]][1]]=0; jz[1][wz[yl[1]][1]]<hh[1]-jz[1][yl[1]]-jz[1][wz[yl[1]][0]]                    ; jz[1][wz[yl[1]][1]]++) {          jz[1][wz[yl[1]][2]]=                       hh[1]-jz[1][yl[1]]-jz[1][wz[yl[1]][0]]-jz[1][wz[yl[1]][1]];      for (jz[2][wz[yl[2]][0]]=0; jz[2][wz[yl[2]][0]]<hh[2]-jz[2][yl[2]]                                        ; jz[2][wz[yl[2]][0]]++) {     for (jz[2][wz[yl[2]][1]]=0; jz[2][wz[yl[2]][1]]<hh[2]-jz[2][yl[2]]-jz[2][wz[yl[2]][0]]                    ; jz[2][wz[yl[2]][1]]++) {          jz[2][wz[yl[2]][2]]=                       hh[2]-jz[2][yl[2]]-jz[2][wz[yl[2]][0]]-jz[2][wz[yl[2]][1]];      for (jz[3][wz[yl[3]][0]]=0; jz[3][wz[yl[3]][0]]<hh[3]-jz[3][yl[3]]                                        ; jz[3][wz[yl[3]][0]]++) {     for (jz[3][wz[yl[3]][1]]=0; jz[3][wz[yl[3]][1]]<hh[3]-jz[3][yl[3]]-jz[3][wz[yl[3]][0]]                    ; jz[3][wz[yl[3]][1]]++) {          jz[3][wz[yl[3]][2]]=                       hh[3]-jz[3][yl[3]]-jz[3][wz[yl[3]][0]]-jz[3][wz[yl[3]][1]]; //      xs();getch(); //      if (kbhit()) {getch();xs();}         if (cs()) {             printf("OK\n");             xs();             return 1;         }     }} }} }} }}     printf("Can not find it!\n");     return 0; }

而且可能是不定方程

这是 解方程啊 要解n元一次方程组

把不知道的数全部设置成不同未知变量，然后列出所有方程求解，求解方程组的解


Question: 如果不使用一个函数，编译器会不会将些函数编译进exe文件中？

当启动连接程序时，它会寻找“未定义的外部函数”，也就是说，它将在每一个库文件中查找源代码文件中未定义的函数。当它找到一个未定义的外部函数后，它会引入包含该函数定义的目标代码。(obj)。不幸的是，如果这个函数是在一个包含其它函数定义的源文件中被编译的话，那么这些函数也会被包含进来，你的可执行代码中将包含一些不需要的代码。因此，将库函数放到各自的源文件中是很重要的——否则会浪费宝贵的程序空间。有些编译程序包含特殊的“精明的”连接程序，这些连接程序能查出不需要的函数并去掉它们，从而使这些函数不再进入你的程序。

就算你 #include 的了，但是你没有引用的符号都不会编译进最终的可执行镜像中。 包括 .exe 和 .dll .  SDK 中包含所有的开发函数，最终的 .exe 只有你使用的函数。  所以，如果需要把一个没有使用的符号（函数和变量等等）编译进 exe 或者 dll 。 需要特殊的方式。


Question: 浮点数问题

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

引用 10 楼 user-3 的回复:[quote=引用 8 楼 lqbk1 的回复:]   如果一个浮点数是0，那他的二进制，十六进制也全是0才对吧。。。[/quote]  不好意思，刚刚16进制转2进制脑补的时候，头脑不清醒了  int main() { 	float f; 	unsigned char *p=(unsigned char *)&f; 	p[0] = 0x40; 	p[1] = 0xA0; 	p[2] = 0x00; 	p[3] = 0x00; 	printf("float value:%e, size:%d",f, sizeof(float)); 	return 0; } 以上代码看得清楚点....  二进制数据，关于那个值，二进制数据从高位到低位应该是 0000 0000 0000 0000 1010 0000 0100 0000 符号位是0，正的 指数部分是0，说明是非规约形式的浮点数，对应指数部分是2的-126次方 因此结果是  (pow(2,-8) + pow(2,-10) + pow(2,-17)) * pow(2,-126)   最终结果应该是5.74868682004613e-41

引用 8 楼 lqbk1 的回复:  如果一个浮点数是0，那他的二进制，十六进制也全是0才对吧。。。

#include<stdio.h> int main() { long int n;  printf("输入8位16进制数："); scanf("%x",&n); printf("%f\n",*((float*)&n)); return 0;  }

引用 5 楼 lqbk1 的回复:[quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 lqbk1 的回复:] [quote=引用 2 楼 user-3 的回复:] 对应的浮点数是多少？ 后23bit都是0，尾数是0 最后还是被解释成0的[/quote] 这个 是这么确定后两位就是表示浮点数的后两位的呀[/quote]  看https://zh.wikipedia.org/wiki/IEEE_754[/quote] 其实我的理解是：第一个bit是正负，2-9bit是指数位，剩下的23bit是数值

引用 5 楼 lqbk1 的回复:[quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 lqbk1 的回复:] [quote=引用 2 楼 user-3 的回复:] 对应的浮点数是多少？ 后23bit都是0，尾数是0 最后还是被解释成0的[/quote] 这个 是这么确定后两位就是表示浮点数的后两位的呀[/quote]  看https://zh.wikipedia.org/wiki/IEEE_754[/quote] 网络不给力访问不了呀，大概讲解下可好？

引用 4 楼 user-3 的回复:[quote=引用 3 楼 lqbk1 的回复:] [quote=引用 2 楼 user-3 的回复:] 对应的浮点数是多少？ 后23bit都是0，尾数是0 最后还是被解释成0的[/quote] 这个 是这么确定后两位就是表示浮点数的后两位的呀[/quote]  看https://zh.wikipedia.org/wiki/IEEE_754

引用 2 楼 user-3 的回复:对应的浮点数是多少？ 后23bit都是0，尾数是0 最后还是被解释成0的

引用 3 楼 lqbk1 的回复:[quote=引用 2 楼 user-3 的回复:] 对应的浮点数是多少？ 后23bit都是0，尾数是0 最后还是被解释成0的[/quote] 这个 是这么确定后两位就是表示浮点数的后两位的呀

int main() { 	float f; 	unsigned char *p=(unsigned char *)&f; 	p[0] = 0x40; 	p[1] = 0xa0; 	p[2] = 0x00; 	p[3] = 0x00; 	printf("float value:%f",f); 	return 0; }  想知道详情就请看https://en.wikipedia.org/wiki/IEEE_floating_point

对应的浮点数是多少？


Question: 489 - Hangman Judge，官网debug测试数据比较无异，ac不了显示wa。

思路很简单，把测试词组与猜测词组里的重复字母去掉，再一一比较，代码以下 #include <stdio.h> #include <string.h> char s[1000]; char s1[1100]; int main() { 	int n; 	int len, len1; 	int wrong, correct; 	int i, j, k; 	int flag = 0; 	while(scanf("%d", &n), n != -1) 	{ 		wrong = correct = 0; 		getchar(); 		 		fgets(s, sizeof(s), stdin); 		len = strlen(s); 		s[len-1] = s[len]; 		len --; 		for(i = 0; i < len - 1; i ++) 			for(j = i + 1; j < len; j ++) 				if(s[i] == s[j]) 					for(k = j; k <len; k ++) 						s[k] = s[k+1]; 		len = strlen(s); 		 		fgets(s1, sizeof(s1), stdin); 		len1 = strlen(s1); 		s1[len1 -1] = s1[len1]; 		len1 --; 		for(i = 0; i < len1 - 1; i ++) 			for(j = i + 1; j < len1; j ++) 				if(s1[i] == s1[j]) 					for(k = j; k <len1; k ++) 						s1[k] = s1[k+1];		 		len1 = strlen(s1);		 	 		for(i = 0; i < len1; i ++) 		{ 			flag = 0; 			for(j = 0; j < len; j ++)			 				if(s[j] == s1[i]) 				{ 					flag = 1; correct ++; break; 				} 			if(flag == 0) 				wrong ++; 			if(wrong >= 7 || correct >= len) 				break; 		} 		 		if(wrong >= 7) 			printf("Round %d\nYou lose.", n); 		else if(correct >= len) 			printf("Round %d\nYou win.", n); 		else 			printf("Round %d\nYou chickened out.", n);	 		printf("\n"); 	}	 	return 0; }  前两个大循环是分别去除两行字符串中重复的字母，最后一个是比较的


Question: 这个小代码总是运行不起来求大神

%s打印%c的字符，应该是越界了；char类型的数据输出应该是使用%c或%d输出

printf("%c",k);

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

%s是打印字符串的，%c的是单个字符的

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

第一条打印语句的格式控制%s改为%c


Question: 新人提问：关于C中结构体内变量的输出

我也是略懂，也知道弄个函数

结构体的水很深，坑很大！ 仅供参考：#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("AD sizeof %d\n", sizeof(AD));     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("A1 sizeof %d\n", sizeof(A1));     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("A2 sizeof %d\n", sizeof(A2));     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("A4 sizeof %d\n", sizeof(A4));     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("A8 sizeof %d\n", sizeof(A8));     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("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

没有直接打印出结构体的功能，c, java，pascal等好像都不行。

引用 2 楼 zhouxiaofeng1021 的回复:http://www.cnblogs.com/jssong20000/archive/2012/09/05/2672648.html 请参考！ 谢谢

引用 1 楼 cyfcsd 的回复:写一个对应的printStruct（Struct  s）函数不就可以了吗，你不就是想不用每次都写好多printf吗  谢谢了

引用 4 楼 paschen 的回复: #define PrintfStru  printf（”%x%x%x“,s.a,s.b,s.c);  //使用时： PrintfStru(s);    谢谢额  看来只能这样了。

自定义一个输出方法吧，没什么好的方式。

这个问题还是C#、Java类语言比较简单，用反射，动态得到变量名和变量类型 C和C++应该没有优雅的解决方案

只有非常巧合的时候，才好用这种方式， 最好还是定义宏 或者函数 输出结构

只能自己写个函数实现

C语言中应该没有，可以自己封装一个已知的结构体

自己封装一个函数 就可以啦~~~

C语言中没有办法。C++中倒是可以重载<<运算符，达到使用 cout << aObj; 整体输出的效果。 不过说白了，也是写一个函数。

只能写个函数，之后调用这个函数输出就行


Question: 给字符型指针赋值  char *p1 = NULL; P1 =100;

不能将int类型的值 分配到char*类型的实体

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

或者*p2 = p1;这样赋值也是正确的。  我要积分，快没有积分下载资源了啊啊啊啊啊。。。

一般不能这样做 除非缺失对地址为100的那个单元操作，这时也应该告诉编译器一声，比如 *p2 =(char *) 100; 否则就太粗暴了

引用 4 楼 ziranqiuzhi 的回复:[quote=引用 2 楼 qq423399099 的回复:] 不行，类型不匹配的。 同时注意在这里也不能用strcpy,因为p1指针指向NULL，不能向该地址进行写操作 传智播客C视频上，是这样写的 char *p1 = NULL ; char **p2 =NULL ; P2 = &P1 ; *P2 = 100 ;[/quote]  很明显*p2 = 100是错的。你这么看 （char*) p1: p1是char*的，代表p1是个地址，该地址指向1个char型变量 (char**)p2：p2是char**型的，代表p2是个地址，该地址指向一个地址（该地址的值是个指向char型变量地址） 所以最后应该是*p1 = 100;

引用 2 楼 qq423399099 的回复:不行，类型不匹配的。 同时注意在这里也不能用strcpy,因为p1指针指向NULL，不能向该地址进行写操作 传智播客C视频上，是这样写的 char *p1 = NULL ; char **p2 =NULL ; P2 = &P1 ; *P2 = 100 ;

引用 1 楼 qq_33696907 的回复:不能将int类型的值 分配到char*类型的实体 传智播客C视频上，是这样写的 char *p1 = NULL ; char **p2 =NULL ; P2 = &P1 ; *P2 = 100 ;


Question: 回文数的判断

#include <stdlib.h> #include <stdio.h> #include <string.h>  int backstr(char *src) {         int len=strlen(src);         int i = 0;         printf("%d\n", len);         for(i = 0; i <= len / 2; i++)         {                 printf("%c %c\n", src[i], src[len - 1 - i]);                 if(src[i] != src[len - 1 - i])                 {                         return 1;                 }         }         return 0; }  int main(int argc, char *argv[]) {         char *abc = "abcdedcba";         printf("%d\n", backstr(abc));         return 0; }

这是C语言，我用c-free编的。

#include <stdio.h> #include <string.h> #include<stdlib.h> #include<conio.h> int main() {  char str[20];  int i,b,c=0;     scanf("%s",str);     b=strlen(str);      for(i=0;i<strlen(str)/2;i++)      {         if(str[i]==str[b-1])           b--;                   else            c=1;                     }      if(c==1)      printf("不是回文");      else      printf("是回文");  getch();  return 0;  }

引用 3 楼 Labyrinth0825 的回复:[quote=引用 1 楼 user-3 的回复:] [code=c] bool IsPN(unsigned num 这里第一行就看不懂了。。这个是不是C++中的，C语言的话要怎么写  C/C++都行，第一个发的是判断一个数字，判断字符串看第二个

bool IsPN(unsigned num) { 	if(num==0) 		return true; 	unsigned n=num; 	unsigned tmp=0; 	while(num!=0) 	{ 		tmp*=10; 		tmp+=num%10; 		num/=10; 	} 	if(tmp==n) 		return true; 	else 		return false; }

如果要判断字符串：  http://blog.csdn.net/cbs612537/article/details/8217425


Question: 两个文件相互嵌套使用ifdef..endlf，产生的函数未定义问题

添加一个头文件，把你要用到的函数声明写在里面，然后在CPP中都包含这个头文件

@paschen  什么意思啊？能不能帮我改一下啊

什么意思啊？能不能帮我改一下啊

函数声明放在头文件里，函数实现放在源文件里，这样就只用包含头文件了  CPP文件本身就会参与编译，所以不要去包含

为什么不把声明放在头文件中，都include头文件

加一个regi-sign.h文件，把regi-sign.cpp中的函数和变量在regi-sign.h中声明下，在main。cpp中包含regi-sign.h文件 使用mian里面的结构体，在main.cpp中extern struct coust person[N],*perso,*coun,*pass; regi-sign.h中struct coust person[N],*perso,*coun,*pass;定义就行了


Question: win7下C语言不能单步跟踪调试

FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

升级win10 用vc无压力

win7下用vc6问题多多，有两个解决方法： 一、你可以到网上下载vc20XX的版本，只要比VC6版本高就行了 二、如果一定要使用VC6，可以下载虚拟机，在虚拟机里安装XP，在XP中再装VC6就可以了

可是现在只能用vc6.0

楼主用的啥ide啊？ 试试codeblocks

那就换个ide，学C不是非得VC


Question: 一小段C语言代码没看懂，请大家帮我解惑

其余的应该是在发送结束中断处理程序中完成的。 向SBUF中写入一个字节，启动发送过程。该字节发送结束后，产生中断。中断服务程序中继续后续一个字节的发送。接下来又是中断、发送、中断、发送……，最后一个字节发送出去后的中断，CPU就知道一包数据已经发送结束了。


Question: 谁有伪3D游戏的源码，分享下。

Wolf3D 好像类似的哪一款有源码的。


Question: C语言问题，在线等，急

item=flag*power(x,2*i)/fact(2*i) 这是什么意思？里面的2*i

每次重新计算阶乘和幂 都是低效的做法 如果是入门训练，还是可以的 如果是写程序，就不是好的做法了

0！=1; 这是规定 1！=1;这个不用说了  不过，这种做法，每次重新计算阶乘，效率很低

原来我做对了，谢谢

第一个空      for (i = 0, sum = 0.0, flag = 1; i < n; i++)     {         item = flag * power(x, 2 * i) / fact(2 * i);         sum += item;         flag = -flag;     } 第二个空     for (i = 1, product = 1.0; i <= n; i++)         product *= i; 第三个空     for (i = 1, pow = 1; i <= n; i++)         pow *= x;

引用 2 楼 qq423399099 的回复: #include<stdio.h>  void main() { 	int i, n, flag; 	double x, item, sum = 0.0;  	double fact(int n); 	double power(double x, int n);  	printf("输入一个正整数n和一个实数x:"); 	scanf("%d%lf", &n, &x); 	for(i = 0; i < n; i++) 	{ 		flag = (i % 2 == 0) ? 1 : -1; 		item = flag * power(x, 2 * i) / fact(2 * i); 		sum += item; 	} 	printf("cos(x)的近似值=%0.4f\n", sum); }  double fact(int n) { 	double product = 1.0; 	int i; 	for(i = 2; i <= n; i++) 		product *= i; 	return product; }  double power(double x, int n) { 	if(n == 0) 		return 1.0; 	double pow = x; 	int i; 	for(i = 1; i < n; i++) 		pow *= x; 	return pow; } 为什么阶乘那里从2开始，原来我就是错了这里

1乘以1还是1，所以从2开始就行了

#include "stdio.h" void main() { 	int i,n,flag; 	double x,item,sum; 	double fact(int n); 	double power(double x,int n); 	printf("输入一个正整数n和一个实数x："); 	scanf("%d%lf",&n,&x); 	flag=1; 	for(sum=0,i=0;i<n;i++){ 		item=flag*power(x,2*i)/fact(2*i); 		flag=-flag; 		sum=sum+item; 	} 	printf("cox(x)的近似值=%0.4f\n",sum); } double fact(int n) { 	double product; 	int i; 	for(product=1,i=2;i<=n;i++){ 		if(i==0)product=1; 		else product=product*i; 	} 		  	return product; } double power(double x,int n) { 	double pow; 	int i; 	for(pow=1,i=0;i<=n;i++){ 		if(i==0) pow=1; 		else pow*=x;} 	return pow; }我的原程序

没想出来啊，大神帮帮忙啊


Question: 多重背包问题，输入正常数据，出现逻辑错误，求解答

上面的程序有点乱，这个是有问题的程序，麻烦大神帮忙解决一下 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int Max(int a, int b); void Zero_One_package(int *Max_value, int weight, int value, int volume); void Complete_package(int *Max_value, int weight, int value, int volume); int Multi_package(); void main() { 	int Max_V = Multi_package(); 	printf("%d", Max_V); 	system("pause"); } int Max(int a, int b) { 	return a >= b ? a : b; } void Zero_One_package(int *Max_value, int weight, int value, int volume) { 	for (int i = volume; i >= weight; i--) 	{ 		Max_value[i] = Max(Max_value[i], Max_value[i - weight] + value); 	} } void Complete_package(int *Max_value, int weight, int value, int volume) { 	for (int i = weight; i <= volume; i++) 	{ 		Max_value[i] = Max(Max_value[i], Max_value[i - weight] + value); 	} } int Multi_package() { 	int num, volume; 	scanf("%d%d", &num, &volume); 	int *weight = (int *)malloc(sizeof(int)*num); 	int *value = (int *)malloc(sizeof(int)*num); 	int *number = (int *)malloc(sizeof(int)*num); 	int *Max_value = (int*)malloc(sizeof(int)*(num + 1)); 	for (int i = 0; i < num; i++) 	{ 		scanf("%d%d%d", &weight[i], &value[i], &number[i]); 	} 	for (int i = 0; i <= volume; i++) 	{ 		Max_value[i] = 0; 	} 	for (int i = 0; i < num; i++) 	{ 		if (number[i] * weight[i] >= volume) 		{ 			Complete_package(Max_value, weight[i], value[i], volume); 		} 		else 		{ 			int ncount = number[i]; 			int k = 1; 			while (ncount > k) 			{ 				Zero_One_package(Max_value, k*weight[i], k*value[i], volume); 				ncount -= k; 				k *= 2; 			} 			Zero_One_package(Max_value, ncount*weight[i], ncount*value[i], volume); 		} 	} 	return Max_value[volume]; }

没看懂啊，按照你说的试了下，结果没啥变化啊，这应该是一个检查错误的程序吧，我是个新手

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中


Question: 不能返回正确值，请帮忙看看！

谢谢大家，终于解决了，一个是比较字符串是否相等，应该用strcmp，而不是==运算符，另外是调用时参数的设置要对。

return 1，你多加了对单引号

就是从表格控件里获取账号 服务区，要将它转化为整数

谢谢赵老师了，请帮我看看哪里出问题了，试了两天了

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

void CrxmanagerDlg::OnBnClickedButtonAutologin() { 	// TODO: 在此添加控件通知处理程序代码 	vtLogInfo.clear(); 	TLOGININFO tLoginInfo; 	BOOL bRebf = FALSE; 	for (int niStartId = 0;niStartId < m_MyEditListCtrl.GetItemCount();niStartId++) 	{ 		BOOL bRef = FALSE; 		bRef = m_MyEditListCtrl.GetCheck(niStartId); 		if (bRef == TRUE) 		{ 			strcpy_s(tLoginInfo.szUserL, m_MyEditListCtrl.GetItemText(niStartId, 1)); 			strcpy_s(tLoginInfo.szPassWordL, m_MyEditListCtrl.GetItemText(niStartId, 2)); 			strcpy_s(tLoginInfo.szBigPartL, m_MyEditListCtrl.GetItemText(niStartId, 3)); 			strcpy_s(tLoginInfo.szServerL, m_MyEditListCtrl.GetItemText(niStartId, 4)); 			strcpy_s(tLoginInfo.szLineL, m_MyEditListCtrl.GetItemText(niStartId, 5)); 			strcpy_s(tLoginInfo.szRoleL, m_MyEditListCtrl.GetItemText(niStartId, 6));  			MyDbg("%d\n", GetServerID(tLoginInfo.szServerL)); 			tLoginInfo.niServer = GetServerID(tLoginInfo.szServerL); 			tLoginInfo.niLine = GetLineID(tLoginInfo.szLineL); 			tLoginInfo.niRole = GetRoleID(tLoginInfo.szRoleL); 			/*tLoginInfo.niLine = GetLineID(tLoginInfo.szLineL); 			tLoginInfo.niRole = GetRoleID(tLoginInfo.szRoleL);*/ 	 			/*MyDbg("%d,%d,%d\n", tLoginInfo.niServer, tLoginInfo.niLine, tLoginInfo.niRole); 			MyDbg*/("%s,%s,%s,%s,%s,%s\n", tLoginInfo.szUserL, tLoginInfo.szPassWordL, tLoginInfo.szBigPartL, tLoginInfo.szServerL, tLoginInfo.szLineL, tLoginInfo.szRoleL); 			vtLogInfo.push_back(tLoginInfo);  		}  	}  	  }

楼主贴一下是怎么调用的

比较字符串是否相等，应该用strcmp，而不是==运算符

杀菜鸟的脑细胞了，就是要从字串返回个整数，想了好几种方法都不对，求大神指点！

int GetServerID( char  *szFuWu) { 	if (strcmp(szFuWu, "魔神")==0 ) 	{ 		return 1; 	} 	 	else if (strcmp(szFuWu, "狂龙降天") == 0) 	{ 		return  1; 	} 	else if (strcmp(szFuWu, "幻影密路") == 0) 	{ 		return  2; 	} 	 } 测试了还是不对，Game:幻影密路,1                                 Game:狂龙天降,1 返回值都为 1

int GetServerID( char  *szFuWu) {     if (szFuWu == "魔神") { return 1;  } else if (szFuWu == "龙争虎斗") { return 2; } else if (szFuWu == "冰宫") { return 3; } else if (szFuWu == "雪原") { return 4; } return 0; }

引用 5 楼 qq423399099 的回复:字符串要用strcmp比较++

参数使用 char const *, 比较实用 strcmp

引用 6 楼 yuelengdihai 的回复:你代码每次都执行到return 0；这句  返回值都是0  else {   return 0; }  错了

字符串要用strcmp比较

if (szFuWu = "魔神") 这里少了一个=

int GetServerID( char  *szFuWu) {     if (szFuWu == "魔神") { return '1';  } else if (szFuWu == "龙争虎斗") { return 2; } else if (szFuWu == "冰宫") { return 3; } else if (szFuWu == "雪原") { return 4; } return 0; }

写上了也没正确的返回值