Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 为什么while（feof(fp)）结束程序就结束了啊，求大神教导

回复:
user: user-1
content: 没有必要用feof啊 很简单的题目，分成几个函数写，很简单的。  #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h>  #define WORDSIZE    15  struct word_list {     int    size;    /**< list size */     int    count;   /**< word count */     char **words;   /**< word array*/ };   /**   * @brief read a word from fp;  *   * @param fp  * @param word  *   * @return   */ char * read_word(FILE *fp, char *word) {     int num;      num = fscanf(fp, "%s", word);     if (num != 1)         return NULL;     return word; }   /**   * @brief initialize the word list  *   * @param list  * @param size  *   * @return   */ int init_list(struct word_list *list, int size) {     char **ptr;      ptr = (char **)malloc(sizeof(char *) * size);     if (ptr == NULL)         return -1;      list->size = size;     list->count = 0;     list->words = ptr;     return 0; }   /**   * @brief insert word into list;  *   * @param list  * @param word  *   * @return   */ int insert_word(struct word_list *list, const char *word) {     int i;      /* TODO: you can call realloc to resize the list */     if (list->count >= list->size)         return -1;      /* discard word 'THE' */     if (strlen(word) == 3         && toupper(word[0]) == 'T'         && toupper(word[1]) == 'H'         && toupper(word[2]) == 'E')         return -2;      /* Does the word already exist? */     for (i = 0; i < list->count; i++)         if (strcmp(word, list->words[i]) == 0)             return -3;      /* not exist, now insert it */     list->words[list->count++] = strdup(word);      return 0; }   /**   * @brief show list content  *   * @param list  */ show_list(const struct word_list *list) {     int i;      for (i = 0; i < list->count; i++) {         printf("%s\n", list->words[i]);     } }  int main(int argc, char *argv[]) {     struct word_list list;     char word[WORDSIZE + 1];      init_list(&list, 1024);     while (read_word(stdin, word)) {         insert_word(&list, word);     }      show_list(&list);      return 0; }

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了
user-0 提问: 简单计算器程序求助

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

回复:
user: user-1
content: 当你把你的代码提交到OJ后，编译过后会通过重定向将预先写在文件中的测试用例来测试你的程序。但是文件中有多少组测试数据是不知道，所以只能通过判断是否读取到文件尾来判断。如果读取到文件尾，再用scanf等读取数据就会返回EOF

user: user-2
content: 看题目只有一组数据还是多组数据

user: user-0
content: 谢谢两位。
user-0 提问: 数据结构中MergeList中的ai和bj是什么意思

回复:
user: user-0
content: 帮我改一下好么？  mergelist函数总是错误，刚刚学好多不懂的地方； #include <stdio.h> #include <malloc.h> #define MaxSize 50 typedef char ElemType; typedef struct  { 	ElemType elem[MaxSize];    	int length; } SqList;    void InitList(SqList *&L);    int ListEmpty(SqList *L);    void DispList(SqList *L);    int GetElem(SqList *L,int i,ElemType &e);    int ListInsert(SqList *&L,int i,ElemType e);    void MergeList(SqList La,SqList Lb,SqList &Lc);  int main()  	{    	SqList *La,*Lb,*Lc; 	ElemType e; 	printf("(1)初始化顺序表La\n"); 	InitList(La); 	printf("(2)依次采用尾插法插入3,5,8,11元素\n"); 	ListInsert(La,1,'3'); 	ListInsert(La,2,'5'); 	ListInsert(La,3,'8'); 	ListInsert(La,4,'11'); 	printf("(3)初始化顺序表Lb\n"); 	InitList(Lb); 	printf("(4)依次采用尾插法插入2,6,8,9,11,15,20元素\n"); 	ListInsert(Lb,1,'2'); 	ListInsert(Lb,2,'6'); 	ListInsert(Lb,3,'8'); 	ListInsert(Lb,4,'9'); 	ListInsert(Lb,5,'11'); 	ListInsert(Lb,6,'15'); 	ListInsert(Lb,7,'20'); 	MergeList(La,Lb,Lc); 	DispList(Lc); 	return 0; 	     }     void InitList(SqList *&L) { 	L=(SqList *)malloc(sizeof(SqList)*MaxSize); 	L->length=0; } int ListEmpty(SqList *L) { 	return(L->length==0); } void DispList(SqList *L) { 	int i; 	if (ListEmpty(L)) return; 	for (i=0;i<L->length;i++) 		printf("%c",L->elem[i]); 	printf("\n"); } int GetElem(SqList *L,int i,ElemType &e) { 	if (i<1 || i>L->length) 		return 0; 	e=L->elem[i-1]; 	return 1; } int ListInsert(SqList *&L,int i,ElemType e) { 	int j; 	if (i<1 || i>L->length+1) 		return 0; 	i--;							/*将顺序表位序转化为elem下标*/ 	for (j=L->length;j>i;j--)		/*将elem[i]及后面元素后移一个位置*/ 		L->elem[j]=L->elem[j-1]; 	L->elem[i]=e; 	L->length++;					/*顺序表长度增1*/ 	return 1; } void MergeList(SqList La,SqList Lb,SqList &Lc)  {  	InitList(Lc);  	int i=j=1; int k=0;  	La_len=ListLength(La); Lb_len=ListLength(Lb);  	while((i<=La_len)&&(j<=Lb_len))  	{ 	 	GetElem(La,i,ai); GetElem(Lb,j,bj); 	 	if(ai<bj){ListInsert(Lc ,++k,ai);++i;} 	 	else {ListInsert(Lc,++k,bj;)++j;} 	 } 	 while(j<=La_len){GetElem(La,i++,ai);ListInsert(Lc,++k,ai);} 	 while(j<=Lb_len){GetElem(Lb,j++,bj);ListInsert(Lc,++k.bj);}  }

user: user-1
content: 额。。这个。 这个函数依赖于其他函数的，只是提供了一种思路，要把它写成可用的，需要根据不同语言来实现，这只是个算法思路
user-0 提问: 帮人找一道C语言，fork()函数编程题目

回复:
user: user-1
content: 引用 3 楼 my_live_123 的回复:1.创建了一个子进程，使用的系统调用fork() 2.使用了wait()和_exit（）系统调用。wait等待子进程的执行完毕，并获取其终结信息，传递的NULL参数，显然不关心子进程的终止信息。_exit（）由ISO的exit()调用，负责正常终止进程的执行    引用 2 楼 youismyo2 的回复:主要是第一二小题不知道怎么答 +1  第三题： before fork. global = 7, local = 8 end fork. global = 6, local = 7 end fork.

user: user-2
content: before fork. gobal = [7] local = [8]  end fork gobal = [6] local = [7] end fork  调用了fork() 创建了一个子进程, 创建子进程后,子进程拥有了一份父进程的副本,所以这个时候 ++ 操作不影响.  对于全局变量gobal, 它们 有共同的地址,但是值不一样...     上面 只是我自己的理解..

user: user-3
content: 1.创建了一个子进程，使用的系统调用fork() 2.使用了wait()和_exit（）系统调用。wait等待子进程的执行完毕，并获取其终结信息，传递的NULL参数，显然不关心子进程的终止信息。_exit（）由ISO的exit()调用，负责正常终止进程的执行    引用 2 楼 youismyo2 的回复:主要是第一二小题不知道怎么答

user: user-0
content: 主要是第一二小题不知道怎么答
user-0 提问: %f的问题

回复:
user: user-1
content: 引用 3 楼 q849179433 的回复:[quote=引用 1 楼 pathletboy 的回复:] #include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。为什么是0[/quote]  不是0啊 http://ideone.com/Ha6Rbd

user: user-2
content: 10/3结果为3 % f为浮点型  都不是同一个类型如果想要浮点型可以强制类型转换

user: user-3
content: 引用 4 楼 pathletboy 的回复:[quote=引用 3 楼 q849179433 的回复:] [quote=引用 1 楼 pathletboy 的回复:] #include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。为什么是0[/quote]  不是0啊 http://ideone.com/Ha6Rbd[/quote] %f会从栈上取8字节，10/3只push进去4字节，所以出啥结果都不奇怪。

user: user-4
content: 这个结果是3.333333，你的编译器有问题吧。

user: user-0
content: 引用 1 楼 pathletboy 的回复:#include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。为什么是0

user: user-0
content: 引用 1 楼 pathletboy 的回复:#include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。这个是为什么呢

user: user-1
content: #include"stdio.h" #include<iostream> int main() { printf("%f",(float)10/3); std::cin.ignore(100,'\n'); std::cin.get(); }  将整形数强制输出为浮点数会得不到预期值。
user-0 提问: 一个linux大牛说： paste  -d 分隔符的使用，最好用单引号，

回复:
user: user-0
content: up 起来，有高手不？

user: user-1
content: cp 1+2 3 难道不是linux命令？ 我的意思就是提醒你，加号在命令行中使用有特殊功能，要屏蔽此特殊功能，就有必要用单引号括住它了。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:因为 cp 1+2 3 表示将文件1和文件2的内容合并拷贝到文件3中。  还有，我这是 linux命令，

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:因为 cp 1+2 3 表示将文件1和文件2的内容合并拷贝到文件3中。   如果没有假的话，会如何？

user: user-1
content: 因为 cp 1+2 3 表示将文件1和文件2的内容合并拷贝到文件3中。
user-0 提问: C语言问题

回复:
user: user-1
content: 在c语言里面判断的时候比如if（i）之类的就代表i不等于

user: user-2
content: &&是逻辑与，i是你输入的变量值

user: user-3
content: i同是有值～～

user: user-4
content: i  同时不为0

user: user-5
content: 用户输入的那个i不是0 不能看做是&&i 应该是 (scanf("%ld",&i)!=EOF) && i &&在这里是逻辑与
user-0 提问: 数据结构单链表输出元素！程序编译通过，程序运行出现错误，实在检查不出来哪里的问题！请大神赐教

回复:
user: user-0
content: 引用 6 楼 jiht594 的回复:[quote=引用 3 楼 lei___lei 的回复:] 不好意思，我没有理解你的意思！我初始化新建一个空表后，就在表中的头结点之后插入了五个数值，然后就把链表的地址传给print（），只定义了一次LNode L，每次是怎么讲？而且初始化链表的时候，已经做了L->next=NULL啊！  你的Initsqlist没起作用. main中的L.next不是NULL,   你可以加一句L.next = NULL; 然后去掉没用的Initsqlist.  或者像#5那样改 [/quote] 太感谢你了！现在明白了，主要问题还是那个二维指针，直接传参和传递指针的区别！！谢谢了

user: user-1
content: 引用 3 楼 lei___lei 的回复:不好意思，我没有理解你的意思！我初始化新建一个空表后，就在表中的头结点之后插入了五个数值，然后就把链表的地址传给print（），只定义了一次LNode L，每次是怎么讲？而且初始化链表的时候，已经做了L->next=NULL啊！  你的Initsqlist没起作用. main中的L.next不是NULL,   你可以加一句L.next = NULL; 然后去掉没用的Initsqlist.  或者像#5那样改

user: user-1
content: 搜一下"二重指针"  Status Initsqlist(Linklist *L)  //构造一个空的线性表！（头结点指针域为空） {     *L=(Linklist)malloc(sizeof(LNode));     if(!(*L))     {         printf("init fail!\n");         return ERROR;     }     else     {         (*L)->next=NULL;         printf("init sucessful!\n");         return OK;     } }  int main() { //    Linklist L;     LNode *L;     int i;     Initsqlist(&L);     printf("Please input the data :");     for(i=0; i<5; i++)         Linklistinsert(L,1,i);     print(L);     return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:十有八九是建表的时候表尾指针没有置空  这是全部代码，劳烦帮我看一下，初始化链表Initlist时已经做了L->next=NULL;应该不是这个问题 #include<stdio.h> #include<stdlib.h>  typedef int Elemtype; typedef int Status;  #define  OK 1 #define  ERROR 0  struct Lnode               { 	Elemtype data; 	struct Lnode *next; }; typedef struct Lnode LNode; typedef struct Lnode *Linklist;   Status Initsqlist(Linklist L)  //构造一个空的线性表！（头结点指针域为空） { 	L=(Linklist)malloc(sizeof(LNode)); 	if(!L) 	{ 		printf("init fail!\n"); 		return ERROR; 	} 	else 	{ 		L->next=NULL;          		printf("init sucessful!\n"); 		return OK;		 	} }  Status Linklistinsert(Linklist L,int i,Elemtype e) { 	Linklist p,q; 	int j=0; 	p=L; 	while(p&&j<i-1) 	{ 		p=p->next; 		j++; 	} 	if(!p||j>i-1)   	{ 		printf("Insert error!\n"); 		return ERROR; 	} 	 	q=(Linklist)malloc(sizeof(LNode)); 	q->data=e;  	q->next=p->next; 	p->next=q; 	return OK;  }  void print(Linklist L) { 	Linklist p; 	p=L->next;	 	printf("The List is "); 	while(p) 	{ 		printf("%d",p->data); 		p=p->next; 	} 	printf("\n"); }    void main() { //    Linklist L; 	LNode L; 	int i; 	Initsqlist(&L); 	printf("Please input the data :"); 	for(i=0;i<5;i++) 		Linklistinsert(&L,1,i); 	print(&L); 	 }

user: user-0
content: 引用 2 楼 jiht594 的回复:每次 LNode L; 都先L.next = NULL;  要不然 Linklist p;     p=L->next;     printf("The List is ");     while(p)   这个while里面永远是true 不好意思，我没有理解你的意思！我初始化新建一个空表后，就在表中的头结点之后插入了五个数值，然后就把链表的地址传给print（），只定义了一次LNode L，每次是怎么讲？而且初始化链表的时候，已经做了L->next=NULL啊！

user: user-1
content: 每次 LNode L; 都先L.next = NULL;  要不然 Linklist p;     p=L->next;     printf("The List is ");     while(p)   这个while里面永远是true

user: user-2
content: 十有八九是建表的时候表尾指针没有置空
user-0 提问: 关于double类型变量给float变量赋值的溢出问题

回复:
user: user-1
content: 但是编译器应该在编译的时候就报错啊，因为这是自动类型转换已经不能完成命令了。

user: user-2
content: 和编译器没关系，和代码有关系。 格式化 double  的格式  是   “%lf”      而不是  “%f”

user: user-3
content: 求大神指点迷津。

user: user-4
content: http://bbs.csdn.net/topics/390676437

user: user-0
content: 引用 1 楼 fly_dragon_fly 的回复:VC6不会连float和double都傻傻分不清楚吧，这么大的数foat没法放  难道这是VC的bug么？能把一个超范围的数直接放到float变量里？

user: user-0
content: 引用 2 楼 mymtom 的回复:珍惜生命，远离VC6  版主，我就是随便看看，我记起里没有装VS，这个问题是VC的bug么？

user: user-5
content: 珍惜生命，远离VC6

user: user-6
content: VC6不会连float和double都傻傻分不清楚吧，这么大的数foat没法放

user: user-7
content: 不要再用VC6了，好吗？ vs2015都要出来了。用下vs2013吧，实在是太优雅了。

user: user-8
content: vs2008下溢出了
user-0 提问: C语言对TXT文本的操作

回复:
user: user-1
content: 人家要定长字段，空格也要，你们都答的啥 定长其实是最容易的了，先把一行或者整个文件读到字符数组里，然后按定长分出字符串来，方法太多了 最傻瓜的方式，逐个字符的读也行

user: user-2
content: 给个实际的建议： 学习使用第三方库，比如tinyxml，把它存为xml格式，然后用tinyxml库来读取。  人家已经把最复杂的解析工作给做好了，你只管调用就可以了。

user: user-2
content: 看着那些学生一学期从头到尾都是scanf，真是受不了。。。。  不过这种解析工作对初学者还是太有挑战了  引用 4 楼 my_live_123 的回复:fprintf写出去的文档再用fscanf读出来还是可行的。如果是自己手动写的文档，用fscanf读进内存，估计成功率不高。你得严格控制格式

user: user-3
content: fprintf写出去的文档再用fscanf读出来还是可行的。如果是自己手动写的文档，用fscanf读进内存，估计成功率不高。你得严格控制格式

user: user-2
content: 首先，这个文件最好是你生成的，这样格式就由你来定了。 比如，规定必须以逗号分开，不加空格 001，李勇， 男， 1991，。。。。  这样你在读取的时候就容易解析了。  文本的解析是比较复杂的事情，没有像那本书上那样靠scanf的，那个跟实际完全脱轨。 你逐个比较，找到逗号，记录起始位置，分出来子串，就可以了。  我觉得你暂时忽略这个吧，有点难。 《C/C++学习指南》，http://www.afanihao.cn/c_guide/，第15章，我记得是给了例子。另外第16章中关于string.h中的函数，也可以使用。但是只凭第15章也够了。

user: user-0
content: 引用 1 楼 iamshaofa 的回复:我观察了很多学生，学了一年只会了printf, scanf，你倒是会的多一点，还会fprintf, fscanf。。。。  请问有可行的办法吗？我想过把数据分割成定长，也就是把空格也读进去保存，但是不知道2进制的txt到底怎么弄。

user: user-2
content: 我观察了很多学生，学了一年只会了printf, scanf，你倒是会的多一点，还会fprintf, fscanf。。。。

user: user-4
content: 引用 12 楼 gqjjqg 的回复:这样的文本，最简单的方法：  打开TXT编辑器，搜索替换Tab成一个空格，再搜索替换N个连续空格成1个空格。 这样你的数据就是 列 以空格分开，行以回车分开。 C程序读取时就非常容易了，每行以5个 s% 空格隔开 fscanf读入即可。  我去，还有空字段，我错了。

user: user-4
content: 这样的文本，最简单的方法：  打开TXT编辑器，搜索替换Tab成一个空格，再搜索替换N个连续空格成1个空格。 这样你的数据就是 列 以空格分开，行以回车分开。 C程序读取时就非常容易了，每行以5个 s% 空格隔开 fscanf读入即可。

user: user-5
content: 将所有空字段，类型为字符串的，用下划线'_'代替，类型为数值的用0代替。

user: user-5
content: 引用 1 楼 iamshaofa 的回复:我观察了很多学生，学了一年只会了printf, scanf，你倒是会的多一点，还会fprintf, fscanf。。。。 我观察了很多用了半辈子C语言的，都不会取scanf函数的返回值。

user: user-0
content: 引用 7 楼 my_live_123 的回复:如果每个字段不为空，那么读取文件，自己分割字段，解析文件。比如你的情况，一次读取一行，9个字段为一条记录。可以尝试 嗯 这个我能理解，考虑到字段有些为空，处理起来很难，应为不是太统一，我暂时还是不考虑这个问题，先手解决分割字段吧。

user: user-0
content: 引用 6 楼 iamshaofa 的回复:给个实际的建议： 学习使用第三方库，比如tinyxml，把它存为xml格式，然后用tinyxml库来读取。  人家已经把最复杂的解析工作给做好了，你只管调用就可以了。 嗯嗯，谢谢，我会去试着学习的

user: user-3
content: 如果每个字段不为空，那么读取文件，自己分割字段，解析文件。比如你的情况，一次读取一行，9个字段为一条记录。可以尝试
user-0 提问: gcc的stdlib.h到底其实现文件在哪里？

回复:
user: user-1
content: 1.库文件已经以动态库或静态库方式放在指定目录当中，头文件一般放在/usr目录下 2.需要自主下载glib源码

user: user-2
content: 下载glibc源码再grep一下就可以了。

user: user-3
content: 你这是精力过剩么？  gcc的头文件在 /include下面，或/usr/include下面 没有提供对应的源文件，而是以glibc库的形式提供的  你可以下载gcc的整个源码，那里面有，不过你看那个有什么用呢？

user: user-2
content: 引用 8 楼 iamshaofa 的回复:source insight 解决一切问题   引用 2 楼 wangzuxi 的回复:下载glibc源码再grep一下就可以了。 source insight适当用也不错，以前我也比较依赖source insight，但后来还是自己grep比较精确。

user: user-3
content: source insight 解决一切问题   引用 2 楼 wangzuxi 的回复:下载glibc源码再grep一下就可以了。

user: user-4
content: 引用 5 楼 javashit 的回复:[quote=引用 4 楼 JiangWenjie2014 的回复:]  这个简单，在源码目录下ctags -R .，然后用vim就能快速定位到函数的定义在什么地方了  你意思是说vim+ctags，对吧？ [/quote]  是啊，我现在用glib，搜索函数定义，结构体定义，宏定义就是用vim + ctags定位的，非常好用。

user: user-5
content: linux下一切皆有源码，就看你找不找的到。  支持2楼。

user: user-0
content: 引用 4 楼 JiangWenjie2014 的回复:这个简单，在源码目录下ctags -R .，然后用vim就能快速定位到函数的定义在什么地方了  你意思是说vim+ctags，对吧？

user: user-4
content: 引用 3 楼 javashit 的回复:已经下载了，并且安装了源代码包  可是stdlib.h的实现文件，应该是由一组源代码文件实现的，这组源代码文件名字应该不是stdlib.c,  所以现在找不出rand()函数的源代码到底在哪里  是可以用grep，但是这个grep恐怕也不是很容易写出来吧  这个简单，在源码目录下ctags -R .，然后用vim就能快速定位到函数的定义在什么地方了

user: user-0
content: 已经下载了，并且安装了源代码包  可是stdlib.h的实现文件，应该是由一组源代码文件实现的，这组源代码文件名字应该不是stdlib.c,  所以现在找不出rand()函数的源代码到底在哪里  是可以用grep，但是这个grep恐怕也不是很容易写出来吧
user-0 提问: 求个问题的思路

回复:
user: user-1
content: 手打的，就这个意思吧，面向对象的写法。

user: user-1
content: class Filter {       bool accept(char ch); };  bool  do_filter(char ch) {      for(int i=0; i<6; i++)      {            if( fs[i]. accept(ch))                   return true;      }     return false; }  main() {     Filter  fs[6];    const char* text= "123234343534";    for(int i=0; i<strlen(text); i++)    {         char ch = text[i];         do_filter(ch);    } }  推荐一本书：《C/C++学习指南》 http://www.afanihao.cn/c_guide/ ，适用C，也适合C++，一看就懂，“不可能看不懂”。在线阅读，配套答疑平台，实在不懂就直接向作者提问。专业人士编写，与企业标准对接。

user: user-2
content: 输入是啥？输出要得到啥？

user: user-3
content: 仅供参考：//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //
user-0 提问: 求助！数据结构单链表插值问题。求各位给讲一下！谢谢了

回复:
user: user-0
content: 多谢各位的回复！

user: user-1
content: while循环后还有第3种情况 p != NULL; j >= i -1; i = 1，认为是有效的，直接在表头后插入元素 i <= 0，导致0 > i - 1,有if返回错误

user: user-1
content: Status ListInsert(LinkList L,int i,ElemType e)  // 在带头结点的单链线性表 L中第 i个位置之前插入元素 e { 	int j=0; 	LinkList p=L,s;//p指向头结点 	while(p&&j<i-1) // 寻找第 i-1个结点 	{ 		p=p->next; 		j++;//位置计数器 	} 	/*执行到这里有2种情况 		1.p=NULL；j <= i - 1;->表太短，要求的位置靠后 		2.p != NULL; j = i -1;->插入位置在表中 	*/ 	if(!p||j>i-1) //处理第1种情况，并处理i <= 0的无效输入 		return ERROR;  	//分配结点并初始化成员 	s=(LinkList)malloc(sizeof(LNode));  	s->data=e;   	//入表 	s->next=p->next; 	p->next=s;  	return OK; }

user: user-2
content: Status ListInsert(LinkList L,int i,ElemType e)  // 在带头结点的单链线性表 L中第 i个位置之前插入元素 e  {  int j=0;  LinkList p=L,s;  这道题归根结底是考察指针的使用。不管是谁，要是做这题时，在函数内部声明了多于一个的LinkList变量，做这题就失去了意义。这道题中的j也是多余的。

user: user-3
content: 你说的对啊 L中第 i个位置之前插入元素 e.  你说的情况有0个元素, ListInsert时, 第2个参数i只能是0.  如果是1, 就是要在第1个元素前插入e, 但是你一个元素都没有啊  所以才有这句, p!的时候返回ERROR if(!p||j>i-1) // i小于 1或者大于表长 return ERROR;
user-0 提问: (求助)uva10340

回复:
user: user-1
content: aaa a  另外提交的时候把freopen去掉

user: user-0
content: 引用 3 楼 FancyMouse 的回复:aaa a  另外提交的时候把freopen去掉 所以是int j = start+1吗？

user: user-0
content: 引用 1 楼 sholber 的回复:不懂你的意思。。。 以一个样例输入 VERDI vivaVittorioEmanueleReDiItalia 为例 从t[0]开始，s字符串的V与在t字符串的第4位（t[4]）V匹配成功 然后从t[4]开始往后，s字符串的E与t[12]E匹配成功 然后从t[12]开始往后，s字符串的R与t[20]R匹配成功 然后从t[20]开始往后，s字符串的D与t[22]D匹配成功 然后从t[22]开始往后，s字符串的I与t[24]I匹配成功  这个样例输出Yes

user: user-2
content: 不懂你的意思。。。
user-0 提问: 不懂？？

回复:
user: user-1
content: 根据父母的身高推测孩子身高的程序  if语句里的=改为==试试

user: user-2
content: 一步一步调试。。

user: user-3
content: 不懂什么？感觉这格式这么别扭，换成一个简单的不就好了吗

user: user-4
content: 输入格式。。自己调试
user-0 提问: c初学者求c大神相助

回复:
user: user-0
content: 哪位大神解释下上面程序的q=p和P=q

user: user-1
content: 引用给p输入数据后，q有指向p？？ 不太明白，楼主能否换个方式描述一下？

user: user-2
content: 如果程序没有粘贴错的话，就不需要 “给p输入数据后，q有指向p？？”
user-0 提问: 我用c语言写了一个windows窗口，为什么有提示未定义的变量类型

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

回复:
user: user-1
content: 在调试过程中，选择菜单“调试”、“窗口”、“即时”，可以显示“即时窗口”，在这个窗口可以输入并执行代码。

user: user-2
content: 注意%C 的用法，接受一个字符的话，还要get掉回车。

user: user-3
content: 先在Watch窗口中添加该变量，然后在该变量的值处点鼠标左键，输入新值，回车。

user: user-4
content: scanf("%c",&c1);  在这里F9下个断点, 然后F5运行起来. 这时程序会执行到断点这句, 这时,再按F10, 就需要输入数据才能执行.  你输入一个数据据, 然后程序会走到下一句....
user-0 提问: 疑问：具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。

回复:
user: user-1
content: static一定是静态存储时期的变量，但静态变量不一定都是用static表示的，所以具有外部链接的静态变量就是指具有文件作用域不加staitic限定的变量。

user: user-1
content: 我最近也在看，static表示的并不是静态存储时期，表示的是在文件作用域情况下是内部链接的，不加static的文件作用域就是外部链接。。。。。。。还有加static的块作用域是空连接，，，，，，，所谓的静态存储时期指的是变量的存储位置不变。希望对你有帮助。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:所以说： 千万字的解释不如举一个实际例子。 说是一物即不中。 “盲人摸太阳” 老师，关于“标识符的链接、作用域和存储期”这3个我已经弄明白啦，就是在纠结“具有外部链接的静态变量”这个东西，不知道他到底是什么样的东西，感谢2位指点，了解了！

user: user-2
content: 所以说： 千万字的解释不如举一个实际例子。 说是一物即不中。 “盲人摸太阳”

user: user-2
content: 1楼的例子代码很赞啊！

user: user-0
content: 引用 1 楼 sholber 的回复:我就说，有些教程看上去通俗易懂，却只会把问题越说越糊涂。 标识符的链接、作用域和存储期是非常容易混淆的东西。 我本来对CPP印象挺好（虽然我只是大致翻了翻），但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题？ 它应该这样说：“具有文件作用域的标识符是外部链接的，它所指示的对象具有静态存储期。” 顺便说一句，同样是static，它的位置不同，意义也不同： static int i;  //文件作用域，内部链接，静态存储期。 int j;  //文件作用域，外部链接，静态存储期。 int f (void) {     static int x;    //块作用域，无链接，静态存储期。     int y;    //块作用域，无链接，自动存储期和临时生存期。     extern int i;    //外部链接，与前面的'static int i'指示同一个对象。     extern int j;    //外部链接，与指示前面的'int j'指示同一个对象。 } 非常感谢你的解答，英文的原话是：“A static variable with external linkage has file scope, external linkage, and static storage duration.”对比翻译过来的中文，应该没出什么大差错，所以我疑问不解，也就是说不管中文还是英文，就这句话而言，不存在“外部链接的静态变量”？

user: user-3
content: 我就说，有些教程看上去通俗易懂，却只会把问题越说越糊涂。 标识符的链接、作用域和存储期是非常容易混淆的东西。 我本来对CPP印象挺好（虽然我只是大致翻了翻），但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题？ 它应该这样说：“具有文件作用域的标识符是外部链接的，它所指示的对象具有静态存储期。” 顺便说一句，同样是static，它的位置不同，意义也不同： static int i;  //文件作用域，内部链接，静态存储期。 int j;  //文件作用域，外部链接，静态存储期。 int f (void) {     static int x;    //块作用域，无链接，静态存储期。     int y;    //块作用域，无链接，自动存储期和临时生存期。     extern int i;    //外部链接，与前面的'static int i'指示同一个对象。     extern int j;    //外部链接，与指示前面的'int j'指示同一个对象。 }
user-0 提问: 一个算法问题

回复:
user: user-1
content: 看了半天，原来只是 奇数从小到大， 偶数从大到小。  数组大小N， 根据N奇偶性，先排列奇数，  引用 4 楼 KenZhang1031 的回复:交换排序，比如：0,1,2,3,4,5，按以下过程： 0,1,2,3,4,5   1,0,3,2,5,4   // 从第0个开始两两交换 1,3,0,5,2,4   // 从第1个开始两两交换 1,3,5,0,4,2   // 从第2个开始两两交换 1,3,5,4,0,2  // 从第3个开始两两交换 1,3,5,4,2,0  // 从第4个开始两两交换， 下标最大为5，最后没得换了，结束  可以再改进一下，索引本身有序，最终结果 左边列奇数索引递增，右边列偶数递减： 0,1,2,3,4,5   // 从第0个开始两两交换  增加条件：第二个操作数是奇数 交换，否则不交换 得到： 1,0,3,2,5,4   // 从第1个开始两两交换 同0可得： 1,3,0,5,2,4   // 从第2个开始两两交换 同0可得： 1,3,5,0,2,4   // 从第3个开始两两交换 不满足 第二个操作数是奇数 的条件，这里开始逆序交换右边偶数列 可得： 1,3,5,4,2,0    增加一个奇数判断，循环和交换次数更少，效率更高。

user: user-2
content: 这个其实简单，加多两个临时变量一次交换机可比如偶数情况 135420， 第一步记录临时变量tmp1=A[5]，然后A[5]=A[0] 第二步记录临时变量tmp2=A[2]，然后A[2]=tmp1，tmp1=tmp2 第三步记录临时变量tmp2=A[4]，然后A[4]=tmp1，tmp1=tmp2 第四步记录临时变量tmp2=A[3]，然后A[3]=tmp1，tmp1=tmp2 第五步记录临时变量tmp2=A[1]，然后A[1]=tmp1，tmp1=tmp2 第六步记录临时变量tmp2=A[0]，然后A[0]=tmp1，tmp1=tmp2 至于为什么这个顺序，自己写个函数计算位置即可

user: user-0
content: KenZhang1031 有创意，我写下看看！

user: user-0
content: 只是换位置，不是对里面的值排序.

user: user-3
content: 我想到一个时间不是很好的算法，先判断前一个数和后一个数的关系，如果不满足你这种规则就交换数据，进行(n-1)*(n-1)此循环。然后算出序列中奇数的个数a，然后按照规则排序前a个数。  for(size_t i = 0 ; i < col.size() - 1 ; ++i) 	{ 		for(size_t j = 0 ; j < col.size()-1 ; ++j) 			if((col[j]%2 == 0 && col[j+1]%2 == 1) || (col[j]%2 == 0 && col[j+1]%2==0 && col[j+1] > col[j]) || (col[j]%2==1 && col[j+1] == 1 && col[j]>col[j+1])) 				swap(col[j] , col[j+1]) ; 	}  	//count elements with odd 	num = count_if(col.begin() , col.end() , bind2nd(modulus<int>() , 2) ) ;  	sort(col.begin() , col.begin()+num) ;

user: user-4
content: 交换排序，比如：0,1,2,3,4,5，按以下过程： 0,1,2,3,4,5   1,0,3,2,5,4   // 从第0个开始两两交换 1,3,0,5,2,4   // 从第1个开始两两交换 1,3,5,0,4,2   // 从第2个开始两两交换 1,3,5,4,0,2  // 从第3个开始两两交换 1,3,5,4,2,0  // 从第4个开始两两交换， 下标最大为5，最后没得换了，结束

user: user-5
content: 你是想算法空间复杂度越低越好吧， 搜：排序算法+空间复杂度

user: user-6
content: a[0]到a[max]的值大小顺序是怎么样的？从小到大？

user: user-7
content: 不知道你在说什么

user: user-8
content: 三连发了，有点错误，要分奇偶数

user: user-8
content: 这样写也行  乘2用移位算更快

user: user-8
content: 排毛线的序啊，用公式算新的索引坐标即可
user-0 提问: 文科小白想学编程

回复:
user: user-1
content: 同为菜鸟卧槽心累

user: user-2
content: 这样的帖子果然最容易火！

user: user-3
content: 妹砸, 英语不好的话就学易语言, 英语还可以的话就学正统大德大智慧C吧, 其实正统大德大智慧C也不是必要的, 吾只是想劝妹砸一句, 万不可学歪门邪道道德沦丧毁三观Web相关编程, 妹砸玩那个三天加班就变黄脸婆

user: user-4
content: 只要有兴趣，学起来会很快，不在于文理还是工科  网上、书店都有很多入门的书与视频，楼主可以找些看  至于编译软件可以用VS2012  另外编程干嘛用“黑电脑”形容。。

user: user-5
content: 怎么会想着学编程的~~~学设计的不好吗？？

user: user-6
content: 从经典书籍学起

user: user-7
content: 既然是文科妹子，那就去找计算机的屌丝，肯定会把你教会的。从安装软件，到学会编程语言。 屌丝嘛，请他吃顿饭作为回报就可以啦，相信他很高兴的~

user: user-8
content: 对于新手来说，一本好书最重要。你要是看谭浩强的书，那你别指望学会编程了。你在线阅读这本书 http://www.afanihao.cn/c_guide/ ，照着例子抄一篇，应该就差不多了。

user: user-9
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-10
content: 下个vc装上去玩玩， 觉得太大下个notepad++ 配上gcc就够了，

user: user-11
content: 找计算机专业的男生来教你就行了，比如我

user: user-12
content: 引用 5 楼 iamshaofa 的回复:对于新手来说，一本好书最重要。你要是看谭浩强的书，那你别指望学会编程了。你在线阅读这本书 http://www.afanihao.cn/c_guide/ ，照着例子抄一篇，应该就差不多了。  又在推你的书？于是我又点进去，一眼发现这些：  大括号末尾没有分号同样声明一个枚举： printf ("%d\n", sizeof (enum e {Male, Female})); enum e * pe; 最后一个枚举常量后可以有逗号，这你应该服气： enum e { Sun, Moon,}; 不信你试试。   用存储类指定符register声明的bian liang有地址吗？？ register int r; int * pr = & r;    //可以？？？？？？ 这个void是亮点： void main ()  如果是 main () 还情有可原，因为默认是int

user: user-13
content: 网易公开课有浙江大学老师开课，讲C语言。每周发布7天的课，由浅入深，很好

user: user-14
content: 先了解什么是编程语言——http://zh.wikipedia.org/zh/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80 各个语言都有什么用途（大致） 然后选一门语言， 既然一无所知，那推荐找个视频看 比如学C，可以看看郝斌的

user: user-15
content: 《汇编语言》 -- 王爽 第四版 我想，编程会算，有空还是出本书去

user: user-9
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-7
content: 文科妹子为啥要学编程呢？

user: user-12
content: 跟我和赵老湿学吧，只是学费贵哩。朕贪财。
user-0 提问: 新手求大神来看看我的代码

回复:
user: user-0
content: 引用 2 楼 iamshaofa 的回复:你听说过编程规范这个东西吗？你这种乱糟糟的代码你自己看得下去吗？请问？ http://www.afanihao.cn/c_guide/ ,附录《编码规范》 谢谢这个网站 对我很有用

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

user: user-2
content: 你听说过编程规范这个东西吗？你这种乱糟糟的代码你自己看得下去吗？请问？ http://www.afanihao.cn/c_guide/ ,附录《编码规范》

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

user: user-0
content: 引用 2 楼 iamshaofa 的回复:你听说过编程规范这个东西吗？你这种乱糟糟的代码你自己看得下去吗？请问？ http://www.afanihao.cn/c_guide/ ,附录《编码规范》 我感觉自己写的挺规范的只不过复制过来就是这样了。

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

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

user: user-0
content: 这是五子棋，新手写的相当烂。我检查输赢是：从下的那个棋子开始向左检查向右检查，直到遇到边界或者对手的棋子就结束，
user-0 提问: 新人求解 scanf在vs2012中没有执行

回复:
user: user-1
content: 名字空间呢！

user: user-2
content: #include "stdio.h" 应为 #include <stdio.h>

user: user-2
content: 将第4行删掉，然后重建所有。

user: user-3
content: 关于代码，你试一下用scanf_s替换scanf函数，还有，新建工程的时候，不要勾选“预编译头”，要勾选“空项目”

user: user-4
content: 引用 2 楼 tanqizhi 的回复:是头文件里加这个吗 是主函数源文件里加  #include <windows.h>

user: user-5
content: 引用 3 楼 D_PCA 的回复:提示说了嘛，是上次成功的实例，当然不是这次的代码了。你的代码没有编译通过，运行的是上次成功编译的代码。  运行的是上次成功编译的代码

user: user-3
content: 提示说了嘛，是上次成功的实例，当然不是这次的代码了。你的代码没有编译通过，运行的是上次成功编译的代码。

user: user-0
content: 是头文件里加这个吗

user: user-4
content: Windows平台，为确保兼容性，一定要包含Windows.h
user-0 提问: 关于变量作用域的问题

回复:
user: user-1
content: 那不可能滴  求贴代码图和程序运行图

user: user-2
content: 引用 楼主 a130098300 的回复:代码大致如下  int val_1 = 0; int val_2 = 0;  static void func(  ) {    val_1++;    val_2++; }  static int func2() {     return val_1 / val_2; }  int main() {     for(  i=0; i < 10; i++ )     {        func();     }     func2(); }  现在的问题只这样的，下断点每次进入func，发现变量val_1,val_2都会自增1（第一次进入循环体，自增前都为0，第二次都为1），但是跳出func()之后，val_1,val_2又会变成0。导致循环结束后，调用func2挂掉，除0错误，请问这是怎么回事，求解！  肿么可能，可是全局变量哦

user: user-3
content: #include <iostream> using namespace std;  int val_1 = 0; int val_2 = 0;  static void func(  ) {    val_1++;    val_2++;    cout << "func :" << val_1 << ", " << val_2 <<endl; }  static int func2() {     return val_1 / val_2; }  int main() {     for(int i=0; i < 10; i++ )     {        func();        cout << val_1 << ", " << val_2 <<endl;     }     cout << func2() << endl;     return 0; }

user: user-4
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 用C查找网页中内容

回复:
user: user-1
content: libcurl + regex.h

user: user-2
content: 我这里有Windows平台很好的搜索引擎，完成了80%

user: user-3
content: 利用curl库，爬虫技术，把网页内容读取进行分析出自己想要的内容！

user: user-4
content: 使用curl库？
user-0 提问: #define与typedef用法的区别

回复:
user: user-1
content: 楼主，你是哪个大学的？

user: user-2
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-3
content: int *p3,p4;-->可以这么定义，p4不是指针。

user: user-4
content: #define PCHAR char*  宏定义是代码替换.   所以替换后 PCHAR p3,p4;   等价于   char*  p3, p4;    又因为*号是跟最近变量结合.    可以这样写:    char   *p3, p4;     所以 p3是一个char指针,  p4是一个char变量. 在实际的工作中, 是需要避免这种写法的.  而typedef char* pchar;  是定义了一种类型的别名,  不是代码替换. 所以p1,p2都是char*

user: user-0
content: 引用 8 楼 sholber 的回复:楼主，你是哪个大学的？昨晚上，把我搞蒙了，现在一看，发现我都接触过的

user: user-0
content: 引用 8 楼 sholber 的回复:楼主，你是哪个大学的？一个普通二本，我大学里C语言没有系统学过，之后都是工作中学的，现在准备重新把这些东西过一遍

user: user-5
content: 引用 1 楼 user-8 的回复:char *p3,p4,这个定义了一个指向char型的指针p3,和一个char变量p4 宏定义是简单的字符替换，typedef是定义一种变量类型的别名 宏定义是简单的字符替换，typedef是定义一种变量类型的别名

user: user-6
content: typedef类似于struct，是定义一个新类型，define是简单的替换

user: user-7
content: 恩  楼上说的对，宏定义是简单的字符替换，typedef是定义一种变量类型的别名 这里的关键是  用char*替换PCHAR p3,p4;中的PCHAR后得到的这句char* p3,p4;该怎么理解，这个可以理解为p3,p4都是指针（把char*看做一种数据类型）也可以把p3看做指p4看做普通的char变量（即理解为char *p3,p4），那VC到底是怎么”理解“的呢？根据实验可知vc的理解是后一种理解，即你写char* p3,p4或者char *p3,p4都是一样的，vc都是默认p3是指针，p4是char的普通变量。但如果你就想一次定义多个指针呢，那就只能用typedefine来解决了  希望帮到你

user: user-8
content: char *p3,p4,这个定义了一个指向char型的指针p3,和一个char变量p4 宏定义是简单的字符替换，typedef是定义一种变量类型的别名
user-0 提问: C语言编程将整数1分解成若干个几分之一的和　

回复:
user: user-1
content: 或参考下面：//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案 #include <stdio.h> int Begin,End,Sum; int j; int o[1000]; long n; void combsum(int b,int e,int s,int d) {     int i;      if (e>s) e=s;     for (i=e;i>=b;i--) {         if ((i+b)*(i-b+1)/2<s) break;         o[d]=i;         if (s-i<=0) {             n++;             printf("%8ld:",n);             for (j=0;j<=d;j++) printf("%d ",o[j]);             printf("\n");         } else {             if (d+1<1000) combsum(b,i-1,s-i,d+1);             else {                 printf("Error:Too deep.\n");                 return;             }         }     } } int main() {     printf("Input Begin,End,Sum:");fflush(stdout);     scanf("%d,%d,%d",&Begin,&End,&Sum);     n=0L;     combsum(Begin,End,Sum,0);     printf("Total:%ld\n",n);     return 0; }

user: user-1
content: 在给定数x的约数之中寻找n个约数使得之和等于x 参考下面： //n个(2<=n<=20)整数(整数范围-10<=x<=10)，判断是否可以从这n个数中找到若干个数，其和为10 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <algorithm> using namespace std; int MAXN=20; int MINN=2; int x[20]; int n,i,j,k,sum; int main() {     srand((unsigned)time(NULL));     n=MINN+rand()%(MAXN-1);     for (i=0;i<n;i++) {         x[i]=-10+rand()%21;         printf("%d,",x[i]);     }     printf("\n");     sort(&x[0],&x[n]);     do {         for (i=2;i<=n;i++) {             sum=0;             k=n/2-i/2;             for (j=k;j<k+i;j++) {                 sum+=x[j];             }             if (10==sum) {                 for (j=k;j<k+i;j++) {                     if (j==k+i-1) {                         printf("%d==10\n",x[j]);                     } else {                         printf("%d+",x[j]);                     }                 }                 printf("YES\n");                 return 1;             }         }     } while (next_permutation(&x[0],&x[n]));     printf("NO\n");     return 0; }

user: user-1
content: 仅供参考：

user: user-2
content: 等式可以认为是(a1+a2+...am)/K，很好理解，a1,...am必然是K的所有约数的和的组合。因此最后题目就是转化为求一个数K的所有约数（质因子），题目K最大才30，之后求出所有约数中,n个数的和等于K的组合。 比如：K=30，30=2*3*5，根据“约数个数定理”，约数有8个，除去自己本身就剩7个，为1,2,3,5,6,10,15,如果你输入n=4，那么就是求这7个约数中，哪4个相加正好等于30的所有组合，根据组合原理，C(7,4)才210中组合，因此循环不会很久。 题目没规定K值，因此，需要K从1到30循环，对每一次循环的K，找出所有所有约数，并对所有约数个数不小于n的情况，循环找出所有n个约数等于K的组合。 建议搜索： 1、约数个数定理 2、求求一个数的所有约数（或者质因子） 3、从N个数中任选M个数相加的和等于K（循环应该就能解决）

user: user-3
content: 引用 2 楼 lovesmiles 的回复:加了限制项n 时，就更加好办了，就是求n个数相加等于30 样例的1/2 1/3 1/8 1/24你这么做能出来？

user: user-4
content: 其实就是整数分解的变体 比如 (18 + 12 + 4 + 2) / 36 = 1. 为了保证分子是1，那么分子必须是分母的约数。为了保证和为1，那么约数之和必须等于分母 故：在给定数x的约数之中寻找n个约数使得之和等于x

user: user-5
content: 加了限制项n 时，就更加好办了，就是求n个数相加等于30

user: user-5
content: 给个思路你： 1=30/30  这个分母就是30，分子也是30，将分子的30做分解就可以了。列出1-29之内相加等于30的各种可能，然后将这些数和分母约分就可以了 比如:30=2+3+25 则1=(2+3+25)/30 1=1/15+1/10+5/6
user-0 提问: 位字段结构体疑问

回复:
user: user-1
content: 结构或者联合的成员不一定非得有名字。如果在一个位字段的声明中只有声明指定符、冒号和宽度，而没有声明符，则声明的是一个未命名的位字段。因为没有名字，所以该成员无法在程序中引用。它唯一的用处是填充，使它所在的结构或者联合具有你所希望的内部布局。在下面的例子中，未命名的位字段成员改变了结构的大小和对齐： struct t {char c; int: 16;}; 如果可能的话，几个相邻的位字段可以共用同一个承载它们的存储单元。当然，也有办法明确禁止这种安排，那就是，在你不希望与其它位字段共用存储单元的那个位字段后边，插入一个宽度为0的位字段。注意，宽度为0的位字段只适用于结构类型，在联合类型中不起作用。在下例中，因为不允许共用同一个存储单元，所以，两个结构类型的大小可能会有一倍的差距： struct a {int i:3, j:5;}; struct b {int i:3, :0, k:5;}; 如上例所示（struct b的声明），因为宽度为0的位字段只是用来告诉C的实现，它前面的位字段不欢迎其它位字段与它共享同一个存储空间，所以，在声明一个宽度为0的位字段时，不允许提供声明符。不过，声明指定符还是必须有的。在下面的例子中，声明符i是不能出现的，但任何声明都至少有一个类型指定符： struct m {char c; int i:0;};	//无效。 struct n {char c; int : 0;};	//有效。

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 位字段在内存紧张的单片机中用的比较多点

user: user-4
content: 他这样初始化是不是直接略过了结构体中未命名的字段了呢--->是直接忽略了

user: user-5
content: 以前节省内存的方法，能不用就尽量不用，麻烦！ 1 确实是占位用，拼成一个字节 2 int为32位，如果前面定义已经占用了24位，下一个字段是9位，那么这个字段从下一个int开始对齐，空的8位不使用 3 说它麻烦是它的标准规定由实现定义，就是说是以int对齐还是char对齐看编译器

user: user-0
content: 引用 5 楼 sholber 的回复:结构或者联合的成员不一定非得有名字。如果在一个位字段的声明中只有声明指定符、冒号和宽度，而没有声明符，则声明的是一个未命名的位字段。因为没有名字，所以该成员无法在程序中引用。它唯一的用处是填充，使它所在的结构或者联合具有你所希望的内部布局。在下面的例子中，未命名的位字段成员改变了结构的大小和对齐： struct t {char c; int: 16;}; 如果可能的话，几个相邻的位字段可以共用同一个承载它们的存储单元。当然，也有办法明确禁止这种安排，那就是，在你不希望与其它位字段共用存储单元的那个位字段后边，插入一个宽度为0的位字段。注意，宽度为0的位字段只适用于结构类型，在联合类型中不起作用。在下例中，因为不允许共用同一个存储单元，所以，两个结构类型的大小可能会有一倍的差距： struct a {int i:3, j:5;}; struct b {int i:3, :0, k:5;}; 如上例所示（struct b的声明），因为宽度为0的位字段只是用来告诉C的实现，它前面的位字段不欢迎其它位字段与它共享同一个存储空间，所以，在声明一个宽度为0的位字段时，不允许提供声明符。不过，声明指定符还是必须有的。在下面的例子中，声明符i是不能出现的，但任何声明都至少有一个类型指定符： struct m {char c; int i:0;};	//无效。 struct n {char c; int : 0;};	//有效。  我觉得你说的很详细，很明白，让我搞懂了这个问题！谢谢！

user: user-0
content: 引用 1 楼 user-5 的回复:以前节省内存的方法，能不用就尽量不用，麻烦！ 1 确实是占位用，拼成一个字节 2 int为32位，如果前面定义已经占用了24位，下一个字段是9位，那么这个字段从下一个int开始对齐，空的8位不使用 3 说它麻烦是它的标准规定由实现定义，就是说是以int对齐还是char对齐看编译器 你第二点里说的是不是因为下一个字段是9位，超出了第一个int里剩余的8位的量，所以从下一个32位的int的第一个位开始将这个9个位的字段对齐。是这样理解的吧。还有就是现在真的很少用位字段了吗。。。如果是这样的话，我就少废点时间看这个了，今天刚把位操作这章的习题做完。 最后感谢你的回答。
user-0 提问: 基础编程题求问

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

user: user-0
content: 引用 9 楼 u012421456 的回复:[quote=引用 6 楼 shiny8 的回复:] 别的先不说，af数组什么情况？ 数组下标从0开始！！！[/quote]  问题就在这里！！！太感谢了！！！！

user: user-2
content: 遍历数组是 32-99的平方值构成数值

user: user-2
content: 从第一个开始 1024 若能开方：将数字重组找到能开方的数值配对(可能大于一组？)，并将所有数值从遍历数组中删除  下一个... 9999至！  可能效率也不太高

user: user-3
content: 1000 - 9999 总共就这么多四位数，循环一次，找到所有能开根号的数，再搜索配对。

user: user-1
content: 我觉得遍历次数一点也不多。

user: user-0
content: 给个算法就行，我就是想完善一下自己的算法。

user: user-4
content: 引用 6 楼 shiny8 的回复: 别的先不说，af数组什么情况？ 数组下标从0开始！！！

user: user-5
content: 晚上写了一个，已测试正确，供楼主参考 代码如下： #include <iostream> using namespace std;  int cmp(const void*a,const void*b) { 	return *(int*)a -*(int*)b; }   //将每一位数字存入数组 void getNumber(int num,int a[]) { 	int i = 4; 	while (i) 	{ 		a[--i] = num % 10; 		num /= 10; 	} }  //按位比较两个数组的每一位数字 int Compare(int a[],int b[]) { 	int i; 	int count = 0; 	for (i=0;i<4;i++) 	{ 		if (a[i]==b[i]) 		{ 			count ++; 		} 		else 			continue; 	} 	if(count == 4) 		return 1; 	else 		return 0; } int main() { 	int i; 	int j; 	int a[4]; 	int b[4]; 	for (i = 32 ;i < 100; i++) 	{ 		getNumber(i*i,a); 		qsort(a,4,sizeof(a[0]),cmp);//排序 		for(j= i+1 ;j< 100; j++) 		{ 			getNumber(j*j,b); 			qsort(b,4,sizeof(b[0]),cmp);//排序 			if(Compare(a,b)) 			{ 				cout << "{"<<i<<","<<j<<"}"<<endl; 			} 		} 	} 	return 0; }

user: user-6
content: 这个没有多少运算量，32-100的平方数，对每个平方数归并到各个组

user: user-0
content: 各位大神，我想知道为什么我输出的值后一个正确，前一个就不对了呢~am的值我没有变过啊。。。  #include <stdio.h> #include <stdlib.h> int main() { 	int a,am,b,bm,i,j,t,f,k;     int af[4],bf[4];     a=32;     t=0;         bm=0;     while(a*a<=9999)     {        am=a*a;                 af[1]=am%10;        af[2]=am%100/10;        af[3]=am/100%10;        af[4]=am/1000;       for (i=1;i<=3;i++)        {          for (j=1;j<=3;j++)          {            if (af[j]<af[j+1])            {                         t=af[j];              af[j]=af[j+1];              af[j+1]=t;            }                    }        }       t=0;      for (b=a+1;b*b<=9999;b++)        {          bm=b*b;          bf[1]=bm%10;          bf[2]=bm%100/10;          bf[3]=bm/100%10;          bf[4]=bm/1000;          for (i=1;i<=3;i++)          {            for (j=1;j<=3;j++)              if (bf[j]<bf[j+1])              {                t=bf[j];                bf[j]=bf[j+1];                bf[j+1]=t;                //printf("%d  ",t);              }            }           f=1;           for (i=1;i<=4;i++)           {             if (af[i]!=bf[i])              {               f=0;               break;             }           }           if (f==1) printf("%d,%d\n",am,bm);        }        a++;      }     	system("pause"); 	return 0; }
user-0 提问: casio dt930 串口发送数据

回复:
user: user-1
content: 比如： param=B_9600|PARI_NON|CHAR_8|STOP_1|SI_ON|XON_XOFF|RTS_ON|ER_OFF;

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:搜“串口调试助手源代码” 好的 我去看看 c语言的串口源码；  我在网上下的dt930 开发手册中看到了一些关于串口的函数，但是我还是有些不理解     这个函数里面的第二个参数 _UW param 我应该怎么传值， UW 类型相当于c中 unsigned long  /* 32-bit integer without symbol*/  期望大家可以帮我解答，谢谢。

user: user-1
content: 搜“串口调试助手源代码”
user-0 提问: Cfree中*.h使用问题

回复:
user: user-0
content: 谢谢----------------

user: user-1
content: 你c-free什么版本？ 我只用过5.0 就放到工程的存放头文件的文件夹中啊

user: user-0
content: 那个文件叫什么？？

user: user-2
content: 放在和.cpp相同文件夹下 #include "xxxx.h"
user-0 提问: 求助，安装SDK遇到如下问题

回复:
user: user-1
content: IE版本比较低或者没装吧 安装高版本IE重启下就可以了吧 我觉得这个google翻译都可以帮你搞定

user: user-2
content: 错误提示写的很明显啊？

user: user-3
content: IE安全级别的问题？

user: user-4
content: 你电脑上没装IE？
user-0 提问: 一维数组求学生最大成绩以及最小成绩

回复:
user: user-1
content: 引用 2 楼 FUHAODAASD 的回复:楼上的 我想知道我错在哪里啊  问题有两： 1. 数组越界，LS有讲。 2. 比较判断弄反。

user: user-2
content: LS正解 不知道楼主为什么会想要a[i+1]， 这样当i=4的时候还会导致数组取索引越界  只要比较当前索引的值和最大最小值，来判定是否用当前索引的值替换最大最小值就可以了

user: user-0
content: 楼上的 我想知道我错在哪里啊

user: user-1
content: #define n 5 void main() { float a[n],max,min; int i; for(i=0;i<n;i++) scanf("%f",&a[i]); max=min=a[0];         for(i=1;i<n;i++) { if(max<a[i]) max=a[i]; if(min>a[i])  min=a[i]; } printf("%f,%f\n",max,min); }
user-0 提问: 关于静态库的问题

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

user: user-2
content: 楼上正解，顶一下。。。

user: user-3
content: 静态库链接，是把静态库完整拷贝一份到编译出来的可执行文件中，会增大可执行文件的大小，这是第一个问题，而当多个不同的程序都链接了一个静态库，而同时运行时，内存中是会存在多份静态库的拷贝，而动态库则在内存中只存在一份拷贝
user-0 提问: Uva 1589 xiangqi,   WA了n次了，寻大神找找错误

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

回复:
user: user-0
content: thankyou

user: user-1
content: #include<stdio.h>  int main(void) { int a=2; int *i=&a; int' to 'int *' printf("%d\n",*i);//值 printf("%d\n",i);//地址值 printf("%d\n",&a);//地址值 return 0; }

user: user-2
content: int main(void) { int *i,a; a=2; i=&a; printf("%d\n",i);//地址 printf("%d\n",&a);//地址 printf("%d\n",*i);//值 return 0; }
user-0 提问: 回文字符

回复:
user: user-0
content: 求帮助，%>_<%

user: user-0
content: 引用 5 楼 crasylph 的回复:[quote=引用 3 楼 axiqia 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。受教了，谢谢。可是代码运行的结果是正确的，可是提交后 是WA，实在是有点头大，才发帖的[/quote]  等等你确定你的输出格式对吗。。我怎么觉得最后多打了个换行？[/quote] 格式不对不应该是PE吗

user: user-1
content: 引用 3 楼 axiqia 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。受教了，谢谢。可是代码运行的结果是正确的，可是提交后 是WA，实在是有点头大，才发帖的[/quote]  等等你确定你的输出格式对吗。。我怎么觉得最后多打了个换行？

user: user-1
content: 引用 3 楼 axiqia 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。受教了，谢谢。可是代码运行的结果是正确的，可是提交后 是WA，实在是有点头大，才发帖的[/quote]  WA一般是边界条件没有考虑好，导致一些边界上的测试数据过不了

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

user: user-2

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

回复:
user: user-1
content: 《Visual C++ 游戏开发经典案例详解》

user: user-2
content: 大学里抄点游戏思路没啥，你也可以自己想一个（可能一段时间也没好点子，这样会比较受挫）。就算一个工作多年的游戏设计师，也不一定能立马想出一个好点子。  设计思路上个人建议，想要做的出彩，就先去玩一些经典的FC小游戏，这些基本上一两天能通关，浪费时间不长，又能学习前人的一些经验，设计上参考这些游戏的点子，代码么可以自己写。 仅仅为了交个作业，完成以下任务，建议直接贪吃蛇，俄罗斯方块，连连看等这些抄烂的，保证能快速完成。  实现思路上个人建议，既然是小游戏，还是全部自己动手写比较好，不要用游戏引擎，CSDN博客上有大神 介绍全套的 WIN32 下超级玛丽 实现，可自行搜索参考。核心的东西都是一样用C可以实现，界面和图形绘制显示，要根据不同平台进行针对学习。  还可以参考一下云风的 游戏程序设计 以及他早年编写的 风魂++引擎，可以学习的地方很多。  纯手打，接点分。

user: user-3
content: 引用 2 楼 li824814957 的回复:可是那样不就是抄袭别人的吗？？ 你的意思是自己写一个别人从来没写过的游戏？ 楼主既然说了是想引用练练手，  但又引用半点思路都没有 还不看看别人的思路？ 反正是练手

user: user-4
content: 引用 2 楼 li824814957 的回复:可是那样不就是抄袭别人的吗？？ 只是学习

user: user-5
content: 同问，有什么方面的书籍或者知识要了解？感觉用c从学习语言的可是化界面的编程差距好大。

user: user-0
content: 可是那样不就是抄袭别人的吗？？

user: user-6
content: 网络上搜，一搜一大堆，简单的游戏，猜数字、贪吃蛇等，源码都有的
user-0 提问: 找bug

回复:
user: user-1
content: 缺少头文件，还有main函数里，b,c没有初始化、

user: user-2
content: 引用 1 楼 user-6 的回复:看上去b c 没房子住  +1

user: user-3
content: 在调用fun 函数前没有 给第2 3 个参数分配空间

user: user-4
content: b和 c 指针没初始化

user: user-5
content: *b=a[0];如果是想让b指向a[0]的话应该用b=&a[0]; fun(a,b,c); printf("%d,%d",*b,*c); 在某些逻辑下，fun中会出现c未被初始化的情况。

user: user-6
content: 看上去b c 没房子住
user-0 提问: 关于gets_s 可选函数读取键盘输入问题，就大神解答！！！

回复:
user: user-1
content: int mygets(char *n,int L,int minv,int maxv) {

user: user-1
content: int mygets(char *n,int L,minv,maxv) {  int i,v;  rewind(stdin);  if (NULL==fgets(n,L,stdin)) return 0;  for (i=L-1;i>=0;i--) if (n[i]=='\n') {n[i]=0;break;}  if (1!=sscanf(n,"%d",&v)) return 0;  if (minv<=v && v <=maxv) return 1;  return 0; }  ... if(!mygets(number,LEN,1,999)){ ...
user-0 提问: 怎么使用自己编译的dll或exe里面的文本文件 

回复:
user: user-0
content: 估计我这个帖子的标题说的太模糊了导致1楼的回答（对我没什么帮助），2楼说的在帖子里我已经提到了，我知道怎么使用资源文件来释放vbs那个文本文件。其实如果解决了能把资源文件的引入的原始文件随着工程一起编译的话，也可以，比如我在本机引的资源文件在C盘，别个机子没有CP盘引的那个文件，或者放到了D盘，而且修改了引的文件里的内容，又把工程给我，我需要的是新的工程+新的资源引的文件！！！

user: user-1
content: 搜从资源中释放文件 http://www.cnblogs.com/rogee/archive/2010/12/17/1909204.html

user: user-2
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 引用 3 楼 antiwise 的回复:估计我这个帖子的标题说的太模糊了导致1楼的回答（对我没什么帮助），2楼说的在帖子里我已经提到了，我知道怎么使用资源文件来释放vbs那个文本文件。其实如果解决了能把资源文件的引入的原始文件随着工程一起编译的话，也可以，比如我在本机引的资源文件在C盘，别个机子没有CP盘引的那个文件，或者放到了D盘，而且修改了引的文件里的内容，又把工程给我，我需要的是新的工程+新的资源引的文件！！！  真看不懂你说什么.  1 资源文件本来就是要编译进exe的. 编译后, 资源文件是在exe中, 而不是在机器中 http://blog.csdn.net/wangningyu/article/details/4378378  2你要别人修改过的文件, 你就管他要啊. qq传, 拿U盘自己考. 拆他硬盘都行.
user-0 提问: 近来学习编程，想知道静态库与动态库之间的区别

回复:
user: user-1
content: C语言的静态库与动态库对比分析，各有长短                库:  指由标准常用函数编译而成的文件，旨在提高常用函数的可重用性，减轻开发人员负担。常用的sdtio.h，math.h等库便是C函数库的冰山一角。                     1.静态库:指编译链接阶段将整个库复制到可执行文件                             1.1优点：静态链接的程序不依赖外界库支持，具有良好的可移植性。                             1.2缺点:  每次库更新都需要重新编译程序，即使更新很小或只是局部。                             1.3缺点：每个静态链接的程序都有一份库文件，存储时增加了硬盘空间消耗，运行时则增加了内存消耗。                     2.动态库:指直道运行时才将库链接到可执行程序                             1.1优点:  动态链接方式的程序不需要包含库（编辑链接时节省时间），占用的空间小很多。                             1.2优点:  运行时系统内存只需提供一个共享库给所有程序动态链接，内存消耗减少。                             1.3缺点:  需要系统中动态库支持才可运行，可能有动态库不兼容问题                 小结：在linux系统中:静态库.a                                                         动态库.so                                在windows中:静态库.lib                                                         动态库.dll
user-0 提问: 对于const的疑问

回复:
user: user-1
content: 我来试着解释下楼主所谓的  “节约内存”  首先程序有四个空间（）： 栈： 由操作系统提供，是个数据结构。底层支持，专门寄存器处理。先进后出。  堆：任意存取，首地址记录堆空间大小，可以动态扩容。  数据段：     1、只读数据段；const修饰变量（不会被更改）      2、已初始化读写数据段；静态变量被初始化/全局变量被初始化      3、未被初始化数据段；静态、全局变量未被初始化。（Linux下有bss段保存）  程序代码区：函数体二进制代码。  解释下楼主所谓的“节约”吧：  一个函数的执行是在栈空间执行，就算你在函数里面const也会在静态区间开辟空间保存。 我想节约的话也也是函数执行的栈空间节约。。  然而静态空间是在程序一开始执行就存在分配内存的。  宏只是替换，依旧要被编译器替换后编译 所以，我觉得楼主的纠结毫无意义，，

user: user-2
content: 变量赋值没什么分配内存的说法 而你的例子const对象明显比宏多占了8个字节

user: user-3
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-4
content: 引用 3 楼 zhao4zhong1 的回复:不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！  const的思想不是能否修改，而是程序优化。

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

user: user-4
content: 闻所未闻，岂有此理，信口雌黄，道听途说，通过歪门邪道学的C。

user: user-5
content: 我想告诉你的是， 如果用vs， 所有的pi值 也就是3.14159 都会优化成一个const值，位于常量区。最后只要定义是const的都直接应用该值 可以找书看看，const的变量最后生成exe都存哪儿了。 你可以测试一下 看看你上面例子 变量的地址是不是一样， 如果一样说明他们引用的就是一个值， 开优化，不开优化都试试。你会找到你要的答案的