Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教一个sscanf匹配的问题

回复:
user: user-1
content: int j, i;      sscanf(buff, ",(\"vlan5\",%d),184544,\"LOCAL\",(\"vlan5\",%d),65535)",&j, &i);      printf("%d %d", j, j);

user: user-2
content: An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

user: user-2
content: To read strings not delimited by space characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. The corresponding input field is read up to the first character that does not appear in the bracketed character set. If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.  Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  #include <stdio.h> char s[]="00:0C:29:08:EB:25\",(\"vlan5\",5),184544,\"LOCAL\",(\"vlan5\",5),65535),"; char mac[18]; int vlan1; char area[10]; int vlan2; int main() {     //我想把前面的mac地址和vlan后面对应的数字及“LOCAL”这个字段提取出来  就是要如下这些     //00:0C:29:08:EB:25   5   LOCAL  5  这4个     if (4!=sscanf(s,"%17[^\"]%*[^,],%*[^,],%d%*[^\"]\"%9[^\"]%*[^,],%*[^,],%d",mac,&vlan1,area,&vlan2)) {         printf("Format Error:[%s]\n",s);         return 1;     } else {         printf("mac:[%s]\n",mac);         printf("vlan1:%d\n",vlan1);         printf("area:[%s]\n",area);         printf("vlan2:%d\n",vlan2);         return 0;     } } //mac:[00:0C:29:08:EB:25] //vlan1:5 //area:[LOCAL] //vlan2:5 //
user-0 提问: 请问可不可以写出一个绝对安全的程序或者系统?

回复:
user: user-0
content: 引用 12 楼 u010165006 的回复:[quote=引用 11 楼 u010165006 的回复:] [quote=引用 7 楼 yyxgs 的回复:] [quote=引用 4 楼 u010165006 的回复:] 系统的安全性与开放性是一对矛盾，理论上没有绝对安全的系统（好比一个没有门窗的碉堡，这样的碉堡有用吗？） Windows NT计算机系统安全等级属于C2 级，Unix/Linux好像也是。  那其他的呢，比如小型的静态网站，可以做到绝对安全吗?[/quote]  网站是需要Web服务器的，服务器软件和它跑在上面的操作系统可能都有漏洞，可能被攻击，攻击以后修改页面或者删除页面就跟操作本机文件一样的。[/quote]  攻击以后甚至把Web服务器软件进程关闭导致网站无法访问，或者使操作系统功能不正常、关机甚至被破坏（一句命令删光所有文件包括系统本身和网站页面文件，或格式化硬盘）。[/quote]   受教了！

user: user-1
content: 引用 11 楼 u010165006 的回复:[quote=引用 7 楼 yyxgs 的回复:] [quote=引用 4 楼 u010165006 的回复:] 系统的安全性与开放性是一对矛盾，理论上没有绝对安全的系统（好比一个没有门窗的碉堡，这样的碉堡有用吗？） Windows NT计算机系统安全等级属于C2 级，Unix/Linux好像也是。  那其他的呢，比如小型的静态网站，可以做到绝对安全吗?[/quote]  网站是需要Web服务器的，服务器软件和它跑在上面的操作系统可能都有漏洞，可能被攻击，攻击以后修改页面或者删除页面就跟操作本机文件一样的。[/quote]  攻击以后甚至把Web服务器软件进程关闭导致网站无法访问，或者使操作系统功能不正常、关机甚至被破坏（一句命令删光所有文件包括系统本身和网站页面文件，或格式化硬盘）。

user: user-1
content: 引用 7 楼 yyxgs 的回复:[quote=引用 4 楼 u010165006 的回复:] 系统的安全性与开放性是一对矛盾，理论上没有绝对安全的系统（好比一个没有门窗的碉堡，这样的碉堡有用吗？） Windows NT计算机系统安全等级属于C2 级，Unix/Linux好像也是。  那其他的呢，比如小型的静态网站，可以做到绝对安全吗?[/quote]  网站是需要Web服务器的，服务器软件和它跑在上面的操作系统可能都有漏洞，可能被攻击，攻击以后修改页面或者删除页面就跟操作本机文件一样的。

user: user-2
content: 安全到就算停电了，程序还可以再跑...

user: user-3
content: 人妄想超过上帝？！

user: user-4
content: 感觉其实是相对的，因为你很多时候无法知道什么样的数据会导致你的程序出现bug，数据量很大是原因之一…其他一些原因…你这个程序也没给出那几个自定义函数…实在是无法分析……

user: user-4
content: 引用 6 楼 yyxgs的回复:[quote=引用 3 楼 a88770202 的回复:] 感觉其实是相对的，因为你很多时候无法知道什么样的数据会导致你的程序出现bug，数据量很大是原因之一…其他一些原因…你这个程序也没给出那几个自定义函数…实在是无法分析……  也就是说安全性问题都是逻辑设计上的漏洞吗?[/quote] 我觉得很多bug是逻辑上考虑不周…毕竟考虑绝对周到这个感觉很难做到，只是很少人去没事儿触碰那种bug，就像那种小概率事件，可以视作不发生

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:如果上帝当初创造出来的这个世界是一个绝对安全的程序或者系统的话，能进化出人类吗？   可是生态系统不是人设计的，操作系统是人设计的。。

user: user-0
content: 引用 4 楼 u010165006 的回复:系统的安全性与开放性是一对矛盾，理论上没有绝对安全的系统（好比一个没有门窗的碉堡，这样的碉堡有用吗？） Windows NT计算机系统安全等级属于C2 级，Unix/Linux好像也是。  那其他的呢，比如小型的静态网站，可以做到绝对安全吗?

user: user-0
content: 引用 3 楼 a88770202 的回复:感觉其实是相对的，因为你很多时候无法知道什么样的数据会导致你的程序出现bug，数据量很大是原因之一…其他一些原因…你这个程序也没给出那几个自定义函数…实在是无法分析……  也就是说安全性问题都是逻辑设计上的漏洞吗?

user: user-3
content: 如果上帝当初创造出来的这个世界是一个绝对安全的程序或者系统的话，能进化出人类吗？

user: user-1
content: 系统的安全性与开放性是一对矛盾，理论上没有绝对安全的系统（好比一个没有门窗的碉堡，这样的碉堡有用吗？） Windows NT计算机系统安全等级属于C2 级，Unix/Linux好像也是。

user: user-0
content: 都是初学的时候写的一些函数，当前调试没什么问题，但是写一个稍微大一点程序，各种BUG出现了。。有点感叹大型程序或操作系统这样的工程，能写一个绝对安全的出来是不是特别艰难。。。

user: user-0
user-0 提问: 关于C中二级指针传参

回复:
user: user-1
content: 如果要在函数中修改指针的值，需要传入一个二级指针，这样才能在函数中修改指针的值，否则传入的变量是按值传递的，也就是复制进去的，你在函数中修改一个复制后的指针是没什么用的  你程序中的L是一个二级指针，修改时直接*L = ... 即可修改到

user: user-0
content: 引用 3 楼 qq423399099 的回复:因为你要在函数内修改指针的指向，所以必须传一级指针的引用或者二级指针。 L是指针本身在栈上的地址，而*L才是指针所指向的区域的地址 所以写成： *L=(Linklist)malloc(sizeof(Lnode));  是否可以如此简单化理解：   void change(int **p);  void main() { 	int c=1; 	int *a ; 	a=&c; 	change(&a); 	printf("%d",*a); }  void change(int **p) { 	**p=(int)malloc(sizeof(int)); }   1、这段里面，按照我正常的理解的话，内存分配结束的话，p存储的值应该改变了，这个时候我想的是因为p存的是a自身的地址，所以等价于a自身的地址改变了；而实际调试中发现，a自身以及它存储的值都没有变。好奇怪，有什么通俗的解释吗？

user: user-2
content: 因为你要在函数内修改指针的指向，所以必须传一级指针的引用或者二级指针。 L是指针本身在栈上的地址，而*L才是指针所指向的区域的地址 所以写成： *L=(Linklist)malloc(sizeof(Lnode));

user: user-3
content: http://img.bss.csdn.net/201607071118036676.jpg

user: user-3
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-0 提问: 程序求解

回复:
user: user-1
content: cmp返回的是a和b mark的差值正或负，qsort 是快速排序。

user: user-2
content: cmp函数返回，当标记名字相同，返回年龄段差，当标记相同名字不同，返回前一个名字是否长于后一个的名字，当标记不同则当天标记差。 qsort()是标准库里的快排函数，有四个参数，第一个参数是数组名，第二个参数是要比较的数组元素个数，第三个参数是每个数组元素大小，第四个参数就是比较规则。比较规则是要自己定义的，就像你写的cmp函数，

user: user-3
content: 比较 和 排序

user: user-4
content: qsort是排序的，属于标准库的函数。你可以去百度了解一下。cmp 就是比较的方式

user: user-5
content: qsort是自带的快速排序函数 cmp是比较规则 先比较mark，如果mark相同，就比较name，如果name相同，]就比较年龄。

user: user-6
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: 求大神指点应该怎样改进；

回复:
user: user-1
content: 对角线 包括 正对角线 和 反对角线 正对角线 满足条件  i == j 反对角线 满足条件 i+j == 3-1  非对角线上元素之和  if(i != j && i+j != 2) {    sum = sum + a[i][j];	 }

user: user-2
content: i+j!=2

user: user-3
content: 楼上已经说得很清楚了。
user-0 提问: OJ求解

回复:
user: user-0
content: 还是多谢你啦，这个问题我解决了。已经结贴了

user: user-1
content: 边界条件 输入输出格式 ……

user: user-0
content: 首先感谢一楼，你看得很仔细，我认为平时生活中不会出现一个人在一个楼层电梯，然后又按这个楼层的电梯这种情况，但是题目却要求包含这种情况，导致我一直不能AC，运行出错。参考了别人的好多能用的代码，解法有些区别，却一直看不出自己错在哪。现在终于明白了，多谢。 其次感谢二楼，我也调试了很多次，只是在测试用例上，我受个人思维约束，就这道题，有一种情况一直想不到，因此不知道在代码何处修改。不过你强调的调试方法，我会谨记的，十分感谢。

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

user: user-2
content: 我来解释一波，第一种情况，楼主没有考虑，when elevator in the same level continuous test case as  4  1 2 2 3,通不过 我给你改了一下代码 楼主，记得结贴给分，我也是被迫的，有时候给别人调个程序，解答了他的问题，就没见了 我们辛辛苦苦回答问题，啥也没得到； #include <iostream> using namespace std;    int main(int argc, char *argv[]) {  //agrc 和 argv 可以不写，当你要用命令行参数的时候写     int temp=0;     while(cin>>temp)     {         if(temp!=0)         {             int before=0,rear=0,sum=0;             for(int i=0;i<temp;i++)             {                 cin>>rear;                 if(before<rear)                 {                     sum=sum + (rear-before)*6+5;                 }                 else  //把if删了                 {                     sum= sum + (before-rear)*4+5; // 把before = rear 的那种情况加进去了                 }                 //sum+=5;                 before=rear;             }             cout<<sum<<endl;         }         else             break;     }           return 0; }
user-0 提问: 新人求教一个c语言的简单问题

回复:
user: user-1
content: lf 的l应该是小写，改过来就对了。这些细微的错误，平时一定要小心，养成一个好的编程习惯很重要。平时这些错误还是要先自己查找。

user: user-2
content: 是%lf  是小写L  http://en.cppreference.com/w/c/io/fprintf

user: user-3
content: 给我给我一双慧眼吧，让我把这“I1l|│”看得清清楚楚明明白白，……

user: user-3
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-4
content: 那个应该是小写的L，你写成大写的i了  #include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	double d; 	d = 8.0; 	printf("d is %lf", d); 	return 0; }

user: user-5
content: float、double要用%f，long double用%lf

user: user-6
content: double类型的输出是用%lf，按照提供的代码应该没有问题。 测试用的什么环境呢？
user-0 提问: 关于多进程并发TCP套接字服务器（C语言）的一些困惑，求助

回复:
user: user-1
content: fork 写时拷贝 close会减少一个引用计数 写时拷贝：linux中不强调线程  fork出来的子进程会共享父进程的东西仅仅供读  如果是内核对象那么就是引用计数+1 非内核对象，比如：int i=1;  子进程也是i也是1，如果子进程赋值i=2 不会影响父进程的值

user: user-2
content: 解决了就给分吧,,嘿嘿,凑个热闹

user: user-0
content: 引用 7 楼 pengzhixi的回复:额 如果父进程没有设置FD_CLOEXEC那么意味着子进程会继承父进程的描述符。 也就意味着描述符对应的底层结构的引用计数会是2.这就是说你需要在父子进程都关闭相应描述符才会真正释放底层的结构。这也就解释了为什么关闭父进程或者子进程的描述符不会影响对方使用该描述符。 我现在懂了，file结构体中，有个记录引用次数的成员，当数目捡到零时就释放内存中打开文件所对应的资源。 谢谢回答

user: user-3
content: 额 如果父进程没有设置FD_CLOEXEC那么意味着子进程会继承父进程的描述符。 也就意味着描述符对应的底层结构的引用计数会是2.这就是说你需要在父子进程都关闭相应描述符才会真正释放底层的结构。这也就解释了为什么关闭父进程或者子进程的描述符不会影响对方使用该描述符。

user: user-0
content: 一个朋友针对我的问题推荐给我的文章，觉得写的不错，我把它发在这里供有同样问题的朋友学习， http://m.blog.csdn.net/article/details?id=9162453  题目：linux系统文件描述符file descriptor与inode的相关知识

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:了解一下操作系统的相关概念。  好，谢谢提醒

user: user-4
content: 了解一下操作系统的相关概念。

user: user-5
content: 引用 3 楼 zhao4zhong1 的回复:了解一下操作系统的相关概念。还有tcp协议的知识

user: user-0
content: 引用 1 楼 user-6的回复:子进程只是复制父进城的东西，fork之后子进程内部实现与父进城内部实现没关系。他们共享文件描述符表。子进程关闭连接文件描述浮表。只是把这个链接地址的引用计数减一。《表述不好，看不懂全当我放屁了》 请再多说一点吧，父子进程共享文件描述符表是什么意思，谢谢

user: user-6
content: 子进程只是复制父进城的东西，fork之后子进程内部实现与父进城内部实现没关系。他们共享文件描述符表。子进程关闭连接文件描述浮表。只是把这个链接地址的引用计数减一。《表述不好，看不懂全当我放屁了》
user-0 提问: error2019:IcmpCreateFile和IcmpSendEcho

回复:
user: user-1
content: 将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-2
content: #include <iphlpapi.h> // 需要头文件 #include <icmpapi.h> //需要头文件  #pragma comment( lib, "Iphlpapi.lib" )///再加上这一行VC缺省，并不把 这个库连接到文件中   因为库没有链接进来，函数所以就没定义了   Requirements Client  Requires Windows Vista, Windows XP, or Windows 2000 Professional.   Server  Requires Windows Server 2008, Windows Server 2003, or Windows 2000 Server.  Header  Declared in Icmpapi.h.  Library  Use Iphlpapi.lib.//注意这里  DLL  Requires Iphlpapi.dll on Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP. Requires Icmp.dll on Windows 2000 Server and Windows 2000 Professional.

user: user-2
content: 哦。发现 MSDN示例  #include <iphlpapi.h> //  #include <icmpapi.h> //  HANDLE hIcmpFile;  hIcmpFile = IcmpCreateFile(); if (hIcmpFile == INVALID_HANDLE_VALUE) {   printf("\tUnable to open handle.\n");   printf("IcmpCreatefile returned error: %ld\n", GetLastError() ); } else   printf("\tHandle created.\n");

user: user-2
content: 目测。库文件没有找到 这几个函数是在在某个DLL中实现的 并且不是VC和Windows 的。  。。。。。 另外一种可能，自己做的。或者引用的源代码文件已经有了（下载了） 但是没有编译，或者出现二义性，编译出错
user-0 提问: 大家好，有C语言试题不理解，请大家指正，，

回复:
user: user-1
content: 打开一个二进制文件fp=fopen("root.txt","wb"); fp=fopen("root.txt" ,"w");是打开一个文本文件

user: user-2
content: #include <stdio.h> #include <math.h> # include <stdio.h> using namespace std; int main(void) {     double c;     int b;    char ch = ‘\n’;     FILE *fp;     fp=fopen("root.txt" ,"w");     for(b=1;b<=100;b++)     {         c=sqrt((double)b);         fprintf(fp,"%lf ",c);         fwrite (ch , 1, 1, fp);     }     fclose(fp); }    结果： 1.000000  1.414214  1.732051  2.000000  2.236068  2.449490  2.645751  2.828427  3.000000  3.162278  3.316625  3.464102  3.605551  3.741657  3.872983  4.000000  4.123106  4.242641  4.358899  4.472136  4.582576  4.690416  4.795832  4.898979  5.000000  5.099020  5.196152  5.291503  5.385165  5.477226  5.567764  5.656854  5.744563  5.830952  5.916080  6.000000  6.082763  6.164414  6.244998  6.324555  6.403124  6.480741  6.557439  6.633250  6.708204  6.782330  6.855655  6.928203  7.000000  7.071068  7.141428  7.211103  7.280110  7.348469  7.416198  7.483315  7.549834  7.615773  7.681146  7.745967  7.810250  7.874008  7.937254  8.000000  8.062258  8.124038  8.185353  8.246211  8.306624  8.366600  8.426150  8.485281  8.544004  8.602325  8.660254  8.717798  8.774964  8.831761  8.888194  8.944272  9.000000  9.055385  9.110434  9.165151  9.219544  9.273618  9.327379  9.380832  9.433981  9.486833  9.539392  9.591663  9.643651  9.695360  9.746794  9.797959  9.848858  9.899495  9.949874  10.000000

user: user-3
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-0
content: 太谢谢了！！！

user: user-4
content: 另外你这样只存了最后一个数的平方根，如果要每个数都存这样改：   #include <stdio.h> #include <math.h> #include <stdlib.h> int main(void) { 	double c; 	int b; 	FILE *fp; 	fp=fopen("root.txt" ,"w"); 	for(b=1;b<=100;b++) 	{ 		c=sqrt(b); 		fprintf(fp,"%lf ",c); 	} 	fclose(fp); }

user: user-4
content: fprintf(fp,"%lf ","c"); 改成 fprintf(fp,"%lf ",c);  去年c的双引号

user: user-5
content: fprintf(fp,"%lf ","c");  象这个语句，编译器肯定会提示错误，根据编译器提示的错误信息就可以查到一些低级的语法错误了。  记下来的功能，单步运行一下你就会发现，最终保存下来的只有sqrt(100)这一个结果。  归根到底，把代码动手输入电脑就好了。

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

回复:
user: user-0
content: 可以了，确实要加括号，谢谢了

user: user-1
content: 改成while ( c = getchar( ) && c != '\n') 试一下

user: user-2
content: 我只能告诉你，C语言中的赋值运算符的优先级特别低。。。

user: user-3
content: while( ( c = getchar() ) != '\n' )  运算符优先级的问题，逻辑运算符优先级高，导致c的值其实是判断不等于后的结果
user-0 提问: 文件输入输出

回复:
user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 不能一个一个的读的方式追加到文件中吗？谢谢耐心解答。

user: user-2
content: 引用为什么不能用while循环完成while((ch = getc(fs))!=EOF)  你循环的是根据文件个数，而不是根据文件中内容有没读完
user-0 提问: 求大神解答

回复:
user: user-1
content: 指针转换类型。 首先要是个指针类型，所以要先取址& 然后强转(OS_TCB * )

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

user: user-3
content: 取StartTaskTCB地址，然后类型转换成OS_TCB *

user: user-4
content: 将地址&StartTaskTCB（也就是变量StartTaskTCB的地址）的类型转换成指向OS_TCB类型变量的指针 &StartTaskTCB原来是指向StartTaskTCB类型的 (OS_TCB * )&StartTaskTCB则指向了OS_TCB类型 如果两者类型不同 前者无法引用OS_TCB类型中的成员，后者就可以了
user-0 提问: signed char 和 unsigned char

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  计算机组成原理→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执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  多谢赵4老师指点！

user: user-1
content: 理解和讨论之前请先学会如何观察！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  计算机组成原理→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执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-2
content: 有符号和无符号在向右移位时，使用的填充数字是不一样的。无符号是以0来填充；有符号有些是以0，有些是以符号位。你给出的情况应该是以符号位来填充的

user: user-3
content: 运算符 ~ 高于 >>，先取反再右移1位； 00000000取反为11111111； 无符号11111111取反为01111111，结果为127； 有符号11111111取反为11111111，结果为-1，为什么不是-127呢？因为是补码；  参考文章http://www.baiyy.com/portal/article/index/id/12

user: user-4
content: printf("%d\n", ((unsigned char)~0 >> 1)); //127 printf("%d\n", ((signed char)~0 >> 1));     //-1  1. ~取反，用来对一个二进制数按位取反，即将二进制中的0变1，将1变0，所以~0的二进制所有位都为1，0默认是有符号数，二进制最高位为符号位，所以 ~0 = -1；  2. signed char的最高位为符号位，因此char能表示-128~127。    对于有符号数，最高位是会被复制的，也就是它是1，则移位后还是填充1， 对于-1，二进制表示1111 1111，负数右移1位最高位补1，还是1111 1111，因此你无论移多少位，它还是-1,  所以 (signed char)~0 = (signed char)(-1) = -1  3. unsigned char没有符号位，-1 表示为二进制1111 1111, 右移一位 ==> 0111 1111, 转换为10进制 = 127
user-0 提问: C++遇到难题不会了，基础题，求解！！！

回复:
user: user-1
content: #include<iostream> #include<cstdlib> #include<ctime> using namespace std;     int main() {     int num;       int guess;       int diff;       bool isGuessed;       srand(time(0));     num = rand() % 100;     isGuessed = false;     cout << num;       while (!isGuessed)     {         cout << " Enter an integer greater"             << " than or equal to 0 and"             << " less than 100 : ";           cin >> guess;         diff = abs(num - guess);         if (diff == 0)         {             cout << " You guessed the correct "                 << " number. " << endl;             isGuessed = true;         }         else             cout << " Your guess wrong"             << " the number.\n Guess again!"             << endl;       }     return 0; }
user-0 提问: 头文件里面声明的函数，到底加extern好还是不加extern呢？

回复:
user: user-1
content: 《程序员的自我修养——链接、装载与库》

user: user-2
content: 三楼说错了：在硬件方面的程序，一般会在要用到该函数的文件的头文件里面用extern，告诉编译器，这个函数的声明在别的地方 正好说反了。   应该是  告诉编译器 这个函数定义在别的地方，这里只是声明并不是定义。加个extern 帮别人，或者后来的自己区分开来，提醒这里是声明，定义在别的地方。   通常函数不加extern 变量加。感觉就像写代码会对齐一样，算是个规范问题吧。加不加都一样。不加 下次再看的时候容易纠结，这里是定义还是声明。加了就能立刻明白是声明~

user: user-3
content: 函数声明，正常是不写extern 的，因为那是多余的 就像 没有人会写 auto int x ;一样。 以至于 auto 现在用作别的用途了

user: user-0
content: 引用 3 楼 user-7 的回复:在硬件方面的程序，一般会在要用到该函数的文件的头文件里面用extern，告诉编译器，这个函数的声明在别的地方  但是为什么不直接包含这个函数的头文件呢？如果这个函数是公开的，那应该在函数实体对应的头文件里面也会有一份声明吧？

user: user-3
content: 函数和变量不同 函数声明，不写extern 也是 extern 并且函数声明，定义的形式不同。不写也不会造成混乱。   变量不写，可能会看成定义式 尤其是C++，对象类型。

user: user-0
content: 好的，明白了，感谢各位。

user: user-4
content: 一般习惯不加

user: user-5
content: 通常为了简便不用加的，理解上也没什么歧义

user: user-6
content: 我的习惯是一律不加。只是提供函数原型而已

user: user-7
content: 在硬件方面的程序，一般会在要用到该函数的文件的头文件里面用extern，告诉编译器，这个函数的声明在别的地方
user-0 提问: 用中文写数据结构和算法可读性更高了

回复:
user: user-1
content: 引用 20 楼 zhao4zhong1 的回复:[quote=引用 19 楼 zhao4zhong1 的回复:] 可以把里面的阿拉伯数字和标点符号全换成中文后再贴下吗？ 可以把里面的英文字母、阿拉伯数字和标点符号全换成中文后再贴下吗？[/quote]  这小意思啊！这么简单的事情，不就一个宏替换吗

user: user-2
content: 其实中文英文都不重要，虽然我现在基本都是英文注释英文编码，不用中文只是现实的原因，无非就是乱码和团队合作的习惯问题。当然了，更重要的一个问题是：优秀的源码和讨论都是英文的，不能融入你就没法生存。如果有一天好的东西都是中文的，我不介意用中文。

user: user-3
content: 你要么全中文，这样切输入法都烦死

user: user-4
content: 似乎有一个问题，printf还是printf，函数没有中文化。

user: user-4
content: 加减乘除号不好换中文

user: user-5
content: 引用 19 楼 zhao4zhong1 的回复:可以把里面的阿拉伯数字和标点符号全换成中文后再贴下吗？ 可以把里面的英文字母、阿拉伯数字和标点符号全换成中文后再贴下吗？

user: user-5
content: 可以把里面的阿拉伯数字和标点符号全换成中文后再贴下吗？

user: user-6
content: 感觉上英文字母的不等高并且行间距比较大看着比较舒服  代码多了之后， 感觉大片等宽等高并且行间距比较小的中文看着很累

user: user-6
content: 引用 11 楼 AiWolong 的回复:引用 9 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/380157851 可以把里边的英文全换成中文后再贴下吗？

user: user-5
content: 引用 15 楼 zhao4zhong1 的回复:要不习语言集成开发环境也借（piao）鉴（qie）一下我的无敌语法高亮配置： http://bbs.csdn.net/topics/390467268 ？

user: user-5
content: 要不习语言集成开发环境也借（piao）鉴（qie）一下我的无敌语法高亮配置： http://bbs.csdn.net/topics/390467268 ？

user: user-5
content: 不错，在习语言中使用我自创的填表式编码风格毫无违和感。 看来习语言和C语言之间完全可以建立新型大国关系。

user: user-7

user: user-1
content: 引用 19 楼 zhao4zhong1 的回复:可以把里面的阿拉伯数字和标点符号全换成中文后再贴下吗？  据说阿拉伯数字是源自中国，被印度改良，传入阿拉伯，然后叫成阿拉伯数字的。

user: user-1
content: 引用 14 楼 zhao4zhong1 的回复:不错，在习语言中使用我自创的填表式编码风格毫无违和感。 看来习语言和C语言之间完全可以建立新型大国关系。  是否应该互派大使

user: user-5
content: 全中文软件开发不是软件开发。 白马非马。

user: user-8
content: 像易语言和习语言。 相对来说降低了某些人学习编程的门槛。 为大众多一个编程工具，方便尝试中文编程。 有空就尝试下，喜欢就学习下。

user: user-6
content: 似乎英文代码和中文代码不是同样的东东  用同样的代码比较更有说服力一些吧

user: user-9
content: 这工作量得增加一倍.

user: user-10
content: 奇才呀
user-0 提问: 不采用printf（3），如何向屏幕输出一个整形或者浮点型

回复:
user: user-1
content: 这还不简单，输出外挂…百度一下你就知道。acm小技巧。。。

user: user-2
content: putchar((char)i+48)输出，但是需要把整数或浮点数每一位提出来，一位一位输出，有点麻烦

user: user-3
content: 参考我的打log=。=    http://blog.csdn.net/u010370871/article/details/50508859  #include<iostream> #include<sstream> #include<fstream> using namespace std;  int main() { 	int a = 5; 	wstring aa = "adadad";  	//第一种方法 c++ 	ofstream fout("D:\\outtxt.txt");  	fout<<a<<endl; 	fout<<endl;  	fout<<flush; 	fout.close();         return 0; }

user: user-4
content: 可以用汇编指令，输出，如果你想了解printf的原理的话。 更深层次的是用加权系数法，将二进制转换成想要的进制，然后再变成字符输出。

user: user-5
content: 还有直接用平台API

user: user-6
content: puts,字数补丁.

user: user-7
content: 好像除了printf其他就没有了吧，（fprintf除外）

user: user-8
content: 用比如printf对应的源代码 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c 行吗？

user: user-0
content: 引用 2 楼 qq423399099 的回复:fprintf(stdout, "%d", num);  fprintf也是printf（3）里面的函数，限定了printf（3）里描述的任何函数都不能用

user: user-0
content: 引用 1 楼 chengbar 的回复:cout。。。。。 这是c++里面的吧，我的是C...

user: user-0
content: fprintf也是printf（3）里面的函数，限定了printf（3）里描述的任何函数都不能用

user: user-9
content: fprintf(stdout, "%d", num);

user: user-10
content: cout。。。。。
user-0 提问: int *a = malloc(sizeof(int)); 对于这个已经分配好的空间，如何扩大（增加一个sizeof（int））？？？

回复:
user: user-1
content: 引用 1 楼 qq423399099 的回复:不妨用realloc http://blog.csdn.net/hackerain/article/details/7954006 yes

user: user-2
content: 不妨用realloc http://blog.csdn.net/hackerain/article/details/7954006
user-0 提问: 这段代码为什么找不到符合水仙花的数

回复:
user: user-1
content: C语言的代码实现：  #include<stdio.h> #include<stdlib.h> #include<stdbool.h> int cube(const int n){ returnn*n*n; } bool isNarcissistic(const int n){ int hundreds=n/100; int tens=n/10-hundreds*10; int ones=n%10; return cube(hundreds)+cube(tens)+cube(ones)==n; } int main(void){ inti; for(i=100;i<1000;++i){ if(isNarcissistic(i)) printf("%d\n",i); } return EXIT_SUCCESS; }

user: user-2
content: 1、外层每次循环时应该重新初始cnt 与 sum变量  2、水仙花数的定义是每个位上的数字的 n 次幂之和等于它本身，而你的算法不知是在求什么

user: user-3
content: 引用 3楼我是你的主体 的回复:[quote=引用 1 楼 qq423399099 的回复:] 你每次for循环前都要将cnt这些变量置为初始值才行。  #include<stdio.h> int main() { 	int i, a, b, c; 	for (i = 100; i<10000; i++) 	{ 		a = i / 100; 		b = (i / 10) % 10; 		c = i % 10; 		if ((a*a*a + b*b*b + c*c*c) == i) 			printf("%d\n", i); 	} 	return(0); }  这个的话只能找出3位数的水仙花数，4位数就不行了[/quote]这个是找3,4位的，你改变下i的循环范围就好了

user: user-0
content: 引用 1 楼 qq423399099 的回复:你每次for循环前都要将cnt这些变量置为初始值才行。  #include<stdio.h> int main() { 	int i, a, b, c; 	for (i = 100; i<10000; i++) 	{ 		a = i / 100; 		b = (i / 10) % 10; 		c = i % 10; 		if ((a*a*a + b*b*b + c*c*c) == i) 			printf("%d\n", i); 	} 	return(0); }  这个的话只能找出3位数的水仙花数，4位数就不行了

user: user-4
content: #include<stdio.h> int main() {  int i,a,b,c;  for(i=100;i<10000;i++)  {   a=i/100;      b=(i/10)%10;      c=i%10;   if((a*a*a+b*b*b+c*c*c)==i)   printf("%d\n",i);  }  return(0); }

user: user-3
content: 你每次for循环前都要将cnt这些变量置为初始值才行。  #include<stdio.h> int main() { 	int i, a, b, c; 	for (i = 100; i<10000; i++) 	{ 		a = i / 100; 		b = (i / 10) % 10; 		c = i % 10; 		if ((a*a*a + b*b*b + c*c*c) == i) 			printf("%d\n", i); 	} 	return(0); }
user-0 提问: 不用库函数,用C语言实现将一整型数字转化为字符串

回复:
user: user-1
content: 引用 4 楼 FFY_1208 的回复:函数的实参应该是 s，不是s[100]. s代表字符串的首地址，调用字符串用到的是地址传递，只需把首地址传递给函数就可以了。

user: user-1
content: 函数的实参应该是 s，不是s[100].

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

user: user-3
content: reverse(s[100],b); 这个调用不能写s[100],s数组的合法范围是 s[0]~s[99],你这里直接写s就行了

user: user-4
content: 37    reverse(s[100],b); 参数错了，应该是 reverse(s, b);
user-0 提问: 我是新手 大家帮我看看 我这个程序哪有问题

回复:
user: user-1
content: #define PATH "c:\\login.data" //用户信息保存文件

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

user: user-3
content: 试了下没问题啊，代码前后重复了一遍。

user: user-4
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。
user-0 提问: fclose本地文件会失败吗，失败怎么处理

回复:
user: user-0
content: 您好，你让我每次写文件都打开，然后关闭，但是这个方式在我这性能跟不上，但还是谢谢您。

user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中

user: user-1
content: 我的意思是让你参考用两个文件来回切换的思路。

user: user-0
content: 问题是我这不是记日志的程序，而且是单线程的啊。
user-0 提问: 请教一个在看操作系统源码时碰到的关于变量的问题

回复:
user: user-1
content: 引用 3 楼 ziibin 的回复:刚刚翻了下是我忘了C语言作用域的规则了，看编程规范约束的代码看多了一眼看到这样的代码就觉得有问题，我还是觉得这里的变量不能都叫做end，超级别扭 难道还有变量没有作用域的语言？

user: user-0
content: 刚刚翻了下是我忘了C语言作用域的规则了，看编程规范约束的代码看多了一眼看到这样的代码就觉得有问题，我还是觉得这里的变量不能都叫做end，超级别扭

user: user-0
content: 引用 1 楼 user-1 的回复:就近原则，听说过么？ 并且你所说的第一个循环里的end，既然是局部变量，循环的大括号就是它的作用域范围啊，对于大括号外面，它是不可见的。 C里面支持循环体里面定义只在循环体内有效的局部变量吗？这个我真忘了

user: user-1
content: 就近原则，听说过么？ 并且你所说的第一个循环里的end，既然是局部变量，循环的大括号就是它的作用域范围啊，对于大括号外面，它是不可见的。
user-0 提问: 汇编时寄存器的位数

回复:
user: user-1
content: EAX EBX都是32位  十六进制 0018FCD0 中每一个数字代表4位二进制，所以4*8=32

user: user-2
content: al ah 8位 ax 16位 eax 32位 rax 64位
user-0 提问: c语言 free()函数结果

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

user: user-2
content: 释放内存不是清零内存，只是告诉说这块内存不要了，你可以再分配给“别人”  在未被覆盖之前，上面的值仍然在，但这是未定义行为，因为这已经不是你的内存了，你也不知他什么时候会是什么

user: user-3
content: l_node p = ( l_node)malloc(sizeof(*p));

user: user-4
content: 因为malloc释放内存是有先后问题的，虽然是结构体，但其包含的是不同的变量，分配给他们内存的时候有先后。而free释放的是最近一次调用的mallocfree的变量。而你这个问题出在，结构体内的char型，定义的是指针，系统不知道具体应该分配多少内存，所以字符串的内存并不是malloc分配的。所以释放的是int，释放后初始化为0；

user: user-5
content: 未定义行为。 free只是把内存还给了操作系统。 一般都不会清零（出于效率考虑）

user: user-6
content: 内存中任何位置，只要不重写，原来的数据总是保存着

user: user-7
content: 《the c programming language》里说过memalloc是基于内存池机制的

user: user-8
content: 释放的意义代表程序告诉系统,这块内存我不用了,系统可以把这块内存分配给其它申请内存的语句. 至于什么时候分配.什么时候被其它的语句改掉,那就是未知的了.  而p这个指针自从创建以后它就是一个具体的指针变量.不使用时,请把它=NULL;以防误使用时得到不正确的结果.这就是野指针了.
user-0 提问: 不理解restrict修饰词的具体用法，请高人指教。

回复:
user: user-1
content: 你完全可以通过rarr修改到数组的值。 编译器可不会给你报错。 它默认你是不会这样去做的

user: user-2
content: restrict  告诉编译器， 你将遵守这个关键字的约定， 只使用这个指针修改 他指向的内存中的内容 不使用其他途径，修改该指针指向的内容。  和 const 关键字，一样，都是说你将遵守约定 而不是编译器必须遵守约定。  同样 如果函数参数 使用了这个关键字 调用者，可以放心的相信，你不会胡作非为，你一定会遵守约定的  对编译器的好处是，编译器，可以放心的优化代码，而不会造成优化结果，不是你想要的。

user: user-2
content: 引用 3 楼 cyshen 的回复:[quote=引用 1 楼 user-2 的回复:] restrict  告诉编译器， 你将遵守这个关键字的约定， 只使用这个指针修改 他指向的内存中的内容 不使用其他途径，修改该指针指向的内容。  和 const 关键字，一样，都是说你将遵守约定 而不是编译器必须遵守约定。  同样 如果函数参数 使用了这个关键字 调用者，可以放心的相信，你不会胡作非为，你一定会遵守约定的  对编译器的好处是，编译器，可以放心的优化代码，而不会造成优化结果，不是你想要的。   谢谢！如果是只这样，那我觉得这玩意没什么用呀。我告近他干嘛，反正他又不给我检查。[/quote] 有用啊，比如memcpy这个函数，就是他的两个指针参数，都是 restrict   如果你写的代码、违反了这个，也许现在，也许将来可以检测出来，报告错误

user: user-0
content: 引用 1 楼 user-2 的回复:restrict  告诉编译器， 你将遵守这个关键字的约定， 只使用这个指针修改 他指向的内存中的内容 不使用其他途径，修改该指针指向的内容。  和 const 关键字，一样，都是说你将遵守约定 而不是编译器必须遵守约定。  同样 如果函数参数 使用了这个关键字 调用者，可以放心的相信，你不会胡作非为，你一定会遵守约定的  对编译器的好处是，编译器，可以放心的优化代码，而不会造成优化结果，不是你想要的。   谢谢！如果是只这样，那我觉得这玩意没什么用呀。我告近他干嘛，反正他又不给我检查。
user-0 提问: 一个结构体参数的疑问

回复:
user: user-1
content: 《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》

user: user-0
content: 引用 1 楼 user-2 的回复:因为 xxMat2 里的 m 和返回的 xxMat 即 cur_mat 已经不是同一个 xxMat 了。 它在函数返回时被复制， m 所占用的空间被释放，但返回的结构体里还包含指向 m 的成员的指针，因此返回的结构体是不可用的。 成员变量的指针赋值不会被复制吗，好久没看基础东西了，有点糊涂了

user: user-2
content: 因为 xxMat2 里的 m 和返回的 xxMat 即 cur_mat 已经不是同一个 xxMat 了。 它在函数返回时被复制， m 所占用的空间被释放，但返回的结构体里还包含指向 m 的成员的指针，因此返回的结构体是不可用的。
user-0 提问: C指针和数组的问题

回复:
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: #include<stdio.h>  int main() { 	char *str[] = {"Hello", "World"};  	printf("%c\n", *(*(str + 1) + 4));  	return 0; }

user: user-3
content: #include <stdio.h> void main() { 	char *str[] = {"Hello", "World"}; 	printf("%s\n",*(str+1)); } 这是二级指针，不知道你要输出什么，是字符还是字符串？首字母就是地址，不需要再加一个&了

user: user-4
content: printf("%c\n", *(*(str+1)+4));

user: user-5
content: str已经是一个二级指针，为何还要去地址，如果你想指向Hello第二个字母，你可以*str + 1 来完成， 如果你想指向下一个单词World 你可以用 str + 1 来完成，你去对一个地址进行+1无任何意义

user: user-6
content: 建议调试一下，然后看看各种变量的地址值就明白了（比如str,str[0],str[1],&str,&str+1） &str+1这个东西就已经是错误的东西了

user: user-7
content: 这样就可以了

user: user-1
content: char *str[] = {"Hello\0" "World"};

user: user-8
content: &str + 1你这个相当于是str[2]了，已经造成越界了。 而且str是个指针数组，它里面存放的是指针，这几个指针各自指向常量字符串（这几个常量字符串并不一定相邻存储） 你这样根本达不到目的
user-0 提问: 请问怎么通过路径访问到跳转到其他目录下，比如我这样是错误的

回复:
user: user-0
content: SetCurrentDirectory(L"c:\\下载\\"); 解决了。。

user: user-0
content: 它列出是这个程序所在的目录，而不是c:\下载\的目录，请问要跳转到c:\下载\目录下，该怎么写呢?
user-0 提问: 初学c，Devc++5.11  运行以下代码 

回复:
user: user-1
content: long double是c99新增的类型，好像不同编译器对这种类型的支持不一样，我在mingw下测试了好几个版本，long double输出也是不正常，printf("%d", sizeof(long double))得到的结果是12。另一个类似的常见的问题就是64位整型数的输出了，微软用的好像是printf("%I64d", a)而gcc用的好像是printf("%lld", a)。不同编译器之间有些差异

user: user-2
content: 楼主可以了解一下 C与C++程序设计学习与实验系统 2013.3

user: user-3
content: 说实话dev-c++运行小一点的程序错误还是很多的，换一个吧，以前我也用这个，后来实在受不了了

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

user: user-5
content: vs下是可以的

user: user-2
content: 引用 3 楼 u010165006 的回复:%Lf   l是大写还是小写？  VC 6.0试了下两种都是正确的。

user: user-2
content: %Lf   l是大写还是小写？

user: user-6
content: lf 对应的类型是double

user: user-7
content: 我刚才拿VS2013,运行了你的程序，结果如下，估计是编译器的问题！
user-0 提问: C语言声明变量顺序会对程序执行的结果造成影响吗？

回复:
user: user-0
content: 赵4老师的说法未免偏激了点呐！

user: user-1
content: 虎头蛇尾是俗人的习惯， 有始有终是君子的操守。  从java转C/C++ 就和从虎头蛇尾的俗人转有始有终的君子 一样。

user: user-2
content: 引用 2 楼 mywanneng 的回复:十分感谢你的回答！ 你分析的有道理，我按照你的建议，添加了代码，vs2013上跑程序没有异常，那么就可以断定：我提问的那种情况，是由于我对字符数组的赋值考虑不到位所致。我也觉得我对字符数组的赋值方式考虑得不是很周到，以前用java习惯了，用java对字符变量赋值习惯了，换成C语言的方式对字符数组赋值就有许多细节要注意，一下子适应不过来。  我还想问一个问题，我虽然按照你的建议做了，能在vs2013上顺利运行程序，但是你给的建议并不能保证程序在https://vijos.org/p/1001上提交通过（我之前是通过一遍一遍测试，最后改变了变量的顺序，才提交通过的）。我想知道对于https://vijos.org/这种编程网站，我在本地调试好程序，使用样例输入也能得到正确的样例输出，但提交就会可能出现这样那样的错误，你能不能有什么建议给我？或者说能不能告诉我这类网站是如何判断一个一个程序的正确性？我要如何做才能尽量使我的程序提交通过？ 网站通常是用很多数据作为输入来检测，只有所有的测试用例都得到正确的结果才算通过。如果不过，一般来说还是自己的程序问题，比如，有些条件考虑不周，有些组合忽略了，等等

user: user-0
content: 十分感谢你的回答！ 你分析的有道理，我按照你的建议，添加了代码，vs2013上跑程序没有异常，那么就可以断定：我提问的那种情况，是由于我对字符数组的赋值考虑不到位所致。我也觉得我对字符数组的赋值方式考虑得不是很周到，以前用java习惯了，用java对字符变量赋值习惯了，换成C语言的方式对字符数组赋值就有许多细节要注意，一下子适应不过来。  我还想问一个问题，我虽然按照你的建议做了，能在vs2013上顺利运行程序，但是你给的建议并不能保证程序在https://vijos.org/p/1001上提交通过（我之前是通过一遍一遍测试，最后改变了变量的顺序，才提交通过的）。我想知道对于https://vijos.org/这种编程网站，我在本地调试好程序，使用样例输入也能得到正确的样例输出，但提交就会可能出现这样那样的错误，你能不能有什么建议给我？或者说能不能告诉我这类网站是如何判断一个一个程序的正确性？我要如何做才能尽量使我的程序提交通过？

user: user-2
content: 编译器可能按声明变量顺序安排他们的位置，对字符串操作严重依赖在何处能找到字符串结束标志，如果没有，就用最近的'\0'，而它很可能是你上次赋值的其他变量的值的一部分。 建议这样改，在 while (' ' != (c = getchar())){             name[i++] = c;         } 后面加上 name[i] = '\0';
user-0 提问: 又一个while(getchar()!='\n') continue问题求解

回复:
user: user-0
content: Thank you 参考你的想法已经搞定了

user: user-1
content: 只要没接收到\n，也就是换行符，就一直接收，你最后输入完会按回车，也就会产生一个换行符\n，这样可以接收到最后

user: user-2
content: 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。
user-0 提问: 双递归的执行过程谁能解释下给我听 谢谢！

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:自己单步跟踪程序运行比谁给你解释都好  忽然想起来还有调试 感谢

user: user-1
content: 自己单步跟踪程序运行比谁给你解释都好
user-0 提问: strcpy（）漏洞举例说明

回复:
user: user-1
content: 可以百度 缓冲区溢出

user: user-2
content: 学习了

user: user-3
content: 安全都是相对的。

user: user-4
content: 所以微软自己搞了更安全的函数strcpy_s

user: user-5
content: 学习了

user: user-6
content: 溢出攻击的目的，是覆盖返回地址，跳转到需要执行的代码位置 代码也同攻击代码放在一起。 溢出攻击本身的代码，也就数输入的数据，其实是二进制代码

user: user-7
content: 如果溢出的太厉害了，不仅修改了flag的内容，怕是把main函数的返回地址也破坏了，整个程序就完了
user-0 提问: 大家好，小白有一个疑问，PC可以装Windows，也可以装Linux，而手机却只能刷特定机型的刷机包，就算是相同品牌下的不同机型的刷机包也不能，这是为什么呢?

回复:
user: user-1
content: 引用 5 楼 yyxgs 的回复:[quote=引用 4 楼 u010165006 的回复:] 不同的手机，CPU指令集可能不同，硬件配置也不相同，而一般的刷机包都是针对一款机型的，不像Windows、Linux等系统包括了众多的驱动程序，不过如果是专门的硬件卡也需要厂家提供专门的驱动，系统也不会自带的。  驱动可不可以自己写呢?[/quote]  难度系数很高亚，专门厂家的专门人员做专门的事才有效率。

user: user-2
content: 当年HD2就既可以用WM系统，也可以用安卓系统

user: user-0
content: 引用 3 楼 user-3 的回复:[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 user-3 的回复:] PC有硬盘，有光盘，能预存很多很多驱动程序，装个系统用几个小时也能忍受 手机呢 刷机包中只有针对本机的驱动，下载、安装，快啊  换句话说就是如果能包括其他机型的驱动的话，那么这个手机也可以刷其他机型的刷机包了吗?[/quote] 理论上是[/quote]    引用 4 楼 u010165006 的回复:不同的手机，CPU指令集可能不同，硬件配置也不相同，而一般的刷机包都是针对一款机型的，不像Windows、Linux等系统包括了众多的驱动程序，不过如果是专门的硬件卡也需要厂家提供专门的驱动，系统也不会自带的。  驱动可不可以自己写呢?

user: user-1
content: 不同的手机，CPU指令集可能不同，硬件配置也不相同，而一般的刷机包都是针对一款机型的，不像Windows、Linux等系统包括了众多的驱动程序，不过如果是专门的硬件卡也需要厂家提供专门的驱动，系统也不会自带的。

user: user-3
content: 引用 2 楼 yyxgs 的回复:[quote=引用 1 楼 user-3 的回复:] PC有硬盘，有光盘，能预存很多很多驱动程序，装个系统用几个小时也能忍受 手机呢 刷机包中只有针对本机的驱动，下载、安装，快啊  换句话说就是如果能包括其他机型的驱动的话，那么这个手机也可以刷其他机型的刷机包了吗?[/quote] 理论上是

user: user-0
content: 引用 1 楼 user-3 的回复:PC有硬盘，有光盘，能预存很多很多驱动程序，装个系统用几个小时也能忍受 手机呢 刷机包中只有针对本机的驱动，下载、安装，快啊  换句话说就是如果能包括其他机型的驱动的话，那么这个手机也可以刷其他机型的刷机包了吗?

user: user-3
content: PC有硬盘，有光盘，能预存很多很多驱动程序，装个系统用几个小时也能忍受 手机呢 刷机包中只有针对本机的驱动，下载、安装，快啊
user-0 提问: scanf()问题?

回复:
user: user-1
content: 这要看你定义的是什么类型了，如果是int型数组，用多少，给多少，不需要考虑‘\0’的问题，如果是字符串，就需要多定义一位，因为系统会自动加上一个'\0'，这也就占了一位，如果你不多给一位，就越界了。

user: user-2
content: scanf("%10s",&a); 小心驶得万年船。

user: user-3
content: 如果不是字符数组的话，系统一般不会把'\n'读取进去

user: user-4
content: 只要你的a不是字符数组，\n只是留在缓冲区，不会放到你的数组中

user: user-5
content: #include <stdio.h> void main() { 	char a[11] = {0}; 	scanf("%s",&a); 	printf("%s",a);	 }   楼主的a定义类型是int还是char？？

user: user-6
content: 当你定义的是存放数字的数组，而不是存放字符的数组时，scanf（）是不会把 '\n' 或 ‘\0’ 读入的。

user: user-7
content: scanf是不会读入回车符的。 你要输入0123456789的话，应该给数组开的长度是11而不是10，因为最后需要放'\0'
user-0 提问: 关于C语言的错误，用VS2015编写的

回复:
user: user-0
content: 按照你的指点问题已经解决，我怎么样把分给你？ 我刚自学C语言没几天，有一点不太明白： 为什么 这一句”scanf("%lf %d %lf", &number1, &operation, &number2);“要加&， 而这里”result = number1 + number2;         printf("= %f\n", result);“却不能加呢？

user: user-1
content: 引用 3楼我是你的主体 的回复:按照你的指点问题已经解决，我怎么样把分给你？ 我刚自学C语言没几天，有一点不太明白： 为什么 这一句”scanf("%lf %d %lf", &number1, &operation, &number2);“要加&， 而这里”result = number1 + number2;         printf("= %f\n", result);“却不能加呢？点结帖按钮。 因为scanf是这样规定的，你可以理解成要将输入的数据写入一个内存地址，由于是地址，所以要加&

user: user-1
content: 1.scanf("%lf %c %lf\n", &number1, &operation, number2);这句不对 number2前面少了&，%c应该是%d吧，'\n'也要去掉 2.printf("= %f\n", &result);也不对，result前面多了&  #include<stdio.h> #include<stdlib.h>  int main(void) { 	double number1 = 0.0; 	double number2 = 0.0; 	int operation = 0; 	double result = 0.0;   	printf("\n请在里输入要计算数字\n"); 	scanf("%lf %d %lf", &number1, &operation, &number2);  	switch (operation) 	{ 	case 1: 		result = number1 + number2; 		printf("= %f\n", result); 		break;  	case 2: 		result = number1 - number2; 		printf("= %f\n", result); 		break;  	case 3: 		result = number1 * number2; 		printf("= %f\n", result); 		break;  	case 4: 		if (number2 == 0) 			printf("\n\n数字输入错误，除数不能为0!\n"); 		else 			result = number1 / number2; 		printf("= %f\n", result); 		break;    	default: 		printf("不正确的操作法!!!"); 		break;  	}  	system("pause"); 	return 0;  }

user: user-2
content: vs2015的话，应该有一大堆警告信息吧, 反正就是关于类型不安全的
user-0 提问: 真的自己解决不了才来求助的。。。。。

回复:
user: user-0
content: 问题圆满解决，加个置零就好了，谢谢。

user: user-1
content: 首先，我看不清你的截图，不知道我这里显示问题还是你没截好！其次，你的内循环似乎不太对！有以下几点:第一，你每次最内层都执行47次，不是很懂，我觉得应该是x2+1-x1次，即j次，你这样会导致有未定义的元素的使用。第二，按照你的代码，你每次最内层执行完b[]应该要重置！当然如果改成j则没有一定要求了。请指正
user-0 提问: 文件输入输出

回复:
user: user-0
content: 谢谢了，原来是因为这

user: user-1
content: i从1开始吧 argv[0]是可执行文件本身，就是那个13.11.4.exe，DOS的exe文件不是文本文件，内容按字符格式输出就是乱码，但它是以十六进制4D5A开头的，按ASCII码解释就是MZ
user-0 提问: 求助 C语言中怎么进行文件内容的读取？

回复:
user: user-1
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 lxh_849063924 的回复:] [quote=引用 1 楼 user-1 的回复:] 您好，文件类型的不同会影响函数的种类和用法吗？比如SensorTag传过来的不是TXT文件而是其他文件，那读取的步骤是否一样呢？谢谢！[/quote] fread,fwrite 用来读写二进制文件 fscanf,fprintf ,用来读写文本文件 当然，一切文件都可以看作二进制文件 所以，文本文件，可以用二进制方式打开，读写 反之，不成立 [/quote] 多写了个n 修改一下

user: user-1
content: 引用 2 楼 lxh_849063924 的回复:[quote=引用 1 楼 user-1 的回复:] 您好，文件类型的不同会影响函数的种类和用法吗？比如SensorTag传过来的不是TXT文件而是其他文件，那读取的步骤是否一样呢？谢谢！[/quote] fread,fwrite 用来读写二进制文件 fscanf,fprinntf ,用来读写文本文件 当然，一切文件都可以看作二进制文件 所以，文本文件，可以用二进制方式打开，读写 反之，不成立

user: user-0
content: 引用 1 楼 user-1 的回复:文件基本操作： 打开，读，写，移动文件指针，关闭文件,以及回绕文件指针，读取当前文件位置 C： fopen,fscanf,fprintf,fseek,fclose，以及rewind,ftell  就是做这个的，查一下帮助，看看怎么用 此外，还有 fgetc,fputc, 字符读写 fgets,fputs 字符串读写 fread,fwrite 二进制读写  还有错误相关的函数，文件错误ferror,文件结束feof 打开有两种方式 基本方式文本方式，二进制方式 文件读写，也可以在打开的时候确定，可以读方式打开，写方式打开，读写方式打开 您好，文件类型的不同会影响函数的种类和用法吗？比如SensorTag传过来的不是TXT文件而是其他文件，那读取的步骤是否一样呢？谢谢！

user: user-1
content: 文件基本操作： 打开，读，写，移动文件指针，关闭文件,以及回绕文件指针，读取当前文件位置 C： fopen,fscanf,fprintf,fseek,fclose，以及rewind,ftell  就是做这个的，查一下帮助，看看怎么用 此外，还有 fgetc,fputc, 字符读写 fgets,fputs 字符串读写 fread,fwrite 二进制读写  还有错误相关的函数，文件错误ferror,文件结束feof 打开有两种方式 基本方式文本方式，二进制方式 文件读写，也可以在打开的时候确定，可以读方式打开，写方式打开，读写方式打开
user-0 提问: 不明白if(a&b)

回复:
user: user-1
content: 引用 2 楼 shan794462554 的回复:[quote=引用 1 楼 wen_eric 的回复:] 判断b的值是不是4. a与b不是进行按位与操作吗，if因该是判断a&b的值，怎么变成判断b的值是不是4？[/quote] 我上面的解释是错的。应该是判断第三位是否是1. 因为int a的值是4，换成2进制表示就是： 0000 0000 0000 0000 0000 0000 0000 0100 因为a的除第3位的其余位与b的对应位的与操作都是0. 只有b的第3位是1时，a&b的结果是4，if的条件表达式的结果才为true.

user: user-2
content: 4的二进制是0000 0000 0000 0000 0000 0000 0000 0100 和4按位与就是取出那个数的第三位。 a&b就是如果为真，说明b的第三位就是1

user: user-0
content: 引用 3 楼 u013790834 的回复:判断它的第三位是否置为1 我可以这样理解吗：因为b未初始化，则if(a&b)变成判断2者是否相等，如果b初始化，则变成判断a&b后的值，是不是这样理解？

user: user-3
content: 判断它的第三位是否置为1

user: user-0
content: 引用 1 楼 wen_eric 的回复:判断b的值是不是4. a与b不是进行按位与操作吗，if因该是判断a&b的值，怎么变成判断b的值是不是4？

user: user-1
content: 判断b的值是不是4.
user-0 提问: 初学c语言，为什么两位数和一位数混合排序时会出错，有时候准确，有时候又不准确，求大神指教？

回复:
user: user-0
content: 感谢你提供的学习方法，多谢！

user: user-0
content: 感谢你的提醒，我把k=i;放进第二个循环里就可以了！

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

user: user-2
content: void sort(int number[],int n) {     int i,j,t;     for(i=0;i<n-1;i++)     {         for(j=i+1;j<n;j++)         {             if(number[i]>number[j]) {             t=number[i];             number[i]=number[j];             number[j]=t; }         }     } } 改成这样就对了，记得给分哈

user: user-2
content: if(number[k]>number[j]) k=j;             t=number[k];             number[k]=number[i];             number[i]=t; 这段代码有问题，if(number[k]>number[j]) k=j;后，如果后面有number[k]<=number[j]的话，就会出问题了，因为k的值不是i了
user-0 提问: 小白求指导

回复:
user: user-1
content: 第一个程序只要get_first返回了，就会输出一次，而get_first要返回，是根据'\n'判断的 第二个程序是判断EOF的，在WINDOWS下要输入ctrl+z才行

user: user-2
content: 程序一因为有个判断回车的，所以结束了，程序2，你输入一个字符，然后回车，相当于输入了两个字符，一个是你输入的，还有个回车的字符

user: user-2
content: 那个回车保存在缓冲区

user: user-2
content: 这个是缓冲区的问题，你输入一个字符后按了个回车，保存在缓冲区里，相当于下次你输入了个回车，然后结束了

user: user-0
content: 同样是用getchar，为什么运行时程序一只能输入一行数据（按了回车就停止），而程序二可以输入很多行，直至^Z结尾
user-0 提问: csv格式一步计算的编程问题

回复:
user: user-1
content: 这是你的作业，请自己完成！

user: user-2
content: 最关键的是，如何将字符型数组转变为float型数组。比如a[i]={'1','2','3'};如何将其变为b[0]=123;  atoi  atof

user: user-3
content: 拙见： 123 = 1*100 + 2*10 +  3*1
user-0 提问: free内存的时候出错，求助

回复:
user: user-1
content: 越界访问了  改成 int     *pi = malloc(sizeof(int)*2); 可正常

user: user-2
content: 你申请了4个字节，实际占用的空间当然是大于4字节的，它需要放内存管理信息，调试信息这些。 不然你free的时候它怎么能知道到底释放多大？

user: user-3
content: 引用 5 楼 dy452876 的回复:[quote=引用 1 楼 zjq9931 的回复:] 倒数第2行访问越界了。。。  我在上面回复了，帮忙一起看下。[/quote] 这里有讲。 http://blog.csdn.net/yupei881027/article/details/42673343

user: user-0
content: 引用 1 楼 zjq9931 的回复:倒数第2行访问越界了。。。  我在上面回复了，帮忙一起看下。

user: user-0
content: 引用 2 楼 qq423399099 的回复:int     *pi = malloc(sizeof(int));你这个只申请了一个int的字节 *(pi+1)=101;这句会造成越界，破坏了你堆空间周围的信息，导致free出错  虽然是这个意思，按这么说在单步执行*(pi+1)=101的时候报错更合理。  此外，还有个现象，比如把*(pi+1)改成*(pi+2)=101,再释放的时候就没问题了， 有没有可能虽然申请了一个4字节的内存，但是实际上占用的字节不止4个字节？  前4个字节是100，后面那些字节都是什么？ 再看free以后的  明显有48个字节发生了变化，被清空了，这是编译器的问题吗？

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

user: user-2
content: int     *pi = malloc(sizeof(int));你这个只申请了一个int的字节 *(pi+1)=101;这句会造成越界，破坏了你堆空间周围的信息，导致free出错

user: user-3
content: 倒数第2行访问越界了。。。
user-0 提问: 请问OC怎样转换成字节{0XAA ,0X0F ,0X01, bs ,0X00 ,0X00 ,0X00, 0X00, 0X00,0X00, 0X00, 0X00,

回复:
user: user-0
content: 谢谢，我去整理下

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

user: user-0
content: 从客户端发过来的是null,我现在要解析这个null，把它转换成0xFF,并显示出来，这样的，赵老师有方法吗？

user: user-0
content: bs可以不管它，现在我要把16进制的数据，显示出来，从客户端传过来的是看不见的，解决这个问题

user: user-1
content: bs是啥东东？
user-0 提问: 内存分配

回复:
user: user-1
content: 服务器程序不行。 一般程序就算不释放一般也不会出问题

user: user-2
content: 肯定不是的，再大再多不管理，也会耗光的，尤其是服务器程序，长时间运行，必须严格处理内存管理问题

user: user-3
content: 再大的内存也会被用完

user: user-4
content: 等人类发明了长生不老药之后，再等地球容纳不下全人类的时候，要么开拓第N个地球，要么研发长生不老药的克星——大规模杀死性武器。

user: user-5
content: 用发展的眼光看待科技的发展，随着软件包大小的增长，人们对内存的需求越来越大，学习内存分配也很有必要。接触底层的数据分配，能够让软件的运行效率更高