Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 老手请给点小白鼠点建议哪里错了（C语言程序）

回复:
user: user-1
content: 指针直接复制的字符串是不能做任何修改的！  用吧char *s改成char s[ ] 就可以！

user: user-0
content: 谢谢各位!!!!!!!!

user: user-2
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-0
content: 不好意思我没说清楚我就想把字符串倒置！！！

user: user-3
content: 1   #include <stdio.h>                                                                                                                                                                                          1 #include <string.h>     2          3 int main()     4 {        5     char s[] ="hello world";     6     size_t max = strlen(s) - 1;    //最后一个字符串结束标识\0     7     int min = 0; >>  8     while(max > min)     9     {    10     |   char temp = s[min];    11     |   s[min] = s[max];    12     |   s[max] = temp;    13     |   min++;    14     |   max--;    15     }    16     printf("%s\n", s);    17     return 0;    18 }

user: user-4
content: char *s="hello world"; s指向的字符串是常量，不可写，可以如下编写：      char s[]="hello world"; 另外，从题意看是将字符串逆序，因此max应该为      int max = strlen(s) - 1;

user: user-5
content: 你用char * 声明的字符串常量 是会声明在常量区中的，所以不能修改。 建议用char 数组保存一个字符串试试

user: user-6
content: 常量区的字符串一般不允许进行写操作

user: user-7
content: 用数组保存你的字符串，才能修改。char s[]="hello world";

user: user-8
content: char *s="hello world"; 这里s是指向的是常量区的字符串，修改会导致出错  之所以不用写成const char* s 完全因为历史原因下的特殊规定

user: user-9
content: 不要修改字符串字面量，这个和 1 = 2一样愚蠢
user-0 提问: c语言fget读空行，读取到的是什么？

回复:
user: user-0
content: 引用 4 楼 lqbk1 的回复:虽然说上这里问能得到正确答案…… 但答案远没有楼主自己敲代码测试一下来得快.... 嗯哪 编了个小程序，最后发现读取空行得到的第一个字符是‘\r’

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仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 如果读的是空行，那么返回的字符串是"\n"，fgets会把回车符读到缓存里（在Linux下读到是"\n"，在window下读到应该是"\r\n"，因为两种系统下换行符不一样吧）；

user: user-3
content: 虽然说上这里问能得到正确答案…… 但答案远没有楼主自己敲代码测试一下来得快....

user: user-4
content: fgetc还是fgets？ fgets和fgetc都不会去掉换行符的，所以读空行的话，会得到"\n"。

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-1
content: C语言没有fget

user: user-5
content: 如果有那一行，只是那一行是空，读到的是 “” ,读取失败返回才是NULL  http://en.cppreference.com/w/c/io/fgets
user-0 提问: 字符串拼接函数关于'\0'的问题

回复:
user: user-1
content: 引用 2 楼 qq423399099 的回复:看楼主你的输入的长度了，fgets会读入回车符的 假如你第一次输入了one,那么string_1里面存的是one\n\0  (一共有4个字符加一个\0) 第二次输入two,那么string_2里面存的是two\n\0  (一共有4个字符加一个\0) strcat之后变成了one\ntwo\n\0 (一共8个字符加一个\0)刚好越界一个字符 +++ '\0'即0；fgets读完一行，在缓存里数据的最后两个字符即\n\0

user: user-2
content: 看楼主你的输入的长度了，fgets会读入回车符的 假如你第一次输入了one,那么string_1里面存的是one\n\0  (一共有4个字符加一个\0) 第二次输入two,那么string_2里面存的是two\n\0  (一共有4个字符加一个\0) strcat之后变成了one\ntwo\n\0 (一共8个字符加一个\0)刚好越界一个字符

user: user-0
content: 确实拼接后第一个数组是放不下的。。。
user-0 提问: s=f(h-1)+h咋来的

回复:
user: user-1
content: 建议自己手动算几步，才能熟悉递归调用方式，

user: user-2
content: 递归函数，最好的理解方式就是单步跟踪程序运行，一步步查看程序流程及变量变化情况

user: user-3
content: 递归其实就是“一个函数的自调用” 在这个“自调用”的过程中，必须要有一个变化的“参数”，当这个“参数”达到你的期望值的时候，终止该“自调用”过程
user-0 提问: linux C 错误 :segmentation fault(core dumped)

回复:
user: user-1
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-2
content: 出错时断下来，通过调用堆栈、变量窗口等观察分析原因

user: user-3
content: 36 行，head是随机值，使用head->next 就是访问了非法地址
user-0 提问: 数据结构链表和串的初始化问题

回复:
user: user-1
content: 将函数参数名起得和调用它时传的实参的变量名一样也没用。而且还造成概念混淆。

user: user-2
content: 单步调试可以发现 idxlist->item[0].bnolist 已经是NULL了，取idxlist->item[0].bnolist->next导致崩溃

user: user-3
content: Initlist(idxlist->item[ct].bnolist);这样的传参方式（一级指针）是没有用的，在Initlist函数里操作的只是一个指针的拷贝 改成传二级指针或者一级指针的引用  #include<stdio.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define MAXKEYNUM 2500 //引索表的最大容量-- #define MAXLINELEN 500 //数目串的最大长度 缓冲区长度-- #define MAXWORDNUM 10 //词表的最大容量-- #define MAXWORDLEN 100//关键词的最大容量-- typedef int Status; typedef struct{     char *ch;     int length; }Hstring; typedef struct{     char *item[MAXWORDNUM];     int last; }Wordlisttype; //词表类型  typedef int Elemtype;  typedef struct Lnode{     Elemtype data[3];     struct Lnode *next; }Lnode,*Link,*Linklist;//*号放在前边  typedef struct{     Hstring key;//关键词     Linklist bnolist;//存放书号索引的链表 }Idextermtype;//索引项类型  typedef struct {     Idextermtype item[MAXKEYNUM+1];     int last; }Idexlisttype;  Idexlisttype idxlist;  void Initidxlist(Idexlisttype *idxlist); void Init_Hstring(Hstring *wd); Status Initlist(Linklist *L); int main() {     Initidxlist(&idxlist);     return 0; } Status Initlist(Linklist *L) {     int ct;     if(!(*L = (Link)malloc(sizeof(Lnode))))         return OVERFLOW;     for(ct=0;ct<3;ct++)         if(!((*L)->data[ct] = (int)malloc(sizeof(int))))             return OVERFLOW;     (*L)->next = NULL;     return OK; }//initlist; void Init_Hstring(Hstring *wd) {     int ct;     wd->ch = (char *)malloc(MAXWORDLEN*sizeof(char));     for(ct=0;ct<MAXWORDLEN;ct++){         wd->ch[ct] = '\0';     }     wd->length = 0; } void Initidxlist(Idexlisttype *idxlist) {     int ct;     for(ct=0;ct<MAXKEYNUM;ct++){         Init_Hstring(&(idxlist->item[ct].key));         Initlist(&idxlist->item[ct].bnolist);     }     printf("????????????\n");     if(idxlist->item[0].bnolist->next==NULL)//--------------------------------这里有问题         printf("????????????\n");     idxlist->last = 0; }

user: user-1
content: printf("????????????\n");     if(idxlist.item[0].bnolist->next==NULL)         printf("????????????\n");     idxlist.last = 0;
user-0 提问: 二叉查找树的删除疑问

回复:
user: user-0
content: 好的，现在大概搞清楚了，谢谢各位

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

user: user-2
content: 因为这个是递归调用的，当最后一次调用的时候找到了需要删除的结点后，你应该返回的是替换它的结点的地址 假设它的上一级是T->Right = Delete(T->Element,T->Right);   你的Delete(T->Element,T->Right);  是不是只需要返回替换它的节点的地址，然后这个删除节点的父节点就是上一级的这个T T->Right = 新的替换节点的地址  PS：表达的不是太好，楼主可以在纸上演算一下，或者单步调试一步步看结果
user-0 提问: 大神求救！第一次用C-Free5.0 小白 为什么老是被调试程序不是可执行程序。

回复:
user: user-1
content: 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。 程序员的常识之二：写程序之前，关闭UAC、防火墙、杀毒软件、以管理员身份运行、……

user: user-0
content: 我按照教程来的，并没有什么用，好像，总感觉保存路径不对

user: user-2
content: 先保证创建工程是否正确： 参考：http://jingyan.baidu.com/article/f3e34a128204a8f5eb653597.html

user: user-3
content: window下编程用VS、Dev-C++， 不要用一些不知名的软件，用的人少。
user-0 提问: ECHILD 什么情况下会出现？

回复:
user: user-1
content: 这个网上好多解析好的资料 http://blog.csdn.net/taolinke/article/details/8057335

user: user-0
content: 引用 1 楼 lgbxyz 的回复: #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <errno.h>   int main(void) {     int ret; 	//ignore the SIGCHLD signal     signal(SIGCHLD, SIG_IGN);      //During execution of the command, SIGCHLD will be blocked     ret = system("echo Hello");     if (ret < 0) {         perror("system failed");         return -1;     }     return 0; }    我在看 linux system这个函数的代码， 不少文章提到过， system 可能有 EHILD 出现，  能再解释一下原因吗？   什么原因导致的？

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <errno.h>   int main(void) {     int ret; 	//ignore the SIGCHLD signal     signal(SIGCHLD, SIG_IGN);      //During execution of the command, SIGCHLD will be blocked     ret = system("echo Hello");     if (ret < 0) {         perror("system failed");         return -1;     }     return 0; }
user-0 提问: c语言判断素数问题

回复:
user: user-1
content: #include<stdio.h> main() { 	int a,i; 	scanf("%d",&a); 	for(i=2;i<a;i++) 	{ 		if(a%i==0) 		printf("no\n"); 		break; 	} 	if(i==a) 	printf("yes\n"); } 应该这样吧，你那样的话循环一次然后break跳出循环，没有办法继续判断，

user: user-2
content: 对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-0
content: 引用 11楼lmj_like_cpuls 的回复:break 的作用是跳出整个循环，而不是单步跳出； 比如你输入了一个4 ，i = 2 时符合if条件输出no然后执行break，跳出来之后就直接结束函数了，所以你的的输出语句只执行了一次，建议使用调试查看每个变量运行时的值得变化，这样能更直观的发现问题怎么调试呢 ， 不太会

user: user-3
content: break 的作用是跳出整个循环，而不是单步跳出； 比如你输入了一个4 ，i = 2 时符合if条件输出no然后执行break，跳出来之后就直接结束函数了，所以你的的输出语句只执行了一次，建议使用调试查看每个变量运行时的值得变化，这样能更直观的发现问题

user: user-0
content: 引用 8楼oiq12 的回复:break跳出循环了。所以只有一次。蠢了

user: user-0
content: 引用 7楼qq_34969907 的回复:因为你写了，break，在for循环里面，无论执行if后面的语句块，还是else，你后面都跟了break。蠢了

user: user-4
content: break跳出循环了。所以只有一次。

user: user-5
content: 因为你写了，break，在for循环里面，无论执行if后面的语句块，还是else，你后面都跟了break。

user: user-0
content: 引用 2楼赵4老师 的回复:Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbersthx，but would you like to point out my mistakes？

user: user-0
content: 引用 3楼LubinLew 的回复: #include <stdio.h>  int main(void) { 	int a, i; 	scanf("%d", &a); 	 	for (i=2; i< a; i++) { 	 	if (a%i == 0) { 	 		printf("no\n"); 	 		return 0; 	 	}  	}  	printf("yes\n");  	return 1;  } 所以我发的代码对吗

user: user-0
content: 引用 1楼user-7 的回复: bool bFlag = true; for(i=2;i<=a/2;i++)  {       if(a%i==0)       {            bFlag = false;             break;        }  } if(bFlag)       printf("yes\n"); else       printf("no\n"); 所以我发的代码是错误的吗

user: user-6
content: #include <stdio.h>  int main(void) { 	int a, i; 	scanf("%d", &a); 	 	for (i=2; i< a; i++) { 	 	if (a%i == 0) { 	 		printf("no\n"); 	 		return 0; 	 	}  	}  	printf("yes\n");  	return 1;  }

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

user: user-7
content: bool bFlag = true; for(i=2;i<=a/2;i++)  {       if(a%i==0)       {            bFlag = false;             break;        }  } if(bFlag)       printf("yes\n"); else       printf("no\n");
user-0 提问: 这是系统问题还是程序问题么？

回复:
user: user-1
content: 因为这是系统的缓冲机制，只有缓冲区满了或者接受到回车字符了，getchar()函数才能返回。 getchar()是从缓冲区中一个一个字符读取  楼上说的getch（）是windows下独有函数，它不使用缓冲机制，所以只要有字符输入函数就可以返回。

user: user-2
content: 缓冲区的原因，你的程序运行过程大概是这样的  程序开始运行，然后遇到第一个ch = getchar();程序就暂停了，也就是不执行了，等着你输入  你从键盘敲如各种字符，比如“123空空空”这个时候程序还处于暂停状态，也就是你输入的这些东西还没有读入到程序中，所以你可以按backspace把你输入的字符删除，再从新输入  只有当你按下回车后，你输入的字符才会真正输入到程序中，程序继续执行，这样你前面输入的就删除不了了，也就是你在控制台无法删除上面一行的内容，因为他们已经被程序使用了，你删除了也没有用了  从你开始输入到按下回车之间输入的这些内容都存储在输入缓冲区中，所以无论你输入什么程序也不会理睬，只有你输入回车后程序才会继续执行，判断里面有没有特殊的符号（比如‘#’）之类的

user: user-3
content: 这种输入模式是按行输入的, 可以用退格删除左侧的字符, 另一种是按字符输入, 好像是 getch(), 楼主试试吧.
user-0 提问: 【求】]高手来看看我哪出错了 ，UG二次开发的代码

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

user: user-2
content: main函数前面丢了一个右大括号
user-0 提问: error C2143   fatal error C1004

回复:
user: user-0
content: 引用 1 楼 LubinLew的回复:case 2   后面的break后面用了冒号，应该是分号

user: user-0
content: 引用 2 楼 paschen的回复:case 2: b();break: 改成 case 2: b();break;  你之前的不是分号 谢谢你了，对自己也是无语了

user: user-1
content: case 2: b();break: 改成 case 2: b();break;  你之前的不是分号

user: user-2
content: case 2   后面的break后面用了冒号，应该是分号

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-0 提问: C语言错误，求大神解决

回复:
user: user-1
content: 好像并没有啥问题？

user: user-0
content: 引用 3 楼 qq423399099 的回复:楼主是不是少贴了什么 array.c里第六行的ARR是什么？  谢谢，头文件帖错了 array.h  #pragma once #include <stdio.h> #include <stdlib.h> #include <malloc.h> //typedef struct ArrType //{ //	void(*init_arr)(PARR arr, int length); //} arrType; typedef struct Arr { 	int *pBase;//存储的是数组第一个元素的地址 	int len;//数组所能容纳的最大元素的个数 	int cnt;//当前数组有效元素的个数 	//struct ArrType *arrType; } *PARR, ARR;  extern void init_arr(PARR, int); extern bool append_arr(PARR, int); extern bool insert_arr(PARR, int, int); extern bool delete_arr(PARR, int, int*); extern int get(PARR, int); extern bool is_empty(PARR); extern bool is_full(PARR); extern void sort_arr(PARR); extern void show_arr(PARR); extern void inversion_arr(PARR);

user: user-1
content: 楼主是不是少贴了什么 array.c里第六行的ARR是什么？

user: user-0
content: 引用 1 楼 DishBirder 的回复:错误： error C2061: 语法错误: 标识符“delete_arr”	array.h error C2061: 语法错误: 标识符“delete_arr”	array.c  error C2059: 语法错误:“类型”	array.h error C2059: 语法错误:“类型”	array.c  全是这种类型的错误，上面代码组织的有什么问题吧？  这个板块没有人关注吗

user: user-0
content: 错误： error C2061: 语法错误: 标识符“delete_arr”	array.h error C2061: 语法错误: 标识符“delete_arr”	array.c  error C2059: 语法错误:“类型”	array.h error C2059: 语法错误:“类型”	array.c  全是这种类型的错误，上面代码组织的有什么问题吧？

user: user-0
content: 引用 6 楼 qq423399099 的回复:好像并没有啥问题？   我给test.c改成cc后缀就行了，走c++的编译器就没有问题
user-0 提问: C#运行时显示无法获取“AxDrawingControl”控件的窗口句柄

回复:
user: user-1
content: 在64位Windows下： 64位exe和dll在目录c:\windows\system32目录下； 32位exe和dll在目录c:\windows\syswow64目录下； 所以要注意：     在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。     且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll
user-0 提问: 怎么解决控制台，刷新闪烁问题

回复:
user: user-1
content: 引用 5 楼 lishang6257 的回复:受教了，同楼上，想知道原理 调用 winapi，把光标位置设定到开始位置 0,0.  清除控制台的缓冲区，你看哪些注释的内容

user: user-2
content: 引用 1 楼 paschen 的回复: bool cls() //编程方式实现清除屏幕 { 	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 	COORD coordScreen = {0, 0};    /* here's where we'll home the cursor */  	DWORD cCharsWritten; 	CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */  	DWORD dwConSize;                 /* number of character cells in the current buffer */   	/* get the number of character cells in the current buffer */  	if(!GetConsoleScreenBufferInfo( hConsole, &csbi )) 		return false; 	dwConSize = csbi.dwSize.X * csbi.dwSize.Y;  	/* fill the entire screen with blanks */  	if(!FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten )) 		return false;  	/* get the current text attribute */  	if(!GetConsoleScreenBufferInfo( hConsole, &csbi )) 		return false;  	/* now set the buffer's attributes accordingly */  	if(!FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )) 		return false;  	/* put the cursor at (0, 0) */  	if(!SetConsoleCursorPosition( hConsole, coordScreen )) 		return false; }  这个是什么原理呀

user: user-3
content: bool cls() //编程方式实现清除屏幕 { 	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 	COORD coordScreen = {0, 0};    /* here's where we'll home the cursor */  	DWORD cCharsWritten; 	CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */  	DWORD dwConSize;                 /* number of character cells in the current buffer */   	/* get the number of character cells in the current buffer */  	if(!GetConsoleScreenBufferInfo( hConsole, &csbi )) 		return false; 	dwConSize = csbi.dwSize.X * csbi.dwSize.Y;  	/* fill the entire screen with blanks */  	if(!FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten )) 		return false;  	/* get the current text attribute */  	if(!GetConsoleScreenBufferInfo( hConsole, &csbi )) 		return false;  	/* now set the buffer's attributes accordingly */  	if(!FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )) 		return false;  	/* put the cursor at (0, 0) */  	if(!SetConsoleCursorPosition( hConsole, coordScreen )) 		return false; }

user: user-4
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309
user-0 提问: socket新手问题!

回复:
user: user-0
content: 我改成了1111还是返回-1 1024 1025好像connect不上。

user: user-1
content: 建议先参考MSDN98中自带的socket例子代码。 MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C

user: user-2
content: servaddr.sin_port = htons(13); 改个大于1024的端口试试

user: user-0
content: msdn里的代码 跟linux网络编程里用的函数不是很相同，而且还比那书上的要难些。
user-0 提问: 请问C语言动态分配的内存空间如果没有释放，等到程序结束时，这段空间会怎么样?

回复:
user: user-0
content: 引用 2 楼 Rewen 的回复:程序结束后对操作系统没有影响。 但是程序中如果一直运行的话，有可能会导致内存越来越多。   明白了，谢谢!

user: user-0
content: 引用 1 楼 x20121223 的回复:进程结束时，所有空间，资源都会被操作系统回收。内存泄漏只是针对运行着的进程而言的，结束后所有分配的资源都被回收了。如果想深一步的了解相关内容，找本操作系统相关的书去看看吧。   明白了，谢谢

user: user-1
content: 程序结束后对操作系统没有影响。 但是程序中如果一直运行的话，有可能会导致内存越来越多。

user: user-2
content: 进程结束时，所有空间，资源都会被操作系统回收。内存泄漏只是针对运行着的进程而言的，结束后所有分配的资源都被回收了。如果想深一步的了解相关内容，找本操作系统相关的书去看看吧。
user-0 提问: C Primer Plus program list 8.8 main函数中的函数原型

回复:
user: user-1
content: 可以直接删除了，建议函数声明写在main函数之外，这样便于查看main里的代码逻辑；

user: user-2
content: 这是习惯吧，有些人习惯在函数内部声明 外部函数 不过这样做很啰嗦，每个函数中，每用到一个函数声明一次， 不如直截了当，在 所有函数前面声明一次。

user: user-3
content: 确实没必要再出现

user: user-4
content: 我习惯将函数实现直接写在调用它之前。不写函数原型。

user: user-5
content: 多余了呗，删了试试
user-0 提问: C语言通过socket传输文件

回复:
user: user-1
content: 用socket就忘掉进制、中英文，所有的都是二进制流,，char *类型的

user: user-2
content: 中文、英文，都以二进制传，有什么区别

user: user-0
content: 引用 6 楼 renwotao2009 的回复:[quote=引用 4 楼 wsx199397 的回复:] [quote=引用 3 楼 renwotao2009 的回复:] 一楼的二进制方式应该没有问题 可以了。。C语言这种方式可以传送任何文件吗？比如word，图片视频文件等[/quote]可以[/quote] 那么像word这种直接打开文件读，然后创建个word文件再写就行了嘛，不用在程序逻辑中处理读的是word，txt还是其他类型的文件？

user: user-3
content: 引用 4 楼 wsx199397 的回复:[quote=引用 3 楼 renwotao2009 的回复:] 一楼的二进制方式应该没有问题 可以了。。C语言这种方式可以传送任何文件吗？比如word，图片视频文件等[/quote]可以

user: user-4
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 引用 3 楼 renwotao2009 的回复:一楼的二进制方式应该没有问题 可以了。。C语言这种方式可以传送任何文件吗？比如word，图片视频文件等

user: user-3
content: 一楼的二进制方式应该没有问题

user: user-3
content: ANSI应该也可以的，你在传输过程中发生了什么错误？？不过使用的是iso8859-1扩展了原ANSI

user: user-5
content: fopen("file", "rb");  fwrite("file", "wb");

user: user-5
content: linux 下加不加b都行，这也得看发行版本，但是大部分linux都是这样的。 Windows下(VS)下必须加b，不加b只能操作ASCII。  无论什么(实体)文件都是由二进制数据构成，读写二进制可以传输各种类型的文件。 不需要判断什么文件类型的逻辑

user: user-0
content: 引用 1 楼 lgbxyz 的回复:fopen("file", "rb");  fwrite("file", "wb"); 谢谢。还有个问题：要传输像word这种文件的话直接打开文件读，然后创建个word文件再写就行了嘛，不用在程序逻辑中处理读的是.doc .jpg. txt还是其他类型的文件？
user-0 提问: 链栈，不报错，运行就崩溃

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

user: user-2
content: 初步改了一下，你看看吧，不懂再问  #include<stdio.h> #include<stdlib.h> struct StackNode { 	int data; 	struct StackNode *next; };  typedef struct StackNode *LinkStack; int IsEmpty(LinkStack top) { 	return top?1:0; } LinkStack Push(LinkStack top,int x) { 	LinkStack p; 	p=(LinkStack)malloc(sizeof(StackNode)); 	if(p) 	{ 		p->data=x; 		p->next=top->next; 		top->next=p; 	} 	else 	{ 		printf("No Room!\n"); 		exit(0); 	} } void Pop(LinkStack top,int elem) { 	LinkStack temp; 	if(IsEmpty(top)) 	{ 		printf("Null!\n"); 	} 	else 	{ 		temp=top; 		elem=top->data; 		top=top->next; 		free(temp); 	} } void Display(LinkStack top) { 	for(top=top->next;top!=NULL;top=top->next) 	{ 		printf("%d->",top->data); 	} 	printf("\b\b"); 	printf("\n"); } LinkStack InitStack(LinkStack head) { 	head->next=NULL; 	return head; } void DestoryStack(LinkStack top) { 	LinkStack p; 	while(!top) 	{ 		p=top; 		top=top->next; 		free(p); 	} } int main() { 	int i=2; 	LinkStack stack; 	struct StackNode sn; 	stack = &sn; 	InitStack(stack); 	for(i=1;i<10;i++) 	{ 		Push(stack,i*i); 	} 	Display(stack); }

user: user-3
content: #include<stdio.h> #include<stdlib.h>  typedef struct StackNode { 	int data; 	struct StackNode *next; }StackNode, *LinkStack;  int IsEmpty(LinkStack top) { 	return top?1:0; }  void Push(LinkStack *top, int x) { 	LinkStack p; 	p = (LinkStack)malloc(sizeof(StackNode)); 	if (p) { 		p->data = x; 		p->next = *top; 		*top = p; 	} else { 		printf("No Room!\n"); 		exit(0); 	} }  int Pop(LinkStack* top) { 	LinkStack temp = *top; 	int elem; 	 	if (IsEmpty(temp)) { 		printf("Null!\n"); 		return 0; 	} else { 		elem = temp->data; 		*top = temp->next; 		free(temp); 		return elem; 	} }  void Display(LinkStack top) { 	LinkStack temp = top; 	 	while (temp != NULL) { 		printf("%d ", temp->data); 		temp = temp->next; 	} 	printf("\n"); }   void DestoryStack(LinkStack top) { 	LinkStack temp = top; 	 	while (top != NULL) { 		temp = top; 		top = top->next; 		free(temp); 	} }  int main(void) { 	int i = 2; 	LinkStack stack = NULL; 	 	for (i = 1; i < 10; i++) { 		Push(&stack, i*i); 	} 	 	Display(stack); }
user-0 提问: 为什么一执行此函数时会出现debug error ?谁能帮我看看编程有啥错误？初来乍到多多包含，谢谢各位了

回复:
user: user-0
content: 问题找到了 ，是因为第二个printf里面的数据类型和前面定义的不一致，n是全局变量，已经在前面定义过了。谢谢大家了

user: user-1
content: 有可能是第二个printf中的结构体数组定义，使用的问题。 还有楼主这段代码中for循环中的n没有定义。

user: user-1
content: 就像楼上三位说的，楼主单步调试，单步跟一下，就可以发现出现debug error在哪一行。 单单贴出来这一个函数的代码，不好看出来。有可能是第二个printf中的

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

user: user-3
content: void lookxinxi()  { system("CLS"); int i; printf("\t学号\t姓名\t性别\t出生年月\t专业\t课程名称\t学分\t成绩\n"); for(i=0;i<n;i++)    /*输出所有的学生信息*/    //哪来的n { printf("%10s\t%s\t%2s\t%s\t%s\t%s\t%d\t\t%6.1f\n",stu[i].num,stu[i].name, stu[i].sex,stu[i].age,stu[i].zhuanye,stu[i].course,stu[i].xuefen,stu[i].score); } printf("\n\n\n\t\t\t按任意键返回菜单"); getch(); }   把其他代码一并贴出来看看

user: user-4
content: 出错时点中断，通过调用堆栈、变量窗口等观察分析原因
user-0 提问: 关于函数类型声明问题

回复:
user: user-1
content: 1)定义也是声明 2)先声明，后使用  如果一个函数，全局变量，类型 定义在函数前面，那么可以直接使用，因为定义也是声明。 否则，必须先声明（前置声明），后使用。  类型定义---struct.union,class( 仅仅 C++) 等----， 因为涉及到该类型占用内存大小的原因，和变量声明，函数声明，有所不同  用类型 定义指针，引用，不需要 先定义类型，只需要先声明（前置声明）即可 用类型定义变量，（包括数组）需要类型先定义，然后才可以定义变量。  struct.union,class 等，也可以定义类型同时定义变量

user: user-2
content: 因为你需要在主函数使用前对你自定义的函数进行定义，如果你希望在后边进行定义，那至少要有对其进行声明的操作。 如：  #include <stdio.h> //在主函数前对求和函数进行定义 int DoAdd(int x, int y) {     return x+y; }  //在主函数前对求二者较大数的函数进行声明，其实现/定义部分在后面进行 int MaxFunc(int x, int y);  int main() {     int x = 1;     int y = 2;     printf("The sum of x and y is %d.\n",DoAdd(x,y));     printf("The max between x and y is %d.\n",MaxFunc(x,y));     return 0; }  //对求二者中较大数函数的定义/实现 int MaxFunc(int x, int y) {     return x>y ? x : y; }

user: user-3
content: 如果你要在A函数中调用B函数，那么你要把B函数放于A函数前，或者B函数放在后但在A函数前面加上声明

user: user-4
content: C/C++ 是按顺序执行编译 而且如果你使用的函数 在是使用的时候 没有函数声明就会报错，编译完，然后链接 如果没有定义就报link错误

user: user-5
content: 函数在使用前要声明，第二此没有声明

user: user-6
content: 如果是在 main 函数之后进行函数定义的，那么调用时就一定要在 main 函数之前进行声明。 如果在自定义函数在 main 函数之前定义的，就可以不需要进行声明，main 函数能够自动找到该函数。 即使没有前向声明有的编译器也支持，能通过编译。 所以最好都加上前向声明。
user-0 提问: 合并浮点数

回复:
user: user-0
content: 引用 5 楼 tzg_dzq 的回复:unsigned short ush = 0X5F5F;  	unsigned char *puch = (unsigned char *)(&ush); 	unsigned char uch1 = puch[0]; 	unsigned char uch2 = puch[1];  	char chval[12] = {0}; 	sprintf_s(chval, sizeof(chval), "%d.%d", uch1, uch2);  	double fval = atof(chval); 最后结果： fval=95.950000000000003  也可以这样： int nval1 = puch[0]; 	int nval2 = puch[1]; 	double fval1 = nval1 + ((double)nval2 / 100.0); 	double fval2 = nval1 + ((double)nval2*1.0 / 100.0); 多谢多谢！！！！！！！可惜没有分给你了

user: user-1
content: unsigned short ush = 0X5F5F;  	unsigned char *puch = (unsigned char *)(&ush); 	unsigned char uch1 = puch[0]; 	unsigned char uch2 = puch[1];  	char chval[12] = {0}; 	sprintf_s(chval, sizeof(chval), "%d.%d", uch1, uch2);  	double fval = atof(chval); 最后结果： fval=95.950000000000003  也可以这样： int nval1 = puch[0]; 	int nval2 = puch[1]; 	double fval1 = nval1 + ((double)nval2 / 100.0); 	double fval2 = nval1 + ((double)nval2*1.0 / 100.0);

user: user-0
content: 引用 1 楼 user-2 的回复:1）通过对应的函数处理 库函数中有拆分浮点数的函数，合并的应该也有 2）自行处理 整数部分，简单直接化为浮点数 小数部分。要除以10的n次幂才可以 然后二者相加  多谢！！问题已经解决了，没有把十六进制转换为浮点数，所以两部分相加的时候没有合并成功。

user: user-2
content: 引用 3 楼 pingdangjun 的回复:[quote=引用 1 楼 user-2 的回复:] 1）通过对应的函数处理 库函数中有拆分浮点数的函数，合并的应该也有 2）自行处理 整数部分，简单直接化为浮点数 小数部分。要除以10的n次幂才可以 然后二者相加  多谢！！问题已经解决了，没有把十六进制转换为浮点数，所以两部分相加的时候没有合并成功。[/quote] 恭喜，没看清楚是十六进制，抱歉

user: user-2
content: frexp 拆分 浮点数的函数 ldexp 可以处理，二进制指数和浮点数的积的问题 由于十进制 数和浮点数不是一一对应的 无论怎么转换，都有可能出现误差

user: user-2
content: 1）通过对应的函数处理 库函数中有拆分浮点数的函数，合并的应该也有 2）自行处理 整数部分，简单直接化为浮点数 小数部分。要除以10的n次幂才可以 然后二者相加
user-0 提问: 这个用C语言怎么做

回复:
user: user-1
content: 仅供参考  #include <stdio.h> #include <stdlib.h> #include <math.h>  #define MAX_SIZE (10)  void sort_desc(int *array, int print); void primer_number(int *array); void narcissistic(int *array); void gg(int *array);  int main(void) { 	int array[MAX_SIZE]; 	int i, options; 	 	// 1. get 10 number from stdin 	printf("Please input 10 intger:\n"); 	for (i = 0; i < MAX_SIZE; i++) { 		scanf("%d", &array[i]); 	} 	 	// 2. select 1~4 	while (1) { 		//screen prompt 		printf("----------------------------------\n"); 		printf("1:sort intgers in descending order\n"); 		printf("2:output prime number\n"); 		printf("3:output narcissistic number\n");		 		printf("4:output Pythagorean number\n");		 		printf("5:Quit\n");		 		printf("----------------------------------\n"); 		//get user selection 		printf("Please select a number:");  	while (scanf("%d", &options) != 1 || (options > 6) || (options < 0)) { 			printf("=== Input Error!\n"); 			printf("Please select again:");	 		} 		 		switch (options) { 		case 1: 			sort_desc(array, 1); 			break; 			 		case 2: 			primer_number(array); 			break; 			 		case 3: 			narcissistic(array); 			break; 			 		case 4: 			gg(array); 			break; 			 		case 5: 			exit(EXIT_SUCCESS); 			break; 			 		default: 			break; 		} 	} }  void sort_desc(int *array, int print) { 	int i, j, tmp; 	//sort 	for (i = 0; i < MAX_SIZE-1; i++) { 		 		for (j = i+1; j < MAX_SIZE; j++) { 			if (array[i] < array[j]) { 				tmp = array[i]; 				array[i] = array[j]; 				array[j] = tmp; 			} 		} 	} 	if (!print) { 		return; 	} 	//output 	for (i = 0; i < MAX_SIZE; i++) { 		printf("%d ", array[i]); 	} 	printf("\n"); }  void primer_number(int *array) { 	int i, j, k; 	 	for (i = 0; i < MAX_SIZE; i++) { 		k = sqrt(array[i]); 		for (j = 2; j < k; j++) { 			if (array[i] % j == 0) { 				break; 			} 		} 		if (array[i] % j == 0) { 			continue; 		} else { 			printf("%d ", array[i]); 		} 	} 	printf("\n"); }  void narcissistic(int *array) { 	int i; 	int tmp, shg, sum; 	 	for (i = 0; i < MAX_SIZE; i++) { 		sum = 0; 		tmp = array[i]; 		while (tmp != 0) { 			shg = tmp % 10; 			tmp = tmp / 10; 			sum += shg * shg * shg;  		} 		if (sum == array[i]) { 			printf("%d ", array[i]); 		} 	} 	printf("\n"); }  void gg(int *array) { 	int i, j, k; 	sort_desc(array, 0); 	 	for (i = 0; i < MAX_SIZE-2; i++) { 		for (j = i+1; j < MAX_SIZE-1; j++) { 			for (k = j+1; k < MAX_SIZE; k++) { 				if (array[i] * array[i] == array[j] * array[j] + array[k] * array[k]) { 					printf ("%d %d %d\n" , array[k], array[j], array[i]); 				} 			} 		} 	} }

user: user-2
content: 自己做，有问题再来问吧
user-0 提问: 柔性数组输出问题

回复:
user: user-1
content: 炫技或装B有时也是刚需。

user: user-0
content: 为什么str->array[-1])的值会等于str->len的值啊

user: user-2
content: str->array[0]=1; str->array[1]=1; for(i=1;i<str->len;i++)//这句改为  for(i=2;i<str->len;i++) ///就可以了 因为 第 0，1元素，都已经初始化了， ///所以从第2个元素开始，初始化其余的数组元素，就可以了  printf("%d\n",str->array[-1]); 这个也没有必要啊， 既然成员 len;有自己的名字，不需要取 ,str->array[-1]);

user: user-3
content: 不知道楼主的问题在哪？按照楼主的方式，a[1] = a[0] + a[-1];由于结构体中均为int型数据，导致a[-1]取到了len的值，也就是a[1] = 1 + 20 = 21，如果楼主希望是a[2] = a[1] + a[0];请在循环中将i初始化为2.下面是按照楼主的程序打印出的结果，可供楼主参考。

user: user-4
content: 第一次循环，i = 1, str->array[i-2];不就是越界了。 还有，我记得这个特性(标记为空)属于HACK, C99要求标记长度为0，或者我记岔了
user-0 提问: C语言的文件系统

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: fprintf(文件指针，格式字符创，输出列表） 例如 fprintf(f,"%f,%f,%f\n,%f,%f",a,b,c,d,e);

user: user-3
content: 都不能，只能写入0或1，到底是浮点数还是字符，看你怎么解析

user: user-4
content: 写入时要计算float 的字节数，sizeof(float)

user: user-5
content: 文件分为文本文件与二进制文件，后者满足你的要求

user: user-6
content: 写入字符或者字符串类型，可以用记事本打开查看。 二进制写入整数、浮点数，可以用16进制编辑器查看。

user: user-6
content: 二进制读写 。

user: user-7
content: 当然可以  可以指定写入的字节数
user-0 提问: 关于socket通信的问题

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

user: user-0
content: 引用 5 楼 renwotao2009 的回复:看看服务器端分配的内存够不够 请问是看一个发包的内存还是其它什么？ Gate *clt=(Gate *)calloc(1, sizeof(Gate)); 这条语句说明分配内存的大小，是正确的

user: user-2
content: 看看服务器端分配的内存够不够

user: user-0
content: 引用 2 楼 x20121223 的回复:如果你想认真搞网络编程的话买本unix网络编程看看吧。你这代码问题太多了，看了那本书基本上你就不会来问这种问题了。 好，我看看

user: user-0
content: 引用 1 楼 lgbxyz 的回复:server死循环里没有accept ? 有，我没把socket通信建立连接的部分程序贴出来，那部分程序没有问题

user: user-3
content: 如果你想认真搞网络编程的话买本unix网络编程看看吧。你这代码问题太多了，看了那本书基本上你就不会来问这种问题了。

user: user-4
content: server死循环里没有accept ?
user-0 提问: 大神们，求教一个问题

回复:
user: user-1
content: 引用 5 楼 moyac 的回复:[quote=引用 4 楼 zhouxiaofeng1021 的回复:] F9 设置断点 F5 运行 调试 查看堆栈 查看 变量值 你就学会了 自己找问题了  程序猿必备 调试技能现在还不是很会这个呀，大神，求指教一下[/quote]  VS2008的话，就是你点击某一行，按F9 就可以设置断点 F5进入调试 最好DEBUG模式

user: user-0
content: 我已经自己解答出来啦，原来是自己在input = (input - x) / 10;，这一步上面，没有处理好，还有就是忽略了，这个进制之间的转换

user: user-0
content: #include <stdio.h>  int main() { 	int input; 	int x, n; 	int num; 	int sum; 	int step; 	 	n = 0; 	sum = 0; 	step = 1; 	scanf("%d", &input); 	while ( input > 0 ) { 		x = input % 10;//整数的最后一位 		n++;//第n位 		if ( x%2==0 && n%2==0) { 			num = 1; 		} else if ( x%2!=0 && n%2!=0) { 			num = 1; 		} else { 			num = 0; 		} 		sum = sum + num * step; 		step *= 2; 		input = (input - x) / 10; 	} 	 	printf("%d", sum); 	 	return 0; }

user: user-0
content: 引用 4 楼 zhouxiaofeng1021 的回复:F9 设置断点 F5 运行 调试 查看堆栈 查看 变量值 你就学会了 自己找问题了  程序猿必备 调试技能现在还不是很会这个呀，大神，求指教一下

user: user-1
content: F9 设置断点 F5 运行 调试 查看堆栈 查看 变量值 你就学会了 自己找问题了  程序猿必备 调试技能

user: user-0
content: 嗯，求大神，解答一下，到底是为谁呢？比较困惑这一段代码呢

user: user-0
content: 引用 1 楼 user-2 的回复:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 int main() {     int input;     int x, n;     int num;     int sum;           n = 0;     sum = 0;     scanf("%d", &input);     while ( input > 0 ) {         x = input % 10;//整数的最后一位         n++;//第n位         if ( x%2==0 && n%2==0) {             num = 1;         } else if ( x%2!=0 && x%2!=0) {             num = 1;         } else {             num = 0;         }         sum = sum + num * 2;         input = input - x;     }           printf("%d", sum);           return 0; }嗯，你的意思是？不是很理解呢？大神

user: user-2
content: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 int main() {     int input;     int x, n;     int num;     int sum;           n = 0;     sum = 0;     scanf("%d", &input);     while ( input > 0 ) {         x = input % 10;//整数的最后一位         n++;//第n位         if ( x%2==0 && n%2==0) {             num = 1;         } else if ( x%2!=0 && x%2!=0) {             num = 1;         } else {             num = 0;         }         sum = sum + num * 2;         input = input - x;     }           printf("%d", sum);           return 0; }
user-0 提问: 赵老湿，我要去打羽毛球，录好你的视频，有空再看！

回复:
user: user-1
content: 一般来说，写个exe ，才能调试DLL 你可以试试能不能在脚本环境，例如PHP环境直接调试 另外，windows 提供一个程序 Rundll32之类的。可以直接命令行调用 Dll中的函数 你也可以试试
user-0 提问: 感觉这个问题挺可爱的

回复:
user: user-1
content: 这个的话，是因为b有没有初始化有关系。 当你把b放在循环里面，就会每次都被初始化为0； 当你把b放在循环外面的时候，就是一直累加，一直累加。 所以，如果说，你想要把这两个情况变得一样的话： 只需要把第一种情况下，在第一次循环后，对b初始化，就可以了； 这样子两种情况结果就一样了。

user: user-2
content: 就是对b的初始化； 跟声明位置没关系；第一种情况，你只需第一次循环后对b初始化，第一种情况和第二种情况结果就一样了； 你不能把前一个数的求的和与后一个数的求的和放在一起；

user: user-3
content: 这问题确实有点儿可爱啊，哈哈  放进循环里就是每次循环都会初始化为0，放在循环外面就是一直累加

user: user-4
content: 就是你每次第一个循环开始时都会初始化b = 0。 而原来的是一直累加。第一次循环没有输出后面因为b值已经比较离谱了自然也没有输出了。
user-0 提问: 求解

回复:
user: user-1
content: 你是不是在刷什么题啊，注意人家要求的输入，是要连续输入的，然后在依次输出，不是输入一个输出一个  还有你的minn也没有更新吧，其他地方是不是也有逻辑错误啊，不只是过来那两个例子就可以了  这种题最好建一个哈希表来减小时间复杂度，不要轻易使用O(n^2)的算法，还有提前生成一个质数表，不要每次都从头判断
user-0 提问: 请问我想用C语言编写一个对论坛指定关键字的标题自动回帖程序，但是我是初学者，没有什么头绪，请大神指导!

回复:
user: user-1
content: http://www.autohotkey.com

user: user-2
content: 引用 7 楼 zhao4zhong1 的回复:http://www.autohotkey.com  我大脑中负责论坛自动回帖的那个程序对应的进程刚才被一个长腿美女后门给偷偷挂起了。 我刚才将头在厕所门上一秒内连撞三下，启动安全模式，手动将这个后门程序删除，并重启，终于修复了。   老赵黑客帝国看太多了

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:http://www.autohotkey.com  我大脑中负责论坛自动回帖的那个程序对应的进程刚才被一个长腿美女后门给偷偷挂起了。 我刚才将头在厕所门上一秒内连撞三下，启动安全模式，手动将这个后门程序删除，并重启，终于修复了。    不知所云。。

user: user-1
content: http://www.autohotkey.com  我大脑中负责论坛自动回帖的那个程序对应的进程刚才被一个长腿美女后门给偷偷挂起了。 我刚才将头在厕所门上一秒内连撞三下，启动安全模式，手动将这个后门程序删除，并重启，终于修复了。

user: user-2
content: 老赵的论坛自动回帖程序失灵了？居然没有搜索到这个帖子

user: user-2
content: 赵老师说他会，我信了。

user: user-0
content: 引用 4 楼 u010165006 的回复:赵老师说他会，我信了。   你说赵老师会，我信了。

user: user-0
content: 引用 1 楼 qq423399099 的回复: http://blog.csdn.net/xxxxxx91116/article/details/9225301  谢谢

user: user-3
content: 想法比较好，但是实践起来不会容易；这是人工智能呢

user: user-4
content: http://blog.csdn.net/xxxxxx91116/article/details/9225301
user-0 提问: 关于资源ID和资源类型不是很理解！求路过大神点拨一句！

回复:
user: user-1
content: 版本信息，这个资源比较特殊

user: user-2
content: https://msdn.microsoft.com/en-us/library/ms648009%28VS.85%29.aspx https://msdn.microsoft.com/en-us/library/aa381058.aspx

user: user-3
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。
user-0 提问: c编写简单的例子cgi 用lighttpd无法访问

回复:
user: user-1
content: 《http权威指南》

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:建议楼主先学会使用抓包软件比如wireshark ---------------------------------------------------------------------------- linux centos7+lighttpd+c+cgi 之前index.html都可以访问 后来发现不能访问是因为#注释没去掉 现在可以访问cgi文件 但是返回http 500错误

user: user-1
content: 建议楼主先学会使用抓包软件比如wireshark
user-0 提问: strtol

回复:
user: user-1
content: 引用 3 楼 xiadun 的回复:[quote=引用 2 楼 wang0635 的回复:] #include<stdio.h>  int main() {     unsigned int   n1, n2, n3, n4;     char b[] = "c0a801bb";      sscanf(b, "%2x%2x%2x%2x", &n1, &n2, &n3, &n4);     printf("%1d.%1d.%1d.%1d\n", n1, n2, n3, n4);      return 0; }  转换成对应的整数呢？ sscanf之后，我再sprintf转换成192.168.1.187,然后再inet_aton去转换？[/quote] int main() {     char b[] = "c0a800bb";     unsigned int   l;      sscanf(b, "%8x", &l);     printf("%x\n", l);      return 0; }

user: user-0
content: 引用 2 楼 wang0635 的回复:#include<stdio.h>  int main() {     unsigned int   n1, n2, n3, n4;     char b[] = "c0a801bb";      sscanf(b, "%2x%2x%2x%2x", &n1, &n2, &n3, &n4);     printf("%1d.%1d.%1d.%1d\n", n1, n2, n3, n4);      return 0; }  转换成对应的整数呢？ sscanf之后，我再sprintf转换成192.168.1.187,然后再inet_aton去转换？

user: user-1
content: #include<stdio.h>  int main() {     unsigned int   n1, n2, n3, n4;     char b[] = "c0a801bb";      sscanf(b, "%2x%2x%2x%2x", &n1, &n2, &n3, &n4);     printf("%1d.%1d.%1d.%1d\n", n1, n2, n3, n4);      return 0; }

user: user-0
content: char b[] = "c0a801bb"; 把这个转化成IP地址，怎么操作 ，最好是用系统函数

user: user-2
content: 本来想事无巨细地准备一番，后来觉得还是故意不准备，全靠临场发挥更能有戏剧性。

user: user-3
content: 赵老湿准备好了么，还在灌水.... 引用 5 楼 zhao4zhong1 的回复: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-2
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。
user-0 提问: [求助]一段代码求解

回复:
user: user-1
content: 月经帖．

user: user-2
content: 这程序的问题

user: user-3
content: 呵呵，多加几个括号，明确一下优先级，就不会出现该类问题了吧

user: user-4
content: 不同的编译器结果很可能不同，这是一个未定义的行为

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

user: user-6
content: i的结果多少？？？？？

user: user-7
content: 没什么意义。。
user-0 提问: 在C语言的编程中，存在这么一种特殊情况，不知道各位是怎么处理的

回复:
user: user-1
content: 这种互相包含不是好的编码风格，建议百度： impl

user: user-2
content: 如果一个结构类型的声明具有如下形式 struct 标识符 而且后面不是分号“;”、“{”，则它声明的是一个不完整的结构类型，可以在后面补充声明为完整类型。 因此，这样做是正确的：  struct t f (void) {     /* ... ... */ }  struct t {/* ... ... */}

user: user-0
content: 怎么保证类型的定义在使用该类型之前？

user: user-0
content: 在上面的例子： #ifndef   _C_H #define  _C_H  #include A.h #include B.h  (函数声明)   #endif  修改一下： #ifndef   _C_H #define  _C_H  #include B.h #include A.h  (函数声明)   #endif 首先展开的是B.h,   B.h中包含了A.h与C.h，  由于已经#define _C_H， C.h不会被展开，因此首先展开A.h，然后才是B.h中的内容。由于在B.h中展开了A.h，因此在C.h中#include A.h就不展开了。 最后的结果是在A.h中的函数声明在前，而B.h中的类型定义在后。

user: user-0
content: 由于使用了#ifndef     #define      #endif， 所以在.c文件中每个.h文件只会被展开一次,也就是说在.c文件中展开.h文件时类型的定义与函数声明只有一份。 那么在.c文件中展开.h文件后类型的定义与函数声明必然有先后关系，如果函数的声明在前，而类型的定义在后，这样难道不会报错吗？

user: user-3
content: 引用 2 楼 user-6 的回复:A.h中也会有include B.h才对吧。  +10086

user: user-4
content: C++有 inline  函数，可能会出现这现象  C函数实现在 ,c 中，.h  只有宏定义 类型定义 函数原型  因此，解决方案有这么几种 1）头文件 #include头文件 2）类型定义集中在一个文件中 3）顺序包含头文件

user: user-5
content: 在B.h中也用类似的。 #ifndef   _B_H #define  _B_H  括起来啊，头文件展开是不会报错的。 或者把#include B.h写在上面一句。

user: user-6
content: A.h中也会有include B.h才对吧。
user-0 提问: sscanf有没有办法提取两个字符串中间的字符串？

回复:
user: user-1
content: 如果是"ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&name=asjkfhasjkfh&usession=undefined,我要截取第二次&name=后面的内容，要怎么做啊

user: user-1
content: 如果要截取pass=后面的密码要怎么截取啊

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char *p; char t[40]; p=strstr(s,"&name="); if (p) if (1==sscanf(p+6,"%39[^&]",t)) printf("name=[%s]\n",t);  谢谢

user: user-2
content: char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char t[40]; if (1==sscanf(s,"ttt=%*[^&]&name=%39[^&]",t)) printf("[%s]\n",t);

user: user-3
content: 用毛线正则表达式，直接strstr "&name="就行了

user: user-2
content: char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char *p; char t[40]; p=strstr(s,"&name="); if (p) if (1==sscanf(p+6,"%39[^&]",t)) printf("name=[%s]\n",t);

user: user-0
content: 这样写无法做成通用的取=后面的值的函数  但如果这样写 if (1==sscanf(s,"%*name=%39[^&][^&]",t)) printf("[%s]\n",t); ，name=前面的字符串用什么表示？

user: user-2
content: 引用 3 楼 old73 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char t[40]; if (1==sscanf(s,"ttt=%*[^&]&name=%39[^&]",t)) printf("[%s]\n",t);   %39是什么意思？  [/quote] 限定最多读入39个非&字符。因为t[40]，后面还要留一个字节给'\0'

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:char s[]="ttt=eee&name=aaaaaaaaaaa&pass=bbbbbgbb&usession=undefined"; char t[40]; if (1==sscanf(s,"ttt=%*[^&]&name=%39[^&]",t)) printf("[%s]\n",t);   %39是什么意思？
user-0 提问: c语言菜鸟求助

回复:
user: user-1
content: 变量不能是数字和一数字开头的组合～

user: user-2
content: 变量名只能是字母(a-z A-Z)，数字(0-9)，下划线(_)的组合，并且之间不能包含空格，数字不能放在变量名首位

user: user-3
content: void searchtrain(Link 1)，函数定义，这样写，不行吧

user: user-4
content: void searchtrain(Link 1)，这个写错了，是void searchtrain(Link l)

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

user: user-6
content: 你的void searchtrain(Link 1)里面的l写成了数字1

user: user-0
user-0 提问: 关于OPNET软件和VS进行联合仿真的程序问题

回复:
user: user-1
content: opnet中，如何实时接收到VS设置到接口的数据呢？？是通过中断还是什么呢？？

user: user-1
content: 请问在opnet里如何获取VS里的变量呢？？？最后也在做这个方向

user: user-2
content: 引用 3 楼 a648703125 的回复:请问楼主，你的DLL文件是通过VS生成的吗？是的话，生成过程有没有出现  error LNK2019: 无法解析的外部符号 __imp__Esa_Execute_Until，该符号在函数 _esa_main@8 中被引用 这样的错误？ 救救孩子吧 已解决

user: user-2
content: 请问楼主，你的DLL文件是通过VS生成的吗？是的话，生成过程有没有出现  error LNK2019: 无法解析的外部符号 __imp__Esa_Execute_Until，该符号在函数 _esa_main@8 中被引用 这样的错误？ 救救孩子吧

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

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

回复:
user: user-0
content: 引用 5 楼 qq423399099 的回复:你这样写的话（PFIELD title[MAX_TLTLENUM];）定义出来的是一个指针数组 你需要为每一个元素（即指针）都分配空间，否则的话指针指向的是一块未知的区域，你尝试写入的话会报异常 弄好了！我在每一个引用context.title[count],分配一个空间就好了。谢谢前辈！！

user: user-1
content: 你这样写的话（PFIELD title[MAX_TLTLENUM];）定义出来的是一个指针数组 你需要为每一个元素（即指针）都分配空间，否则的话指针指向的是一块未知的区域，你尝试写入的话会报异常

user: user-0
content: 引用 3 楼 qq423399099 的回复:你这个肯定是对NULL指针进行了操作导致的 可以单步看看是哪个地方的问题 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 我觉得可能是空指针问题的话，请问我要是想加上赋予空间的语句要怎么加？是每个指针都要写一个吗，还是可以一起写？

user: user-1
content: 你这个肯定是对NULL指针进行了操作导致的 可以单步看看是哪个地方的问题 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 user-2 的回复:PFIELD title[MAX_TLTLENUM];指针数组titile初始化了没有？？？ 没有初始化直接调用context.title[count]->type = 1; 这是不是空指针的问题？我查了一些但是不知道该怎么初始化这种指针数组。

user: user-2
content: PFIELD title[MAX_TLTLENUM];指针数组titile初始化了没有？？？ 没有初始化直接调用context.title[count]->type = 1;
user-0 提问: 怎么去掉这个警告？warning: suggest parentheses around arithmetic in operand of '^' 

回复:
user: user-1
content: 二元的位运算符比加减运算符的优先级低 而有时我们想当然认为位运算优先级要高一些的 所以 b | c + d 其实是 b | (c + d) 而不是  (b | c) + d 有人就吵起来了 为了避免这种无谓的争吵 在有二元位运算符号（& | ^）和算术运算符号的表达式中 好一些的编译器就善意的提醒我们 要我们明确说明到底是怎么个结合法

user: user-2
content: ((rtc_time->tm_year) ^ (rtc_time->tm_mday))报错信息提示楼主用括号将^操作符用括号括起来。

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: C/C++里的^是异或运算符，而不是表示几次方  要计算幂用pow函数
user-0 提问: 如何将按键输入的数字放入数组中

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define ARR_MAX (10) #define END_NUM (0)  int main(void) { 	int i = 0; 	int arr[ARR_MAX]; 	 	while (i < ARR_MAX) { 		scanf("%d", &arr[i]); 		if (END_NUM == arr[i]) { 			break; 		} 		i++; 	} 	 	return 0; }

user: user-2
content: 输入的数字个数不定的？有几个思路 1.提前设置好数组的大小，开的大一点 2.根据输入的长度动态更改，比如使用realloc
user-0 提问: C语言的问题。  大神

回复:
user: user-1
content: https://www.baidu.com/s?wd=c语言%20单链表%20统计文本

user: user-2
content: #include <stdlib.h> #include <stdio.h>  typedef struct node {         char a;         int count;         struct node *next; }Node;  Node* insert(Node *h, char key) {         if(NULL == h)         {                 Node *p = (Node *)malloc(sizeof(Node));                 p->a = key;                 p->count = 1;                 p->next = NULL;                 h = p;         }         else         {                 if(h->a == key)                 {                         h->count ++;                 }                 else                 {                         h->next = insert(h->next, key);                 }         }         return h; }  void print(Node *h) {         Node *p = h;         while(NULL != p)         {                 printf("%c, %d\n", p->a, p->count);                 p = p->next;         } }  int main(int argc, char *argv[]) {         char b[10] = "abacebaeba";         int i = 0;         Node *t = NULL;         for(i = 0; i < 10; i ++)         {                 t = insert(t, b[i]);         }         print(t);         return 0; }

user: user-0
content: 引用 6 楼 zxhuser-3 的回复:fgetc是读取一个字节的,汉字是多个字节表示的  T T 我知道啊， 我现在连字符都搞不定呢，  所以我往txt文件里 输入的只有字母和数字阿，  不考虑汉字， 该如何撸码？？ 大神

user: user-0
content: 阿啊啊啊啊啊 。  大神

user: user-3
content: fgetc是读取一个字节的,汉字是多个字节表示的

user: user-0
content: 引用 2 楼 zxhuser-3 的回复:感觉数组方便些 但用数组的话， 如何匹配庞大的字符呢，  字母，汉字， 符号？  我感觉还是单链表好用吧T Tt

user: user-0
content: 求大神解答~  大神~  谢谢啦

user: user-3
content: 感觉数组方便些

user: user-0
content: 大神求指导
user-0 提问: 请问consr char* s1是指针常量吧，那为什么程序还会报错。 

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

user: user-2
content: 楼主两次s1\s2都使用的是赋值操作，而不是判断操作，判断操作请用==，const是不允许修改该变量的。

user: user-3
content: const char *p 是常量指针，所指对象*p不可修改 char *const p 是指针常量，p不可修改 作为函数形式参数 char *const p 作用不大，一般不写 如同 const int n 这样的参数，一般不会出现一样，char *const p 这样的参数也一般不会出现 如果参数是 int,double  类型，即便参数是常量表达式，也只是 int ,double就可以了，没人会写成 int const n 或者，const int n 如果参数是 char *类型，哪怕指针不会改变，甚至实参只会传递 char *const, 一般也不会有人写成 char *const p 因为这么写，对外界没有任何作用，只能约束函数内部，不去修改它。没有多少意义。  如果不是 == 误写为 = 就是你对 = 或者 const char *p的意义理解错了 = 是赋值运算符 == 是相等比较运算符 const char *p 的意义是 *p 这个对象，不能通过 *p这个表达式 修改。 这是常量指针，指针p指向的对象 *p，对于指针 p来说具有常量性（不可修改）。

user: user-4
content: 少个 =

user: user-5
content: const char*表示的是指向的字符串的是个常量 char* const 是指针本身是常量，指向的位置不能修改
user-0 提问: c语言循环输入坐标然后画点输出在同一个界面上

回复:
user: user-0
content: F:\STAR1.DAT是一个星表，存在。同时rt我都不是很明白。

user: user-1
content: 什么情况？ F:\STAR1.DAT是否存在，"rt"似乎应为"rb"二进制读，因为后面fread
user-0 提问: 请问c语言有“声明”函数的说法，而VB为什么没有？

回复:
user: user-1
content: 没有银弹！

user: user-2
content: VB 中 变量声明  dim  public private   public private 也可用于函数  VB 一般不需要 include 指令，就可以直接用其中的函数，过程，常量，类型，全局变量了 这点跟C，C++不同

user: user-2
content: basic  函数和过程生命方式是  Declare Function....... Declare Sub.... VB 中，调用 DLL 也需要 声明其中的函数或者过程的

user: user-2
content: 有啊，VB中 API 必须先声明，后引用

user: user-3
content: C : 执行效率  VB : 简单，易学

user: user-4
content: 用起来方便的代价就是效率变低，如考虑汇编——C——C#
user-0 提问: 为什么全是0.。。

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

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

user: user-3
content: 建议单步运行你的程序，然后跟踪原因

user: user-4
content: 建议！你可以设置一个结构体数组～一个存值～一个存位置～然后利用sort函数对结构体数组排序～按照值的大小排序！最后输出存的位置就可以了
user-0 提问: 如果不使用一个函数，编译器会不会将些函数编译进exe文件中？

回复:
user: user-1
content: 当启动连接程序时，它会寻找“未定义的外部函数”，也就是说，它将在每一个库文件中查找源代码文件中未定义的函数。当它找到一个未定义的外部函数后，它会引入包含该函数定义的目标代码。(obj)。不幸的是，如果这个函数是在一个包含其它函数定义的源文件中被编译的话，那么这些函数也会被包含进来，你的可执行代码中将包含一些不需要的代码。因此，将库函数放到各自的源文件中是很重要的——否则会浪费宝贵的程序空间。有些编译程序包含特殊的“精明的”连接程序，这些连接程序能查出不需要的函数并去掉它们，从而使这些函数不再进入你的程序。

user: user-2
content: 就算你 #include 的了，但是你没有引用的符号都不会编译进最终的可执行镜像中。 包括 .exe 和 .dll .  SDK 中包含所有的开发函数，最终的 .exe 只有你使用的函数。  所以，如果需要把一个没有使用的符号（函数和变量等等）编译进 exe 或者 dll 。 需要特殊的方式。