Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 学习c语言中碰到的问题，请大神们帮忙解决，谢谢！

回复:
user: user-0
content: 调试的时候闪过Hello World的黑幕，接着有出现上面的一幕了

user: user-0
content: 非常感谢各位的答复。我现在去弄一下先，希望各位多多指教!

user: user-1
content: 项目选的对不对哦？

user: user-2
content: 怎么没有.h文件？光一个c文件怎么编译过去

user: user-3
content: 查一下是不是有中文字符了，比如printf后面的分号；要么就是查一下printf中的双引号是不是中文的，若是改成英文的。另外，注意输入法的设置，应设置为英文和半月牙

user: user-4
content: 哇，好开心，终于可以给小白解答问题了。 你这个问题一般都是由于输入法没设置好造成的吧。检查一下喽，要不就用notepad++查下看看。

user: user-3
content: 引用 5 楼 l18277221302 的回复:调试的时候闪过Hello World的黑幕，接着有出现上面的一幕了 那应该是你的编译环境问题了吧，查一下看看是否需要配置一下。
user-0 提问: 0-1背包问题的代码，这段代码的Max_Value函数表示从前k个物品中选择，总体积不超过参数Weight,并且总价值最大的最优解，但是运行不出来，求指教

回复:
user: user-1
content: int Max_Value(int Weight,int a[],int b[],int k) {     //如果剩余容量为0，装不了了，价值为0；     //如果没有物品可装，价值也为0     if(Weight == 0 || k == 0){         return 0;     }      //剩余容量容不下第k个(索引k-1)物品，则递归求第k-1个物品     if(Weight < a[k-1])         return Max_Value(Weight,a,b,k-1);      //容量足够装第k个物品，装或者不装，取较大值     return max(Max_Value(Weight-a[k-1],a,b,k-1)+b[k-1],Max_Value(Weight,a,b,k-1)); }

user: user-2
content: 下面函数无返回值 int max_value return后面参数传递错误 传递参数不要用a[] b[]直接a b
user-0 提问: TCP接收端如何判断文件接收结束

回复:
user: user-1
content: 引用 9 楼 wangying_great的回复:[quote=引用 8 楼 mengsofts 的回复:] 因为TCP是以数据流的方式发送数据的，没有边界。所以在发送和接受这里你要进行额外的设计，可以在第一次通信的时候把文件的长度传给客户端，在在客户端收到这么长数据的时候退出即可。  对对对，昨天看了一晚上，终于知道发送端这边的基本思路了。就是在发送文件内容之前，定义一个结构体，将文件数据，以及文件数据的长度，还有一些你自己想要的一些信息放在结构体中，一并发送给客户端。[/quote] 聪明，结构体至少应该包括文件名、文件大小和文件md5(用来检验)。

user: user-1
content: 聪明，结构体至少应该包括文件名、文件大小和文件md5(用来检验)。

user: user-0
content: 引用 8 楼 mengsofts 的回复:因为TCP是以数据流的方式发送数据的，没有边界。所以在发送和接受这里你要进行额外的设计，可以在第一次通信的时候把文件的长度传给客户端，在在客户端收到这么长数据的时候退出即可。  对对对，昨天看了一晚上，终于知道发送端这边的基本思路了。就是在发送文件内容之前，定义一个结构体，将文件数据，以及文件数据的长度，还有一些你自己想要的一些信息放在结构体中，一并发送给客户端。

user: user-1
content: 因为TCP是以数据流的方式发送数据的，没有边界。所以在发送和接受这里你要进行额外的设计，可以在第一次通信的时候把文件的长度传给客户端，在在客户端收到这么长数据的时候退出即可。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545  谢谢啦，虽然看的一知半解。哈哈

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

user: user-0
content: 引用 4 楼 adlay 的回复:客户端再请求文件可以再 connect 重新建立一条链接来呀 把传控制协议的通道和传数据的通道分开是最好的.  其实我也是这么做的，建立两条通道，一个请求文件，一个接收文件。但是整个大程序是在一个epoll的监听集合里(不是使用fork创建子进程的方式)，如果两条连接的话，就必须给这两条连接建立关联，而且连接变多的话，整个epoll程序会变复杂很多。所以我觉得可能只用一条连接，不用通过断开连接就能结束接收的话程序会变简单很多。

user: user-3
content: 客户端再请求文件可以再 connect 重新建立一条链接来呀 把传控制协议的通道和传数据的通道分开是最好的.

user: user-0
content: 这条连接不能关闭，因为在这个文件发送结束后，客户端可能还要继续请求文件，如果这条连接关闭了，客户端就不能继续请求文件了。

user: user-4
content: 一种办法是服务器发送结束就直接断开连接，但是如果还有其他业务需要通信这种办法不太靠谱； 另一种办法是，服务器先给客户端发送文件的大小，然后客户端通过这个大小自己决定何时结束；

user: user-3
content: 发送文件的一端发送完成后把 socket close 掉接收端的 recv 就会返回 0 了
user-0 提问: C语言新手求助，输出的数字非常大

回复:
user: user-1
content: 这个很正常，因为在内存中，double类型和int类型数据存储方式是不一样的。存放double类型的数据，以整型形式输出，这个值要看double数据在内存的二进制形式，然后用int类型解析。  既然定义的是double类型，还是用%lf输出吧

user: user-2
content: 输出语句错了，%d是输出整数，double应该用%lf输出

user: user-3
content: 最后一行printf %d 换成%f或%e
user-0 提问: c小白  求帮帮忙

回复:
user: user-1
content: struct Student {     int age;     float score;     char name[100]; };    /*少一个分号*/  代码没问题，编译的时候会提示一个错误，就是结构体声明的时候少一个分号；  #include <stdio.h> #include <malloc.h>  struct Student {     int age;     float score;     char name[100]; };  int main (void) {      int len;     struct Student * pArr;     int i;       //动态的构造一维数组     printf ("请输入学生的个数:\n");     printf ("len = ");     scanf ("%d", &len);      pArr = (struct Student *)malloc(len * sizeof(struct Student));      for (i=0; i<len; ++i)     {         printf ("请输入第%d个学生的信息：",i+1);         printf ("age = ");         scanf ("%d", &pArr[i].age);         printf ("name = ");         scanf ("%s", pArr[i].name);         printf ("score = ");         scanf ("%f", &pArr[i].score);     }     //输出     for (i = 0; i<len; ++i)     {         printf ("第%d个学生的信息:\n",i+1);         printf ("age = %d\n ", pArr[i].age);         printf ("name = %s\n", pArr[i].name);         printf ("score = %f\n", pArr[i].score);         printf ("\n");     }      return 0; }

user: user-2
content: VS2015+Windows10 64位 把scanf()改为scanf_s() scanf_s("%d", &pArr[i].age); scanf_s("%s", pArr[i].name, 100); scanf_s("%f", &pArr[i].score); 以下是输出结果

user: user-0
content: 谢谢帮助！！！
user-0 提问: Linux c画圆角矩形和填充圆角矩形的问题

回复:
user: user-1
content: 应该是浮点数的误差造成的吧

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

user: user-3
content: 如果代码没有问题 ，换一个电脑试试，之前画斜线的时候就遇到过，线不平滑，填充倒是没有遇到过； 而且有可能是你的填充空间不完全闭合，也可能有这种问题

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体出错的位置。” 的方法解决的。 填充时有漏点的问题，是什么原因导致的呢？
user-0 提问: c小白，在线等！！！！！

回复:
user: user-1
content: 可以使用sleep()函数，通过设置该函数的参数来控制输出时间间隔。sleep()函数的参数是间隔的时间，需要注意的是该参数的单位是毫秒，即sleep(500)相当于等待半秒钟。

user: user-2
content: sleep函数中的参数是秒，所以你500就会等很久，你是不是一开始想用usleep，它的参数是微秒

user: user-3
content: 你不是动用sleep函数了吗？你也可以采用时间函数进行控制

user: user-4
content: 时间间隔? 延时? sleep不可以么?
user-0 提问: if else语句，为什么就一直进不去else呢

回复:
user: user-1
content: sizeof(数组)  给出的是数组所占的字节数    循环判断条件改成sizeof(headsize) / sizeof(int) .

user: user-2
content: #include<stdio.h> #include<stdbool.h> int main(void) { char size[3][13] = { { '6','6','6','6','7','7','7','7','7','7','7','7' }, { '1','5','3','7',' ','1','1','3','1','5','3','7' }, { '2','8','4','8',' ','8','4','8','2','8','4','8' } }; int headsize[12] = {164,166,169,172,175,178,181,184,188,191,194,197}; float cranium = 0.0; int your_head = 0; bool hat_found = false; printf("请输入头的尺寸:"); scanf("%f", &cranium); your_head = (int)(8 * cranium); size_t i = 0; if (your_head == headsize[i]) hat_found = true; else { for (i = 1; i <12; i++) { if (your_head > headsize[i - 1] && your_head <= headsize[i]) { hat_found = true; break; } }  } if (hat_found) printf("your_head=%d,帽子尺寸是%c %c%c%c\n", your_head, size[0][i], size[1][i], (size[1][i] == ' ') ? ' ' : '/', size[2][i]); else { if (your_head < 164) printf("你输入的尺寸太小，没有适合你的帽子！\n"); else printf("你输入的尺寸太大，没有适合你的帽子！\n");  } return 0;  } 有问题吗?

user: user-2
content: 首先 size[3][12]中的12改成13
user-0 提问: c语言中，系统申请的内存空间不自动释放会出问题吗？

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-2
content: 2楼说的对，释放和清空是两种概念。 函数返回时，i的内容并没有改变，即i所指的地址没变。 传回去之后 pointer_i所指的地址与原i所指的地址没变。 因为本程序很简单，所以 pointer_i所指地址内的内容应该也没有改变。不过编译系统 会不会重新布置内存空间就不一定了。如果程序复杂 一点就不好说了。反正这是一个明显的“野指针”，这片内存区已经不属于你可控的了，编译器很可能下一次把这片内存区覆盖掉，自己编程是要杜绝此类情况的发生。

user: user-3
content: 这些是常量字符串是存在常量区，不在堆上，不需要清除，生成的EXE文件中本身就包含了这些常量，程序运行后将会加载到内存，整个程序运行过程中都会存在

user: user-4
content: 内存释放和清空不是同一个概念，实际上释放并不需要清空，只需要把这一块内存挂到空闲内存块链表中，就完成释放了，但这块内存中的值并没有变化，直到重新被分配并赋值。  如果你在函数结束时把一个局部变量的地址返回，很可能可以得到一个正确的结果，但也不一定，如果这块内存被其他函数使用了，它的值就会变化。我们让函数返回一个值，一般都是在调用处马上把返回值赋给另一个变量，语句执行完对该局部变量的引用也结束了，我们再引用该返回值，实际上是调用处的那块内存，所以是没有问题的。

user: user-5
content: "abc"和"efg"都是只读数据，在只读数据区存放。指针变量c是一个变量，它存放的是这两个字符串中一个的地址（同一时间只能存放一个字符串的地址）。这两个字符串在只读数据段的不同位置，所以当变量c指向"efg"时，并不是"efg"覆盖了"abc"，所以c存放的地址值也是不一样的。

user: user-6
content: 其实不是这样的，字符串和其他常数都是代码段，连全局变量都不是，没有开辟过内存，是直接跟着代码按照导入规则从文件复制过去的，所有常数都这样。。 给你举个例子，甚至会出现类似的代码 0001  ADD XXX,XXX 0003  J  0004 0002  abc 0004 MOV  R1,002H a这就是常数，他的地址就在代码里了，这东西本身就是程序代码，程序代码有没有内存，当然有，但是你从来没申请过他，在你导入进程时就存在。
user-0 提问: C++文件中用了fopen，fwrite，fclose但是程序运行完以后文件内容仍未改变

回复:
user: user-0
content: 引用 4 楼 cfjtaishan 的回复:因为rb是只读二进制形式打开文件，所以不能写成功；建议使用rb+形式打开文件，这样文件就可以读也可以写了。确实应该以rb+打开，不过还有一个莫名其妙的毛病就是，文件内部的指针会莫名奇妙跑偏，ftell获取到的位置明明是对的，可是读和写的时候就不知道指到哪里去了，后来发现用ftell的返回值，fseek(fp, ftell(fp), SEEK_CUR)一下，再读或写就是对的了，这又是什么毛病

user: user-1
content: 你是以二进制的方式写入的,  所以人无法识别其中的内容, 如果人要查看其中的内容, 请不要使用二进制方式打开文件

user: user-2
content: 我也顶4楼，

user: user-3
content: 引用 4 楼 cfjtaishan 的回复:因为rb是只读二进制形式打开文件，所以不能写成功；建议使用rb+形式打开文件，这样文件就可以读也可以写了。顶一个

user: user-4
content: 顶楼上

user: user-5
content: 因为rb是只读二进制形式打开文件，所以不能写成功；建议使用rb+形式打开文件，这样文件就可以读也可以写了。

user: user-6
content: 打开的时候模式对不？

user: user-0
content: 引用 1 楼 ckc 的回复:搞错了文件名不大可能吧，文件名错了连文件都打不开，我这里文件是打开成功的，也能在调试的时候从文件指针那里看到里面内容的改变，就是程序运行完后再打开文件看内容没有变

user: user-7
content: 搞错了文件名

user: user-8
content: 骗个分 r 打开只读文件，该文件必须存在。  r+ 打开可读写的文件，该文件必须存在。  w 打开只写文件，若文件存在则文件长度清为0，即该文件内容会消失。若文件不存在则建立该文件。  w+ 打开可读写文件，若文件存在则文件长度清为零，即该文件内容会消失。若文件不存在则建立该文件。  a 以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。  a+ 以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。  上述的形态字符串都可以再加一个b字符，如rb、w+b或ab＋等组合，加入b 字符用来告诉函数库打开的文件为二进制文件，而非纯文字文件。 所以楼主应该以r+b模式打开文件。
user-0 提问: 请问我这个密码输入3次错误有什么问题，为什么一调试就停止工作

回复:
user: user-1
content: 引用 3 楼 zhun12078 的回复:好的，我把scanf改成gets就可以了，谢谢了 使用gets不安全，建议使用fgets，同时注意检查'\n'输入到缓存里。

user: user-0
content: 好的，我把scanf改成gets就可以了，谢谢了

user: user-2
content: 引用 楼主 zhun12078 的回复:#include<stdio.h> #include<string.h> int main() { 	char mima[10] = "zyqzyq"; 	char input[10] = {0}; 	int i = 0; 	printf("欢迎使用本系统，请输入密码："); 	for (i = 0;i < 3;i++) 	{ 		scanf_s("%s", input); 		if (strcmp(mima, input) == 0) 		{ 			break; 		} 		else 		{ 			printf("密码错误，请重新输入!"); 		} 	} 	if (i == 3) 		printf("退出系统\n"); 	else 		printf("登陆成功\n"); 	return 0; }scanf_s用法有问题，看看msdn吧 Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or string control sets that are enclosed in []. The buffer size in characters is passed as an additional parameter immediately following the pointer to the buffer or variable. For example, if you are reading a string, the buffer size for that string is passed as follows:  char s[10];  scanf_s("%9s", s, _countof(s)); // buffer size is 10, width specification is 9  The buffer size includes the terminating null. You can use a width specification field to ensure that the token that's read in will fit into the buffer. If no width specification field is used, and the token read in is too big to fit in the buffer, nothing is written to that buffer.

user: user-3
content: scanf_s 换成std::cin
user-0 提问: c小白，求大神指教，在线等！！！

回复:
user: user-1
content: 或 只需要满足一个条件 与 需要满足所有条件

user: user-0
content: 为什么不是”或“

user: user-2
content: if(i!='m' && i!='M' && i!='F' &&　i!='f')
user-0 提问: 大佬们，帮我看看这个程序为什么会出现段错误

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:pfile = (FILE*)filename; if (!fopen(pfile, "w"))  改成：  pfile = fopen(filename, "w") if (!pfile) 不好意思，点错了。 我明白了，谢谢

user: user-1
content: pfile = (FILE*)filename; if (!fopen(pfile, "w"))  改成：  pfile = fopen(filename, "w") if (!pfile)

user: user-0
user-0 提问: 请对我写的这两个gainint和Getchar函数提出建设性的改进意见 谢谢

回复:
user: user-1
content: 可以用动态数组 程序限制有点多 必须先小后大 可以直接输入两个数字判断 变量l可以删掉 主程序一直循环 给个跳出条件比较好 楼上讲到的 intint 和下面的returnreturn 以上是一些不成熟的意见 最后说一句 看了楼主的博客感觉楼主算法搞的不错哟

user: user-0
content: 就是对输入的检验 这个intint charchar我也不清楚是怎么回事 但是在我原来的代码里是int 和 char

user: user-0
content: 我是让你们看函数 不是看我的主函数 不要偏离主题

user: user-0
content: 我的这个输入字母也没问题啊。。。

user: user-2
content: 这样实现还不够完善，起码缺少对scanf的返回值判断和校验。你不能保证每个使用你的程序的人都按照你的想法或者要求去输入数据。比如你要输入int类型，但是若输入字母怎么办？所以为了严谨起见，建议加上返回值的判断。

user: user-3
content: 其实我没看懂你是想做啥

user: user-3
content: int gainint(intint *p,int a,int b);
user-0 提问: 求教求教！！请问我自己用C设置的SVGA 0X105模式 可不知道颜色对应的数字

回复:
user: user-1
content: 一图胜过千言！ 自赞一下！

user: user-2
content: 谢谢谢谢啦

user: user-3
content: SVGA256色模式，所使用的是索引颜色表（即一个数字对应一种颜色），值是从0x00到0xFF，你可以写一个绘制矩形的函数，然后设置不同的颜色，绘制出256不同颜色的矩形(小的矩形，同屏幕上一起显示即可)，之后根据颜色，再给每个整数取一个颜色名称，以方便使用。

user: user-1
user-0 提问: 字体颜色一加就提示错误

回复:
user: user-1
content: 支持VC++6.0，我一直都用它！

user: user-2
content: 少了个头文件  #include <stdlib.h>

user: user-3
content: 什么问题? 我的编译器一切正常vs 2008

user: user-4
content: #include <stdlib.h>

user: user-5
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

user: user-6
content: 提示什么错误？

user: user-7
content: system 是在stdlib.h这个头文件里的，加上stdlib.h就好了。 #include <stdio.h> #include <malloc.h> #include<stdlib.h> int main() { system("color F5");  printf("nihao"); getchar(); return 0; }
user-0 提问: 随机生成多个数独的程序问题

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:把srand放在main开头啊哈哈，我刚才也是这么做的，成功了，过来一看确实是这样，谢谢拉

user: user-1
content: 引用 2 楼 Love_Irelia97 的回复:[quote=引用 1 楼 user-1 的回复:] srand在哪里？  不能放在循环体内以及循环体内的函数内，因为代码执行速度很快，即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。 void sudoku_algorithm(int a[10][10]) { 	srand((unsigned)time(NULL)); 	//sudoku_print(a); 			 	for (int row = 1; row <= 9; row++) 	{ 		int fail_times = 0;					//	寻找当前行的解的次数 		for (int col = 1; col <= 9; ) 		{ 			if(fail_times > 1000)			//	寻找次数超过1000次，重置本行和上一行的元素为0 			{ 				for (int i = 1; i <= 9; i++) 				{ 					a[row][i] = 0; 					a[row-1][i] = 0; 				} 				row -= 2;		//	因为循环开头会+1，故此处先-2 				break;			//	重新寻找上一行的解 			} 			 			bool flag = sudoku_test(a, row, col);	//	判断a[row][col]是否能填数 			if(!flag) 			{ 				col = 1; 				fail_times++; 				continue; 			} 								 			int  rand_num = rand() % 9 + 1;	//	随机数1 ~ 9  			bool flag1 = sudoku_row(a, row, col, rand_num);	//	判断行约束 			if (!flag1) 				continue;  			bool flag2 = sudoku_col(a, row, col, rand_num);	//	判断列约束 			if (!flag2) 				continue;  			bool flag3 = sudoku_mod(a, row, col, rand_num);	//	判断模块（宫）约束 			if (!flag3) 				continue;  			a[row][col++] = rand_num; 		} 		//	For Debug	//  		/* 		for (int i = 1; i <= 9; i++) 			printf("%d ", a[row][i]); 		printf("\n"); 		*/ 	} }  放在这里，那么有没有什么解决方法呢[/quote]  把srand放在main开头啊

user: user-0
content: 引用 1 楼 user-1 的回复:srand在哪里？  不能放在循环体内以及循环体内的函数内，因为代码执行速度很快，即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。 void sudoku_algorithm(int a[10][10]) { 	srand((unsigned)time(NULL)); 	//sudoku_print(a); 			 	for (int row = 1; row <= 9; row++) 	{ 		int fail_times = 0;					//	寻找当前行的解的次数 		for (int col = 1; col <= 9; ) 		{ 			if(fail_times > 1000)			//	寻找次数超过1000次，重置本行和上一行的元素为0 			{ 				for (int i = 1; i <= 9; i++) 				{ 					a[row][i] = 0; 					a[row-1][i] = 0; 				} 				row -= 2;		//	因为循环开头会+1，故此处先-2 				break;			//	重新寻找上一行的解 			} 			 			bool flag = sudoku_test(a, row, col);	//	判断a[row][col]是否能填数 			if(!flag) 			{ 				col = 1; 				fail_times++; 				continue; 			} 								 			int  rand_num = rand() % 9 + 1;	//	随机数1 ~ 9  			bool flag1 = sudoku_row(a, row, col, rand_num);	//	判断行约束 			if (!flag1) 				continue;  			bool flag2 = sudoku_col(a, row, col, rand_num);	//	判断列约束 			if (!flag2) 				continue;  			bool flag3 = sudoku_mod(a, row, col, rand_num);	//	判断模块（宫）约束 			if (!flag3) 				continue;  			a[row][col++] = rand_num; 		} 		//	For Debug	//  		/* 		for (int i = 1; i <= 9; i++) 			printf("%d ", a[row][i]); 		printf("\n"); 		*/ 	} }  放在这里，那么有没有什么解决方法呢

user: user-1
content: srand在哪里？  不能放在循环体内以及循环体内的函数内，因为代码执行速度很快，即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。
user-0 提问: 关于c语言的声音识别问题。

回复:
user: user-1
content: 语音识别出来贪吃蛇早撞墙了（意思控制不灵敏），不现实。

user: user-0
content: 额，我是说在贪吃蛇已经弄出来的情况下，重点是语音的识别问题

user: user-2
content: 想法很完美，现实很骨感，可以先做的键盘控制贪吃蛇，然后通过识别语言，识别语言后转换成键盘，一步步来。

user: user-3
content: 这个用C语言来实现，恐怕不好弄吧；想法很好，实现起来不是很简单。  做好一个贪吃蛇这是一个问题（大问题），语音识别这是一个大问题，语音输入，语音辨别，控制贪吃蛇的方向。 可以从这几块去查找资料，也可以继续细化一下模块。

user: user-4
content: 对接百度语音识别吧。ai.baidu.com

user: user-5
content: "上右下左上右下左上右下左......"
user-0 提问: c语言负数输出问题

回复:
user: user-1
content: 整数，浮点数在计算机中以补码形式存储，printf()函数是以原码输出吗？ 列： #include <stdio.h> void main() { 	short x; 	x=54278; 	printf("%d\n",x); } 输出为-11258

user: user-2
content: 引用 6 楼 qq_30573461 的回复:[quote=引用 1 楼 kaijkl 的回复:] 参照http://blog.sina.com.cn/s/blog_8b745a5f01016uma.html没有用，看了一眼若要输出负数得用%hhd  引用 4 楼 cfjtaishan 的回复:输出的值是负值还是正值跟你的输出格式有关，想输出-7，但是输出的是一个大的正值，需要看一下你是以什么格式输出的问题解决了，但是出现一个新的问题，负数的浮点该怎么计算，例-7*1.000/1000，是-0.007还是别的数。[/quote] 浮点数跟精度有关系，理论值和实际计算机计算出来的值可能有差距，尤其是小数点第7位

user: user-0
content: 引用 1 楼 kaijkl 的回复:参照http://blog.sina.com.cn/s/blog_8b745a5f01016uma.html没有用，看了一眼若要输出负数得用%hhd  引用 4 楼 cfjtaishan 的回复:输出的值是负值还是正值跟你的输出格式有关，想输出-7，但是输出的是一个大的正值，需要看一下你是以什么格式输出的问题解决了，但是出现一个新的问题，负数的浮点该怎么计算，例-7*1.000/1000，是-0.007还是别的数。

user: user-3
content: 贴代码…………

user: user-2
content: 输出的值是负值还是正值跟你的输出格式有关，想输出-7，但是输出的是一个大的正值，需要看一下你是以什么格式输出的

user: user-0
content: 引用 1 楼 kaijkl 的回复:参照http://blog.sina.com.cn/s/blog_8b745a5f01016uma.html没有用，看了一眼若要输出负数得用%hhd

user: user-4
content: keil没用过。在C语言中，输出不同格式的数字可以用printf函数实现。

user: user-5
content: 参照http://blog.sina.com.cn/s/blog_8b745a5f01016uma.html
user-0 提问: 调试在输入学号后中段，运行必须输入两个学号才能继续执行？

回复:
user: user-1
content: int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束，并返回*p的位数           {                do{                   *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见             scanf("%d",p);                   while(getchar()!='\n');                   if(*p>b||*p<a)                       printf("输入有误,请重新输入[%d--%d]:",a,b);               }while(*p>b||*p<a);               return *p;           }   int Getchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度         {             int B,C;        do{                 A[max]=B=C=0;             while((A[B++]=getchar())!='\n'&&B<max);             if(A[B-1]!='\n')while(getchar()!='\n'&&++C);                 else A[--B]=0;          if(C||B&&B<min)            printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);             }while(C||B<min);             return B;       }  给你两个函数 提高程序的健壮性

user: user-2
content: scanf("%s\n", p->num);  改成：  scanf("%s", p->num);  \n属于空白符，最后输入的那个非（空格、制表符、回车）的东西是不会被这个scanf读进来的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束

user: user-3
content: 把scanf里的\n去掉
user-0 提问: 一个很懵的情况，关于system()函数

回复:
user: user-1
content: 引用 6 楼 wwww200808008 的回复:[quote=引用 2 楼 lq951114 的回复:] [quote=引用 1 楼 wwww200808008 的回复:] 有可能是权限问题。你用管理者权限运行试试。 管理员运行也还是一样的情况[/quote]  帮你在我电脑试了一下，debug调试没有问题。自己点exe启动也没有问题。 int _tmain(int argc, _TCHAR* argv[]) { 	system("shutdown -s -t 1200"); 	exit(0); 	return 0; } [/quote]  刚刚在试着把程序名字改成shutdown.exe 发现不会自动退出。所以可能是你的程序名和系统的shutdown.exe冲突导致。

user: user-1
content: 引用 2 楼 lq951114 的回复:[quote=引用 1 楼 wwww200808008 的回复:] 有可能是权限问题。你用管理者权限运行试试。 管理员运行也还是一样的情况[/quote]  帮你在我电脑试了一下，debug调试没有问题。自己点exe启动也没有问题。 int _tmain(int argc, _TCHAR* argv[]) { 	system("shutdown -s -t 1200"); 	exit(0); 	return 0; }

user: user-0
content: 引用 7 楼 wwww200808008 的回复:[quote=引用 6 楼 wwww200808008 的回复:] [quote=引用 2 楼 lq951114 的回复:] [quote=引用 1 楼 wwww200808008 的回复:] 有可能是权限问题。你用管理者权限运行试试。 管理员运行也还是一样的情况[/quote]  帮你在我电脑试了一下，debug调试没有问题。自己点exe启动也没有问题。 int _tmain(int argc, _TCHAR* argv[]) { 	system("shutdown -s -t 1200"); 	exit(0); 	return 0; } [/quote]  刚刚在试着把程序名字改成shutdown.exe 发现不会自动退出。所以可能是你的程序名和系统的shutdown.exe冲突导致。[/quote]  多谢了，还真是和系统的shutdown冲突了，太感谢了

user: user-2
content: 在vs，windows系统没有问题。

user: user-3
content: shutdown -s -t 1200：这条命令是延迟20分钟关闭计算机。这条命令执行需要20分钟后，才会启动关闭计算机，所以不会立马执行

user: user-4
content: 不要用 void main  main里没有这个用法

user: user-0
content: 引用 1 楼 wwww200808008 的回复:有可能是权限问题。你用管理者权限运行试试。 管理员运行也还是一样的情况

user: user-1
content: 有可能是权限问题。你用管理者权限运行试试。
user-0 提问: c类型的结构体转成c#的结构体，请大神指导。。。

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

回复:
user: user-1
content: 仅供参考：#include <stdio.h> unsigned short int ui;   signed short int si; int main() { 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=ui>>1; 	si=si>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	printf("--------------\n"); 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=((  signed short	int)ui)>>1; 	si=((unsigned short	int)si)>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	return 0; } //ui=32768 //si=-32768 //ui=16384 //si=-16384 //-------------- //ui=32768 //si=-32768 //ui=49152 //si=16384

user: user-2
content: 第四行靠运气了哈哈哈

user: user-3
content: 水点积分下载东西，楼主莫怪

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

user: user-4
content: int v;  v没有初台化, 你的平台估计自动初台化为0了, 你运气好.  如果给你初始化个随机数, 你看起会更诡异.  然后因为int是4字节, 你只设置了低字节, 并且成了正数, 那么说明, 你这个是小端的.   类似于变成 0x0000fff9   对于int, 他就是一个正数啊. 并不是你想的 -7.

user: user-5
content: 第四行，这样赋值可以编译通过吗

user: user-6
content: 什么问题? 我的编译器一切正常vs 2008

user: user-7
content: wugonggonglv = (char*)&v; wugonggonglv[0] = k_buf[1]; 这里之后，v应该变为 k_buf[1]的负数值了。 比如 k_buf[1] = 0x01,那么v = -255. 这样的话，后面的运算自然不对了。
user-0 提问: C语言菜鸟求助，大神预编译头怎么用？［图］

回复:
user: user-1
content: 什么问题? 我的编译器一切正常vs 2008

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

user: user-3
content: #include <stdio.h>，不是这样吗？
user-0 提问: 新手求问再C语言中怎样输出汉字

回复:
user: user-1
content: #include<stdio.h> main(void) { char a[10]; scanf("%s",a); printf("你好"); }

user: user-0
content: 引用 1 楼 user-2 的回复:#include<stdio.h> int main(void) { 	char a[7]="你好"; 	scanf("%*s",a); 	printf("%s\n",a); 	return 0; }真的可以，多谢！

user: user-2
content: #include<stdio.h> int main(void) { 	char a[7]="你好"; 	scanf("%*s",a); 	printf("%s\n",a); 	return 0; }
user-0 提问: 求大神教TLV格式 C语言

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

user: user-0
content: 希望可以有一个用TLV格式写的C语言代码模板可以参考。

user: user-2
content: 什么问题? 我的编译器一切正常vs 2008
user-0 提问: 获得线性表元素的操作小问题

回复:
user: user-1
content: 形参e也叫传出参数，即它要从该函数里的得到值，所以它是接收一个地址值，这个地址可能是调用函数里定义的普通变量。调用函数后，就能通过这个参数得到一个值。

user: user-1
content: 这两个是不一样的，这儿是想获取第i个值，而不是获取它的地址。再说你传递给这个函数的实参（给e）也不是一个指针，而是一个变量的地址。

user: user-2
content: 调用此函数时，把一个变量的地址传进来，此时，形参e 也指向这个地址，函数里，通过间接访问，修改这个地址里存放的内容，因为形参和指向的是变量的地址，所以，会影响变量的值，但是，如果修改了形参e的指向，仅仅是在调用函数时改变了形参的指向。并没有影响到变量的值

user: user-3
content: 引用 1 楼 jianwen0529 的回复:e是指针值，在传入函数时候，函数中会拷贝它的一个临时副本，假设为 _e，在函数中使用的e实际上是 _e这个副本。 所以为什么说传值引用（此处更正为值传递）不会影响到实参了，因为所有的修改都是建立在这个临时的副本身上的。

user: user-3
content: e是一个指针，*用在指针的左边，是一个解引用操作符，效果是取该指针所执行的对象（值） 之后赋值给该对象，即重写e指向的内存  e=&L.data[i-1]是赋值给e，让e指向了L.data[i-1]的内存 但是这种做法会发生逻辑错误，此处解释下。  e是指针值，在传入函数时候，函数中会拷贝它的一个临时副本，假设为 _e，在函数中使用的e实际上是 _e这个副本。 所以为什么说传值引用不会影响到实参了，因为所有的修改都是建立在这个临时的副本身上的。  而这个函数是直接修改e（这个也是临时副本）所指向的内存，但是因为e和临时副本的指针值是一致的，所以找到的内存也是同一块地方，间接地影响了e（严格来说是e所指向的内存），就可以当作返回值使用。   //经过编译器处理后的代码类似如下 status GetElem(SqList L,int i,ElemType *e)//获得元素的操作线性表L第i个数据的值，并用e返回 {     SqList __GetElem_L = L;     int __GetElem_i = i;     ElemType *__GetElem_e = e;      if(__GetElem_L.length==0||__GetElem_i<1||__GetElem_L.length)         return ERROR;     *__GetElem_e=__GetElem_L.data[__GetElem_i -1];//这句不太理解不应该是 e=&L.data[i-1]吗         return OK; }
user-0 提问: 已自定义SIGINT处理函数，为什么ctrl+c 仍不能终止程序执行？

回复:
user: user-0
content: @laoqiang0910 , 就是按ctrl+c 预期是进程终止，实际终止不掉。 你说的没问题是指什么？

user: user-1
content: 什么问题? 我的编译器一切正常vs 2008

user: user-2
content: 在不知道谁调用的语句处设置断点，中断在断点处时，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 是不是可以这样理解：    进程收到SIGINT 信号， --> 调用sig_cancel函数处理，而该函数通过调用kill 对该进程再次发送SIGINT信号， -->   进程收到SIGINT 信号， --> 调用sig_cancel函数处理，而该函数通过调用kill 对该进程再次发送SIGINT信号， -->  .....      这样死循环了， 对吧？
user-0 提问: 高手大佬帮忙，求有向图中所有最小的简单环

回复:
user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:《算法精解（C语言描述）》  给本书是什么意思呢？让去看书吗。

user: user-0
content: 引用 8 楼 laoqiang0910 的回复:什么问题? 我的编译器一切正常vs 2008   你说的和我的是一个问题吗？

user: user-1
content: 什么问题? 我的编译器一切正常vs 2008

user: user-0
content: 发本书您是什么意思？

user: user-2
content: 《算法精解（C语言描述）》

user: user-3
content: 数据结构中有向图问题。

user: user-0
content: 其实要求的环应该满足：环自身的顶点集合的子集不能在构成其他的环

user: user-0
content: 对，是数据结构里面图论的东西

user: user-0
content: 但我的需求就是如题啊，要找所有简单环并且这些简单环的节点集合是最小的，包含任一这些节点集合的大的节点集合构成的环，都要剔除

user: user-4
content: 本来就指数级的规模，我100个点都能把你撑爆： 1->2->3 1->3 这样的一个有向三角形拿50个头尾相连构成一个圈。总共2^50个圈而且互不包含。  这种时候必须是改需求啊
user-0 提问: 输出出问题了

回复:
user: user-1
content: 对于浮点型数据的定义： long double s=1.0； 其他没什么问题，vc6.0 完美通过 还有就是，如果你要进行的是阶乘的运算的话，不必要定义浮点型，整型就ok了！ 阶乘代码：  #include<stdio.h> #include<stdlib.h> int main() {     int n,num=1,i; 	if(scanf("%d",&n)!='EOF') 	{ 		for(i=1;i<=n;i++) 		{ 			num*=i; 		} 	} 	printf("%d",num); 	return 0; }

user: user-2
content: VS2015+Windows10 64位 把scanf()该为scanf_s()后，没有问题，以下是输出

user: user-3
content: Format Specification Fields: printf and wprintf Functions     This topic describes the syntax for format specifications fields, used in printf, wprintf and related functions. More secured versions of these functions are available, see printf_s, _printf_s_l, wprintf_s, _wprintf_s_l. For details on the individual functions, see the documentation for those specific functions. For a complete listing of these functions, see Stream I/O.  A format specification, which consists of optional and required fields, has the following form:  %[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type  Each field of the format specification is a single character or a number signifying a particular format option. The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign is followed by a character that has no meaning as a format field, the character is copied to stdout. For example, to print a percent-sign character, use %%.  The optional fields, which appear before the type character, control other aspects of the formatting, as follows:  type Required character that determines whether the associated argument is interpreted as a character, a string, or a number (see the "printf Type Field Characters" table in printf Type Field Characters).  flags Optional character or characters that control justification of output and printing of signs, blanks, decimal points, and octal and hexadecimal prefixes (see the "Flag Characters" table in Flag Directives). More than one flag can appear in a format specification.  width Optional number that specifies the minimum number of characters output (see printf Width Specification).   precision Optional number that specifies the maximum number of characters printed for all or part of the output field, or the minimum number of digits printed for integer values (see the "How Precision Values Affect Type" table in Precision Specification).  h| l| ll| I| I32| I64 Optional prefixes to type-that specify the size of argument (see the "Size Prefixes" table in Size and Distance Specification).  Security Note:  Ensure that format specification strings are not user-defined. For example, consider a program that prompts the user to enter his name and stores the input in a string variable called name. To print name, do not do this:     Copy Code  printf( name ); // Danger!  If name contains "%s", program will crash   Note:  Instead, do this:     Copy Code  printf( "%s", name );

user: user-4
content: 顶楼上，无问题

user: user-5
content: printf（“%d”,a）;

user: user-6
content: 什么问题? 我的编译器一切正常vs 2008

user: user-7
content: long double输出需要用%llf 因为lf只是double的输出格式，long double是llf输出格式了。

user: user-8
content: %Lf 这个格式输出试试
user-0 提问: 大神帮忙看看我这代码，输入回车没反应

回复:
user: user-1
content: printf("even is %d,average is %d,odd is %d,ave is %d", even, aven / even, odd, avodd / odd);。。aven / even, odd, avodd / odd这俩货除数可能为0 。而且一般用到除法可能会出现小数，前面%d最好用%f

user: user-2
content: 0是退出条件，输出结果有可以被零除。

user: user-3
content: printf语句可能存在0/0非法。。。。
user-0 提问: 新人求助：字符指针读取字符串问题出现第一机会异常问题。

回复:
user: user-1
content: 问题楼上都说了，首先指向字符串最后一个字符，减1即可，其次用来交换的应该是字符而不是字符指针，第三点，输入参数是字符串常量，无法被改变。

user: user-2
content: #include "stdafx.h" #include <stdio.h> #include <string.h> #include<stdlib.h>  void reverse(char* str) {     char temp, *p, *q; int i;    /*temp定义成字符类型即可。*/     p = str;     q = p + strlen(str) - 1;   /*减1就好，因为最后只有一个'\0'，下表是从0开始。*/     for (i = 0; i< strlen(str) / 2; i++){         temp = *p;         *p = *q;         *q = temp;         p++; q--;     } }   int _tmain(int argc, _TCHAR* argv[]) {     char str[] = "hello";   /*需要定义成数组，否则是字符串常量是不能修改的，所以调用reverse会导致段错误*/     printf("%s\n",str);      reverse(str);     printf("%s\n", str);     //system("pause");      return 0; } 三处问题，详见以上代码

user: user-0
content: O(∩_∩)O谢谢楼上问题已经解决了，我回去也改了两个地方，就是把它做成常量了，谢谢

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

user: user-4
content: temp指向NULL,所以错误，可以用malloc申请空间，还有，那个应该是-1才对

user: user-5
content: 1,、将char *temp修改为char temp，后边*temp都为temp； 2、将char*str="hello"修改为char str[6] = "hello"
user-0 提问: c语言新手求助大佬

回复:
user: user-1
content: 引用 3 楼 qq_40088982 的回复:大神们太厉害了，问一下int long和int short分别怎么用 建议查一下这个楼主的博客； http://blog.csdn.net/u012223913/article/details/51181761

user: user-2
content: 大神们太厉害了，问一下int long和int short分别怎么用

user: user-1
content: //删除学生信息 void DeleteStuDate(PNODE pNode); //修改学生信息 void ReviseStuDate(PNODE pTemp); 函数声明需要添加参数，至少参数的类型需要加。  void ReadStuDate() {     char stubuf[30] = { 0 };     char stunum[10] = { 0 };     char stuname[10] = { 0 };     char stuscore[10] = { 0 };     FILE* pFile = fopen("StuDate.txt", "rb+");     int nCount = 0;     int j = 0;      if (NULL == pFile)     {         printf("文件打开失败\n");         return;     }     else     {         printf("读取成功\n");    /*这儿还没开始读呢*/     }     //操作文件指针     while ( NULL!=fgets(stubuf, 30, pFile))    /*这儿应该去掉分号*/     {         int i = 0;         nCount = 0;         j = 0;         for (i = 0; stubuf[i] != '\n'; i++)   /*此处应该是'\n'，而不应该是'\r'*/         {             //没到点             if (0 == nCount)             {                 stunum[i] = stubuf[i];                 if ('.' == stubuf[i])                 {                     stunum[i] = '\0';                     nCount++;                 }             }             //第一个点             else if (1 == nCount)             {                 stuname[j] = stubuf[i];                 j++;                 if ('.' == stubuf[i])                 {                     stuname[j] = '\0';                     nCount++;                     j = 0;                 }             }             else             {                 stuscore[j] = stubuf[i];                 j++;             }         }         //插入到链表         AddStuMsg(stuname, stunum, atoi(stuscore));     }     fclose(pFile); } 回车符应该是'\n'

user: user-3
content: while ( NULL!=fgets(stubuf, 30, pFile));  加了分号，就等着读到最后一行后，再执行下面的语句吧。
user-0 提问: 求大神帮我看下下面这个递归和迭代那个快啊

回复:
user: user-1
content: 迭代效率高，计算机就是喜欢做重复性的工作

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

user: user-3
content: 通常迭代比较快，递归每次调用函数需要压栈出栈等有开销

user: user-4
content: 迭代快一点       参数不大的话差不多

user: user-5
content: 用性能检查工具看 一般来说一点差距没有任何意义，只有算法的改进和掉用量巨大的方法才有价值 pow的话用矩阵可以把复杂度降为logn
user-0 提问: 架构师怎么学

回复:
user: user-1
content: 架构师更多是实际的项目经验，现在只有理论知识的架构师不存在吧。 所以，不断提高自己的项目经验，解决问题的经验，才能一步步向架构师靠拢

user: user-2
content: 先是学基础.   各种语法, 算法,开源库, 开源框架    然后是总结 然后在工作中实践 积累.

user: user-3
content: 这不仅仅是学的结果，还是项目经验积累的结果。因为几乎没有一个大项目是仅仅只用一门技术去实现的。  架构师对很多技术都应该是熟悉的，精通其中某个或多个领域。 在架构程序的时候选择什么样的架构，什么算法，什么技术。 对性能有一定的把控，对未来的扩展有一定程度的支持。  我只能说出我自己理解的架构师。

user: user-4
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……
user-0 提问: 内存泄漏

回复:
user: user-1
content: 引用 3 楼 cfennudezhanche的回复:意思是free(tmp),,,,,就可以释放掉p所申请的内存空间吗? 理论上可以 都指向那片空间 释放谁都可以

user: user-2
content: 引用 3 楼 cfennudezhanche 的回复:意思是free(tmp),,,,,就可以释放掉p所申请的内存空间吗? 可以，因为tmp也指向了funcA所申请的内存； 也可以在funcA函数内直接释放（前提是不再使用该内存空间） 在funA中，直接free(p);  另外，你的memcpy函数缺少参数，需要3个参数，而调用的时候只提供了2个

user: user-0
content: 意思是free(tmp),,,,,就可以释放掉p所申请的内存空间吗?

user: user-1
content: 释放接受改参数的变量

user: user-3
content: malloc 对应 free  只需在需要释放的地方调用free即可.
user-0 提问: 关于数据查找的问题，求指教

回复:
user: user-1
content: 注意，110D这个不是十进制也不是16进制。因此，要么定义成16进制，但是需要加0x，要么去掉D，作为一个10进制。

user: user-1
content: #include<stdio.h> #include<string.h>  typedef unsigned short int16u;  typedef struct {     char *company;     int16u code;  }Manufacturer_Code_t;  int searchCompany(Manufacturer_Code_t *parr, int16u len, int16u code0);  int main(void) {     Manufacturer_Code_t Manufacturer_Code[]={{"2_Save_Energy_Ltd", 110}};     int16u idx, len, code;      len = sizeof(Manufacturer_Code) / sizeof(Manufacturer_Code[0]);     printf("size = %d, %d, %d\n", len, sizeof(Manufacturer_Code), sizeof(Manufacturer_Code[0]));     //scanf("%d", &code);     scanf("%hu", &code);     idx = searchCompany(Manufacturer_Code, len, code);     if (idx < len) {         printf("%s\n", Manufacturer_Code[idx].company);     } else {         printf("Can't find it!\n");     }     if (idx )     return 0; }   int searchCompany(Manufacturer_Code_t *parr, int16u len, int16u code0) {     int i;      for (i = 0; i < len; i++) {         if (parr[i].code == code0)             return i;     }      return i; }

user: user-2
content: 仅供参考：#include<stdio.h> #include<string.h>    typedef struct  {  	char *company;  	int16u code;  }Manufacturer_Code_t;  char* searchCompany(int16u code0)  char* searchCompany(Manufacturer_Code_t mmc, int16u code0) { 	if(mmc[0].code == code0){ 		return Manufacturer_Code[0].company; 	} 	return null; }  int main() { 	Manufacturer_Code_t Manufacturer_Code[]={{"2_Save_Energy_Ltd", 110D}};  	char* company = searchCompany(Manufacturer_Code, 110D); 	printf("%s\n", company); 	return 0; }
user-0 提问: 从文件中读取数据求平均值和最大最小值，真的搞不懂了，可以单独弄一个模块查看吗

回复:
user: user-1
content: 引用 3 楼 qq_40034595 的回复:大神！！求的是图书价格的平均值和最大最小值 可以仿照上面的demo写一个函数。

user: user-0
content: 大神！！求的是图书价格的平均值和最大最小值

user: user-1
content: 引用 1 楼 qq_40034595 的回复:真的弄不了了 代码是图书管理系统，你的要求是求平均值和最大最小值，好像不搭。 你要读取的数据格式，说一下。求平均值应该不难，最大值和最小值，遍历求解。 以下是一个demo程序，求最大值，最小值和平均值： #include <stdio.h>  int get_avr_value(int *arr, int len, int *pmax, int *pmin);  int main(void) {     int arr[] = { 10, 45, 67, 80, 38};     int size = sizeof(arr)/sizeof(arr[0]);     int max, min, avr;      avr = get_avr_value(arr, size, &max, &min);     printf("avr = %d, max = %d, min = %d\n", avr, max, min);     return 0; }   int get_avr_value(int *arr, int len, int *pmax, int *pmin) {     int avr, sum;     int i;      *pmax = *pmin = arr[0];     sum = arr[0];     for (i = 1; i < len; i++) {         if (*pmax < arr[i])             *pmax = arr[i];         if (*pmin > arr[i])             *pmin = arr[i];         sum += arr[i];     }     avr = sum / len;     return avr; }

user: user-0
content: 真的弄不了了
user-0 提问: 在用枚举法求解八皇后问题时遇到了问题

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }

user: user-0
content: 今早打开继续解决问题，发现judge写成jungle,就将错就错吧

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

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }  老师，你的代码简洁可行，但是queen8把0给传进去，那这个if（8 == L） 不是永远没办法是true吗，还有我特想知道我的代码逻辑错误出在哪儿了，第一次写程序。
user-0 提问: 链表的插入排序

回复:
user: user-0
content: 我会了    谢谢各位

user: user-1
content: r用以保存上次满足条件指针，不满足了，就插入r后

user: user-2
content: 建议单步跟踪程序运行，观察变量变化情况，比你空想容易懂&& 运算符当左边操作数为假的时候不会执行右边所以q!=NULL&&q->data<=p->data这句中，q为NULL时不会再比较后面的了

user: user-0
content: 刚打完草稿发现还是不会才过来问的 我都想了一整天，就这一小段代码，看见就想吐   最后一行  p=u  是什么操作

user: user-3
content: 进入第一层while循环后，第一次不会立马执行第二层的循环，因为q不满足条件，所以会跳过第二层循环，执行后面的，然后第二次就会执行到第二次while循环了。 建议在草稿纸上画画这个排序的过程

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

回复:
user: user-0
content: 到现在还没弄明白.....难道就没有人来回答了吗

user: user-0
content: 引用 2 楼 FancyMouse 的回复:这个特例下是对的，因为如果i和j位置的字符相等，但是dp[i-1][j]策略比dp[i-1][j-1]严格优的话，那就得dp[i-1][j]+1<dp[i-1][j-1]。但是这是不可能的，因为如果a[0~i-1]能经过k次操作改变到b[0~j]，那再来一次删除操作，也就是k+1次操作，就能做dp[i-1][j-1]也就是说dp[i-1][j-1]<=dp[i-1][j]+1。 要当心的是操作的权不是1的时候就不一定对了。 也就是说如果增或者删的代价是负数的时候,就不一定对了是吧?

user: user-1
content: 这个特例下是对的，因为如果i和j位置的字符相等，但是dp[i-1][j]策略比dp[i-1][j-1]严格优的话，那就得dp[i-1][j]+1<dp[i-1][j-1]。但是这是不可能的，因为如果a[0~i-1]能经过k次操作改变到b[0~j]，那再来一次删除操作，也就是k+1次操作，就能做dp[i-1][j-1]也就是说dp[i-1][j-1]<=dp[i-1][j]+1。 要当心的是操作的权不是1的时候就不一定对了。

user: user-2
content: 百度搜相关关键字。  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？
user-0 提问: C语言中断函数有能否返回值？能否带自定义的形式参数？怎么做？

回复:
user: user-1
content: 给什么硬件编的程序 看情况吧

user: user-2
content: 使用静态局部变量。

user: user-3
content: 是否可以这样考虑？ 新建函数funcA，在其中malloc一块内存，放置想要的数据，内存指针做非空判断，如果非空，不再创建。函数最后不释放该内存。 main函数调用funcA,传递参数，放置在malloc的内存中。 中断函数调用funcA，地址没有释放可以获取到main中传递的变量。 注意malloc内存释放free时机。
user-0 提问: c语言

回复:
user: user-1
content: 可以

user: user-2
content: 自嗨啊

user: user-3
content: 楼主这一波，很强势，可以的。

user: user-4
content: void killdoublemore(int n,int arr[n]) 该函数参数建议直接写成： void killdoublemore(int n,int *arr)

user: user-0
content: 这是我自己修改后的代码。。。。。结贴了 #include <stdio.h> #include <stdlib.h> void killdoublemore(int n,int arr[n]); int main(void) { 	int Knumber; 	int n; 	puts("此程序删除输入数据中重复的数"); 	puts("请输入要输入的个数"); 	scanf("%d",&n); 	int arr[n]; 	printf("请输入 %d 个数\n",n); 	for(int i = 0; i < n; i ++) 		scanf("%d",&arr[i]); 		killdoublemore(n,arr); 		system("pause"); 		return 0; 	 } void killdoublemore(int n,int arr[n]) { 		for(int i = 0; i < n; i ++) 		{ 			for(int j = 0; j < n; j ++) 			{ 				if((arr[i]==arr[j])&&i==j) 				continue; 				else if(arr[i]==arr[j]) 				arr[j] = '#'; 			} 		} 		for(int i = 0; i < n; i ++) 		{ 			if(arr[i]=='#') 			continue; 			else  			printf("%d  ",arr[i]); 			if((i>=10)&&(i%10==0)) putchar('\n'); 		} }

user: user-0
content: 。。。。。又搞错了，scanf（）忘了加&了。。。。。解决了，。。可以结贴了

user: user-0
content: 搞错了。。。。函数开头的k打成大写了嘻嘻，但是编译通过后还是运行不了 求解

user: user-5
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？
user-0 提问: C语言写文件，文件指针回退后，如何停止文件？后面的内容不要了

回复:
user: user-0
content: 引用 1 楼 wwww200808008 的回复:先读afile文件判断要读到什么位置，然后再重头开始读afile 一边读afile一边写bfile，读到你前面知道的停止位置。 随着读a随着写b呢，是知道A的读到的位置的，我的问题是a中有几行不知道是否要保留。需要先按照保留来做，但是发现这几行不要的话，需要将写文件的指针回调，覆盖写入新的内容，但是新内容短的话，需要如何停止文件？谢谢

user: user-1
content: 先读afile文件判断要读到什么位置，然后再重头开始读afile 一边读afile一边写bfile，读到你前面知道的停止位置。

user: user-1
content: 引用 2 楼 sys0613 的回复:[quote=引用 1 楼 wwww200808008 的回复:] 先读afile文件判断要读到什么位置，然后再重头开始读afile 一边读afile一边写bfile，读到你前面知道的停止位置。 随着读a随着写b呢，是知道A的读到的位置的，我的问题是a中有几行不知道是否要保留。需要先按照保留来做，但是发现这几行不要的话，需要将写文件的指针回调，覆盖写入新的内容，但是新内容短的话，需要如何停止文件？谢谢[/quote]  我的意思就是没必要用回调，你是如何知道那个位置的那段内容你需要替换，需要替换成什么内容先自己记下。后面根据写bfile文件的时候你从afile中重头开始读，到你前面知道的位置再写入你记下的内容。

user: user-2
content: HANDLE hFile=(HANDLE)_get_osfhandle(fileno(f));

user: user-2
content: SetEndOfFile The SetEndOfFile function moves the end-of-file (EOF) position for the specified file to the current position of the file pointer.   BOOL SetEndOfFile(   HANDLE hFile   // handle of file whose EOF is to be set );   Parameters hFile  Handle to the file to have its EOF position moved. The file handle must have been created with GENERIC_WRITE access to the file.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, call GetLastError.   Remarks This function can be used to truncate or extend a file. If the file is extended, the contents of the file between the old EOF position and the new position are not defined.   If you called CreateFileMapping to create a file-mapping object for hFile, you must first call UnmapViewOfFile to unmap all views and call CloseHandle to close the file-mapping object before you can call SetEndOfFile.  QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winbase.h.   Import Library: Use kernel32.lib.  See Also File I/O Overview, File Functions, CloseHandle, CreateFile, CreateFileMapping, UnmapViewOfFile
user-0 提问: VS系列的IDE都是收费的吗？之前用VS2015但试用期到了用不了.有没免费的？

回复:
user: user-1
content: 可以注册登录微软账号，服务器会自动更新许可证

user: user-2
content: 引用 3 楼 a1qwertyuiop1 的回复:安装vs2015社区版弹出这个窗口怎么办？  应该是你之前装的试用版没有卸载完全，比如注册表之类的。 百度一下，全部卸载再安装试试

user: user-3
content: 引用 3 楼 a1qwertyuiop1 的回复:安装vs2015社区版弹出这个窗口怎么办？  我一年前装的，没遇到过这个问题，可能你可以试一下装2017版的

user: user-4
content: 搜“彻底卸载VS2015”

user: user-5
content: 网上搜索专业版和企业版的密钥即可

user: user-6
content: 你不知道windows系统都是收费的么？

user: user-0
content: 安装vs2015社区版弹出这个窗口怎么办？

user: user-3
content: VS不是有社区版吗，那就是免费的啊

user: user-7
content: 百度如何破解vs2015
user-0 提问: 新手求教关于strstr函数

回复:
user: user-1
content: 管道传输时，不是以行为单位的。 你需要缓冲管道收到的内容，自己分成一行一行的，再使用strstr过滤。

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

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

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

user: user-0
content: check_msq(){     FILE *fp;     if ((fp = popen("mysqlcheck -c smarthome -uroot -pcocloud", "r")) == NULL) {         //perror("popen failed");         printf("-1-1-1-1-1-1-1\n");     }     char buf[256];     while (fgets(buf, 255, fp) != NULL) { 		 		//printf("%s", buf);     } 	if(NULL == strstr(buf,"Error")){ 		printf("-2-2-2-2-2-2-2\n"); 		pclose(fp); 		return -1; 	}else{ 		printf("-3-3-3-3-3-3\n"); 		return 0; 	}   代码如上，现在怎么样都会返回-2-2-2，求大神帮我看看。
user-0 提问: 用VS2015能顺利编译，但用VC编译后却出现如下错误:

回复:
user: user-1
content: #include"stdio.h"  void bubble_sort(int *arr, int len); void function(int a[3][4]){     int i,j,b,n;     for(i=0;i<=2;i++)         for(b=0;b<=2;b++)             for(j=b;j<=3;j++)                 if(a[i][b]>a[i][j]){                     n=a[i][b];                     a[i][b]=a[i][j];                     a[i][j]=n;                 } } int main() {     int i,j,u;     u=0;     int c[3][4]={{3,2,7,3},{4,6,88,9},{33,45,777,22}}; #if 0     function(c); #else     int row = 3, col = 4;     for (i = 0; i < row; i++)         bubble_sort(c[i], col); #endif     for(i=0;i<=2;i++){         printf("{");         for(j=0;j<=3;j++)             printf("%d ",c[i][j]);         printf("}\n");         u++;         if(u==3)             printf("\b ");     } }  void bubble_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - 1 - i; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } } 解决你排序的一种方法；可以参考一下； 另外，你的编译错误应该是跟编译器有关，出错的编译器版本应该比较老，不支持最新或者较新的C标准。 建议改一下，所有的定义都放在前面； 把u赋值放在这条语句前面；  u = 0; //这样试试 for(i=0;i<=2;i++){

user: user-2
content: u=0;  int c[3][4]={{3,2,7,3},{4,6,88,9},{33,45,777,22}};  这两行互换下，可能是编译器只支持在开头定义变量

user: user-3
content: 编译没问题，不代表运行没问题； 现在运行没问题，不代表将来运行没问题。

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

user: user-3
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。
user-0 提问: 数据结构栈typedef的一些小问题

回复:
user: user-1
content: 打个比方，头文件好比一个仓库货物的清单。当需要从仓库中提货时，首先从清单里查找对应物品存放在位置，和少量的备注信息。这样，再到仓库中去取货时更快更准确。如果一个仓库同时存在两个货物清单，然而这两个清单上的信息并不是完全相同，这时看清单的人就不知道哪个清单上的信息是正确的。为了避免这种情况，就发明了只用一个“清单”，也就是避免重复编译。

user: user-2
content: 引用 3 楼 zihui0459 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 第一句防止重复引入头文件，但是还需要加一句#define _Stack_h，建议使用大写。 struct node是声明类型；可以用你加的这句替换，类型是一样的。 剩下的是函数声明，是可以放到main中，如果这些函数会被其他源文件里的函数调用，只是在main的源文件里声明还是不够的。所以，考虑到这一点，还是建议把函数声明放到这个头文件里。如果，这些声明函数只在main所在的源文件里调用，那么放到main所在的源文件里声明是可以的。  #ifndef _STACK_H #define _STACK_H struct Node; typedef struct Node *PtrToNode; typedef PtrToNode stack; int IsEmpty(Stack S); Stack CreateStack(void); void DisposeStack(Stack S); void MakeEmpty(Stack S); void Push(int X,Stack S); int Top(Stack S); void Pop(Stack S); #endif能详细说下为什么要引入头文件吗，头一次看到需要写这个东西[/quote] 头文件一般会存放一些类型定义，声明，变量定义和声明（全局的），以及函数的声明（内联函数定义）；放在头文件里可以让代码更有条理性，头文件可以被多个源文件包含，提高了复用性

user: user-1
content: 第一句的Stack h是什么 防止重复编译。  第二句的struct Node；是在干什么呢？ 声明Node是一种结构类型(struct)。  代码中后面有结构体的定义，typedef那两句可以用typedef struct Node* stack一句代替吗？ 可以。  剩下的那些语句都是在进行函数声明吗？ 是。  （函数声明）放在main（）中是否也可以？ 不可以。

user: user-0
content: 引用 1 楼 ccssddnn218 的回复:第一句的Stack h是什么 防止重复编译。  第二句的struct Node；是在干什么呢？ 声明Node是一种结构类型(struct)。  代码中后面有结构体的定义，typedef那两句可以用typedef struct Node* stack一句代替吗？ 可以。  剩下的那些语句都是在进行函数声明吗？ 是。  （函数声明）放在main（）中是否也可以？ 不可以。能详细说下为什么要引入头文件吗，头一次看到需要写这个东西

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:第一句防止重复引入头文件，但是还需要加一句#define _Stack_h，建议使用大写。 struct node是声明类型；可以用你加的这句替换，类型是一样的。 剩下的是函数声明，是可以放到main中，如果这些函数会被其他源文件里的函数调用，只是在main的源文件里声明还是不够的。所以，考虑到这一点，还是建议把函数声明放到这个头文件里。如果，这些声明函数只在main所在的源文件里调用，那么放到main所在的源文件里声明是可以的。  #ifndef _STACK_H #define _STACK_H struct Node; typedef struct Node *PtrToNode; typedef PtrToNode stack; int IsEmpty(Stack S); Stack CreateStack(void); void DisposeStack(Stack S); void MakeEmpty(Stack S); void Push(int X,Stack S); int Top(Stack S); void Pop(Stack S); #endif能详细说下为什么要引入头文件吗，头一次看到需要写这个东西

user: user-2
content: 第一句防止重复引入头文件，但是还需要加一句#define _Stack_h，建议使用大写。 struct node是声明类型；可以用你加的这句替换，类型是一样的。 剩下的是函数声明，是可以放到main中，如果这些函数会被其他源文件里的函数调用，只是在main的源文件里声明还是不够的。所以，考虑到这一点，还是建议把函数声明放到这个头文件里。如果，这些声明函数只在main所在的源文件里调用，那么放到main所在的源文件里声明是可以的。  #ifndef _STACK_H #define _STACK_H struct Node; typedef struct Node *PtrToNode; typedef PtrToNode stack; int IsEmpty(Stack S); Stack CreateStack(void); void DisposeStack(Stack S); void MakeEmpty(Stack S); void Push(int X,Stack S); int Top(Stack S); void Pop(Stack S); #endif
user-0 提问: 关于malloc和free的一些小问题

回复:
user: user-1
content: Readpoly 函数里面，先申请了头节点，后释放，如果不需要，可以不用申请头结点。add函数里面，指数相同时，系数想加，指数不用想加，还要考虑相加等于0情况，合并的时候改变两条链表间的指向，就不用再申请空间了，同时释放

user: user-2
content: 可以这样赋值，因为指针变量的赋值也是值赋值，就是将p指向的地址空间（首地址值）赋值给t1, t2，这样t1,t2和p一样，指向同一内存空间，t1和t2可以像p一样对这块内存空间进行操作；  malloc申请空间是为了用，那么free是相反的，即不需要malloc申请的空间了，那就释放，防止内存泄露。对于链表，一般会在删除某个节点时，需要释放该节点；还有就是程序推出之前，需要释放整个链表时，需要调用free逐个释放节点。

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-4
content: t1=p; t2=p; 只不过是让t1和t2都指向那块已经分配好的内存而已，并没有分配新的内存，最后也只需释放一次

user: user-5
content: t1=p; t2=p后，三个指针都向同一块堆内存， 用其中任何一个指针来free都行，free的是指针指向的内存，不是指针本身，所以很明显的只能free一次堆内存。 至于什么时候free，就是你认为不再使用那块堆内存的时候。
user-0 提问: 关于qsort的问题

回复:
user: user-1
content: 小心驶得万年船。

user: user-0
content: 这个是leetcode自己传进来的int，难道传进来就越界了？

user: user-2
content: 1403617094, -490450406, ...这些数的绝对值很大，怕是 int 中放不下吧

user: user-3
content: qsort没问题，是你的int越界了

user: user-0
content: 没有吧，我测试的数字没有问题啊。

user: user-1
content: 你写的cmp函数bug