Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教下这个递归程序的栈结构怎么理解？

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

user: user-2
content: 楼主单步跟踪程序运行，看程序运行流程，就能理解了

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

回复:
user: user-1
content: 写代码就不要用中文输入法，整天出现标点符号不对这种问题，就别用了VC6了吧，下载个DevC++也好，顺便说一下，谭浩强的书不太好，还不如搞个C Primer Plus。

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

user: user-3
content: 换成VS，这种错误都有提示的，两个大括号都会出现红线，你就知道不对了 VC6太老了  #include <stdio.h> int main()  { 	float a, b, t; 	scanf("%f,%f", &a, &b); 	if (a > b) //将ab的值互换 	{ 		t = a; 		a = b; 		b = t; 	} 	printf("%5.2f,%5.2f \n", a, b); 	return 0; }

user: user-4
content: if的大括号要用英文下的括号，你的是中文下的

user: user-5
content: 你 if 后面那对大括号是全角的吧 ...
user-0 提问: 数据结构线表插入问题

回复:
user: user-1
content: for(k=L->last;k>=i-1;k++)  这里是滞应该是 k--

user: user-2
content: # include<stdio.h> # define Maxsize 100 # define OK 1 # define ERROR 0 typedef struct { 	int elem[Maxsize]; 	int last; }SeqList; //1. last为顺序表长度 SeqList Create(SeqList L) //2. 这里你用的是传值的方式，并不会修改你传入对象的状态，建议使用传引用的方式 { 	//3. 你这里的意思看起来是想对静态表做初始化 	for(int i=0;i<L.last;i++) 		scanf("%d",&L.elem[i]); 	return L;//如果非要这样返回也能接受，但并科学 } void visit(SeqList L)  { 	for(int i=0;i<L.last;i++) 		printf("%d\t",L.elem[i]); 	printf("\n");  } int InsList(SeqList *L,int i,int e) { 	int k; 	// 条件应改成：if( i < 0 || i > 5) 	//if((i<1)||(i>L->last+2)) 	if( i < 0 || i > 5) 	{ 		printf("插入位置i值不合法");  		return (ERROR);  	} 	//移动条件有问题 	//for(k=L->last;k>=i-1;k++) 	//	L->elem[k+1]=L->elem[k]; 	for(k = L->last; k > i; -- k)  	{ 		L->elem[k] = L->elem[k-1]; 	}  	L->elem[i]=e; 	L->last++; 	visit(*L); 	return (OK); } int main() { 	SeqList L1; 	L1.last=5; 	L1=Create(L1); 	visit(L1); 	int i=InsList(&L1,5,3); }

user: user-0

user: user-0
content: 谢谢你们的回复
user-0 提问: 谁能帮忙翻译成pascal，谢谢，在线等=============可以加分

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问:  C语言模拟密码输入（显示星号）问题，帮看一下【请大神光临寒舍】

回复:
user: user-1
content: 还是if (ch=='\r')应该改为if (ch=='\n')吧

user: user-2
content: 字符串是要以\0结尾的，你第一段代码里，字符数组后面并未以\0结尾

user: user-1
content: 加一句pwd[i]='\0';就可以了。。。。。。。。
user-0 提问: scanf的奇怪问题

回复:
user: user-1
content: Scanf的问题，不用管，用getchar清一下回车就好了

user: user-2
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-3
content: scanf(" %c",&c);可以解决上次遗留的空白符号 但是要想收到回车就不行了 如果有其他多余字符，也会被接收 scanf 并不是同步输入的 用户输入一次（到回车才算结束）， 可以被 几次scanf ，或者 几个 数据接收。 直到缓冲区数据用完，才会用新数据，不足就会等待新数据的输入。

user: user-4
content: 接收完之后加上这个 fflush(stdin);

user: user-5
content: 解救办法：第一种：把最后的printf("cVal = %c\n",cVal);  改为printf("%c\n",cVal);         第二种：在输入的时候写为cVal = 1 解析：scanf()函数的工作原理是将你在屏幕输入的字符都存入缓冲区里，当你按下回车键的时候，计算机再读取缓冲区里的字符，然后输出，假如你分别输入：w e r  然后你再摁下回车键等待输出，这时候scanf函数会检测第一个字符是 w 把它输出，并且将w删掉，这时缓冲区就剩 e r \r 了，同理将 e r都输出后剩下\r这个回车的字符，重要时刻来了！你的输出格式是cVal = %c，那么你在输入的时候就必须写为cVal = 某某某这个格式，如果不这样写，直接输入某某某，就会起冲突！cVal = 某某某 和 某某某 是对不上号的！     所以关键时你的输入格式不对！！！！！！

user: user-6
content: 回车也是个char，所以需要加getchar();过滤掉

user: user-7
content: int main() {   char cVal;   while(1)   {      printf("input a char\n");      scanf("%c",&cVal); 	 while(getchar()!='\n') 		 continue;//扔掉缓冲区换行符以前的所有字符      printf("cVal = %c\n",cVal);   } } 遇到这种问题加个getchar()就好

user: user-0
content: getchar
user-0 提问: 编译原理里面研究的"句柄"的概念，到底只要解决什么问题?

回复:
user: user-1
content: 句柄就是控制一件事物的手段。例如文件句柄就是控制一个文件的写入和读取操作，直至系统关闭回收。

user: user-2
content: 不是解决编译问题  是操作系统用来管理不同的对象，给他们一个编号而已  比如窗口、线程、图标等都会对应一个句柄，这样可以方便标识与管理   句柄其实也就是一个整数值，而且是唯一的
user-0 提问: c程序编译正常，运行出错，初步判定问题在指针上，求解决

回复:
user: user-0
content: 引用 7 楼 user-4 的回复:ThreadPoint next;     next=(ThreadPoint)malloc(sizeof(ThreadPoint)); ///??? 你这里 分配一个 “ 指针大小” 的内存是做啥子？ ///一般都是 ：               struct  XXX *p = //结构体指针类型  (struct  XXX *) //强制转换成结构体指针类型 malloc( sizeof(struct  XXX) //结构体的大小 );   如果您有兴趣，可以看看刚写的博客，如有错误，请您指正。万分感谢！ 戳这儿：http://blog.csdn.net/firparks/article/details/52495525

user: user-0
content: 引用 7 楼 user-4 的回复:ThreadPoint next;     next=(ThreadPoint)malloc(sizeof(ThreadPoint)); ///??? 你这里 分配一个 “ 指针大小” 的内存是做啥子？ ///一般都是 ：               struct  XXX *p = //结构体指针类型  (struct  XXX *) //强制转换成结构体指针类型 malloc( sizeof(struct  XXX) //结构体的大小 );  学习了 谢谢

user: user-0
content: 引用 3 楼 qq423399099 的回复:1.你main函数调用createBinaryTree的时候，传的是&branch,也就是char **类型的，而函数声明是char * 2.createBinaryTree函数里字符串赋值用strcpy,而不是直接用= 学习了，多谢指教  很有用

user: user-0
content: 引用 2 楼 adlay 的回复:char * branch;    scanf("%s",branch);        //一次性输入  这个指针都没有初始化, 使用当然出问题 你的编译器都不提醒你吗? dev c++ ，一下就编译通过了，措手不及。。。谢谢指教

user: user-0
content: 引用 1 楼 zycxnanwang 的回复:楼主，建议你调试一下，别人调试没有自己来得深刻， 有百分之80的可能是你的结构体指针未分配空间，就直接对其指向， 典型的野指针问题！ 多谢指教 我试试

user: user-1
content: 1.你main函数调用createBinaryTree的时候，传的是&branch,也就是char **类型的，而函数声明是char * 2.createBinaryTree函数里字符串赋值用strcpy,而不是直接用=

user: user-2
content: char * branch;    scanf("%s",branch);        //一次性输入  这个指针都没有初始化, 使用当然出问题 你的编译器都不提醒你吗?

user: user-3
content: 楼主，建议你调试一下，别人调试没有自己来得深刻， 有百分之80的可能是你的结构体指针未分配空间，就直接对其指向， 典型的野指针问题！

user: user-4
content: ThreadPoint next;     next=(ThreadPoint)malloc(sizeof(ThreadPoint)); ///??? 你这里 分配一个 “ 指针大小” 的内存是做啥子？ ///一般都是 ：               struct  XXX *p = //结构体指针类型  (struct  XXX *) //强制转换成结构体指针类型 malloc( sizeof(struct  XXX) //结构体的大小 );
user-0 提问: 为什么输入一个字母后，会连续输出两个printf内容呢

回复:
user: user-1
content: 因为读取到回车才结束，所以缓冲区还留着回车符，第二次循环直接从缓冲区读取了回车 所有显示了2次！可以在后面加上getchar 吃掉回车！

user: user-2
content: 在每个最后不带\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-3
content: 再或者这样：   #include <stdio.h> int main() { 	char ch[2]; 	char s; 	int i = 0; 	do{ 		printf("please enter the string!\n"); 		scanf_s("%s", ch, 2); 		s = ch[0]; 		if (s >= 'a'&&s <= 'z' || s >= 'A'&&s <= 'Z') 		{ 			printf("YES!"); 		} 	} while (s != '0'); 	printf("NO!\n"); }

user: user-3
content: 解决方法可以在scanf_s加上getchar();

user: user-3
content: 每次输入完后的换行符 \n 会在下一次接收进来
user-0 提问: 如何用C语言在电脑上编程获取由单片机控制的wifi模块传输的数据

回复:
user: user-1
content: 引用 4 楼 xr_zy1110 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] C和wifi中间还隔了一层socket 赵老师，有没有对socket初学者学习的知识链接呢？[/quote] 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:C和wifi中间还隔了一层socket 赵老师，有没有对socket初学者学习的知识链接呢？

user: user-0
content: 引用 2 楼 user-2 的回复:可以，楼主，我现在也在做这个，把外设监控的到信息，即时传递给显示服务器 您用的是在网页上显示吗

user: user-2
content: 可以，楼主，我现在也在做这个，把外设监控的到信息，即时传递给显示服务器

user: user-1
content: C和wifi中间还隔了一层socket
user-0 提问: 有没有用c语言写过服务端通信接口的程序，求指导

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

user: user-2
content: 上  git ，上面有你想要的一切一切！！！  https://github.com/

user: user-0
content: #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h>   #define MYPORT  8887 #define QUEUE   20 #define BUFFER_SIZE 1024   int main() {		     ///定义sockfd     int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);       ///定义sockaddr_in     struct sockaddr_in server_sockaddr; 	server_sockaddr.sin_family = AF_INET;     server_sockaddr.sin_port = htons(MYPORT);     server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);  	///bind，成功返回0，出错返回-1 	if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)     {	         perror("bind");         exit(1);     }   	///listen，成功返回0，出错返回-1     if(listen(server_sockfd,QUEUE) == -1)     {		         perror("listen");         exit(1); 	}       ///客户端套接字 	char buffer[BUFFER_SIZE];     struct sockaddr_in client_addr;     socklen_t length = sizeof(client_addr);      ///成功返回非负描述字，出错返回-1     int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);     if(conn<0)     {	         perror("connect");         exit(1);     }      while(1)     {	         memset(buffer,0,sizeof(buffer));         int len = recv(conn, buffer, sizeof(buffer),0);         if(strcmp(buffer,"exit\n")==0) 		    break;         fputs(buffer, stdout);         send(conn, buffer, len, 0);     } 	close(conn); 	close(server_sockfd);     return 0; }  我应该把我的数据加到这个程序的那块呀

user: user-0
content: 我是要把批处理程序中的数据传到界面中显示， 我要写的是服务端， 前台给我发送请求，所以我要连接前台把数据把数据传给它

user: user-3
content: 从前台发送命名，要求后台执行某种操作。

user: user-4
content: 你说的后台和服务端是什么关系？  你已经有后台了为什么还要写服务端？

user: user-0
content: 前台是一个报表系统，是用java写的客户端程序，我想用socket写服务端通信，但是不知道怎么写

user: user-5
content: 你所说的“前台”是指什么？网页？还是pc的客户端程序？ 简单的可以使用xml json 传输，复杂的可以用soap。 当然也可以用protobuf之类的序列化工具

user: user-6
content: 开一个socket服务器端

user: user-7
content: 把整个架构大概描述一下啊，看到有报表系统，应该比较完备了吧，那把数据按格式填数据库里不完事了？

user: user-8
content: 建议openresty建立http服务器，然后openresty和你的c程序通信来解决数据分发的问题。 如果是主动推送，那就得自己写服务器了。
user-0 提问: 帮我分析一下这个运算过程，谢谢

回复:
user: user-1
content: b++先用b运算再+1   b--也类似 ++a先+1再用a运算   --a也类似 楼主举的例题c=a-(b--)； 是因为b--为1，a为12 所以c=11  d=((a++)-b++)+(--c); a++为3， 因为++/--运算优先级高于+/- 所以先算b++为12， --c为3， d=3-12+3为-6

user: user-2
content: C++里的表达式 跟 算数里的算式 完全不是一回事。  把这个搞清楚很多事情就好理解了 ...

user: user-0
content: 引用 11 楼 Zjuexing的回复:b++先用b运算再+1   b--也类似 ++a先+1再用a运算   --a也类似 楼主举的例题c=a-(b--)； 是因为b--为1，a为12 所以c=11  d=((a++)-b++)+(--c); a++为3， 因为++/--运算优先级高于+/- 所以先算b++为12， --c为3， d=3-12+3为-6 OK thank you

user: user-3
content: 代码游戏, 合格的程序员从不会写这样的语句: d = ((a++)-b++)+(--c); 对C, C++程序员来说, 有时候避免错误最好的方式就是: Absolutely not to do that.

user: user-4
content: 我推算了一下也是-6，这种++，--的东西有时候推论毫无意义

user: user-5
content: 3-12+3 = -6

user: user-5
content: 引用 6 楼 w15234491291的回复:[quote=引用 2 楼 小灸舞的回复:]楼主是怎么推算出的-5 就是++，--在变量前还是变量后的区别 是先参与计算再自加自减，还是先自加自减再参与计算 我是这样运算的，①先算a++得4；②因为b++是后自增，所以先运算4-b得-8，然后b++（b得13）；③再算--c得3；④最后-8+3得5。  （我是先算（a++）-b的），因为有这样一道题:     int a = 12;    int b = 1;    int c;        int c = a-(b--);     得到c =11;(这个过程就是先算a-b的)[/quote] a++ 和 b++ 都是后置的++，所以都最后才自加

user: user-0
content: 引用 2 楼 小灸舞的回复:楼主是怎么推算出的-5 就是++，--在变量前还是变量后的区别 是先参与计算再自加自减，还是先自加自减再参与计算 我是这样运算的，①先算a++得4；②因为b++是后自增，所以先运算4-b得-8，然后b++（b得13）；③再算--c得3；④最后-8+3得5。  （我是先算（a++）-b的），因为有这样一道题:     int a = 12;    int b = 1;    int c;        int c = a-(b--);     得到c =11;(这个过程就是先算a-b的)

user: user-0
content: 引用 1 楼 user-8的回复:d = ((a++)-b++)+(--c); 这个是看运算符的优先级：++和--都是高优先级，然后（）更高，最后是+，-。 所以第一步：计算a++：返回自加之前的结果，所以(a++) = 3; 第二步：计算b++：返回自加之前的结果，所以(b++) = 12; 第三步：计算--c：返回自减之后的结果，所以(--c) = 3; 第四步：计算上面结果的值：3 - 12 + 3 = -6; -8+3=-5（不好意思，写错了）

user: user-0
content: 引用 1 楼 user-8的回复:d = ((a++)-b++)+(--c); 这个是看运算符的优先级：++和--都是高优先级，然后（）更高，最后是+，-。 所以第一步：计算a++：返回自加之前的结果，所以(a++) = 3; 第二步：计算b++：返回自加之前的结果，所以(b++) = 12; 第三步：计算--c：返回自减之后的结果，所以(--c) = 3; 第四步：计算上面结果的值：3 - 12 + 3 = -6; 我是这样运算的，①先算a++得4；②因为b++是后自增，所以先运算4-b得-8，然后b++（b得13）；③再算--c得3；④最后-8+3得5。  （我是先算（a++）-b的），因为有这样一道题:     int a = 12;    int b = 1;    int c;        int c = a-(b--);     得到c =11;(这个过程就是先算a-b的)

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

user: user-7
content: 楼主是怎么推算出的-5 就是++，--在变量前还是变量后的区别 是先参与计算再自加自减，还是先自加自减再参与计算

user: user-8
content: d = ((a++)-b++)+(--c); 这个是看运算符的优先级：++和--都是高优先级，然后（）更高，最后是+，-。 所以第一步：计算a++：返回自加之前的结果，所以(a++) = 3; 第二步：计算b++：返回自加之前的结果，所以(b++) = 12; 第三步：计算--c：返回自减之后的结果，所以(--c) = 3; 第四步：计算上面结果的值：3 - 12 + 3 = -6;
user-0 提问: C语言链表问题

回复:
user: user-1
content: 你结构体的成员name,sex指针都是需要分配空间的，或者你就改成数组就行了，像下面这样：  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct member{ 	char name[32], sex[32]; 	struct member* pNext;  }Member, *PMember;  PMember createMember(){//创造头节点 	PMember head = NULL; 	head = (PMember)malloc(sizeof(Member)); 	head->pNext = NULL; 	strcpy(head->name, "1"); 	strcpy(head->sex, "1"); 	return head; } void display(PMember head){//显示输出 	if (NULL == head) return; 	PMember temp1 = head; 	for (; temp1 != NULL; temp1 = temp1->pNext){ 		printf("\t%s\t%s\n", temp1->name, temp1->sex);   	}  } void add(PMember head){//添加新成员 	PMember m = NULL; PMember temp = NULL; 	if (NULL == head)return; 	m = (PMember)malloc(sizeof(Member)); 	printf("请输入你的个人信息：\n"); 	scanf("%s%s", &m->name, &m->sex); 	m->pNext = NULL;  	for (temp = head; temp->pNext != NULL; temp = temp->pNext);  	temp->pNext = m; } int main(){ 	PMember head = NULL; 	head = createMember(); 	add(head); 	add(head); 	add(head); 	display(head); 	return 0; }

user: user-2
content: add函数中没有为name sex指针分配内存就直接在scanf中使用了  你只分配了member结构体内存，结构体中的指针仍指向一块不确定的位置
user-0 提问:  c实现将mysql数据库中的数据转化为json数据在前台显示  

回复:
user: user-1
content: 在百度搜“C源代码 mysql json”

user: user-0
content: 我现在要把后台程序中（c语言编写）的数据转化为json数据在前台显示（前台是JAVA)
user-0 提问: c语言

回复:
user: user-1
content: 好久没用了，记不大清快捷键了。不要用F5执行，要用alt+F5？ 好像是调试运行那个，你多试几把，不是代码的问题，是运行方式不对

user: user-2
content: 引用 6 楼 AS1832的回复: 那么，无法打开pdb文件是怎么回事呀。如果没这个问题，是不是就不会出现闪退问题呢？ 忽略这些提示，对你没有什么用

user: user-2
content: 因为程序执行完就退出了  在main函数最后加上getchar();等待输入一个字符方才退出

user: user-3
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

user: user-4
content: 直接点执行（ctrl+F5），而不要直接点调试（F5） 或者在函数结束前加一句system("pause") 那个PDB无法打开对你程序没影响，如果要解决可以参考：http://www.tuicool.com/articles/R3EBF3M

user: user-5
content: 你scanf中的%f%f之间没有空格，为什么输入的时候有空格。这个是肯定要蹦

user: user-0
content: 那么，无法打开pdb文件是怎么回事呀。如果没这个问题，是不是就不会出现闪退问题呢？

user: user-0
content: 那我要不加断点呢，直接调试出结果。要怎么做呢，在哪设置呢

user: user-6
content: 从背景来看，只看到有5行代码，应该是你输出之后没有暂停，所以结果才一闪而过，导致看不到输出结果吧； 你可以加入断点，调试确认

user: user-7
content: 可能是出了结果，然后马上退出进程了。  你在代码中设置断点，然后按F5看看。

user: user-8
content: 代码呢？  如果代码没错！是不是一闪而过? 如果是的话 在最后加个 system("pause");   记得带上stdlib.h
user-0 提问: C语言编程

回复:
user: user-0
content: 嗯，我在你的指导下将scanf改为scanf_s.果然解决了这个问题。可是这个工程在哪里呀。求指导啊。刚刚接触这个软件，谢谢了啊

user: user-1
content: 因为这个函数是不安全，可能造成缓冲区溢出，所以现在建议用scanf_s来代替 如果仍想用可以选择以下任何一种方法： 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS

user: user-2
content: 1.高版本VS会让你用scanf_s来替代scanf 2.右击工程 - 属性 - 配置属性 - C/C++  - 命令行 命令行增加 /D _CRT_SECURE_NO_WARNINGS
user-0 提问: 得到有效数字为小数点后6位的数

回复:
user: user-1
content: 需要得到小数点后第n位，之需将原数乘以10的n次方，然后对10取余

user: user-1
content: 有效数字 与 小数点后位数 是两码事

user: user-2
content: #include <stdio.h>  int main() {     const double a = 1.0 / (3.0*3.0);     const double b = a * 1e6;     const int c = (int)b % 10;     printf("%d", c);     return 0; }

user: user-3
content: 自己写个分数计算 或者用大整数当作实数计算

user: user-4
content: printf(".6f",f);就可以了

user: user-5
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-5
content: 仅供参考：#include <stdio.h> void a(double d,int n) {//有效数字为n位的数     printf("%.*lg\n",n,d); } void b(double d,int n) {//小数点后n位的数     printf("%.*lf\n",n,d); } int main() {     double c=100.0/(3.0*3.0);     int w;      //有效数字为6位的数     printf("%.6lg\n",c);      //小数点后6位的数     printf("%.6lf\n",c);      printf("\n");     for (w=1;w<15;w+=2) {         a(c,w);     }      printf("\n");     for (w=1;w<15;w+=2) {         b(c,w);     }      return 0; } //11.1111 //11.111111 // //1e+001 //11.1 //11.111 //11.11111 //11.1111111 //11.111111111 //11.11111111111 // //11.1 //11.111 //11.11111 //11.1111111 //11.111111111 //11.11111111111 //11.1111111111111 //
user-0 提问: struct hostent *phost= NULL;

回复:
user: user-1
content: 引用 4 楼 liangziwan 的回复:[quote=引用 3 楼 adlay 的回复:] 先检查 phost = gethostbyname 返回的值是不是为 NULL, 如果为 NULL, 打印下错误信息看.  手动 ping 一下 ftp.gnu.org 看 DNS 设置是否有问题.  不为NULL，有值的。 是这样，我在虚拟机上已经编译通过，可以正常运行，但移植到开发板上，遇到“phost->”就报错！  Segmentation fault  这个应该是指针错误，属于内存分配的问题，关键我不知道怎么改！[/quote] 内存访问错误都会出 Segmentation fault, 不一定是内存分配问题. 把你返回值检查加到你的代码里面去, 而不是在调试器里面检查下不为 NULL 就行了. 这个是否为 NULL 是运行的时候做 DNS 解析能否成功的问题, 在不同的环境, 不同的时间都是可能不同的.

user: user-0
content: 引用 3 楼 adlay 的回复:先检查 phost = gethostbyname 返回的值是不是为 NULL, 如果为 NULL, 打印下错误信息看.  手动 ping 一下 ftp.gnu.org 看 DNS 设置是否有问题.  不为NULL，有值的。 是这样，我在虚拟机上已经编译通过，可以正常运行，但移植到开发板上，遇到“phost->”就报错！  Segmentation fault  这个应该是指针错误，属于内存分配的问题，关键我不知道怎么改！

user: user-1
content: 先检查 phost = gethostbyname 返回的值是不是为 NULL, 如果为 NULL, 打印下错误信息看.  手动 ping 一下 ftp.gnu.org 看 DNS 设置是否有问题.

user: user-2
content: 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: http://blog.csdn.net/hello_wyq/article/details/1180337
user-0 提问: 连接错误

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

user: user-2
content: 1.getchar少了个括号 2.你的makeinfo写成了makeifo 3.showinfo写成了show  #include<stdio.h> #include<string.h> #pragma comment(lib,"ws2_32.lib")  #define NLEN 30 struct namect { 	char fname[NLEN]; 	char lname[NLEN]; 	int letters; };  struct namect getinfo(void); struct namect makeinfo(struct namect jiegou); void showinfo(const struct namect jiegou); char *s_gets(char * st, int n);  int main(void) { 	struct namect person;  	person = getinfo(); 	person = makeinfo(person); 	showinfo(person);  	return 0; }  struct namect getinfo(void) { 	struct namect person; 	printf("Please enter your first name."); 	s_gets(person.fname, NLEN); 	printf("Please enter your last name.\n"); 	s_gets(person.lname, NLEN);  	return person; }  struct namect makeinfo(struct namect jiegou) { 	jiegou.letters = strlen(jiegou.fname) + strlen(jiegou.lname);  	return jiegou; }  void showinfo(const struct namect jiegou) { 	printf("%s %s,your name contains %d letters.\n", jiegou.fname, jiegou.lname, jiegou.letters); }  char * s_gets(char * st, int n) { 	char *ret_val; 	char * find;  	ret_val = fgets(st, n, stdin); 	if (ret_val) 	{ 		find = strchr(st, '\n'); 		if (find) 			*find = '\0'; 		else 		while (getchar() != '\n') 			continue; 	} 	return ret_val; }

user: user-3
content: 准确得说是 有无法解析的外部符号， 楼主倒数第五行的 getchar() 少一个括号
user-0 提问: c语言编程

回复:
user: user-1
content: 还有建议楼主， 程序的路径尽量不要有英文。

user: user-1
content: 楼主 ， 你检查一下你打开的文件是否正确得打开， 看一下文件指针是否为null,注意文件路劲的写法!

user: user-2
content: 断言失败，点中间重试，然后点中断，通过调用堆栈定位到相关代码，从断言内容看，你的问题应该是文件打开mode写错了

user: user-1
content: 引用 4 楼 OnePeace888的回复:引用 2 楼 zycxnanwang 的回复:还有建议楼主， 程序的路径尽量不要有英文。没觉得有关系啊 打快错了，尽量不要有中文…

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

user: user-4
content: 引用 2 楼 zycxnanwang 的回复:还有建议楼主， 程序的路径尽量不要有英文。没觉得有关系啊

user: user-5
content: 是不是打开模式有问题。 你把打开文件的那句话贴一下。
user-0 提问: C语言链表问题，在经过查询语句之后想再次输出或查询信息直接崩溃

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

user: user-2
content: 1.search没有返回值 2.你main函数的head也有问题,switch外面有一个head,case1里面又有一个？ PS：你可以单步调试看看每一步的值是不是正确，经过查询语句之后你再输出崩溃了。 你可以打印下调用search前后的head地址是不是变了（甚至可以打印每个节点的地址），就知道问题了 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 2 楼 user-4 的回复:你的 search 函数没有返回一个值 谢谢，少了 return

user: user-0
content: 引用 3 楼 qq_36068954 的回复:做项目就好好做，干嘛跑来问别人 项目遇到不会的了，你给我继续做啊，请教过老师，但没有怎么说明，叫我自己测试，我不会请教下别人又怎么了，你这样搜有意思吗？

user: user-3
content: 做项目就好好做，干嘛跑来问别人

user: user-4
content: 你的 search 函数没有返回一个值

user: user-0
content: 好像是数据丢失了。。。。。。。。。。。。希望大家帮帮忙
user-0 提问: C语言指针问题！总觉得p改变了

回复:
user: user-1
content: 参考： 《深入理解C指针》

user: user-1
content: 传引用，形参是实参的别名。 否则，都是传值，形参是函数内一个局部变量，实参拷贝给形参，形参改变后不影响实参。 参考swap函数。

user: user-2
content: 引用 6 楼 visiual的回复:[quote=引用 5 楼 paschen 的回复:] 要改指针的值，要传入指针的指针 这个程序的输出是4,3，3，如果我注释掉int b=2;a=&b;输出是6，6，6，我觉得这时候，a作为一个临时变量，它与p指向的内容是相同的，对它的内容操作就改变了*p，k也改变了，这样理解对不对？ [/quote] 注释掉a=&b，后面那句*a将会修改到p指向的值（也即k或者是*p）

user: user-3
content: 你记住实型，整形，字符型变量是单向值传递，如果是数组的话指针P指向的数据才会改变。

user: user-0
content: 引用 5 楼 paschen 的回复:要改指针的值，要传入指针的指针 这个程序的输出是4,3，3，如果我注释掉int b=2;a=&b;输出是6，6，6，我觉得这时候，a作为一个临时变量，它与p指向的内容是相同的，对它的内容操作就改变了*p，k也改变了，这样理解对不对？

user: user-2
content: 要改指针的值，要传入指针的指针

user: user-2
content: a=&b 没有改变p的值，你的函数是按值传递的，也就是传过来的只是一个复制品，你改也只是在改复制品

user: user-4
content: “这个p的副本，假设是p1”， 不用假定p1, 就是sp的参数a.  本质肯定差不多, 要么压入栈, 要么用寄存器传递, 要么被内联优化掉了, 可以尝试看一下汇编代码. 不需要懂汇编, 然后分别传递int k的值，与地址，看看生成的代码区别

user: user-0
content: 引用 1 楼 user-4 的回复:sp(p)传了p的值...可以认为是传递了一个p的副本 sp函数里面修改了p的副本, 没有修改p本身, 要修改p本身就要传递p的地址.  想象一下:     int k = 3;     sp(&k);   这样也是完全合法的  这个p的副本，假设是p1，相当于设置了两个不同名的指针变量但都指向了k，在函数中p1指向了b，接着有改变了它的内容，整个过程与p无关是吗？我还想知道的是这个地址传递和值传递的本质是一样的吗？都是要创建临时副本？“假设注释掉int b=2;和a=&b;这样以来p1和p所指的内容是相同的，表面上改变了p1，实际上也p改变了，是不是？

user: user-4
content: sp(p)传了p的值...可以认为是传递了一个p的副本 sp函数里面修改了p的副本, 没有修改p本身, 要修改p本身就要传递p的地址.  想象一下:     int k = 3;     sp(&k);   这样也是完全合法的
user-0 提问: 关于链表的查询。学生信息系统的查找

回复:
user: user-1
content: 楼主程序界面做的不错！  推荐楼主使用C++ Builder学习图形用户界面编程，入门比较容易。  仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/

user: user-2
content: 引用 4 楼 blank__box的回复:[quote=引用 3 楼 paschen 的回复:] 在调试模式下运行程序，出错了点中断，通过调用堆栈定位到出错位置，然后观察分析原因，必要时单步跟踪程序运行 只要不运行查询语句块就是对的，但是一经过查询语句块之后就不能进行再次的显示和查询了，好像链表再那之后就消失了一样[/quote] 不要抱着脑袋去想好像是这好像是那，找问题最好的方式就是调试

user: user-3
content: 我只想知道楼主是东软的吗

user: user-0
content: 引用 5 楼 qq423399099 的回复:你用学号不是可以的吗？ 你用姓名查询会崩溃？ 建议楼主单步调试找到是哪句引发的。 或者贴出完整代码。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  都能用，只是只能查一次，里面录入的信息好像就没有了，如果我第一次就用姓名查找也能查，反正就是查完之后，再想显示后者查找就出错

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

user: user-5
content: 你用学号不是可以的吗？ 你用姓名查询会崩溃？ 建议楼主单步调试找到是哪句引发的。 或者贴出完整代码。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 3 楼 paschen 的回复:在调试模式下运行程序，出错了点中断，通过调用堆栈定位到出错位置，然后观察分析原因，必要时单步跟踪程序运行 只要不运行查询语句块就是对的，但是一经过查询语句块之后就不能进行再次的显示和查询了，好像链表再那之后就消失了一样

user: user-2
content: 在调试模式下运行程序，出错了点中断，通过调用堆栈定位到出错位置，然后观察分析原因，必要时单步跟踪程序运行

user: user-0
content: 补图

user: user-0
content: 补图
user-0 提问: 关于C标准库实现中的内存管理细节问题

回复:
user: user-1
content: 《深入解析Windows操作系统-Windows Internals》 《Windows核心编程》

user: user-0
content: 引用 6 楼 pengzhixi 的回复:可以去看看TLS方面的东西  TLS全称为Thread Local Storage，是Windows为解决一个进程中多个线程同时访问全局变量而提供的机制。TLS可以简单地由操作系统代为完成整个互斥过程，也可以由用户自己编写控制信号量的函数。当进程中的线程访问预先制定的内存空间时，操作系统会调用系统默认的或用户自定义的信号量函数，保证数据的完整性与正确性。

user: user-2
content: 刚好就是你括号里说的那种情况  可以再次调用该函数，可以发现之前的指针处的值已被改变

user: user-3
content: 可以去看看TLS方面的东西

user: user-4
content: 引用 4 楼 hijack00 的回复:你说的意思是会复制一份到线程空间？那么这会涉及到内存管理吗？对这方面了解不是太多，请指教！  就是这个静态变量是每个线程都有一份，互不干扰。

user: user-0
content: 引用 3 楼 akirya 的回复:[quote=引用 2 楼 hijack00 的回复:] [quote=引用 1 楼 qq423399099 的回复:] localtime() return a pointer to static data and hence are not thread-safe  localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的，不是可重入的  谢谢，利用静态存储方式虽然会带来不可重入以及增大文件体积的问题，不过确实也不用考虑动态内存分配了。 [/quote] 现在是用线程局部存储，多线程可重入。[/quote]  你说的意思是会复制一份到线程空间？那么这会涉及到内存管理吗？对这方面了解不是太多，请指教！

user: user-4
content: 引用 2 楼 hijack00 的回复:[quote=引用 1 楼 qq423399099 的回复:] localtime() return a pointer to static data and hence are not thread-safe  localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的，不是可重入的  谢谢，利用静态存储方式虽然会带来不可重入以及增大文件体积的问题，不过确实也不用考虑动态内存分配了。 [/quote] 现在是用线程局部存储，多线程可重入。

user: user-0
content: 引用 1 楼 qq423399099 的回复:localtime() return a pointer to static data and hence are not thread-safe  localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的，不是可重入的  谢谢，利用静态存储方式虽然会带来不可重入以及增大文件体积的问题，不过确实也不用考虑动态内存分配了。

user: user-5
content: localtime() return a pointer to static data and hence are not thread-safe  localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的，不是可重入的
user-0 提问: 九度oj 1009 题目vs2012运行正确，oj错误

回复:
user: user-1
content: 题目呢？？我也想看看oj题

user: user-1
content: 主函数最后是不是要return 0 啊

user: user-2
content: 边界条件 输入输出格式 ……
user-0 提问: c语言关于类型转换的问题

回复:
user: user-1
content: char不一定是代表signed char      signed char - type for signed character representation.      unsigned char - type for unsigned character representation. Also used to inspect object representations (raw memory).      char - type for character representation which can be most efficiently processed on the target system (has the same representation and alignment as either signed char or unsigned char, but is always a distinct type). Multibyte characters strings use this type to represent code units. The character types are large enough to represent 256 different values (in order to be suitable for storing UTF-8 encoded data) (since C++14)    http://en.cppreference.com/w/cpp/language/types

user: user-2
content: 引用 2 楼 永夜将尽的回复:[quote=引用 1 楼 xyless 的回复:] unsigned char的范围就是0-255啊  unsigned char GetNsid(char nsid)  不，你看这个函数的参数，是char类型，返回值才是uchar，传参数的时候不应该像func那样进行默认的类型转换么？[/quote] 你打印的就是函数返回值，将unsigned char扩展为int输出

user: user-3
content: 而 unsigned char 范围是0～255， 不是类型转换能改变的。 类型转换得到的是转换后的数据（包括类型） 有些时候，仅仅是解释方式的改变 例如把 char 转换为 unsigned char ，实际上并不需要做什么

user: user-3
content: unsigned char  和 char ---------可能实现为 signed char ，也可能实现为unsigned char------- signed char  即便互相转换，但从位上看，每一位都没改变（0还是0,1还是1），跟原来一模一样。 改变的仅仅是 类型的名字。仅仅改变了类型。

user: user-0
content: 引用 1 楼 xyless 的回复:unsigned char的范围就是0-255啊  unsigned char GetNsid(char nsid)  不，你看这个函数的参数，是char类型，返回值才是uchar，传参数的时候不应该像func那样进行默认的类型转换么？

user: user-2
content: unsigned char的范围就是0-255啊
user-0 提问: 释放动态内存小问题,看的视频为什么倒数第二行要写q = null,不是已经释放内存了吗

回复:
user: user-1
content: 防止意外使用被释放的指针，因为判断指针释放释放，一般是判断      if(NULL==p){}

user: user-2
content: 楼上都说的这么底层。。。。。感觉对楼主还说还早了点啊。

user: user-3
content: 防止后面不小心又使用了已经释放了的内存，这是一种习惯，当然也可以不写

user: user-4
content: 但是安全性来看，可大不一样了。、  (1)在没有 "p = NULL;"时，指针p是指向一个内存地址的，只是这个内存地址对当前程序是非法的。对黑客来说，这可是一个机会。 每次程序崩溃时几乎都会在同一个地址（p所指的位置），这个地址会很容易到黑客手上的，然后黑客可以在指定的内存地址上事先布置好自己的代码，然后运行程序，崩溃时就会到黑客指定的代码上去，结果不堪设想啦。  (2)在有"p = NULL;"时，程序同样崩溃，但崩溃的地址是0. 0地址对任何程序都是非法的，所以再牛的黑客也不能把自己的代码布置到内存地址是0的空间上。所以对这种情况，黑客也只能面对崩溃 翻白眼，感叹生不逢时啊。  http://blog.csdn.net/zhangyulin54321/article/details/7869127

user: user-5
content: q = null; 目的是防止二次释放内存的一个习惯写法。如果q只在这个函数里面用，不置为null也是没有问题的。 因为如果q不等于null如果free的时候回再次释放q指向的地址空间。这个时候就会有问题。 如果q等于null了，就不会有问题了。  如果涉及多个函数间传递指针等复杂的操作，最好是置为null否则很容易出问题。 这就是一个好习惯。防止出错。

user: user-6
content: 如果被意外使用已经释放的指针,null指针直接就崩溃，方便查找原因

user: user-7
content: 野指针，防止程序崩溃

user: user-8
content: 因为代码是常会修改的。比如说现在这是代码的最后一行，以后再加点功能就不是了，这时设的null就有用了。不怕浪费就怕bug.

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

user: user-10
content: 已经释放的内存理论上是无效的，但对他的任何使用也可能带来许多的问题，会发生许多的意外，最好还是p=NULL吧，这样他的状态就明确了。
user-0 提问: c语言随机数组的问题

回复:
user: user-1
content: 1）这个随机函数是一个伪随机，并不是真正意义上的随机函数 2）只要随机种子一致，得到的随机序列就是一致的，如果想随机得到不同的额序列就要设置不同的随机种子，一般使用当前时间作为随机种子   另外，我怎么发现这个赵四，总是进来就复制一段话，题目好像都不看的

user: user-2
content: http://blog.csdn.net/yuan_ping/article/details/8449406

user: user-2
content: 需要先用srand初始化种子，否则每次得到的将会是一样的

user: user-3
content: 测试测试测试

user: user-4
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #define N 10  int a[N];  void gen_random() {   int i;   for (i = 0; i < N; i++)   {     a[i] = rand() % 10;   } }  void print_array() {   int i;   for (i = 0; i < N; i++)   {     printf("%d ", a[i]);   }   printf("\n"); }  int main(int argc, char *argv[]) {   srand(time(NULL));   memset(a, 0, N);   print_array();   gen_random();   print_array();    return 0; }

user: user-5
content: 你要先设置种子才行（srand）  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define N 10  int a[N];  void gen_random() { 	int i; 	for (i = 0; i < N; i++) 	{ 		a[i] = rand() % 10; 	} }  void print_array() { 	int i; 	for (i = 0; i < N; i++) 	{ 		printf("%d ", a[i]); 	} 	printf("\n"); }  int main(int argc, char *argv[]) { 	srand(time(NULL)); 	memset(a, 0, N); 	print_array(); 	gen_random(); 	print_array();  	return 0; }
user-0 提问: c语言linker error问题

回复:
user: user-1
content: 楼主会“编辑”，“查找”吗？

user: user-2
content: change函数中：    If(TRAIN[i].seat_num<=500);   改成    if(TRAIN[i].seat_num<=500);

user: user-3
content: 177行：If应该是if PS:你的start函数是啥，看不到声明和定义

user: user-0
content: 代码要怎么改

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

user: user-4
content: 提示不是很明显了么 文件名 然后哪个符号没定义。
user-0 提问: C的小问题，问题都在代码末尾注释

回复:
user: user-1
content: scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一个或者多个空白字符，空白符可以是space,tab,换行 等等，直到第一个非空白符出现为止。

user: user-1
content: scanf("%d ",&val);    %d后面多了一个空格

user: user-2
content: for (i=0; i < len; i++)     {         printf("请输入第%d个节点的值:", i+1);         scanf("%d",&val);         PNODE pNew = (PNODE)malloc(sizeof(NODE));            //定义一个NODE型数据变量，并分配动态内存  去掉引号中的空格scanf("%d", &val)；

user: user-1
content: 引用 4 楼 Tion一的回复:[quote=引用 3 楼 paschen 的回复:] scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一个或者多个空白字符，空白符可以是space,tab,换行 等等，直到第一个非空白符出现为止。不是很明白试了一下确实可以。 我输入后scanf读到空格是返回输入，下一次scanf是从第一个非空白读取，感觉没影响啊[/quote] 就是还会继续匹配空白符，所以后面不要加空格  \n  之类

user: user-0
content: 引用 3 楼 paschen 的回复:scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一个或者多个空白字符，空白符可以是space,tab,换行 等等，直到第一个非空白符出现为止。不是很明白试了一下确实可以。 我输入后scanf读到空格是返回输入，下一次scanf是从第一个非空白读取，感觉没影响啊
user-0 提问: 关于格式转换问题

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

user: user-2
content: 用VS打印出来b+d就是0.000000

user: user-3
content: printf("b + d = %f\n", (float) b + d); 缺个强制类型转换，%f 是用来输出浮点数的。b+d 是 int 。

user: user-4
content: printf("b + d = %f\n", b + d);  改成  printf("b + d = %d\n", b + d);

user: user-0
content: "b+d"打印的结果和"a+c"结果相等(近似相等)，而不是0.00000，难道是因为调用"a+c"运算结果的地址么

user: user-5
content: %f 是用来输出浮点数的。 b+d 是 int 。  两者不一致是一个未定义行为。
user-0 提问: C语言如何获取磁盘下最新创建的文件夹？

回复:
user: user-0
content: 能具体说说该怎么写吗？从来没接触过这块，有点不知道 该怎么写

user: user-1
content: 简单的办法就是 检索所有文件，然后读取文件日期。  还有就是拦截API
user-0 提问: 菜鸟求助，这段程序在VS2015上运行通过，为什么在GCC下提示RuntimeErr

回复:
user: user-1
content: char s1[100], s2[100], s3[100] = { 0 };  这些东西移到外面    double len = strlen(s1); 这个你一个数组长度需要用double么？   for (i = 0; i < len && i<100; i++) 必须要加上这个防止数组越界的东西。要是测试数据是1000个字符，你这东西分分钟被爆掉

user: user-2
content: 可以的，大不了开多点内存，内存不会多多少

user: user-3
content: 输入是否保证在 99 个字符之内？

user: user-2
content: int main()是不可以有void

user: user-0
content: 引用 1 楼 user-4 的回复:不要用在线的。。。.是做在线测试，又没用过用本地GCC，找工作的苦逼党啊

user: user-4
content: 不要用在线的。。。.
user-0 提问: 关于字符串区地址的问题。

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

user: user-2
content: str和&str虽然在数值上是一样的（都是数组首地址），但两者的含义是不同的

user: user-3
content: 引用 4 楼 zirendonghe1748的回复:[quote=引用 2 楼 paschen 的回复:] &str是指向数组的指针，+1移动的是一个数组的大小，而不是数组中一个元素的大小  那什么时候是移动一个数组，什么时候是移动一个元素呢？[/quote] 取决于你指针的类型， 指针类型是int，就移一个int大小，是数组就移一个数组大小

user: user-0
content: 引用 2 楼 paschen 的回复:&str是指向数组的指针，+1移动的是一个数组的大小，而不是数组中一个元素的大小  那什么时候是移动一个数组，什么时候是移动一个元素呢？

user: user-4
content: char *p=(char*)(&str+1);代码中的&str+1所取的是数组str的首地址，再在这个地址的值基础上加上sizeof(str)的值，也就是下一个数组的首地址，即当前这个指针已经已经越过了数组str的界限，其相当于指向str数组中最后一个地址的下一个空地址，而求的(*（p-1）)实际上是对*p指针进行减1操作，得到的是上一个元素的地址所对应的元素，即str数组的最后一个地址处存放的元素d.这是个人的见解，希望对你有用，如评论有哪些不足之处望大家指点，谢谢！

user: user-3
content: &str是指向数组的指针，+1移动的是一个数组的大小，而不是数组中一个元素的大小

user: user-5
content: str 是一个数组 &str 得到的是一个指向数组的指针 &str + 1 将向后移动一个数组的大小
user-0 提问: 如何把256进制的数组转化成10进制的

回复:
user: user-0
content: 这个问题，我参考了把10进制转换成2进制的方法。把每个数字都除以10，余数乘以256加上下一位，一直到最终的余数出现，则是结果的一位，这样不断的下去可以得到任意位数的。这是对于整数，如果对于小数部分，则是每一位乘以10，然后把进位到小数点之前的数字取出来就可以了。

user: user-1
content: 可以除以100 或者1000，10000 得到百千万进制数。 直接输出，不足补零，就是10进制数了。

user: user-2
content: 小数点左边每一位： 256^0 * 第一位 + 256 ^ 1 * 第二位 ................ 小数点右边每一位：256^-1 * 右第一位  ............. 然后加起来就是最终结果

user: user-3
content: 20个字节（160位）的大数，小数点右移10个字节（80位），就变成160位的大整数了。 搜大整数
user-0 提问: VS2013 C语言为什么变量定义要在任何语句之前？

回复:
user: user-0
content: vs不能修改(自定义)编译器吗？

user: user-1
content: 可以将函数以及变量声明写到一个头文件中，然后在需要引用的源码文件头部包含这个头文件，这样一般就不会有问题。 不过，出于数据隐藏的考虑，一般只把函数声明写到头文件中。所有变量声明还是老老实实写到源码头部比较好，不容易出错。

user: user-2
content: 2010 还不支持，2015 已经支持了 2013 或许也支持吧

user: user-3
content: 引用 9 楼 zh1599512 的回复:[quote=引用 4 楼 SXJIAKE 的回复:] C99 支持随时声明。只是 MSC 这个垃圾连这个基本特性一直都不支持，搞的 c 扩展名要编译通过得大改动。根本没指望它能支持其他 C99 特性，如 stdbool.h 等。只要它支持 for 内部声明变量，以及变量可以随时声明这两个特性我就满意了。 对的，ms真是太喜欢自己搞一套。反正最近写c用ms是醉了[/quote] MS 遵守的是 C89 啊，又不是自己弄得标准。

user: user-4
content: 引用 4 楼 SXJIAKE 的回复:C99 支持随时声明。只是 MSC 这个垃圾连这个基本特性一直都不支持，搞的 c 扩展名要编译通过得大改动。根本没指望它能支持其他 C99 特性，如 stdbool.h 等。只要它支持 for 内部声明变量，以及变量可以随时声明这两个特性我就满意了。 对的，ms真是太喜欢自己搞一套。反正最近写c用ms是醉了

user: user-5
content: 这个是C语言的旧标准吧

user: user-6
content: 进即退 得即舍

user: user-2
content: C 对goto语句，还是适当支持的 因此，在函数开头定义变量， 对于goto 的好处就是不会条过变量定义 C++ 支持随处定义变量，但是goto 语句，就比较难用了  其他： 对于C++ 如果不支持到处定义，变量 那么每个类都可能需要另外，定义一个init 之类的函数来初始化数据。 因为定义对象，可能会使用别的变量来初始化它。 坚持在开头定义变量，会很不方便。 试想，  一个构造函数参数为 int   int a=10; C c1(a); a=11; C c2(a); 这样便计算便定义变量，是不是很方便 如果非要写在 开头 就会很麻烦

user: user-7
content: 问题根源：编译器问题——C89和C99 C89规定，在任何执行语句之前，在块的开头声明所有局部变量。 在C99以及C++中则没有这个限制，即在首次使用之前，可在块的任何位置都可以声明变量。  不同风格利弊： 变量在函数开头定义：便于修改 变量就近定义：便于阅读 变量在块语句的开头定义：有的临时变量放在语句块开头，可以不用在函数开头定义，并且在使用完毕后释放空间，可以这么做，但不要无故添加花括号来提高代码的结构。

user: user-8
content: C99 支持随时声明。只是 MSC 这个垃圾连这个基本特性一直都不支持，搞的 c 扩展名要编译通过得大改动。根本没指望它能支持其他 C99 特性，如 stdbool.h 等。只要它支持 for 内部声明变量，以及变量可以随时声明这两个特性我就满意了。

user: user-9
content: 以前C标准这么规定的，没有原因

user: user-10
content: C语言以前是这样的，变量定义必须在任何语句之前，但是现在不是C语言已经和C++一样了，可以随时定义随用调用

user: user-11
content: 以前的 C 是这样要求的。  换 VS2015 试试？
user-0 提问: win32 api CreateFont不起作用

回复:
user: user-1
content: 4. SelectObject 的使用完毕都要恢复原值 HFONT hFont; HFONT hFontOld; switch (uMsg) { // ...... case WM_PAINT: 	BeginPaint(hWnd, &ps); 	hFont = CreateFontW(......); 	hFontOld = SelectObject(ps.hdc, hFont); 	SetTextColor(ps.hdc, 0xff0000); 	TextOut(ps.hdc, 10, 10, L"hello world", 11); 	SelectObject(ps.hdc, hFontOld); 	DeleteObject(hFont); 	EndPaint(hWnd, &ps); 	break; // ...... }

user: user-1
content: 这里有很多问题： 1. hdc = BeginPaint(hWnd, &ps); 都返回 hdc 了为何不用，而是反复的 GetDC？ 请用 BeginPaint 返回的 hdc，或者 ps.hdc。 2. GetDC 也需要对应的 ReleaseDC。你三次调用 GetDC 都释放了吗？ 3. CreateFont 反复创建没关系，但是你没有对用 DeleteObject 去销毁。 最好在 WM_CREATE、WM_INITDIALOG 中创建，在 WM_SETFONT 中变更，在 WM_NCDESTROY 中销毁。

user: user-0
content: 引用 8 楼 SXJIAKE 的回复:4. SelectObject 的使用完毕都要恢复原值 HFONT hFont; HFONT hFontOld; switch (uMsg) { // ...... case WM_PAINT: 	BeginPaint(hWnd, &ps); 	hFont = CreateFontW(......); 	hFontOld = SelectObject(ps.hdc, hFont); 	SetTextColor(ps.hdc, 0xff0000); 	TextOut(ps.hdc, 10, 10, L"hello world", 11); 	SelectObject(ps.hdc, hFontOld); 	DeleteObject(hFont); 	EndPaint(hWnd, &ps); 	break; // ...... } 是的，这些问题都没注意到，感谢回答

user: user-2
content: https://msdn.microsoft.com/en-us/library/dd183499.aspx 的例子中，最后有一句 DeleteObject(hFont); 将CreateFontW创建的对象给释放了。   如果你的程序，不使用多种多样的字体，你可以将字体对象事先创建出来，在WM_PAINT中使用即可。

user: user-3
content: 系统有没有自带Comic Sans MS字体？

user: user-4
content: 检查函数返回值看是否成功  https://msdn.microsoft.com/en-us/library/dd183499.aspx

user: user-0
content: 引用 1 楼 user-4 的回复:检查函数返回值看是否成功  https://msdn.microsoft.com/en-us/library/dd183499.aspx 按照这个例子是可以成功的，是HDC的问题，GetDC(hWnd)会获得不同的HDC对象，而我的代码没有使用一个HDC对象。而是多次使用GetDC(hWnd)

user: user-0
content: 引用 2 楼 60 的回复:CreateFontW 不应该在WM_PAINT中执行，WM_PAINT事件时时刻刻在触发，相当于CreateFontW 执行了无数次。  CreateFontW 执行次数过多，将因为资源不足，导致创建失败。就是这个“GDI”对象不足。   是的，不能直接放入WM_PAINT中执行，不过放在hdc = BeginPaint(hWnd, &ps);和EndPaint(hWnd, &ps);则不会产生大量的GDI对象不足的问题。https://msdn.microsoft.com/en-us/library/dd183499.aspx 按照官方这个例子是可以的，在其他地方我没成功，还是对GDI的理解不足啊。

user: user-2
content: CreateFontW 不应该在WM_PAINT中执行，WM_PAINT事件时时刻刻在触发，相当于CreateFontW 执行了无数次。  CreateFontW 执行次数过多，将因为资源不足，导致创建失败。就是这个“GDI”对象不足。
user-0 提问: 菜鸟求助，这段C程序用VS2015编译通过且运行正确，为何用GCC调试却说runtimeErr

回复:
user: user-0
content: 引用 2 楼 paschen 的回复:GCC下出错了中断下来，判断出错原因我不会用GCC啊，也没用过。这是在线测试，在线测试用的是GCC，我是本地用VS编译的，然后直接复制上去，然后就提示runtimeErr

user: user-1
content: GCC下出错了中断下来，判断出错原因

user: user-1
content: VS下运行没出错不代表一定正确

user: user-2
content: 引用 6 楼 xusongge 的回复:引用 4 楼 user-2 的回复:把 system("pause") 去掉。大神再问你一个问题，VS下引用math.h头文件就可以调用sqrt函数，但是在GCC下就不行，提示找不到sqrt，该怎么办？  请提供完整的程序

user: user-0
content: 引用 4 楼 user-2 的回复:把 system("pause") 去掉。大神再问你一个问题，VS下引用math.h头文件就可以调用sqrt函数，但是在GCC下就不行，提示找不到sqrt，该怎么办？

user: user-0
content: 引用 4 楼 user-2 的回复:把 system("pause") 去掉。太感谢你了！！果然是这个问题，去掉就AC了

user: user-2
content: 把 system("pause") 去掉。
user-0 提问: “读信息个数未知的文件，写入数组”，有木有好的解决方案呢？

回复:
user: user-1
content: malloc,realloc,free

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:malloc,realloc,free改天试试看

user: user-0
content: 引用 9 楼 sxldfang 的回复:[quote=引用 楼主 shiyuzuxiaqianli 的回复:] 比方说，一个文件中有很多（事先不知道个数）正整数，现在打算把它们读到数组中。我的想法是，先计算出个数，再开一个数组读取数字。问一下有没有别的方案；或者直接就放弃用数组，使用别的什么方法。优先考虑C语言  链表+动态分配[/quote]看来只要放弃数组，就有好的方法

user: user-2
content: 引用 楼主 shiyuzuxiaqianli 的回复:比方说，一个文件中有很多（事先不知道个数）正整数，现在打算把它们读到数组中。我的想法是，先计算出个数，再开一个数组读取数字。问一下有没有别的方案；或者直接就放弃用数组，使用别的什么方法。优先考虑C语言  链表+动态分配

user: user-0
content: 自己顶起来，自己顶起来

user: user-3
content: 方法一：先计算个数  方法二：采用类似C++STL中容器的实现，可以先预先分配适当大小内存，不够时分配更大的，然后将之前内容复制到新内存，释放旧内存

user: user-4
content: 引用 6 楼 user-5 的回复:别存数组了，边读边处理 边读边处理？   你指的是读取一个处理一个 然后在读取？ 如果是这样 效率低下啊，还不如直接全部一次性读取到内存里在处理

user: user-5
content: 别存数组了，边读边处理

user: user-0
content: 引用 4 楼 paschen的回复:[quote=引用 2 楼 千行百行的回复:][quote=引用 1 楼 paschen的回复:]方法一：先计算个数  方法二：采用类似C++STL中容器的实现，可以先预先分配适当大小内存，不够时分配更大的，然后将之前内容复制到新内存，释放旧内存 方法一就是我说到的方法啊，方法二感觉不是很好啊[/quote] 使用文件映射方式，然后将将指针指向数据开头，就可以直接按数组方式访问了[/quote] 不是很懂版主说的这种方法，查查看去

user: user-3
content: 引用 2 楼 千行百行的回复:[quote=引用 1 楼 paschen的回复:]方法一：先计算个数  方法二：采用类似C++STL中容器的实现，可以先预先分配适当大小内存，不够时分配更大的，然后将之前内容复制到新内存，释放旧内存 方法一就是我说到的方法啊，方法二感觉不是很好啊[/quote] 使用文件映射方式，然后将将指针指向数据开头，就可以直接按数组方式访问了

user: user-0
content: 自己顶上去，自己顶上去。

user: user-0
content: 引用 1 楼 paschen的回复:方法一：先计算个数  方法二：采用类似C++STL中容器的实现，可以先预先分配适当大小内存，不够时分配更大的，然后将之前内容复制到新内存，释放旧内存 方法一就是我说到的方法啊，方法二感觉不是很好啊
user-0 提问: 关于浮点数表示的问题

回复:
user: user-0
content: 引用 8 楼 user-2 的回复:假设尾数nBits,符号位1Bits，阶码m bits 其中符号1bits 最小正数为1 *2^-(2^(m-1)) *k 最大正数为 (2^n -1) *2^(2^(m-1))*k 如果尾数全部是小数 k=2^-n 如果尾数是1Bits 整数 nBits 尾数 k=1 如果按照IEEE 编码最小数 k=2^-n,最大数 k=1 大约是这样 具体看IEEE浮点数非常感谢 也谢谢版主

user: user-1
content: http://www.cnblogs.com/xkfz007/archive/2012/02/27/2370357.html

user: user-2
content: 16Bits浮点数也许有，不过没见过 现在浮点数 一般有三种32Bits，64Bits，80Bits  这是X86对应浮点处理器X87,支持的浮点数格式 其他还有40Bits (DSP)，48Bits(pascal 语言，曾经支持的类型为real，或者real48) 32，64 参考IEEE浮点数 浮点数有些编码需要定义好它的意义 比如 曾经IBM浮点数，就定义指数为16进制的 所以，不指定具体格式，是不能说浮点数到底如何编码的  另外，还有一种定点小数编码。这是用整数当作小数用 十进制的话可以为4位小数 十六进制，也可以为4Bits 小数，这都是根据需要确定的

user: user-2
content: 假设尾数nBits,符号位1Bits，阶码m bits 其中符号1bits 最小正数为1 *2^-(2^(m-1)) *k 最大正数为 (2^n -1) *2^(2^(m-1))*k 如果尾数全部是小数 k=2^-n 如果尾数是1Bits 整数 nBits 尾数 k=1 如果按照IEEE 编码最小数 k=2^-n,最大数 k=1 大约是这样 具体看IEEE浮点数

user: user-0
content: 请讲的详细一点，真的不太懂

user: user-0
content: 引用 6 楼 user-2 的回复:需要考虑，要不要隐藏位 IEEE是有隐藏位的应该没有 就那个题目而言。。能帮忙解答一下么

user: user-2
content: 需要考虑，要不要隐藏位 IEEE是有隐藏位的

user: user-0
content: 来人帮忙解答一下题目。。。。

user: user-0
content: 引用 3 楼 paschen 的回复:http://www.cnblogs.com/xkfz007/archive/2012/02/27/2370357.html版主。能把我的那个题目给解释一下么。。。
user-0 提问: 静态局部变量在内存中的位置什么时候分配内存

回复:
user: user-1
content: 第一次调用时分配内存并做初始化。

user: user-2
content: 参考PE加载器源代码。

user: user-3
content: (1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量（即动态局部变量）属于动态存储类别，存储在动态存储区空间(而不是静态存储区空间)，函数调用结束后即释放。  (2) 为静态局部变量赋初值是在编译时进行值的，即只赋初值一次，在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值，不是在编译时进行的，而是在函数调用时进行，每调用一次函数重新给一次初值，相当于执行一次赋值语句。   (3) 如果在定义局部变量时不赋初值的话，对静态局部变量来说，编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说，如果不赋初值，则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放，下次调用时又重新另分配存储单元，而所分配的单元中的值是不确定的。  (4) 虽然静态局部变量在函数调用结束后仍然存在，但其他函数是不能引用它的，也就是说，在其他函数中它是“不可见”的。

user: user-4
content: 内存分配，C,C++是一致的，初始化未必一样 可以保证，静态变量第一次使用的时候，已经初始化了（或者就会初始化）。

user: user-5
content: 已初始化的的全局变量和局部静态变量存放在.data段，未初始化的全局变量和局部静态变量一般存放在.bss段里，前者在生产可执行文件时就分配好内存了，后者在加载时才分配

user: user-6
content: 对于C语言的全局和静态变量，其内存空间都是全局的  分配是在编译期，已经将变量放到了数据段了

user: user-7
content: 应该和全局静态变量是一样的。
user-0 提问: C语言比C++特有的性质

回复:
user: user-1
content: 引用 5 楼 libinden71 的回复:我记得还有大神说过：C++无非就是花架子，其实本质还是C  对于这句话 大家觉得呢？ 还有人说，语言只是语法不同而已。

user: user-2
content: 我记得还有大神说过：C++无非就是花架子，其实本质还是C  对于这句话 大家觉得呢？

user: user-3
content: 比如C99提出的可变长数组，C++里没有

user: user-4
content: 1）C 关键字最少 C++如今已经完全没有这个概念了，关键字很多很多了 C++关键字比C多多了 2）和其它语言互操作能力， C++ 对这个支持很少了，C++这个能力还是继承C的， 在面向对象，泛型上是跟着个背道而行的 3）面向底层，C++还保留，但在面向对象，泛型上，却是偏离这个能力的。 相比而言，C很纯粹 C++很复杂 虽然如此，也只是各有各的用途，并无好坏之分

user: user-5
content: varible-length array Complex types  _Generic Compound literals anonymous structure/union C 用的不多，欢迎补充

user: user-6
content: C语言本身只有很少的语法，语法非常的精简。
user-0 提问: 关于链表的问题 RE:无效内存引用

回复:
user: user-1
content: 你的这句也不对： NODE *tem; tem->link = q->link->link->link; 你的tem都没有分配空间，指向的是未知区域（野指针），然后就进行赋值操作是会出现异常的。  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: scanf("%d\n",&T);  改成  scanf("%d",&T);
user-0 提问: c语言 关于 自增 后缀运算

回复:
user: user-1
content: 一般来说： c=(a++)+(a++)+(a++);//语句1===> 5 + 6 + 7 = 18（后缀++是返回加一前的值） c=(++b)+(++b)+(++b);//语句2===>6 + 7 + 8 = 21（前置++ 是返回加一后的值）

user: user-2
content: 前一个 从 15～21

user: user-2
content: 前一个 从 15～18 后一个 从18～24 都是对的 关键是 第一个式子有三个表达式 a++   第二个式子有三个表达式 ++b 以任何顺序估值a++或者 ++b 这个表达式都对。 标准没规定，编译器随便安排。 这就是所谓的未定义

user: user-3
content: 没有步骤，没有原理。 即使是同一个编译器的不同版本，结果都可能不同。 把讲这个东西的书扔掉吧
user-0 提问: strcpy(&url[i], '\0')或者url[len - i] = '\0'有错？

回复:
user: user-0
content: 在这里把我找到的资料分享出来，方便遇到同样问题的学习者。 首先是能正常运行的程序如下： #include <stdio.h> #include <string.h>  void remove_filename(char *url) {     int i = 7;    //字符"http://"共7个字符，避免遇到这里的'/'      while(url[i] != '/')         i++;      char p[1] = "\0";     strcpy(&url[i], p);    //这里的修改可以看第一个链接的最后      puts(url); }  void remove_filename_2(char *url) {     int i, len = strlen(url);      for (i = 0; i <= len; i++)         if (url[len - i] == '/') {             url[len - i] = '\0';             break;         }      puts(url); }  int main(void) {     char str[40] = "http://www.knking.com/index.com";      remove_filename(str);     printf("\n"); //    remove_filename_2(str);    //这里不能同时调用      return 0; } 资料： 文字常量区、字符串常量、地址——来自CSDN-静革 字符串常量到底存放在哪个存储区——来自CSDN-daiyutage 字符串常量与const常量内存区（——选自陈皓的博客）——来自博客园-弱水三千12138（这里没能找到原文）

user: user-0
content: 感谢版主的指点！ 已通过版主的指点找资料解决。

user: user-1
content: 你的字符串是在常量区的，不能修改  如果要修改，应用字符数组存字符串  char str[] = “xxxx……”
user-0 提问: c语言学生管理信息系统

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

user: user-2
content: 顶楼上，建议改成 if(NULL==q)n=1; 这样可以杜绝少一个等号的错误

user: user-0
content: 您说的建议  我会听 不过现在没那么多时间了  这个作业 马上就要交了  希望帮帮忙

user: user-3
content: 这种问题就是锻炼你能力的时候，在程序加载的时候下个断点，看下读取的数据和写文件的数据是否一致，多调试，多下断点。

user: user-0
content: 已经改过来了 可是我再次打开的时候之前存储的数据 显示的是乱码 不知为何 是保存那块还是存储那块的代码有问题   求指教  最好能改正过来代码发上 谢谢

user: user-4
content: add函数中：  if(q=NULL)n=1;  改成  if(q==NULL)n=1;  两个等号
user-0 提问: 全角字符与半角字符的问题

回复:
user: user-1
content: 引用 6 楼 wopabe 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 王八的屁股——规定（龟腚）！ 能说点有用的吗？[/quote] 在我看来，规定比数据更有用，数据比代码更有用。

user: user-2
content: 没有关系........

user: user-3
content: 引用 楼主 wopabe 的回复:我研究了全角与半角的关系 一般是这样的，全角2个字节，半角1个字节，全角的高字节为0xa3，低字节为半角+0x80  但是有个特殊的，是句号，句号的全角高字节是0xa1，低字节是0xa3，而且低字节与半角没有啥关系 这是为什么？  这个，只能查表的 ....  某些碰巧会有些规律。

user: user-1
content: 王八的屁股——规定（龟腚）！

user: user-0
content: 引用 1 楼 user-4 的回复:不说编码的都是耍流氓.....  #include <iostream> int main() {         std::printf("全角: %x  半角: %x  ", static_cast<int>(U'，'), static_cast<int>(U',') ); }   全角: ff0c  半角: 2c 你这是Unicode吧

user: user-4
content: 不说编码的都是耍流氓.....  #include <iostream> int main() {         std::printf("全角: %x  半角: %x  ", static_cast<int>(U'，'), static_cast<int>(U',') ); }   全角: ff0c  半角: 2c

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:王八的屁股——规定（龟腚）！ 能说点有用的吗？
user-0 提问: 数据类型的float型

回复:
user: user-1
content: float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的，其整数部分始终是一个隐含着的“1”，由于它是不变的，故不能对精度造成影响。  float：2^23 = 8388608，一共七位，这意味着最多能有7位有效数字，但绝对能保证的为6位，也即float的精度为6~7位有效数字

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

user: user-2
content: 请亲自打开include\float.h一眼。

user: user-3
content: 并不是说结果里显示的和你写的一样就是有效的。  它们只是碰巧一样而已。

user: user-4
content: 浮点数的精度 和 printf %f 的精度不是一个概念。 你把数乘以10，你会发现第9位的。

user: user-5
content: 后面的位不不一定正确，printf 用 %0.9f 还可以输出9位呢

user: user-6
content: vs试了下  改%3.7f是肯定能打出后面的，但第6位及以后都不准了。  又想起那个梗，数学家喷计算机，1/3都表示不了，还calculator

user: user-7
content: 楼上说得好，不要迷信书本

user: user-8
content: 计算机保存浮点数时，是把数看作a*2^b这样的形式，不是以10为底数，而是以2为底数。即将数转换成以2为底的“科学计数法”的形式，再由这个形式反转换成10进制形式，但数据又有位数限制，所以有些数转换成二进制计数法形式后位数超出了限制的位数，那么转换回来时得到的数就会与原数有偏差，不同的数这个偏差是不同的，有可能在小数点后第7位，也有可能在第8位，也有可能在其他位数，但能保证小数点第6位之前是正确的。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-6
content: %f格式控制的最多多少位，多了就进行“四舍五入”（具体怎么入跟编译器有关）  你可以%3.7试试