Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 基于windows.h的c语言，编译正确，链接失败，大神们看过来吧

回复:
user: user-1
content: WndProc这个函数你没写,链接器找不着,问题就出在这 CreateWindow后要ShowWindow然后要UpdateWindow才能显示出来

user: user-2
content: 引用 8 楼 s1070 的回复:首先感谢赵大神老师 我把您给出的WndProc函数的代码写进去，链接就不报错了   可是执行的过程中，并没有窗口弹出啊 还得麻烦赵大神老师给解释一下  没写过实际项目的小菜鸟 谢过了 消息循环加了吗？

user: user-3
content: 你没有实现 WndProc 这个函数，当然链接不上，要链接上了，那真是太阳从西边出来，黄河水倒流。

user: user-0
content: 首先感谢赵大神老师 我把您给出的WndProc函数的代码写进去，链接就不报错了   可是执行的过程中，并没有窗口弹出啊 还得麻烦赵大神老师给解释一下  没写过实际项目的小菜鸟 谢过了

user: user-2
content: 楼主代码中既没有消息循环，也没有窗口过程。 赵老师的代码中既有消息循环，也有窗口过程。

user: user-0
content: 现在的工程就是Win32 Application 而非Win32 Console    不是这个问题导致的

user: user-0

user: user-0
content: “连接器里面有没有kernel32.lib user32.lib gdi32.lib，没有的话手动填一下" 这个在哪里设置？   VC6+Win7

user: user-4
content: 赵老师手速真快啊。  看看你项目的属性，连接器里面有没有kernel32.lib user32.lib gdi32.lib，没有的话手动填一下

user: user-2
content: 仅供参考#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=(HFONT)SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

user: user-2
content: 新建、项目、Win32 Application（而非Win32 Console）、……
user-0 提问: 新手遇到一个c的小问题，求解惑！！！

回复:
user: user-0
content: 谢谢，明白了

user: user-1
content: for（i=0;i<10;i++） scanf("%c",&s[i])；不会在输入结束后一位加上\0,如同int,double,float一样 scanf("%s",s)；在遇到空白符（包括回车、空格、制表符等）停止输入，在后一位加上\0，你说的已经输入10个字符，那已经越界了，C语言不作越界检查，可能有危险 用gets函数更好，可以输入空格，同时fgets还限制长度
user-0 提问: C语言---结构体的指针 

回复:
user: user-1
content: 楼主还是基础知识不行，我只说一个 引用scanf("%s",student->name);//为什么这里的name不需要使用“&”？？？ 楼主要知道，平时输入时为什么要加&啊，这个可以理解为取地址的意思  关于结构体和指针，楼主可以看看——http://blog.csdn.net/u012421456/article/details/24916791 http://blog.csdn.net/u012421456/article/details/20296865

user: user-0
content: 引用 6 楼 xiao_huocai 的回复:是这样的，结构体是一种构造类型。 你的第一个问题struct stu *student;//这个如何去理解？ 这就是定义了一个指针是你定义类型的指针，（和基类型差不多，可以想象定义int类型的指针不就是int* a;么) 第二个问题scanf("%s",student->name);//为什么这里的name不需要使用“&”？？？ 肯定不要啊，你想name是一个数组就是表示地址常量啊， 比如 char a[10]; scanf("%s",a);/*你这里会用&a么？*/ 谢谢你啊，受教了~~~

user: user-2
content: 是这样的，结构体是一种构造类型。 你的第一个问题struct stu *student;//这个如何去理解？ 这就是定义了一个指针是你定义类型的指针，（和基类型差不多，可以想象定义int类型的指针不就是int* a;么) 第二个问题scanf("%s",student->name);//为什么这里的name不需要使用“&”？？？ 肯定不要啊，你想name是一个数组就是表示地址常量啊， 比如 char a[10]; scanf("%s",a);/*你这里会用&a么？*/

user: user-3
content: 结构体类型还是类型

user: user-4
content: 基础不扎实，建议去看看书

user: user-5
content: struct stu *student;//定义结构体指针 student=malloc(sizeof(struct stu));//给指针分配空间 printf("Input name,number,year,month,day:/n"); scanf("%s",student->name);//为什么这里的name不需要使用“&”？？？char name[20];name是字符数组，数组名就是数组的首地址，不再用取地址符号&

user: user-6
content: A->B 等价于 (*A).B

user: user-7
content: 1 结构体指针和一般的指针没啥区别，都是指针 2 搜下“数组名和指针的联系”
user-0 提问: C语言在VS2013中关于函数调用的问题！

回复:
user: user-1
content: #pragma warning(disable:4996)

user: user-2
content: scanf_s("%c", &j,1);好像要加上读入的长度，我是新手具体不也不清楚，不过加上口程序就可以运行了

user: user-3
content: 以字符的形式输出就是输出了\n，就是换行啦
user-0 提问: 菜鸟求助：反转单链表（c语言）

回复:
user: user-1
content: int main() {     struct node *ptr;     ptr = NULL;      insert( &ptr, 1 );     insert( &ptr, 2 );     insert( &ptr, 3 );     insert( &ptr, 4 );     insert( &ptr, 5 );        converse( &ptr );     while( ptr )     {         printf("%d\n", ptr->key );         ptr = ptr->link;     }      return 0; } int main() {     return 0; } 你main函数 返回值 什么都不写  有的编译器要检查的 有的编译器则不用

user: user-2
content: 楼主可以参考这篇博文，我感觉将单链表逆序挺好的~~~ http://blog.csdn.net/autumn20080101/article/details/7607148

user: user-3
content: #include <stdio.h> #include <stdlib.h>  struct node { 	int key; 	struct node *link; };  void insert( struct node **ptr, int num ); //void converse( struct node **head );  void insert( struct node **ptr, int num ) { 	if( *ptr == NULL ) 	{ 		*ptr = (struct node *)malloc( sizeof(struct node ) ); 		(*ptr)->key = num; 		(*ptr)->link = NULL;  	} 	else 	{ 		insert( &( (*ptr)->link ), num ); 	}  }  struct node * converse( struct node **head ) { 	struct node *cur,*next, *tmp;  	cur = (*head); 	next = cur->link; 	cur->link = NULL;  	for( ; next->link != NULL; cur = next, next = tmp) 	{ 		tmp = next->link; 		next->link = cur; 		printf("cur=[%d]\n", cur->key ); 	} 	tmp->link = cur;  	return tmp; }  void print(struct node *ptr) { 	struct node *tmp;  	for(tmp = ptr; tmp != NULL; tmp=tmp->link) 	{ 		printf("%d\n", tmp->key ); 	}  }  main() { 	struct node *ptr; 	ptr = NULL;  	insert( &ptr, 1 ); 	insert( &ptr, 2 ); 	insert( &ptr, 3 ); 	insert( &ptr, 4 ); 	insert( &ptr, 5 );  	print(ptr); 	ptr = converse(&ptr); 	print(ptr); 	 }

user: user-4
content: 编译不通过的话，把编译错误贴上来啊。

user: user-5
content: http://bbs.csdn.net/topics/390878209

user: user-6
content: 什么叫反转单链表？

user: user-0
content: 引用 1 楼 u011779875 的回复: int main() {     return 0; } 主函数呢 一下就是所有内容，麻烦大神帮忙看下什么问题好么  #include <stdio.h> #include <stdlib.h>  struct node { 	int key; 	struct node *link; }; void insert( struct node **ptr, int num ); void converse( struct node **current );  void insert( struct node **ptr, int num ) { 	if( *ptr == NULL ) 	{ 		*ptr = (struct node *)malloc( sizeof(struct node ) ); 		(*ptr)->key = num; 		(*ptr)->link = NULL; 		 	} 	else 	{ 		insert( &( (*ptr)->link ), num ); 	} 	 }  void converse( struct node **current ) { 	struct node *pre,*next; 	pre = next = NULL; 	pre = *current; 	(*current) = (*current)->link; 	 	while( (*current)->link != NULL ) 	{ 		next = (*current)->link; 		(*current)->link = pre; 		pre = (*current); 		(*current) = next; 		 	} 	*current = pre; }  main() { 	struct node *ptr; 	ptr = NULL; 	 	insert( &ptr, 1 ); 	insert( &ptr, 2 ); 	insert( &ptr, 3 ); 	insert( &ptr, 4 ); 	insert( &ptr, 5 ); 	 	 	 	converse( &ptr ); 	while( ptr ) 	{ 		printf("%d\n", ptr->key ); 		ptr = ptr->link; 	} 	 }

user: user-1
content: int main() {     return 0; } 主函数呢
user-0 提问: 求教swig定义函数问题

回复:
user: user-1
content: 定义一变量接受返回值。

user: user-2
content: a.h文件 int func1();   a.c文件 int func1(){ return 2; }  Def_Wrapper.cpp 文件  #include<a.h> int main() {     fun1();     return 0; }
user-0 提问: 请教各位C语言高手，用gdb调试，发现下面的内容出现段错误，但是不知道在哪里出错

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 赵老师正解， bt     Backtrace: display the program stack.

user: user-2
content: 使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。

user: user-3
content: 代码乱 取名乱 加上代码标签 问问题的时候 问问题描述不清 代码不全 问题也没精简之后在问  别人还要理解你程序的流程 那能回答的人得多无聊  。  段错误跟这些比起来 相对来说不是重要的 再者 新手就玩gdb 不如弄个IDE调试  不要向往用gdb的大神 他们只存在传说中 。简单问题复杂化不是新手要思考的问题。
user-0 提问: 一个简单的C语言问题？

回复:
user: user-1
content: 引用 4 楼 Yick__ 的回复:[quote=引用 2 楼 shenimenyilian 的回复:] if(( i<8 && i&0x1) || (i<13 && !(i&0x1))) 小于8全是单数 大于8小于13全是偶数很完美！[/quote] 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-2
content: 楼主还想多简单啊

user: user-3
content: int month [] = { 1, 3, 5, 7, 8, 10, 12 };用一个循环来判断

user: user-4
content: switch case?

user: user-5
content: 引用 1 楼 user-8 的回复:判断每个月几天直接打个数组就行++ 判断好闰年，然后直接查表就好

user: user-6
content: 引用 2 楼 shenimenyilian 的回复:if(( i<8 && i&0x1) || (i<13 && !(i&0x1))) 小于8全是单数 大于8小于13全是偶数很完美！

user: user-7
content: i 应该声明成unsigned int

user: user-7
content: if(( i<8 && i&0x1) || (i<13 && !(i&0x1))) 小于8全是单数 大于8小于13全是偶数

user: user-8
content: 判断每个月几天直接打个数组就行
user-0 提问: 用malloc函数开辟二维数组的问题

回复:
user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h>   void** malloc2d(int rows, int cols, int size) {   printf("%d\t%d\t%d\n",rows,cols,size);   int j;   int rowSize = cols * size;   int indexSize = rows * sizeof(void *);   void **a = (void **) malloc(indexSize + rows* rowSize);   char *dataStart = (char *) a + indexSize;   for(j = 0; j < rows; j++){       printf("%d\n",j);     a[j] = dataStart + j * rowSize;   }   return a; }   int main(){     int i,rows,cols,row,col;     rows = cols = 40400;     row = 3;col = 2;     int** block1 = (int**)malloc2d(row,col,sizeof(int));     printf("end of block1,begin of block2\n");     int** block2 = (int**)malloc2d(rows,cols,sizeof(int));     free(block1);     free(block2);     return 0; } 数字太大，分配内存失败

user: user-2
content: 用文件读写模拟内存读写。参考_lseeki64函数。

user: user-3
content: malloc(indexSize + rows* rowSize); 40400 * 4 + 40400 * 4 * 40400 //这得有多大， 哪里有这么多内存让你申请和释放

user: user-4
content: 恐怕你分配的内存大小已经超出了一个进程用户可用内存的大小了
user-0 提问: vs2013 编c程序 Error ，求帮忙  谢谢

回复:
user: user-1
content: 你这个是文件没有编译进去啊，可能是工程本身就没有这个文件

user: user-2
content: http://www.easyx.cn

user: user-3
content: 引用 楼主 fengyunoo 的回复:帮忙：  错误	1	error C1083: 无法打开包括文件: “graphics.h”: No such file or directory 其实引用一下就知道有回复了  这个不太清楚，应该还是同样的问题，VS中没有graphics.h 楼主如果非要使用，可以去搜一下easyx。  平时也可以来这个地方看看——http://msdn.microsoft.com/zh-cn/library/t9ac52dx%28v=vs.90%29.aspx

user: user-3
content: graphics.h是TC里面的图形库，如果要用的话应该用TC来编译，VS有它自己的另外图形库。 http://baike.baidu.com/link?url=0j1pcKGhgFWzRlYAXPtzmqMksB3_HC7RpAKPhBy2v-sLco0vZ9RbpxQd9YBuv8HoN1Jn1TiuEJb1vE92PH_gkq

user: user-4
content: 百度下 看看 graphics.h 是哪儿的，然后添加到自己的工程中
user-0 提问: 实现strsep出现段错误

回复:
user: user-0
content: 发的有点急，没看格式，谢谢楼上两位，懂了

user: user-1
content: 代码太乱了 格式都不加  char *s = "qwertyoui/=asdfghjkl"; 只读 不可以修改 s[-1] = 0;  char s[] = "qwertyoui/=asdfghjkl"; 可读可修改

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: TC30没用熟，应该怎么退出正在进行的程序？

回复:
user: user-1
content: Ctrl+Break

user: user-2
content: 从程序中退出的话遥控程序是怎么写的了，常见的有按Esc，Enter，ctrl+d，输入q按回车等等

user: user-3
content: ctrl+break或ctrl+z
user-0 提问: 问个预处理的问题

回复:
user: user-1
content: 不结帖的同学不是好经理。

user: user-2
content: #include<stdio.h> #include<stdlib.h>  #define PRINT_VAR(fmt, var) printf(#var " = "#fmt, var)  int main(int argc, char *argv[]) {     int aa = 5;     int bb = 6;     int cc = 7;      PRINT_VAR("%d", aa);      return 0; }

user: user-3
content: #define NAME(x) #x

user: user-4
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-0
content: 我的意思是printf("%d\n",NAME("aa"))也会输出5

user: user-5
content: "%s\n","NAME(aa)"     后面也加引号？

user: user-6
content: #include<stdio.h> #include<stdlib.h> #define NAME(x) #x  int main(){ int aa = 5; int bb = 6; int cc = 7; printf("%s\n",NAME(aa));//这里的预处理中的aa我想改成"aa"字符串类型  如何修改呢？？？ } 你想这样？
user-0 提问: 空间、指针的释放

回复:
user: user-0
content: 引用 6 楼 wuhailin1987 的回复:#include <stdio.h> #include <stdlib.h> int main() { 	int len = 5; 	char *array = (char *)malloc( len*sizeof( char ) ); 	int i; 	for (i = 0; i < len; i++) 	{ 	/*something to do with array*/ 		printf("%d\t", array[i]); // 用数组来做 	} 	printf("\n"); 	free(array); 	return 0; } 对不住啊，刚才引用失误了... 数组确实有效

user: user-0
content: 引用 7 楼 dbzhang800 的回复:[quote=引用 5 楼 zcppacers 的回复:] 谢谢！ free的机制是认的申请地址的首位么？还是说必须是指定的某个变量+初始位置？因为我又试了下用一个中间的指针变量  char *tmp = array; ....../*中间还是对array进行操作*/ free(tmp); tmp=NULL;  这样就不行  你怎么判断的不行？[/quote] 因为报错...

user: user-0
content: 引用 6 楼 wuhailin1987 的回复:#include <stdio.h> #include <stdlib.h> int main() { 	int len = 5; 	char *array = (char *)malloc( len*sizeof( char ) ); 	int i; 	for (i = 0; i < len; i++) 	{ 	/*something to do with array*/ 		printf("%d\t", array[i]); // 用数组来做 	} 	printf("\n"); 	free(array); 	return 0; } 因为报错...

user: user-1
content: free(array-len);

user: user-2
content: 很多内存是这么管理的 [alloc struct][block alloc for use ] 在分配的内存块前面，设置一个数据结构， 记录已经分配的内存相关的数据 free(p) 的时候在p前面，找到这个 结构，把这块内存回收， 记录为未分配的内存，以便以后可以重新分配 当然，也可以利用数组，链表记录已经分配的内存位置 总之，已经分配的内存的地址，是有个数据结构记录的 free 可以凭借当初分配的那个地址值， 查到分配时候的记录，然后回收这块内存，以便重新利用  如果 p 这个值丢失了，你就无法主动释放了。 如果这个值改变了，free一个改变的值， 查找就会发生错误，free函数 出错， 甚至造成内存分配记录出错， 以后的再分配内存就会出错。

user: user-0
content: 引用 4 楼 sholber 的回复:一般来说是没有办法的。但就你这个程序本身而言，还是有办法的： int len = 5; char * array = (char *) malloc ( len * sizeof (char ) ); int i; for (i = 0; i < 5; i ++) {     array ++;     /*something to do with array*/     printf ("%d\t", array); } printf ("\n"); printf ("%d\n", array); free (array - len);     //或者free (array-i); array = NULL; 谢谢！ free的机制是认的申请地址的首位么？还是说必须是指定的某个变量+初始位置？因为我又试了下用一个中间的指针变量  char *tmp = array; ....../*中间还是对array进行操作*/ free(tmp); tmp=NULL;  这样就不行

user: user-3
content: 引用 5 楼 zcppacers 的回复:谢谢！ free的机制是认的申请地址的首位么？还是说必须是指定的某个变量+初始位置？因为我又试了下用一个中间的指针变量  char *tmp = array; ....../*中间还是对array进行操作*/ free(tmp); tmp=NULL;  这样就不行  你怎么判断的不行？

user: user-4
content: #include <stdio.h> #include <stdlib.h> int main() { 	int len = 5; 	char *array = (char *)malloc( len*sizeof( char ) ); 	int i; 	for (i = 0; i < len; i++) 	{ 	/*something to do with array*/ 		printf("%d\t", array[i]); // 用数组来做 	} 	printf("\n"); 	free(array); 	return 0; }

user: user-5
content: 一般来说是没有办法的。但就你这个程序本身而言，还是有办法的： int len = 5; char * array = (char *) malloc ( len * sizeof (char ) ); int i; for (i = 0; i < 5; i ++) {     array ++;     /*something to do with array*/     printf ("%d\t", array); } printf ("\n"); printf ("%d\n", array); free (array - len);     //或者free (array-i); array = NULL;

user: user-6
content: 引用 2 楼 TJF331311545 的回复:array ++;     在把他减回去？  输出可以用下标法

user: user-7
content: array ++;     在把他减回去？

user: user-8
content: 除非你能把指针还原，否则保存原始地址是跑不了的
user-0 提问: 关于指针指向的问题

回复:
user: user-1
content: 补充一下，实参只是传递一份拷贝给函数，你对一份拷贝的数据操作，函数调作完了就释放掉了，实参的值没有改变，所以达不到你的目的

user: user-1
content: 函数是值传递，虽然你函数的参数是指针，但是你只修改了函数的参数（也就是你传递的指针），这样是没有效果的，就像你传递两个整型值进去操作一样。

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

user: user-3
content: 应为  void swap(int *p1,int *p2) {     int temp;     temp = *p1;     *p1 = *p2;     *p2 = temp; }  上面的 p1, p2 是 a, b 的地址。在 swap 函数里面要获取到 a, b 的值用 *p1 和 *p2。 平时的指针作为参数实质上还是参数复制的形式，只是复制的是变量的地址，我们在函数里面可以通过 * 操作符获取对应的变量。

user: user-4
content: 你在函数里面交换的是指针，而不是指针的内容，也就是没有交换数值 试试  { int t; t=*p1; *p1=*p2; *p2=t; }

user: user-5
content: 因为你只是置换了两个参数里面的地址，而没有置换两个传进的两个指针里面的地址

user: user-6
content: 函数写错了，应该这样 void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; }
user-0 提问: 输入一个数，将这个数分解成几个数相加的形式输出

回复:
user: user-1
content: #include <stdio.h>  int main() {     int iNum = 0;     int nFive = 0, nRest = 0;     int i = 0;     while (true)     {         printf("Enter a number(0 to exit):\n");         scanf("%d", &iNum);         if (0 == iNum)         {             break;         }          printf("%d=", iNum);          nFive = (iNum - 1) / 5;         for (i = 0; i < nFive; i++)         {             printf("%d+", 5);         }         nRest = iNum - nFive * 5;         printf("%d+%d\n", nRest - 1, 1);     } }

user: user-2
content: 仅供参考： //求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案 #include <stdio.h> int Begin,End,Sum; int j; int o[1000]; long n; void combsum(int b,int e,int s,int d) {     int i;      if (e>s) e=s;     for (i=e;i>=b;i--) {         if ((i+b)*(i-b+1)/2<s) break;         o[d]=i;         if (s-i<=0) {             n++;             printf("%8ld:",n);             for (j=0;j<=d;j++) printf("%d ",o[j]);             printf("\n");         } else {             if (d+1<1000) combsum(b,i-1,s-i,d+1);             else {                 printf("Error:Too deep.\n");                 return;             }         }     } } int main() {     printf("Input Begin,End,Sum:");fflush(stdout);     scanf("%d,%d,%d",&Begin,&End,&Sum);     n=0L;     combsum(Begin,End,Sum,0);     printf("Total:%ld\n",n);     return 0; }
user-0 提问: 究竟错在哪里！！！！

回复:
user: user-1
content: 爆什么错 是WA 还是PE

user: user-2
content: 修改下。  #include <stdio.h> #include <math.h> double get_c_length(float x1,float y1,float x2,float y2) {   float tmp1,tmp2;   tmp1=abs(x2-x1);   tmp2=abs(y2-y1);     if(tmp1==0 && tmp2==0 ){   	return 0;   }else  if(tmp1==0){ 	return tmp2;      }else if(tmp2==0){ 	return tmp1;    }else{  	return sqrt(tmp1*tmp1+tmp2*tmp2);   } }  int main(){     double x1, y1, x2, y2, ans;     while(scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2)!=EOF)    {                  printf("%.2lf\n",get_c_length(x1,y1,x2,y2));    }    return 0; }

user: user-2
content: 要对用户输入的各种情况考虑，就好比盖房子，不能只关注门，还得关注房子的墙，屋顶，等等。

user: user-2
content: 我调整了下，你运行看看  #include <stdio.h> #include <math.h> double get_c_length(float x1,float y1,float x2,float y2) {   float tmp1,tmp2;   tmp1=abs(x2-x1);   tmp2=abs(y2-y1);     if(tmp1==tmp2){   	return 0;   }else  if(tmp1==0){ 	return tmp2;      }else if(tmp2==0){ 	return tmp1;    }else{  	return sqrt(tmp1*tmp1+tmp2*tmp2);   } }  int main(){      double x1, y1, x2, y2, ans;    while(scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2)!=EOF)    {                  printf("%.2lf\n",get_c_length(x1,y1,x2,y2));    }    return 0; }

user: user-3
content: 按格式用x1,y1，这样就不容易搞错了  #include <stdio.h> #include <math.h> int main() {     double x1, y1, x2, y2, ans;       while(scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2)!=EOF)     {         ans = sqrt((x1 - x2)*(x1 - x2)+(y1 - y2)*(y1 -y2));         printf("%.2lf\n",ans);     }     return 0; }

user: user-4
content: 错误时啥？咋不描述错误呢！

user: user-1
content: 应该是(a-c)*(a-c)+(b-d)*(b-d)开根号
user-0 提问: 小问题，新手求教

回复:
user: user-1
content: 多个分号，表示该while循环不执行或者说执行的是空语句， 当n已经变成3后，3<=2不成立，则会再次执行一下n++，所以。。。

user: user-2
content: 多个分号他就是一个独立的语句了。 加分号相当于  while(n++<=2) {  } printf("%d\n",n);   不加分号相当于  while(n++<=2) { printf("%d\n",n); }
user-0 提问: 如何修改#define 定义的常量中的参数

回复:
user: user-1
content: 上面的“以数组为例 ”注释 实际上不是这个程序的

user: user-1
content: #include <stdio.h>  #define name(i) (#i)  void printwithoutret(char *v_name,int v_value) { 	printf("%s=%d\n",v_name,v_value); }  char* printwithret(int * v_back) { 	int d = 4;  	*v_back = d;  	return name(d);//你可以把这个地址strcpy到一个堆上  	               //意义不大 } int main(void) { 	//我以数组为例 	int a=1,b=2,c=3;     char *p; 	int e; 	int *x= &e; //第一种 直接打印 变量名=变量值     printf("%s=%d\n",name(a),a); //第二种 使用字符指针保存变量名 打印 	p = name(b); 	printf("%s=%d\n",p,b); //第三种 将这个字符指针传递到子函数里面打印 	p = name(c); 	printwithoutret(p,c); //第四种 接收子程序传来的变量名 然后打印 	p = printwithret(x); 	printf("%s=%d\n",printwithret(x),*x); 	return 0; }

user: user-2
content: #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC

user: user-0
content: #define varname(x)  #x    能解释一下这句么  #x代表？？？？

user: user-3
content: 一旦写成函数，则函数实参的变量名，就不能得到了 唯一的办法是写成宏 可以为 函数定义一个宏 ，用宏来调用函数，这样就可以传递 变量名了

user: user-3
content: #define varname(x)  #x  #define print_int(a)  printf("%s =%d",varname(a),(a))  print_int(a); print_int(b); print_int(c);

user: user-4
content: 说得糊里八涂的。你的意思就是传入字符串呗： void f (const char *); /* …… */ f ("name"); f ("gender"); f ("age"); 语文太差了，现代的大学生们！

user: user-5
content: 脑子是个好东西，希望你也有

user: user-4
content: 即使你觉得自己有，也不一定真有。自负是共性。

user: user-6
content: 楼主想问的是使用 const 定义常量？
user-0 提问: libcurl发送post方式的json串出现“Unsupported Media Type”

回复:
user: user-1
content: 我现在也在是项目需要：c  http client端 目前也是用curl 实现POST  json到服务器端，也需要这个完成源码，谢谢我的QQ邮箱是 455738018@qq.com   我的问题卡在拼这个jsom数据的时候，是写死的一个json串  ，不够灵活，以后不方便扩展，想知道你是怎么实现的？ 方便的话，希望你把源码也发我一份参考下 谢谢！

user: user-2
content: 您好，请问完整代码能否发我看看，我是新手，这方面完全不懂，现在做项目又需要，谢了啊！379014829@qq.com

user: user-3
content: 引用 6 楼 jk110333 的回复:[quote=引用 4 楼 wanguser-3 的回复:] 1、HTTP头部不是这么加的，应该是这样：  headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8"); headers = curl_slist_append(headers, tmp);  2、遇到这种问题你先抓包看一下你发出去的是什么样的包，用HttpAnalyzer就可以。 多些哥们  测试成功！！！！ 哈哈   学习下你的HttpAnalyzer[/quote]

user: user-0
content: 引用 4 楼 wanguser-3 的回复:1、HTTP头部不是这么加的，应该是这样：  headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8"); headers = curl_slist_append(headers, tmp);  2、遇到这种问题你先抓包看一下你发出去的是什么样的包，用HttpAnalyzer就可以。 多些哥们  测试成功！！！！ 哈哈   学习下你的HttpAnalyzer

user: user-0
content: 引用 4 楼 wanguser-3 的回复:1、HTTP头部不是这么加的，应该是这样：  headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8"); headers = curl_slist_append(headers, tmp);  2、遇到这种问题你先抓包看一下你发出去的是什么样的包，用HttpAnalyzer就可以。  马上测试你的方法   多些哥们回复！

user: user-3
content: 1、HTTP头部不是这么加的，应该是这样：  headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8"); headers = curl_slist_append(headers, tmp);  2、遇到这种问题你先抓包看一下你发出去的是什么样的包，用HttpAnalyzer就可以。

user: user-0
content: 代码我都发上来了！ 大家看看    有没有遇见这些问题的！

user: user-0
content: ciao  还没有人帮忙！

user: user-0
content: 有兄弟帮忙下吗？
user-0 提问: 函数的设计

回复:
user: user-1
content: int recvdata(char *a) {     char *p=a;     while(*p)     {         if(*p=='\r'&&*(p+1)=='\n')  return p-a;         p++;     }     return 0; }

user: user-2
content: 是这样吗   int recvdata(char *a) {     char ch,*p=a;     while((ch=getchar())!=EOF){         if(ch=='\r' || ch=='\n') break;         *p++ =ch;     }     *p ='\0';     return p-a; }

user: user-3
content: int receiveData(unsigned char * a) {      unsigned char * p = a;      while ((* (a ++)) != '\n' && (* (a ++) = getData ()) != '\r') ;      * (a -= 2) = 0;      return a - p; }

user: user-4
content: 你程序写的就是这个啊。你要做啥？？你可以调试
user-0 提问: 【求助】如何修改char*指向的常量字符串

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:关键是常量字符串不放在栈，放在不可修改的内存页上。所以你还是别修改了 谢谢

user: user-1
content: 关键是常量字符串不放在栈，放在不可修改的内存页上。所以你还是别修改了
user-0 提问: 关于指针，写入位置时发生冲突

回复:
user: user-1
content: char *str = "ABCDEFG"; 等价 const char *str = "ABCDEFG";

user: user-0
content: 引用 3 楼 FightForProgrammer 的回复:进一步解释就是，你原来声明的字符串是在内存中的某个区域（貌似叫常量区），那里的东东是不容许改动的，因此你str有了改动的行为时候*s = *(s+i);就会报错，而substr没有对它进行过改动行为，只有比较操作，因此没有崩掉  意思是用指针定义字符串，指针所指向的字符串为const类型?不能修改？

user: user-2
content: 引用 4 楼 gn6199 的回复:[quote=引用 3 楼 FightForProgrammer 的回复:] 进一步解释就是，你原来声明的字符串是在内存中的某个区域（貌似叫常量区），那里的东东是不容许改动的，因此你str有了改动的行为时候*s = *(s+i);就会报错，而substr没有对它进行过改动行为，只有比较操作，因此没有崩掉  意思是用指针定义字符串，指针所指向的字符串为const类型?不能修改？[/quote]  不是的。这个const没关系，内存分为好几个区域，有些区域是不能修改，只能读取的。比如常量区。你以后慢慢多学习就知道了

user: user-2
content: 进一步解释就是，你原来声明的字符串是在内存中的某个区域（貌似叫常量区），那里的东东是不容许改动的，因此你str有了改动的行为时候*s = *(s+i);就会报错，而substr没有对它进行过改动行为，只有比较操作，因此没有崩掉

user: user-2
content: 原因在于你的定义，改成  char str[] = "ABCDEFG";//char* str = "ABCDEFG";   因为你声明的str只是一个地址。而不是分配了空间的数组。所以你的*s会出问题。  不过你这个代码实现不了你的目的哦（删除子窜）。自己再改改吧

user: user-3
content: void main() {     char *str = "ABCDEFG";     char *substr = "CDE";     int i;     i = del_substr(str, substr);     printf("%d\n", i);     printf("%s\n", str);   } to void main() {     char str[] = "ABCDEFG";     char substr[] = "CDE";     int i;     i = del_substr(str, substr);     printf("%d\n", i);     printf("%s\n", str);   }
user-0 提问: 操作系统题目

回复:
user: user-1
content: 引用 4 楼 cumtwyc 的回复:从上往下看每ns完成一条指令的工作量，从左到右看，每个指令周期完成一条指令。《现代操作系统》书上的答案是10亿。 十亿怎么得来的，就按照楼主解释的，一个指令再细分，也没有十亿...

user: user-0
content: 从上往下看每ns完成一条指令的工作量，从左到右看，每个指令周期完成一条指令。《现代操作系统》书上的答案是10亿。

user: user-2
content: 引用 1 楼 hnwyllmm 的回复: 希望楼主可以看懂这个图 然后就很容易计算了 1s = 1000000000ns 从图上看，前面4ns和后面4ns除外，中间都是平均1ns一个指令，就是999999992条指令 最后再加上前面一条和后面一条，正好是999999994条指令+1,这个有点像我小学做的一道过桥问题

user: user-0
content: 引用 1 楼 hnwyllmm 的回复: 你说的是对的，但是我不理解的是一条指令不是可以分为几个周期吗，比如取指、译码、执行。假设每个周期都是1/3ns，当流水线被填满后，不是每1/3ns就有一条指令完成吗？

user: user-1
content: 希望楼主可以看懂这个图 然后就很容易计算了 1s = 1000000000ns 从图上看，前面4ns和后面4ns除外，中间都是平均1ns一个指令，就是999999992条指令 最后再加上前面一条和后面一条，正好是999999994条指令
user-0 提问: 求解素数算法问题

回复:
user: user-1
content: 程序没问题啊

user: user-2
content: Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-3
content: 程序没有问题

user: user-4
content: #include<stdio.h> #include <math.h> void main() { 	int i,k,tag; 	for(i=3;i<=1000;i+=2 ) 	{ tag=0; 	for(k=2;k<=sqrt(float(i));k++) 		if(i%k==0) 			tag=1; 	if(tag==0) 		printf("%d ",i); 	} }  没有问题，但不跟踪看看，到底是没有计算到还是输出的问题

user: user-0
content: 我跑了另一个很简单的程序 #include<stdio.h> main() { int i; for(i=1;i<1000;i++) printf("%d ",i)  这个就可以显示600之前的啊，说明电脑没问题吧.......

user: user-5
content: 楼主电脑有问题哈哈

user: user-6
content: 程序没有问题。

user: user-7
content: #include<iostream> #include<iomanip> #include<cmath> using namespace std;  class primer { 	public: 	inline static bool isprimer(int n) 		{ 			bool state = true; 			int  tmp = (int)sqrt((double) n); 				for(int i = 2; i < tmp+1 ;++i) 					if(n % i == 0) 					{ 						state = false; 						break; 					} 			return state; 		} };  int main() { 	for(int i = 3; i < 1000; ++i) 		if(primer::isprimer(i)) 			cout << setw(5) << i;  	return 0; }

user: user-7
content: 在printf里面加\n试试
user-0 提问: C语言无法连续输入

回复:
user: user-1
content: while (num % test == 0)//有bug，除数为0就出错了

user: user-2
content: test第二次的时候变成了0 你可以设个断点看。

user: user-0
content: 求解答……TAT

user: user-0
content: 引用 1 楼 jacksonfan 的回复:while (num % test == 0)//有bug，除数为0就出错了 按照我的走test不会变成0吧好像 如果是的话为什么输入一个然后EOF答案又完全正确呢
user-0 提问: WindowAPI编程 中 如何取消BS_CHECKBOX 的勾选

回复:
user: user-1
content: LRESULT r = SendMessage(hBtn2,BM_GETCHECK,0,0);              if(r==BST_CHECKED)//被选中              {                  MessageBox(NULL,L"CheckBox is CHECKED!",L"Hi!",MB_OK);              }

user: user-2
content: if (SendMessage(chbHwnd1, BM_GETCHECK, 0, 0))
user-0 提问: 带上“_T（）”以后，两行字符串不能并成一个字符串怎么办？

回复:
user: user-1
content: 奇怪

user: user-2
content: printf("%ls ",p);

user: user-0
content: 原因找到了，结贴。

user: user-3
content: 引用 2 楼 screen12 的回复:[quote=引用 1 楼 user-3 的回复:] wchar_t const* p = L"　　最终用户软件许可协议\n"        L"　　XX五笔为免费、无捆绑、无插件、无广告的五笔输入法软件。您一旦复制、安装、使用本软件产品，"; 好象不行，还是只能显示第一行。[/quote]  那时你显示函数的问题。

user: user-0
content: 引用 1 楼 user-3 的回复:wchar_t const* p = L"　　最终用户软件许可协议\n"        L"　　XX五笔为免费、无捆绑、无插件、无广告的五笔输入法软件。您一旦复制、安装、使用本软件产品，"; 好象不行，还是只能显示第一行。

user: user-3
content: wchar_t const* p = L"　　最终用户软件许可协议\n"        L"　　XX五笔为免费、无捆绑、无插件、无广告的五笔输入法软件。您一旦复制、安装、使用本软件产品，";
user-0 提问: 敢不敢来个知道的，来了敢不敢顺带做个好事告诉我下答案。

回复:
user: user-1
content: MoonDeviceA 用devicetree看下有没问题

user: user-2
content: 来见识下！！

user: user-3
content: 敢

user: user-4
content: 来了！！！！！！！！！
user-0 提问: 敢不敢来个知道的，来了敢不敢顺带做个好事告诉我下答案。

回复:
user: user-1
content: 不会帮顶了 楼主问个问题至于这样吗？连发好几个传送门帖子  要不楼主去别处问问，比如http://bbs3.driverdevelop.com/

user: user-0
content: 引用 3 楼 u012421456 的回复:不会帮顶了 楼主问个问题至于这样吗？连发好几个传送门帖子  要不楼主去别处问问，比如http://bbs3.driverdevelop.com/ 谢谢

user: user-0
content: 引用 1 楼 user-2 的回复:会不会发链接啊 http://bbs.csdn.net/topics/390973172?page=1#post-398805891  给你也没用啊，连续几个帖子 没人给答案。

user: user-2
content: 会不会发链接啊 http://bbs.csdn.net/topics/390973172?page=1#post-398805891
user-0 提问: 我到底哪里错了

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:A指ANSI，而ANSI并不是一个字符集，而是代表当前系统的默认字符集，在简体中文Windows下就是GBK，繁体中文则是BIG5，以此类推。  A指ANSI，而ANSI并不是一个字符集，  请问其和mdbc啥关系？

user: user-1
content: A指ANSI，而ANSI并不是一个字符集，而是代表当前系统的默认字符集，在简体中文Windows下就是GBK，繁体中文则是BIG5，以此类推。
user-0 提问: 关于scanf_s()函数的返回值和说明转换符%*、%n的问题

回复:
user: user-0
content: 感谢各位回答，我再消化一下

user: user-1
content: 输入函数计算的字节数，数据本身的字节数没有直接关系。

user: user-1
content: 输入函数和数据本身的字节数没关系， %n 和 函数返回值，一个表示成功输入的字节数，一个表示成功输入的数据个数 -2.35 共有 5个字节 - 2 . 3 5 所以 %4f 只输入 -2.3 四个字符  -2.35 15 25 ready2go 共有20各字节，每个字节都是有效的输入数据， 虽然 *号跳过了一部分字符，但是这个被跳过的字符，也是成功输入的字符  第一次全部输入数据，都是有效字符，所以成功输入20个字符 第二次只有最后一个o 不是有效数据，该数据保留在缓冲区，没有被输入数据中 所以只有19个字符输入成功了

user: user-2
content: 仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-3
content: 请教各位为什么第一个scanf_s()函数 byte_count 的值是20？我计算值应该是19：4字节的float变量+4字节int变量+4字节int变量+5字节ready字符+2字节go字符。（数字2被忽略，其余的已被读入的字符数被%n存储到 byte_count）  目测 你把 最后的\n读进去了     getchar();     value_count = scanf_s(format, &fp1, &i , &j, word1, sizeof(word1), word2, sizeof(word2), &byte_count);     getchar(); 看看是不是19

user: user-0
content: 非常感谢你的回答，这个是C语言我学“基本输入和输出”这个章节里面的内容，fp1对应的转换说明符是%4f，所以我才有以为是不是结果是4个字符，不明白为什么多出来5个0.

user: user-3
content: 那在猜测一下  value_count = scanf_s(format, &fp1, &i , &j, word1, sizeof(word1), word2, sizeof(word2), &byte_count); byte_count 为接收到的输入的格式化字符的字节数  Enter as input: -2.35 15 25 ready2go\ byte_count  为20  Enter as input: -2.35 15 25 ready332go\ byte_count  为22  value_count 同C语言 匹配的格式化个数  所以程序本身没有问题 问题是对scanf_s的参数说明 没理解   第二个scanf_s()函数 byte_count 的值为什么是19，我计算结果是18：4字节的float+4字节的int+4字节的int+5字节的ready+1字节的g=18，请教19是怎么来的？还有为什么这里的fp1=-2.300000，读入4字符不应该是-2.3吗？ 为什么是19  同上 为什么是fp1=-2.300000  这个和编辑器 默认保留的小数位 有关吧  这个也可以通过格式化强制保留多少位

user: user-3
content: 我回答错了 我怎么感觉我不认识这个scanf_s 这是C++里面的东西 怎么那么多参数 不是getchar()的问题 我想错了

user: user-0
content: 引用 1 楼 u011779875 的回复:请教各位为什么第一个scanf_s()函数 byte_count 的值是20？我计算值应该是19：4字节的float变量+4字节int变量+4字节int变量+5字节ready字符+2字节go字符。（数字2被忽略，其余的已被读入的字符数被%n存储到 byte_count）  目测 你把 最后的\n读进去了     getchar();     value_count = scanf_s(format, &fp1, &i , &j, word1, sizeof(word1), word2, sizeof(word2), &byte_count);     getchar(); 看看是不是19 请教“最后的\n读进去了”是什么意思呢？“Enter as input: -2.35 15 25 ready2go\n”这里面的\n应该没有被读入，单纯的换行应该，我把\n去掉再次编译测试了一下，结果不变呢。
user-0 提问: 求指导大数阶乘，自己写了一个但是值到30就不准确了

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main()  { 	long a[3000] = {0}; 	int n,i,m,j; 	int k= 1; 	a[0] = 1; 	printf("请输入n："); 	scanf("%d",&n); 	for(i = 1,j = 0;i <= n;i++) 	{ 		for(m = 0;m <= j;m++) 		{ 			a[m] = a[m]*i; 		} 		for(m = 0;m <= j;m++) 		{ 			if(a[m] > 10) 			{ 				a[m+1] = a[m+1] + a[m]/10; 				a[m] = a[m]%10; 			} 		} 		if(a[j] > 0) 			j++; 		 	} 	for(i = j-1;0 <= i;i--){ 		printf("%ld",a[i]); 	} 	printf("\n总共%d位",j); 	return 0; }

user: user-0
content: 大神们，，，小弟受教了，，，，

user: user-2
content: 进位处理有问题，while(a[j] > 0) j++; 遇到10不是分成0和1了，要么记一下位数，或者直接找一下换成 for(j=3000;!a[j-1];j--);

user: user-3
content: 向楼主推荐： 我以前看过这个帖子：http://bbs.csdn.net/topics/390962326 这个帖子中5楼有赵4老师的解答，楼主可参考其思路……

user: user-4
content: 看懂我意思。你比如乘之前数是1，那么j=1。假设乘以后是101，那么a[j]（a[1]）还是0，但是这时候a[2]是1，所以你实际j应该要弄成3，但是按照你的逻辑j还是1，那就丢了最高位的数字了。

user: user-0
content: 但是我的第二for循环已经把每个数都保持在10以内了哈。。。

user: user-4
content: while(a[j] > 0) j++;  位数不是这么算的。你假设一个1一下子蹦到101，按你这办法你会以为还是1。
user-0 提问: 错误信息

回复:
user: user-0
content: 多谢前辈指点，编译无错，可以运行。

user: user-1
content: #include <stdio.h>  //方式一函数要声明 才能找到定义 void printstar(); void print_message();  //方式二为遇到定义 即为定义且声明 /* void printstar()//函数void类型最好不要省略 { printf("********************\n");  return;//不管函数返回值是什么类型 写return是件只对不错的事情。 } void print_message()//函数void类型最好不要省略 { printf("How do you do!"); //不管函数返回值是什么类型 写return是件只对不错的事情。 }  */ int main() {     printstar();         //call function      print_message();     printstar();      return 0;//返回 C语言默认返回int int不写也返回int } void printstar()//函数void类型最好不要省略 {     printf("********************\n");      return;//不管函数返回值是什么类型 写return是件只对不错的事情。 } void print_message()//函数void类型最好不要省略 {     printf("How do you do!");     //不管函数返回值是什么类型 写return是件只对不错的事情。 }
user-0 提问: 求C开发工具.

回复:
user: user-1
content: 不知道你要如何才叫爽啊！！！要IDE猜测你想写的代码？

user: user-2
content: 引用 5 楼 luciferisnotsatan 的回复:VC+VS还不觉得满意的话，那就用emacs，然后自己写各种插件加上去。 打错了，是VC+VA

user: user-2
content: VC+VS还不觉得满意的话，那就用emacs，然后自己写各种插件加上去。

user: user-3
content: 安装vs2010之后，安装Visual Assist X， 爽到不行。。

user: user-4
content: 试试QT creator吧

user: user-5
content: VC就够用了额，编辑工具不是问题，问题是遇到问题怎么解决问题。

user: user-6
content: code blocks ?
user-0 提问: 怎样给链表结构体中的字符串数组直接赋值

回复:
user: user-1
content: a.name 表示字符数组的首地址，是个常量所以不能a.name="hello" 你可以使用strcpy(a.name,"hello") 也可以使用sprintf实现

user: user-2
content: strncpy 是 C语言的库函数之一，来自 C语言标准库， 定义于 string.h，char *strncpy(char *dest, char *src, int n)， 把src所指由以'\0'结束的字符串的前n个字节复制到dest所指的数组中，并返回指向dest的指针。

user: user-3
content: C/C++的数组不能直接赋值，只能拷贝，可以用memcpy，char[]也可以用strcpy/strncpy（最好用strncpy，更安全）： void * memcpy ( void * destination, const void * source, size_t num ); char * strncpy ( char * destination, const char * source, size_t num ); char * strcpy ( char * destination, const char * source );

user: user-4
content: 我记得结构体赋值一般只能赋值一次（就是最开始的时候），程序在运行的时候是用不上的，比如楼上说的strnpy()和 memcpy()都可以用的上

user: user-5
content: 数组怎么赋值就怎么赋值，没什么区别。

user: user-0
content: 嗯，谢谢，太久没弄C语言了，都忘记可以怎么处理了。。。。。。。

user: user-6
content: 引用 1 楼 pengzhixi 的回复:字符数组就用 strncpy +

user: user-7
content: 字符数组就用 strncpy

user: user-8
content: 没有这样的方法。 你的企图是 a.name = "hello"; 但是，name是数组类型，串字面值"hello"也是数组类型。 数组是不可修改的左值。
user-0 提问: 初学者的c代码，哪位好心人帮忙给看一下

回复:
user: user-1
content: 后面要是指向的地址

user: user-2
content: 可以看书解决的可以看看书先

user: user-3
content: scanf("%d\n",a[i]); 改成 scanf("%d",a+i);

user: user-4
content: scanf("%d",&n); 	for(i=0;i<n;i++) 		scanf("%d",&a[i]);
user-0 提问: c primer plus 第六章练习7

回复:
user: user-0
content: 引用 1 楼 u010982299 的回复:敲回车时，实际上输入了两个字符\r\n  感谢你的回答。

user: user-0
content: 引用 2 楼 jacksonfan 的回复:      while (1 == t || 0 == t) 	{ 		printf("wrong input, please enter again:\n"); 		flushall();//清除scanf缓冲区 		t = scanf("%f %f", &a, &b); 	}   感谢你的回答。

user: user-1
content: while (1 == t || 0 == t) 	{ 		printf("wrong input, please enter again:\n"); 		flushall();//清除scanf缓冲区 		t = scanf("%f %f", &a, &b); 	}

user: user-2
content: 敲回车时，实际上输入了两个字符\r\n
user-0 提问: 高手进（最简单的递归（汉诺塔））

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

user: user-2
content: 楼上正解，把递归如此抽象的东西都画出来了，

user: user-0
content: 人呢？求救啊

user: user-0
content: 高手快来帮帮我啊！！！

user: user-3
content: 百度呀 有很多的

user: user-0
content: 怎么没人啊？

user: user-4
content: 根据你的定义来理解就可以了             有    n个盘子  从a      通过b     到 c void hannuota (int n,     char a,   char b,   char c) 1 先要把上面n-1 移动b  ， 所以为 han(n-1,a,c,b) 2.然后把最后一个移动c, 3. 最后把n-1盘从b移动c              han(n-1,b,a,c)

user: user-0
content: 刚才图片发错了。  我画圈的不是应该和上一行一样吗，只不过n-1了，为什么压栈是acb，第二次压栈的时候就是abc了？搞不懂。。求解释啊

user: user-0
content: 我画圈的不是应该和上一行一样吗，只不过n-1了，为什么压栈是acb，第二次压栈的时候就是abc了？搞不懂

user: user-0
content: PPT也可以，谢谢谢
user-0 提问: win 8.1下面不支持的C语言系统函数

回复:
user: user-1
content: 要么就是你库没有用对，要么就是编译器的问题，不可能不支持系统函数的。 还有系统函数跟C语言没有必然联系，mac下和windows下的系统函数是不一样的， 但是C语言里的函数是一样的，懂吗？

user: user-2
content: 操作系统与C语言本身没有内在关系

user: user-3
content: 楼主你方向错了, 不是系统函数(C库)的问题 编译是小问题, 如果不能用, 编译器厂商会负责处理的 关键 你应该找WIN8下不支持的API,像WIN7下有而win8没有的

user: user-4
content: #pragma warning(disable:4996)

user: user-5
content: C语言系统函数，是什么玩意儿？

user: user-6
content: 引用 4 楼 bohecha0104 的回复:[quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 bohecha0104 的回复:] 就是我把系统冲win vista升级到win8.1 了， 由于以前有一个C语言写的程序。需要调查这些C的函数能不能再win8.1 上面用而已。  想找出那些函数由于win8.1的升级而不能用了。。。。  取决于你的编译器，而不是win8.1 如果你用的是标准库函数，那么，所有依从于标准的C的实现，都能编译你的程序，但问题是，你所用的编译器能运行在win8.1上吗？[/quote]  编译器是在win8上  是一个公司的应用软件，操作系统升级后，可能会导致应用软件的部分功能不能使用，或者不能编译。 我们要找出这种风险和客户汇报。 你能帮到我们吗？ 谢谢了。[/quote] 这复杂了。有些程序本身就是不可移植的，比如为windows写的程序。但你目前应该不会被它困扰，因为，那个应用软件以前也是在WINDOWS上编译和运行，现在依然是。所以，不能编译的可能性较小。 现在，最大的问题是换个了操作系统，这涉及到编译后的软件同新操作系统的兼容问题。现在俺还不清楚兼容性的问题都涉及到哪些方面。

user: user-0
content: 引用 3 楼 sholber 的回复:[quote=引用 2 楼 bohecha0104 的回复:] 就是我把系统冲win vista升级到win8.1 了， 由于以前有一个C语言写的程序。需要调查这些C的函数能不能再win8.1 上面用而已。  想找出那些函数由于win8.1的升级而不能用了。。。。  取决于你的编译器，而不是win8.1 如果你用的是标准库函数，那么，所有依从于标准的C的实现，都能编译你的程序，但问题是，你所用的编译器能运行在win8.1上吗？[/quote]  编译器是在win8上  是一个公司的应用软件，操作系统升级后，可能会导致应用软件的部分功能不能使用，或者不能编译。 我们要找出这种风险和客户汇报。 你能帮到我们吗？ 谢谢了。

user: user-6
content: 引用 2 楼 bohecha0104 的回复:就是我把系统冲win vista升级到win8.1 了， 由于以前有一个C语言写的程序。需要调查这些C的函数能不能再win8.1 上面用而已。  想找出那些函数由于win8.1的升级而不能用了。。。。  取决于你的编译器，而不是win8.1 如果你用的是标准库函数，那么，所有依从于标准的C的实现，都能编译你的程序，但问题是，你所用的编译器能运行在win8.1上吗？

user: user-0
content: 就是我把系统冲win vista升级到win8.1 了， 由于以前有一个C语言写的程序。需要调查这些C的函数能不能再win8.1 上面用而已。  想找出那些函数由于win8.1的升级而不能用了。。。。

user: user-6
content: 不知所云....
user-0 提问: 线程的顺序调换出错怎么解决

回复:
user: user-0
content: 引用 9 楼 user-1 的回复:当然，上面的step根据你的需要，你可以在任意地方增长，比如，完成第一步任务后，你才增长到2，顺序增长 好哒！谢谢大神=3=

user: user-1
content: 当然，上面的step根据你的需要，你可以在任意地方增长，比如，完成第一步任务后，你才增长到2，顺序增长

user: user-1
content: 如果你不想用event和waitforsingleobject 你也可以用一个简单的while循环试试 用while循环来考查一个变量，只有这个变量到达你的要求，你才执行  初始的时候 int step = 0;  在线程1中 while(step < 1){   sleep(10); }  线程2 while(step < 2){   sleep(10); }  以此类推

user: user-1
content: 最简单的办法是这样  线程在开始执行的时候，先进入一个waitsingleobject, 如果这个信号检测完成，才进入执行  所以，可以设置两个event, 一个给线程1用，一个给线程2用  流程 1，主线程运行 2，主线程启动两个线程 3，两个线程各自在等自己的event 4，主线程把event1设置 5，线程1检查event1成功，开始执行业务，同时把event2设置 6，线程2执行检查event2成功，开始执行业务

user: user-0
content: 引用 5 楼 qq_25344511 的回复:是的……加个=就好了……  顺便问问这里面怎么设置同步量保证两线程按指定顺序运行= =  = =

user: user-0
content: 是的……加个=就好了……  顺便问问这里面怎么设置同步量保证两线程按指定顺序运行= =

user: user-1
content: 其实，这只是你一个小小的粗心的错误  if (n = 1)  你把这=改成 ==吧 if(n==1)

user: user-1
content: 不能成功是不能运行？不能启动？还是打印不出？或者是打印得不对？

user: user-1
content: 你说的不能成功是什么意思？

user: user-0
content: 急！在线等！！
user-0 提问: 有关雷达接收机的软件模拟(c语言)，在做的过程中遇到的几个问题！

回复:
user: user-1
content: 在Excel里面另存为.csv（半角逗号间隔列，回车换行间隔行的纯文本）文件。 在C中读该文件。

user: user-2
content: 既然是搞硬件的，那就找个搞软件的合作吧。

user: user-3
content: 这个你完全不懂c的话一两句话说不清啊  c语言如何读写文件自有它相关的函数，比如fopen等等   具体你最好自己查查或者问问身边的人  至于你提出的问题，不难 写个struct 里面有俩成员，一个是union-----里面有相差和编码，还有一个是频率 然后你定义一个这个结构体类型的数组  用来存放你所有的struct  具体查找的时候，只要便利该数组即可    如果上面我说的你听不懂的话.........你最好找个人直接给你做  网上说不清楚
user-0 提问: 超级终端

回复:
user: user-1
content: 引用 4 楼 A812DLG1 的回复:鼠侠前辈：按你说的做了，还是不报错，难道要重做系统吗？如图  看来你安装的这个dll与你当前的windows不兼容。下载一个兼容的。

user: user-0
content: 鼠侠前辈：按你说的做了，还是不报错，难道要重做系统吗？如图

user: user-1
content: 俺都说了，点“开始” ->“运行”，输入regsvr32 hypertrm.dll  快点结帖给分！

user: user-2
content: 你把那个dll文件和exe放在同一个目录再运行试试

user: user-1
content: 你需要动动fingers： regsvr32 hypertrm.dll
user-0 提问: 如何输出头文件里定义的结构体名称和大小

回复:
user: user-1
content: 结构体都是你自己定义的 名称你自己应该清楚啊， 大小的话可以用sizeof

user: user-2
content: 结构体的大小可以通过sizeof获得，但是名字，你是要做解析头文件的功能吗？

user: user-3
content: 没看明白，举个例子。 要想使用头文件定义的结构体，需要#include 头文件，要想计算大小使用sizeof就可以啊

user: user-4
content: struct TestStruct { 	int a; 	char b; };

user: user-4
content: #include <iostream> using  std::cout; int main() { 	const type_info& info = typeid(TestStruct); 	cout << "结构名称为:" << info.name() << "结构大小为" << sizeof(TestStruct); 	return 0; }

user: user-5
content: struct x  {       int a;      int b;  }xx;  如果按上面的写法来作例子。   x和xx都是结构体的名字。  结构体的大小呢，你可以写sizeof(x);                                                  sizeof(xx);  这个结构体的大小是8个字节。
user-0 提问: 用memset()不能有效初始化结构体？

回复:
user: user-0
content: 引用 1 楼 u010982299 的回复:你取的是指针大小，而不是结构体大小，改成这样就可以了 memset(cmdstruct,0x0,sizeof(*cmdstruct));  ok，you are right!!  thanks.

user: user-1
content: 你取的是指针大小，而不是结构体大小，改成这样就可以了 memset(cmdstruct,0x0,sizeof(*cmdstruct));
user-0 提问: 在程序中如何对 char *p[4]赋值？

回复:
user: user-1
content: 引用 6 楼 leehh 的回复:[quote=引用 4 楼 lzl_2008 的回复:] char *p[4] ; p[0]= "abc"; p[1]="123"; p[2]="def"; p[3]="456";  我用的是：strncpy(p[i],str,num); //把有效的字段放到数组内。 编译没问题，但无法正常运行的。 [/quote] 搞清楚这两种赋值的区别~~

user: user-2
content: char *p[4]只是一个指针数组，没有存放数据的空间，把字符串的地址放在里面可以，要想修改数据是不可以的，因为字符串是常量

user: user-3
content: 给数组中每个元素都new你所需要的空间

user: user-4
content: 引用 7 楼 leehh 的回复:[quote=引用 6 楼 leehh 的回复:] [quote=引用 4 楼 lzl_2008 的回复:] char *p[4] ; p[0]= "abc"; p[1]="123"; p[2]="def"; p[3]="456";  我用的是：strncpy(p[i],str,num); //把有效的字段放到数组内。 编译没问题，但无法正常运行的。 [/quote]  但如果我把p[i]直接定义成一位数组，如char p[10]，运行正常。[/quote]  小朋友，傻了吧？ 指针是一个完整类型的对象，但它未必指向一个对象。为了使它指向一个对象，你可以选择的方法之一是malloc p [0] = malloc (num + 1); strncpy (p[i], str, num);

user: user-0
content: 引用 6 楼 leehh 的回复:[quote=引用 4 楼 lzl_2008 的回复:] char *p[4] ; p[0]= "abc"; p[1]="123"; p[2]="def"; p[3]="456";  我用的是：strncpy(p[i],str,num); //把有效的字段放到数组内。 编译没问题，但无法正常运行的。 [/quote]  但如果我把p[i]直接定义成一位数组，如char p[10]，运行正常。

user: user-0
content: 引用 4 楼 lzl_2008 的回复:char *p[4] ; p[0]= "abc"; p[1]="123"; p[2]="def"; p[3]="456";  我用的是：strncpy(p[i],str,num); //把有效的字段放到数组内。 编译没问题，但无法正常运行的。

user: user-0
content: 引用 1 楼 u011308575 的回复:直接对*p[0]赋值，其实是对字符串的第一个字符赋值，你可以直接p[0]='abc'这样赋值，就可以将字符串指针赋给数组元素了！ 不行的，编译是没有问题，但无法正常运行的，我试过。

user: user-5
content: char *p[4] ; p[0]= "abc"; p[1]="123"; p[2]="def"; p[3]="456";

user: user-0
content: 引用 2 楼 lzl_2008 的回复:char *p[4] = { "abc","123","def","456"};  这个是定义时初始化，我知道是可以的，程序内也有这样的定义。 我要实现的是程序内可以随时改变的，因为abc，123这些值不是固定的，你每次输入什么就给它赋值什么。相当于字符串处理，把有效的字符串放在*p[4]内。

user: user-5
content: char *p[4] = { "abc","123","def","456"};

user: user-6
content: 直接对*p[0]赋值，其实是对字符串的第一个字符赋值，你可以直接p[0]='abc'这样赋值，就可以将字符串指针赋给数组元素了！
user-0 提问: typeof问题

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:应该是不可以的，这个应该是gcc的扩展吧。 语义上有点类似typedef定义一个类型别名。 从搜索到的资料上看，使用这个操作符有两种形式的参数 一种参数是表达式：显然如果你直接typeof(member)是不行的，因为member到底是那个结构体的成员不得而知。 而typeof( ((type *)0)->member )有足够的信息获取member这个成员类型 第二种参数是类型定义符：  比如 typeof(int*)这种 明白了，以前以为给个变量就能直接知道变量类型了。

user: user-1
content: 有很多blog分析这个macro的 http://www.cnblogs.com/Anker/p/3472271.html

user: user-2
content: 这个宏，很吊的黑客技术！感觉linux有了它，很多工作才成为可能！ 不可以，当它要访问的是结构体的成员！它必须知道结构体的结构信息，才能取得成员member。如果替换成typeof( (member )就识别不了它是结构体的成员，成为一种未定以行为！这个宏主要用处就是知道成员，反查出结构体的基值！kernel用处多多！

user: user-3
content: 应该是不可以的，这个应该是gcc的扩展吧。 语义上有点类似typedef定义一个类型别名。 从搜索到的资料上看，使用这个操作符有两种形式的参数 一种参数是表达式：显然如果你直接typeof(member)是不行的，因为member到底是那个结构体的成员不得而知。 而typeof( ((type *)0)->member )有足够的信息获取member这个成员类型 第二种参数是类型定义符：  比如 typeof(int*)这种
user-0 提问: 最简单的递归知识，不懂求解释

回复:
user: user-1
content: 引用 9 楼 xia_xiao_xiao 的回复:什么一级级往上返回？返回的时候没有声明变量是怎么保存这些值的？  当一个函数执行时，调用它的那个函数还在呢。被调用的函数返回后，调用它的函数接着执行。明白？

user: user-2
content: 《C专家编程》对应章节讲解

user: user-0
content: 什么一级级往上返回？返回的时候没有声明变量是怎么保存这些值的？

user: user-0
content: 当N=1的时候，不是直接return返回1了吗？直接结束函数了吗？什么一级级返回。听不懂啊

user: user-0
content: 是搞不清楚那些数字是怎么存放的，也没有变量是怎么存放的？

user: user-1
content: 首先我要简化一下你的函数定义（本人有代码洁癖，再说C表达能力强，写臃肿的代码是对C的侮辱。不要告诉我什么可读性，什么可维护性，都是狗屁。忘了那些该死的规则吧）： long f (int n) {     return (n == 1) ? n : f (n-1) * n; }  1，在一个函数内部可以调用另一个函数，并使用那个函数的返回值。这个过程是递归的。 2，你可以将递归地调用自己想像成调用的是其它函数：函数f调用f1，f1调用f2……一直调用到n==1时，一级一级返回。而返回到每一级时，那一级的函数使用下一级的返回值。

user: user-3
content: 当n=6是，走else， 当n=5时，走else， 当n=4时，走else， 当n=3时，走else， 当n=2时，走else， 当n=1时，走if，此时返回1， 然后return 2×f(1)=2, 然后return3×f(2)=6, 然后return4×f(3)=24, 然后return5×f(4)=120, 然后return6×f(5)=720,  诺，720就是最后结果，也就是6的阶乘

user: user-0
content: 什么fun，说清楚啊，我是新手

user: user-4
content: fun里边打个断点，查看n的变化

user: user-0
content: 有具体步骤吗？比如先执行哪一步，然后又是哪一步？

user: user-5
content: 跟着程序一步一步往下执行就明白了 第一次调用 n =6  -> f(6-1) * 6; ->f(5-1) * f(6-1) * 6; ->f(4-1) * f(5-1) * f(6-1) * 6; ->f(3-1) * f(4-1) * f(5-1) * f(6-1) * 6; ->f(2-1) * f(3-1) * f(4-1) * f(5-1) * f(6-1) * 6; ->1 * f(2-1) * f(3-1) * f(4-1) * f(5-1) * f(6-1) * 6;   //这里满足n==1， 函数return， 于是一级级往上返回，  递归的两个要素，一定要有退出条件，  n个步骤必须能拆分为n-1个步骤。