Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 杭电OJ判断Runtime Error (ACCESS_VIOLATION)

回复:
user: user-1
content: 可以去搜索最大组数组的问题，http://blog.csdn.net/liufeng_king/article/details/8632430这个博客你可以看一看，大概就会懂了

user: user-2
content: 最好把题目说出     来

user: user-3
content: or(j=1;j<=IntegerNumber;j++)         {             scanf("%d",&integer[j]); ///输入数组             if( start == 0 && integer[j] >= 0 )///确定第一个大于等于零的数作为起始位                 start = j ;         } 这个地方有可能导致越界，比如输入的IntegerNumber为1000，这个地方就越界了。下标从0开始， or(j=0;j<IntegerNumber;j++)         {             scanf("%d",&integer[j]); ///输入数组             if( start == 0 && integer[j] >= 0 )///确定第一个大于等于零的数作为起始位                 start = j ;         } 另外，对于大数组，建议定义成全局的或者静态变量。栈上的空间是稀少和宝贵的，不建议占用栈上的过多空间。  static int integer[1000];     int CaseNumber ; ///情况数     int IntegerNumber ;///每一种情况包含的数字个数     static int MaxSum[1000] ;

user: user-4
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
user-0 提问: 程序判断不正确，求指教

回复:
user: user-0
content: 引用 2 楼 xian_wwq 的回复: if (0 < c < 5 && 23 <= c <=24)  这个条件是永远无法满足的 应该是 0 < c < 5 ||  23 <= c <=24吧 嗯嗯，这个事项对时间进行判断，有点想当然了

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include<stdio.h> #include<math.h>  int dayFee(int a) {     int fee1;      if(a > 0 && a <= 3){         fee1 = 13 + 1;     }else if(3 < a){         fee1 = (a - 3) * 2.3 + 12 + 1;     }else{     }     return fee1; }  int nightFee(int b) {     int fee2;      if(b > 0 && b <= 3){         fee2 = 13 + 1;     }else if (b > 3) {         fee2 = (b - 3) * 1.2 * 2.3 + 12 + 1;     }else{     }      return fee2; }  int timeNumber(int c, int d) {     int fee;      if(c >= 5 && c < 23){         dayFee(d);         return fee = dayFee(d);     }else if ((c > 0 && c < 5) && (c >= 23 && c <= 24)){         nightFee(d);         return fee = nightFee(d);     }else{         printf("error c\n");         return 0;     } }  int main() {     timeNumber(9, 12);     printf("work fee: %d\n", timeNumber(9, 12));     timeNumber(18, 12);     printf("down fee: %d\n", timeNumber(18, 12));     printf("all fee : %d\n", timeNumber(9, 12) + timeNumber(18, 12));     return 0; } 注意你的if判断，表达式有问题，建议复习一下判断表达式的写法。 了解了，请问一下，关于时间的判断有没有什么更好的方法，就是函数里的数值c

user: user-1
content: if (0 < c < 5 && 23 <= c <=24)  这个条件是永远无法满足的 应该是 0 < c < 5 ||  23 <= c <=24吧

user: user-2
content: #include<stdio.h> #include<math.h>  int dayFee(int a) {     int fee1;      if(a > 0 && a <= 3){         fee1 = 13 + 1;     }else if(3 < a){         fee1 = (a - 3) * 2.3 + 12 + 1;     }else{     }     return fee1; }  int nightFee(int b) {     int fee2;      if(b > 0 && b <= 3){         fee2 = 13 + 1;     }else if (b > 3) {         fee2 = (b - 3) * 1.2 * 2.3 + 12 + 1;     }else{     }      return fee2; }  int timeNumber(int c, int d) {     int fee;      if(c >= 5 && c < 23){         dayFee(d);         return fee = dayFee(d);     }else if ((c > 0 && c < 5) && (c >= 23 && c <= 24)){         nightFee(d);         return fee = nightFee(d);     }else{         printf("error c\n");         return 0;     } }  int main() {     timeNumber(9, 12);     printf("work fee: %d\n", timeNumber(9, 12));     timeNumber(18, 12);     printf("down fee: %d\n", timeNumber(18, 12));     printf("all fee : %d\n", timeNumber(9, 12) + timeNumber(18, 12));     return 0; } 注意你的if判断，表达式有问题，建议复习一下判断表达式的写法。
user-0 提问: 猜数字

回复:
user: user-1
content: 我这有这个游戏的exe

user: user-1
content: 有HTML版本的没？

user: user-2
content: 不明白guess函数要写什么功能。

user: user-0
content: 猜数字，计算机随机生成1个3或4位的十进制整数，各个数位上的数字各不相同，用户给出猜测，计算机回答XAYB（X个位置和数字猜中，Y个数字猜中但位置错误），重复用户猜计算机回答的过程，直到猜中为止（3A0B，4A0B）。 这里，将给出若干组相关的数据供猜测（即第i把猜123，第j把不可能是123）。比谁的程序猜测的总次数最少。 文件“猜数字测试代码.txt”是给学生的，函数int guess(int A,int B)是学生需要完成的，其中参数A和B就是计算机根据上次猜测返回的结果，若是3A0B（以猜3个数为例），表示新一把猜测的开始。目前，guess中的代码，可供人机交互，学生提交时应该删除。 文件“8数码拼图测试代码.txt”是提供给教师的，这里简单地采用“随机+排除”的方法（但针对的是不相关的数据），猜3个数的和人的水平差不多，猜4个数比人厉害。    这是要求
user-0 提问: 如何把编译好C文件后生成的exe可执行文件单独保存下来，使得能够在其他没有编译器的电脑能独立正常运行？

回复:
user: user-0
content: 引用 6 楼 JILAU_WHO_AM_I_Q234 的回复:不对，system（）和getchar只是为了程序运行完了后停止让你能看到运行结果 system("pause")可以理解，但是如果用了getchar()函数岂不是最后结束时需要  引用 6 楼 JILAU_WHO_AM_I_Q234 的回复:不对，system（）和getchar只是为了程序运行完了后停止让你能看到运行结果 谢谢，我知道了，我试过两个都有效。只是没想到getchar还可以这样用。

user: user-1
content: 学会使用depends.exe查看exe依赖的dll

user: user-2
content: 看提到win10，就以windows系统为例： 一般来说就是：静态链接库与动态链接库。 若使用的是静态链接库，则可以直接运行，而不需要一堆的支持dll。 否则需要安装最小运行支持环境。

user: user-3
content: 不对，system（）和getchar只是为了程序运行完了后停止让你能看到运行结果

user: user-0
content: 引用 2 楼 JILAU_WHO_AM_I_Q234 的回复:可以，但是要看你的程序最后有没有停止退出的设置例如在return前加一句getchar()或者system("pause")都可以停止，因为没有这些语句，运行exe文件后，程序是运行了，但是会马上退出，所以要暂停，才能看到结果 是不是可以这样理解。只要是程序中有等待输入的函数，比如scanf（），程序就不会闪退，可执行文件就可以移植运行吧？

user: user-0
content: 引用 1 楼 waji2000 的回复:看提到win10，就以windows系统为例： 一般来说就是：静态链接库与动态链接库。 若使用的是静态链接库，则可以直接运行，而不需要一堆的支持dll。 否则需要安装最小运行支持环境。 你好，我学C不深，对于静态动态库什么的还没了解到，不是很了解。我现在写的程序比较简单，如果只是做简单的输入输出以及用到了stdio.h window.h string.h等头文件，这样的程序可以直接移植可执行文件吗？

user: user-3
content: 可以，但是要看你的程序最后有没有停止退出的设置例如在return前加一句getchar()或者system("pause")都可以停止，因为没有这些语句，运行exe文件后，程序是运行了，但是会马上退出，所以要暂停，才能看到结果

user: user-3
content: 可以，但是要看你的程序最后有没有停止退出的设置例如在return前加一句getchar()或者system("pause")都可以停止，因为没有这些语句，运行exe文件后，程序是运行了，但是会马上退出，所以要暂停，才能看到结果
user-0 提问: C语言循环问题，真的见鬼了！！！

回复:
user: user-1
content: 引用 2 楼 Pantree00的回复:这是卡布列克常数，我已经知道哪里出了问题。非常感谢你的回答。 学习了！

user: user-0
content: 这是卡布列克常数，我已经知道哪里出了问题。非常感谢你的回答。

user: user-1
content: 当n==6174的时候跳出循环? 感觉这个有点难吧
user-0 提问: 再看数组、二维数组和指针

回复:
user: user-1
content: 引用 3 楼 happyendingzhb 的回复:[quote=引用 2 楼 ipqtjmqj 的回复:] 在C中，在几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第1个元素的地址 ----------------------------- 这句好像不对。数组的值就是数组的内容，比如char a[5]; 那么sizeof(a)结果为5. 之所以造成是个指针的假象，是因为c语言是弱类型语言，数组在传参是会隐式转成指向在首个元素的指针。 这个我是从《c专家编程》这本书里看来的。 《C专家编程》哪里？我查查看[/quote] download.csdn.net搜索c专家编程就有下载

user: user-0
content: 引用 2 楼 ipqtjmqj 的回复:在C中，在几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第1个元素的地址 ----------------------------- 这句好像不对。数组的值就是数组的内容，比如char a[5]; 那么sizeof(a)结果为5. 之所以造成是个指针的假象，是因为c语言是弱类型语言，数组在传参是会隐式转成指向在首个元素的指针。 这个我是从《c专家编程》这本书里看来的。 《C专家编程》哪里？我查查看

user: user-1

user: user-1
content: 引用 6 楼 happyendingzhb 的回复:[quote=引用 4 楼 ipqtjmqj 的回复:] [quote=引用 3 楼 happyendingzhb 的回复:] [quote=引用 2 楼 ipqtjmqj 的回复:] 在C中，在几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第1个元素的地址 ----------------------------- 这句好像不对。数组的值就是数组的内容，比如char a[5]; 那么sizeof(a)结果为5. 之所以造成是个指针的假象，是因为c语言是弱类型语言，数组在传参是会隐式转成指向在首个元素的指针。 这个我是从《c专家编程》这本书里看来的。 《C专家编程》哪里？我查查看[/quote] download.csdn.net搜索c专家编程就有下载[/quote]哪一章节？[/quote] 随便看一下目录应该很容易发现吧

user: user-0
content: 引用 4 楼 ipqtjmqj 的回复:[quote=引用 3 楼 happyendingzhb 的回复:] [quote=引用 2 楼 ipqtjmqj 的回复:] 在C中，在几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第1个元素的地址 ----------------------------- 这句好像不对。数组的值就是数组的内容，比如char a[5]; 那么sizeof(a)结果为5. 之所以造成是个指针的假象，是因为c语言是弱类型语言，数组在传参是会隐式转成指向在首个元素的指针。 这个我是从《c专家编程》这本书里看来的。 《C专家编程》哪里？我查查看[/quote] download.csdn.net搜索c专家编程就有下载[/quote]哪一章节？

user: user-2
content: 标准有规定数组的地址一定要和首元素的地址相等吗？

user: user-1
content: 在C中，在几乎所有使用数组名的表达式中，数组名的值是一个指针常量，也就是数组第1个元素的地址 ----------------------------- 这句好像不对。数组的值就是数组的内容，比如char a[5]; 那么sizeof(a)结果为5. 之所以造成是个指针的假象，是因为c语言是弱类型语言，数组在传参是会隐式转成指向在首个元素的指针。 这个我是从《c专家编程》这本书里看来的。

user: user-3
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
user-0 提问: 求问一款无用函数清理工具

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:楼上说了这么多，意思就是没必要清理无用函数。  这点无法认同，单独从一个场景下就可以否决了：  从代码的易读性来说，bug定位肯定是越快越好，在充斥着无用函数的项目，会对定位bug造成无畏的干扰。  尤其在无用函数较多并且函数名还相近的时候。当然，也许有人会说，函数内部放几个打印开关，然后在调试软件上试一遍不就知道调用哪个函数了吗？ 我认为这个方法并不妥当，一个是耗时，另一个个是有些情况下并不被允许打开打印开关，尤其是对于已经商用的产品代码。

user: user-1
content: 太过依赖git或svn,不是什么好习惯。因为版本管理软件不能备份整个软硬件环境。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:因为历史总是会惊人地相似。  过去被淘汰的做法，现在很可能再次启用； 同样， 现在被淘汰的做法，未来很可能再次使用。  我觉得不应该以未来的非确定需求决定现有的系统设计，这样会造成冗余并且使设计增加部分不合理性，TDD与极限编程思想里推崇的一般也只是“轻设计”或者“不设计”理念。  其实去除无用代码如果未来需要重新启用的话，可以用git或者svn回复。  其实我个人感觉在实际项目开发中，也许无用代码未来会被启用，但是当启用时会发现，早前写的代码已经很大程度上不再适用现有的代码需求了，因为中间加入了许多迭代功能开发，需要考虑的波及分析也比较多，最后导致其实和重写并无不同。  以上仅是个人观点。

user: user-1
content: 因为历史总是会惊人地相似。  过去被淘汰的做法，现在很可能再次启用； 同样， 现在被淘汰的做法，未来很可能再次使用。

user: user-1
content: 请深刻理解1楼内容。

user: user-1
content: 楼上说了这么多，意思就是没必要清理无用函数。

user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。
user-0 提问: 求助大佬

回复:
user: user-1
content: 函数返回的是结构体，你用结构体指针接收的，统一一下类型就好了

user: user-0
content: 改完后提示：error C2115: '=' : incompatible types  stu = FindByName(sTranscript, 5, name);  是这一行两边不匹配 可能是我下边的那个函数类型就不对，返回值匹配不了 请问应该怎么改啊

user: user-2
content: if(arra==str[i].cName)	 改为       if (0==strcmp((char *)arra,(char *)(str[i].cName))
user-0 提问: 求大神卡看一下这个switch哪里出错了，感谢

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

user: user-2
content: 写代码时，先按 Ctrl+A 全选，再按 Alt+F8，可以将代码格式化，调整为正确的缩进。

user: user-3
content: 这代码写的...建议写规范点啊  就不会漏了

user: user-4
content: 每个switch都要加大括号把case都扩进去

user: user-0
content: 已解决，漏了一个{},谢谢

user: user-1
content: 帮结贴+蹭分
user-0 提问: malloc()问题

回复:
user: user-1
content: int len = sizeof(int);//不同平台的字节大小不一样,tc2.0是2个字节,vc++6是4字节 int* d = (int*)malloc(sizeof(int));//内存块大小取决平台  //下面这种可以移动位移3次指针 int p* = (int*)malloc(sizeof(int)*3); for(int i = 0;i < 3;i++){     p++;     printf("0x%0x\n",p); }

user: user-2
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-2
content: 引用 6 楼 qq_35637956 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。 虽然我听不懂但是肯定你说的是对的~[/quote] 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 引用 2 楼 qq_35637956 的回复:那这个+1现在是不是已经越界了~! +1已经不能使用了。也算是越界。即使使用没问题，但是也不能使用，因为+1之后的空间可能会被其他使用。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。 虽然我听不懂但是肯定你说的是对的~

user: user-4
content: 编译器是不会特意的进行越界检查的

user: user-5
content: 编译器在编译阶段不会进行边界检查，需要程序员自己保证不要越界，越界的结果是未定义的，可能数据还在，可能被擦除，总之自己要确保不能越界访问

user: user-2
content: 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

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

user: user-0
content: 引用 1 楼 user-6 的回复:不是，随机分配的内存，+1越界有风险，可能会改变其他变量的数值，再+1有可能就真的越界了。malloc最好别这么用。  那这个+1现在是不是已经越界了~!

user: user-0
content: 那这个+1现在是不是已经越界了~!

user: user-6
content: 不是，随机分配的内存，+1越界有风险，可能会改变其他变量的数值，再+1有可能就真的越界了。malloc最好别这么用。
user-0 提问: 将数字从小到大进行排序，但输出这个结果，不知问题出在哪?

回复:
user: user-1
content: 在main()函数里     for(i=0;i<=4;i++);       printf("%d ",a[i]); for循环后面多了一个分号，去掉即可。 如果加入了这个分号，实际上就是只有for循环而没有执行语句，在该for循环结束后，i的值是5， 此时再 printf("%d ",a[i]); 实际上输出的是a[5]，已经越界，所以输出是一个很大的负数。 关于for循环的知识请参考 http://blog.csdn.net/hou09tian/article/details/77001685
user-0 提问: 求大师解答

回复:
user: user-1
content: return 0；放外面试试

user: user-2
content: #include <stdio.h>  int main() {     printf("请输入月份，我来判断天数。\n");     int month;     scanf("%d",&month);     switch(month)    /* drop ;*/     {     case 1:         printf("1月有31天\n");         break;      case 2:         printf("2月有28天，\n");         break;      case 3:         printf("3月有31天，\n");         break;      default:         printf("当前程序只判断1-3月的情况。\n");         break;    /* use break replace return */     }          return 0; } 两处错误，一处是switch后面多一个分号;，一处是case1，需要加分号，否则只能认为是一个未定义的变量；

user: user-3
content: case  1: case  2:  中间有空格

user: user-2
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     printf("请输入月份，我来判断天数。\n");     int month;     scanf("%d",&month);     switch(month)    /* drop ;*/     {     case 1:         printf("1月有31天\n");         break;      case 2:         printf("2月有28天，\n");         break;      case 3:         printf("3月有31天，\n");         break;      default:         printf("当前程序只判断1-3月的情况。\n");         break;    /* use break replace return */     }          return 0; } 两处错误，一处是switch后面多一个分号;，一处是case1，需要加分号，否则只能认为是一个未定义的变量； case 1中间需要加空格

user: user-4
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     printf("请输入月份，我来判断天数。\n");     int month;     scanf("%d",&month);     switch(month)    /* drop ;*/     {     case 1:         printf("1月有31天\n");         break;      case 2:         printf("2月有28天，\n");         break;      case 3:         printf("3月有31天，\n");         break;      default:         printf("当前程序只判断1-3月的情况。\n");         break;    /* use break replace return */     }          return 0; } 两处错误，一处是switch后面多一个分号;，一处是case1，需要加分号，否则只能认为是一个未定义的变量； 还有一处注意点时，main函数要求返回值。原文中前面几处case都没有return值。 上面这位兄弟是正解。

user: user-5
content: 楼主好好学习下c语音的case用法
user-0 提问: 字符串查找

回复:
user: user-1
content: 只能循环比较了

user: user-2
content: #include <stdio.h>  int main(void) {     int i, size;     char  * paraName[] ={"One","csdn","test"}, str[32];      scanf("%s", str);     size = sizeof(paraName) / sizeof(paraName[0]);     for (i = 0; i < size; i++ )         if (0 == strcmp(paraName[i], str))             break;      if (i < size)         printf("pos = %d\n", i);     else         printf("Not found!\n"); } 遍历加比较

user: user-3
content: char  * paraName[] ={"One","csdn","test"};  int findstr(const char* test){     for(int i = 0; i < sizeof(paraName)/sizeof(char*); ++ i){         if(strcmp(paraName[i],test) == 0)             return i;     }     return -1; }
user-0 提问: 求助一个计算问题？

回复:
user: user-0
content: 引用 3 楼 qq_38204686 的回复:[quote=引用 2 楼 qq_38204686 的回复:] 百度 long double 的输出格式 你格式正确呀 我用你的代码可以正确输出  我的编译器是vs2008 是不是你编译器不支持啊 [/quote] 非常感谢，确实是编译器的问题，我用vs2010可以正常输出！

user: user-1
content: #include <stdio.h> int main(void) {     double jl = 0l;                   //创建距离变量,单位英寸      const double yc = 12;                        //1英寸=12英尺,换算数  const double m = 3;                      //1码=3英尺,换算数      double yc1 = 0l;             //英尺      double mb = 0l;                 //码  printf("请输入一个距离单位为(英寸):");  scanf("%lf",&jl); yc1 = jl/yc;//英寸转换英尺  mb = yc1/m;//英尺转换码  printf("输入的距离为%lf(英寸)\n",jl); printf("转换为英尺为%lf(英尺)\n",yc1); printf("转换为码为%lf(码)\n",mb); return 0; }

user: user-2
content: 试试llf           。

user: user-3
content: 引用 2 楼 qq_38204686 的回复:百度 long double 的输出格式 你格式正确呀 我用你的代码可以正确输出  我的编译器是vs2008 是不是你编译器不支持啊

user: user-4
content: 你的类型不对，int/double 这在计算是会出现问题的

user: user-1
content: 这样就对了。

user: user-3
content: 百度 long double 的输出格式

user: user-0
content: #include <stdio.h> int main(void) { 	long double jl = 0l;                   //创建距离变量,单位英寸      const int yc = 12;                        //1英寸=12英尺,换算数  	const int m = 3;                      //1码=3英尺,换算数  	long double yc1 = 0l;             //英尺      long double mb = 0l;                 //码  	printf("请输入一个距离单位为(英寸):");  	scanf("%lf",&jl); 	yc1 = jl/yc;//英寸转换英尺  	mb = yc1/m;//英尺转换码  	printf("输入的距离为%lf(英寸)\n",jl); 	printf("转换为英尺为%lf(英尺)\n",yc1); 	printf("转换为码为%lf(码)\n",mb); 	return 0; }  重发一下，前面一个注释挤一块去了。
user-0 提问: 线性表

回复:
user: user-0
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 也有故意加分号的宏。 楼主这个地方加上就是”故意“给自己挖坑了。[/quote]  我自己好长时间不用了，所以忘记了，谢谢各位的指点

user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:也有故意加分号的宏。 楼主这个地方加上就是”故意“给自己挖坑了。

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:也有故意加分号的宏。 加了分号，到时候会忘记。

user: user-3
content: 也有故意加分号的宏。

user: user-0
content: 感谢提醒，自己粗心大意疏忽了，好长时间不用宏定义忘记了不加分号~~~

user: user-1
content: #define 定义去掉后面的分号 宏定义是在预处理阶段等价替换，所以不能有分号
user-0 提问: 进程窗口状态如何获取和改变！！

回复:
user: user-1
content: 搜“Session0 穿透”

user: user-0
content: 我看了一下这个Session0 穿透，这个主要实现服务用语桌面用户的交互，我查看了我服务进程和业务进程都是在Session0 不存在Session 0 隔离，这是一点。还有就是我这边的问题主要是我业务进程是隐藏的，这是必须的，但是飞天诚信的PIN输入框却又依赖我的进程窗口状态（这个PIN码输入框是Key自带的）。所以我想问一下是否可以更改进程窗口状态来让PIN输入框显示出来，或者是不是有其他的方式来达到我的目的
user-0 提问: 寻求前辈帮忙看看代码的问题

回复:
user: user-0
content: 现在版本的我控制了代码量，不是电脑的问题，我觉得代码是有问题的 引用 2 楼 user-1 的回复:我的电脑上不卡，暗影精灵2

user: user-1
content: 我的电脑上不卡，暗影精灵2

user: user-0
content: 代码不是很长，不用全部看完，我只需要一个解决办法就是了、
user-0 提问: 新手请教，谢谢

回复:
user: user-0
content: 引用 2 楼 niu91 的回复:承接二楼，用dependency walker 看一看是不是缺少了什么库  我刚才下载了dependency walker，打开exe，它显示是个16位DOS模块，所以在windows下无法运行。 卸载了之前的turbo2.0，安装了3.0。exe能在windows下执行了。  谢谢答复

user: user-1
content: DosBox下运行应该毫无压力吧。

user: user-2
content: TC（Turbo C）老代码（比如小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。  楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-3
content: exe可能依赖其他库  exe不是所有系统都能用  新版系统也不是向下完全兼容 比如你在win7直接跑一个16位exe就不行

user: user-4
content: 应该是系统缺少程序exe运行时调用的动态库。一般都是一些函数接口，或变量类型定义等等

user: user-5
content: 承接二楼，用dependency walker 看一看是不是缺少了什么库

user: user-6
content: turbo C是一个集成开发环境，很多依赖库等都做好了。 移植到其他平台，你要确认这个EXE程序所依赖的东西在新平台是否都具备，都链接了。
user-0 提问: 哪位大佬能给我解释下这三个的结果为什么不同谢谢啦

回复:
user: user-1
content: 楼主的问题太长了，省略的怎么看，不过楼主的代码也够奇葩

user: user-2
content: double x= 5.16894,y; 1.	printf("%f\n",(int)(x*1000+0.5)/1000);   (int)(x*1000+0.5) =  5169    ;5169  /1000 = 5;    ;5以浮点数输出，因为浮点数和int 的存储结构不一样，以浮点数输出会出错。所以输出0。 即使你printf("%f\n",5);  也是0； ------------------------------------------------------------------------------------------- 2.	printf("%f\n",y=5169/1000);   5169/1000 = 5  ； 又因为5转double类型的y 所以输出  5.000000 ------------------------------------------------------------------------------------------- 3.	printf("%f\n",y=(int)(x*1000+0.5)/(double)1000); (int)(x*1000+0.5) = 5169 ；5169 /1000.000000 = 5.169000

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-4
content: 粘代码不比截图方便吗？

user: user-4
content: 这么奇葩的代码恐怕只有考试题里才有，工程上谁要是写出这样的代码恐怕饭碗不保了。 1. %f 打印 int 值，参考http://www.cnblogs.com/zhaoyl/archive/2012/04/21/2462409.html 2. int 和 int 除法，结果应是 int 值 5，然后赋值给 y，进行了 int 到 double 的类型转换，成了 float 的 5 3. 强行转换的 int 和 double 除法，运算前 int 会扩展为 double，结果是 double的

user: user-5
content: 对于double类型的数据，还建议使用%lf输出。 浮点数在内存中存放的格式与int整型等不一样，建议研究一下浮点数在内存中存放知识。  网上的博客讲解还比较多的 http://blog.csdn.net/richerg85/article/details/20456969
user-0 提问: C99 复数定义问题

回复:
user: user-1
content: 在vs中查看complex.h的头文件，只有_Dcomplex，_Fcomplex，_Lcomplex类型，没有 double _Complex，所以编译出错。

user: user-2
content: VS主要是针对C++的，可能不支持c99的_Complex关键字，此处明显是被当变量名了，然后a未定义。
user-0 提问: lighttpd配置fastcgi出现Internal Server Error

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜相关关键字。 赵老师您这。 我就是从百度进的csdn的

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=astcgi放到lighttpd下面运行%2C然后出现“500%20-%20Internal%20Server%20Error”

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=astcgi放到lighttpd下面运行%2C然后出现“500%20-%20Internal%20Server%20Error”  郁闷了，又好了。 代码什么都没动 500 - Internal Server Error 这个错误一般是服务器的代码有问题

user: user-1
content: https://www.baidu.com/s?wd=astcgi放到lighttpd下面运行%2C然后出现“500%20-%20Internal%20Server%20Error”

user: user-1
content: 百度搜相关关键字。
user-0 提问: 最近关于虚拟内存的理解

回复:
user: user-1
content: 虚拟内存与电脑位数有关吗，比如说我给电脑安装一个32位的操作系统和64位的操作系统。我看过一个帖子好像是有关的。

user: user-2
content: 1),什么都有可能，可能是硬盘可能是内存中的虚拟硬盘，也可能是网络存储 2）不对，要看你的程序用了多大，也就是说，可以用和用到了是不一样的。

user: user-3
content: 我是来看看能不能学点的。 我觉得你说的系统虚拟内存大致是那个意思。 但你说的进程的4G虚拟内存空间我没看明白。

user: user-0
content: 引用 1 楼 user-6 的回复:我猜全错，楼下解释。你这一刀捅得不轻，哈哈

user: user-4
content: http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/data/06-VirtualMachineArchitecture.pdf 《深入解析Windows操作系统-Windows Internals》

user: user-5
content: 不懂不懂。来学习学习。求大牛。。。。。

user: user-6
content: 我猜全错，楼下解释。
user-0 提问: C语言bit赋值

回复:
user: user-1
content: 用0x3&数就是两位。

user: user-2
content: &    |   操作可以提出你想要的任何一位上的值。

user: user-3
content: 传递 int a = 3; // 二进制11 解码 int a1 = a & 0x10; // 取高位 int a2 = a & 0x01;// 取低位

user: user-4
content: 如果你是用VS2015,可以这样 int a = 0b11;

user: user-5
content: #include <stdio.h>  struct num {     unsigned int a:2; }; int main(void) {      struct num n;     n.a = 3;      printf("%x\n", n.a);     return 0; } 试试类似这样的。

user: user-6
content: 仅供参考：#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des); 	r =	READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3

user: user-7
content: 你可以传一个字节呀，然后取出你要的两位就好了呀。比如你想取出低两位，可以这样(0x67 & 0x03)
user-0 提问: MISRA C标准问题

回复:
user: user-0
content: int *p = (int *)data1;这样的定义方式感觉不对吧？ 我在程序中定义int *p = (int *)&data1;这样定义，规则10.1没有报错了，但是10.3规则报错，不知道怎么回事！

user: user-1
content: 引用 2 楼 u010188136 的回复:int *p = &data1;是这个地方赋值提示规则10.1是错误的，请问该怎样修改啊？ int *p = (int *)data1; 这样修改吗？

user: user-0
content: int *p = &data1;是这个地方赋值提示规则10.1是错误的，请问该怎样修改啊？

user: user-1
content: 0x43是无符号整型，转到了有符号的data1?
user-0 提问: 还是有几个小问题

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

user: user-0
content: 而且还有在一个程序里面看到a[i]--是什么意思

user: user-0
content: 这个程序除100取余数原理不太懂啊

user: user-0
content: 要获得一个C语言程序的运行时间，常用的方法是调用头文件time.h，其中提供了clock()函数，可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick，即“时钟打点”。同时还有一个常数CLK_TCK，给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数f的运行时间，我们只要在调用f之前先调用clock()，获得一个时钟打点数C1；在f执行完成后再调用clock()，获得另一个时钟打点数C2；两次获得的时钟打点数之差(C2-C1)就是f运行所消耗的时钟打点数，再除以常数CLK_TCK，就得到了以秒为单位的运行时间。  这里不妨简单假设常数CLK_TCK为100。现给定被测函数前后两次获得的时钟打点数，请你给出被测函数运行的时间。

user: user-0
content: 就是说a【4】里面是5  运行完以后a【4】里面的值减1变成 a【4】=4了是么   其实代码里面都懂  就是那个为啥可以代表四舍五入的概念不懂什么原理   可能就是一句话我就明白了

user: user-2
content: 引用 3 楼 zxczxc233 的回复:而且还有在一个程序里面看到a[i]--是什么意思 这个是指数组啊a的第i个元素（从0开始算）的值自减1

user: user-2
content: 引用 2 楼 zxczxc233 的回复:这个程序除100取余数原理不太懂啊 相差值超过50（包括等于）就认为是一秒钟。就是四舍五入，差值小于50，就舍去。
user-0 提问: 新手使用Visual studio 2015

回复:
user: user-0
content: @自信男孩  因为感兴趣才学习的，那个Linux下编程是怎么弄？？我的系统是win10.

user: user-1
content: 如果感兴趣可以Linux下编程，不用考虑那么多按钮如何使用。

user: user-1
content: 引用 3 楼 for_grasp 的回复:@自信男孩  因为感兴趣才学习的，那个Linux下编程是怎么弄？？我的系统是win10. 你需要装个Linux系统了，Ubuntu系统就可以。先了解一下吧

user: user-2
content: VS2015动态库编程基础篇资源汇总（文档+视频） http://blog.csdn.net/hou09tian/article/details/77046442 VS2015动态库编程提高篇之远程注入资源汇总（文档+视频） http://blog.csdn.net/hou09tian/article/details/77046459
user-0 提问: 素数距离问题，程序放到ACM上运行超时，该怎么优化，请指教

回复:
user: user-1
content: 程序要求依次输入，然后一次性输出结果，s要在while循环开始归0，不然有可能输出上次的s值，如果有个数据是1，不会进入for循环，是不是直接返回true

user: user-2
content: 1w个492113你看看你要算多久

user: user-3
content: 最无赖的方法，用筛法建表，并事先运行出结果，将结果贴到程序里面，然后再查表，应该没有更快的方法了。 正常的方法是在程序中用筛法建表，后面的方法同上。

user: user-4
content: 先用筛法求素数方法，把1到1000000之间的所有素数都放入到一个数组A中。根据输入的数对数组A进行二分法查找，如果查找成功，说明这个数就是素数。如果查找失败，假设最后一次查找失败时的数组下标值为index；那么最近的素数一定是A[index-1]，A[index]，A[index+1]三个数之中的一个

user: user-5
content: /*************************************************************************   > File Name: prime.c   > Author: cfjtaishan   > Mail: cfj20080302@163.com    > Created Time: 2017年08月23日 星期三 21时35分59秒  ************************************************************************/  #include <stdio.h> #include <stdbool.h> #include <math.h>  bool issushu(int M); void nearest_sushu(int *p,int *q);  int main() {  	int N,M,s=0; 	scanf("%d",&N); 	while(N--) 	{  		scanf("%d",&M); 		if(issushu(M)) { 			printf("%d %d\n", M, s); 		} else { 			nearest_sushu(&M,&s); 			printf("%d %d\n",M,s); 		} 	}  	return 0; }  bool issushu(int M) {  	int a = sqrt(M); 	for(int i = 2; i <= a; ++i) 	{  		if(M % i != 0)  			continue; 		else 			return false; 			//break;   /* not perform */ 	} 	return true; }  void nearest_sushu(int *p,int *q) {  	int a = *p; 	int b = *p; 	int c = *p; 	int x,y;  	while(!issushu(--a)) 		; 	x = c - a; 	while(!issushu(++b)) 		; 	y = b - c; 	if(x <= y) 	{  		*p = a; 		*q = x; 	} 	else 	{  		*p = b; 		*q = y; 	} }  优化了一下你的判断素数的逻辑，调用了库函数sqrt，求平方，编译的时候加上-lm，即数学函数库。 相比M/2，效率提高差不多多个数量级 比如输入10001，用你的M/2，那么需要循环差不多500次，而使用sqrt(M);循环次数就是100次
user-0 提问: windows平台下，GCC在编译时，源文件的编码问题，以及如何处理，详细见贴内。

回复:
user: user-1
content: 楼主使用的是vscode的话，那么可以考虑一下向工作区的设置中添加一项： "files.encoding": "gb2312"（当然这个编码看你喜好了，但是得和gcc使用的编码一致哦）   这样在工作区内读取和编写文件时都会使用的你设置的字符集编码啦

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  恩恩！谢谢！

user: user-0
content: 引用 1 楼 adlay 的回复:用 -finput-charset= 指定输入文件的编码  输出到控制台乱码的问题你得看控制台使用的什么编码, 不光是程序这边  嗯嗯，我在vscode中使用的是UTF - 8，在控制台中将编码更改为 chcp 65001 之后，输出不再乱码。  谢谢提示！

user: user-0
content: 引用 2 楼 trytry1992 的回复:ANSI编码的文件里的中文到底是什么编码  实际编码为： GB2312  这个应该是区域向的。

user: user-2
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-3
content: ANSI编码的文件里的中文到底是什么编码

user: user-4
content: 用 -finput-charset= 指定输入文件的编码  输出到控制台乱码的问题你得看控制台使用的什么编码, 不光是程序这边
user-0 提问: 关于链表问题

回复:
user: user-1
content: nodes[i]是一个4字节的int ,引用而已。类型跟这个地址指向的struct有关系

user: user-2
content: nodes是结构体的二重指针，你可以把notes看成一个表，第一申请的是行（申请了N个结构体指针），后面的循环是申请的列（结构体）。 nodes[i]是struct note*类型 你的这个程序不是链表操作，这个程序还是数组的使用。和栈上申请的数组不同，这个程序里的空间是在堆上申请的空间。 struct node {     int data;     struct node *next; };  链表节点应该类似这样的定义

user: user-3
content: 为Node *nodes 分配N个空间等价于 Node nodes[N] 那么 nodes[i]是什么类型，是struct note* 是指向结构体的指针，如果要操作nodes[i]的成员，就要为其分配空间，或者指向现有的结构体
user-0 提问: 关于C语言调用函数出现的问题

回复:
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: 单词拼写错误，这个需要细心些哦

user: user-3
content: 楼上说的对，int mian ()改成int main ()就好了。

user: user-4
content: 是 main  不是 mian
user-0 提问: 数组名作函数参数

回复:
user: user-1
content: void func(int* array){ // anything you want to do! }

user: user-2
content: 数组名作为参数没问题的，主要是排序逻辑有点问题。

user: user-2
content: #include<stdio.h>  int main() {     void sort(int array[], int n);     int i, a[10];     printf("Please enter ten numbers:\n");     for (i = 0; i < 10; i++)         scanf_s("%d", a + i);     printf("The numbers you enter are:\n");     for (i = 0; i < 10; i++)         printf("%d ", a[i]);     printf("\n");//输入10个数，并输出展示     sort(a, 10);     printf("The sorted array:\n");     for (i = 0; i < 10; i++)         printf("%d ", a[i]);     return 0; }  void sort(int array[], int n) {     int i, j, k, t = 0;     for (i = 0; i < n - 1; i++)     {         k = i;         for (j = i + 1; j < n; j++)             if (array[j] < array[k])                 k = j;         if (k != i) {   /* here shold check if k is equal i */             t = array[k];             array[k] = array[i];             array[i] = t;         }     } }  void sort2(int array[], int n) {     int i, j, t=0;     for (i = 0; i < n - 1; i++)     {         for (j = i + 1; j < n; j++)             if (array[j] < array[i]) {   /* here shold be block */                 t = array[j];                 array[j] = array[i];                 array[i] = t;             }     } } 两个排序（选择，冒泡）都有少许问题，注意加大括号，交换数据是一个整体，不能分开。 选择排序里，交换数据有一个前提，那就是k != i
user-0 提问: 数据段，BSS段

回复:
user: user-1
content: 静态变量、全局变量都在全局区，只是作用域不同而已。 字面常量在常量区。

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:BSS段（bss segment）通常是指用来存放程序中未初始化或初始化为0的全局变量或静态变量的一块内存区域。 数据段（data segment）通常是指用来存放程序中已初始化且不为0的全局变量或静态变量的一块内存区域 未初始化的全局变量或静态变量放在BSS段, 被初始化为 0，不占用磁盘空间，加载到内存后才分配空间。 字符串常量存放在只读数据段（数据段分为只读数据段和数据段） 局部变量不论是否初始化均在栈上申请。  谢谢

user: user-2
content: 引用 3 楼 cfjtaishan 的回复:BSS段（bss segment）通常是指用来存放程序中未初始化或初始化为0的全局变量或静态变量的一块内存区域。 数据段（data segment）通常是指用来存放程序中已初始化且不为0的全局变量或静态变量的一块内存区域 未初始化的全局变量或静态变量放在BSS段, 被初始化为 0，不占用磁盘空间，加载到内存后才分配空间。 字符串常量存放在只读数据段（数据段分为只读数据段和数据段） 局部变量不论是否初始化均在栈上申请。 以上内存划分都是Linux系统上内存的划分，Windows下会有少许区别。

user: user-2
content: BSS段（bss segment）通常是指用来存放程序中未初始化或初始化为0的全局变量或静态变量的一块内存区域。 数据段（data segment）通常是指用来存放程序中已初始化且不为0的全局变量或静态变量的一块内存区域 未初始化的全局变量或静态变量放在BSS段, 被初始化为 0，不占用磁盘空间，加载到内存后才分配空间。 字符串常量存放在只读数据段（数据段分为只读数据段和数据段） 局部变量不论是否初始化均在栈上申请。

user: user-3
content: 理解和讨论之前请先学会如何观察！  学会使用dumpbin、PEBrowser Professional、VMMap、……
user-0 提问: C语言怎么让一个函数一直执行而不影响另外的函数？

回复:
user: user-1
content: 搜“GDI泄露检测”

user: user-2
content: 多线程或者多进程可以实现你的这个要求； 如果是在Linux下写这个功能，可以查一下pthread_create, pthread_join等的使用

user: user-3
content: 引用 4 楼 wyl915的回复:[quote=引用 3 楼 qq_38204686 的回复:] 开个线程  没学过线程这个东西，不知道怎么开啊![/quote] 百度有不少资料 学习学习

user: user-0
content: 引用 3 楼 qq_38204686 的回复:开个线程  没学过线程这个东西，不知道怎么开啊!

user: user-3
content: 开个线程

user: user-0
content: 引用 1 楼 user-4 的回复:估计有 内存/GDI 泄漏， 卡死后任务管理器 查看 GDI句柄数，内存使用量   句柄数数保持在 266左右，内存占用在5900到7100之间，但是一到开始游戏，飞机发射子弹cpu占用就达到了24%

user: user-4
content: 估计有 内存/GDI 泄漏， 卡死后任务管理器 查看 GDI句柄数，内存使用量
user-0 提问: free函数释放内存时产生断点

回复:
user: user-0
content: 引用 2 楼 user-3的回复: pt[i] = (char *)malloc((strlen(temp) + 1) * sizeof(char)); 你忘了给 '\0' 分配空间了 嗯嗯，＋1后就解决了，谢谢

user: user-0
content: 引用 4 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include<string.h>  int main(void) {     char **pt=NULL;     char temp[41];     int i, num;      printf("How many words do you wish to enter?");     scanf("%d", &num);     pt = (char **)malloc(num * sizeof(char *));     printf("Enter %d words now:\n", num);     for (i = 0; i < num; i++)     {         scanf("%s", temp);         pt[i] = (char *)malloc(strlen(temp) + 1); /* add one byte for '\0' */         strcpy(pt[i], temp);     }     puts("Here are your words:");     for (i = 0; i < num; i++)     {         puts(pt[i]);         free(pt[i]);     }      free(pt);      return 0; } 申请的空间缺少一个'\0'，会导致越界； 所以你的断电应该是因为没有找到'\0'而出现的。 +1后就解决了，谢谢

user: user-1
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 qq_38204686 的回复:] 你只要最后free一次就可以了 怎么在循环了释放 楼主是循环malloc的，自然要循环释放了。 [/quote] 啊  我的锅

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  int main(void) {     char **pt=NULL;     char temp[41];     int i, num;      printf("How many words do you wish to enter?");     scanf("%d", &num);     pt = (char **)malloc(num * sizeof(char *));     printf("Enter %d words now:\n", num);     for (i = 0; i < num; i++)     {         scanf("%s", temp);         pt[i] = (char *)malloc(strlen(temp) + 1); /* add one byte for '\0' */         strcpy(pt[i], temp);     }     puts("Here are your words:");     for (i = 0; i < num; i++)     {         puts(pt[i]);         free(pt[i]);     }      free(pt);      return 0; } 申请的空间缺少一个'\0'，会导致越界； 所以你的断电应该是因为没有找到'\0'而出现的。

user: user-2
content: 引用 1 楼 qq_38204686 的回复:你只要最后free一次就可以了 怎么在循环了释放 楼主是循环malloc的，自然要循环释放了。

user: user-3
content: pt[i] = (char *)malloc((strlen(temp) + 1) * sizeof(char)); 你忘了给 '\0' 分配空间了

user: user-1
content: 你只要最后free一次就可以了 怎么在循环了释放
user-0 提问: 运用栈解决“ACM括号配对”的问题，程序一直调试不对，请教大神

回复:
user: user-1
content: 应该是你代码不适应所有情况导致的吧，检查一下自己代码，看看有没有什么特殊情况不通过

user: user-0
content: 引用 5 楼 kugeniha 的回复:先输入右括号会越界吧p[-1] 谢谢，改过来程序可以在VC上正确运行了，但是放到ACM上显示RuntimeError，运行时间过长了？还是怎么回事，经常是在VC上可以运行，在ACM上就没法通过

user: user-1
content: 先输入右括号会越界吧p[-1]

user: user-1
content: 第二个case少个break;还有逻辑错误，比如输入（（（（

user: user-0
content: 改到1000还是不行，提交到ACM上显示 “运行时出错”，自己在VC上编译不显示错误和警告，也能运行，但是输入正确答案也是输出No,

user: user-2
content: 字符串长度小于1000，你定义的char a[100]提交后肯定会出现内存溢出的。

user: user-3
content: 仅供参考：#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }
user-0 提问: 运用栈解决“ACM括号配对”的问题，程序编号老是调试不对，一直输出No

回复:
user: user-1
content: 仅供参考：#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }
user-0 提问: 指针与内存

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

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  是改为这样吗？但编译时提示错误“左直指定const对象”。这里s1应该才是常量吧，因为前面有加const. #include <stdio.h> #include"stdlib.h" #pragma comment(linker,"/SECTION:.rdata,RW") main() {     const char *s1="iya";     s1[1]='o';                  printf("%s",s1);       system("pause"); } 如果改为这样：加不加这行#pragma comment(linker,"/SECTION:.rdata,RW")都可以，这里s1应该是变量吧，因为前面没加const. #include <stdio.h> #include"stdlib.h" #pragma comment(linker,"/SECTION:.rdata,RW") main() {     char *s1="iya";     s1[1]='o';                printf("%s",s1);       system("pause"); } 在本版题目中的代码不算是修改字符串常量的值只是修改了字符串变量指针的地址而已吧？（因为题目中s1,s2前面没有加const）.

user: user-2
content: s2和&s2[0]的地址值是一样的。 s2在执行完循环已经不指向字符串"abc"了，从你的for循环已经验证了。 s1 = s2；这句已经说明，因为s1 = s2是s1和s2指向相同区域，因为它是将s2的地址值赋值给s1，所以它们指向相同区域； 所以，经过循环之后，s2已经不指向字符串"abc". 这不叫修改字符常量的值，只是修改了指针变量的值（指针变量里存放的时地址值），字符串常量没变化。

user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！
user-0 提问: 为什么要用指向结构体的二重指针

回复:
user: user-1
content: //仅交换两个结构体的内容  (两个指针本身未变化, 只内容变化了) void swap(STU *p1,STU *p2) {     STU temp = *p1;     *p1 = *p2;     *p2 = temp; }  //交换指针本身(因为指针本身变化了,其指向的内容肯定也跟着变化了) void swap2(STU **p1,STU **p2) {     STU *temp = *p1;     *p1 = *p2;     *p2 = temp; }

user: user-0
content: 引用 11 楼 xiaohuh421 的回复:如果你仅是想交换两个结构体的内容, 而不是指针本身, 那么不需要二重指针. 你果你要交换两个指针本身的值, 那么肯定就需要用二重指针了.能写一下具体的函数吗？交换两个结构体的内容和交换指针本身有什么不同吗

user: user-1
content: 如果你仅是想交换两个结构体的内容, 而不是指针本身, 那么不需要二重指针. 你果你要交换两个指针本身的值, 那么肯定就需要用二重指针了.

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: swap有问题，二重指针是指针的指针。

user: user-4
content: 首先，你的swap函数里交换连个指针内容有问题，p1 = p2;这样时p1指向了p2指向的内存区域，但是p2并没有指向p1指向的内存区域；  其次，使用二重指针，这样能保证参数p1, p2是传出参数，即是通过swap交换之后能够得到新的内存区域（交换之后的）

user: user-4
content: 引用 9 楼 zihui0459 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 首先，你的swap函数里交换连个指针内容有问题，p1 = p2;这样时p1指向了p2指向的内存区域，但是p2并没有指向p1指向的内存区域；  其次，使用二重指针，这样能保证参数p1, p2是传出参数，即是通过swap交换之后能够得到新的内存区域（交换之后的）是因为值传递的原因吗？二重指针可以改变链表实参指针的指向吗？[/quote] 对，建议在草稿纸画画指针指向

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:首先，你的swap函数里交换连个指针内容有问题，p1 = p2;这样时p1指向了p2指向的内存区域，但是p2并没有指向p1指向的内存区域；  其次，使用二重指针，这样能保证参数p1, p2是传出参数，即是通过swap交换之后能够得到新的内存区域（交换之后的）是因为值传递的原因吗？二重指针可以改变链表实参指针的指向吗？

user: user-0
content: 引用 4 楼 sinat_39459036 的回复:void swap(STU *p1,STU *p2) { 	STU tmp; 	//tmp = malloc(4); 	tmp = *p1; 	*p1 = *p2; 	*p2 = tmp;  	//free(tmp); 	return ; }  void swap2(STU **p1,STU **p2) { 	STU **tmp; 	tmp = malloc(4); 	*tmp = *p1; 	*p1 = *p2; 	*p2 = *tmp;  	free(tmp); 	return ; }试了一下好像换不了啊？ int main() { 	struct student *p1,*p2; 	p1=p2=(struct student*)malloc(sizeof(struct student)); 	scanf("%d %d",&(*p1).num,&(*p1).score); 	scanf("%d %d",&(*p2).num,&(*p2).score); 	swap(p1,p2); 	printf("第一位学生成绩%d %d",(*p1).num,(*p1).score); 	printf("第二位学生成绩%d %d",(*p2).num,(*p2).score); }不知道是不是我这主函数参数传的不对呢？

user: user-0
content: 引用 5 楼 xiaohuh421 的回复:swap（struct student *p1,struct student *p2）//这个函数用来完成两个指针的互换。 { p1=p2; }  你确定这个能交换....  指针本身是值传递的,  除非你在内部交换它们的值   *p1 = *p2这种类似的取地址操作,  才是地址传递, 可修改值.  如果你这样写能交换, 只能说明你用的编译器有问题, 不符合标准.不小心写错了。。。我想问下这个必须要在swap函数的形参用二重指针才能完成互换吗？原理和swap（int a，int  b）这个换不了是一个道理吗？

user: user-5
content: 不用二级指针不能互换吧

user: user-1
content: swap（struct student *p1,struct student *p2）//这个函数用来完成两个指针的互换。 { p1=p2; }  你确定这个能交换....  指针本身是值传递的,  除非你在内部交换它们的值   *p1 = *p2这种类似的取地址操作,  才是地址传递, 可修改值.  如果你这样写能交换, 只能说明你用的编译器有问题, 不符合标准.

user: user-6
content: void swap(STU *p1,STU *p2) { 	STU tmp; 	//tmp = malloc(4); 	tmp = *p1; 	*p1 = *p2; 	*p2 = tmp;  	//free(tmp); 	return ; }  void swap2(STU **p1,STU **p2) { 	STU **tmp; 	tmp = malloc(4); 	*tmp = *p1; 	*p1 = *p2; 	*p2 = *tmp;  	free(tmp); 	return ; }
user-0 提问: 一个类似字典查询的程序，到最后无法输入是否继续字符。

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

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> int main() {     char word[80],**p,ch;     char *name[]={"liuxiaoyang","shihaoren","jixiaofei","shihuaidan","yang","shuaige","fei","huaidan",NULL};     do     {         printf("please enter words: ");         scanf("%s", word);         p = name;         do         {             if(!strcmp(*p, word))             {                 puts("the meaning of the word is: ");                 puts(*(p+1));                 break;             }             if(strcmp(*p,word)!=0)                 p = p + 2;         }while((*p)!=NULL);         if((*p)==NULL)         {             printf("%s","the word is not in the dictioary");             printf("\n");         }          printf("enter y/n:");         getchar();    /*接收上面残留的输入缓冲区的回车符*/         scanf("%c", &ch);//该句无法执行     }while(toupper(ch)!='N');      system("pause");     return 0; }  在scanf("%c", &ch);上面加一句getchar();代码即可。详见上面的代码；  另外，注意你的逻辑可能会出现越界访问，导致段错误；              if(strcmp(*p,word)!=0)                 p = p + 2; 输入的word一直不和*p相同，则p会一直向后偏移。
user-0 提问: STC12c5a+sim900a通信问题

回复:
user: user-1
content: 两个串口就有两个不同的port口，你对不同的port口进行不同的操作不就好了嘛。比如说串口2接收到数据了，此时需要向串口1发送数据，你就触发一个事件来向串口发送数据好了。

user: user-2
content: 百度搜相关关键字。
user-0 提问: x86系统下，输出的值为多少？

回复:
user: user-1
content: int *ptr1 = (int*)(&a+1); 因为对a再取地址加1，所以&a+1相当于&a看成一个整体，对其加1就是加了5对应的地址，即ptr1对应的是a[5]所对应的地址。所以ptr1[-1]是5.  int *ptr2 = (int*)((int)a+1);：内存中对应的数据是：00 00 00 02 00 00 00 01 ，a指向01的地址，然后给(int)a+1得到的地址是01前面的00的地址，00 00 00 02 00 00 00 01 ，所以打印的ptr2对应的值是2000000。 http://blog.csdn.net/wyyy2088511/article/details/77337301

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: 以下是输出  首先，数组a的地址是0x00affcc4，而 int *ptr1 = (int*)(&a + 1); 所以ptr1的内容应该是a的地址加上1个“单位”，这里的“单位”指的是数组a整个的大小 （为什么1个“单位”是数组a整个的大小，请参考http://blog.csdn.net/hou09tian/article/details/75332577） 所以ptr1的值是0x00affcc4+4*5（5个int，每个int的4个字节）=0x00affcd8 对于ptr2 int *ptr2 = (int*)((int)a + 1); 此时将a看成是一个普通的int，所以ptr2的值是0x00affcc4+1=0x00affcc5 对于输出 printf("%x ,%x", ptr1[-1], *ptr2); ptr1[-1]表示向“前”移动1个“单位”，因为ptr1的类型是int的指针；所以这里的1个“单位”值得是1个int的大小，即4个字节 所以，ptr1[-1]实际上指的是0x00affcd8-4=0x00affcd4  相当于输出的数组a的第5个元素。 而对于*ptr2，因为其值是0x00affcc5，可以看下图  所以，输出的是20000000

user: user-4
content: 一个老考题，主要是强转地址可能会有很多问题

user: user-0
content: 引用 4楼自信男孩 的回复:#include <stdio.h>  int main() {     int a[5] ={1,2,3,4,5};     int *ptr1 = (int*)(&a+1);     int *ptr2 = (int*)((int)a+1);      printf("%p \n", a);     printf("%p , %p, %p\n", ptr1, ptr1-1, ptr2);     printf("%d\n", ptr1[-1]);     //printf("%x ,%x", ptr1[-1],*ptr2);     return 0; } 注意ptr[-1]能够得到值是5，但是ptr2就不能了，通过打印ptr2指向的内存地址就可以发现，它的地址和a的地址就相差很大。主要是因为(int)a + 1已经改变了a的地址，地址是unsigned int类型，强转int类型就改变了它的值。嗯。我搞懂了

user: user-0
content: 引用 3楼das白 的回复:5,2 第一个偏移了一个数组 减一是最后一个数字5 第二个偏移了一个int     即2 感觉就是这样 但是我的编译器输出的是 5,2000000 后面的0是什么鬼证明你还没到那水平

user: user-0
content: 引用 2楼user-7 的回复:x86系统就是32位的。你这代码里错误一大堆，你自己没调试？是你自己看不懂，没错的。自己去看c语言深度剖析

user: user-5
content: #include <stdio.h>  int main() {     int a[5] ={1,2,3,4,5};     int *ptr1 = (int*)(&a+1);     int *ptr2 = (int*)((int)a+1);      printf("%p \n", a);     printf("%p , %p, %p\n", ptr1, ptr1-1, ptr2);     printf("%d\n", ptr1[-1]);     //printf("%x ,%x", ptr1[-1],*ptr2);     return 0; } 注意ptr[-1]能够得到值是5，但是ptr2就不能了，通过打印ptr2指向的内存地址就可以发现，它的地址和a的地址就相差很大。主要是因为(int)a + 1已经改变了a的地址，地址是unsigned int类型，强转int类型就改变了它的值。

user: user-6
content: 5,2 第一个偏移了一个数组 减一是最后一个数字5 第二个偏移了一个int     即2 感觉就是这样 但是我的编译器输出的是 5,2000000 后面的0是什么鬼

user: user-7
content: x86系统就是32位的。你这代码里错误一大堆，你自己没调试？

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！
user-0 提问: 求助，关于图形化界面字符由键盘输入之后显示的问题

回复:
user: user-1
content: 图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  C++ Builder的较新版本——RAD Studio XE3以上版本添加对iOS和Android的支持工具包，让开发者编写的Delphi/C++应用可以同时在Windows、OS X、iOS和Android平台上运行。现在最新版本是RAD Studio 10.2。  仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/ C++ Builder写的《ZEC 推箱子》 http://blog.163.com/tab_98/blog/static/11924097201612011839642/  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

user: user-2
content: 跳出easyx,入门GDI

user: user-1
content: 引用 6 楼 llcdhm 的回复:[quote=引用 3 楼 u010165006 的回复:] 楼主是用EasyX图形库吗？   是的，我在做图形化界面第一个接触到[/quote]  EasyX不一定支持这样输入，可以考虑C++ Builder。

user: user-0
content: 引用 3 楼 u010165006 的回复:楼主是用EasyX图形库吗？   是的，我在做图形化界面第一个接触到

user: user-0
content: 为什么显示会是白框啊 编译是没有问题的 代码 char ch; 	char copy[50];        int i=; 	int x = 220; 	while (ch = getch() != VK_RETURN) 	{ 		outtextxy(x, 160, ch); 		*(mem[n].xuehao + i) = ch; 		x += 8; 		i++; 	}

user: user-1
content: 楼主是用EasyX图形库吗？

user: user-3
content: 楼主只贴一个图和部分代码在上面。这个没人能看得懂是哪里的问题啊！ 如果代码段不长的话，楼主不妨贴出来看看。 或者进行单步调试。
user-0 提问: scanf的问题,求助大侠

回复:
user: user-1
content: VS2015+Windows10 64位 可以用以下两种方法修改 1scanf("%ld",&num);改为scanf("%lld",&num); 2 if (!num)   break;改为if ((int)num==0)   break;

user: user-2
content: long long int 就应该用 %lld long int 用 %ld 输入的 long int 存入 long long int 位置中，num 没有占满，尽管输入0，其中还有别的东西呢