Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c++

回复:
user: user-1
content: #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<cstring> #include<sstream> #include<iomanip> using namespace std; int main() { 	int N; 	cin>>N; 	for(int i = 0; i < N; i++) { 		double M; 		cin>>M; 		if(M-(int)M == 0) { 			cout.unsetf(ios::fixed); 			cout<<M<<endl; 		} 		else { 		cout<<setiosflags(ios_base::fixed)<<setprecision(2)<<M<<endl;	 		} 		cout<<setiosflags(ios_base::fixed)<<setprecision(6)<<M<<endl; 	} }

user: user-2
content: c++	         cout.setf(ios::fixed); 	cout.precision(2); 	cout << 123.000000 << endl;

user: user-2
content: printf("%.2f",123.0000);

user: user-3
content: printf("%lg",123.00);//123
user-0 提问: linux  capability编译报错

回复:
user: user-1
content: 我的也是 你是少安装包了。这是我的libcap-devel-2.16-5.5.el6.x86_64 你可以yum安装 yum install libcap-devel

user: user-2
content: 在〈sys/capability.h〉里

user: user-3
content: 如果是 configure生成的makefile 在configure的时候带上 CFLAGS=“-g -O2 -Wall”等 把原先的-Wformat -Werror都去掉 如果是子目录里的，修改config.status文件重新成成libtool来编译。 我是编译其他开源软件遇到时的解决方案希望对你有用。
user-0 提问: Ctrl+z 和程序中的EOF是对应的吗？为什么我写这个程序结束不了

回复:
user: user-1
content: ch 应为 int  否则不能保证正确性

user: user-2
content: while((ch=getchar())!=EOF)  你跟一下代码看看ch读出来的值是多少，是不是跟EOF的值一致不就知道了吗？ 不过控制台程序一般我都用回车来结束输入，判定一下等于'\n'就行了。

user: user-3
content: Linux：Ctrl+D Windows：Enter、Ctrl+Z、Enter
user-0 提问: 为什么输出的d会乱了？求大神解答

回复:
user: user-1
content: 请检查scanf的返回值。

user: user-2
content: 你两处getchar()得到的都是上一次输入留下的换行符

user: user-3
content: 读%c之前最好都清空一下输入缓冲区fflush(stdin);  #include<stdio.h> void main() { 	double a,d; 	int b; 	char c; 	scanf("%lf",&a); 	scanf("%d",&b); 	fflush(stdin); 	c=getchar(); 	scanf("%lf",&d); 	printf("%c %d %.2f %.2f \n",c,b,a,d); }

user: user-4
content: fflush用于标准输入行为是未定义的

user: user-5
content: #include<stdio.h> void main() { 	double a,d; 	int b; 	char c; 	scanf("%lf",&a); 	scanf("%d",&b); 	getchar();//空读前面的回车符 	c=getchar(); 	scanf("%lf",&d); 	printf("%c %d %.2f %.2f \n",c,b,a,d); }

user: user-6
content: scanf的时候缓冲区末尾会存有回车，所以会影响c即getchar的结果，在输入c之前要进行清空缓冲区操作。  #include<stdio.h> void main() { double a,d; int b; char c; scanf("%lf",&a); scanf("%d",&b); getchar(); c=getchar(); scanf("%lf",&d); printf("%c %d %.2f %.2f \n",c,b,a,d); }
user-0 提问: c语言问题 求大神解决

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: 是啊，按版主说的自己学学调试吧，况且根据你的描述，也根本不知道是什么问题

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

user: user-4
content: 运行出错时点中断，然后通过调用堆栈、变量监视等窗口观察分析原因
user-0 提问: c语言问题，求大神解决

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

user: user-2
content: 对，自己尝试着调试，这比会写代码更重要

user: user-3
content: 运行出错时点中断，然后通过调用堆栈、变量监视等窗口观察分析原因
user-0 提问: C语言通过ODBC连接access数据库总是不成功，求各位大神帮解决，谢谢

回复:
user: user-1
content: 在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     在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe     在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe

user: user-0
content: 最后我自己解决了，不过调用的是sql server数据库，不是access数据库。 步骤： 1. 把数据库放到系统DSN中； 2. 写程序； 3. 将项目属性中的“字符集”改为“未设置”（一定要改，否则返回值始终是-1），如下图所示。  附上我写的代码（其实是复制别人的） #include   <windows.h>    #include <sqlext.h> //这个应该是必须的, 链结时需要odbc32.lib #include <stdio.h> #include <stdlib.h>   void main() {  	SQLHENV     henv; 	SQLHDBC     hdbc; 	SQLHSTMT    hstmt; 	SQLRETURN   retcode;  	/*Allocate environment handle */ 	retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 		/* Set the ODBC version environment attribute */ 		retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);  		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 			/* Allocate connection handle */ 			retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  			if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 				/* Set login timeout to 5 seconds. */ 				SQLSetConnectAttr(hdbc, /*(void*)*/SQL_LOGIN_TIMEOUT, (void*)5, 0);  				/* Connect to data source */ 				retcode =SQLConnect(hdbc, (SQLCHAR*) "Wall_PRF", SQL_NTS,(SQLCHAR*) "ABCD", SQL_NTS,(SQLCHAR*) "123456789", SQL_NTS);  				if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){ 					/* Allocate statement handle */ 					retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 					printf("Connect Wall_PRF database success!\n");           					retcode = SQLPrepare(hstmt, (SQLCHAR*)"select * from Wall_PRF where ID=1", SQL_NTS); //准备sql查询  					retcode = SQLExecute(hstmt); //执行SQL命令  					SQLINTEGER cbsatid = SQL_NTS;  					while (SQLFetch(hstmt) != SQL_NO_DATA_FOUND) //循环从结果集中取每一行数据 					{ 						SQLINTEGER id; 						SQLDOUBLE PRF0; 						SQLDOUBLE PRF1; 						SQLCHAR Weight_Type[42];  						SQLGetData(hstmt, 1, SQL_C_LONG, &id, sizeof(SQLINTEGER), &cbsatid); 						SQLGetData(hstmt, 2, SQL_C_DOUBLE, &PRF0, sizeof(SQLINTEGER), &cbsatid); 						SQLGetData(hstmt, 3, SQL_C_DOUBLE, &PRF1, sizeof(SQLINTEGER), &cbsatid); 						SQLGetData(hstmt, 26, SQL_C_CHAR, Weight_Type, 10, &cbsatid);  						printf("id is:%ld, PRF[0] is :%lf, PRF[1] is :%lf, Weight_Type is:%s\n", id, PRF0,PRF1, Weight_Type); //打印取得的值} 					}  					if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 						/* Process data */  						SQLFreeHandle(SQL_HANDLE_STMT, hstmt); 					} 					SQLDisconnect(hdbc); 				} 				SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 			} 		} 		SQLFreeHandle(SQL_HANDLE_ENV, henv); 	}  	system("pause"); }
user-0 提问: 【求】求高手告知这段程序哪出错了

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

回复:
user: user-1
content: 把&http加到第一种过滤条件

user: user-1
content: 引用 10楼我是你的主体 的回复:[quote=引用 9 楼 user-1 的回复:] 默认wireshark勾选Edit->Preferences->protocols->TCP菜单的Allow sub dissector to reassemble TCP streams！！！ 如果不勾选：  厉害，我无意中发现firefox对tomcat首页处理的时候（我测试的环境是： tomcat+apache, fireforx， 网站就是tomcat自带的！！！）  抓的包， 然后去查看报文，发现第97个包说明了firefox搞了并行访问http服务器！！  这是现代浏览器的技术，可以让http请求并行！！！   我有一个新的问题（我就不开贴了，直接在这里请教吧），新问题是：  目前的网站有没有这种搭建的情景：  2台机器构建一个网站，其中部分资源在第2台机器上，  用户去访问该网站的时候，会做几个tcp连接（先抛开 浏览器的并行访问技术），  我本身不懂Web开发，可以说，这些场景都是我意淫出来的。   用户的机器会不会和 2台机器做不同的tcp连接？  还是说用户只和域名对应的ip的机器做tcp连接？     [/quote]这要看客户端和谁建立的tcp，这种情况具体我没有分析过，暂无法回答

user: user-0
content: 引用 9 楼 user-1 的回复:默认wireshark勾选Edit->Preferences->protocols->TCP菜单的Allow sub dissector to reassemble TCP streams！！！ 如果不勾选：  厉害，我无意中发现firefox对tomcat首页处理的时候（我测试的环境是： tomcat+apache, fireforx， 网站就是tomcat自带的！！！）  抓的包， 然后去查看报文，发现第97个包说明了firefox搞了并行访问http服务器！！  这是现代浏览器的技术，可以让http请求并行！！！   我有一个新的问题（我就不开贴了，直接在这里请教吧），新问题是：  目前的网站有没有这种搭建的情景：  2台机器构建一个网站，其中部分资源在第2台机器上，  用户去访问该网站的时候，会做几个tcp连接（先抛开 浏览器的并行访问技术），  我本身不懂Web开发，可以说，这些场景都是我意淫出来的。   用户的机器会不会和 2台机器做不同的tcp连接？  还是说用户只和域名对应的ip的机器做tcp连接？

user: user-1
content: 默认wireshark勾选Edit->Preferences->protocols->TCP菜单的Allow sub dissector to reassemble TCP streams！！！ 如果不勾选：

user: user-0
content: 引用 7 楼 user-1 的回复:  好吧，可能wireshark的显示有点诡异， 不能“直接显示”出150封包来。  呵呵。  不管如何，非常感谢

user: user-1

user: user-1
content: 引用 5 楼 u012879787 的回复:[quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 u012879787 的回复:] [quote=引用 1 楼 user-1 的回复:] 把&http加到第一种过滤条件  为啥要加？   加了之后，我发现还是漏到某个http包。[/quote]漏掉的http是101机器和102机器之间的http报文吗？？？[/quote]   大神尝试的结果如何？  [/quote]是TCP segment of a reassembled PDU  这个TCP包吗？

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 u012879787 的回复:] [quote=引用 1 楼 user-1 的回复:] 把&http加到第一种过滤条件  为啥要加？   加了之后，我发现还是漏到某个http包。[/quote]漏掉的http是101机器和102机器之间的http报文吗？？？[/quote]   大神尝试的结果如何？

user: user-0
content: 引用 1 楼 user-1 的回复:把&http加到第一种过滤条件   http://pan.baidu.com/s/1bpkHsUr  pcpa文件在这里  过滤条件 在只贴里，你试试就可。  注意 第 150 包， 我反正加上&&http后，第150个包（http)就会丢失！！！！

user: user-1
content: 引用 2 楼 u012879787 的回复:[quote=引用 1 楼 user-1 的回复:] 把&http加到第一种过滤条件  为啥要加？   加了之后，我发现还是漏到某个http包。[/quote]漏掉的http是101机器和102机器之间的http报文吗？？？

user: user-0
content: 引用 1 楼 user-1 的回复:把&http加到第一种过滤条件  为啥要加？   加了之后，我发现还是漏到某个http包。
user-0 提问: VS2015 c++找不到目标合适的SDK

回复:
user: user-1
content: 先彻底卸载完全。 参考：http://tieba.baidu.com/p/3996550898 然后重新安装。

user: user-2
content: 应该你安装的时候没有完整安装，重新彻底卸载了安装一下
user-0 提问: 不懂错在哪

回复:
user: user-0
content: 你贴的代码有问题，输入3（1（，4），2（0，9））@不行

user: user-1
content: 楼主哪里复制来的代码？ 错误一大坨。 稍微改了下  #include<stdio.h> #include<stdlib.h>  #define N 100 typedef struct binode{ 	char data; 	struct binode *lchild,*rchild; }bitree; bitree*p,*root; bitree* creatbt() { 	int flag=0; 	int top=-1; 	bitree *stack [N]; 	root=NULL; 	char ch; 	while(1) 	{ 		scanf("%c",&ch); 		switch(ch){ 		default: 			p=(bitree*)malloc(sizeof(bitree)); 			p->data=ch; 			p->lchild=NULL; 			p->rchild=NULL; 			if(root==NULL) 				root=p; 			else if (flag==1) 				stack[top]->lchild=p; 			else 				stack[top]->rchild=p; 		case '(':top++;stack[top]=p;flag=1;break; 		case ',':flag=2;break; 		case ')':top--;break; 		case'@':return(root);break; 		} 	} }  void preorder(bitree *root) { 	if(root!=NULL) 	{ 		printf("%c",root->data); 		preorder(root->lchild); 		preorder(root->rchild); 	} } int main() { 	int ah; 	bitree *creatbt(); 	void preorder(bitree *root); 	bitree *b; 	while(1) 	{ 		printf("输入选择："); 		scanf("%d",&ah); 		switch(ah){ 		case 1:b = creatbt();break; 		case 2:preorder(b);break; 		} 	}  }  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 从论坛上复制了一段C语言代码，，但是总是报错，，希望可以有人帮忙看一下

回复:
user: user-1
content: 楼主的代码根本就不是实现   把几个Txt文件里><内容写入到另一个Txt文件里面  的功能啊。
user-0 提问: fd_set 是什么类型

回复:
user: user-1
content: http://blog.chinaunix.net/uid-25749806-id-297906.html

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

user: user-3
content: 结构体，建议查阅msdn

user: user-4
content: 其实这是一个数组的宏定义，数组的类型是(unsigned) long型的(个人推测无符号)，占有128位，无论是32位的linux下，还是64位下，他都是128个字节（128*8位=1024位，也就是可以检测1024个任务，这也是select默认的个数，可以通过编译内核修改），但是由于不同位数的系统下long型的长度不同，所以导致数组的元素个数也是不同的。 参考：http://blog.csdn.net/xluren/article/details/8180753

user: user-5
content: https://msdn.microsoft.com/en-us/library/windows/desktop/ms737873(v=vs.85).aspx
user-0 提问: 求助：char指针和signed char指针 为何不能相互赋值

回复:
user: user-1
content: 因为 ASCII编码只有 127 以内的128 个 所以，开始的时候，char类型，就不需要 128 以上的编码 因此，不很重视 他是有符号，还是无符号  如果是 一开始，就超过128 估计就固定下来了 由于开始没固定，后来标准里面就没表态 然后就成现在这个样子，由实现决定。

user: user-0
content: 引用 9 楼 lm_whales 的回复:因为 ASCII编码只有 127 以内的128 个 所以，开始的时候，char类型，就不需要 128 以上的编码 因此，不很重视 他是有符号，还是无符号  如果是 一开始，就超过128 估计就固定下来了 由于开始没固定，后来标准里面就没表态 然后就成现在这个样子，由实现决定。  恩恩  理解了  谢谢

user: user-0
content: 引用 6 楼 paschen 的回复:[quote=引用 4 楼 andyxu111 的回复:] [quote=引用 2 楼 user-3 的回复:] char到底解释为 无符号还是有符号取决于编译器 所以从语言角度来说，无法保证“signed char ”和“char”是同样的类型，也无法保证“signed char* ”和“char*”是同样的类型，语言层面上禁止这两类变量之间相互复制，很正常   	signed char var1; 	 char var2 = var1; 为什么不是指针的赋值就可以编译通过呢？[/quote]  因为这个符合隐式转换条件，但不同类型的指针不符合[/quote]   版主这么讲我就能说服自己了，谢谢

user: user-2
content: 一般char默认是 signed char。但是由于系统实现及历史遗留原因 导致部分系统或者编译器使用unsigned char，所以在指针转换时需要进行强制转换

user: user-2
content: 引用 4 楼 andyxu111 的回复:[quote=引用 2 楼 user-3 的回复:] char到底解释为 无符号还是有符号取决于编译器 所以从语言角度来说，无法保证“signed char ”和“char”是同样的类型，也无法保证“signed char* ”和“char*”是同样的类型，语言层面上禁止这两类变量之间相互复制，很正常   	signed char var1; 	 char var2 = var1; 为什么不是指针的赋值就可以编译通过呢？[/quote]  因为这个符合隐式转换条件，但不同类型的指针不符合

user: user-2
content: 引用 3 楼 andyxu111 的回复:signed int *var1; 	 int *var2 = var1;这个是可以编译通过的   那也就说 本质上是因为 char 的特殊性才导致：  	signed char *var1; 	 char *var2 = var1;  这个编译不通过？  那是因为signed int 就是 int

user: user-0
content: 引用 2 楼 user-3 的回复:char到底解释为 无符号还是有符号取决于编译器 所以从语言角度来说，无法保证“signed char ”和“char”是同样的类型，也无法保证“signed char* ”和“char*”是同样的类型，语言层面上禁止这两类变量之间相互复制，很正常   	signed char var1; 	 char var2 = var1; 为什么不是指针的赋值就可以编译通过呢？

user: user-0
content: signed int *var1; 	 int *var2 = var1;这个是可以编译通过的   那也就说 本质上是因为 char 的特殊性才导致：  	signed char *var1; 	 char *var2 = var1;  这个编译不通过？

user: user-3
content: char到底解释为 无符号还是有符号取决于编译器 所以从语言角度来说，无法保证“signed char ”和“char”是同样的类型，也无法保证“signed char* ”和“char*”是同样的类型，语言层面上禁止这两类变量之间相互复制，很正常

user: user-2
content: 除了void*指针，其他不同类型的指针是不能直接赋值的  你需要写成 char *var2 = (char *)var1;
user-0 提问: 最大公约数 最小公倍数问题，用函数写。

回复:
user: user-1
content: #include<stdio.h> int main() {     int yshu(int,int);     int bshu(int,int,int);     int a,b;     int m,n;     scanf("%d %d",&a,&b);     m=yshu(a,b);     n=bshu(a,b,m);     printf("%d\n",m);     printf("%d\n",n);     return 0; } int yshu(int a,int b) {     int c,t;     if(a<b)     {         t=a;         a=b;         b=t;     }      while(b!=0)     {         c=a%b;         a=b;         b=c;     }     return a; } int bshu(int a,int b,int m) {     return (a*b/m); }  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 你代码这里c应该改成t吧  		t=a; 		a=b; 		b=c;
user-0 提问: 崩溃了，完全不知道怎么回事？

回复:
user: user-1
content: a[10]=0；有问题 a[10]  相当于后面这个  *（a+10）对后面的内存解除引用是很危险的 不一定奔溃（你可以在int a[10]后面在加一个int i=0；试试。 看运气。

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-3
content: 引用 5 楼 qq_25868549 的回复:[quote=引用 2 楼 paschen 的回复:] 删除a[10] = 0;这一句，其他没问题  大神，问下，他虽然a[10] = 0;，但printf并没有输出a[10]，为什么会崩溃呢？[/quote]  越界了

user: user-4
content: 引用 5 楼 qq_25868549 的回复:[quote=引用 2 楼 paschen 的回复:] 删除a[10] = 0;这一句，其他没问题  大神，问下，他虽然a[10] = 0;，但printf并没有输出a[10]，为什么会崩溃呢？[/quote]  可以利用a[10] 进行寻址，但是却不能对其进行赋值操作。这是C比较特别的地方

user: user-5
content: 引用 2 楼 paschen 的回复:删除a[10] = 0;这一句，其他没问题  大神，问下，他虽然a[10] = 0;，但printf并没有输出a[10]，为什么会崩溃呢？

user: user-6
content: int a[10];这样子的数组，一般可以操作的是a[0]到a[9]的，出现a[10]这样的东西，感觉都是违法的哦！

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

user: user-7
content: 看楼主的程序是在做冒泡排序。数组a定义10个元素，下标是0-9，给a[10]赋值是不对的，会数组越界。 建议楼主可以把数组的大小定义成宏，这样这种小程序好扩展

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

user: user-3
content: 删除a[10] = 0;这一句，其他没问题

user: user-9
content: #include<stdio.h>  int main() { 	int a[10]; 	int i,j,swap=0; 	/*a[10] = 0;//只有0-9是有效能用的下标，这里a[10]等于0是啥意思？直接删掉就能过*/ 	for (i = 0; i <= 9; i++) 	{  		printf("请输入a[%d]:", i); 		scanf("%d", &a[i]); 	} 	for (i = 8; i >=0; i--) 		for (j = 0; j <= i;j++) 		{ 			if (a[j] > a[j + 1]) 			{ 				swap=a[j]; 				a[j]=a[j+1]; 				a[j+1]=swap; 			}  		}  		for (i = 0; i <= 9; i++) 			printf("a[%d]=%d\n", i, a[i]); 		return 0;  }
user-0 提问: linux下为什么系统调用比库函数更占资源，库函数不是会调用系统调用吗？

回复:
user: user-1
content: 引用 2 楼 tiyorn 的回复:可是库函数的实现不是通常也要通过调用系统调用吗？ 一般IO操作的库函数都需要系统调用 fopen fread之类的 但不需要系统调用的也很多啊 memcpy strcpy

user: user-0
content: 可是库函数的实现不是通常也要通过调用系统调用吗？

user: user-2
content: 库函数调用通常比行内展开的代码慢，因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多，因为它需要把上下文环境切换到内核模式。
user-0 提问:   链表头指针的问题

回复:
user: user-1
content: 静态变量作用范围在一个文件内，程序开始时分配空间，结束时释放空间，默认初始化为0，使用时可以改变其值。  静态变量或静态函数只有本文件内的代码才能访问它，它的名字在其它文件中不可见。  详见：http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html

user: user-2
content: static变量仅作用于当前CPP文件

user: user-3
content: 因为你声明的 head 是 static 的，所以它在不同的编译单元（b.c / c.c）中就是互相独立的，修改其中一个不会影响另一个。
user-0 提问: 讨论C语言中局部变量的存储地址

回复:
user: user-1
content: 有没关系你要看生成的汇编代码

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→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执行停在该断点处的时候。  栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-3
content: http://open.163.com/movie/2008/1/J/K/M6SL23BRS_M6SL33KJK.html 请楼主先看第8课后半段，然后再看第10课，基本上能解释清楚你遇到的问题了……  如果有时间，建议整个课程看一遍.....

user: user-4
content: 1）有一个理想的安排方式，即按照定义的先后和层次，安排位置，发布版，差不多会这样安排 2）编译器不必非得按照理想方式，安排，可以比较随意一点，灵活一点

user: user-5
content: 要看增长方向只要再调用一层函数啊，同一层的编译器想怎么安排就这么安排啊
user-0 提问: 求高手指点！！！

回复:
user: user-1
content: 以VC2010为例：  string.h对应文件： C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string.h  string对应文件： C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string  别拿豆包不当干粮，别拿没扩展名的头文件不当头文件。  请亲自用记事本打开这两个文件看看吧。

user: user-2
content: 看完这个你就明白了：http://blog.csdn.net/kobesdu/article/details/38304523

user: user-3
content: string是c++字符串标准库类，string.h是c语言的字符串类 并不是毫无关系，string是根据c风格字符串创建的类 string.h在c++头文件写成cstring

user: user-4
content: 用尖括号 #include <>： 一般用于包含标准的库头文件，编译器会去系统配置的库环境变量和者用户配置的路径去搜索，而不会在项目的当前目录去查找。 用双引号 #include ""： 一般用于包含用户自己编写的头文件，编译器会先在项目的当前目录查找，找不到后才会去系统配置的库环境变量和用户配置的路径去搜索。

user: user-5
content: string是C++的， "(引号)与<(尖括号)的不同是搜索头文件目录优先的问题
user-0 提问: win10

回复:
user: user-1
content: just try GCC

user: user-2
content: 可以装，但兼容不好，实在装不上也可以用虚拟机装，但不建议用了，快20年的东西了  http://blog.csdn.net/cometnet/article/details/19551125

user: user-3
content: 珍爱生命 远离vc6.0

user: user-4
content: win7以上就兼容不太好了，建议用vs，如果一定要vc6,还不如用虚拟机xp跑vc6
user-0 提问: C语言大循环嵌套问题

回复:
user: user-1
content: 再回到第一个循环？递归不更好吗

user: user-0
content: 嗯嗯。有道理，谢谢啦

user: user-2
content: while(1) {     if(条件1)     {         while(1)         {             if(条件2)             {                 break;             }         }     } }

user: user-3
content: while(1) 	{ 		if(...) 		{ 			while(...) 			{ 				if(...) 				{ 					break; 				} 			} 		} 	}
user-0 提问: 子进程多个socket

回复:
user: user-1
content: 说说你的这个功能是用在什么地方的

user: user-2
content: 觉得你的思路有点问题，正常一般做法都是这样的。  服务端每收到一个连接请求，就fork 一个进程，这样子进程和父进程都共享了 监听socket ，acceptsocket，  fork 之后，父进程close accept 到的socket ， 子进程close 监听socket ，这样，子进程 按照正常的socket 收发进行通信。  同理，如果你非要等到3个连接都来来再fork ，按照一个连接的情况处理也是一样的， fork 之后，一个一个socket 再通信，父进程不管子进程的socket .
user-0 提问: c++模板

回复:
user: user-0
content: Point类型是什么来的？

user: user-1
content: 错误说得很明白了啊，你传进去的是Point的数组，而Point类型没有重载操比较作符( < 或 > )

user: user-0
content: 修改过了还是报错 #include<iostream> using namespace std; template<typename T> int find_lower_bound(T seq[],int n,const T& value)  { 	int index=-1; 	T max; 	int you=0; 	for(int i=0;i<n;i++) 	{ 		if(seq[i]<value) 		{ 			you=1; 			index=i; 			max=seq[i]; 			break; 		} 	} 	if(you==0) 	{ 		return -1; 	} 	else 	{ 		for(int i=0;i<n;i++) 		{ 			if(seq[i]>max&&seq[i]<value) 			{ 				max=seq[i]; 				index=i; 			} 		}  	} 	return index; }

user: user-2
content: 题目要求找 index ，而你的程序找的是值

user: user-0
content: #include<iostream> using namespace std; template<typename T> int find_lower_bound(T seq[],int n,const T& value)  { 	T max; 	int you=0; 	for(int i=0;i<n;i++) 	{ 		if(seq[i]<value) 		{ 			you=1; 			max=seq[i]; 			break; 		} 	} 	if(you==0) 	{ 		return -1; 	} 	else 	{ 		for(int i=0;i<n;i++) 		{ 			if(seq[i]>max&&seq[i]<value) 			{ 				max=seq[i]; 			} 		}  	} 	max=(int)max; 	return max; }

user: user-0
content: #include<iostream> using namespace std; template<typename T> int find_lower_bound(T seq[],int n,const T& value)  { 	T max; 	int you=0; 	for(int i=0;i<n;i++) 	{ 		if(seq[i]<value) 		{ 			you=1; 			max=seq[i]; 			break; 		} 	} 	if(you==0) 	{ 		return -1; 	} 	else 	{ 		for(int i=0;i<n;i++) 		{ 			if(seq[i]>max&&seq[i]<value) 			{ 				max=seq[i]; 			} 		}  	} 	max=(int)max; 	return max; }

user: user-0
content: 这是我写的代码和报的错，求错误的参考
user-0 提问: 二维数组旋转不借助临时工作数组

回复:
user: user-1
content: 参考：  #include <stdio.h> #include <string.h> #include <stdlib.h>  void swap(int* a,int *b){ 	int t=*a; 	*a=*b; 	*b=t; }    void transp(int a[][3],int n){  	int i,j;  	for(i=0;i<n;i++) 		for(j=i+1;j<n;j++) 			swap(&a[i][j],&a[j][i]);  	for(i=0;i<n/2;i++) 		for(j=0;j<n;j++) 			swap(&a[i][j],&a[n-1-i][j]); }  int main(){  	int a[][3]={ 		{1,2,3}, 		{4,5,6}, 		{7,8,9} 	};  	int i,j;  	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 		{ 			printf("%d\t",a[i][j]); 			if(2==j) printf("\n"); 		}  		printf("\n");  		transp(a,3);  		for(i=0;i<3;i++) 			for(j=0;j<3;j++) 			{ 				printf("%d\t",a[i][j]); 				if(2==j) printf("\n"); 			}  			return 0; }

user: user-2
content: http://blog.csdn.net/leo115/article/details/7939580

user: user-3
content: 先来个两步的 123 456 789 --->行交换 789 456 123 ----> 然后 37交换。68交换，24交换 三条主对角线的元素交换，位置 为 x+y=a 3,6,9 2,5,8 1,4,7  也可一步交换 只要找清楚规律即可
user-0 提问: 编写一个c程序，实现两个分数的加减法 。函数比较特别，求帮助,需要注释！

回复:
user: user-1
content: 1)分子分母比较小，用整数存储，通分计算 2）分子分母很大，通分后 最大整数存储会溢出 直接用字符串做大整数加减乘除

user: user-2
content: 仅供参考：  #include<stdio.h> #include<stdlib.h>  char *sr(char *strjs) { 	 long int a,b,c,d,i,x,y,z;     char op; 	sscanf(strjs, "%ld/%ld%c%ld/%ld", &b,&a,&op,&d,&c);      if(a==0||c==0)  	{ 		printf("分母为0输入错误!"); 		exit(0); 	}      if(op=='+'){y=b*c+d*a;x=a*c;}        /*运算结果均为y/x*/      if(op=='-'){y=b*c-d*a,x=a*c;}      if(op=='*'){y=b*d;x=a*c;}      if(op=='/'){y=b/c;x=a/d;}      z=x;      if(x>y) z=y;      i=z;      while(i>1)            /*y/x分子分母约去公因数*/     {         if(x%i==0&&y%i==0){x=x/i;y=y/i;continue;}         i--;      } 	char *res = (char *)malloc(32); 	sprintf(res, "%ld/%ld", y, x); 	return res; }  void main() { 	char str[32] = {0}; 	printf("请输入分数运算式:\n"); 	scanf("%s", str); 	char *jg = sr(str); 	printf("%s\n",jg);  }
user-0 提问: 理解不了，比如*curr, *head;可以帮忙注释一下吗解释一下重要语句的作用

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

user: user-2
content: 如果这都需要解释的话，那么楼主不应该上论坛，而是应该找本数据结构的课本学习一下。 这样会事半功倍的，祝你好运^_^

user: user-3
content: #include<stdio.h> #include<stdlib.h>  //定义一个结构体 struct list1 { 	int val; 	struct list1 *next; //next指针指向后继结点 }; typedef struct list1 item; //定义别名 void main() { 	item *curr, *head;//定义两个指针，curr用来保存当前的结点，head保存头结点的地址 	int i; 	head = NULL;//将头指针置为NULL 	for (i = 1; i <= 10; i++)//循环10次 	{ 		curr = (item *)malloc(sizeof(item));//malloc一个结点 		curr->val = i;//赋值 		curr->next = head;//将当前malloc出来的结点的next指针指向head 		                 //i=1时，第一个结点的next指针指向NULL，i>1时，将新结点的next指向原来的头结点，在头部拼上新结点 		head = curr;//head指向新结点（因为是头插法，所以让head重新指回当前链表的第一个结点） 	} 	curr = head;//curr指向头结点以输出链表中的元素 	while (curr) 	{ 		printf("%d\t", curr->val); 		curr = curr->next; 	} 	getchar();//调试模式 };  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: vc++调试出来output.c

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

user: user-2
content: 出错时中断下来观察分析原因  判断你出错在(a[k*G->dian+ik->infor->dian1])=+1;  此时ik的值 是NULL，具体情况楼主可单步跟踪程序运行以分析
user-0 提问: c头文件extern问题

回复:
user: user-1
content: 对文件xyz来说编译是重复定义。 对于主程序，link的时候会link， x.c中： void Init_Language(void) { abort(); }

user: user-2
content: 如果 其中一个文件不链接，编译器并不会报错

user: user-2
content: abort() 对于调试非常有用 这个函数的存在主要作用是调试程序

user: user-3
content: 不是很懂，这样链接不会报错吗？

user: user-4
content: extern是C语言中声明和引用的作用，引用是因为改函数在其他地方定了了； absort是中断程序，用户在可能出错，或者参数异常的地方使用，这样可以方便定位问题；

user: user-5
content: 如果包含 函数的.c 文件没有其他的引用符号。 那么如果链接的时候，你的自定义的函数将优先被链接。 不会引起符号冲突，除非 那个 .c 文件还有其他的符号被链接。  这样的效果就是，如果你没有自定义这个函数，那么将使用库的缺省函数。 否则就会使用你的自定义函数。（编译器的虚函数^_^)  而库的缺省函数就是直接 abort() 了。 这个函数直接退出整个程序。

user: user-6
content: 引用 楼主 u013903890 的回复:例子如下： x.h中： extern void Init_Language(void);  x.c中： void Init_Language(void) { 	abort(); } 另一个文件xyz中： #include	"x.h" void Init_Language(void) { 	自定义实现细节； } 主程序： #include	"x.h" 调用Init_Language();   问题：主程序到底调用的那个函数？另外abort()的作用，查资料说中止进程，那是令当前进程退出吗，这样有什么实际意义和必要吗？ 1. 这个写法编译不过，会提示Init_Language重复定义 2. 函数名: abort 功  能: 异常终止一个进程 特 性：abort()函数通过发出一个SIGABRT信号终止程序的执行。 abort()函数不会清空缓冲区，也没有调用之前用atexit()函数注册的清理函数，属于异常退出。

user: user-0
content: 引用 2 楼 qq_34891043 的回复:不是很懂，这样链接不会报错吗？ 这是别人源码的一部分，可以正常运行，我一开始还想成java的函数重写了-_-#

user: user-7
content: 这个链接的时候肯定报错啊，重定义了 abort被调用时，程序将直接退出，任何对象的析构函数都不会调用 http://www.cplusplus.com/reference/cstdlib/abort/?kw=abort
user-0 提问: 删除操作无法执行，输入删除位置之后执行下一步，程序就停止运行了

回复:
user: user-0
content: 好的，谢谢你啦

user: user-1
content: 引用 8 楼 qq_30306457 的回复:是因为没有头结点接下来输出就不知道从哪里遍历了吗？所以一定要把头结点指向新的第一个结点吗？ 因为你的另外函数都是写成有头结点的，比如你的OutPutList函数，所以一定要在链表头部加上头结点

user: user-0
content: 是因为没有头结点接下来输出就不知道从哪里遍历了吗？所以一定要把头结点指向新的第一个结点吗？

user: user-1
content: 引用 6 楼 qq_30306457 的回复:你好，你的最后一步我不明白，我的指针s是移动的，移到最后一个位置时，把指针指向前面不可以吗？L不是头结点吗，没有移动啊？ 退出while的时候，r指向了最后一个结点（也就是逆序后的第一个结点），s已经是NULL 此时应该让头结点（L）指向新的第一个结点,所以是（L->next = r;）

user: user-0
content: 你好，你的最后一步我不明白，我的指针s是移动的，移到最后一个位置时，把指针指向前面不可以吗？L不是头结点吗，没有移动啊？

user: user-1
content: 改成这样：  void TransposeList(LinkList L) { 	LinkList r,s,t; 	r = NULL; 	s = L->next; 	while(s) 	{ 		t=s->next;//t指向s后面的那个元素 		s->next=r;//s指向前面的元素 		r=s;//移动指针 		s=t; 	} 	//s->next=r;//s指向最后一个元素时，s->next为空，但s还是指向前面。 	L->next = r; }

user: user-0
content: 我还想问个问题，关于单链表转置的，我的逻辑没错吧？我觉得没错我编译没错，运行没结果。 TransposeList(LinkList L) { 	LinkList r,s,t; 	r=L; 	s=r->next; 	while(s->next) 	{ 		t=s->next;//t指向s后面的那个元素 		s->next=r;//s指向前面的元素 		r=s;//移动指针 		s=t; 	} 	s->next=r;//s指向最后一个元素时，s->next为空，但s还是指向前面。 }

user: user-1
content: 引用 2 楼 qq_30306457 的回复:谢谢你啦，不过我还是个学生，还是个小白。 问题解决了，记得及时结贴

user: user-0
content: 谢谢你啦，不过我还是个学生，还是个小白。

user: user-1
content: 删除操作里，找到要删除的结点后，让它的上一个结点(s)指向待删除结点(r)的next指针指向的结点就行了 ps:你的删除和插入函数也不需要return  #include<stdio.h>  #include<stdlib.h>   typedef struct LNode  {   	int data;   	struct LNode *next;  }LNode,*LinkList;  LinkList L; void createList(int n)//构建链表 {      	LinkList s,r; 	int i; 	L=r=(LinkList)malloc(sizeof(LNode));  	//r->next=NULL; 	for(i=0;i<n;i++)  	{   		s=(LinkList)malloc(sizeof(LNode)); 		scanf("%d",&s->data); 		//s->next=r->next; //表头插入法 		//r->next=s;   		r->next=s;//表尾插入法 		r=s; 	}  	r->next=NULL; }  LinkList InsertList(LinkList L,int n)//单链表的插入 { 	LinkList s,r=L; 	int i,j; 	printf("请输入要插入的位置："); 	scanf("%d",&j); 	s=(LinkList)malloc(sizeof(LNode)); 	printf("请输入要插入的数："); 	scanf("%d",&(s->data)); 	if(j<1||j>n+1) 		printf("插入位置错误："); 	else 	{ 		for(i=0;i<j-1;i++) 			r=r->next; 		s->next=r->next; 		r->next=s;	 	} 	return L; }  LinkList DeleteList(LinkList L,int n)//单链表的删除 { 	LinkList s,r=L; 	int i,j,k; 	printf("请输入要删除的位置："); 	scanf("%d",&j); 	if(j<1||j>n+1) 		printf("要删除的位置越界："); 	else 	{ 		for(i=0;i<j;i++) 		{ 			s = r; 			r=r->next; 		} 		k=r->data; 		printf("删掉的数为%d",k);  		s->next = r->next; 		/* 		while(r) 		{ 			(r-1)->next=r->next;//被删元素之后的元素左移 		} 		*/ 		free(r); 		return L; 	} } void OutPutList(LinkList L)//输出链表 {   	LinkList p; 	p=(LinkList)malloc(sizeof(LNode));//删掉这句还是可以运行 	p=L->next; 	printf("表中值为:");   	while(p)  	{   		printf("%d ",p->data);  		p=p->next;  	}   	printf("\n");  }  int main()  {    	int len; 	printf("请输入表长："); 	scanf("%d",&len); 	printf("请输入："); 	createList(len); 	OutPutList(L); 	InsertList(L,len); 	OutPutList(L); 	DeleteList(L,len); 	OutPutList(L); 	return 0; }   崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 520，送给我的夫人

回复:
user: user-0
content: 里面的每一个变量名，每个单词，都是有特殊的意思的，我把这些年的经历，都写进去了呢

user: user-1
content: 。。。。拿来哄妹子不错

user: user-2
content: 引用 9 楼 lmy121的回复:marry未定义呀 只是一个goto的标志，无需定义

user: user-3
content: 没什么卵用呀。

user: user-4
content: marry未定义呀

user: user-0
content: 引用 3 楼 paschen 的回复:  这里好像少了一个%c来输出 ！  printf("%c %c%c%c%c %c%c%c%c", five, two, zero, j, q, r, b, c, w);谢啦

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

user: user-6
content: 这里好像少了一个%c来输出 ！  printf("%c %c%c%c%c %c%c%c%c", five, two, zero, j, q, r, b, c, w);

user: user-7

user: user-8

user: user-9
content: 没创意，楼主可以试试用I love you这些字符填充一颗心。

user: user-5
content: 引用 6 楼 user-10 的回复:marry:     return 0; 这是说结婚就玩完的意思么？ 从此之后，她和他就过上了幸福生活……

user: user-10
content: marry:     return 0; 这是说结婚就玩完的意思么？
user-0 提问: 字符串

回复:
user: user-1
content: C最早设计时定义了“常量”字符串，可以在编译时做优化节省空间. 常量字符串编译时会将相同的值合并到一起。 而"a","ab","abc"显然不是相同的值

user: user-2
content: “a”“ab”“abc”是三个不同的常量字符串，分开存储。

user: user-3
content: %p是输出地址，printf("%p\n", "a");输出的是"a"这个常量字符串的地址  如果需要输出字符串的值，用%s  “a” “ab”  “abc” 是不同的常量，内存地址不相同的
user-0 提问: 关于linux进程创建函数fork

回复:
user: user-1
content: copy on write机制，前面是共享的，后面如果你不对变量做写操作它也是共享的。 自己搜下理解下这个机制。

user: user-0
content: 引用 1 楼 x20121223 的回复:fork()是克隆出一份父进程的内容，会保留父进程的所有当前状态。所以输出一样的。 哦，明白了，是在执行之前就共享了变量，谢谢你啊

user: user-2
content: fork()是克隆出一份父进程的内容，会保留父进程的所有当前状态。所以输出一样的。
user-0 提问: 求前50个质数.要求确定一个数n是否是质数，用已求出的质数对n的整除性来确定.

回复:
user: user-1
content: 引用 5楼ghx287524027 的回复:判断一个自然数是不是质数，可以用所有比它小的质数从小到大依次去除它，除到商比除数小，而且还有余数，它就是质数，否则不是质数。应该是比它平方根小的质数吧。

user: user-2
content: 引用 7 楼 Justarte 的回复:[quote=引用 5 楼 ghx287524027 的回复:] 判断一个自然数是不是质数，可以用所有比它小的质数从小到大依次去除它，除到商比除数小，而且还有余数，它就是质数，否则不是质数。   没理解, 比如要判断13是不是质数, 那么用1,3,5,7,一次去除以13, 然后得到的商比13小, 且有余数,  [/quote]  原理其实和8楼说的差不多，只不过是除的次数少一点。比如对于19，比它小的质数有2,3,5,7,11,13,17.那么从小到大依次用2,3,5,7,11,13,17去除19.当用5去除19的时候，商为3，小于5，并且此时有余数。那么就可以判断19是质数了，不再需要用其余的数再去除19了。

user: user-3
content: 是这样的：  n从2开始。这时n=2。 此时还没有确认哪个数是质数，因此“已求的质数”是个空集。用这个空集里的所有已求的质数（这时个数为0）对n（这时就是2）的整除性来确定2是不是质数。因此有0个已求的质数能整除2。也就是说没有一个已求的质数能整除2，因此2是质数。 此时“已求的质数”不是个空集，而是有一个成员“2”。“已求的质数”就是“2”。  然后判断下一个n，（=3）是不是质数。这时“已求的质数对n的整除性来确定”3是不是质数，意思就是用2对3的整除性来确定3是不是质数。由于2不能整除3，所以3是质数。 这时“已求的质数”就是“2”和“3”。  然后判断下一个n，就是4，是不是质数。“已求的质数对n的整除性来确定”4是不是质数，意思就是用2和3对4的整除性来确定3是不是质数。由于2能整除4，所以4不是质数。

user: user-0
content: 引用 5 楼 ghx287524027 的回复:判断一个自然数是不是质数，可以用所有比它小的质数从小到大依次去除它，除到商比除数小，而且还有余数，它就是质数，否则不是质数。   没理解, 比如要判断13是不是质数, 那么用1,3,5,7,一次去除以13, 然后得到的商比13小, 且有余数,

user: user-4
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-2
content: 判断一个自然数是不是质数，可以用所有比它小的质数从小到大依次去除它，除到商比除数小，而且还有余数，它就是质数，否则不是质数。

user: user-2
content: 引用 3 楼 Justarte 的回复:[quote=引用 1 楼 ghx287524027 的回复:] 求哪里的前50个质数？  应该是所有质数中的前50个[/quote]  那题目意思应该就是，先求出前50个质数，然后根据这50个数来对整数n的整除性作出分析，从而判断n是否也为质数。

user: user-0
content: 引用 1 楼 ghx287524027 的回复:求哪里的前50个质数？  应该是所有质数中的前50个

user: user-5
content: 筛选法吧。。。

user: user-2
content: 求哪里的前50个质数？
user-0 提问: c语言指针问题

回复:
user: user-1
content: 你把printf都放函数里

user: user-2
content: 函数FindMax里的局部变量i和j，只在这个函数体内有效，出了这个函数体后，就自动被系统回收了。也就是说这个函数用完了之后，m,n指向的内存已经被回收了。

user: user-3
content: int FindMax(int score[3][4],int *m,int *n) { static int i,j;

user: user-3
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-4
content: 这个代码运行起来有个错误的  Segmentation fault (core dumped) 不知道你这个为啥没报出来，可能跟编译，运行环境有关。  int *m=NULL; int *n=NULL;  这么写了之后mn两个指针没有分配空间 然后你在赋值那里写的 m=&i; n=&j 就是让m n指向了ij的内存，但是ij的内存在函数return之后，就释放掉了，这样mn指向就有问题 一般说来，指针在使用前需要用malloc分配一下内存，你可以对mn进行malloc，但是仅仅这样还是不行 mn分配内存之后，你赋值那里依然是把ij的地址给mn，在函数return之后，那个地址也不能用了，mn的值依然不正确 用malloc给mn分配内存后，在赋值那里写成 *m=i;*n=j;这样就对了，最后记得对malloc的指针进行malloc  不知道这么说对不对，楼上赵老师是专家

user: user-3
content: 请那些喜欢将数组作为函数参数传来传去的码农思考一下为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-5
content: 你在函数中修改指针的值并不会改变函数外的m，n，因为你函数传递参数是按值传递的，也就是说你函数中的m,n只是函数外m,n的一个复制后的值，你修改复制后的值是没有用的  第二，你函数中的 i，j在函数执行完就销毁了，就算你指针指向了它，可能他已经是无用的值了

user: user-6
content: 如一楼所说，注意变量的作用域~

user: user-7
content: 一楼说的对的。局部变量在函数结束就失效了。指向的地址自然也就没了
user-0 提问: 关于void*强制转换的问题

回复:
user: user-1
content: 你这是对内存以不同的形式重新解释，而不是值转换。而且没必要搞个函数吧： int i = 10; printf("%f\n", i);              // 0.0 printf("%f\n", *(float *)&i);   // 0.0 (同上) printf("%f\n", (float)i);       // 10.0

user: user-2
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-3
content: 如果int转float ，结果将是10.0f 但你的是int*转float*，是指针类型的转换，这将导致用float的格式去解释内存中的数据 而浮点数在内存中的存储形式与整数是不同的 参看：http://blog.csdn.net/richerg85/article/details/20456969

user: user-4
content: 1#正解,IEEE标准定义了float的内存布局 参考 深入理解计算机系统 第二章 - 浮点型

user: user-5
content: 引用 2 楼 dustpg 的回复:新手多用static_cast，禁止用C风格转换，少用reinterpret_cast 卧槽，还以为是C++，原来是C，C类型不安全，lz多多小心即可

user: user-5
content: 新手多用static_cast，禁止用C风格转换，少用reinterpret_cast

user: user-6
content: 10在内存中的存储： 0000 1010 0000 0000 0000 0000 0000 0000  浮点数在内存中的存储： http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html  用float去读该内存区域自然读不出来了
user-0 提问: 关于递归调用局部变量空间分配的问题

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

user: user-2
content: 参数是一级指针，只能改变指针指向的区域的值（实参和形参都指向同一块内存，但两个指针本身是不同的） 只有传二级指针或者一级指针的引用才能改变指针本身的值（指针的指向）

user: user-0
content: 原来如此，谢谢大神！

user: user-3
content: 为什么不一样？函数调用的参数传递本质上是值传递 只有引用参数，才是地址传递 每次复制一份node  node 的值当然不会变化了
user-0 提问: 关于rand（），一样的种子每次都产生不同的随机数……

回复:
user: user-1
content: 建议使用<random>，效果优秀

user: user-2
content: srand((int)time(0));

user: user-3
content: 应该是一样的。 基本上都是用系统时间做种子，不过这也是伪随机。

user: user-4
content: 种子相同,每次调用rand()函数出来的随机数都是相同的，种子不同，rand()出来的随机就不会相同，一般种子多选用获取当前的时间，这样每次rand()的值都不会相同的

user: user-5
content: [root@localhost d]# ./a 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 [root@localhost d]# ./a 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421  同样的种子得出同样的序列。 你的截图和我运行两次的结果对比，可以发现：你的第一个序列是不对的（可能代码不对或者不是相同的程序）。

user: user-6
content: srand(time(0)); 用时间来初始化种子

user: user-6
content: srand(time(0));
user-0 提问: 大神能帮我看一下，这个A*算法的程序是完全的吗？

回复:
user: user-1
content: https://github.com/dustpg/NoteFL/blob/master/GraduationProject/PathFinder/pfdAStar.cpp#L322 这是我的实现，让lz参考参考，注释很详细

user: user-2
content: A*算法这个绝对有非常成熟的库及各种相关优化算法。自己写太烧脑了，而且效率并不一定就高。
user-0 提问: 回文数

回复:
user: user-1
content: 这个可以用  #include<stdio.h> long sum( long a){     int t=0,i=0;     long a1=0;     int c[25]={0};     while(a){         c[i]=a%10;         a/=10;         i++;     }        t=i;     for(i=0;i<t;i++)     a1=a1*10+c[i];        return a1; } int main(){     long a; 	long s[100]={0};     int ta,i;     while(scanf("%I64d",&a)!=EOF)     {         ta=0;         s[ta]=a;         while(a!=sum(a))         {                a+=sum(a); 			ta++;             s[ta]=a;         }         for(i=0;i<ta;i++)           printf("%I64d--->",s[i]); 		printf("%I64d",s[ta]);        }     return 0; }

user: user-2
content: 大数加法，用栈。。什么类型都不可以的

user: user-0
content: 引用 3 楼 ghx287524027 的回复:[quote=引用 2 楼 jianjiu7 的回复:] [quote=引用 1 楼 ghx287524027 的回复:] 这个可以用  #include<stdio.h> long sum( long a){     int t=0,i=0;     long a1=0;     int c[25]={0};     while(a){         c[i]=a%10;         a/=10;         i++;     }        t=i;     for(i=0;i<t;i++)     a1=a1*10+c[i];        return a1; } int main(){     long a; 	long s[100]={0};     int ta,i;     while(scanf("%I64d",&a)!=EOF)     {         ta=0;         s[ta]=a;         while(a!=sum(a))         {                a+=sum(a); 			ta++;             s[ta]=a;         }         for(i=0;i<ta;i++)           printf("%I64d--->",s[i]); 		printf("%I64d",s[ta]);        }     return 0; }  不行，题目说明输入的数值不超过2^60，long不够吧[/quote] 你用的什么环境，在vc6.0中是不支持long long类型的[/quote]合工大oj    我在我的devc++上是可以的（我在想是不是输出时溢出了，我感觉我可能没理解那两个提示 1.输入的数据保证小于2^60 2.每组数据保证最多运算100次  （你觉的是数据的原因吗））

user: user-1
content: 引用 2 楼 jianjiu7 的回复:[quote=引用 1 楼 ghx287524027 的回复:] 这个可以用  #include<stdio.h> long sum( long a){     int t=0,i=0;     long a1=0;     int c[25]={0};     while(a){         c[i]=a%10;         a/=10;         i++;     }        t=i;     for(i=0;i<t;i++)     a1=a1*10+c[i];        return a1; } int main(){     long a; 	long s[100]={0};     int ta,i;     while(scanf("%I64d",&a)!=EOF)     {         ta=0;         s[ta]=a;         while(a!=sum(a))         {                a+=sum(a); 			ta++;             s[ta]=a;         }         for(i=0;i<ta;i++)           printf("%I64d--->",s[i]); 		printf("%I64d",s[ta]);        }     return 0; }  不行，题目说明输入的数值不超过2^60，long不够吧[/quote] 你用的什么环境，在vc6.0中是不支持long long类型的

user: user-0
content: 引用 1 楼 ghx287524027 的回复:这个可以用  #include<stdio.h> long sum( long a){     int t=0,i=0;     long a1=0;     int c[25]={0};     while(a){         c[i]=a%10;         a/=10;         i++;     }        t=i;     for(i=0;i<t;i++)     a1=a1*10+c[i];        return a1; } int main(){     long a; 	long s[100]={0};     int ta,i;     while(scanf("%I64d",&a)!=EOF)     {         ta=0;         s[ta]=a;         while(a!=sum(a))         {                a+=sum(a); 			ta++;             s[ta]=a;         }         for(i=0;i<ta;i++)           printf("%I64d--->",s[i]); 		printf("%I64d",s[ta]);        }     return 0; }  不行，题目说明输入的数值不超过2^60，long不够吧
user-0 提问: Debug Assertion Failed!

回复:
user: user-0
content: 引用 12 楼 qq423399099 的回复:fopen打开文件成功，返回文件指针（赋值给fp），打开失败则返回NULL值； fopen_s打开文件成功返回0，失败返回非0。 太感谢了，我纠结了好久，vs2015里面的这些用法不是很理解，造成好多困扰

user: user-1
content: fopen打开文件成功，返回文件指针（赋值给fp），打开失败则返回NULL值； fopen_s打开文件成功返回0，失败返回非0。

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 没有弹出对话框，输入文件名之后，就直接退出来了

user: user-0
content: 引用 7 楼 qq423399099 的回复:楼主贴一下控制台输入的截图 输入之后就闪退了

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

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  请检查每个函数的返回值。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  谢谢指教

user: user-1
content: 楼主贴一下控制台输入的截图

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  请检查每个函数的返回值。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-0
content: 引用 3 楼 qq423399099 的回复:楼主你的scanf_s("%s", filename);这句不对，读%c和%s的时候必须多传入一个参数指定读取的字符的长度 应该改成scanf_s("%s", filename, 10); 楼主可以单步调试或者在下面printf验证一下之前这样的用法是不是正确输入了文件名  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 额……又犯了这种错误，但是，改了之后，输入文件名之后就会自动退出，貌似无法创建文件

user: user-0
content: 额……又犯了这种错误，但是，改了之后，输入文件名之后就会自动退出，貌似无法创建文件

user: user-1
content: 楼主你的scanf_s("%s", filename);这句不对，读%c和%s的时候必须多传入一个参数指定读取的字符的长度 应该改成scanf_s("%s", filename, 10); 楼主可以单步调试或者在下面printf验证一下之前这样的用法是不是正确输入了文件名  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 这个是例题，但是在vs2015，2013下就会出现这样的错误

user: user-3
content: 为什么要用两次ch=getchar()呢？
user-0 提问: C语言读文件如何检测从一个位置读起，然后转存到另一个数组中，再创建一个文件写出

回复:
user: user-1
content: #include <stdio.h> #include <io.h> #include <stdlib.h> #include <malloc.h> #include <string.h> char *buf; long flen; FILE *f; int i; int main() {     f=fopen("in.dat","rb");     if (NULL==f) {         printf("Can not open file in.dat!\n");         return 1;     }     flen=_filelength(_fileno(f));     buf=(char *)malloc(flen);     if (NULL==buf) {         fclose(f);         printf("Can not malloc %d bytes!\n",flen);         return 1;     }     fread(buf,1,flen,f);     fclose(f);     for (i=0;i<flen-5;i++) if (0==memcmp(buf+i,"start",5)) break;     f=fopen("1.txt","wb");     fwrite(buf+i+5,1,flen-i-5,f);     fclose(f);     free(buf);     return 0; }

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:char buf[2000]; FILE *f; int i; f=fopen(...,"rb"); fread(buf,1,2000,f); fclose(f); for (i=0;i<2000-5;i++) if (0==memcmp(buf+i,"start",5)) break; f=fopen("1.txt","wb"); fwrite(buf+i+5,1,2000-i-5,f); fclose(f);  还有就是想请教一下如何使用rb、wb去写。因为我最开始是读了fopen、fwrite的参数配置和指令，然后有尝试使用写，目前还在学习阶段，想看看您的书写方法，在这种实例中0.0

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:char buf[2000]; FILE *f; int i; f=fopen(...,"rb"); fread(buf,1,2000,f); fclose(f); for (i=0;i<2000-5;i++) if (0==memcmp(buf+i,"start",5)) break; f=fopen("1.txt","wb"); fwrite(buf+i+5,1,2000-i-5,f); fclose(f);  sorry，没仔细看，看懂了~~~3Q

user: user-1
content: char buf[2000]; FILE *f; int i; f=fopen(...,"rb"); fread(buf,1,2000,f); fclose(f); for (i=0;i<2000-5;i++) if (0==memcmp(buf+i,"start",5)) break; f=fopen("1.txt","wb"); fwrite(buf+i+5,1,2000-i-5,f); fclose(f);

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:char buf[2000]; FILE *f; int i; f=fopen(...,"rb"); fread(buf,1,2000,f); fclose(f); for (i=0;i<2000-5;i++) if (0==memcmp(buf+i,"start",5)) break; f=fopen("1.txt","wb"); fwrite(buf+i+5,1,2000-i-5,f); fclose(f);   那有多个文件，每个文件长度都不定，我是不是需要strlen(File)，然后File-乱码长-5呢0.0，这一段乱码长要如何减。。。不定长乱码。。。

user: user-2
content: 使用ftell移动到需要读取的位置  参考：http://en.cppreference.com/w/c/io/ftell
user-0 提问: 求助

回复:
user: user-0
content: 引用 4 楼 赵4老师的回复:将相关文件添加到项目、源文件中。 不会添加，第一次碰见，

user: user-1
content: 错误是因为链接时链接器没有找到format这个函数的实现部分，楼主这个函数是在哪定义的，是否导入了库文件

user: user-2
content: 将相关文件添加到项目、源文件中。

user: user-0
content: 引用 1 楼 wang0635的回复:这个函数是哪里的 format(); 还有文件没传，太多了

user: user-0
content: 有很对其他的文件，还没传，太多了

user: user-3
content: 这个函数是哪里的 format();

user: user-4
content: 我刚开始也是的这样的，好像是你上一次没运行完成或者终断了，而你又很快的运行了一次程序，这样导致上一次运行残留的和这一次运行的产生冲突了。方法：保存代码，退出软件，重新进入，打开项目程序

user: user-5
content: 1.如果是自定义的文件，那么需要include头文件，并且将CPP文件添加到项目中 2.如果是别人提供给你的lib,那么也需要include头文件，添加包含目录，添加库目录，附加依赖项 PS：具体操作都可以百度到

user: user-0
content: 引用 5 楼 paschen的回复:错误是因为链接时链接器没有找到format这个函数的实现部分，楼主这个函数是在哪定义的，是否导入了库文件 没导入，不知道怎么导入库函数
user-0 提问: 关于调用函数过程中被调用函数的问题

回复:
user: user-1
content: 引用 4 楼 youxirenjia90 的回复:[quote=引用 2 楼 ghx287524027 的回复:] 值传递和引用传递的问题 你好，这两个有什么具体的区别么。对于值传递和引用传递？[/quote] 关于值传递和引用传递，百度上有很多，c/c++/java都可以，原理差不多

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: 你函数中的参数只是实际参数的一个复制器，你交换的仅仅是两个复制品，而不是实际参数  用指针的话，指针是个复制器，但你可以修改指针指向的值

user: user-4
content: C 只有值传递 所以，需要改变的对象要传入地址。形参是指针，通过指针间接改变 ，传入地址中的数据（这是指针的功能）。 C++多了个引用参数 传入对象（名），即可匹配引用参数 引用参数可以修改传入的实参对象。（这就是别名的含义）

user: user-1
content: 姑且这么标识一下  #include <stdio.h>  swap(int *p1,int *p2){ 	int temp;               	temp=*p1;                  	*p1=*p2; 	*p2=temp; } swap1(int x,int y){     	int temp; 	temp=x; 	x=y;  	y=temp; } swap2(int *p1,int*p2){ 	int *p; 	p=p1; 	p1=p2; 	p2=p; }  int main(){ 	int a,b; 	int *pointer_1; 	int *pointer_2; 	scanf("%d%d",&a,&b); 	pointer_1=&a; 	pointer_2=&b; 	if(a<b){ 		swap(pointer_1,pointer_2); 		swap1(*pointer_1,*pointer_2); 		swap2(pointer_1,pointer_2); 		printf("%d\n%d\n",a,b); 	} 	return 0; }    swap属于引用传递，可以达到交换a,b的目的，不必多说。 swap1属于值传递，虽然对x,y进行了交换，但跟a,b没关系，不会影响a,b的值。 swap2虽然也是引用传递，但是只是改变了指针的指向，a,b的实际值并没有改变

user: user-0
content: 引用 2 楼 ghx287524027 的回复:值传递和引用传递的问题 你好，这两个有什么具体的区别么。对于值传递和引用传递？

user: user-1
content: 值传递和引用传递的问题

user: user-5
content: 这就是指针嘛，/*.........*/中的代码，说白了就是  a = 3; b = 4; swap( a, b );实际上就是swap( 3, 4 )   3和4都是数，怎么可能被交换呢？  换成指针就是 swap( 装3的盒子， 装4的盒子 ），在swap里面把盒子里面的东西互换一下。

user: user-1
content: 能不能规范一下代码啊，看起来很痛苦的说~
user-0 提问: 三目运算中 (x>=y)?x:y中的等号加还是不加

回复:
user: user-1
content: 算正确，参考答案仅供参考

user: user-2
content: 效果一样，答案只是个参考 不过在这里面很少用=

user: user-3
content: int max = x < y ? y : x;  能使用 < 的地方，不要使用其他的。

user: user-4
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-5
content: 在此处加不加等号是一样的

user: user-6
content: 从功能上来说有没有等号都是可以的，效果一样
user-0 提问: 求指错，一运行就停止工作

回复:
user: user-1
content: 1、ArrayInputTwoDem 这个对数组初始化时，循环少了一层，你这是二维数组 2、BubbleSortTwoDem 排序那里，for(k=0;k<N-j;k++)，j=0的时候，你看看你下面比较用的k+1,会出什么问题

user: user-2
content: ArrayInputTwoDem函数里，j没有初始化就使用了

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

user: user-4
content: ArrayInputTwoDem()函数中少了一层for循环
user-0 提问: （新人贴）求助湖里的大神

回复:
user: user-1
content: for (i=1;i<=n-1;i++)         r[i]=66.1157/sqrt(1-pow(0.6*cos(k[i]),2)); //此时i的值为n即18     d[i]=((r[i+1]-r[i])/h[i+1]-(r[i]-r[i-1])/h[i])*6/(h[i]+h[i+1]);//越界！

user: user-0
content: 请说明白点，没看出来哎，谢谢

user: user-2
content: 能不能把括号补全
user-0 提问: 如何给已经定义好的结构体，重新增加几个（个数动态变化）变量，以便程序的其他地方给这几个变量赋值，

回复:
user: user-1
content: 你就算加上也没有用，因为使用者不知道。  在很多使用，我们需要动态的使用一个数据结构。 此时需要使用一个标识来表示这个结构的额外数据。 使用 flag and union 来标识 数据。 在结构体开始定义一个 size 来表示这个结构数据的大小。 你可以看到 Windows API 很多传入和传出结构都是有 Size 的。 就是他的数据就像你这样的。  struct { int size; int flag; union { struct  {} _1; struct { } _2; } }

user: user-2
content: 改不了~~~

user: user-3
content: realloc ？

user: user-4
content: 在结构体中放个void *指针？ 有3个int的时候就转换成int *,并且分配3*sizeof(int)的空间 如果是double,那就转成double *

user: user-5
content: 结构体不能动态修改

user: user-6
content: 结构体的定义是在编译前，编译好的程序运行时全是二进制数据了

user: user-7
content: 1）修改原来的代码 2）传递结构体指针并强制转换